Sentinel commit pointing at new location in Chromium.
Related Chromium commit:
https://chromium.googlesource.com/chromium/src.git/+/4a996cdc7a36a71ac511c153375fc6170fea80e6
diff --git a/README b/README
new file mode 100644
index 0000000..1923b63
--- /dev/null
+++ b/README
@@ -0,0 +1,2 @@
+This repository has been merged directly into Chromium. You can now find it at
+https://chromium.googlesource.com/chromium/src/+/master/third_party/cacheinvalidation/src
diff --git a/example-app-build/AndroidManifest.xml b/example-app-build/AndroidManifest.xml
deleted file mode 100644
index 9a2a4db..0000000
--- a/example-app-build/AndroidManifest.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" ?>
-<!-- Copyright 2011 Google Inc. All Rights Reserved. -->
-<!-- Manifest for AndroidListener sample application. Must be merged with
- j/c/g/ipc/invalidation/external/client/contrib:android_listener_manifest. -->
-<manifest android:versionCode="1" android:versionName="0.1" package="com.google.ipc.invalidation.examples.android2" xmlns:android="http://schemas.android.com/apk/res/android">
- <!-- *** WARNING *** DO NOT EDIT! THIS IS GENERATED MANIFEST BY MERGE_MANIFEST TOOL.
- Merger manifest:
- java/com/google/ipc/invalidation/examples/android2/AndroidManifest.xml
- Mergee manifests:
- blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-opt/bin/java/com/google/ipc/invalidation/external/client/contrib/android_listener_manifest/AndroidManifest.xml
- -->
- <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="14"/>
- <!-- Declare and use permission allowing this application to receive GCM
- messages. -->
- <permission android:name="com.google.ipc.invalidation.examples.android2.permission.C2D_MESSAGE" android:protectionLevel="signature"/>
- <uses-permission android:name="com.google.ipc.invalidation.examples.android2.permission.C2D_MESSAGE"/>
- <application>
- <!-- Configure the listener class for the application -->
- <meta-data android:name="ipc.invalidation.ticl.listener_service_class" android:value="com.google.ipc.invalidation.examples.android2.ExampleListener"/>
- <!-- To enable background invalidations uncomment the following element:
- -->
- <!--<meta-data
- android:name=
- "ipc.invalidation.ticl.background_invalidation_listener_service_class"
- android:value=
- "com.google.ipc.invalidation.examples.android2.ExampleListener"/>-->
- <!-- Example activity -->
- <activity android:name="com.google.ipc.invalidation.examples.android2.MainActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
- <!-- Ticl listener. -->
- <service android:exported="false" android:name="com.google.ipc.invalidation.examples.android2.ExampleListener">
- <intent-filter>
- <action android:name="com.google.ipc.invalidation.AUTH_TOKEN_REQUEST"/>
- </intent-filter>
- </service>
- <!-- Merged from file: blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-opt/bin/java/com/google/ipc/invalidation/external/client/contrib/android_listener_manifest/AndroidManifest.xml -->
- <!-- Receiver for scheduler alarms. -->
- <receiver android:exported="false" android:name="com.google.ipc.invalidation.external.client.contrib.AndroidListener$AlarmReceiver"/>
- <!-- Merged from file: blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-opt/bin/java/com/google/ipc/invalidation/external/client/contrib/android_listener_manifest/AndroidManifest.xml -->
- <!-- Receiver for scheduler alarms. -->
- <receiver android:exported="false" android:name="com.google.ipc.invalidation.ticl.android2.AndroidInternalScheduler$AlarmReceiver"/>
- <!-- Merged from file: blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-opt/bin/java/com/google/ipc/invalidation/external/client/contrib/android_listener_manifest/AndroidManifest.xml -->
- <!-- GCM Broadcast Receiver -->
- <receiver android:exported="true" android:name="com.google.ipc.invalidation.external.client.contrib.MultiplexingGcmListener$GCMReceiver" android:permission="com.google.android.c2dm.permission.SEND">
- <intent-filter>
- <action android:name="com.google.android.c2dm.intent.RECEIVE"/>
- <action android:name="com.google.android.c2dm.intent.REGISTRATION"/>
- <category android:name="com.google.ipc.invalidation.ticl.android2"/>
- </intent-filter>
- </receiver>
- <!-- Merged from file: blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-opt/bin/java/com/google/ipc/invalidation/external/client/contrib/android_listener_manifest/AndroidManifest.xml -->
- <!-- Merged from file: java/com/google/ipc/invalidation/external/client/android2/AndroidManifest.xml -->
- <receiver android:exported="false" android:name="com.google.ipc.invalidation.ticl.android2.channel.AndroidMessageReceiverService$Receiver">
- <intent-filter>
- <action android:name="com.google.ipc.invalidation.gcmmplex.EVENT"/>
- </intent-filter>
- </receiver>
- <!-- Merged from file: blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-opt/bin/java/com/google/ipc/invalidation/external/client/contrib/android_listener_manifest/AndroidManifest.xml -->
- <!-- Ticl service. -->
- <service android:exported="false" android:name="com.google.ipc.invalidation.ticl.android2.TiclService"/>
- <!-- Merged from file: blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-opt/bin/java/com/google/ipc/invalidation/external/client/contrib/android_listener_manifest/AndroidManifest.xml -->
- <!-- Ticl sender. -->
- <service android:exported="false" android:name="com.google.ipc.invalidation.ticl.android2.channel.AndroidMessageSenderService"/>
- <!-- Merged from file: blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-opt/bin/java/com/google/ipc/invalidation/external/client/contrib/android_listener_manifest/AndroidManifest.xml -->
- <!-- GCM multiplexer -->
- <service android:exported="false" android:name="com.google.ipc.invalidation.external.client.contrib.MultiplexingGcmListener">
- <meta-data android:name="sender_ids" android:value="[email protected]"/>
- </service>
- <!-- Merged from file: blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-opt/bin/java/com/google/ipc/invalidation/external/client/contrib/android_listener_manifest/AndroidManifest.xml -->
- <!-- Invalidation service multiplexed GCM receiver -->
- <service android:enabled="true" android:exported="false" android:name="com.google.ipc.invalidation.ticl.android2.channel.AndroidMessageReceiverService"/>
- </application>
- <!-- Merged from file: blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-opt/bin/java/com/google/ipc/invalidation/external/client/contrib/android_listener_manifest/AndroidManifest.xml -->
- <!-- App receives GCM messages. -->
- <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
- <!-- Merged from file: blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-opt/bin/java/com/google/ipc/invalidation/external/client/contrib/android_listener_manifest/AndroidManifest.xml -->
- <!-- GCM connects to Google Services. -->
- <uses-permission android:name="android.permission.INTERNET"/>
- <!-- Merged from file: blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-opt/bin/java/com/google/ipc/invalidation/external/client/contrib/android_listener_manifest/AndroidManifest.xml -->
- <!-- GCM requires a Google account. -->
- <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
- <!-- Merged from file: blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-opt/bin/java/com/google/ipc/invalidation/external/client/contrib/android_listener_manifest/AndroidManifest.xml -->
- <!-- Merged from file: java/com/google/ipc/invalidation/external/client/android2/AndroidManifest.xml -->
- <uses-permission android:name="android.permission.USE_CREDENTIALS"/>
- <!-- Merged from file: blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-opt/bin/java/com/google/ipc/invalidation/external/client/contrib/android_listener_manifest/AndroidManifest.xml -->
- <!-- Keeps the processor from sleeping when a message is received. -->
- <uses-permission android:name="android.permission.WAKE_LOCK"/>
-</manifest>
diff --git a/example-app-build/README b/example-app-build/README
deleted file mode 100644
index 07cd60e..0000000
--- a/example-app-build/README
+++ /dev/null
@@ -1,8 +0,0 @@
-Copyright 2012 Google Inc. All Rights Reserved.
-
-This directory contains the files required to build the example application for
-the Invalidation Client, the source code of which is located under
-../src/java/com/google/ipc/invalidation/examples/android2.
-
-To build the example, first run ./generate_protos.sh. Then, run ant debug or
-ant release to build the application.
diff --git a/example-app-build/ant.properties b/example-app-build/ant.properties
deleted file mode 100644
index b79d939..0000000
--- a/example-app-build/ant.properties
+++ /dev/null
@@ -1 +0,0 @@
-source.dir = ../java:generated-protos:../javaexample
diff --git a/example-app-build/build.xml b/example-app-build/build.xml
deleted file mode 100644
index 4b8f3c0..0000000
--- a/example-app-build/build.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="MainActivity" default="help">
-
- <!-- The local.properties file is created and updated by the 'android' tool.
- It contains the path to the SDK. It should *NOT* be checked into
- Version Control Systems. -->
- <property file="local.properties" />
-
- <!-- The ant.properties file can be created by you. It is only edited by the
- 'android' tool to add properties to it.
- This is the place to change some Ant specific build properties.
- Here are some properties you may want to change/update:
-
- source.dir
- The name of the source directory. Default is 'src'.
- out.dir
- The name of the output directory. Default is 'bin'.
-
- For other overridable properties, look at the beginning of the rules
- files in the SDK, at tools/ant/build.xml
-
- Properties related to the SDK location or the project target should
- be updated using the 'android' tool with the 'update' action.
-
- This file is an integral part of the build system for your
- application and should be checked into Version Control Systems.
-
- -->
- <property file="ant.properties" />
-
- <!-- The project.properties file is created and updated by the 'android'
- tool, as well as ADT.
-
- This contains project specific properties such as project target, and library
- dependencies. Lower level build properties are stored in ant.properties
- (or in .classpath for Eclipse projects).
-
- This file is an integral part of the build system for your
- application and should be checked into Version Control Systems. -->
- <loadproperties srcFile="project.properties" />
-
- <!-- quick check on sdk.dir -->
- <fail
- message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through an env var"
- unless="sdk.dir"
- />
-
-
-<!-- extension targets. Uncomment the ones where you want to do custom work
- in between standard targets -->
-<!--
- <target name="-pre-build">
- </target>
--->
-<!--
- <target name="-pre-build">
- <target name="-pre-compile">
- </target>
-
- /* This is typically used for code obfuscation.
- Compiled code location: ${out.classes.absolute.dir}
- If this is not done in place, override ${out.dex.input.absolute.dir} */
- <target name="-post-compile">
- </target>
--->
-
- <!-- Import the actual build file.
-
- To customize existing targets, there are two options:
- - Customize only one target:
- - copy/paste the target into this file, *before* the
- <import> task.
- - customize it to your needs.
- - Customize the whole content of build.xml
- - copy/paste the content of the rules files (minus the top node)
- into this file, replacing the <import> task.
- - customize to your needs.
-
- ***********************
- ****** IMPORTANT ******
- ***********************
- In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
- in order to avoid having your file be overridden by tools such as "android update project"
- -->
- <!-- version-tag: 1 -->
- <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/example-app-build/generate_protos.sh b/example-app-build/generate_protos.sh
deleted file mode 100755
index 0007b9f..0000000
--- a/example-app-build/generate_protos.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/sh
-# Copyright 2012 Google Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Tool to output Java classes for the protocol buffers used by the invalidation
-# client into the generated-protos/ directory.
-TOOL=${PROTOC- `which protoc`}
-mkdir -p generated-protos/
-$TOOL --javanano_out=optional_field_style=reftypes:generated-protos/ ../proto/* --proto_path=../proto/
-EXAMPLE_PATH=../javaexample/com/google/ipc/invalidation/examples/android2
-$TOOL --javanano_out=optional_field_style=reftypes:generated-protos/ $EXAMPLE_PATH/example_listener.proto --proto_path=$EXAMPLE_PATH
diff --git a/example-app-build/libs/gcm.jar b/example-app-build/libs/gcm.jar
deleted file mode 100644
index ac109a8..0000000
--- a/example-app-build/libs/gcm.jar
+++ /dev/null
Binary files differ
diff --git a/example-app-build/libs/protobuf-java-2.3.0-nano.jar b/example-app-build/libs/protobuf-java-2.3.0-nano.jar
deleted file mode 100644
index b51536a..0000000
--- a/example-app-build/libs/protobuf-java-2.3.0-nano.jar
+++ /dev/null
Binary files differ
diff --git a/example-app-build/local.properties b/example-app-build/local.properties
deleted file mode 100644
index e521a1c..0000000
--- a/example-app-build/local.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must *NOT* be checked in Version Control Systems,
-# as it contains information specific to your local configuration.
-
-# location of the SDK. This is only used by Ant
-# For customization when using a Version Control System, please read the
-# header note.
-sdk.dir=/home/dsmyers/bin/android-sdk-linux
diff --git a/example-app-build/proguard.cfg b/example-app-build/proguard.cfg
deleted file mode 100644
index 9533f06..0000000
--- a/example-app-build/proguard.cfg
+++ /dev/null
@@ -1,76 +0,0 @@
-#
-# This file was derived from the Android SDK default configuration in tools/lib/proguard.cfg,
-# with changes/additions explicitly commented where made
-#
--optimizationpasses 5
--dontusemixedcaseclassnames
--dontskipnonpubliclibraryclasses
--dontpreverify
-# Change: SDK defaults + code/allocation/variable required to disable proguard optimization bug
--verbose
--optimizations !code/simplification/arithmetic,!field/*,!class/merging/*,!code/allocation/variable
-
--keep public class * extends android.app.Activity
--keep public class * extends android.app.Application
--keep public class * extends android.app.Service
--keep public class * extends android.content.BroadcastReceiver
--keep public class * extends android.content.ContentProvider
--keep public class * extends android.app.backup.BackupAgentHelper
--keep public class * extends android.preference.Preference
-# Change: not needed
-#-keep public class com.android.vending.licensing.ILicensingService
-
--keepclasseswithmembernames class * {
- native <methods>;
-}
-
--keepclasseswithmembers class * {
- public <init>(android.content.Context, android.util.AttributeSet);
-}
-
--keepclasseswithmembers class * {
- public <init>(android.content.Context, android.util.AttributeSet, int);
-}
-
--keepclassmembers class * extends android.app.Activity {
- public void *(android.view.View);
-}
-
--keepclassmembers enum * {
- public static **[] values();
- public static ** valueOf(java.lang.String);
-}
-
--keep class * implements android.os.Parcelable {
- public static final android.os.Parcelable$Creator *;
-}
-
-#
-# All changes below are additions to the Android SDK defaults, generally for the purposes of
-# suppressing spurious or inconsequential warnings.
-#
-
-# Suppress duplicate warning for system classes; Blaze is passing android.jar
-# to proguard multiple times.
--dontnote android.**
--dontnote java.**
--dontnote javax.**
--dontnote junit.**
--dontnote org.**
--dontnote dalvik.**
--dontnote com.android.internal.**
-
-# Stop warnings about missing unused classes
--dontwarn com.google.common.annotations.**
--dontwarn com.google.common.base.**
--dontwarn com.google.common.collect.**
--dontnote com.google.common.flags.**
--dontwarn com.google.common.flags.**
--dontwarn com.google.common.util.concurrent.**
-
-# Ignore missing JDK6 classes
--dontwarn java.**
-
-# Inverting these produces significant size gains but loses significant debug info
--dontobfuscate
-#-flattenpackagehierarchy
diff --git a/example-app-build/project.properties b/example-app-build/project.properties
deleted file mode 100644
index 9aa0dfa..0000000
--- a/example-app-build/project.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system use,
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=Google Inc.:Google APIs:15
diff --git a/google/cacheinvalidation/COPYING b/google/cacheinvalidation/COPYING
deleted file mode 100644
index d645695..0000000
--- a/google/cacheinvalidation/COPYING
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/google/cacheinvalidation/README b/google/cacheinvalidation/README
deleted file mode 100644
index a9dd982..0000000
--- a/google/cacheinvalidation/README
+++ /dev/null
@@ -1,16 +0,0 @@
-This directory contains the implementation of the client library for a cache
-invalidation service.
-
-The public (stable) interfaces are those defined under include/:
- invalidation-client.h
- invalidation-client-factory.h
- invalidation-listener.h
- system-resources.h
- types.h
-
-In order to compile this library, proper implementations of the interfaces
-residing under deps/ must be provided.
-
-Interfaces and implementations defined under impl/ are subject to change, and
-the test/ directory contains test helpers. Please do not depend directly
-on anything in these directories.
diff --git a/google/cacheinvalidation/android_channel.proto b/google/cacheinvalidation/android_channel.proto
deleted file mode 100644
index 1e6a1fb..0000000
--- a/google/cacheinvalidation/android_channel.proto
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-//
-// The Android delivery service's network endpoint id descriptor.
-// This proto is internal to the Android channel.
-
-syntax = "proto2";
-
-option optimize_for = LITE_RUNTIME;
-
-package ipc.invalidation;
-
-import "client_protocol.proto";
-
-// Defines the valid major versions of the android channel protocol. The
-// channel version controls the expected envelope syntax and semantics of
-// http and c2dm messages sent between the client and server.
-enum MajorVersion {
- option allow_alias = true;
-
- // The initial version of the android channel protocol. Inbound and
- // outbound channel packets contained a single binary protocol message only.
- INITIAL = 0;
-
- // Adds batching (multiple protocol messages in a single channel message)
- BATCH = 1;
-
- // The default channel version used by Android clients. Lower major numbers
- // will represent earlier versions and higher numbers will represent
- // experimental versions that are not yet released.
- DEFAULT = 0;
-
- // The minimum and maximum supported channel major versions. Used to validate
- // incoming requests, so update as new versions are added or old versions are
- // no longer supported.
- MIN_SUPPORTED = 0;
- MAX_SUPPORTED = 1;
-}
-
-// An id that specifies how to route a message to a Ticl on an Android device
-// via C2DM.
-message EndpointId {
- // Field 1 was once the ProtocolVersion of this message.
-
- // The "registration_id" returned when the client registers with c2dm. This
- // id is required by c2dm in order to send a message to the device.
- optional string c2dm_registration_id = 2;
-
- // A key identifying a specific client on a device.
- optional string client_key = 3;
-
- // The C2DM sender ID to use to deliver messages to the endpoint.
- optional string sender_id = 4 [deprecated = true];
-
- // Defines the expected channel version generated by the network endpoint or
- // expected in messages sent from the server.
- optional Version channel_version = 5;
-
- // The package name of the Android application that will receive the messages.
- // Replaces sender_id. Must be set (unless sender_id is set; in which case it
- // must not be set).
- optional string package_name = 6;
-}
-
-// A message addressed to a particular Ticl on an Android device.
-message AddressedAndroidMessage {
- // Client on the device to which the message is destined.
- optional string client_key = 1;
-
- // Message contents (serialized ServerToClientMessage).
- optional bytes message = 2;
-}
-
-// A batch of messages addressed to potentially-different Ticls on the same
-// Android device.
-message AddressedAndroidMessageBatch {
- repeated AddressedAndroidMessage addressed_message = 1;
-}
diff --git a/google/cacheinvalidation/channel_common.proto b/google/cacheinvalidation/channel_common.proto
deleted file mode 100644
index 58e73be..0000000
--- a/google/cacheinvalidation/channel_common.proto
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2011 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-// Common utilities used by all channel related protos.
-// This is also publicly visible to all channel implementors.
-
-syntax = "proto2";
-
-option optimize_for = LITE_RUNTIME;
-
-package ipc.invalidation;
-
-message ChannelMessageEncoding {
- // What kind of encoding is used for network_message
- enum MessageEncoding {
- // Raw proto encoding
- PROTOBUF_BINARY_FORMAT = 1;
-
- // JSPB-encoding: https://sites.google.com/a/google.com/jspblite/Home
- PROTOBUF_JSON_FORMAT = 2;
- }
-}
-
-message NetworkEndpointId {
- enum NetworkAddress {
- TEST = 1; // A delivery service for testing
-
- // Low numbers reserved.
- ANDROID = 113; // Android delivery service using c2dm / http.
- }
- optional NetworkAddress network_address = 1;
- optional bytes client_address = 2;
-
- // Optional. When true, the client is considered offline but the
- // client_address is maintained so that the client can potentially be reached.
- // When false or undefined, the client is considered online.
- optional bool is_offline = 3;
-}
diff --git a/google/cacheinvalidation/client.proto b/google/cacheinvalidation/client.proto
deleted file mode 100644
index e79b327..0000000
--- a/google/cacheinvalidation/client.proto
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2011 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Specification of protocol buffers that are used only on the client side.
-//
-// Note: unless otherwise specified in a comment, all fields in all messages
-// are required, even though they are listed as optional.
-
-syntax = "proto2";
-
-option optimize_for = LITE_RUNTIME;
-
-package ipc.invalidation;
-
-import "client_protocol.proto";
-
-// An object that is serialized and given to clients for acknowledgement
-// purposes.
-message AckHandleP {
- optional InvalidationP invalidation = 1;
-}
-
-// The state persisted at a client so that it can be used after a reboot.
-message PersistentTiclState {
- // Last token received from the server (required).
- optional bytes client_token = 1;
-
- // Last time a message was sent to the server (optional). Must be a value
- // returned by the clock in the Ticl system resources.
- optional int64 last_message_send_time_ms = 2 [default = 0];
-}
-
-// An envelope containing a Ticl's internal state, along with a digest of the
-// serialized representation of this state, to ensure its integrity across
-// reads and writes to persistent storage.
-message PersistentStateBlob {
- // The (important parts of the) Ticl's internal state.
- optional PersistentTiclState ticl_state = 1;
-
- // Implementation-specific message authentication code for the Ticl state.
- optional bytes authentication_code = 2;
-}
-
-// State of a Ticl RunState.
-message RunStateP {
- enum State {
- NOT_STARTED = 1;
- STARTED = 2;
- STOPPED = 3;
- }
- optional State state = 1;
-}
-
diff --git a/google/cacheinvalidation/client_gateway.proto b/google/cacheinvalidation/client_gateway.proto
deleted file mode 100644
index 5b12452..0000000
--- a/google/cacheinvalidation/client_gateway.proto
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2011 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Specification of invalidation gateway internal forwarding messages and
-// services.
-
-syntax = "proto2";
-
-option optimize_for = LITE_RUNTIME;
-
-package ipc.invalidation;
-
-// The message communicated between gateway and clients.
-message ClientGatewayMessage {
- // Whether it is client to server or server to client.
- optional bool is_client_to_server = 1;
-
- // Serialized version of the ServiceContext.
- optional bytes service_context = 2;
-
- // Rpc scheduling hash.
- optional int64 rpc_scheduling_hash = 3;
-
- // Payload of the network message (ClientToServerMessage or
- // ServerToClientMessage).
- optional bytes network_message = 4;
-}
diff --git a/google/cacheinvalidation/client_protocol.proto b/google/cacheinvalidation/client_protocol.proto
deleted file mode 100644
index 285457d..0000000
--- a/google/cacheinvalidation/client_protocol.proto
+++ /dev/null
@@ -1,595 +0,0 @@
-// Copyright 2011 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Specification of protocol buffers and the client-server protocol that are
-// used by the clients of the system.
-//
-// Note: unless otherwise specified in a comment, all fields in all messages
-// are required, even though they are listed as optional.
-
-syntax = "proto2";
-
-option optimize_for = LITE_RUNTIME;
-
-package ipc.invalidation;
-
-// Here is a high-level overview of the protocol. The protocol is designed in a
-// "message-passing" style, i.e., the client (C) or the server (S) can send any
-// message SPONTANEOUSLY at any time and both sides have to be prepared for any
-// message from the other side. However, even with this style, there are some
-// "flows" which are somewhat like requests and replies.
-
-// 1. Initialization: When a client starts up, it needs a token to alow it to
-// perform any other operation with the server.
-// C -> S: InitializeMessage
-// S -> C: TokenControlMessage
-//
-// 2. Registration: When a client has to register or unregister for a set of
-// objects, the following flow occurs:
-// C -> S: RegistrationMessage
-// S -> C: RegistrationStatusMessage
-//
-// 3. Invalidation: The server sends an invalidation and the client sends back
-// an ack.
-// S -> C InvalidationMessage
-// C -> S InvalidationMessage
-//
-// 4. Registration sync: Once in a while the server may detect that the client
-// and server's registration state is out of sync (the server can detect this
-// since it gets the client's registration summary in the client's message
-// header). In that case, it asks the client some registration information
-// and the client sends it to the server.
-// S -> C: RegistrationSyncRequestMessage
-// C -> S: RegistrationSyncMessage
-//
-// 5. Information messages: The server can occasionally for client-side
-// information such as statistics, etc. The client responds with the
-// requested information
-// S -> C: InfoRequestMessage
-// C -> S: InfoMessage
-//
-// ------------------------------------------------------------------------
-
-// A basic message type used for versioning public proto messages and/or
-// types. The two fields are supposed to be used as follows:
-//
-// * The major version number is changed whenever an incompatible protocol
-// change or type has been made. When a message/object with a particular
-// major version is received, the receiver needs to either know how to handle
-// this version or it needs to drop the message
-//
-// * The minor version can be changed (say) to document some internal change
-// for debugging purposes. When a message is received by a receiver, it MUST
-// ignore the minor version number for making any protocol/type
-// decisions. I.e., the minor version number is for debugging purposes only.
-//
-// Versioning is used in various places - for entities that are part of a
-// protocol (e.g., message requests), for various client implementations, and
-// for other data types that change independently of the protocol (e.g.,
-// session tokens). For each versioned entity, we define a specific message
-// type to encapsulate the version of that entity (e.g., ProtocolVersion,
-// ClientVersion, etc.).
-message Version {
- optional int32 major_version = 1;
- optional int32 minor_version = 2;
-}
-
-// Message included in all client <-> server messages to indicate the version
-// of the protocol in use by the sender.
-message ProtocolVersion {
- optional Version version = 1;
-}
-
-// Defines a specific version of the client library (for information purposes
-// only) May not be used to make decisions at the server (use ProtocolVersion
-// instead).
-message ClientVersion {
-
- // A client-specific version number.
- optional Version version = 1;
-
- // All fields below are for informational/debugging/monitoring purposes only.
- // No critical code decision is supposed to be made using them.
-
- // Information about the client operating system/platform, e.g., Windows,
- // ChromeOS.
- optional string platform = 2;
-
- // Language used for the library.
- optional string language = 3;
-
- // Extra information about the client (e.g., application name).
- optional string application_info = 4;
-}
-
-// Message indicating the result of an operation.
-message StatusP {
-
- // Whether operation is successful or not
- enum Code {
- SUCCESS = 1;
- TRANSIENT_FAILURE = 2;
- PERMANENT_FAILURE = 3;
- }
-
- optional Code code = 1;
-
- // Textual description of the status or additional context about any
- // error. (Optional - Can be set for success also.)
- optional string description = 2;
-}
-
-// Identifies an object that a client can register for.
-message ObjectIdP {
-
- // The source of the data.
- optional int32 source = 1;
-
- // The id of the object relative to the source. Must be <= 64 bytes.
- optional bytes name = 2;
-}
-
-// A message containing the part of the client's id that the application
-// controls. This id is used for squelching invalidations on the server side.
-// For example, if a client C1 modifies object x and informs the backend about
-// C1's application client id as part of the invalidation. The backend can then
-// avoid sending the invalidation unnecessarily to that client.
-//
-// If the application wishes to use this squelching feature, it must assign a
-// globally unique client_name for a given client_type so that the particular
-// instantation of the application can be identified.
-message ApplicationClientIdP {
- // The type of the client.
- optional int32 client_type = 1;
-
- // A client name or unique id assigned by the application. Application should
- // choose a unique name for different client instances if it wants to squelch
- // invalidations by name (as discussed above).
- optional bytes client_name = 2;
-}
-
-// Invalidation for a given object/version.
-message InvalidationP {
- // The id of the object being invalidated.
- optional ObjectIdP object_id = 1;
-
- // Whether the invalidation is for a known version of the object as assigned
- // by an application backend (is_known_version == true) or an unknown system
- // version synthesized by the invalidation service. (Note that if
- // is_known_version is false then is_trickle_restart be true or missing
- // because an unknown version implies that invalidation versions prior to the
- // current backend version may have been dropped.)
- optional bool is_known_version = 2;
-
- // Version being invalidated (see comment on is_known_version). If the
- // is_known_version is false, the version corresponds to an internal "system
- // version" for *that* object. An object's system version has no meaning to
- // the application other than the fact that these system versions are also
- // monotonically increasing and the client must ack such an invalidation with
- // this system version (and an ack for a later system version acknowledges an
- // invalidation for all earlier system version for *that* object.
- optional int64 version = 3;
-
- // Whether the object's Trickle is restarting at this version.
- // sets this value to true to inform Trickle API clients that it may
- // have dropped invalidations prior to "version", or, if is_known_version is
- // false, prior to the current backend version.
- optional bool is_trickle_restart = 6 [default = false];
-
- // Optional payload associated with this invalidation.
- optional bytes payload = 4;
-
- // DEPRECATED: bridge arrival time is now maintained by
- // InvalidationMetadataP in the SourcedInvalidation, InvalidationContents and
- // ClientInvalidation containers.
- optional int64 bridge_arrival_time_ms_deprecated = 5 [deprecated=true];
-}
-
-// Specifies the intention to change a registration on a specific object. To
-// update registrations, a client sends a message containing repeated
-// RegistrationP messages.
-message RegistrationP {
- enum OpType {
- REGISTER = 1;
- UNREGISTER = 2;
- }
-
- // The object for which to (un)register.
- optional ObjectIdP object_id = 1;
-
- // Whether to register or unregister.
- optional OpType op_type = 2;
-}
-
-// Summary of the registration state associated with a particular client, sent
-// in the header of client<->server messages. This summary has two different
-// (but related) meanings depending on where it is used:
-//
-// 1) In a client->server message, it describes the DESIRED client state.
-// 2) In a server->client message, it describes the ACTUAL state at the server
-// for that client.
-message RegistrationSummary {
- // Number of registrations desired (client) or held (server).
- optional int32 num_registrations = 1;
-
- // Top-level digest over the registrations.
- //
- // The digest for an object id is computed as following (the digest chosen for
- // this method is SHA-1):
- //
- // digest = new Digest();
- // digest.update(Little endian encoding of object source type)
- // digest.update(object name)
- // digest.getDigestSummary()
- //
- // For a set of objects, digest is computing by sorting lexicographically
- // based on their digests and then performing the update process given above
- // (i.e., calling digest.update on each object's digest and then calling
- // getDigestSummary at the end).
- optional bytes registration_digest = 2;
-}
-
-// Header included on every client -> server message.
-message ClientHeader {
-
- // Protocol version of this message.
- optional ProtocolVersion protocol_version = 1;
-
- // Token identifying the client. Tokens are issued by the server in response
- // to client requests (see InitializeMessage, below). In order to perform any
- // operation other than initialization, the client must supply a token. When
- // performing initialization, this field must be left unset.
- optional bytes client_token = 2;
-
- // Optional summary of the client's desired registration state. The client is
- // encouraged to provide this summary in every message once a "steady" state
- // of registrations/unregistrations has been reached. For example, it may not
- // want to send this summary during initialization (but after the initial set
- // has been registered, it should try to send it).
- optional RegistrationSummary registration_summary = 3;
-
- // Timestamp from the client's clock, expressed as ms since 00:00:00 UTC, 1
- // January 1970 (i.e., the UNIX epoch) - for debugging/monitoring purposes.
- optional int64 client_time_ms = 4;
-
- // Highest server timestamp observed by the client (the server includes its
- // time on every message to the client). Note: this time is NOT necessarily
- // expressed as relative to the UNIX epoch - for debugging/monitoring
- // purposes.
- optional int64 max_known_server_time_ms = 5;
-
- // Message id to identify the message -for debugging/monitoring purposes.
- optional string message_id = 6;
-
- // Client typecode (as in the InitializeMessage, below). This field may or
- // may not be set.
- optional int32 client_type = 7;
-}
-
-// A message from the client to the server.
-message ClientToServerMessage {
- // Header.
- optional ClientHeader header = 1;
-
- // Any or all of the follow messages may be present.
-
- // Optional initialization message, used to obtain a new token. Note that, if
- // present, this message is always processed before the messages below, and
- // those messages will be interpreted relative to the new token assigned here.
- optional InitializeMessage initialize_message = 2;
-
- // Optional request to perform registrations.
- optional RegistrationMessage registration_message = 3;
-
- // Optional data for registration sync.
- optional RegistrationSyncMessage registration_sync_message = 4;
-
- // Optional invalidation acks.
- optional InvalidationMessage invalidation_ack_message = 5;
-
- // Optional information about the client.
- optional InfoMessage info_message = 6;
-}
-
-// Used to obtain a new token when the client does not have one.
-message InitializeMessage {
-
- // Defines how clients serialize object ids when computing digests for
- // registrations.
- enum DigestSerializationType {
-
- // The digest for an object id is computed by serializing the object id into
- // bytes.
- BYTE_BASED = 1;
-
- // The digest for an object id is computed by serializing the object id into
- // an array of numbers.
- NUMBER_BASED = 2;
- }
-
- // Type of the client. This value is assigned by the backend notification
- // system (out-of-band) and the client must use the correct value.
- optional int32 client_type = 1;
-
- // Nonce. This value will be echoed as the existing token in the header of
- // the server message that supplies the new token (the new token itself will
- // be provided in a TokenControlMessage; see below).
- optional bytes nonce = 2;
-
- // Id of the client as assigned by the application.
- optional ApplicationClientIdP application_client_id = 3;
-
- // Type of registration digest used by this client.
- optional DigestSerializationType digest_serialization_type = 4;
-}
-
-// Registration operations to perform.
-message RegistrationMessage {
- repeated RegistrationP registration = 1;
-}
-
-// Message from the client to the server.
-message RegistrationSyncMessage {
-
- // Objects for which the client is registered.
- repeated RegistrationSubtree subtree = 1;
-}
-
-// Message sent from the client to the server about registered objects
-// (typically) in response to a registration sync request.
-//
-// The name of the message implies a "tree" for future expansion where the
-// intention is to not necessarily send the complete set of objects but to
-// partition the object space into multiple ranges and then exchange Merkle-tree
-// like data structures to determine which ranges are out-of-sync.
-message RegistrationSubtree {
- // Registered objects
- repeated ObjectIdP registered_object = 1;
-}
-
-// A message from the client to the server with info such as performance
-// counters, client os info, etc.
-message InfoMessage {
- optional ClientVersion client_version = 1;
-
- // Config parameters used by the client.
- // Deprecated and removed - the client_config parameter is what is used now.
- repeated PropertyRecord config_parameter = 2;
-
- // Performance counters from the client.
- repeated PropertyRecord performance_counter = 3;
-
- // If 'true', indicates that the client does not know the server's
- // registration summary, so the server should respond with it even if the
- // client's summary matches the server's.
- optional bool server_registration_summary_requested = 4;
-
- // Configuration parameters for this client.
- optional ClientConfigP client_config = 5;
-}
-
-// Information about a single config/performance counter value in the
-// InfoMessage.
-message PropertyRecord {
-
- // Name of the performance counter/config parameter.
- optional string name = 1;
-
- // Value of the performance counter/config parameter.
- optional int32 value = 2;
-}
-
-message ServerHeader {
- // Protocol version of this message.
- optional ProtocolVersion protocol_version = 1;
-
- // Current token that the server expects the client to have. Clients must
- // ignore messages where this token field does not match their current token.
- // During initialization, the client's "token" is the nonce that it generates
- // and sends in the InitializeMessage.
- optional bytes client_token = 2;
-
- // Summary of registration state held by the server for the client.
- optional RegistrationSummary registration_summary = 3;
-
- // Timestamp from the server's clock. No guarantee on when this time is
- // relative to.
- optional int64 server_time_ms = 4;
-
- // Message id to identify the message (for debug purposes only).
- optional string message_id = 5;
-}
-
-message ServerToClientMessage {
- optional ServerHeader header = 1;
-
- // Message to assign a new client token or invalidate an existing one. Note
- // that, if present, this message is always processed before the messages
- // below, and those messages will be interpreted relative to the new token
- // assigned here.
- optional TokenControlMessage token_control_message = 2;
-
- // Invalidations.
- optional InvalidationMessage invalidation_message = 3;
-
- // Registration operation replies.
- optional RegistrationStatusMessage registration_status_message = 4;
-
- // Request for client registration state.
- optional RegistrationSyncRequestMessage registration_sync_request_message = 5;
-
- // Request to change config from the server.
- optional ConfigChangeMessage config_change_message = 6;
-
- // Request for client information.
- optional InfoRequestMessage info_request_message = 7;
-
- // Asynchronous error information that the server sends to the client.
- optional ErrorMessage error_message = 8;
-}
-
-// Message used to supply a new client token or invalidate an existing one.
-message TokenControlMessage {
- // If status is failure, new_token cannot be set.
- optional bytes new_token = 1; // If missing, means destroy_token
-}
-
-// Status of a particular registration (could be sent spontaneously by the
-// server or in response to a registration request).
-message RegistrationStatus {
- optional RegistrationP registration = 1;
- optional StatusP status = 2;
-}
-
-// Registration status of several messages from the server to the client.
-message RegistrationStatusMessage {
- repeated RegistrationStatus registration_status = 1;
-}
-
-// Request from the server to get the registration info from the client for
-// sync purposes.
-message RegistrationSyncRequestMessage {
-}
-
-// A set of invalidations from the client to the server or vice-versa
-message InvalidationMessage {
- repeated InvalidationP invalidation = 1;
-}
-
-// A request from the server to the client for information such as
-// performance counters, client os, etc
-message InfoRequestMessage {
- enum InfoType {
- GET_PERFORMANCE_COUNTERS = 1;
- }
- repeated InfoType info_type = 1;
-}
-
-// A rate limit: a count of events and a window duration in which the events
-// may occur.
-message RateLimitP {
-
- // The size of the window over which the rate limit applies.
- optional int32 window_ms = 1;
-
- // The number of events allowed within a given window.
- optional int32 count = 2;
-}
-
-// Configuration parameters for the protocol handler in the Ticl.
-message ProtocolHandlerConfigP {
- // Batching delay - certain messages (e.g., registrations, invalidation acks)
- // are sent to the server after this delay.
- optional int32 batching_delay_ms = 1 [default = 500];
-
- // Rate limits for sending messages. Only two levels allowed currently.
- repeated RateLimitP rate_limit = 2;
-}
-
-// Configuration parameters for the Ticl.
-message ClientConfigP {
-
- optional Version version = 1;
-
- // The delay after which a network message sent to the server is considered
- // timed out.
- optional int32 network_timeout_delay_ms = 2 [default = 60000];
-
- // Retry delay for a persistent write if it fails
- optional int32 write_retry_delay_ms = 3 [default = 10000];
-
- // Delay for sending heartbeats to the server.
- optional int32 heartbeat_interval_ms = 4 [default = 1200000];
-
- // Delay after which performance counters are sent to the server.
- optional int32 perf_counter_delay_ms = 5 [default = 21600000]; // 6 hours.
-
- // The maximum exponential backoff factor used for network and persistence
- /// timeouts.
- optional int32 max_exponential_backoff_factor = 6 [default = 500];
-
- // Smearing percent for randomizing delays.
- optional int32 smear_percent = 7 [default = 20];
-
- // Whether the client is transient, that is, does not write its session
- // token to durable storage.
- // TODO(xiaolan): (BUG 5627144) need to expose to the clients.
- // For android the default is false. But for mtrx the default is true.
- optional bool is_transient = 8 [default = false];
-
- // Initial delay for a heartbeat after restarting from persistent state. We
- // use this so that the application has a chance to respond to the
- // reissueRegistrations call.
- optional int32 initial_persistent_heartbeat_delay_ms = 9 [default = 2000];
-
- // Configuration for the protocol client to control batching etc.
- optional ProtocolHandlerConfigP protocol_handler_config = 10;
-
- // Whether the channel supports delivery while the client is offline. If
- // true, then the servers' use of the channel is such that the
- // following holds: if any number of messages are sent to the client while
- // the client is unreachable, then the channel will eventually deliver at
- // least one message to the client such that, on receiving the message, the
- // client will send a message to the server. E.g., the channel could deliver
- // a single invalidation or a single registration sync request. C2DM is
- // an example of a suitable channel.
- //
- // When this is true, the Ticl will record in persistent storage the last
- // time it sent a message to the server. On persistent restart, it will not
- // send a message to the server unless the last one was sent more than a
- // heartbeat-interval ago. This is designed to support efficient Android
- // clients, which will destroy and recreate the Ticl when transitioning
- // between foreground and background states.
- optional bool channel_supports_offline_delivery = 11 [default = false];
-
- // If the client loses network connectivity, it will send a heartbeat after it
- // comes online, unless it had already sent a message more recently than this
- // threshold.
- optional int32 offline_heartbeat_threshold_ms = 12 [default = 60000];
-
- // Whether the client allows suppression. If true (the default), then
- // both continuous and restarted invalidations result in an invalidate()
- // upcall, which is appropriate for invalidation clients. If false,
- // then restarted invalidations result in an invalidateUnknownVersion()
- // upcall, which provides correct semantics for Trickles clients.
- optional bool allow_suppression = 13 [default = true];
-}
-
-// A message asking the client to change its configuration parameters
-message ConfigChangeMessage {
-
- // On receipt of this value, do not send any new message to the server
- // for the specified delay (this message needs to be accepted without
- // any token check). A zero value is ignored by the client. So the lowest
- // value for this field is 1. This concept exists to allow the server
- // to tell the clients that they should not come back to the server
- // for some period of time.
- optional int64 next_message_delay_ms = 1;
-}
-
-// An error message that contains an enum for different types of failures with a
-// textual description of the failure (as the need arises new error codes will
-// be added to this message).
-message ErrorMessage {
-
- enum Code {
- AUTH_FAILURE = 1; // Authorization or authentication failure.
- UNKNOWN_FAILURE = 10000; // Some failure which is not described above.
- };
-
- optional Code code = 1;
-
- // Textual description of the error
- optional string description = 2;
-}
diff --git a/google/cacheinvalidation/client_test_internal.proto b/google/cacheinvalidation/client_test_internal.proto
deleted file mode 100644
index 4f8bfa9..0000000
--- a/google/cacheinvalidation/client_test_internal.proto
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2011 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Specification of protocol buffers that are used only on the client side for
-// testing.
-
-syntax = "proto2";
-
-option optimize_for = LITE_RUNTIME;
-
-package ipc.invalidation;
-
-import "client_protocol.proto";
-
-// Registration manager state
-message RegistrationManagerStateP {
- optional RegistrationSummary client_summary = 1;
- optional RegistrationSummary server_summary = 2;
- repeated ObjectIdP registered_objects = 3;
-}
diff --git a/google/cacheinvalidation/deps/callback.h b/google/cacheinvalidation/deps/callback.h
deleted file mode 100644
index 80670d8..0000000
--- a/google/cacheinvalidation/deps/callback.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Defines callback types for the invalidation client library.
-
-#ifndef GOOGLE_CACHEINVALIDATION_DEPS_CALLBACK_H_
-#define GOOGLE_CACHEINVALIDATION_DEPS_CALLBACK_H_
-
-#include "base/callback.h"
-
-#define INVALIDATION_CALLBACK1_TYPE(Arg1) ::Callback1<Arg1>
-
-namespace invalidation {
-
-using ::Closure;
-using ::DoNothing;
-using ::NewPermanentCallback;
-
-template <class T>
-bool IsCallbackRepeatable(const T* callback) {
- return callback->IsRepeatable();
-}
-
-// Encapsulates a callback and its argument. Deletes the inner callback when it
-// is itself deleted, regardless of whether it is ever run.
-template<typename ArgumentType>
-class CallbackWrapper : public Closure {
- public:
- // Constructs a new CallbackWrapper, which takes ownership of the inner
- // callback.
- CallbackWrapper(
- INVALIDATION_CALLBACK1_TYPE(ArgumentType)* callback, ArgumentType arg) :
- callback_(callback), arg_(arg) {}
-
- virtual ~CallbackWrapper() {
- delete callback_;
- }
-
- // Returns whether the inner callback is repeatable.
- virtual bool IsRepeatable() const {
- return callback_->IsRepeatable();
- }
-
- // Runs the inner callback on the argument.
- virtual void Run() {
- callback_->Run(arg_);
- }
-
- private:
- // The callback to run.
- INVALIDATION_CALLBACK1_TYPE(ArgumentType)* callback_;
- // The argument on which to run it.
- ArgumentType arg_;
-};
-
-// An override of NewPermanentCallback that wraps a callback and its argument,
-// transferring ownership of the inner callback to the new one. We define this
-// here (in deps/callback.h), along with the class above, because the Google
-// implementation of callbacks is much different from the one used in Chrome. A
-// Chrome Closure's destructor and Run() method are not virtual, so we can't
-// define custom implementations (as above in CallbackWrapper) to get the
-// semantics and memory management behavior we want.
-template <typename ArgType>
-Closure* NewPermanentCallback(
- INVALIDATION_CALLBACK1_TYPE(ArgType)* callback, ArgType arg) {
- return new CallbackWrapper<ArgType>(callback, arg);
-}
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_DEPS_CALLBACK_H_
diff --git a/google/cacheinvalidation/deps/digest-function.h b/google/cacheinvalidation/deps/digest-function.h
deleted file mode 100644
index 6e00f5b..0000000
--- a/google/cacheinvalidation/deps/digest-function.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Interface specifying a function to compute digests.
-
-#ifndef GOOGLE_CACHEINVALIDATION_DEPS_DIGEST_FUNCTION_H_
-#define GOOGLE_CACHEINVALIDATION_DEPS_DIGEST_FUNCTION_H_
-
-#include <string>
-
-#include "google/cacheinvalidation/deps/stl-namespace.h"
-
-namespace invalidation {
-
-using INVALIDATION_STL_NAMESPACE::string;
-
-class DigestFunction {
- public:
- virtual ~DigestFunction() {}
-
- /* Clears the digest state. */
- virtual void Reset() = 0;
-
- /* Adds data to the digest being computed. */
- virtual void Update(const string& data) = 0;
-
- /* Stores the digest of the data added by Update. After this call has been
- * made, reset must be called before Update and GetDigest can be called.
- */
- virtual string GetDigest() = 0;
-};
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_DEPS_DIGEST_FUNCTION_H_
diff --git a/google/cacheinvalidation/deps/gmock.h b/google/cacheinvalidation/deps/gmock.h
deleted file mode 100644
index 777bfec..0000000
--- a/google/cacheinvalidation/deps/gmock.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef GOOGLE_CACHEINVALIDATION_DEPS_GMOCK_H_
-#define GOOGLE_CACHEINVALIDATION_DEPS_GMOCK_H_
-
-#error Replace with a header that imports the Google Mock library.
-
-#endif // GOOGLE_CACHEINVALIDATION_DEPS_GMOCK_H_
diff --git a/google/cacheinvalidation/deps/googletest.h b/google/cacheinvalidation/deps/googletest.h
deleted file mode 100644
index a0e6492..0000000
--- a/google/cacheinvalidation/deps/googletest.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef GOOGLE_CACHEINVALIDATION_DEPS_GOOGLETEST_H_
-#define GOOGLE_CACHEINVALIDATION_DEPS_GOOGLETEST_H_
-
-#error This file should be replaced with a stub pointing to the googletest \
- header.
-
-#endif // GOOGLE_CACHEINVALIDATION_DEPS_GOOGLETEST_H_
diff --git a/google/cacheinvalidation/deps/logging.h b/google/cacheinvalidation/deps/logging.h
deleted file mode 100644
index 5639774..0000000
--- a/google/cacheinvalidation/deps/logging.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef GOOGLE_CACHEINVALIDATION_DEPS_LOGGING_H_
-#define GOOGLE_CACHEINVALIDATION_DEPS_LOGGING_H_
-
-#error This file should be replaced with a stub pointing to the google-glog \
- header. Also there should be a LogMessage() function in the invalidation \
- namespace.
-
-#endif // GOOGLE_CACHEINVALIDATION_DEPS_LOGGING_H_
diff --git a/google/cacheinvalidation/deps/mutex.h b/google/cacheinvalidation/deps/mutex.h
deleted file mode 100644
index f78c759..0000000
--- a/google/cacheinvalidation/deps/mutex.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef GOOGLE_CACHEINVALIDATION_DEPS_MUTEX_H_
-#define GOOGLE_CACHEINVALIDATION_DEPS_MUTEX_H_
-
-#include "base/mutex.h"
-
-namespace invalidation {
-
-using ::Mutex;
-using ::MutexLock;
-} // invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_DEPS_MUTEX_H_
diff --git a/google/cacheinvalidation/deps/random.h b/google/cacheinvalidation/deps/random.h
deleted file mode 100644
index 3d3d67d..0000000
--- a/google/cacheinvalidation/deps/random.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef GOOGLE_CACHEINVALIDATION_DEPS_RANDOM_H_
-#define GOOGLE_CACHEINVALIDATION_DEPS_RANDOM_H_
-
-#error This file should be replaced with an implementation of the following \
- interface.
-
-namespace invalidation {
-
-class Random {
- public:
- explicit Random(int64 seed);
-
- // Returns a pseudorandom value between 0 (inclusive) and 1 (exclusive).
- virtual double RandDouble();
-
- // Returns a pseudorandom unsigned 64-bit number.
- virtual uint64 RandUint64();
-};
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_DEPS_RANDOM_H_
diff --git a/google/cacheinvalidation/deps/scoped_ptr.h b/google/cacheinvalidation/deps/scoped_ptr.h
deleted file mode 100644
index 91f415b..0000000
--- a/google/cacheinvalidation/deps/scoped_ptr.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef GOOGLE_CACHEINVALIDATION_DEPS_SCOPED_PTR_H_
-#define GOOGLE_CACHEINVALIDATION_DEPS_SCOPED_PTR_H_
-
-#error Override scoped_ptr.h to point to a scoped_ptr implementation.
-
-#endif // GOOGLE_CACHEINVALIDATION_DEPS_SCOPED_PTR_H_
diff --git a/google/cacheinvalidation/deps/sha1-digest-function.h b/google/cacheinvalidation/deps/sha1-digest-function.h
deleted file mode 100644
index ed4b7fa..0000000
--- a/google/cacheinvalidation/deps/sha1-digest-function.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Interface to SHA1 digest computation.
-
-#ifndef GOOGLE_CACHEINVALIDATION_DEPS_SHA1_DIGEST_FUNCTION_H_
-#define GOOGLE_CACHEINVALIDATION_DEPS_SHA1_DIGEST_FUNCTION_H_
-
-#error Replace this file with an implementation of DigestFunction based on SHA1.
-
-#endif // GOOGLE_CACHEINVALIDATION_DEPS_SHA1_DIGEST_FUNCTION_H_
diff --git a/google/cacheinvalidation/deps/stl-namespace.h b/google/cacheinvalidation/deps/stl-namespace.h
deleted file mode 100644
index e05bcb4..0000000
--- a/google/cacheinvalidation/deps/stl-namespace.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef GOOGLE_CACHEINVALIDATION_DEPS_STL_NAMESPACE_H_
-#define GOOGLE_CACHEINVALIDATION_DEPS_STL_NAMESPACE_H_
-
-// Google style is to use the global namespace for stl classes so we
-// leave this blank.
-#define INVALIDATION_STL_NAMESPACE
-
-#endif // GOOGLE_CACHEINVALIDATION_DEPS_STL_NAMESPACE_H_
diff --git a/google/cacheinvalidation/deps/string_util.h b/google/cacheinvalidation/deps/string_util.h
deleted file mode 100644
index 8f03ca3..0000000
--- a/google/cacheinvalidation/deps/string_util.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef GOOGLE_CACHEINVALIDATION_DEPS_STRING_UTIL_H_
-#define GOOGLE_CACHEINVALIDATION_DEPS_STRING_UTIL_H_
-
-#error This file should be replaced with a stub pointing to a file \
- containing string utility functions in the invalidation namespace. \
- At least StringAppendV() StringPrintf(), and IntToString() are needed.
-
-#endif // GOOGLE_CACHEINVALIDATION_DEPS_STRING_UTIL_H_
diff --git a/google/cacheinvalidation/deps/time.h b/google/cacheinvalidation/deps/time.h
deleted file mode 100644
index 070b1fe..0000000
--- a/google/cacheinvalidation/deps/time.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef GOOGLE_CACHEINVALIDATION_DEPS_TIME_H_
-#define GOOGLE_CACHEINVALIDATION_DEPS_TIME_H_
-
-#error This file should be replaced with a stub pointing to something \
- like base/time.h from the Chromium source tree, with definitions for types \
- Time, TimeDelta, etc.
-
-#endif // GOOGLE_CACHEINVALIDATION_DEPS_TIME_H_
diff --git a/google/cacheinvalidation/impl/basic-system-resources.cc b/google/cacheinvalidation/impl/basic-system-resources.cc
deleted file mode 100644
index 0b2c24f..0000000
--- a/google/cacheinvalidation/impl/basic-system-resources.cc
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "google/cacheinvalidation/impl/basic-system-resources.h"
-
-namespace invalidation {
-
-BasicSystemResources::BasicSystemResources(
- Logger* logger, Scheduler* internal_scheduler,
- Scheduler* listener_scheduler, NetworkChannel* network,
- Storage* storage, const string& platform)
- : logger_(logger),
- internal_scheduler_(internal_scheduler),
- listener_scheduler_(listener_scheduler),
- network_(network),
- storage_(storage),
- platform_(platform) {
- logger_->SetSystemResources(this);
- internal_scheduler_->SetSystemResources(this);
- listener_scheduler_->SetSystemResources(this);
- network_->SetSystemResources(this);
- storage_->SetSystemResources(this);
-}
-
-BasicSystemResources::~BasicSystemResources() {
-}
-
-void BasicSystemResources::Start() {
- CHECK(!run_state_.IsStarted()) << "resources already started";
-
- // TODO(ghc): Investigate whether we should have Start() and Stop() methods
- // on components like the scheduler. Otherwise, the resources can't start and
- // stop them ...
- run_state_.Start();
-}
-
-void BasicSystemResources::Stop() {
- CHECK(run_state_.IsStarted()) << "cannot stop resources that aren't started";
- CHECK(!run_state_.IsStopped()) << "resources already stopped";
- run_state_.Stop();
-}
-
-bool BasicSystemResources::IsStarted() const {
- return run_state_.IsStarted();
-}
-
-Logger* BasicSystemResources::logger() {
- return logger_.get();
-}
-
-Scheduler* BasicSystemResources::internal_scheduler() {
- return internal_scheduler_.get();
-}
-
-Scheduler* BasicSystemResources::listener_scheduler() {
- return listener_scheduler_.get();
-}
-
-NetworkChannel* BasicSystemResources::network() {
- return network_.get();
-}
-
-Storage* BasicSystemResources::storage() {
- return storage_.get();
-}
-
-string BasicSystemResources::platform() const {
- return platform_;
-}
-
-} // namespace invalidation
diff --git a/google/cacheinvalidation/impl/basic-system-resources.h b/google/cacheinvalidation/impl/basic-system-resources.h
deleted file mode 100644
index 8fc1a29..0000000
--- a/google/cacheinvalidation/impl/basic-system-resources.h
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// A simple implementation of SystemResources that just takes the resource
-// components and constructs a SystemResources object.
-
-#ifndef GOOGLE_CACHEINVALIDATION_IMPL_BASIC_SYSTEM_RESOURCES_H_
-#define GOOGLE_CACHEINVALIDATION_IMPL_BASIC_SYSTEM_RESOURCES_H_
-
-#include "google/cacheinvalidation/include/system-resources.h"
-#include "google/cacheinvalidation/deps/scoped_ptr.h"
-#include "google/cacheinvalidation/impl/run-state.h"
-
-namespace invalidation {
-
-class BasicSystemResources : public SystemResources {
- public:
- // Constructs an instance from resource components. Ownership of all
- // components is transferred to the BasicSystemResources object.
- BasicSystemResources(
- Logger* logger, Scheduler* internal_scheduler,
- Scheduler* listener_scheduler, NetworkChannel* network,
- Storage* storage, const string& platform);
-
- virtual ~BasicSystemResources();
-
- // Overrides from SystemResources.
- virtual void Start();
- virtual void Stop();
- virtual bool IsStarted() const;
-
- virtual Logger* logger();
- virtual Scheduler* internal_scheduler();
- virtual Scheduler* listener_scheduler();
- virtual NetworkChannel* network();
- virtual Storage* storage();
- virtual string platform() const;
-
- private:
- // Components comprising the system resources. We delegate calls to these as
- // appropriate.
- scoped_ptr<Logger> logger_;
- scoped_ptr<Scheduler> internal_scheduler_;
- scoped_ptr<Scheduler> listener_scheduler_;
- scoped_ptr<NetworkChannel> network_;
- scoped_ptr<Storage> storage_;
-
- // The state of the resources.
- RunState run_state_;
-
- // Information about the client operating system/platform.
- string platform_;
-};
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_IMPL_BASIC_SYSTEM_RESOURCES_H_
diff --git a/google/cacheinvalidation/impl/build_constants.h b/google/cacheinvalidation/impl/build_constants.h
deleted file mode 100644
index 156b494..0000000
--- a/google/cacheinvalidation/impl/build_constants.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2013 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS-IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Build constant definitions
-
-#ifndef INVALIDATION_BUILD_CONSTANTS_H_
-#define INVALIDATION_BUILD_CONSTANTS_H_
-namespace invalidation {
-const int BUILD_DATESTAMP = 20140204;
-} // namespace invalidation
-#endif // INVALIDATION_BUILD_CONSTANTS_H_
diff --git a/google/cacheinvalidation/impl/checking-invalidation-listener.cc b/google/cacheinvalidation/impl/checking-invalidation-listener.cc
deleted file mode 100644
index af5a4e5..0000000
--- a/google/cacheinvalidation/impl/checking-invalidation-listener.cc
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// InvalidationListener wrapper that ensures that a delegate listener is called
-// on the proper thread and calls the listener method on the listener thread.
-
-#include "google/cacheinvalidation/impl/checking-invalidation-listener.h"
-#include "google/cacheinvalidation/impl/log-macro.h"
-
-namespace invalidation {
-
-CheckingInvalidationListener::CheckingInvalidationListener(
- InvalidationListener* delegate, Statistics* statistics,
- Scheduler* internal_scheduler, Scheduler* listener_scheduler,
- Logger* logger)
- : delegate_(delegate),
- statistics_(statistics),
- internal_scheduler_(internal_scheduler),
- listener_scheduler_(listener_scheduler),
- logger_(logger) {
- CHECK(delegate != NULL);
- CHECK(statistics != NULL);
- CHECK(internal_scheduler_ != NULL);
- CHECK(listener_scheduler != NULL);
- CHECK(logger != NULL);
-}
-
-void CheckingInvalidationListener::Invalidate(
- InvalidationClient* client, const Invalidation& invalidation,
- const AckHandle& ack_handle) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- statistics_->RecordListenerEvent(Statistics::ListenerEventType_INVALIDATE);
- listener_scheduler_->Schedule(
- Scheduler::NoDelay(),
- NewPermanentCallback(
- delegate_, &InvalidationListener::Invalidate, client, invalidation,
- ack_handle));
-}
-
-void CheckingInvalidationListener::InvalidateUnknownVersion(
- InvalidationClient* client, const ObjectId& object_id,
- const AckHandle& ack_handle) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- statistics_->RecordListenerEvent(
- Statistics::ListenerEventType_INVALIDATE_UNKNOWN);
- listener_scheduler_->Schedule(
- Scheduler::NoDelay(),
- NewPermanentCallback(
- delegate_, &InvalidationListener::InvalidateUnknownVersion, client,
- object_id, ack_handle));
-}
-
-void CheckingInvalidationListener::InvalidateAll(
- InvalidationClient* client, const AckHandle& ack_handle) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- statistics_->RecordListenerEvent(
- Statistics::ListenerEventType_INVALIDATE_ALL);
- listener_scheduler_->Schedule(
- Scheduler::NoDelay(),
- NewPermanentCallback(
- delegate_, &InvalidationListener::InvalidateAll, client,
- ack_handle));
-}
-
-void CheckingInvalidationListener::InformRegistrationFailure(
- InvalidationClient* client, const ObjectId& object_id,
- bool is_transient, const string& error_message) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- statistics_->RecordListenerEvent(
- Statistics::ListenerEventType_INFORM_REGISTRATION_FAILURE);
- listener_scheduler_->Schedule(
- Scheduler::NoDelay(),
- NewPermanentCallback(
- delegate_, &InvalidationListener::InformRegistrationFailure, client,
- object_id, is_transient, error_message));
-}
-
-void CheckingInvalidationListener::InformRegistrationStatus(
- InvalidationClient* client, const ObjectId& object_id,
- RegistrationState reg_state) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- statistics_->RecordListenerEvent(
- Statistics::ListenerEventType_INFORM_REGISTRATION_STATUS);
- listener_scheduler_->Schedule(
- Scheduler::NoDelay(),
- NewPermanentCallback(
- delegate_, &InvalidationListener::InformRegistrationStatus, client,
- object_id, reg_state));
-}
-
-void CheckingInvalidationListener::ReissueRegistrations(
- InvalidationClient* client, const string& prefix, int prefix_len) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- statistics_->RecordListenerEvent(
- Statistics::ListenerEventType_REISSUE_REGISTRATIONS);
- listener_scheduler_->Schedule(
- Scheduler::NoDelay(),
- NewPermanentCallback(
- delegate_, &InvalidationListener::ReissueRegistrations,
- client, prefix, prefix_len));
-}
-
-void CheckingInvalidationListener::InformError(
- InvalidationClient* client, const ErrorInfo& error_info) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- statistics_->RecordListenerEvent(
- Statistics::ListenerEventType_INFORM_ERROR);
- listener_scheduler_->Schedule(
- Scheduler::NoDelay(),
- NewPermanentCallback(
- delegate_, &InvalidationListener::InformError, client, error_info));
-}
-
-void CheckingInvalidationListener::Ready(InvalidationClient* client) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- TLOG(logger_, INFO, "Informing app that ticl is ready");
- listener_scheduler_->Schedule(
- Scheduler::NoDelay(),
- NewPermanentCallback(delegate_, &InvalidationListener::Ready, client));
-}
-
-} // namespace invalidation
diff --git a/google/cacheinvalidation/impl/checking-invalidation-listener.h b/google/cacheinvalidation/impl/checking-invalidation-listener.h
deleted file mode 100644
index 4c82e03..0000000
--- a/google/cacheinvalidation/impl/checking-invalidation-listener.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// InvalidationListener wrapper that ensures that a delegate listener is called
-// on the proper thread and calls the listener method on the listener thread.
-
-#ifndef GOOGLE_CACHEINVALIDATION_IMPL_CHECKING_INVALIDATION_LISTENER_H_
-#define GOOGLE_CACHEINVALIDATION_IMPL_CHECKING_INVALIDATION_LISTENER_H_
-
-#include "google/cacheinvalidation/include/invalidation-client.h"
-#include "google/cacheinvalidation/include/invalidation-listener.h"
-#include "google/cacheinvalidation/include/system-resources.h"
-#include "google/cacheinvalidation/include/types.h"
-#include "google/cacheinvalidation/impl/statistics.h"
-
-namespace invalidation {
-
-class CheckingInvalidationListener : public InvalidationListener {
- public:
- CheckingInvalidationListener(
- InvalidationListener* delegate, Statistics* statistics,
- Scheduler* internal_scheduler, Scheduler* listener_scheduler,
- Logger* logger);
-
- virtual ~CheckingInvalidationListener() {}
-
- virtual void Invalidate(
- InvalidationClient* client, const Invalidation& invalidation,
- const AckHandle& ack_handle);
-
- virtual void InvalidateUnknownVersion(
- InvalidationClient* client, const ObjectId& object_id,
- const AckHandle& ack_handle);
-
- virtual void InvalidateAll(
- InvalidationClient* client, const AckHandle& ack_handle);
-
- virtual void InformRegistrationFailure(
- InvalidationClient* client, const ObjectId& object_id,
- bool is_transient, const string& error_message);
-
- virtual void InformRegistrationStatus(
- InvalidationClient* client, const ObjectId& object_id,
- RegistrationState reg_state);
-
- virtual void ReissueRegistrations(
- InvalidationClient* client, const string& prefix, int prefix_len);
-
- virtual void InformError(
- InvalidationClient* client, const ErrorInfo& error_info);
-
- /* Returns the delegate InvalidationListener. */
- InvalidationListener* delegate() {
- return delegate_;
- }
-
- virtual void Ready(InvalidationClient* client);
-
- private:
- /* The actual listener to which this listener delegates. */
- InvalidationListener* delegate_;
-
- /* Statistics objects to track number of sent messages, etc. */
- Statistics* statistics_;
-
- /* The scheduler for scheduling internal events in the library. */
- Scheduler* internal_scheduler_;
-
- /* The scheduler for scheduling events for the delegate. */
- Scheduler* listener_scheduler_;
-
- Logger* logger_;
-};
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_IMPL_CHECKING_INVALIDATION_LISTENER_H_
diff --git a/google/cacheinvalidation/impl/client-protocol-namespace-fix.h b/google/cacheinvalidation/impl/client-protocol-namespace-fix.h
deleted file mode 100644
index 9366a39..0000000
--- a/google/cacheinvalidation/impl/client-protocol-namespace-fix.h
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Brings invalidation client protocol buffers into invalidation namespace.
-
-#ifndef GOOGLE_CACHEINVALIDATION_IMPL_CLIENT_PROTOCOL_NAMESPACE_FIX_H_
-#define GOOGLE_CACHEINVALIDATION_IMPL_CLIENT_PROTOCOL_NAMESPACE_FIX_H_
-
-#include "google/cacheinvalidation/client.pb.h"
-#include "google/cacheinvalidation/client_protocol.pb.h"
-#include "google/cacheinvalidation/types.pb.h"
-#include "google/cacheinvalidation/impl/repeated-field-namespace-fix.h"
-
-namespace invalidation {
-
-// Client
-using ::ipc::invalidation::PersistentStateBlob;
-using ::ipc::invalidation::PersistentTiclState;
-
-// ClientProtocol
-using ::ipc::invalidation::AckHandleP;
-using ::ipc::invalidation::ApplicationClientIdP;
-using ::ipc::invalidation::ClientConfigP;
-using ::ipc::invalidation::ClientHeader;
-using ::ipc::invalidation::ClientVersion;
-using ::ipc::invalidation::ClientToServerMessage;
-using ::ipc::invalidation::ConfigChangeMessage;
-using ::ipc::invalidation::ErrorMessage;
-using ::ipc::invalidation::ErrorMessage_Code_AUTH_FAILURE;
-using ::ipc::invalidation::ErrorMessage_Code_UNKNOWN_FAILURE;
-using ::ipc::invalidation::InfoMessage;
-using ::ipc::invalidation::InfoRequestMessage;
-using ::ipc::invalidation::InfoRequestMessage_InfoType;
-using ::ipc::invalidation::InfoRequestMessage_InfoType_GET_PERFORMANCE_COUNTERS;
-using ::ipc::invalidation::InitializeMessage;
-using ::ipc::invalidation::InitializeMessage_DigestSerializationType_BYTE_BASED;
-using ::ipc::invalidation::InitializeMessage_DigestSerializationType_NUMBER_BASED;
-using ::ipc::invalidation::InvalidationMessage;
-using ::ipc::invalidation::InvalidationP;
-using ::ipc::invalidation::ObjectIdP;
-using ::ipc::invalidation::PropertyRecord;
-using ::ipc::invalidation::ProtocolHandlerConfigP;
-using ::ipc::invalidation::ProtocolVersion;
-using ::ipc::invalidation::RateLimitP;
-using ::ipc::invalidation::RegistrationMessage;
-using ::ipc::invalidation::RegistrationP;
-using ::ipc::invalidation::RegistrationP_OpType_REGISTER;
-using ::ipc::invalidation::RegistrationP_OpType_UNREGISTER;
-using ::ipc::invalidation::RegistrationMessage;
-using ::ipc::invalidation::RegistrationStatus;
-using ::ipc::invalidation::RegistrationStatusMessage;
-using ::ipc::invalidation::RegistrationSubtree;
-using ::ipc::invalidation::RegistrationSummary;
-using ::ipc::invalidation::RegistrationSyncMessage;
-using ::ipc::invalidation::RegistrationSyncRequestMessage;
-using ::ipc::invalidation::ServerHeader;
-using ::ipc::invalidation::ServerToClientMessage;
-using ::ipc::invalidation::StatusP;
-using ::ipc::invalidation::StatusP_Code_SUCCESS;
-using ::ipc::invalidation::StatusP_Code_PERMANENT_FAILURE;
-using ::ipc::invalidation::StatusP_Code_TRANSIENT_FAILURE;
-using ::ipc::invalidation::TokenControlMessage;
-using ::ipc::invalidation::Version;
-
-// Types
-using ::ipc::invalidation::ObjectSource_Type_INTERNAL;
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_IMPL_CLIENT_PROTOCOL_NAMESPACE_FIX_H_
diff --git a/google/cacheinvalidation/impl/constants.cc b/google/cacheinvalidation/impl/constants.cc
deleted file mode 100644
index e090648..0000000
--- a/google/cacheinvalidation/impl/constants.cc
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Various constants common to clients and servers used in version 2 of the
-// Ticl.
-
-#include "google/cacheinvalidation/impl/build_constants.h"
-#include "google/cacheinvalidation/impl/constants.h"
-
-namespace invalidation {
-
-const int Constants::kClientMajorVersion = 3;
-const int Constants::kClientMinorVersion = BUILD_DATESTAMP;
-const int Constants::kProtocolMajorVersion = 3;
-const int Constants::kProtocolMinorVersion = 2;
-const int Constants::kConfigMajorVersion = 3;
-const int Constants::kConfigMinorVersion = 2;
-} // namespace invalidation
diff --git a/google/cacheinvalidation/impl/constants.h b/google/cacheinvalidation/impl/constants.h
deleted file mode 100644
index bb604d7..0000000
--- a/google/cacheinvalidation/impl/constants.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Various constants common to clients and servers used in version 2 of the
-// Ticl.
-
-#ifndef GOOGLE_CACHEINVALIDATION_IMPL_CONSTANTS_H_
-#define GOOGLE_CACHEINVALIDATION_IMPL_CONSTANTS_H_
-
-namespace invalidation {
-
-class Constants {
- public:
- /* Major version of the client library. */
- static const int kClientMajorVersion;
-
- /* Minor version of the client library, defined to be equal to the datestamp
- * of the build (e.g. 20130401).
- */
- static const int kClientMinorVersion;
-
- /* Major version of the protocol between the client and the server. */
- static const int kProtocolMajorVersion;
-
- /* Minor version of the protocol between the client and the server. */
- static const int kProtocolMinorVersion;
-
- /* Major version of the client config. */
- static const int kConfigMajorVersion;
-
- /* Minor version of the client config. */
- static const int kConfigMinorVersion;
-};
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_IMPL_CONSTANTS_H_
diff --git a/google/cacheinvalidation/impl/digest-store.h b/google/cacheinvalidation/impl/digest-store.h
deleted file mode 100644
index b81701e..0000000
--- a/google/cacheinvalidation/impl/digest-store.h
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Interface for a store that allows objects to be added/removed along with the
-// ability to get the digest for the whole or partial set of those objects.
-
-#ifndef GOOGLE_CACHEINVALIDATION_IMPL_DIGEST_STORE_H_
-#define GOOGLE_CACHEINVALIDATION_IMPL_DIGEST_STORE_H_
-
-#include <vector>
-
-namespace invalidation {
-
-using INVALIDATION_STL_NAMESPACE::vector;
-
-template<typename ElementType>
-class DigestStore {
- public:
- virtual ~DigestStore() {}
-
- /* Returns the number of elements. */
- virtual int size() = 0;
-
- /* Returns whether element is in the store. */
- virtual bool Contains(const ElementType& element) = 0;
-
- /* Returns a digest of the desired objects in 'digest'.
- *
- * NOTE: the digest computations MUST NOT depend on the order in which the
- * elements were added.
- */
- virtual string GetDigest() = 0;
-
- /* Stores iterators bounding the elements whose digest prefixes begin with the
- * bit prefix digest_prefix. prefix_len is the length of digest_prefix in
- * bits, which may be less than digest_prefix.length (and may be 0). The
- * implementing class can return *more* objects than what has been specified
- * by digest_prefix, e.g., it could return all the objects in the store.
- */
- virtual void GetElements(const string& digest_prefix, int prefix_len,
- vector<ObjectIdP>* result) = 0;
-
- /* Adds element to the store. No-op if element is already present.
- * Returns whether the element was added.
- */
- virtual bool Add(const ElementType& element) = 0;
-
- /* Adds elements to the store. If any element in elements is already present,
- * the addition is a no-op for that element. When the function returns,
- * added_elements will have been modified to contain all the elements
- * of elements that were not previously present.
- */
- virtual void Add(const vector<ElementType>& elements,
- vector<ElementType>* added_elements) = 0;
-
- /* Removes element from the store. No-op if element is not present.
- * Returns whether the element was removed.
- */
- virtual bool Remove(const ElementType& element) = 0;
-
- /* Remove elements from the store. If any element in element is not present,
- * the removal is a no-op for that element.
- * When the function returns, removed_elements will have been modified to
- * contain all the elements of elements that were previously present
- */
- virtual void Remove(const vector<ElementType>& elements,
- vector<ElementType>* removed_elements) = 0;
-
- /* Removes all elements in this and stores them in elements. */
- virtual void RemoveAll(vector<ElementType>* elements) = 0;
-
- /* Returns a string representation of this digest store. */
- virtual string ToString() = 0;
-};
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_IMPL_DIGEST_STORE_H_
diff --git a/google/cacheinvalidation/impl/exponential-backoff-delay-generator.cc b/google/cacheinvalidation/impl/exponential-backoff-delay-generator.cc
deleted file mode 100644
index eac0218..0000000
--- a/google/cacheinvalidation/impl/exponential-backoff-delay-generator.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "google/cacheinvalidation/impl/exponential-backoff-delay-generator.h"
-
-namespace invalidation {
-
-TimeDelta ExponentialBackoffDelayGenerator::GetNextDelay() {
- TimeDelta delay = Scheduler::NoDelay(); // After a reset, delay is zero.
- if (in_retry_mode) {
- // We used to multiply the current_max_delay_ by the double, but this
- // implicitly truncated the double to an integer, which would always be 0.
- // By converting to and from milliseconds, we avoid this problem.
- delay = TimeDelta::FromMilliseconds(
- random_->RandDouble() * current_max_delay_.InMilliseconds());
-
- // Adjust the max for the next run.
- TimeDelta max_delay = initial_max_delay_ * max_exponential_factor_;
- if (current_max_delay_ <= max_delay) { // Guard against overflow.
- current_max_delay_ *= 2;
- if (current_max_delay_ > max_delay) {
- current_max_delay_ = max_delay;
- }
- }
- }
- in_retry_mode = true;
- return delay;
-}
-}
diff --git a/google/cacheinvalidation/impl/exponential-backoff-delay-generator.h b/google/cacheinvalidation/impl/exponential-backoff-delay-generator.h
deleted file mode 100644
index cf36a66..0000000
--- a/google/cacheinvalidation/impl/exponential-backoff-delay-generator.h
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Class that generates successive intervals for random exponential backoff.
-// Class tracks a "high water mark" which is doubled each time getNextDelay is
-// called; each call to getNextDelay returns a value uniformly randomly
-// distributed between 0 (inclusive) and the high water mark (exclusive). Note
-// that this class does not dictate the time units for which the delay is
-// computed.
-
-#ifndef GOOGLE_CACHEINVALIDATION_IMPL_EXPONENTIAL_BACKOFF_DELAY_GENERATOR_H_
-#define GOOGLE_CACHEINVALIDATION_IMPL_EXPONENTIAL_BACKOFF_DELAY_GENERATOR_H_
-
-#include "google/cacheinvalidation/include/system-resources.h"
-#include "google/cacheinvalidation/deps/scoped_ptr.h"
-#include "google/cacheinvalidation/deps/logging.h"
-#include "google/cacheinvalidation/deps/time.h"
-#include "google/cacheinvalidation/deps/random.h"
-#include "google/cacheinvalidation/impl/constants.h"
-
-namespace invalidation {
-
-class ExponentialBackoffDelayGenerator {
- public:
- /* Creates a generator with the given maximum and initial delays.
- * Caller continues to own space for random.
- */
- ExponentialBackoffDelayGenerator(Random* random, TimeDelta initial_max_delay,
- int max_exponential_factor) :
- initial_max_delay_(initial_max_delay),
- max_exponential_factor_(max_exponential_factor), random_(random) {
- CHECK_GT(max_exponential_factor_, 0) << "max factor must be positive";
- CHECK(random_ != NULL);
- CHECK(initial_max_delay > Scheduler::NoDelay()) <<
- "Initial delay must be positive";
- Reset();
- }
-
- /* Resets the exponential backoff generator to start delays at the initial
- * delay.
- */
- void Reset() {
- current_max_delay_ = initial_max_delay_;
- in_retry_mode = false;
- }
-
- /* Gets the next delay interval to use. */
- TimeDelta GetNextDelay();
-
- private:
- /* Initial delay time to use. */
- TimeDelta initial_max_delay_;
-
- /* Maximum allowed delay time. */
- int max_exponential_factor_;
-
- /* Next delay time to use. */
- TimeDelta current_max_delay_;
-
- /* If the first call to getNextDelay has been made after reset. */
- bool in_retry_mode;
-
- Random* random_;
-};
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_IMPL_EXPONENTIAL_BACKOFF_DELAY_GENERATOR_H_
diff --git a/google/cacheinvalidation/impl/invalidation-client-core.cc b/google/cacheinvalidation/impl/invalidation-client-core.cc
deleted file mode 100644
index f8e637d..0000000
--- a/google/cacheinvalidation/impl/invalidation-client-core.cc
+++ /dev/null
@@ -1,1009 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Implementation of the Invalidation Client Library (Ticl).
-
-#include "google/cacheinvalidation/impl/invalidation-client-core.h"
-
-#include <sstream>
-
-#include "google/cacheinvalidation/client_test_internal.pb.h"
-#include "google/cacheinvalidation/deps/callback.h"
-#include "google/cacheinvalidation/deps/random.h"
-#include "google/cacheinvalidation/deps/sha1-digest-function.h"
-#include "google/cacheinvalidation/deps/string_util.h"
-#include "google/cacheinvalidation/impl/exponential-backoff-delay-generator.h"
-#include "google/cacheinvalidation/impl/invalidation-client-util.h"
-#include "google/cacheinvalidation/impl/log-macro.h"
-#include "google/cacheinvalidation/impl/persistence-utils.h"
-#include "google/cacheinvalidation/impl/proto-converter.h"
-#include "google/cacheinvalidation/impl/proto-helpers.h"
-#include "google/cacheinvalidation/impl/recurring-task.h"
-#include "google/cacheinvalidation/impl/smearer.h"
-
-namespace invalidation {
-
-using ::ipc::invalidation::RegistrationManagerStateP;
-
-const char* InvalidationClientCore::kClientTokenKey = "ClientToken";
-
-// AcquireTokenTask
-
-AcquireTokenTask::AcquireTokenTask(InvalidationClientCore* client)
- : RecurringTask(
- "AcquireToken",
- client->internal_scheduler_,
- client->logger_,
- &client->smearer_,
- client->CreateExpBackOffGenerator(TimeDelta::FromMilliseconds(
- client->config_.network_timeout_delay_ms())),
- Scheduler::NoDelay(),
- TimeDelta::FromMilliseconds(
- client->config_.network_timeout_delay_ms())),
- client_(client) {
- }
-
-bool AcquireTokenTask::RunTask() {
- // If token is still not assigned (as expected), sends a request.
- // Otherwise, ignore.
- if (client_->client_token_.empty()) {
- // Allocate a nonce and send a message requesting a new token.
- client_->set_nonce(
- InvalidationClientCore::GenerateNonce(client_->random_.get()));
-
- client_->protocol_handler_.SendInitializeMessage(
- client_->application_client_id_, client_->nonce_,
- client_->batching_task_.get(),
- "AcquireToken");
- // Reschedule to check state, retry if necessary after timeout.
- return true;
- } else {
- return false; // Don't reschedule.
- }
-}
-
-// RegSyncHeartbeatTask
-
-RegSyncHeartbeatTask::RegSyncHeartbeatTask(InvalidationClientCore* client)
- : RecurringTask(
- "RegSyncHeartbeat",
- client->internal_scheduler_,
- client->logger_,
- &client->smearer_,
- client->CreateExpBackOffGenerator(TimeDelta::FromMilliseconds(
- client->config_.network_timeout_delay_ms())),
- TimeDelta::FromMilliseconds(
- client->config_.network_timeout_delay_ms()),
- TimeDelta::FromMilliseconds(
- client->config_.network_timeout_delay_ms())),
- client_(client) {
-}
-
-bool RegSyncHeartbeatTask::RunTask() {
- if (!client_->registration_manager_.IsStateInSyncWithServer()) {
- // Simply send an info message to ensure syncing happens.
- TLOG(client_->logger_, INFO, "Registration state not in sync with "
- "server: %s", client_->registration_manager_.ToString().c_str());
- client_->SendInfoMessageToServer(false, true /* request server summary */);
- return true;
- } else {
- TLOG(client_->logger_, INFO, "Not sending message since state is in sync");
- return false;
- }
-}
-
-// PersistentWriteTask
-
-PersistentWriteTask::PersistentWriteTask(InvalidationClientCore* client)
- : RecurringTask(
- "PersistentWrite",
- client->internal_scheduler_,
- client->logger_,
- &client->smearer_,
- client->CreateExpBackOffGenerator(TimeDelta::FromMilliseconds(
- client->config_.write_retry_delay_ms())),
- Scheduler::NoDelay(),
- TimeDelta::FromMilliseconds(
- client->config_.write_retry_delay_ms())),
- client_(client) {
-}
-
-bool PersistentWriteTask::RunTask() {
- if (client_->client_token_.empty() ||
- (client_->client_token_ == last_written_token_)) {
- // No work to be done
- return false; // Do not reschedule
- }
-
- // Persistent write needs to happen.
- PersistentTiclState state;
- state.set_client_token(client_->client_token_);
- string serialized_state;
- PersistenceUtils::SerializeState(state, client_->digest_fn_.get(),
- &serialized_state);
- client_->storage_->WriteKey(InvalidationClientCore::kClientTokenKey,
- serialized_state,
- NewPermanentCallback(this, &PersistentWriteTask::WriteCallback,
- client_->client_token_));
- return true; // Reschedule after timeout to make sure that write does happen.
-}
-
-void PersistentWriteTask::WriteCallback(const string& token, Status status) {
- TLOG(client_->logger_, INFO, "Write state completed: %d, %s",
- status.IsSuccess(), status.message().c_str());
- if (status.IsSuccess()) {
- // Set lastWrittenToken to be the token that was written (NOT client_token_:
- // which could have changed while the write was happening).
- last_written_token_ = token;
- } else {
- client_->statistics_->RecordError(
- Statistics::ClientErrorType_PERSISTENT_WRITE_FAILURE);
- }
-}
-
-// HeartbeatTask
-
-HeartbeatTask::HeartbeatTask(InvalidationClientCore* client)
- : RecurringTask(
- "Heartbeat",
- client->internal_scheduler_,
- client->logger_,
- &client->smearer_,
- NULL,
- TimeDelta::FromMilliseconds(
- client->config_.heartbeat_interval_ms()),
- Scheduler::NoDelay()),
- client_(client) {
- next_performance_send_time_ = client_->internal_scheduler_->GetCurrentTime() +
- smearer()->GetSmearedDelay(TimeDelta::FromMilliseconds(
- client_->config_.perf_counter_delay_ms()));
-}
-
-bool HeartbeatTask::RunTask() {
- // Send info message. If needed, send performance counters and reset the next
- // performance counter send time.
- TLOG(client_->logger_, INFO, "Sending heartbeat to server: %s",
- client_->ToString().c_str());
- Scheduler *scheduler = client_->internal_scheduler_;
- bool must_send_perf_counters =
- next_performance_send_time_ > scheduler->GetCurrentTime();
- if (must_send_perf_counters) {
- next_performance_send_time_ = scheduler->GetCurrentTime() +
- client_->smearer_.GetSmearedDelay(TimeDelta::FromMilliseconds(
- client_->config_.perf_counter_delay_ms()));
- }
-
- TLOG(client_->logger_, INFO, "Sending heartbeat to server: %s",
- client_->ToString().c_str());
- client_->SendInfoMessageToServer(must_send_perf_counters,
- !client_->registration_manager_.IsStateInSyncWithServer());
- return true; // Reschedule.
-}
-
-BatchingTask::BatchingTask(
- ProtocolHandler *handler, Smearer* smearer, TimeDelta batching_delay)
- : RecurringTask(
- "Batching", handler->internal_scheduler_, handler->logger_, smearer,
- NULL, batching_delay, Scheduler::NoDelay()),
- protocol_handler_(handler) {
-}
-
-bool BatchingTask::RunTask() {
- // Send message to server - the batching information is picked up in
- // SendMessageToServer.
- protocol_handler_->SendMessageToServer();
- return false; // Don't reschedule.
-}
-
-InvalidationClientCore::InvalidationClientCore(
- SystemResources* resources, Random* random, int client_type,
- const string& client_name, const ClientConfigP& config,
- const string& application_name)
- : resources_(resources),
- internal_scheduler_(resources->internal_scheduler()),
- logger_(resources->logger()),
- storage_(new SafeStorage(resources->storage())),
- statistics_(new Statistics()),
- config_(config),
- digest_fn_(new Sha1DigestFunction()),
- registration_manager_(logger_, statistics_.get(), digest_fn_.get()),
- msg_validator_(new TiclMessageValidator(logger_)),
- smearer_(random, config.smear_percent()),
- protocol_handler_(config.protocol_handler_config(), resources, &smearer_,
- statistics_.get(), client_type, application_name, this,
- msg_validator_.get()),
- is_online_(true),
- random_(random) {
- storage_.get()->SetSystemResources(resources_);
- application_client_id_.set_client_name(client_name);
- application_client_id_.set_client_type(client_type);
- CreateSchedulingTasks();
- RegisterWithNetwork(resources);
- TLOG(logger_, INFO, "Created client: %s", ToString().c_str());
-}
-
-void InvalidationClientCore::RegisterWithNetwork(SystemResources* resources) {
- // Install ourselves as a receiver for server messages.
- resources->network()->SetMessageReceiver(
- NewPermanentCallback(this, &InvalidationClientCore::MessageReceiver));
-
- resources->network()->AddNetworkStatusReceiver(
- NewPermanentCallback(this,
- &InvalidationClientCore::NetworkStatusReceiver));
-}
-
-void InvalidationClientCore::CreateSchedulingTasks() {
- acquire_token_task_.reset(new AcquireTokenTask(this));
- reg_sync_heartbeat_task_.reset(new RegSyncHeartbeatTask(this));
- persistent_write_task_.reset(new PersistentWriteTask(this));
- heartbeat_task_.reset(new HeartbeatTask(this));
- batching_task_.reset(new BatchingTask(&protocol_handler_,
- &smearer_,
- TimeDelta::FromMilliseconds(
- config_.protocol_handler_config().batching_delay_ms())));
-}
-
-void InvalidationClientCore::InitConfig(ClientConfigP* config) {
- ProtoHelpers::InitConfigVersion(config->mutable_version());
- ProtocolHandler::InitConfig(config->mutable_protocol_handler_config());
-}
-
-void InvalidationClientCore::InitConfigForTest(ClientConfigP* config) {
- ProtoHelpers::InitConfigVersion(config->mutable_version());
- config->set_network_timeout_delay_ms(2000);
- config->set_heartbeat_interval_ms(5000);
- config->set_write_retry_delay_ms(500);
- ProtocolHandler::InitConfigForTest(config->mutable_protocol_handler_config());
-}
-
-void InvalidationClientCore::Start() {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- if (ticl_state_.IsStarted()) {
- TLOG(logger_, SEVERE,
- "Ignoring start call since already started: client = %s",
- this->ToString().c_str());
- return;
- }
-
- // Initialize the nonce so that we can maintain the invariant that exactly
- // one of "nonce_" and "client_token_" is non-empty.
- set_nonce(InvalidationClientCore::GenerateNonce(random_.get()));
-
- TLOG(logger_, INFO, "Starting with C++ config: %s",
- ProtoHelpers::ToString(config_).c_str());
-
- // Read the state blob and then schedule startInternal once the value is
- // there.
- ScheduleStartAfterReadingStateBlob();
-}
-
-void InvalidationClientCore::StartInternal(const string& serialized_state) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
-
- CHECK(resources_->IsStarted()) << "Resources must be started before starting "
- "the Ticl";
-
- // Initialize the session manager using the persisted client token.
- PersistentTiclState persistent_state;
- bool deserialized = false;
- if (!serialized_state.empty()) {
- deserialized = PersistenceUtils::DeserializeState(
- logger_, serialized_state, digest_fn_.get(), &persistent_state);
- }
-
- if (!serialized_state.empty() && !deserialized) {
- // In this case, we'll proceed as if we had no persistent state -- i.e.,
- // obtain a new client id from the server.
- statistics_->RecordError(
- Statistics::ClientErrorType_PERSISTENT_DESERIALIZATION_FAILURE);
- TLOG(logger_, SEVERE, "Failed deserializing persistent state: %s",
- ProtoHelpers::ToString(serialized_state).c_str());
- }
- if (deserialized) {
- // If we have persistent state, use the previously-stored token and send a
- // heartbeat to let the server know that we've restarted, since we may have
- // been marked offline.
- //
- // In the common case, the server will already have all of our
- // registrations, but we won't know for sure until we've gotten its summary.
- // We'll ask the application for all of its registrations, but to avoid
- // making the registrar redo the work of performing registrations that
- // probably already exist, we'll suppress sending them to the registrar.
- TLOG(logger_, INFO, "Restarting from persistent state: %s",
- ProtoHelpers::ToString(
- persistent_state.client_token()).c_str());
- set_nonce("");
- set_client_token(persistent_state.client_token());
- should_send_registrations_ = false;
-
- // Schedule an info message for the near future. We delay a little bit to
- // allow the application to reissue its registrations locally and avoid
- // triggering registration sync with the data center due to a hash mismatch.
- internal_scheduler_->Schedule(TimeDelta::FromMilliseconds(
- config_.initial_persistent_heartbeat_delay_ms()),
- NewPermanentCallback(this,
- &InvalidationClientCore::SendInfoMessageToServer, false, true));
-
- // We need to ensure that heartbeats are sent, regardless of whether we
- // start fresh or from persistent state. The line below ensures that they
- // are scheduled in the persistent startup case. For the other case, the
- // task is scheduled when we acquire a token.
- heartbeat_task_.get()->EnsureScheduled("Startup-after-persistence");
- } else {
- // If we had no persistent state or couldn't deserialize the state that we
- // had, start fresh. Request a new client identifier.
- //
- // The server can't possibly have our registrations, so whatever we get
- // from the application we should send to the registrar.
- TLOG(logger_, INFO, "Starting with no previous state");
- should_send_registrations_ = true;
- ScheduleAcquireToken("Startup");
- }
- // InvalidationListener.Ready() is called when the ticl has acquired a
- // new token.
-}
-
-void InvalidationClientCore::Stop() {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- TLOG(logger_, WARNING, "Ticl being stopped: %s", ToString().c_str());
- if (ticl_state_.IsStarted()) {
- ticl_state_.Stop();
- }
-}
-
-void InvalidationClientCore::Register(const ObjectId& object_id) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- vector<ObjectId> object_ids;
- object_ids.push_back(object_id);
- PerformRegisterOperations(object_ids, RegistrationP_OpType_REGISTER);
-}
-
-void InvalidationClientCore::Unregister(const ObjectId& object_id) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- vector<ObjectId> object_ids;
- object_ids.push_back(object_id);
- PerformRegisterOperations(object_ids, RegistrationP_OpType_UNREGISTER);
-}
-
-void InvalidationClientCore::PerformRegisterOperations(
- const vector<ObjectId>& object_ids, RegistrationP::OpType reg_op_type) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- CHECK(!object_ids.empty()) << "Must specify some object id";
-
- if (ticl_state_.IsStopped()) {
- // The Ticl has been stopped. This might be some old registration op
- // coming in. Just ignore instead of crashing.
- TLOG(logger_, SEVERE, "Ticl stopped: register (%d) of %d objects ignored.",
- reg_op_type, object_ids.size());
- return;
- }
- if (!ticl_state_.IsStarted()) {
- // We must be in the NOT_STARTED state, since we can't be in STOPPED or
- // STARTED (since the previous if-check didn't succeeded, and isStarted uses
- // a != STARTED test).
- TLOG(logger_, SEVERE,
- "Ticl is not yet started; failing registration call; client = %s, "
- "num-objects = %d, op = %d",
- this->ToString().c_str(), object_ids.size(), reg_op_type);
- for (size_t i = 0; i < object_ids.size(); ++i) {
- const ObjectId& object_id = object_ids[i];
- GetListener()->InformRegistrationFailure(this, object_id, true,
- "Client not yet ready");
- }
- return;
- }
-
- vector<ObjectIdP> object_id_protos;
- for (size_t i = 0; i < object_ids.size(); ++i) {
- const ObjectId& object_id = object_ids[i];
- ObjectIdP object_id_proto;
- ProtoConverter::ConvertToObjectIdProto(object_id, &object_id_proto);
- Statistics::IncomingOperationType op_type =
- (reg_op_type == RegistrationP_OpType_REGISTER) ?
- Statistics::IncomingOperationType_REGISTRATION :
- Statistics::IncomingOperationType_UNREGISTRATION;
- statistics_->RecordIncomingOperation(op_type);
- TLOG(logger_, INFO, "Register %s, %d",
- ProtoHelpers::ToString(object_id_proto).c_str(), reg_op_type);
- object_id_protos.push_back(object_id_proto);
- }
-
-
- // Update the registration manager state, then have the protocol client send a
- // message.
- vector<ObjectIdP> object_id_protos_to_send;
- registration_manager_.PerformOperations(object_id_protos, reg_op_type,
- &object_id_protos_to_send);
-
- // Check whether we should suppress sending registrations because we don't
- // yet know the server's summary.
- if (should_send_registrations_ && (!object_id_protos_to_send.empty())) {
- protocol_handler_.SendRegistrations(
- object_id_protos_to_send, reg_op_type, batching_task_.get());
- }
- reg_sync_heartbeat_task_.get()->EnsureScheduled("PerformRegister");
-}
-
-void InvalidationClientCore::Acknowledge(const AckHandle& acknowledge_handle) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- if (acknowledge_handle.IsNoOp()) {
- // Nothing to do. We do not increment statistics here since this is a no op
- // handle and statistics can only be acccessed on the scheduler thread.
- return;
- }
- // Validate the ack handle.
-
- // 1. Parse the ack handle first.
- AckHandleP ack_handle;
- ack_handle.ParseFromString(acknowledge_handle.handle_data());
- if (!ack_handle.IsInitialized()) {
- TLOG(logger_, WARNING, "Bad ack handle : %s",
- ProtoHelpers::ToString(acknowledge_handle.handle_data()).c_str());
- statistics_->RecordError(
- Statistics::ClientErrorType_ACKNOWLEDGE_HANDLE_FAILURE);
- return;
- }
-
- // 2. Validate ack handle - it should have a valid invalidation.
- if (!ack_handle.has_invalidation()
- || !msg_validator_->IsValid(ack_handle.invalidation())) {
- TLOG(logger_, WARNING, "Incorrect ack handle: %s",
- ProtoHelpers::ToString(ack_handle).c_str());
- statistics_->RecordError(
- Statistics::ClientErrorType_ACKNOWLEDGE_HANDLE_FAILURE);
- return;
- }
-
- // Currently, only invalidations have non-trivial ack handle.
- InvalidationP* invalidation = ack_handle.mutable_invalidation();
- invalidation->clear_payload(); // Don't send the payload back.
- statistics_->RecordIncomingOperation(
- Statistics::IncomingOperationType_ACKNOWLEDGE);
- protocol_handler_.SendInvalidationAck(*invalidation, batching_task_.get());
-}
-
-string InvalidationClientCore::ToString() {
- return StringPrintf("Client: %s, %s, %s",
- ProtoHelpers::ToString(application_client_id_).c_str(),
- ProtoHelpers::ToString(client_token_).c_str(),
- this->ticl_state_.ToString().c_str());
-}
-
-string InvalidationClientCore::GetClientToken() {
- CHECK(client_token_.empty() || nonce_.empty());
- TLOG(logger_, FINE, "Return client token = %s",
- ProtoHelpers::ToString(client_token_).c_str());
- return client_token_;
-}
-
-void InvalidationClientCore::HandleIncomingMessage(const string& message) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- statistics_->RecordReceivedMessage(
- Statistics::ReceivedMessageType_TOTAL);
- ParsedMessage parsed_message;
- if (!protocol_handler_.HandleIncomingMessage(message, &parsed_message)) {
- // Invalid message.
- return;
- }
-
- // Ensure we have either a matching token or a matching nonce.
- if (!ValidateToken(parsed_message.header.token())) {
- return;
- }
-
- // Handle a token control message, if present.
- if (parsed_message.token_control_message != NULL) {
- statistics_->RecordReceivedMessage(
- Statistics::ReceivedMessageType_TOKEN_CONTROL);
- HandleTokenChanged(parsed_message.header.token(),
- parsed_message.token_control_message->new_token());
- }
-
- // We might have lost our token or failed to acquire one. Ensure that we do
- // not proceed in either case.
- // Note that checking for the presence of a TokenControlMessage is *not*
- // sufficient: it might be a token-assign with the wrong nonce or a
- // token-destroy message, for example.
- if (client_token_.empty()) {
- return;
- }
-
- // Handle the messages received from the server by calling the appropriate
- // listener method.
-
- // In the beginning inform the listener about the header (the caller is
- // already prepared to handle the fact that the same header is given to
- // it multiple times).
- HandleIncomingHeader(parsed_message.header);
-
- if (parsed_message.invalidation_message != NULL) {
- statistics_->RecordReceivedMessage(
- Statistics::ReceivedMessageType_INVALIDATION);
- HandleInvalidations(parsed_message.invalidation_message->invalidation());
- }
- if (parsed_message.registration_status_message != NULL) {
- statistics_->RecordReceivedMessage(
- Statistics::ReceivedMessageType_REGISTRATION_STATUS);
- HandleRegistrationStatus(
- parsed_message.registration_status_message->registration_status());
- }
- if (parsed_message.registration_sync_request_message != NULL) {
- statistics_->RecordReceivedMessage(
- Statistics::ReceivedMessageType_REGISTRATION_SYNC_REQUEST);
- HandleRegistrationSyncRequest();
- }
- if (parsed_message.info_request_message != NULL) {
- statistics_->RecordReceivedMessage(
- Statistics::ReceivedMessageType_INFO_REQUEST);
- HandleInfoMessage(
- // Shouldn't have to do this, but the proto compiler generates bad code
- // for repeated enum fields.
- *reinterpret_cast<const RepeatedField<InfoRequestMessage_InfoType>* >(
- &parsed_message.info_request_message->info_type()));
- }
- if (parsed_message.error_message != NULL) {
- statistics_->RecordReceivedMessage(
- Statistics::ReceivedMessageType_ERROR);
- HandleErrorMessage(
- parsed_message.error_message->code(),
- parsed_message.error_message->description());
- }
-}
-
-void InvalidationClientCore::HandleTokenChanged(
- const string& header_token, const string& new_token) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
-
- // The server is either supplying a new token in response to an
- // InitializeMessage, spontaneously destroying a token we hold, or
- // spontaneously upgrading a token we hold.
-
- if (!new_token.empty()) {
- // Note: header_token cannot be empty, so an empty nonce or client_token will
- // always be non-equal.
- bool header_token_matches_nonce = header_token == nonce_;
- bool header_token_matches_existing_token = header_token == client_token_;
- bool should_accept_token =
- header_token_matches_nonce || header_token_matches_existing_token;
- if (!should_accept_token) {
- TLOG(logger_, INFO, "Ignoring new token; %s does not match nonce = %s "
- "or existing token = %s",
- ProtoHelpers::ToString(new_token).c_str(),
- ProtoHelpers::ToString(nonce_).c_str(),
- ProtoHelpers::ToString(client_token_).c_str());
- return;
- }
- TLOG(logger_, INFO, "New token being assigned at client: %s, Old = %s",
- ProtoHelpers::ToString(new_token).c_str(),
- ProtoHelpers::ToString(client_token_).c_str());
- heartbeat_task_.get()->EnsureScheduled("Heartbeat-after-new-token");
- set_nonce("");
- set_client_token(new_token);
- persistent_write_task_.get()->EnsureScheduled("Write-after-new-token");
- } else {
- // Destroy the existing token.
- TLOG(logger_, INFO, "Destroying existing token: %s",
- ProtoHelpers::ToString(client_token_).c_str());
- ScheduleAcquireToken("Destroy");
- }
-}
-
-void InvalidationClientCore::ScheduleAcquireToken(const string& debug_string) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- set_client_token("");
- acquire_token_task_.get()->EnsureScheduled(debug_string);
-}
-
-void InvalidationClientCore::HandleInvalidations(
- const RepeatedPtrField<InvalidationP>& invalidations) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
-
- for (int i = 0; i < invalidations.size(); ++i) {
- const InvalidationP& invalidation = invalidations.Get(i);
- AckHandleP ack_handle_proto;
- ack_handle_proto.mutable_invalidation()->CopyFrom(invalidation);
- string serialized;
- ack_handle_proto.SerializeToString(&serialized);
- AckHandle ack_handle(serialized);
- if (ProtoConverter::IsAllObjectIdP(invalidation.object_id())) {
- TLOG(logger_, INFO, "Issuing invalidate all");
- GetListener()->InvalidateAll(this, ack_handle);
- } else {
- // Regular object. Could be unknown version or not.
- Invalidation inv;
- ProtoConverter::ConvertFromInvalidationProto(invalidation, &inv);
- bool isSuppressed = invalidation.is_trickle_restart();
- TLOG(logger_, INFO, "Issuing invalidate: %s",
- ProtoHelpers::ToString(invalidation).c_str());
-
- // Issue invalidate if the invalidation had a known version AND either
- // no suppression has occurred or the client allows suppression.
- if (invalidation.is_known_version() &&
- (!isSuppressed || config_.allow_suppression())) {
- GetListener()->Invalidate(this, inv, ack_handle);
- } else {
- // Unknown version
- GetListener()->InvalidateUnknownVersion(this,
- inv.object_id(), ack_handle);
- }
- }
- }
-}
-
-void InvalidationClientCore::HandleRegistrationStatus(
- const RepeatedPtrField<RegistrationStatus>& reg_status_list) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
-
- vector<bool> local_processing_statuses;
- registration_manager_.HandleRegistrationStatus(
- reg_status_list, &local_processing_statuses);
- CHECK(local_processing_statuses.size() ==
- static_cast<size_t>(reg_status_list.size())) <<
- "Not all registration statuses were processed";
-
- // Inform app about the success or failure of each registration based
- // on what the registration manager has indicated.
- for (int i = 0; i < reg_status_list.size(); ++i) {
- const RegistrationStatus& reg_status = reg_status_list.Get(i);
- bool was_success = local_processing_statuses[i];
- TLOG(logger_, FINE, "Process reg status: %s",
- ProtoHelpers::ToString(reg_status).c_str());
-
- ObjectId object_id;
- ProtoConverter::ConvertFromObjectIdProto(
- reg_status.registration().object_id(), &object_id);
- if (was_success) {
- // Server operation was both successful and agreed with what the client
- // wanted.
- RegistrationP::OpType reg_op_type = reg_status.registration().op_type();
- InvalidationListener::RegistrationState reg_state =
- ConvertOpTypeToRegState(reg_op_type);
- GetListener()->InformRegistrationStatus(this, object_id, reg_state);
- } else {
- // Server operation either failed or disagreed with client's intent (e.g.,
- // successful unregister, but the client wanted a registration).
- string description =
- (reg_status.status().code() == StatusP_Code_SUCCESS) ?
- "Registration discrepancy detected" :
- reg_status.status().description();
- bool is_permanent =
- (reg_status.status().code() == StatusP_Code_PERMANENT_FAILURE);
- GetListener()->InformRegistrationFailure(
- this, object_id, !is_permanent, description);
- }
- }
-}
-
-void InvalidationClientCore::HandleRegistrationSyncRequest() {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- // Send all the registrations in the reg sync message.
- // Generate a single subtree for all the registrations.
- RegistrationSubtree subtree;
- registration_manager_.GetRegistrations("", 0, &subtree);
- protocol_handler_.SendRegistrationSyncSubtree(subtree, batching_task_.get());
-}
-
-void InvalidationClientCore::HandleInfoMessage(
- const RepeatedField<InfoRequestMessage_InfoType>& info_types) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- bool must_send_performance_counters = false;
- for (int i = 0; i < info_types.size(); ++i) {
- must_send_performance_counters =
- (info_types.Get(i) ==
- InfoRequestMessage_InfoType_GET_PERFORMANCE_COUNTERS);
- if (must_send_performance_counters) {
- break;
- }
- }
- SendInfoMessageToServer(must_send_performance_counters,
- !registration_manager_.IsStateInSyncWithServer());
-}
-
-void InvalidationClientCore::HandleErrorMessage(
- ErrorMessage::Code code,
- const string& description) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
-
- // If it is an auth failure, we shut down the ticl.
- TLOG(logger_, SEVERE, "Received error message: %s, %s",
- ProtoHelpers::ToString(code).c_str(),
- description.c_str());
-
- // Translate the code to error reason.
- int reason;
- switch (code) {
- case ErrorMessage_Code_AUTH_FAILURE:
- reason = ErrorReason::AUTH_FAILURE;
- break;
- case ErrorMessage_Code_UNKNOWN_FAILURE:
- reason = ErrorReason::UNKNOWN_FAILURE;
- break;
- default:
- reason = ErrorReason::UNKNOWN_FAILURE;
- break;
- }
- // Issue an informError to the application.
- ErrorInfo error_info(reason, false, description, ErrorContext());
- GetListener()->InformError(this, error_info);
-
- // If this is an auth failure, remove registrations and stop the Ticl.
- // Otherwise do nothing.
- if (code != ErrorMessage_Code_AUTH_FAILURE) {
- return;
- }
-
- // If there are any registrations, remove them and issue registration
- // failure.
- vector<ObjectIdP> desired_registrations;
- registration_manager_.RemoveRegisteredObjects(&desired_registrations);
- TLOG(logger_, WARNING, "Issuing failure for %d objects",
- desired_registrations.size());
- for (size_t i = 0; i < desired_registrations.size(); ++i) {
- ObjectId object_id;
- ProtoConverter::ConvertFromObjectIdProto(
- desired_registrations[i], &object_id);
- GetListener()->InformRegistrationFailure(
- this, object_id, false, "Auth error");
- }
-}
-
-void InvalidationClientCore::HandleMessageSent() {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- last_message_send_time_ = internal_scheduler_->GetCurrentTime();
-}
-
-void InvalidationClientCore::HandleNetworkStatusChange(bool is_online) {
- // If we're back online and haven't sent a message to the server in a while,
- // send a heartbeat to make sure the server knows we're online.
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- bool was_online = is_online_;
- is_online_ = is_online;
- if (is_online && !was_online &&
- (internal_scheduler_->GetCurrentTime() >
- last_message_send_time_ + TimeDelta::FromMilliseconds(
- config_.offline_heartbeat_threshold_ms()))) {
- TLOG(logger_, INFO,
- "Sending heartbeat after reconnection; previous send was %s ms ago",
- SimpleItoa(
- (internal_scheduler_->GetCurrentTime() - last_message_send_time_)
- .InMilliseconds()).c_str());
- SendInfoMessageToServer(
- false, !registration_manager_.IsStateInSyncWithServer());
- }
-}
-
-void InvalidationClientCore::GetRegistrationManagerStateAsSerializedProto(
- string* result) {
- RegistrationManagerStateP reg_state;
- registration_manager_.GetClientSummary(reg_state.mutable_client_summary());
- registration_manager_.GetServerSummary(reg_state.mutable_server_summary());
- vector<ObjectIdP> registered_objects;
- registration_manager_.GetRegisteredObjectsForTest(®istered_objects);
- for (size_t i = 0; i < registered_objects.size(); ++i) {
- reg_state.add_registered_objects()->CopyFrom(registered_objects[i]);
- }
- reg_state.SerializeToString(result);
-}
-
-void InvalidationClientCore::GetStatisticsAsSerializedProto(
- string* result) {
- vector<pair<string, int> > properties;
- statistics_->GetNonZeroStatistics(&properties);
- InfoMessage info_message;
- for (size_t i = 0; i < properties.size(); ++i) {
- PropertyRecord* record = info_message.add_performance_counter();
- record->set_name(properties[i].first);
- record->set_value(properties[i].second);
- }
- info_message.SerializeToString(result);
-}
-
-void InvalidationClientCore::HandleIncomingHeader(
- const ServerMessageHeader& header) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- CHECK(nonce_.empty()) <<
- "Cannot process server header " << header.ToString() <<
- " with non-empty nonce " << nonce_;
-
- if (header.registration_summary() != NULL) {
- // We've received a summary from the server, so if we were suppressing
- // registrations, we should now allow them to go to the registrar.
- should_send_registrations_ = true;
-
-
- // Pass the registration summary to the registration manager. If we are now
- // in agreement with the server and we had any pending operations, we can
- // tell the listener that those operations have succeeded.
- vector<RegistrationP> upcalls;
- registration_manager_.InformServerRegistrationSummary(
- *header.registration_summary(), &upcalls);
- TLOG(logger_, FINE,
- "Receivced new server registration summary (%s); will make %d upcalls",
- ProtoHelpers::ToString(*header.registration_summary()).c_str(),
- upcalls.size());
- vector<RegistrationP>::iterator iter;
- for (iter = upcalls.begin(); iter != upcalls.end(); iter++) {
- const RegistrationP& registration = *iter;
- ObjectId object_id;
- ProtoConverter::ConvertFromObjectIdProto(registration.object_id(),
- &object_id);
- InvalidationListener::RegistrationState reg_state =
- ConvertOpTypeToRegState(registration.op_type());
- GetListener()->InformRegistrationStatus(this, object_id, reg_state);
- }
- }
-}
-
-bool InvalidationClientCore::ValidateToken(const string& server_token) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- if (!client_token_.empty()) {
- // Client token case.
- if (client_token_ != server_token) {
- TLOG(logger_, INFO, "Incoming message has bad token: %s, %s",
- ProtoHelpers::ToString(client_token_).c_str(),
- ProtoHelpers::ToString(server_token).c_str());
- statistics_->RecordError(Statistics::ClientErrorType_TOKEN_MISMATCH);
- return false;
- }
- return true;
- } else if (!nonce_.empty()) {
- // Nonce case.
- CHECK(!nonce_.empty()) << "Client token and nonce are both empty: "
- << client_token_ << ", " << nonce_;
- if (nonce_ != server_token) {
- statistics_->RecordError(Statistics::ClientErrorType_NONCE_MISMATCH);
- TLOG(logger_, INFO,
- "Rejecting server message with mismatched nonce: Client = %s, "
- "Server = %s", ProtoHelpers::ToString(nonce_).c_str(),
- ProtoHelpers::ToString(server_token).c_str());
- return false;
- } else {
- TLOG(logger_, INFO,
- "Accepting server message with matching nonce: %s",
- ProtoHelpers::ToString(nonce_).c_str());
- return true;
- }
- }
- // Neither token nor nonce; ignore message.
- return false;
-}
-
-void InvalidationClientCore::SendInfoMessageToServer(
- bool must_send_performance_counters, bool request_server_summary) {
- TLOG(logger_, INFO,
- "Sending info message to server; request server summary = %s",
- request_server_summary ? "true" : "false");
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
-
- // Make sure that you have the latest registration summary.
- vector<pair<string, int> > performance_counters;
- ClientConfigP* config_to_send = NULL;
- if (must_send_performance_counters) {
- statistics_->GetNonZeroStatistics(&performance_counters);
- config_to_send = &config_;
- }
- protocol_handler_.SendInfoMessage(performance_counters, config_to_send,
- request_server_summary, batching_task_.get());
-}
-
-string InvalidationClientCore::GenerateNonce(Random* random) {
- // Return a nonce computed by converting a random 64-bit number to a string.
- return SimpleItoa(static_cast<int64>(random->RandUint64()));
-}
-
-void InvalidationClientCore::set_nonce(const string& new_nonce) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- CHECK(new_nonce.empty() || client_token_.empty()) <<
- "Tried to set nonce with existing token " << client_token_;
- nonce_ = new_nonce;
-}
-
-void InvalidationClientCore::set_client_token(const string& new_client_token) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- CHECK(new_client_token.empty() || nonce_.empty()) <<
- "Tried to set token with existing nonce " << nonce_;
-
- // If the ticl has not been started and we are getting a new token (either
- // from persistence or from the server, start the ticl and inform the
- // application.
- bool finish_starting_ticl = !ticl_state_.IsStarted() &&
- client_token_.empty() && !new_client_token.empty();
- client_token_ = new_client_token;
-
- if (finish_starting_ticl) {
- FinishStartingTiclAndInformListener();
- }
-}
-
-void InvalidationClientCore::FinishStartingTiclAndInformListener() {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- CHECK(!ticl_state_.IsStarted());
-
- ticl_state_.Start();
- GetListener()->Ready(this);
-
- // We are not currently persisting our registration digest, so regardless of
- // whether or not we are restarting from persistent state, we need to query
- // the application for all of its registrations.
- GetListener()->ReissueRegistrations(this,
- RegistrationManager::kEmptyPrefix, 0);
- TLOG(logger_, INFO, "Ticl started: %s", ToString().c_str());
-}
-
-void InvalidationClientCore::ScheduleStartAfterReadingStateBlob() {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- storage_->ReadKey(kClientTokenKey,
- NewPermanentCallback(this, &InvalidationClientCore::ReadCallback));
-}
-
-void InvalidationClientCore::ReadCallback(
- pair<Status, string> read_result) {
- string serialized_state;
- if (read_result.first.IsSuccess()) {
- serialized_state = read_result.second;
- } else {
- statistics_->RecordError(
- Statistics::ClientErrorType_PERSISTENT_READ_FAILURE);
- TLOG(logger_, WARNING, "Could not read state blob: %s",
- read_result.first.message().c_str());
- }
- // Call start now.
- internal_scheduler_->Schedule(
- Scheduler::NoDelay(),
- NewPermanentCallback(
- this, &InvalidationClientCore::StartInternal, serialized_state));
-}
-
-ExponentialBackoffDelayGenerator*
-InvalidationClientCore::CreateExpBackOffGenerator(
- const TimeDelta& initial_delay) {
- return new ExponentialBackoffDelayGenerator(random_.get(), initial_delay,
- config_.max_exponential_backoff_factor());
-}
-
-InvalidationListener::RegistrationState
-InvalidationClientCore::ConvertOpTypeToRegState(RegistrationP::OpType
- reg_op_type) {
- InvalidationListener::RegistrationState reg_state =
- reg_op_type == RegistrationP_OpType_REGISTER ?
- InvalidationListener::REGISTERED :
- InvalidationListener::UNREGISTERED;
- return reg_state;
-}
-
-void InvalidationClientCore::MessageReceiver(string message) {
- internal_scheduler_->Schedule(Scheduler::NoDelay(), NewPermanentCallback(
- this,
- &InvalidationClientCore::HandleIncomingMessage, message));
-}
-
-void InvalidationClientCore::NetworkStatusReceiver(bool status) {
- internal_scheduler_->Schedule(Scheduler::NoDelay(), NewPermanentCallback(
- this, &InvalidationClientCore::HandleNetworkStatusChange, status));
-}
-
-
-void InvalidationClientCore::ChangeNetworkTimeoutDelayForTest(
- const TimeDelta& delay) {
- config_.set_network_timeout_delay_ms(delay.InMilliseconds());
- CreateSchedulingTasks();
-}
-
-void InvalidationClientCore::ChangeHeartbeatDelayForTest(
- const TimeDelta& delay) {
- config_.set_heartbeat_interval_ms(delay.InMilliseconds());
- CreateSchedulingTasks();
-}
-
-} // namespace invalidation
diff --git a/google/cacheinvalidation/impl/invalidation-client-core.h b/google/cacheinvalidation/impl/invalidation-client-core.h
deleted file mode 100644
index d6f66d7..0000000
--- a/google/cacheinvalidation/impl/invalidation-client-core.h
+++ /dev/null
@@ -1,490 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Implementation of the Invalidation Client Library (Ticl).
-
-#ifndef GOOGLE_CACHEINVALIDATION_IMPL_INVALIDATION_CLIENT_CORE_H_
-#define GOOGLE_CACHEINVALIDATION_IMPL_INVALIDATION_CLIENT_CORE_H_
-
-#include <string>
-#include <utility>
-
-#include "google/cacheinvalidation/include/invalidation-client.h"
-#include "google/cacheinvalidation/include/invalidation-listener.h"
-#include "google/cacheinvalidation/deps/digest-function.h"
-#include "google/cacheinvalidation/impl/client-protocol-namespace-fix.h"
-#include "google/cacheinvalidation/impl/digest-store.h"
-#include "google/cacheinvalidation/impl/exponential-backoff-delay-generator.h"
-#include "google/cacheinvalidation/impl/protocol-handler.h"
-#include "google/cacheinvalidation/impl/registration-manager.h"
-#include "google/cacheinvalidation/impl/run-state.h"
-#include "google/cacheinvalidation/impl/safe-storage.h"
-#include "google/cacheinvalidation/impl/smearer.h"
-
-namespace invalidation {
-
-class InvalidationClientCore;
-
-/* A task for acquiring tokens from the server. */
-class AcquireTokenTask : public RecurringTask {
- public:
- explicit AcquireTokenTask(InvalidationClientCore* client);
- virtual ~AcquireTokenTask() {}
-
- // The actual implementation as required by the RecurringTask.
- virtual bool RunTask();
-
- private:
- /* The client that owns this task. */
- InvalidationClientCore* client_;
-};
-
-/* A task that schedules heartbeats when the registration summary at the client
- * is not in sync with the registration summary from the server.
- */
-class RegSyncHeartbeatTask : public RecurringTask {
- public:
- explicit RegSyncHeartbeatTask(InvalidationClientCore* client);
- virtual ~RegSyncHeartbeatTask() {}
-
- // The actual implementation as required by the RecurringTask.
- virtual bool RunTask();
-
- private:
- /* The client that owns this task. */
- InvalidationClientCore* client_;
-};
-
-/* A task that writes the token to persistent storage. */
-class PersistentWriteTask : public RecurringTask {
- public:
- explicit PersistentWriteTask(InvalidationClientCore* client);
- virtual ~PersistentWriteTask() {}
-
- // The actual implementation as required by the RecurringTask.
- virtual bool RunTask();
-
- private:
- /* Handles the result of a request to write to persistent storage.
- * |state| is the serialized state that was written.
- */
- void WriteCallback(const string& state, Status status);
-
- InvalidationClientCore* client_;
-
- /* The last client token that was written to to persistent state
- * successfully.
- */
- string last_written_token_;
-};
-
-/* A task for sending heartbeats to the server. */
-class HeartbeatTask : public RecurringTask {
- public:
- explicit HeartbeatTask(InvalidationClientCore* client);
- virtual ~HeartbeatTask() {}
-
- // The actual implementation as required by the RecurringTask.
- virtual bool RunTask();
- private:
- /* The client that owns this task. */
- InvalidationClientCore* client_;
-
- /* Next time that the performance counters are sent to the server. */
- Time next_performance_send_time_;
-};
-
-/* The task that is scheduled to send batched messages to the server (when
- * needed).
- */
-class BatchingTask : public RecurringTask {
- public:
- BatchingTask(ProtocolHandler *handler, Smearer* smearer,
- TimeDelta batching_delay);
-
- virtual ~BatchingTask() {}
-
- // The actual implementation as required by the RecurringTask.
- virtual bool RunTask();
-
- private:
- ProtocolHandler* protocol_handler_;
-};
-
-class InvalidationClientCore : public InvalidationClient,
- public ProtocolListener {
- public:
- /* Modifies |config| to contain default parameters. */
- static void InitConfig(ClientConfigP *config);
-
- /* Modifies |config| to contain parameters set for unit tests. */
- static void InitConfigForTest(ClientConfigP *config);
-
- /* Creates the tasks used by the Ticl for token acquisition, heartbeats,
- * persistent writes and registration sync.
- */
- void CreateSchedulingTasks();
-
- /* Stores the client id that is used for squelching invalidations on the
- * server side.
- */
- void GetApplicationClientIdForTest(string* result) {
- application_client_id_.SerializeToString(result);
- }
-
- void GetClientTokenForTest(string* result) {
- *result = client_token_;
- }
-
- // Getters for testing. No transfer of ownership occurs in any of these
- // methods.
-
- /* Returns the system resources. */
- SystemResources* GetResourcesForTest() {
- return resources_;
- }
-
- /* Returns the performance counters/statistics. */
- Statistics* GetStatisticsForTest() {
- return statistics_.get();
- }
-
- /* Returns the digest function used for computing digests for object
- * registrations.
- */
- DigestFunction* GetDigestFunctionForTest() {
- return digest_fn_.get();
- }
-
- /* Changes the existing delay for the network timeout delay in the operation
- * scheduler to be delay_ms.
- */
- void ChangeNetworkTimeoutDelayForTest(const TimeDelta& delay);
-
- /* Changes the existing delay for the heartbeat delay in the operation
- * scheduler to be delay_ms.
- */
- void ChangeHeartbeatDelayForTest(const TimeDelta& delay);
-
- /* Returns the next time a message is allowed to be sent to the server (could
- * be in the past).
- */
- int64 GetNextMessageSendTimeMsForTest() {
- return protocol_handler_.GetNextMessageSendTimeMsForTest();
- }
-
- /* Returns true iff the client is currently started. */
- bool IsStartedForTest() {
- return ticl_state_.IsStarted();
- }
-
- /* Sets the digest store to be digest_store for testing purposes.
- *
- * REQUIRES: This method is called before the Ticl has been started.
- */
- void SetDigestStoreForTest(DigestStore<ObjectIdP>* digest_store) {
- CHECK(!resources_->IsStarted());
- registration_manager_.SetDigestStoreForTest(digest_store);
- }
-
- virtual void Start();
-
- virtual void Stop();
-
- virtual void Register(const ObjectId& object_id);
-
- virtual void Unregister(const ObjectId& object_id);
-
- virtual void Register(const vector<ObjectId>& object_ids) {
- PerformRegisterOperations(object_ids, RegistrationP_OpType_REGISTER);
- }
-
- virtual void Unregister(const vector<ObjectId>& object_ids) {
- PerformRegisterOperations(object_ids, RegistrationP_OpType_UNREGISTER);
- }
-
- /* Implementation of (un)registration.
- *
- * Arguments:
- * object_ids - object ids on which to operate
- * reg_op_type - whether to register or unregister
- */
- virtual void PerformRegisterOperations(
- const vector<ObjectId>& object_ids, RegistrationP::OpType reg_op_type);
-
- void PerformRegisterOperationsInternal(
- const vector<ObjectId>& object_ids, RegistrationP::OpType reg_op_type);
-
- virtual void Acknowledge(const AckHandle& acknowledge_handle);
-
- string ToString();
-
- /* Returns a randomly generated nonce. */
- static string GenerateNonce(Random* random);
-
- //
- // Protocol listener methods
- //
-
- /* Returns the current client token. */
- virtual string GetClientToken();
-
- virtual void GetRegistrationSummary(RegistrationSummary* summary) {
- registration_manager_.GetClientSummary(summary);
- }
-
- virtual void HandleMessageSent();
-
- /* Gets registration manager state as a serialized RegistrationManagerState.
- */
- void GetRegistrationManagerStateAsSerializedProto(string* result);
-
- /* Gets statistics as a serialized InfoMessage. */
- void GetStatisticsAsSerializedProto(string* result);
-
- /* The single key used to write all the Ticl state. */
- static const char* kClientTokenKey;
- protected:
- /* Constructs a client.
- *
- * Arguments:
- * resources - resources to use during execution
- * random - a random number generator (owned by this after the call)
- * client_type - client type code
- * client_name - application identifier for the client
- * config - configuration for the client
- */
- InvalidationClientCore(
- SystemResources* resources, Random* random, int client_type,
- const string& client_name, const ClientConfigP &config,
- const string& application_name);
-
- /* Returns the internal scheduler. */
- Scheduler* GetInternalScheduler() {
- return internal_scheduler_;
- }
-
- /* Returns the statistics. */
- Statistics* GetStatistics() {
- return statistics_.get();
- }
-
- /* Returns the listener. */
- virtual InvalidationListener* GetListener() = 0;
- private:
- // Friend classes so that they can access the scheduler, logger, smearer, etc.
- friend class AcquireTokenTask;
- friend class HeartbeatTask;
- friend class InvalidationClientFactoryTest;
- friend class PersistentWriteTask;
- friend class RegSyncHeartbeatTask;
-
- //
- // Private methods.
- //
-
- virtual void HandleNetworkStatusChange(bool is_online);
-
- /* Implementation of start on the internal thread with the persistent
- * serialized_state if any. Starts the TICL protocol and makes the TICL ready
- * to received registration, invalidations, etc
- */
- void StartInternal(const string& serialized_state);
-
- void AcknowledgeInternal(const AckHandle& acknowledge_handle);
-
- /* Set client_token to NULL and schedule acquisition of the token. */
- void ScheduleAcquireToken(const string& debug_string);
-
- /* Sends an info message to the server. If mustSendPerformanceCounters is
- * true, the performance counters are sent regardless of when they were sent
- * earlier.
- */
- void SendInfoMessageToServer(
- bool mustSendPerformanceCounters, bool request_server_summary);
-
- /* Sets the nonce to new_nonce.
- *
- * REQUIRES: new_nonce be empty or client_token_ be empty. The goal is to
- * ensure that a nonce is never set unless there is no client token, unless
- * the nonce is being cleared.
- */
- void set_nonce(const string& new_nonce);
-
- /* Sets the client_token_ to new_client_token.
- *
- * REQUIRES: new_client_token be empty or nonce_ be empty. The goal is to
- * ensure that a token is never set unless there is no nonce, unless the token
- * is being cleared.
- */
- void set_client_token(const string& new_client_token);
-
- /* Reads the Ticl state from persistent storage (if any) and calls
- * startInternal.
- */
- void ScheduleStartAfterReadingStateBlob();
-
- /* Handles the result of a request to read from persistent storage. */
- void ReadCallback(pair<Status, string> read_result);
-
- /* Finish starting the ticl and inform the listener that it is ready. */
- void FinishStartingTiclAndInformListener();
-
- /* Returns an exponential backoff generator with a max exponential factor
- * given by |config_.max_exponential_backoff_factor| and initial delay
- * |initial_delay|.
- * Space for the returned object is owned by the caller.
- */
- ExponentialBackoffDelayGenerator* CreateExpBackOffGenerator(
- const TimeDelta& initial_delay);
-
- /* Registers a message receiver and status change listener on |resources|. */
- void RegisterWithNetwork(SystemResources* resources);
-
- /* Handles inbound messages from the network. */
- void MessageReceiver(string message);
-
- /* Responds to changes in network connectivity. */
- void NetworkStatusReceiver(bool status);
-
- /* Handles a |message| from the server. */
- void HandleIncomingMessage(const string& message);
-
- /*
- * Handles a changed token. |header_token| is the token in the server message
- * header. |new_token| is a new token from the server; if empty, it indicates
- * a destroy-token message.
- */
- void HandleTokenChanged(const string& header_token, const string& new_token);
-
- /* Processes a server message |header|. */
- void HandleIncomingHeader(const ServerMessageHeader& header);
-
- /* Handles |invalidations| from the server. */
- void HandleInvalidations(
- const RepeatedPtrField<InvalidationP>& invalidations);
-
- /* Handles registration statusES from the server. */
- void HandleRegistrationStatus(
- const RepeatedPtrField<RegistrationStatus>& reg_status_list);
-
- /* Handles A registration sync request from the server. */
- void HandleRegistrationSyncRequest();
-
- /* Handles an info message request from the server. */
- void HandleInfoMessage(
- const RepeatedField<InfoRequestMessage_InfoType>& info_types);
-
- /* Handles an error message with |code| and |description| from the server. */
- void HandleErrorMessage(ErrorMessage::Code code, const string& description);
-
- /* Returns whether |server_token| matches the client token or nonce. */
- bool ValidateToken(const string& server_token);
-
- /* Converts an operation type reg_status to a
- * InvalidationListener::RegistrationState.
- */
- static InvalidationListener::RegistrationState ConvertOpTypeToRegState(
- RegistrationP::OpType reg_op_type);
-
- /* Resources for the Ticl. */
- SystemResources* resources_; // Owned by application.
-
- /* Reference into the resources object for cleaner code. All Ticl code must be
- * scheduled on this scheduler.
- */
- Scheduler* internal_scheduler_;
-
- /* Logger reference into the resources object for cleaner code. */
- Logger* logger_;
-
- /* A storage layer which schedules the callbacks on the internal scheduler
- * thread.
- */
- scoped_ptr<SafeStorage> storage_;
-
- /* Statistics objects to track number of sent messages, etc. */
- scoped_ptr<Statistics> statistics_;
-
- /* Configuration for this instance. */
- ClientConfigP config_;
-
- /* Application identifier for this client. */
- ApplicationClientIdP application_client_id_;
-
- /* The function for computing the registration and persistence state digests.
- */
- scoped_ptr<DigestFunction> digest_fn_;
-
- /* Object maintaining the registration state for this client. */
- RegistrationManager registration_manager_;
-
- /* Used to validate messages */
- scoped_ptr<TiclMessageValidator> msg_validator_;
-
- /* A smearer to make sure that delays are randomized a little bit. */
- Smearer smearer_;
-
- /* Object handling low-level wire format interactions. */
- ProtocolHandler protocol_handler_;
-
- /* The state of the Ticl whether it has started or not. */
- RunState ticl_state_;
-
- /* Current client token known from the server. */
- string client_token_;
-
- // After the client starts, exactly one of nonce and clientToken is non-null.
-
- /* If not empty, nonce for pending identifier request. */
- string nonce_;
-
- /* Whether we should send registrations to the server or not. */
- // TODO(ghc): [cleanup] Make the server summary in the registration manager
- // nullable and replace this variable with a test for whether it's null or
- // not.
- bool should_send_registrations_;
-
- /* Whether the network is online. Assume so when we start. */
- bool is_online_;
-
- /* Last time a message was sent to the server. */
- Time last_message_send_time_;
-
- /* A task for acquiring the token (if the client has no token). */
- scoped_ptr<AcquireTokenTask> acquire_token_task_;
-
- /* Task for checking if reg summary is out of sync and then sending a
- * heartbeat to the server.
- */
- scoped_ptr<RegSyncHeartbeatTask> reg_sync_heartbeat_task_;
-
- /* Task for writing the state blob to persistent storage. */
- scoped_ptr<PersistentWriteTask> persistent_write_task_;
-
- /* A task for periodic heartbeats. */
- scoped_ptr<HeartbeatTask> heartbeat_task_;
-
- /* Task to send all batched messages to the server. */
- scoped_ptr<BatchingTask> batching_task_;
-
- /* Random number generator for smearing, exp backoff, etc. */
- scoped_ptr<Random> random_;
-
- DISALLOW_COPY_AND_ASSIGN(InvalidationClientCore);
-};
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_IMPL_INVALIDATION_CLIENT_CORE_H_
diff --git a/google/cacheinvalidation/impl/invalidation-client-factory.cc b/google/cacheinvalidation/impl/invalidation-client-factory.cc
deleted file mode 100644
index 996a459..0000000
--- a/google/cacheinvalidation/impl/invalidation-client-factory.cc
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "google/cacheinvalidation/include/invalidation-client-factory.h"
-
-#include "google/cacheinvalidation/impl/invalidation-client-impl.h"
-
-namespace invalidation {
-
-InvalidationClient* ClientFactory::Create(
- SystemResources* resources,
- const InvalidationClientConfig& config,
- InvalidationListener* listener) {
- ClientConfigP client_config;
- InvalidationClientCore::InitConfig(&client_config);
- client_config.set_allow_suppression(config.allow_suppression());
- Random* random = new Random(InvalidationClientUtil::GetCurrentTimeMs(
- resources->internal_scheduler()));
- return new InvalidationClientImpl(
- resources, random, config.client_type(), config.client_name(),
- client_config, config.application_name(), listener);
-}
-
-// Deprecated, please the factory function that takes an
-// InvalidationClientConfig instead.
-InvalidationClient* CreateInvalidationClient(
- SystemResources* resources,
- int32 client_type,
- const string& client_name,
- const string& application_name,
- InvalidationListener* listener) {
- InvalidationClientConfig config(
- client_type, client_name, application_name, true /* allowSuppression*/);
- return ClientFactory::Create(resources, config, listener);
-}
-
-InvalidationClient* ClientFactory::CreateForTest(
- SystemResources* resources,
- const InvalidationClientConfig& config,
- InvalidationListener* listener) {
- // Make a config with test params and construct an instance to return.
- ClientConfigP client_config;
- InvalidationClientCore::InitConfigForTest(&client_config);
- client_config.set_allow_suppression(config.allow_suppression());
- Random* random = new Random(InvalidationClientUtil::GetCurrentTimeMs(
- resources->internal_scheduler()));
- return new InvalidationClientImpl(
- resources, random, config.client_type(), config.client_name(),
- client_config, config.application_name(), listener);
-}
-
-InvalidationClient* CreateInvalidationClientForTest(
- SystemResources* resources,
- int32 client_type,
- const string& client_name,
- const string& application_name,
- InvalidationListener* listener) {
- return ClientFactory::CreateForTest(
- resources,
- InvalidationClientConfig(client_type, client_name, application_name,
- true /* allowSuppression */),
- listener);
-}
-
-} // namespace invalidation
diff --git a/google/cacheinvalidation/impl/invalidation-client-factory_test.cc b/google/cacheinvalidation/impl/invalidation-client-factory_test.cc
deleted file mode 100644
index ea51664..0000000
--- a/google/cacheinvalidation/impl/invalidation-client-factory_test.cc
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright 2013 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Unit tests for the InvalidationClientFactory class.
-
-#include "google/cacheinvalidation/include/invalidation-client-factory.h"
-#include "google/cacheinvalidation/include/invalidation-listener.h"
-#include "google/cacheinvalidation/include/types.h"
-#include "google/cacheinvalidation/types.pb.h"
-#include "google/cacheinvalidation/deps/googletest.h"
-#include "google/cacheinvalidation/impl/basic-system-resources.h"
-#include "google/cacheinvalidation/impl/constants.h"
-#include "google/cacheinvalidation/impl/invalidation-client-impl.h"
-
-#include "google/cacheinvalidation/test/test-utils.h"
-
-namespace invalidation {
-
-using ::ipc::invalidation::ClientType_Type_TEST;
-using ::ipc::invalidation::ObjectSource_Type_TEST;
-using ::testing::StrictMock;
-
-// Test constants
-static const char CLIENT_NAME[] = "demo-client-01";
-static const char APPLICATION_NAME[] = "demo-app";
-
-// Tests the basic functionality of the invalidation client factory.
-class InvalidationClientFactoryTest : public UnitTestBase {
- public:
- virtual ~InvalidationClientFactoryTest() {}
-
- // Performs setup for client factory unit tests, e.g. creating resource
- // components and setting up common expectations for certain mock objects.
- virtual void SetUp() {
- UnitTestBase::SetUp();
- InitCommonExpectations(); // Set up expectations for common mock operations
-
- // Set up the listener scheduler to run any runnable that it receives.
- EXPECT_CALL(*listener_scheduler, Schedule(_, _))
- .WillRepeatedly(InvokeAndDeleteClosure<1>());
- }
-
- // Creates a client with the given value for allowSuppression.
- // The caller owns the storage.
- InvalidationClientImpl* CreateClient(bool allowSuppression) {
- InvalidationClientConfig config(ClientType_Type_TEST,
- CLIENT_NAME, APPLICATION_NAME, allowSuppression);
- return static_cast<InvalidationClientImpl*>(
- ClientFactory::Create(resources.get(), config, &listener));
- }
-
- // Verifies that a client has expected values for allowing suppression
- // and application client id.
- void CheckClientValid(const InvalidationClientImpl* client,
- bool allowSuppression) {
- // Check that the the allow suppression flag was correctly set to
- // the expected value.
- ClientConfigP config = client->config_;
- ASSERT_EQ(allowSuppression, config.allow_suppression());
-
- // Check that the client type and client name were properly populated.
- ASSERT_EQ(ClientType_Type_TEST,
- client->application_client_id_.client_type());
-
- ASSERT_EQ(CLIENT_NAME,
- client->application_client_id_.client_name());
- }
-
- // The client being tested. Created fresh for each test function.
- scoped_ptr<InvalidationClientImpl> client;
-
- // A mock invalidation listener.
- StrictMock<MockInvalidationListener> listener;
-};
-
-// Tests that the deprecated CreateInvalidationClient overload
-// correctly initializes the client to allow suppression.
-TEST_F(InvalidationClientFactoryTest, TestCreateClient) {
- client.reset(static_cast<InvalidationClientImpl*>(
- CreateInvalidationClient(
- resources.get(),
- ClientType_Type_TEST,
- CLIENT_NAME,
- APPLICATION_NAME,
- &listener)));
- CheckClientValid(client.get(), true /* allowSuppression */);
-}
-
-// Tests CreateClient with allowSuppression = false.
-TEST_F(InvalidationClientFactoryTest, TestCreateClientForTrickles) {
- bool allowSuppression = false;
- client.reset(CreateClient(allowSuppression));
- CheckClientValid(client.get(), allowSuppression);
-}
-
-// Tests CreateClient with allowSuppression = true.
-TEST_F(InvalidationClientFactoryTest, testCreateClientForInvalidation) {
- bool allowSuppression = true;
- client.reset(CreateClient(allowSuppression));
- CheckClientValid(client.get(), allowSuppression);
-}
-
-} // namespace invalidation
diff --git a/google/cacheinvalidation/impl/invalidation-client-impl.cc b/google/cacheinvalidation/impl/invalidation-client-impl.cc
deleted file mode 100644
index 947ffe4..0000000
--- a/google/cacheinvalidation/impl/invalidation-client-impl.cc
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Implementation of the Invalidation Client Library (Ticl).
-
-#include "google/cacheinvalidation/impl/invalidation-client-impl.h"
-
-namespace invalidation {
-
-InvalidationClientImpl::InvalidationClientImpl(
- SystemResources* resources, Random* random, int client_type,
- const string& client_name, const ClientConfigP& config,
- const string& application_name, InvalidationListener* listener)
- : InvalidationClientCore(resources, random, client_type, client_name,
- config, application_name),
- listener_(new CheckingInvalidationListener(
- listener, GetStatistics(), resources->internal_scheduler(),
- resources->listener_scheduler(), resources->logger())) {
-}
-
-void InvalidationClientImpl::Start() {
- GetInternalScheduler()->Schedule(
- Scheduler::NoDelay(),
- NewPermanentCallback(this, &InvalidationClientImpl::DoStart));
-}
-
-void InvalidationClientImpl::Stop() {
- GetInternalScheduler()->Schedule(
- Scheduler::NoDelay(),
- NewPermanentCallback(this, &InvalidationClientImpl::DoStop));
-}
-
-void InvalidationClientImpl::Register(const ObjectId& object_id) {
- GetInternalScheduler()->Schedule(
- Scheduler::NoDelay(),
- NewPermanentCallback(this, &InvalidationClientImpl::DoRegister,
- object_id));
-}
-
-void InvalidationClientImpl::Register(const vector<ObjectId>& object_ids) {
- GetInternalScheduler()->Schedule(
- Scheduler::NoDelay(),
- NewPermanentCallback(this, &InvalidationClientImpl::DoBulkRegister,
- object_ids));
-}
-
-void InvalidationClientImpl::Unregister(const ObjectId& object_id) {
- GetInternalScheduler()->Schedule(
- Scheduler::NoDelay(),
- NewPermanentCallback(this, &InvalidationClientImpl::DoUnregister,
- object_id));
-}
-
-void InvalidationClientImpl::Unregister(const vector<ObjectId>& object_ids) {
- GetInternalScheduler()->Schedule(
- Scheduler::NoDelay(),
- NewPermanentCallback(this, &InvalidationClientImpl::DoBulkUnregister,
- object_ids));
-}
-
-void InvalidationClientImpl::Acknowledge(const AckHandle& acknowledge_handle) {
- GetInternalScheduler()->Schedule(
- Scheduler::NoDelay(),
- NewPermanentCallback(this, &InvalidationClientImpl::DoAcknowledge,
- acknowledge_handle));
-}
-
-} // namespace invalidation
diff --git a/google/cacheinvalidation/impl/invalidation-client-impl.h b/google/cacheinvalidation/impl/invalidation-client-impl.h
deleted file mode 100644
index 2321dcc..0000000
--- a/google/cacheinvalidation/impl/invalidation-client-impl.h
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Implementation of the Invalidation Client Library (Ticl).
-
-#ifndef GOOGLE_CACHEINVALIDATION_IMPL_INVALIDATION_CLIENT_IMPL_H_
-#define GOOGLE_CACHEINVALIDATION_IMPL_INVALIDATION_CLIENT_IMPL_H_
-
-#include <string>
-#include <utility>
-
-#include "google/cacheinvalidation/include/invalidation-client.h"
-#include "google/cacheinvalidation/include/invalidation-listener.h"
-#include "google/cacheinvalidation/impl/checking-invalidation-listener.h"
-#include "google/cacheinvalidation/impl/invalidation-client-core.h"
-#include "google/cacheinvalidation/impl/protocol-handler.h"
-
-namespace invalidation {
-
-class InvalidationClientImpl : public InvalidationClientCore {
- public:
- /* Constructs a client.
- *
- * Arguments:
- * resources - resources to use during execution
- * random - a random number generator (owned by this after the call)
- * client_type - client type code
- * client_name - application identifier for the client
- * config - configuration for the client
- * listener - application callback
- */
- InvalidationClientImpl(
- SystemResources* resources, Random* random, int client_type,
- const string& client_name, const ClientConfigP &config,
- const string& application_name, InvalidationListener* listener);
-
- // These methods override those in InvalidationClientCore. Their
- // implementations all enqueue an event onto the work queue and
- // then delegate to the InvalidationClientCore method through one
- // of the private DoYYY functions (below).
-
- virtual void Start();
-
- virtual void Stop();
-
- virtual void Register(const ObjectId& object_id);
-
- virtual void Unregister(const ObjectId& object_id);
-
- virtual void Register(const vector<ObjectId>& object_ids);
-
- virtual void Unregister(const vector<ObjectId>& object_ids);
-
- virtual void Acknowledge(const AckHandle& acknowledge_handle);
-
- /* Returns the listener that was registered by the caller. */
- InvalidationListener* GetInvalidationListenerForTest() {
- return listener_.get()->delegate();
- }
-
- protected:
- virtual InvalidationListener* GetListener() {
- return listener_.get();
- }
-
- private:
- /*
- * All of these methods simply delegate to the superclass implementation. They
- * exist so that NewPermanentCallback objects created in
- * invalidation-client-impl.cc can call superclass methods.
- */
- void DoStart() {
- this->InvalidationClientCore::Start();
- }
-
- void DoStop() {
- this->InvalidationClientCore::Stop();
- }
-
- void DoRegister(const ObjectId& object_id) {
- this->InvalidationClientCore::Register(object_id);
- }
-
- void DoUnregister(const ObjectId& object_id) {
- this->InvalidationClientCore::Unregister(object_id);
- }
-
- void DoBulkRegister(const vector<ObjectId>& object_ids) {
- this->InvalidationClientCore::Register(object_ids);
- }
-
- void DoBulkUnregister(const vector<ObjectId>& object_ids) {
- this->InvalidationClientCore::Unregister(object_ids);
- }
-
- void DoAcknowledge(const AckHandle& acknowledge_handle) {
- this->InvalidationClientCore::Acknowledge(acknowledge_handle);
- }
-
- /*
- * The listener registered by the application, wrapped in a
- * CheckingInvalidationListener.
- */
- scoped_ptr<CheckingInvalidationListener> listener_;
-
- DISALLOW_COPY_AND_ASSIGN(InvalidationClientImpl);
-};
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_IMPL_INVALIDATION_CLIENT_IMPL_H_
diff --git a/google/cacheinvalidation/impl/invalidation-client-impl_test.cc b/google/cacheinvalidation/impl/invalidation-client-impl_test.cc
deleted file mode 100644
index ab72ef2..0000000
--- a/google/cacheinvalidation/impl/invalidation-client-impl_test.cc
+++ /dev/null
@@ -1,504 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Unit tests for the InvalidationClientImpl class.
-
-#include <vector>
-
-#include "google/cacheinvalidation/client_test_internal.pb.h"
-#include "google/cacheinvalidation/types.pb.h"
-#include "google/cacheinvalidation/include/invalidation-listener.h"
-#include "google/cacheinvalidation/include/types.h"
-#include "google/cacheinvalidation/deps/gmock.h"
-#include "google/cacheinvalidation/deps/googletest.h"
-#include "google/cacheinvalidation/deps/random.h"
-#include "google/cacheinvalidation/deps/string_util.h"
-#include "google/cacheinvalidation/impl/basic-system-resources.h"
-#include "google/cacheinvalidation/impl/constants.h"
-#include "google/cacheinvalidation/impl/invalidation-client-impl.h"
-#include "google/cacheinvalidation/impl/statistics.h"
-#include "google/cacheinvalidation/impl/throttle.h"
-#include "google/cacheinvalidation/impl/ticl-message-validator.h"
-#include "google/cacheinvalidation/test/deterministic-scheduler.h"
-#include "google/cacheinvalidation/test/test-logger.h"
-#include "google/cacheinvalidation/test/test-utils.h"
-
-namespace invalidation {
-
-using ::ipc::invalidation::ClientType_Type_TEST;
-using ::ipc::invalidation::RegistrationManagerStateP;
-using ::ipc::invalidation::ObjectSource_Type_TEST;
-using ::ipc::invalidation::StatusP_Code_PERMANENT_FAILURE;
-using ::testing::_;
-using ::testing::AllOf;
-using ::testing::DeleteArg;
-using ::testing::DoAll;
-using ::testing::ElementsAre;
-using ::testing::EqualsProto;
-using ::testing::Eq;
-using ::testing::Invoke;
-using ::testing::InvokeArgument;
-using ::testing::Matcher;
-using ::testing::Property;
-using ::testing::Return;
-using ::testing::ReturnPointee;
-using ::testing::SaveArg;
-using ::testing::SetArgPointee;
-using ::testing::StrictMock;
-using ::testing::proto::WhenDeserializedAs;
-
-// Creates an action SaveArgToVector<k>(vector*) that saves the kth argument in
-// |vec|.
-ACTION_TEMPLATE(
- SaveArgToVector,
- HAS_1_TEMPLATE_PARAMS(int, k),
- AND_1_VALUE_PARAMS(vec)) {
- vec->push_back(std::tr1::get<k>(args));
-}
-
-// Given the ReadCallback of Storage::ReadKey as argument 1, invokes it with a
-// permanent failure status code.
-ACTION(InvokeReadCallbackFailure) {
- arg1->Run(pair<Status, string>(Status(Status::PERMANENT_FAILURE, ""), ""));
- delete arg1;
-}
-
-// Given the WriteCallback of Storage::WriteKey as argument 2, invokes it with
-// a success status code.
-ACTION(InvokeWriteCallbackSuccess) {
- arg2->Run(Status(Status::SUCCESS, ""));
- delete arg2;
-}
-
-// Tests the basic functionality of the invalidation client.
-class InvalidationClientImplTest : public UnitTestBase {
- public:
- virtual ~InvalidationClientImplTest() {}
-
- // Performs setup for protocol handler unit tests, e.g. creating resource
- // components and setting up common expectations for certain mock objects.
- virtual void SetUp() {
- UnitTestBase::SetUp();
- InitCommonExpectations(); // Set up expectations for common mock operations
-
-
- // Clear throttle limits so that it does not interfere with any test.
- InvalidationClientImpl::InitConfig(&config);
- config.set_smear_percent(kDefaultSmearPercent);
- config.mutable_protocol_handler_config()->clear_rate_limit();
-
- // Set up the listener scheduler to run any runnable that it receives.
- EXPECT_CALL(*listener_scheduler, Schedule(_, _))
- .WillRepeatedly(InvokeAndDeleteClosure<1>());
-
- // Create the actual client.
- Random* random = new Random(InvalidationClientUtil::GetCurrentTimeMs(
- resources->internal_scheduler()));
- client.reset(new InvalidationClientImpl(
- resources.get(), random, ClientType_Type_TEST, "clientName", config,
- "InvClientTest", &listener));
- }
-
- // Starts the Ticl and ensures that the initialize message is sent. In
- // response, gives a tokencontrol message to the protocol handler and makes
- // sure that ready is called. client_messages is the list of messages expected
- // from the client. The 0th message corresponds to the initialization message
- // sent out by the client.
- void StartClient() {
- // Start the client.
- client.get()->Start();
-
- // Let the message be sent out.
- internal_scheduler->PassTime(
- GetMaxBatchingDelay(config.protocol_handler_config()));
-
- // Check that the message contains an initializeMessage.
- ClientToServerMessage client_message;
- client_message.ParseFromString(outgoing_messages[0]);
- ASSERT_TRUE(client_message.has_initialize_message());
- string nonce = client_message.initialize_message().nonce();
-
- // Create the token control message and hand it to the protocol handler.
- ServerToClientMessage sc_message;
- InitServerHeader(nonce, sc_message.mutable_header());
- string new_token = "new token";
- sc_message.mutable_token_control_message()->set_new_token(new_token);
- ProcessIncomingMessage(sc_message, MessageHandlingDelay());
- }
-
- // Sets the expectations so that the Ticl is ready to be started such that
- // |num_outgoing_messages| are expected to be sent by the ticl. These messages
- // will be saved in |outgoing_messages|.
- void SetExpectationsForTiclStart(int num_outgoing_msgs) {
- // Set up expectations for number of messages expected on the network.
- EXPECT_CALL(*network, SendMessage(_))
- .Times(num_outgoing_msgs)
- .WillRepeatedly(SaveArgToVector<0>(&outgoing_messages));
-
- // Expect the storage to perform a read key that we will fail.
- EXPECT_CALL(*storage, ReadKey(_, _))
- .WillOnce(InvokeReadCallbackFailure());
-
- // Expect the listener to indicate that it is ready and let it reissue
- // registrations.
- EXPECT_CALL(listener, Ready(Eq(client.get())));
- EXPECT_CALL(listener, ReissueRegistrations(Eq(client.get()), _, _));
-
- // Expect the storage layer to receive the write of the session token.
- EXPECT_CALL(*storage, WriteKey(_, _, _))
- .WillOnce(InvokeWriteCallbackSuccess());
- }
-
- //
- // Test state maintained for every test.
- //
-
- // Messages sent by the Ticl.
- vector<string> outgoing_messages;
-
- // Configuration for the protocol handler (uses defaults).
- ClientConfigP config;
-
- // The client being tested. Created fresh for each test function.
- scoped_ptr<InvalidationClientImpl> client;
-
- // A mock invalidation listener.
- StrictMock<MockInvalidationListener> listener;
-};
-
-// Starts the ticl and checks that appropriate calls are made on the listener
-// and that a proper message is sent on the network.
-TEST_F(InvalidationClientImplTest, Start) {
- SetExpectationsForTiclStart(1);
- StartClient();
-}
-
-// Tests that GenerateNonce generates a unique nonce on every call.
-TEST_F(InvalidationClientImplTest, GenerateNonce) {
- // Create a random number generated seeded with the current time.
- scoped_ptr<Random> random;
- random.reset(new Random(InvalidationClientUtil::GetCurrentTimeMs(
- resources->internal_scheduler())));
-
- // Generate two nonces and make sure they are distinct. (The chances
- // of a collision should be vanishingly small since our correctness
- // relies upon no collisions.)
- string nonce1 = InvalidationClientCore::GenerateNonce(random.get());
- string nonce2 = InvalidationClientCore::GenerateNonce(random.get());
- ASSERT_NE(nonce1, nonce2);
-}
-
-// Starts the Ticl, registers for a few objects, gets success and ensures that
-// the right listener methods are invoked.
-TEST_F(InvalidationClientImplTest, Register) {
- SetExpectationsForTiclStart(2);
-
- // Set some expectations for registration status messages.
- vector<ObjectId> saved_oids;
- EXPECT_CALL(listener,
- InformRegistrationStatus(Eq(client.get()), _,
- InvalidationListener::REGISTERED))
- .Times(3)
- .WillRepeatedly(SaveArgToVector<1>(&saved_oids));
-
- // Start the Ticl.
- StartClient();
-
- // Synthesize a few test object ids.
- int num_objects = 3;
- vector<ObjectIdP> oid_protos;
- vector<ObjectId> oids;
- InitTestObjectIds(num_objects, &oid_protos);
- ConvertFromObjectIdProtos(oid_protos, &oids);
-
- // Register
- client.get()->Register(oids);
-
- // Let the message be sent out.
- internal_scheduler->PassTime(
- GetMaxBatchingDelay(config.protocol_handler_config()));
-
- // Give a registration status message to the protocol handler and wait for
- // the listener calls.
- ServerToClientMessage message;
- InitServerHeader(client.get()->GetClientToken(), message.mutable_header());
- vector<RegistrationStatus> registration_statuses;
- MakeRegistrationStatusesFromObjectIds(oid_protos, true, true,
- ®istration_statuses);
- for (int i = 0; i < num_objects; ++i) {
- message.mutable_registration_status_message()
- ->add_registration_status()->CopyFrom(registration_statuses[i]);
- }
-
- // Give this message to the protocol handler.
- ProcessIncomingMessage(message, EndOfTestWaitTime());
-
- // Check the object ids.
- ASSERT_TRUE(CompareVectorsAsSets(saved_oids, oids));
-
- // Check the registration message.
- ClientToServerMessage client_msg;
- client_msg.ParseFromString(outgoing_messages[1]);
- ASSERT_TRUE(client_msg.has_registration_message());
- ASSERT_FALSE(client_msg.has_info_message());
- ASSERT_FALSE(client_msg.has_registration_sync_message());
-
- RegistrationMessage expected_msg;
- InitRegistrationMessage(oid_protos, true, &expected_msg);
- const RegistrationMessage& actual_msg = client_msg.registration_message();
- ASSERT_TRUE(CompareMessages(expected_msg, actual_msg));
-}
-
-// Tests that given invalidations from the server, the right listener methods
-// are invoked. Ack the invalidations and make sure that the ack message is sent
-// out. Include a payload in one invalidation and make sure the client does not
-// include it in the ack.
-TEST_F(InvalidationClientImplTest, Invalidations) {
- // Set some expectations for starting the client.
- SetExpectationsForTiclStart(2);
-
- // Synthesize a few test object ids.
- int num_objects = 3;
- vector<ObjectIdP> oid_protos;
- vector<ObjectId> oids;
- InitTestObjectIds(num_objects, &oid_protos);
- ConvertFromObjectIdProtos(oid_protos, &oids);
-
- // Set up listener invalidation calls.
- vector<InvalidationP> invalidations;
- vector<Invalidation> expected_invs;
- MakeInvalidationsFromObjectIds(oid_protos, &invalidations);
- // Put a payload in one of the invalidations.
- invalidations[0].set_payload("this is a payload");
- ConvertFromInvalidationProtos(invalidations, &expected_invs);
-
- // Set up expectations for the acks.
- vector<Invalidation> saved_invs;
- vector<AckHandle> ack_handles;
-
- EXPECT_CALL(listener, Invalidate(Eq(client.get()), _, _))
- .Times(3)
- .WillRepeatedly(DoAll(SaveArgToVector<1>(&saved_invs),
- SaveArgToVector<2>(&ack_handles)));
-
- // Start the Ticl.
- StartClient();
-
- // Give this message to the protocol handler.
- ServerToClientMessage message;
- InitServerHeader(client.get()->GetClientToken(), message.mutable_header());
- InitInvalidationMessage(invalidations,
- message.mutable_invalidation_message());
-
- // Process the incoming invalidation message.
- ProcessIncomingMessage(message, MessageHandlingDelay());
-
- // Check the invalidations.
- ASSERT_TRUE(CompareVectorsAsSets(expected_invs, saved_invs));
-
- // Ack the invalidations now and wait for them to be sent out.
- for (int i = 0; i < num_objects; i++) {
- client.get()->Acknowledge(ack_handles[i]);
- }
- internal_scheduler->PassTime(
- GetMaxBatchingDelay(config.protocol_handler_config()));
-
- // Check that the ack message is as expected.
- ClientToServerMessage client_msg;
- client_msg.ParseFromString(outgoing_messages[1]);
- ASSERT_TRUE(client_msg.has_invalidation_ack_message());
-
- InvalidationMessage expected_msg;
- // The client should strip the payload from the invalidation.
- invalidations[0].clear_payload();
- InitInvalidationMessage(invalidations, &expected_msg);
- const InvalidationMessage& actual_msg =
- client_msg.invalidation_ack_message();
- ASSERT_TRUE(CompareMessages(expected_msg, actual_msg));
-}
-
-// Give a registration sync request message and an info request message to the
-// client and wait for the sync message and the info message to go out.
-TEST_F(InvalidationClientImplTest, ServerRequests) {
- // Set some expectations for starting the client.
- SetExpectationsForTiclStart(2);
-
- // Start the ticl.
- StartClient();
-
- // Make the server to client message.
- ServerToClientMessage message;
- InitServerHeader(client.get()->GetClientToken(), message.mutable_header());
-
- // Add a registration sync request message.
- message.mutable_registration_sync_request_message();
-
- // Add an info request message.
- message.mutable_info_request_message()->add_info_type(
- InfoRequestMessage_InfoType_GET_PERFORMANCE_COUNTERS);
-
- // Give it to the prototol handler.
- ProcessIncomingMessage(message, EndOfTestWaitTime());
-
- // Make sure that the message is as expected.
- ClientToServerMessage client_msg;
- client_msg.ParseFromString(outgoing_messages[1]);
- ASSERT_TRUE(client_msg.has_info_message());
- ASSERT_TRUE(client_msg.has_registration_sync_message());
-}
-
-// Tests that an incoming unknown failure message results in the app being
-// informed about it.
-TEST_F(InvalidationClientImplTest, IncomingErrorMessage) {
- SetExpectationsForTiclStart(1);
-
- // Set up listener expectation for error.
- EXPECT_CALL(listener, InformError(Eq(client.get()), _));
-
- // Start the ticl.
- StartClient();
-
- // Give the error message to the protocol handler.
- ServerToClientMessage message;
- InitServerHeader(client.get()->GetClientToken(), message.mutable_header());
- InitErrorMessage(ErrorMessage_Code_UNKNOWN_FAILURE, "Some error message",
- message.mutable_error_message());
- ProcessIncomingMessage(message, EndOfTestWaitTime());
-}
-
-// Tests that an incoming auth failure message results in the app being informed
-// about it and the registrations being removed.
-TEST_F(InvalidationClientImplTest, IncomingAuthErrorMessage) {
- SetExpectationsForTiclStart(2);
-
- // One object to register for.
- int num_objects = 1;
- vector<ObjectIdP> oid_protos;
- vector<ObjectId> oids;
- InitTestObjectIds(num_objects, &oid_protos);
- ConvertFromObjectIdProtos(oid_protos, &oids);
-
- // Expect error and registration failure from the ticl.
- EXPECT_CALL(listener, InformError(Eq(client.get()), _));
- EXPECT_CALL(listener, InformRegistrationFailure(Eq(client.get()), Eq(oids[0]),
- Eq(false), _));
-
- // Start the client.
- StartClient();
-
- // Register and let the message be sent out.
- client.get()->Register(oids[0]);
- internal_scheduler->PassTime(
- GetMaxBatchingDelay(config.protocol_handler_config()));
-
- // Give this message to the protocol handler.
- ServerToClientMessage message;
- InitServerHeader(client.get()->GetClientToken(), message.mutable_header());
- InitErrorMessage(ErrorMessage_Code_AUTH_FAILURE, "Auth error message",
- message.mutable_error_message());
- ProcessIncomingMessage(message, EndOfTestWaitTime());
-}
-
-// Tests that a registration that times out results in a reg sync message being
-// sent out.
-TEST_F(InvalidationClientImplTest, NetworkTimeouts) {
- // Set some expectations for starting the client.
- SetExpectationsForTiclStart(3);
-
- // One object to register for.
- int num_objects = 1;
- vector<ObjectIdP> oid_protos;
- vector<ObjectId> oids;
- InitTestObjectIds(num_objects, &oid_protos);
- ConvertFromObjectIdProtos(oid_protos, &oids);
-
- // Start the client.
- StartClient();
-
- // Register for an object.
- client.get()->Register(oids[0]);
-
- // Let the registration message be sent out.
- internal_scheduler->PassTime(
- GetMaxBatchingDelay(config.protocol_handler_config()));
-
- // Now let the network timeout occur and an info message be sent.
- TimeDelta timeout_delay = GetMaxDelay(config.network_timeout_delay_ms());
- internal_scheduler->PassTime(timeout_delay);
-
- // Check that the message sent out is an info message asking for the server's
- // summary.
- ClientToServerMessage client_msg2;
- client_msg2.ParseFromString(outgoing_messages[2]);
- ASSERT_TRUE(client_msg2.has_info_message());
- ASSERT_TRUE(
- client_msg2.info_message().server_registration_summary_requested());
- internal_scheduler->PassTime(EndOfTestWaitTime());
-}
-
-// Tests that an incoming message without registration summary does not
-// cause the registration summary in the client to be changed.
-TEST_F(InvalidationClientImplTest, NoRegistrationSummary) {
- // Test plan: Initialze the ticl, let it get a token with a ServerToClient
- // message that has no registration summary.
-
- // Set some expectations for starting the client and start the client.
- // Give it a summary with 1 reg.
- reg_summary.get()->set_num_registrations(1);
- SetExpectationsForTiclStart(1);
- StartClient();
-
- // Now give it an message with no summary. It should not reset to a summary
- // with zero registrations.
- reg_summary.reset(NULL);
- ServerToClientMessage message;
- InitServerHeader(client.get()->GetClientToken(), message.mutable_header());
- ProcessIncomingMessage(message, EndOfTestWaitTime());
-
- // Check that the registration manager state did not change.
- string manager_serial_state;
- client->GetRegistrationManagerStateAsSerializedProto(&manager_serial_state);
- RegistrationManagerStateP reg_manager_state;
- reg_manager_state.ParseFromString(manager_serial_state);
-
- // Check that the registration manager state's number of registrations is 1.
- TLOG(logger, INFO, "Reg manager state: %s",
- ProtoHelpers::ToString(reg_manager_state).c_str());
- ASSERT_EQ(1, reg_manager_state.server_summary().num_registrations());
-}
-
-// Tests that heartbeats are sent out as time advances.
-TEST_F(InvalidationClientImplTest, Heartbeats) {
- // Set some expectations for starting the client.
- SetExpectationsForTiclStart(2);
-
- // Start the client.
- StartClient();
-
- // Now let the heartbeat occur and an info message be sent.
- TimeDelta heartbeat_delay = GetMaxDelay(config.heartbeat_interval_ms() +
- config.protocol_handler_config().batching_delay_ms());
- internal_scheduler->PassTime(heartbeat_delay);
-
- // Check that the heartbeat is sent and it does not ask for the server's
- // summary.
- ClientToServerMessage client_msg1;
- client_msg1.ParseFromString(outgoing_messages[1]);
- ASSERT_TRUE(client_msg1.has_info_message());
- ASSERT_FALSE(
- client_msg1.info_message().server_registration_summary_requested());
- internal_scheduler->PassTime(EndOfTestWaitTime());
-}
-
-} // namespace invalidation
diff --git a/google/cacheinvalidation/impl/invalidation-client-util.h b/google/cacheinvalidation/impl/invalidation-client-util.h
deleted file mode 100644
index d5a2cc1..0000000
--- a/google/cacheinvalidation/impl/invalidation-client-util.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Useful utility functions for the TICL
-
-#ifndef GOOGLE_CACHEINVALIDATION_IMPL_INVALIDATION_CLIENT_UTIL_H_
-#define GOOGLE_CACHEINVALIDATION_IMPL_INVALIDATION_CLIENT_UTIL_H_
-
-#include "google/cacheinvalidation/include/system-resources.h"
-#include "google/cacheinvalidation/deps/time.h"
-
-namespace invalidation {
-
-class InvalidationClientUtil {
- public:
- /* Returns the time in milliseconds. */
- static int64 GetTimeInMillis(const Time& time) {
- return time.ToInternalValue() / Time::kMicrosecondsPerMillisecond;
- }
-
- /* Returns the current time in the scheduler's epoch in milliseconds. */
- static int64 GetCurrentTimeMs(Scheduler* scheduler) {
- return GetTimeInMillis(scheduler->GetCurrentTime());
- }
-};
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_IMPL_INVALIDATION_CLIENT_UTIL_H_
diff --git a/google/cacheinvalidation/impl/log-macro.h b/google/cacheinvalidation/impl/log-macro.h
deleted file mode 100644
index 1ac374a..0000000
--- a/google/cacheinvalidation/impl/log-macro.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// A simple logging macro specifically for the invalidation client library.
-
-#ifndef GOOGLE_CACHEINVALIDATION_IMPL_LOG_MACRO_H_
-#define GOOGLE_CACHEINVALIDATION_IMPL_LOG_MACRO_H_
-
-#define TLOG(logger, level, str, ...) \
- logger->Log(Logger::level ## _LEVEL, __FILE__, __LINE__, str, ##__VA_ARGS__);
-
-#endif // GOOGLE_CACHEINVALIDATION_IMPL_LOG_MACRO_H_
diff --git a/google/cacheinvalidation/impl/object-id-digest-utils.cc b/google/cacheinvalidation/impl/object-id-digest-utils.cc
deleted file mode 100644
index 182e9ca..0000000
--- a/google/cacheinvalidation/impl/object-id-digest-utils.cc
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Digest-related utilities for object ids.
-
-#include "google/cacheinvalidation/impl/object-id-digest-utils.h"
-
-namespace invalidation {
-
-string ObjectIdDigestUtils::GetDigest(
- const ObjectIdP& object_id, DigestFunction* digest_fn) {
- digest_fn->Reset();
- int source = object_id.source();
- string buffer(4, 0);
-
- // Little endian number for type followed by bytes.
- buffer[0] = source & 0xff;
- buffer[1] = (source >> 8) & 0xff;
- buffer[2] = (source >> 16) & 0xff;
- buffer[3] = (source >> 24) & 0xff;
-
- digest_fn->Update(buffer);
- digest_fn->Update(object_id.name());
- return digest_fn->GetDigest();
-}
-
-} // namespace invalidation
diff --git a/google/cacheinvalidation/impl/object-id-digest-utils.h b/google/cacheinvalidation/impl/object-id-digest-utils.h
deleted file mode 100644
index 8adb316..0000000
--- a/google/cacheinvalidation/impl/object-id-digest-utils.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Digest-related utilities for object ids.
-
-#ifndef GOOGLE_CACHEINVALIDATION_IMPL_OBJECT_ID_DIGEST_UTILS_H_
-#define GOOGLE_CACHEINVALIDATION_IMPL_OBJECT_ID_DIGEST_UTILS_H_
-
-#include <map>
-
-#include "google/cacheinvalidation/deps/digest-function.h"
-#include "google/cacheinvalidation/impl/client-protocol-namespace-fix.h"
-
-namespace invalidation {
-
-using INVALIDATION_STL_NAMESPACE::map;
-
-class ObjectIdDigestUtils {
- public:
- /* Returns the digest of the set of keys in the given map. */
- template<typename T>
- static string GetDigest(
- map<string, T> registrations, DigestFunction* digest_fn) {
- digest_fn->Reset();
- for (map<string, ObjectIdP>::iterator iter = registrations.begin();
- iter != registrations.end(); ++iter) {
- digest_fn->Update(iter->first);
- }
- return digest_fn->GetDigest();
- }
-
- /* Returns the digest of object_id using digest_fn. */
- static string GetDigest(
- const ObjectIdP& object_id, DigestFunction* digest_fn);
-};
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_IMPL_OBJECT_ID_DIGEST_UTILS_H_
diff --git a/google/cacheinvalidation/impl/persistence-utils.cc b/google/cacheinvalidation/impl/persistence-utils.cc
deleted file mode 100644
index e9c1b3d..0000000
--- a/google/cacheinvalidation/impl/persistence-utils.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Utility methods for handling the Ticl persistent state.
-
-#include "google/cacheinvalidation/impl/persistence-utils.h"
-
-namespace invalidation {
-
-void PersistenceUtils::SerializeState(
- PersistentTiclState state, DigestFunction* digest_fn, string* result) {
- string mac = GenerateMac(state, digest_fn);
- PersistentStateBlob blob;
- blob.mutable_ticl_state()->CopyFrom(state);
- blob.set_authentication_code(mac);
- blob.SerializeToString(result);
-}
-
-bool PersistenceUtils::DeserializeState(
- Logger* logger, const string& state_blob_bytes, DigestFunction* digest_fn,
- PersistentTiclState* ticl_state) {
- PersistentStateBlob state_blob;
- state_blob.ParseFromString(state_blob_bytes);
- if (!state_blob.IsInitialized()) {
- TLOG(logger, WARNING, "could not parse state blob from %s",
- state_blob_bytes.c_str());
- return false;
- }
-
- // Check the mac in the envelope against the recomputed mac from the state.
- ticl_state->CopyFrom(state_blob.ticl_state());
- const string& mac = GenerateMac(*ticl_state, digest_fn);
- if (mac != state_blob.authentication_code()) {
- TLOG(logger, WARNING, "Ticl state failed MAC check: computed %s vs %s",
- mac.c_str(), state_blob.authentication_code().c_str());
- return false;
- }
- return true;
-}
-
-string PersistenceUtils::GenerateMac(
- const PersistentTiclState& state, DigestFunction* digest_fn) {
- string serialized;
- state.SerializeToString(&serialized);
- digest_fn->Reset();
- digest_fn->Update(serialized);
- return digest_fn->GetDigest();
-}
-
-} // namespace invalidation
diff --git a/google/cacheinvalidation/impl/persistence-utils.h b/google/cacheinvalidation/impl/persistence-utils.h
deleted file mode 100644
index e9dc96e..0000000
--- a/google/cacheinvalidation/impl/persistence-utils.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Utility methods for handling the Ticl persistent state.
-
-#ifndef GOOGLE_CACHEINVALIDATION_IMPL_PERSISTENCE_UTILS_H_
-#define GOOGLE_CACHEINVALIDATION_IMPL_PERSISTENCE_UTILS_H_
-
-#include <string>
-
-#include "google/cacheinvalidation/include/system-resources.h"
-#include "google/cacheinvalidation/deps/digest-function.h"
-#include "google/cacheinvalidation/impl/client-protocol-namespace-fix.h"
-#include "google/cacheinvalidation/impl/log-macro.h"
-
-namespace invalidation {
-
-class PersistenceUtils {
- public:
- /* Serializes a Ticl state blob. */
- static void SerializeState(
- PersistentTiclState state, DigestFunction* digest_fn, string* result);
-
- /* Deserializes a Ticl state blob. Returns whether the parsed state could be
- * parsed.
- */
- static bool DeserializeState(
- Logger* logger, const string& state_blob_bytes, DigestFunction* digest_fn,
- PersistentTiclState* ticl_state);
-
- /* Returns a message authentication code over state. */
- static string GenerateMac(
- const PersistentTiclState& state, DigestFunction* digest_fn);
-
- private:
- PersistenceUtils() {
- // Prevent instantiation.
- }
-}; // class PersistenceUtils
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_IMPL_PERSISTENCE_UTILS_H_
diff --git a/google/cacheinvalidation/impl/proto-converter.cc b/google/cacheinvalidation/impl/proto-converter.cc
deleted file mode 100644
index e6d54b6..0000000
--- a/google/cacheinvalidation/impl/proto-converter.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Utilities to convert between protobufs and externally-exposed types in the
-// Ticl.
-
-#include "google/cacheinvalidation/impl/proto-converter.h"
-
-#include "google/cacheinvalidation/deps/logging.h"
-#include "google/cacheinvalidation/impl/client-protocol-namespace-fix.h"
-
-namespace invalidation {
-
-void ProtoConverter::ConvertFromObjectIdProto(
- const ObjectIdP& object_id_proto, ObjectId* object_id) {
- object_id->Init(object_id_proto.source(), object_id_proto.name());
-}
-
-void ProtoConverter::ConvertToObjectIdProto(
- const ObjectId& object_id, ObjectIdP* object_id_proto) {
- object_id_proto->set_source(object_id.source());
- object_id_proto->set_name(object_id.name());
-}
-
-void ProtoConverter::ConvertFromInvalidationProto(
- const InvalidationP& invalidation_proto, Invalidation* invalidation) {
- ObjectId object_id;
- ConvertFromObjectIdProto(invalidation_proto.object_id(), &object_id);
- bool is_trickle_restart = invalidation_proto.is_trickle_restart();
- if (invalidation_proto.has_payload()) {
- invalidation->Init(object_id, invalidation_proto.version(),
- invalidation_proto.payload(), is_trickle_restart);
- } else {
- invalidation->Init(object_id, invalidation_proto.version(),
- is_trickle_restart);
- }
-}
-
-void ProtoConverter::ConvertToInvalidationProto(
- const Invalidation& invalidation, InvalidationP* invalidation_proto) {
- ConvertToObjectIdProto(
- invalidation.object_id(), invalidation_proto->mutable_object_id());
- invalidation_proto->set_version(invalidation.version());
- if (invalidation.has_payload()) {
- invalidation_proto->set_payload(invalidation.payload());
- }
- bool is_trickle_restart = invalidation.is_trickle_restart_for_internal_use();
- invalidation_proto->set_is_trickle_restart(is_trickle_restart);
-}
-
-} // namespace invalidation
diff --git a/google/cacheinvalidation/impl/proto-converter.h b/google/cacheinvalidation/impl/proto-converter.h
deleted file mode 100644
index 7c7c432..0000000
--- a/google/cacheinvalidation/impl/proto-converter.h
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Utilities to convert between protobufs and externally-exposed types in the
-// Ticl.
-
-#ifndef GOOGLE_CACHEINVALIDATION_IMPL_PROTO_CONVERTER_H_
-#define GOOGLE_CACHEINVALIDATION_IMPL_PROTO_CONVERTER_H_
-
-#include "google/cacheinvalidation/include/types.h"
-#include "google/cacheinvalidation/impl/client-protocol-namespace-fix.h"
-
-namespace invalidation {
-
-class ProtoConverter {
- public:
- /* Converts an object id protocol buffer 'object_id_proto' to the
- * corresponding external type 'object_id'.
- */
- static void ConvertFromObjectIdProto(
- const ObjectIdP& object_id_proto, ObjectId* object_id);
-
- /* Converts an object id 'object_id' to the corresponding protocol buffer
- * 'object_id_proto'.
- */
- static void ConvertToObjectIdProto(
- const ObjectId& object_id, ObjectIdP* object_id_proto);
-
- /* Converts an invalidation protocol buffer 'invalidation_proto' to the
- * corresponding external object 'invalidation'.
- */
- static void ConvertFromInvalidationProto(
- const InvalidationP& invalidation_proto, Invalidation* invalidation);
-
- /* Converts an invalidation to the corresponding protocol
- * buffer and returns it.
- */
- static void ConvertToInvalidationProto(
- const Invalidation& invalidation, InvalidationP* invalidation_proto);
-
- static bool IsAllObjectIdP(const ObjectIdP& object_id_proto) {
- return (object_id_proto.source() == ObjectSource_Type_INTERNAL) &&
- (object_id_proto.name() == "");
- }
-
- private:
- ProtoConverter() {
- // To prevent instantiation.
- }
-};
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_IMPL_PROTO_CONVERTER_H_
diff --git a/google/cacheinvalidation/impl/proto-helpers.cc b/google/cacheinvalidation/impl/proto-helpers.cc
deleted file mode 100644
index 68cfe02..0000000
--- a/google/cacheinvalidation/impl/proto-helpers.cc
+++ /dev/null
@@ -1,473 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Useful utility functions for the TICL
-
-#include "google/cacheinvalidation/impl/proto-helpers.h"
-
-#include <sstream>
-
-#include "google/cacheinvalidation/client_test_internal.pb.h"
-#include "google/cacheinvalidation/deps/string_util.h"
-
-namespace invalidation {
-
-using ::ipc::invalidation::RegistrationManagerStateP;
-
-// Defines a ToString template method specialization for the given type.
-#define DEFINE_TO_STRING(type) \
- template<> \
- string ProtoHelpers::ToString(const type& message)
-
-// Creates a stringstream |stream| and emits a leading "{ " to it.
-#define BEGIN() \
- std::stringstream stream; \
- stream << "{ "
-
-// Emits a closing " }" on |stream| and returns the string that has been built.
-#define END() \
- stream << " }"; \
- return stream.str()
-
-// Defines a trivial ToString method for a type (which just returns "<type>").
-#define DEFINE_TRIVIAL_TO_STRING(type) \
- DEFINE_TO_STRING(type) { \
- return "<" #type ">"; \
- }
-
-// Emits "field: <field value as string>" if |field| is present in |message|.
-#define OPTIONAL(field) \
- if (message.has_##field()) { \
- stream << #field << ": " << ToString(message.field()) << " "; \
- }
-
-// Emits "field: <field value as string>" for each instance of field in message.
-#define REPEATED(field) \
- for (int i = 0; i < message.field##_size(); ++i) { \
- stream << #field << ": " << ToString(message.field(i)) << " "; \
- }
-
-// Expands to a case branch that returns "name" if the implicitly tested
-// expression is equal to the enum constant |name| in the given |type|.
-#define ENUM_VALUE(type, name) case type##_##name: return #name
-
-// Expands to a default case branch that returns the string representation of
-// |message|.
-#define ENUM_UNKNOWN() default: return SimpleItoa(message)
-
-DEFINE_TO_STRING(bool) {
- return message ? "true" : "false";
-}
-
-DEFINE_TO_STRING(int) {
- std::stringstream stream;
- stream << message;
- return stream.str();
-}
-
-DEFINE_TO_STRING(int64) {
- std::stringstream stream;
- stream << message;
- return stream.str();
-}
-
-/*
- * Three arrays that store the representation of each character from 0 to 255.
- * The ith number's octal representation is: CHAR_OCTAL_STRINGS1[i],
- * CHAR_OCTAL_STRINGS2[i], CHAR_OCTAL_STRINGS3[i]
- * <p>
- * E.g., if the number 128, these arrays contain 2, 0, 0 at index 128. We use
- * 3 char arrays instead of an array of strings since the code path for a
- * character append operation is quite a bit shorterthan the append operation
- * for strings.
- */
-char ProtoHelpers::CHAR_OCTAL_STRINGS1[];
-char ProtoHelpers::CHAR_OCTAL_STRINGS2[];
-char ProtoHelpers::CHAR_OCTAL_STRINGS3[];
-bool ProtoHelpers::is_initialized = false;
-
-template<>
-string ProtoHelpers::ToString(const string& bytes) {
- // This is a racy initialization but that is ok since we are initializing to
- // the same values.
- if (!is_initialized) {
- // Initialize the array with the Octal string values so that we do not have
- // to do string.format for every byte during runtime.
- for (int i = 0; i < ProtoHelpers::NUM_CHARS; i++) {
- string value = StringPrintf("%03o", i);
- ProtoHelpers::CHAR_OCTAL_STRINGS1[i] = value[0];
- ProtoHelpers::CHAR_OCTAL_STRINGS2[i] = value[1];
- ProtoHelpers::CHAR_OCTAL_STRINGS3[i] = value[2];
- }
- is_initialized = true;
- }
- string builder;
- builder.reserve(3 * bytes.length() + 2);
- builder += "\"";
- for (size_t i = 0; i < bytes.length(); i++) {
- char c = bytes[i];
- switch (c) {
- case '\n': builder += '\\'; builder += 'n'; break;
- case '\r': builder += '\\'; builder += 'r'; break;
- case '\t': builder += '\\'; builder += 't'; break;
- case '\"': builder += '\\'; builder += '"'; break;
- case '\\': builder += '\\'; builder += '\\'; break;
- default:
- if ((c >= 32) && (c < 127) && c != '\'') {
- builder += c;
- } else {
- int byteValue = c;
- if (c < 0) {
- byteValue = c + 256;
- }
- builder += '\\';
- builder += CHAR_OCTAL_STRINGS1[byteValue];
- builder += CHAR_OCTAL_STRINGS2[byteValue];
- builder += CHAR_OCTAL_STRINGS3[byteValue];
- }
- break;
- }
- }
- builder += "\"";
- return builder;
-}
-
-void ProtoHelpers::InitRegistrationP(const ObjectIdP& oid,
- RegistrationP::OpType op_type, RegistrationP* reg) {
- reg->mutable_object_id()->CopyFrom(oid);
- reg->set_op_type(op_type);
-}
-
-void ProtoHelpers::InitRateLimitP(int window_ms, int count,
- RateLimitP *rate_limit) {
- rate_limit->set_window_ms(window_ms);
- rate_limit->set_count(count);
-}
-
-void ProtoHelpers::InitInitializeMessage(
- const ApplicationClientIdP& application_client_id, const string& nonce,
- InitializeMessage* init_msg) {
- init_msg->set_client_type(application_client_id.client_type());
- init_msg->mutable_application_client_id()->CopyFrom(
- application_client_id);
- init_msg->set_nonce(nonce);
- init_msg->set_digest_serialization_type(
- InitializeMessage_DigestSerializationType_BYTE_BASED);
-}
-
-void ProtoHelpers::InitClientVersion(const string& platform,
- const string& application_info, ClientVersion* client_version) {
- Version* version = client_version->mutable_version();
- version->set_major_version(Constants::kClientMajorVersion);
- version->set_minor_version(Constants::kClientMinorVersion);
- client_version->set_platform(platform);
- client_version->set_language("C++");
- client_version->set_application_info(application_info);
-}
-
-void ProtoHelpers::InitProtocolVersion(ProtocolVersion* protocol_version) {
- Version* version = protocol_version->mutable_version();
- version->set_major_version(Constants::kProtocolMajorVersion);
- version->set_minor_version(Constants::kProtocolMinorVersion);
-}
-
-void ProtoHelpers::InitConfigVersion(Version* config_version) {
- config_version->set_major_version(Constants::kConfigMajorVersion);
- config_version->set_minor_version(Constants::kConfigMinorVersion);
-}
-
-DEFINE_TO_STRING(ErrorMessage::Code) {
- switch (message) {
- ENUM_VALUE(ErrorMessage_Code, AUTH_FAILURE);
- ENUM_VALUE(ErrorMessage_Code, UNKNOWN_FAILURE);
- ENUM_UNKNOWN();
- }
-}
-DEFINE_TO_STRING(InfoRequestMessage::InfoType) {
- switch (message) {
- ENUM_VALUE(InfoRequestMessage_InfoType, GET_PERFORMANCE_COUNTERS);
- ENUM_UNKNOWN();
- }
-}
-
-DEFINE_TO_STRING(InitializeMessage::DigestSerializationType) {
- switch (message) {
- ENUM_VALUE(InitializeMessage_DigestSerializationType, BYTE_BASED);
- ENUM_VALUE(InitializeMessage_DigestSerializationType, NUMBER_BASED);
- ENUM_UNKNOWN();
- }
-}
-
-DEFINE_TO_STRING(StatusP::Code) {
- switch (message) {
- ENUM_VALUE(StatusP_Code, SUCCESS);
- ENUM_VALUE(StatusP_Code, TRANSIENT_FAILURE);
- ENUM_VALUE(StatusP_Code, PERMANENT_FAILURE);
- ENUM_UNKNOWN();
- }
-}
-
-DEFINE_TO_STRING(RegistrationP::OpType) {
- switch (message) {
- ENUM_VALUE(RegistrationP_OpType, REGISTER);
- ENUM_VALUE(RegistrationP_OpType, UNREGISTER);
- ENUM_UNKNOWN();
- }
-}
-
-DEFINE_TO_STRING(RegistrationSyncRequestMessage) {
- BEGIN();
- END();
-}
-
-DEFINE_TO_STRING(Version) {
- BEGIN();
- OPTIONAL(major_version);
- OPTIONAL(minor_version);
- END();
-}
-
-DEFINE_TO_STRING(ClientVersion) {
- BEGIN();
- OPTIONAL(version);
- OPTIONAL(platform);
- OPTIONAL(language);
- OPTIONAL(application_info);
- END();
-}
-
-DEFINE_TO_STRING(ProtocolVersion) {
- BEGIN();
- OPTIONAL(version);
- END();
-}
-
-DEFINE_TO_STRING(InfoRequestMessage) {
- BEGIN();
- REPEATED(info_type);
- END();
-}
-
-DEFINE_TO_STRING(ConfigChangeMessage) {
- BEGIN();
- OPTIONAL(next_message_delay_ms);
- END();
-}
-
-DEFINE_TO_STRING(PropertyRecord) {
- BEGIN();
- OPTIONAL(name);
- OPTIONAL(value);
- END();
-}
-
-DEFINE_TO_STRING(RateLimitP) {
- BEGIN();
- OPTIONAL(window_ms);
- OPTIONAL(count);
- END();
-}
-
-DEFINE_TO_STRING(ProtocolHandlerConfigP) {
- BEGIN();
- OPTIONAL(batching_delay_ms);
- REPEATED(rate_limit);
- END();
-}
-
-DEFINE_TO_STRING(ClientConfigP) {
- BEGIN();
- OPTIONAL(version);
- OPTIONAL(network_timeout_delay_ms);
- OPTIONAL(write_retry_delay_ms);
- OPTIONAL(heartbeat_interval_ms);
- OPTIONAL(perf_counter_delay_ms);
- OPTIONAL(max_exponential_backoff_factor);
- OPTIONAL(smear_percent);
- OPTIONAL(is_transient);
- OPTIONAL(initial_persistent_heartbeat_delay_ms);
- OPTIONAL(protocol_handler_config);
- END();
-}
-
-DEFINE_TO_STRING(InfoMessage) {
- BEGIN();
- OPTIONAL(client_version);
- REPEATED(config_parameter);
- REPEATED(performance_counter);
- OPTIONAL(server_registration_summary_requested);
- END();
-}
-
-DEFINE_TO_STRING(ErrorMessage) {
- BEGIN();
- OPTIONAL(code);
- OPTIONAL(description);
- END();
-}
-
-DEFINE_TO_STRING(RegistrationSummary) {
- BEGIN();
- OPTIONAL(num_registrations);
- OPTIONAL(registration_digest);
- END();
-}
-
-DEFINE_TO_STRING(ObjectIdP) {
- BEGIN();
- OPTIONAL(source);
- OPTIONAL(name);
- END();
-}
-
-DEFINE_TO_STRING(InvalidationP) {
- BEGIN();
- OPTIONAL(object_id);
- OPTIONAL(is_known_version);
- OPTIONAL(version);
- OPTIONAL(is_trickle_restart);
- OPTIONAL(payload);
- END();
-}
-
-DEFINE_TO_STRING(AckHandleP) {
- BEGIN();
- OPTIONAL(invalidation);
- END();
-}
-
-DEFINE_TO_STRING(ApplicationClientIdP) {
- BEGIN();
- OPTIONAL(client_type);
- OPTIONAL(client_name);
- END();
-}
-
-DEFINE_TO_STRING(StatusP) {
- BEGIN();
- OPTIONAL(code);
- OPTIONAL(description);
- END();
-}
-
-DEFINE_TO_STRING(RegistrationP) {
- BEGIN();
- OPTIONAL(object_id);
- OPTIONAL(op_type);
- END();
-}
-
-DEFINE_TO_STRING(RegistrationStatus) {
- BEGIN();
- OPTIONAL(registration);
- OPTIONAL(status);
- END();
-}
-
-DEFINE_TO_STRING(ClientHeader) {
- BEGIN();
- OPTIONAL(protocol_version);
- OPTIONAL(client_token);
- OPTIONAL(registration_summary);
- OPTIONAL(client_time_ms);
- OPTIONAL(max_known_server_time_ms);
- OPTIONAL(message_id);
- END();
-}
-
-DEFINE_TO_STRING(InitializeMessage) {
- BEGIN();
- OPTIONAL(client_type);
- OPTIONAL(nonce);
- OPTIONAL(application_client_id);
- OPTIONAL(digest_serialization_type);
- END();
-}
-
-DEFINE_TO_STRING(RegistrationMessage) {
- BEGIN();
- REPEATED(registration);
- END();
-}
-
-DEFINE_TO_STRING(InvalidationMessage) {
- BEGIN();
- REPEATED(invalidation);
- END();
-}
-
-DEFINE_TO_STRING(RegistrationSubtree) {
- BEGIN();
- REPEATED(registered_object);
- END();
-}
-DEFINE_TO_STRING(RegistrationSyncMessage) {
- BEGIN();
- REPEATED(subtree);
- END();
-}
-
-DEFINE_TO_STRING(ClientToServerMessage) {
- BEGIN();
- OPTIONAL(header);
- OPTIONAL(initialize_message);
- OPTIONAL(registration_message);
- OPTIONAL(registration_sync_message);
- OPTIONAL(invalidation_ack_message);
- OPTIONAL(info_message);
- END();
-}
-
-DEFINE_TO_STRING(ServerHeader) {
- BEGIN();
- OPTIONAL(protocol_version);
- OPTIONAL(client_token);
- OPTIONAL(registration_summary);
- OPTIONAL(server_time_ms);
- OPTIONAL(message_id);
- END();
-}
-
-DEFINE_TO_STRING(TokenControlMessage) {
- BEGIN();
- OPTIONAL(new_token);
- END();
-}
-
-DEFINE_TO_STRING(RegistrationStatusMessage) {
- BEGIN();
- REPEATED(registration_status);
- END();
-}
-
-DEFINE_TO_STRING(ServerToClientMessage) {
- BEGIN();
- OPTIONAL(header);
- OPTIONAL(token_control_message);
- OPTIONAL(invalidation_message);
- OPTIONAL(registration_status_message);
- OPTIONAL(registration_sync_request_message);
- OPTIONAL(info_request_message);
- END();
-}
-
-DEFINE_TO_STRING(RegistrationManagerStateP) {
- BEGIN();
- OPTIONAL(client_summary);
- OPTIONAL(server_summary);
- REPEATED(registered_objects);
- END();
-}
-
-} // namespace invalidation
diff --git a/google/cacheinvalidation/impl/proto-helpers.h b/google/cacheinvalidation/impl/proto-helpers.h
deleted file mode 100644
index aa6023e..0000000
--- a/google/cacheinvalidation/impl/proto-helpers.h
+++ /dev/null
@@ -1,143 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Helper utilities for dealing with protocol buffers.
-
-#ifndef GOOGLE_CACHEINVALIDATION_IMPL_PROTO_HELPERS_H_
-#define GOOGLE_CACHEINVALIDATION_IMPL_PROTO_HELPERS_H_
-
-#include <sstream>
-#include <string>
-
-#include "google/cacheinvalidation/client_protocol.pb.h"
-#include "google/cacheinvalidation/deps/logging.h"
-#include "google/cacheinvalidation/deps/stl-namespace.h"
-#include "google/cacheinvalidation/impl/client-protocol-namespace-fix.h"
-#include "google/cacheinvalidation/impl/constants.h"
-
-namespace invalidation {
-
-using INVALIDATION_STL_NAMESPACE::string;
-using ::ipc::invalidation::ProtocolVersion;
-
-// Functor to compare various protocol messages.
-struct ProtoCompareLess {
- bool operator()(const ObjectIdP& object_id1,
- const ObjectIdP& object_id2) const {
- // If the sources differ, then the one with the smaller source is the
- // smaller object id.
- int source_diff = object_id1.source() - object_id2.source();
- if (source_diff != 0) {
- return source_diff < 0;
- }
- // Otherwise, the one with the smaller name is the smaller object id.
- return object_id1.name().compare(object_id2.name()) < 0;
- }
-
- bool operator()(const InvalidationP& inv1,
- const InvalidationP& inv2) const {
- const ProtoCompareLess& compare_less_than = *this;
- // If the object ids differ, then the one with the smaller object id is the
- // smaller invalidation.
- if (compare_less_than(inv1.object_id(), inv2.object_id())) {
- return true;
- }
- if (compare_less_than(inv2.object_id(), inv1.object_id())) {
- return false;
- }
-
- // Otherwise, the object ids are the same, so we need to look at the
- // versions.
-
- // We define an unknown version to be less than a known version.
- int64 known_version_diff =
- inv1.is_known_version() - inv2.is_known_version();
- if (known_version_diff != 0) {
- return known_version_diff < 0;
- }
-
- // Otherwise, they're both known both unknown, so the one with the smaller
- // version is the smaller invalidation.
- return inv1.version() < inv2.version();
- }
-
- bool operator()(const RegistrationSubtree& reg_subtree1,
- const RegistrationSubtree& reg_subtree2) const {
- const RepeatedPtrField<ObjectIdP>& objects1 =
- reg_subtree1.registered_object();
- const RepeatedPtrField<ObjectIdP>& objects2 =
- reg_subtree2.registered_object();
- // If they have different numbers of objects, the one with fewer is smaller.
- if (objects1.size() != objects2.size()) {
- return objects1.size() < objects2.size();
- }
- // Otherwise, compare the object ids in order.
- RepeatedPtrField<ObjectIdP>::const_iterator iter1, iter2;
- const ProtoCompareLess& compare_less_than = *this;
- for (iter1 = objects1.begin(), iter2 = objects2.begin();
- iter1 != objects1.end(); ++iter1, ++iter2) {
- if (compare_less_than(*iter1, *iter2)) {
- return true;
- }
- if (compare_less_than(*iter2, *iter1)) {
- return false;
- }
- }
- // The registration subtrees are the same.
- return false;
- }
-};
-
-// Other protocol message utilities.
-class ProtoHelpers {
- public:
- // Converts a value to a printable/readable string format.
- template<typename T>
- static string ToString(const T& value);
-
- // Initializes |reg| to be a (un) registration for object |oid|.
- static void InitRegistrationP(const ObjectIdP& oid,
- RegistrationP::OpType op_type, RegistrationP* reg);
-
- static void InitInitializeMessage(
- const ApplicationClientIdP& application_client_id, const string& nonce,
- InitializeMessage* init_msg);
-
- // Initializes |protocol_version| to the current protocol version.
- static void InitProtocolVersion(ProtocolVersion* protocol_version);
-
- // Initializes |client_version| to the current client version.
- static void InitClientVersion(const string& platform,
- const string& application_info, ClientVersion* client_version);
-
- // Initializes |config_version| to the current config version.
- static void InitConfigVersion(Version* config_version);
-
- // Initializes |rate_limit| with the given window interval and count of
- // messages.
- static void InitRateLimitP(int window_ms, int count, RateLimitP *rate_limit);
-
- private:
- static const int NUM_CHARS = 256;
- static char CHAR_OCTAL_STRINGS1[NUM_CHARS];
- static char CHAR_OCTAL_STRINGS2[NUM_CHARS];
- static char CHAR_OCTAL_STRINGS3[NUM_CHARS];
-
- // Have the above arrays been initialized or not.
- static bool is_initialized;
-};
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_IMPL_PROTO_HELPERS_H_
diff --git a/google/cacheinvalidation/impl/protocol-handler.cc b/google/cacheinvalidation/impl/protocol-handler.cc
deleted file mode 100644
index 2f233b5..0000000
--- a/google/cacheinvalidation/impl/protocol-handler.cc
+++ /dev/null
@@ -1,442 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Client for interacting with low-level protocol messages.
-
-#include "google/cacheinvalidation/impl/protocol-handler.h"
-
-#include "google/cacheinvalidation/deps/string_util.h"
-#include "google/cacheinvalidation/impl/constants.h"
-#include "google/cacheinvalidation/impl/invalidation-client-core.h"
-#include "google/cacheinvalidation/impl/log-macro.h"
-#include "google/cacheinvalidation/impl/proto-helpers.h"
-#include "google/cacheinvalidation/impl/recurring-task.h"
-
-namespace invalidation {
-
-using ::ipc::invalidation::ConfigChangeMessage;
-using ::ipc::invalidation::InfoMessage;
-using ::ipc::invalidation::InitializeMessage;
-using ::ipc::invalidation::InitializeMessage_DigestSerializationType_BYTE_BASED;
-using ::ipc::invalidation::InvalidationMessage;
-using ::ipc::invalidation::PropertyRecord;
-using ::ipc::invalidation::RegistrationMessage;
-using ::ipc::invalidation::RegistrationSyncMessage;
-using ::ipc::invalidation::ServerHeader;
-using ::ipc::invalidation::ServerToClientMessage;
-using ::ipc::invalidation::TokenControlMessage;
-
-string ServerMessageHeader::ToString() const {
- return StringPrintf(
- "Token: %s, Summary: %s", ProtoHelpers::ToString(*token_).c_str(),
- ProtoHelpers::ToString(*registration_summary_).c_str());
-}
-
-void ParsedMessage::InitFrom(const ServerToClientMessage& raw_message) {
- base_message = raw_message; // Does a deep copy.
-
- // For each field, assign it to the corresponding protobuf field if
- // present, else NULL.
- header.InitFrom(&base_message.header().client_token(),
- base_message.header().has_registration_summary() ?
- &base_message.header().registration_summary() : NULL);
-
- token_control_message = base_message.has_token_control_message() ?
- &base_message.token_control_message() : NULL;
-
- invalidation_message = base_message.has_invalidation_message() ?
- &base_message.invalidation_message() : NULL;
-
- registration_status_message =
- base_message.has_registration_status_message() ?
- &base_message.registration_status_message() : NULL;
-
- registration_sync_request_message =
- base_message.has_registration_sync_request_message() ?
- &base_message.registration_sync_request_message() : NULL;
-
- config_change_message = base_message.has_config_change_message() ?
- &base_message.config_change_message() : NULL;
-
- info_request_message = base_message.has_info_request_message() ?
- &base_message.info_request_message() : NULL;
-
- error_message = base_message.has_error_message() ?
- &base_message.error_message() : NULL;
-}
-
-ProtocolHandler::ProtocolHandler(
- const ProtocolHandlerConfigP& config, SystemResources* resources,
- Smearer* smearer, Statistics* statistics, int client_type,
- const string& application_name, ProtocolListener* listener,
- TiclMessageValidator* msg_validator)
- : logger_(resources->logger()),
- internal_scheduler_(resources->internal_scheduler()),
- network_(resources->network()),
- throttle_(config.rate_limit(), internal_scheduler_,
- NewPermanentCallback(this, &ProtocolHandler::SendMessageToServer)),
- listener_(listener),
- msg_validator_(msg_validator),
- message_id_(1),
- last_known_server_time_ms_(0),
- next_message_send_time_ms_(0),
- statistics_(statistics),
- batcher_(resources->logger(), statistics),
- client_type_(client_type) {
- // Initialize client version.
- ProtoHelpers::InitClientVersion(resources->platform(), application_name,
- &client_version_);
-}
-
-void ProtocolHandler::InitConfig(ProtocolHandlerConfigP* config) {
- // Add rate limits.
-
- // Allow at most 3 messages every 5 seconds.
- int window_ms = 5 * 1000;
- int num_messages_per_window = 3;
-
- ProtoHelpers::InitRateLimitP(window_ms, num_messages_per_window,
- config->add_rate_limit());
-}
-
-void ProtocolHandler::InitConfigForTest(ProtocolHandlerConfigP* config) {
- // No rate limits.
- int small_batch_delay_for_test = 200;
- config->set_batching_delay_ms(small_batch_delay_for_test);
-
- // At most one message per second.
- ProtoHelpers::InitRateLimitP(1000, 1, config->add_rate_limit());
- // At most six messages per minute.
- ProtoHelpers::InitRateLimitP(60 * 1000, 6, config->add_rate_limit());
-}
-
-bool ProtocolHandler::HandleIncomingMessage(const string& incoming_message,
- ParsedMessage* parsed_message) {
- ServerToClientMessage message;
- message.ParseFromString(incoming_message);
- if (!message.IsInitialized()) {
- TLOG(logger_, WARNING, "Incoming message is unparseable: %s",
- ProtoHelpers::ToString(incoming_message).c_str());
- return false;
- }
-
- // Validate the message. If this passes, we can blindly assume valid messages
- // from here on.
- TLOG(logger_, FINE, "Incoming message: %s",
- ProtoHelpers::ToString(message).c_str());
-
- if (!msg_validator_->IsValid(message)) {
- statistics_->RecordError(
- Statistics::ClientErrorType_INCOMING_MESSAGE_FAILURE);
- TLOG(logger_, SEVERE, "Received invalid message: %s",
- ProtoHelpers::ToString(message).c_str());
- return false;
- }
-
- // Check the version of the message.
- const ServerHeader& message_header = message.header();
- if (message_header.protocol_version().version().major_version() !=
- Constants::kProtocolMajorVersion) {
- statistics_->RecordError(
- Statistics::ClientErrorType_PROTOCOL_VERSION_FAILURE);
- TLOG(logger_, SEVERE, "Dropping message with incompatible version: %s",
- ProtoHelpers::ToString(message).c_str());
- return false;
- }
-
- // Check if it is a ConfigChangeMessage which indicates that messages should
- // no longer be sent for a certain duration. Perform this check before the
- // token is even checked.
- if (message.has_config_change_message()) {
- const ConfigChangeMessage& config_change_msg =
- message.config_change_message();
- statistics_->RecordReceivedMessage(
- Statistics::ReceivedMessageType_CONFIG_CHANGE);
- if (config_change_msg.has_next_message_delay_ms()) {
- // Validator has ensured that it is positive.
- next_message_send_time_ms_ = GetCurrentTimeMs() +
- config_change_msg.next_message_delay_ms();
- }
- return false; // Ignore all other messages in the envelope.
- }
-
- if (message_header.server_time_ms() > last_known_server_time_ms_) {
- last_known_server_time_ms_ = message_header.server_time_ms();
- }
- parsed_message->InitFrom(message);
- return true;
-}
-
-bool ProtocolHandler::CheckServerToken(const string& server_token) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- const string& client_token = listener_->GetClientToken();
-
- // If we do not have a client token yet, there is nothing to compare. The
- // message must have an initialize message and the upper layer will do the
- // appropriate checks. Hence, we return true if client_token is empty.
- if (client_token.empty()) {
- // No token. Return true so that we'll attempt to deliver a token control
- // message (if any) to the listener in handleIncomingMessage.
- return true;
- }
-
- if (client_token != server_token) {
- // Bad token - reject whole message. However, our channel can send us
- // messages intended for other clients belonging to the same user, so don't
- // log too loudly.
- TLOG(logger_, INFO, "Incoming message has bad token: %s, %s",
- ProtoHelpers::ToString(client_token).c_str(),
- ProtoHelpers::ToString(server_token).c_str());
- statistics_->RecordError(Statistics::ClientErrorType_TOKEN_MISMATCH);
- return false;
- }
- return true;
-}
-
-void ProtocolHandler::SendInitializeMessage(
- const ApplicationClientIdP& application_client_id,
- const string& nonce,
- BatchingTask* batching_task,
- const string& debug_string) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
-
- if (application_client_id.client_type() != client_type_) {
- // This condition is not fatal, but it probably represents a bug somewhere
- // if it occurs.
- TLOG(logger_, WARNING, "Client type in application id does not match "
- "constructor-provided type: %s vs %s",
- ProtoHelpers::ToString(application_client_id).c_str(), client_type_);
- }
-
- // Simply store the message in pending_initialize_message_ and send it
- // when the batching task runs.
- InitializeMessage* message = new InitializeMessage();
- ProtoHelpers::InitInitializeMessage(application_client_id, nonce, message);
- TLOG(logger_, INFO, "Batching initialize message for client: %s, %s",
- debug_string.c_str(),
- ProtoHelpers::ToString(*message).c_str());
- batcher_.SetInitializeMessage(message);
- batching_task->EnsureScheduled(debug_string);
-}
-
-void ProtocolHandler::SendInfoMessage(
- const vector<pair<string, int> >& performance_counters,
- ClientConfigP* client_config,
- bool request_server_registration_summary,
- BatchingTask* batching_task) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
-
- // Simply store the message in pending_info_message_ and send it
- // when the batching task runs.
- InfoMessage* message = new InfoMessage();
- message->mutable_client_version()->CopyFrom(client_version_);
-
- // Add configuration parameters.
- if (client_config != NULL) {
- message->mutable_client_config()->CopyFrom(*client_config);
- }
-
- // Add performance counters.
- for (size_t i = 0; i < performance_counters.size(); ++i) {
- PropertyRecord* counter = message->add_performance_counter();
- counter->set_name(performance_counters[i].first);
- counter->set_value(performance_counters[i].second);
- }
-
- // Indicate whether we want the server's registration summary sent back.
- message->set_server_registration_summary_requested(
- request_server_registration_summary);
-
- TLOG(logger_, INFO, "Batching info message for client: %s",
- ProtoHelpers::ToString(*message).c_str());
- batcher_.SetInfoMessage(message);
- batching_task->EnsureScheduled("Send-info");
-}
-
-void ProtocolHandler::SendRegistrations(
- const vector<ObjectIdP>& object_ids,
- RegistrationP::OpType reg_op_type,
- BatchingTask* batching_task) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- for (size_t i = 0; i < object_ids.size(); ++i) {
- batcher_.AddRegistration(object_ids[i], reg_op_type);
- }
- batching_task->EnsureScheduled("Send-registrations");
-}
-
-void ProtocolHandler::SendInvalidationAck(const InvalidationP& invalidation,
- BatchingTask* batching_task) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- // We could summarize acks if there are suppressing invalidations - we don't
- // since it is unlikely to be too beneficial here.
- batcher_.AddAck(invalidation);
- batching_task->EnsureScheduled("Send-ack");
-}
-
-void ProtocolHandler::SendRegistrationSyncSubtree(
- const RegistrationSubtree& reg_subtree,
- BatchingTask* batching_task) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- TLOG(logger_, INFO, "Adding subtree: %s",
- ProtoHelpers::ToString(reg_subtree).c_str());
- batcher_.AddRegSubtree(reg_subtree);
- batching_task->EnsureScheduled("Send-reg-sync");
-}
-
-void ProtocolHandler::SendMessageToServer() {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
-
- if (next_message_send_time_ms_ > GetCurrentTimeMs()) {
- TLOG(logger_, WARNING, "In quiet period: not sending message to server: "
- "%s > %s",
- SimpleItoa(next_message_send_time_ms_).c_str(),
- SimpleItoa(GetCurrentTimeMs()).c_str());
- return;
- }
-
- const bool has_client_token(!listener_->GetClientToken().empty());
- ClientToServerMessage builder;
- if (!batcher_.ToBuilder(&builder, has_client_token)) {
- TLOG(logger_, WARNING, "Unable to build message");
- return;
- }
- ClientHeader* outgoing_header = builder.mutable_header();
- InitClientHeader(outgoing_header);
-
- // Validate the message and send it.
- ++message_id_;
- if (!msg_validator_->IsValid(builder)) {
- TLOG(logger_, SEVERE, "Tried to send invalid message: %s",
- ProtoHelpers::ToString(builder).c_str());
- statistics_->RecordError(
- Statistics::ClientErrorType_OUTGOING_MESSAGE_FAILURE);
- return;
- }
-
- TLOG(logger_, FINE, "Sending message to server: %s",
- ProtoHelpers::ToString(builder).c_str());
- statistics_->RecordSentMessage(Statistics::SentMessageType_TOTAL);
- string serialized;
- builder.SerializeToString(&serialized);
- network_->SendMessage(serialized);
-
- // Record that the message was sent. We do this inline to match what the
- // Java Ticl, which is constrained by Android requirements, does.
- listener_->HandleMessageSent();
-}
-
-void ProtocolHandler::InitClientHeader(ClientHeader* builder) {
- CHECK(internal_scheduler_->IsRunningOnThread()) << "Not on internal thread";
- ProtoHelpers::InitProtocolVersion(builder->mutable_protocol_version());
- builder->set_client_time_ms(GetCurrentTimeMs());
- builder->set_message_id(StringPrintf("%d", message_id_));
- builder->set_max_known_server_time_ms(last_known_server_time_ms_);
- builder->set_client_type(client_type_);
- listener_->GetRegistrationSummary(builder->mutable_registration_summary());
- const string& client_token = listener_->GetClientToken();
- if (!client_token.empty()) {
- TLOG(logger_, FINE, "Sending token on client->server message: %s",
- ProtoHelpers::ToString(client_token).c_str());
- builder->set_client_token(client_token);
- }
-}
-
-bool Batcher::ToBuilder(ClientToServerMessage* builder, bool has_client_token) {
- // Check if an initialize message needs to be sent.
- if (pending_initialize_message_.get() != NULL) {
- statistics_->RecordSentMessage(Statistics::SentMessageType_INITIALIZE);
- builder->mutable_initialize_message()->CopyFrom(
- *pending_initialize_message_);
- pending_initialize_message_.reset();
- }
-
- // Note: Even if an initialize message is being sent, we can send additional
- // messages such as registration messages, etc to the server. But if there is
- // no token and an initialize message is not being sent, we cannot send any
- // other message.
-
- if (!has_client_token && !builder->has_initialize_message()) {
- // Cannot send any message.
- TLOG(logger_, WARNING,
- "Cannot send message since no token and no initialize msg: %s",
- ProtoHelpers::ToString(*builder).c_str());
- statistics_->RecordError(Statistics::ClientErrorType_TOKEN_MISSING_FAILURE);
- return false;
- }
-
- // Check for pending batched operations and add to message builder if needed.
-
- // Add reg, acks, reg subtrees - clear them after adding.
- if (!pending_acked_invalidations_.empty()) {
- InitAckMessage(builder->mutable_invalidation_ack_message());
- statistics_->RecordSentMessage(
- Statistics::SentMessageType_INVALIDATION_ACK);
- }
-
- // Check regs.
- if (!pending_registrations_.empty()) {
- InitRegistrationMessage(builder->mutable_registration_message());
- statistics_->RecordSentMessage(Statistics::SentMessageType_REGISTRATION);
- }
-
- // Check reg substrees.
- if (!pending_reg_subtrees_.empty()) {
- RegistrationSyncMessage* sync_message =
- builder->mutable_registration_sync_message();
- set<RegistrationSubtree, ProtoCompareLess>::const_iterator iter;
- for (iter = pending_reg_subtrees_.begin();
- iter != pending_reg_subtrees_.end(); ++iter) {
- sync_message->add_subtree()->CopyFrom(*iter);
- }
- pending_reg_subtrees_.clear();
- statistics_->RecordSentMessage(
- Statistics::SentMessageType_REGISTRATION_SYNC);
- }
-
- // Check info message.
- if (pending_info_message_.get() != NULL) {
- statistics_->RecordSentMessage(Statistics::SentMessageType_INFO);
- builder->mutable_info_message()->CopyFrom(*pending_info_message_);
- pending_info_message_.reset();
- }
- return true;
-}
-
-void Batcher::InitRegistrationMessage(
- RegistrationMessage* reg_message) {
- CHECK(!pending_registrations_.empty());
-
- // Run through the pending_registrations map.
- map<ObjectIdP, RegistrationP::OpType, ProtoCompareLess>::iterator iter;
- for (iter = pending_registrations_.begin();
- iter != pending_registrations_.end(); ++iter) {
- ProtoHelpers::InitRegistrationP(iter->first, iter->second,
- reg_message->add_registration());
- }
- pending_registrations_.clear();
-}
-
-void Batcher::InitAckMessage(InvalidationMessage* ack_message) {
- CHECK(!pending_acked_invalidations_.empty());
-
- // Run through pending_acked_invalidations_ set.
- set<InvalidationP, ProtoCompareLess>::iterator iter;
- for (iter = pending_acked_invalidations_.begin();
- iter != pending_acked_invalidations_.end(); iter++) {
- ack_message->add_invalidation()->CopyFrom(*iter);
- }
- pending_acked_invalidations_.clear();
-}
-
-} // namespace invalidation
diff --git a/google/cacheinvalidation/impl/protocol-handler.h b/google/cacheinvalidation/impl/protocol-handler.h
deleted file mode 100644
index c9e00c4..0000000
--- a/google/cacheinvalidation/impl/protocol-handler.h
+++ /dev/null
@@ -1,424 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// A layer for interacting with low-level protocol messages.
-
-#ifndef GOOGLE_CACHEINVALIDATION_IMPL_PROTOCOL_HANDLER_H_
-#define GOOGLE_CACHEINVALIDATION_IMPL_PROTOCOL_HANDLER_H_
-
-#include <map>
-#include <set>
-#include <sstream>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "google/cacheinvalidation/include/system-resources.h"
-#include "google/cacheinvalidation/deps/scoped_ptr.h"
-#include "google/cacheinvalidation/impl/client-protocol-namespace-fix.h"
-#include "google/cacheinvalidation/impl/invalidation-client-util.h"
-#include "google/cacheinvalidation/impl/proto-helpers.h"
-#include "google/cacheinvalidation/impl/recurring-task.h"
-#include "google/cacheinvalidation/impl/statistics.h"
-#include "google/cacheinvalidation/impl/smearer.h"
-#include "google/cacheinvalidation/impl/throttle.h"
-#include "google/cacheinvalidation/impl/ticl-message-validator.h"
-
-namespace invalidation {
-
-class ProtocolHandler;
-
-using INVALIDATION_STL_NAMESPACE::make_pair;
-using INVALIDATION_STL_NAMESPACE::map;
-using INVALIDATION_STL_NAMESPACE::pair;
-using INVALIDATION_STL_NAMESPACE::set;
-using INVALIDATION_STL_NAMESPACE::string;
-
-/*
- * Representation of a message header for use in a server message.
- */
-struct ServerMessageHeader {
- public:
- ServerMessageHeader() {
- }
-
- /* Initializes an instance. Note that this call *does not* make copies of
- * the pointed-to data. Instances are always allocated inside a ParsedMessage,
- * and the containing ParsedMessage owns the data.
- *
- * Arguments:
- * init_token - server-sent token.
- * init_registration_summary - summary over server registration state.
- * If num_registations is not set, means no registration summary was
- * received from the server.
- */
- void InitFrom(const string* init_token,
- const RegistrationSummary* init_registration_summary) {
- token_ = init_token;
- registration_summary_ = init_registration_summary;
- }
-
- const string& token() const {
- return *token_;
- }
-
- // Returns the registration summary if any.
- const RegistrationSummary* registration_summary() const {
- return registration_summary_;
- }
-
- // Returns a human-readable representation of this object for debugging.
- string ToString() const;
-
- private:
- // Server-sent token.
- const string* token_;
-
- // Summary of the client's registration state at the server.
- const RegistrationSummary* registration_summary_;
-
- DISALLOW_COPY_AND_ASSIGN(ServerMessageHeader);
-};
-
-/*
- * Representation of a message receiver for the server. Such a message is
- * guaranteed to be valid (i.e. checked by the message validator), but
- * the session token is NOT checked.
- */
-struct ParsedMessage {
- public:
- ParsedMessage() {
- }
-
- ServerMessageHeader header;
-
- /*
- * Each of these fields points to a field in the base_message
- * ServerToClientMessage protobuf. It is non-null iff the corresponding hasYYY
- * method in the protobuf would return true.
- */
- const TokenControlMessage* token_control_message;
- const InvalidationMessage* invalidation_message;
- const RegistrationStatusMessage* registration_status_message;
- const RegistrationSyncRequestMessage* registration_sync_request_message;
- const ConfigChangeMessage* config_change_message;
- const InfoRequestMessage* info_request_message;
- const ErrorMessage* error_message;
-
- /*
- * Initializes an instance from a |raw_message|. This function makes a copy of
- * the message internally.
- */
- void InitFrom(const ServerToClientMessage& raw_message);
-
- private:
- ServerToClientMessage base_message;
- DISALLOW_COPY_AND_ASSIGN(ParsedMessage);
-};
-
-/*
- * Class that batches messages to be sent to the data center.
- */
-class Batcher {
- public:
- Batcher(Logger* logger, Statistics* statistics)
- : logger_(logger), statistics_(statistics) {}
-
- /* Sets the initialize |message| to be sent to the server. */
- void SetInitializeMessage(const InitializeMessage* message) {
- pending_initialize_message_.reset(message);
- }
-
- /* Sets the info |message| to be sent to the server. */
- void SetInfoMessage(const InfoMessage* message) {
- pending_info_message_.reset(message);
- }
-
- /* Adds a registration on |object_id| to be sent to the server. */
- void AddRegistration(const ObjectIdP& object_id,
- const RegistrationP::OpType& reg_op_type) {
- pending_registrations_[object_id] = reg_op_type;
- }
-
- /* Adds an acknowledgment of |invalidation| to be sent to the server. */
- void AddAck(const InvalidationP& invalidation) {
- pending_acked_invalidations_.insert(invalidation);
- }
-
- /* Adds a registration subtree |reg_subtree| to be sent to the server. */
- void AddRegSubtree(const RegistrationSubtree& reg_subtree) {
- pending_reg_subtrees_.insert(reg_subtree);
- }
-
- /*
- * Builds a message from the batcher state and resets the batcher. Returns
- * whether the message could be built.
- *
- * Note that the returned message does NOT include a header.
- */
- bool ToBuilder(ClientToServerMessage* builder,
- bool has_client_token);
-
- /*
- * Initializes a registration message based on registrations from
- * |pending_registrations|.
- *
- * REQUIRES: pending_registrations.size() > 0
- */
- void InitRegistrationMessage(RegistrationMessage* reg_message);
-
- /* Initializes an invalidation ack message based on acks from
- * |pending_acked_invalidations|.
- * <p>
- * REQUIRES: pending_acked_invalidations.size() > 0
- */
- void InitAckMessage(InvalidationMessage* ack_message);
-
- private:
- Logger* const logger_;
-
- Statistics* const statistics_;
-
- /* Set of pending registrations stored as a map for overriding later
- * operations.
- */
- map<ObjectIdP, RegistrationP::OpType, ProtoCompareLess>
- pending_registrations_;
-
- /* Set of pending invalidation acks. */
- set<InvalidationP, ProtoCompareLess> pending_acked_invalidations_;
-
- /* Set of pending registration sub trees for registration sync. */
- set<RegistrationSubtree, ProtoCompareLess> pending_reg_subtrees_;
-
- /* Pending initialization message to send to the server, if any. */
- scoped_ptr<const InitializeMessage> pending_initialize_message_;
-
- /* Pending info message to send to the server, if any. */
- scoped_ptr<const InfoMessage> pending_info_message_;
-
- DISALLOW_COPY_AND_ASSIGN(Batcher);
-};
-
-/* Listener for protocol events. The protocol client calls these methods when
- * a message is received from the server. It guarantees that the call will be
- * made on the internal thread that the SystemResources provides. When the
- * protocol listener is called, the token has been checked and message
- * validation has been completed (using the {@link TiclMessageValidator2}).
- * That is, all of the methods below can assume that the nonce is null and the
- * server token is valid.
- */
-class ProtocolListener {
- public:
- ProtocolListener() {}
- virtual ~ProtocolListener() {}
-
- /* Records that a message was sent to the server at the current time. */
- virtual void HandleMessageSent() = 0;
-
- /* Handles a change in network connectivity. */
- virtual void HandleNetworkStatusChange(bool is_online) = 0;
-
- /* Stores a summary of the current desired registrations. */
- virtual void GetRegistrationSummary(RegistrationSummary* summary) = 0;
-
- /* Returns the current server-assigned client token, if any. */
- virtual string GetClientToken() = 0;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(ProtocolListener);
-};
-
-// Forward-declare the BatchingTask so that send* methods can take it.
-class BatchingTask;
-
-/* Parses messages from the server and calls appropriate functions on the
- * ProtocolListener to handle various types of message content. Also buffers
- * message data from the client and constructs and sends messages to the server.
- */
-class ProtocolHandler {
- public:
- /* Creates an instance.
- *
- * config - configuration for the client
- * resources - resources to use
- * smearer - a smearer to randomize delays
- * statistics - track information about messages sent/received, etc
- * client_type - client typecode
- * application_name - name of the application using the library (for
- * debugging/monitoring)
- * listener - callback for protocol events
- * msg_validator - validator for protocol messages
- * Caller continues to own space for smearer.
- */
- ProtocolHandler(const ProtocolHandlerConfigP& config,
- SystemResources* resources,
- Smearer* smearer, Statistics* statistics,
- int client_type, const string& application_name,
- ProtocolListener* listener,
- TiclMessageValidator* msg_validator);
-
- /* Initializes |config| with default protocol handler config parameters. */
- static void InitConfig(ProtocolHandlerConfigP* config);
-
- /* Initializes |config| with protocol handler config parameters for unit
- * tests.
- */
- static void InitConfigForTest(ProtocolHandlerConfigP* config);
-
- /* Returns the next time a message is allowed to be sent to the server.
- * Typically, this will be in the past, meaning that the client is free to
- * send a message at any time.
- */
- int64 GetNextMessageSendTimeMsForTest() {
- return next_message_send_time_ms_;
- }
-
- /* Sends a message to the server to request a client token.
- *
- * Arguments:
- * client_type - client type code as assigned by the notification system's
- * backend
- * application_client_id - application-specific client id
- * nonce - nonce for the request
- * batching_task - recurring task to trigger batching. No ownership taken.
- * debug_string - information to identify the caller
- */
- void SendInitializeMessage(
- const ApplicationClientIdP& application_client_id,
- const string& nonce,
- BatchingTask* batching_task,
- const string& debug_string);
-
- /* Sends an info message to the server with the performance counters supplied
- * in performance_counters and the config supplies in client_config (which
- * could be null).
- */
- void SendInfoMessage(const vector<pair<string, int> >& performance_counters,
- ClientConfigP* client_config,
- bool request_server_registration_summary,
- BatchingTask* batching_task);
-
- /* Sends a registration request to the server.
- *
- * Arguments:
- * object_ids - object ids on which to (un)register
- * reg_op_type - whether to register or unregister
- * batching_task - recurring task to trigger batching. No ownership taken.
- */
- void SendRegistrations(const vector<ObjectIdP>& object_ids,
- RegistrationP::OpType reg_op_type,
- BatchingTask* batching_task);
-
- /* Sends an acknowledgement for invalidation to the server. */
- void SendInvalidationAck(const InvalidationP& invalidation,
- BatchingTask* batching_task);
-
- /* Sends a single registration subtree to the server.
- *
- * Arguments:
- * reg_subtree - subtree to send
- * batching_task - recurring task to trigger batching. No ownership taken.
- */
- void SendRegistrationSyncSubtree(const RegistrationSubtree& reg_subtree,
- BatchingTask* batching_task);
-
- /* Sends pending data to the server (e.g., registrations, acks, registration
- * sync messages).
- *
- * REQUIRES: caller do no further work after the method returns.
- */
- void SendMessageToServer();
-
- /*
- * Handles a message from the server. If the message can be processed (i.e.,
- * is valid, is of the right version, and is not a silence message), returns
- * a ParsedMessage representing it. Otherwise, returns NULL.
- *
- * This class intercepts and processes silence messages. In this case, it will
- * discard any other data in the message.
- *
- * Note that this method does not check the session token of any message.
- */
- bool HandleIncomingMessage(const string& incoming_message,
- ParsedMessage* parsed_message);
-
- private:
- /* Verifies that server_token matches the token currently held by the client.
- */
- bool CheckServerToken(const string& server_token);
-
- /* Stores the header to include on a message to the server. */
- void InitClientHeader(ClientHeader* header);
-
- // Returns the current time in milliseconds.
- int64 GetCurrentTimeMs() {
- return InvalidationClientUtil::GetCurrentTimeMs(internal_scheduler_);
- }
-
- friend class BatchingTask;
-
- // Information about the client, e.g., application name, OS, etc.
-
- ClientVersion client_version_;
-
- // A logger.
- Logger* logger_;
-
- // Scheduler for the client's internal processing.
- Scheduler* internal_scheduler_;
-
- // Network channel for sending and receiving messages to and from the server.
- NetworkChannel* network_;
-
- // A throttler to prevent the client from sending too many messages in a given
- // interval.
- Throttle throttle_;
-
- // The protocol listener.
- ProtocolListener* listener_;
-
- // Checks that messages (inbound and outbound) conform to basic validity
- // constraints.
- TiclMessageValidator* msg_validator_;
-
- /* A debug message id that is added to every message to the server. */
- int message_id_;
-
- // State specific to a client. If we want to support multiple clients, this
- // could be in a map or could be eliminated (e.g., no batching).
-
- /* The last known time from the server. */
- int64 last_known_server_time_ms_;
-
- /* The next time before which a message cannot be sent to the server. If
- * this is less than current time, a message can be sent at any time.
- */
- int64 next_message_send_time_ms_;
-
- /* Statistics objects to track number of sent messages, etc. */
- Statistics* statistics_;
-
- // Batches messages to be sent to the server.
- Batcher batcher_;
-
- // Type code for the client.
- int client_type_;
-
- DISALLOW_COPY_AND_ASSIGN(ProtocolHandler);
-};
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_IMPL_PROTOCOL_HANDLER_H_
diff --git a/google/cacheinvalidation/impl/protocol-handler_test.cc b/google/cacheinvalidation/impl/protocol-handler_test.cc
deleted file mode 100644
index 1ca1568..0000000
--- a/google/cacheinvalidation/impl/protocol-handler_test.cc
+++ /dev/null
@@ -1,674 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Unit tests for the ProtocolHandler class.
-
-#include "google/cacheinvalidation/types.pb.h"
-#include "google/cacheinvalidation/include/types.h"
-#include "google/cacheinvalidation/deps/gmock.h"
-#include "google/cacheinvalidation/deps/googletest.h"
-#include "google/cacheinvalidation/deps/string_util.h"
-#include "google/cacheinvalidation/impl/basic-system-resources.h"
-#include "google/cacheinvalidation/impl/constants.h"
-#include "google/cacheinvalidation/impl/invalidation-client-impl.h"
-#include "google/cacheinvalidation/impl/protocol-handler.h"
-#include "google/cacheinvalidation/impl/statistics.h"
-#include "google/cacheinvalidation/impl/throttle.h"
-#include "google/cacheinvalidation/impl/ticl-message-validator.h"
-#include "google/cacheinvalidation/test/deterministic-scheduler.h"
-#include "google/cacheinvalidation/test/test-logger.h"
-#include "google/cacheinvalidation/test/test-utils.h"
-
-namespace invalidation {
-
-using ::ipc::invalidation::ClientType_Type_TEST;
-using ::ipc::invalidation::ObjectSource_Type_TEST;
-using ::testing::_;
-using ::testing::AllOf;
-using ::testing::ByRef;
-using ::testing::DoAll;
-using ::testing::ElementsAre;
-using ::testing::EqualsProto;
-using ::testing::Eq;
-using ::testing::Matcher;
-using ::testing::Property;
-using ::testing::Return;
-using ::testing::ReturnPointee;
-using ::testing::SaveArg;
-using ::testing::SetArgPointee;
-using ::testing::StrictMock;
-using ::testing::proto::WhenDeserializedAs;
-
-/* Returns whether two headers are equal. */
-bool HeaderEqual(const ServerMessageHeader& expected,
- const ServerMessageHeader& actual) {
- // If the token is different or if one of the registration summaries is NULL
- // and the other is non-NULL, return false.
- if (((expected.registration_summary() != NULL) !=
- (actual.registration_summary() != NULL)) ||
- (expected.token() != actual.token())) {
- return false;
- }
-
- // The tokens are the same and registration summaries are either both
- // null or non-null.
- return (expected.registration_summary() == NULL) ||
- ((expected.registration_summary()->num_registrations() ==
- actual.registration_summary()->num_registrations()) &&
- (expected.registration_summary()->registration_digest() ==
- actual.registration_summary()->registration_digest()));
-}
-
-// A mock of the ProtocolListener interface.
-class MockProtocolListener : public ProtocolListener {
- public:
- MOCK_METHOD0(HandleMessageSent, void());
-
- MOCK_METHOD1(HandleNetworkStatusChange, void(bool)); // NOLINT
-
- MOCK_METHOD1(GetRegistrationSummary, void(RegistrationSummary*)); // NOLINT
-
- MOCK_METHOD0(GetClientToken, string());
-};
-
-// Tests the basic functionality of the protocol handler.
-class ProtocolHandlerTest : public UnitTestBase {
- public:
- virtual ~ProtocolHandlerTest() {}
-
- // Performs setup for protocol handler unit tests, e.g. creating resource
- // components and setting up common expectations for certain mock objects.
- virtual void SetUp() {
- // Use a strict mock scheduler for the listener, since it shouldn't be used
- // at all by the protocol handler.
- UnitTestBase::SetUp();
- InitListenerExpectations();
- validator.reset(new TiclMessageValidator(logger)); // Create msg validator
-
- // Create the protocol handler object.
- random.reset(new Random(InvalidationClientUtil::GetCurrentTimeMs(
- resources.get()->internal_scheduler())));
- smearer.reset(new Smearer(random.get(), kDefaultSmearPercent));
- protocol_handler.reset(
- new ProtocolHandler(
- config, resources.get(), smearer.get(), statistics.get(),
- ClientType_Type_TEST, "unit-test", &listener, validator.get()));
- batching_task.reset(
- new BatchingTask(protocol_handler.get(), smearer.get(),
- TimeDelta::FromMilliseconds(config.batching_delay_ms())));
- }
-
- // Configuration for the protocol handler (uses defaults).
- ProtocolHandlerConfigP config;
-
- // The protocol handler being tested. Created fresh for each test function.
- scoped_ptr<ProtocolHandler> protocol_handler;
-
- // A mock protocol listener. We make this strict in order to have tight
- // control over the interactions between this and the protocol handler.
- // SetUp() installs expectations to allow GetClientToken() and
- // GetRegistrationSummary() to be called any time and to give them
- // reasonable behavior.
- StrictMock<MockProtocolListener> listener;
-
- // Ticl message validator. We do not mock this, since the correctness of the
- // protocol handler depends on it.
- scoped_ptr<TiclMessageValidator> validator;
-
- // Token and registration summary for the mock listener to return when
- // the protocol handler requests them.
- string token;
- RegistrationSummary summary;
-
- // A smearer to randomize delays.
- scoped_ptr<Smearer> smearer;
-
- // A random number generator.
- scoped_ptr<Random> random;
-
- // Batching task for the protocol handler.
- scoped_ptr<BatchingTask> batching_task;
-
- void AddExpectationForHandleMessageSent() {
- EXPECT_CALL(listener, HandleMessageSent());
- }
-
- /*
- * Processes a |message| using the protocol handler, initializing
- * |parsed_message| with the result.
- *
- * Returns whether the message could be parsed.
- */
- bool ProcessMessage(ServerToClientMessage message,
- ParsedMessage* parsed_message) {
- string serialized;
- message.SerializeToString(&serialized);
- bool accepted = protocol_handler->HandleIncomingMessage(
- serialized, parsed_message);
- return accepted;
- }
-
- private:
- void InitListenerExpectations() {
- // When the handler asks the listener for the client token, return whatever
- // |token| currently is.
- EXPECT_CALL(listener, GetClientToken())
- .WillRepeatedly(ReturnPointee(&token));
-
- // If the handler asks the listener for a registration summary, respond by
- // supplying a fake summary.
- InitZeroRegistrationSummary(&summary);
- EXPECT_CALL(listener, GetRegistrationSummary(_))
- .WillRepeatedly(SetArgPointee<0>(summary));
- }
-};
-
-// Asks the protocol handler to send an initialize message. Waits for the
-// batching delay to pass. Checks that appropriate calls are made on the
-// listener and that a proper message is sent on the network.
-TEST_F(ProtocolHandlerTest, SendInitializeOnly) {
- ApplicationClientIdP app_client_id;
- app_client_id.set_client_name("unit-test-client-id");
- app_client_id.set_client_type(ClientType_Type_TEST);
-
- // Client's token is initially empty. Give it an arbitrary nonce.
- token = "";
- string nonce = "unit-test-nonce";
-
- // SendInitializeMessage checks that it's running on the work queue thread, so
- // we need to schedule the call.
- internal_scheduler->Schedule(
- Scheduler::NoDelay(),
- NewPermanentCallback(
- protocol_handler.get(), &ProtocolHandler::SendInitializeMessage,
- app_client_id, nonce, batching_task.get(), "Startup"));
-
- AddExpectationForHandleMessageSent();
- ClientToServerMessage expected_message;
-
- // Build the header.
- ClientHeader* header = expected_message.mutable_header();
- ProtoHelpers::InitProtocolVersion(header->mutable_protocol_version());
- header->mutable_registration_summary()->CopyFrom(summary);
- header->set_max_known_server_time_ms(0);
- header->set_message_id("1");
-
- // Note: because the batching task is smeared, we don't know what the client's
- // timestamp will be. We omit it from this proto and do a partial match in
- // the EXPECT_CALL but also save the proto and check later that it doesn't
- // contain anything we don't expect.
-
- // Create the expected initialize message.
- InitializeMessage* initialize_message =
- expected_message.mutable_initialize_message();
- initialize_message->set_client_type(ClientType_Type_TEST);
- initialize_message->set_nonce(nonce);
- initialize_message->mutable_application_client_id()->CopyFrom(app_client_id);
- initialize_message->set_digest_serialization_type(
- InitializeMessage_DigestSerializationType_BYTE_BASED);
-
- string actual_serialized;
- EXPECT_CALL(
- *network,
- SendMessage(WhenDeserializedAs<ClientToServerMessage>(
- // Check that the deserialized message has the initialize message and
- // header fields we expect.
- AllOf(Property(&ClientToServerMessage::initialize_message,
- EqualsProto(*initialize_message)),
- Property(&ClientToServerMessage::header,
- ClientHeaderMatches(header))))))
- .WillOnce(SaveArg<0>(&actual_serialized));
-
- // The actual message won't be sent until after the batching delay, which is
- // smeared, so double it to be sure enough time will have passed.
- TimeDelta wait_time = GetMaxBatchingDelay(config);
- internal_scheduler->PassTime(wait_time);
-
- // By now we expect the message to have been sent, so we'll deserialize it
- // and check that it doesn't have anything we don't expect.
- ClientToServerMessage actual_message;
- actual_message.ParseFromString(actual_serialized);
- ASSERT_FALSE(actual_message.has_info_message());
- ASSERT_FALSE(actual_message.has_invalidation_ack_message());
- ASSERT_FALSE(actual_message.has_registration_message());
- ASSERT_FALSE(actual_message.has_registration_sync_message());
- ASSERT_GE(actual_message.header().client_time_ms(),
- InvalidationClientUtil::GetTimeInMillis(start_time));
- ASSERT_LE(actual_message.header().client_time_ms(),
- InvalidationClientUtil::GetTimeInMillis(start_time + wait_time));
-}
-
-// Tests the receipt of a token control message like what we'd expect in
-// response to an initialize message. Check that appropriate calls are made on
-// the protocol listener.
-TEST_F(ProtocolHandlerTest, ReceiveTokenControlOnly) {
- ServerToClientMessage message;
- ServerHeader* header = message.mutable_header();
- string nonce = "fake nonce";
- InitServerHeader(nonce, header);
-
- string new_token = "new token";
- message.mutable_token_control_message()->set_new_token(new_token);
-
- ServerMessageHeader expected_header;
- expected_header.InitFrom(&nonce, &header->registration_summary());
- ParsedMessage parsed_message;
- ProcessMessage(message, &parsed_message);
- ASSERT_TRUE(HeaderEqual(expected_header, parsed_message.header));
- ASSERT_TRUE(parsed_message.token_control_message != NULL);
-}
-
-// Test that the protocol handler correctly buffers multiple message types.
-// Tell it to send registrations, then unregistrations (with some overlap in the
-// sets of objects). Then send some invalidation acks and finally a
-// registration subtree. Wait for the batching interval to pass, and then check
-// that the message sent out contains everything we expect.
-TEST_F(ProtocolHandlerTest, SendMultipleMessageTypes) {
- // Concoct some performance counters and config parameters, and ask to send
- // an info message with them.
- vector<pair<string, int> > perf_counters;
- perf_counters.push_back(make_pair("x", 3));
- perf_counters.push_back(make_pair("y", 81));
- ClientConfigP client_config;
- InvalidationClientImpl::InitConfig(&client_config);
-
- internal_scheduler->Schedule(
- Scheduler::NoDelay(),
- NewPermanentCallback(
- protocol_handler.get(), &ProtocolHandler::SendInfoMessage,
- perf_counters, &client_config, true, batching_task.get()));
-
- // Synthesize a few test object ids.
- vector<ObjectIdP> oids;
- InitTestObjectIds(3, &oids);
-
- // Register for the first two.
- vector<ObjectIdP> oid_vec;
- oid_vec.push_back(oids[0]);
- oid_vec.push_back(oids[1]);
-
- internal_scheduler->Schedule(
- Scheduler::NoDelay(),
- NewPermanentCallback(
- protocol_handler.get(), &ProtocolHandler::SendRegistrations,
- oid_vec, RegistrationP_OpType_REGISTER, batching_task.get()));
-
- // Then unregister for the second and third. This overrides the registration
- // on oids[1].
- oid_vec.clear();
- oid_vec.push_back(oids[1]);
- oid_vec.push_back(oids[2]);
- internal_scheduler->Schedule(
- Scheduler::NoDelay(),
- NewPermanentCallback(
- protocol_handler.get(), &ProtocolHandler::SendRegistrations,
- oid_vec, RegistrationP_OpType_UNREGISTER, batching_task.get()));
-
- // Send a couple of invalidations.
- vector<InvalidationP> invalidations;
- MakeInvalidationsFromObjectIds(oids, &invalidations);
- invalidations.pop_back();
- for (size_t i = 0; i < invalidations.size(); ++i) {
- internal_scheduler->Schedule(
- Scheduler::NoDelay(),
- NewPermanentCallback(
- protocol_handler.get(), &ProtocolHandler::SendInvalidationAck,
- invalidations[i], batching_task.get()));
- }
-
- // Send a simple registration subtree.
- RegistrationSubtree subtree;
- subtree.add_registered_object()->CopyFrom(oids[0]);
- internal_scheduler->Schedule(
- Scheduler::NoDelay(),
- NewPermanentCallback(
- protocol_handler.get(), &ProtocolHandler::SendRegistrationSyncSubtree,
- subtree, batching_task.get()));
-
- AddExpectationForHandleMessageSent();
-
- token = "test token";
-
- // The message it sends should contain all of the expected information:
- ClientToServerMessage expected_message;
-
- // Header.
- ClientHeader* header = expected_message.mutable_header();
- ProtoHelpers::InitProtocolVersion(header->mutable_protocol_version());
- header->mutable_registration_summary()->CopyFrom(summary);
- header->set_client_token(token);
- header->set_max_known_server_time_ms(0);
- header->set_message_id("1");
-
- // Note: because the batching task is smeared, we don't know what the client's
- // timestamp will be. We omit it from this proto and do a partial match in
- // the EXPECT_CALL but also save the proto and check later that it doesn't
- // contain anything we don't expect.
-
- // Registrations.
- RegistrationMessage* reg_message =
- expected_message.mutable_registration_message();
- RegistrationP* registration;
- registration = reg_message->add_registration();
- registration->mutable_object_id()->CopyFrom(oids[0]);
- registration->set_op_type(RegistrationP_OpType_REGISTER);
-
- registration = reg_message->add_registration();
- registration->mutable_object_id()->CopyFrom(oids[1]);
- registration->set_op_type(RegistrationP_OpType_UNREGISTER);
-
- registration = reg_message->add_registration();
- registration->mutable_object_id()->CopyFrom(oids[2]);
- registration->set_op_type(RegistrationP_OpType_UNREGISTER);
-
- // Registration sync message.
- expected_message.mutable_registration_sync_message()->add_subtree()
- ->CopyFrom(subtree);
-
- // Invalidation acks.
- InvalidationMessage* invalidation_message =
- expected_message.mutable_invalidation_ack_message();
- InitInvalidationMessage(invalidations, invalidation_message);
-
- // Info message.
- InfoMessage* info_message = expected_message.mutable_info_message();
- ProtoHelpers::InitClientVersion("unit-test", "unit-test",
- info_message->mutable_client_version());
- info_message->set_server_registration_summary_requested(true);
- info_message->mutable_client_config()->CopyFrom(client_config);
- PropertyRecord* prop_rec;
- for (uint32 i = 0; i < perf_counters.size(); ++i) {
- prop_rec = info_message->add_performance_counter();
- prop_rec->set_name(perf_counters[i].first);
- prop_rec->set_value(perf_counters[i].second);
- }
-
- string actual_serialized;
- EXPECT_CALL(
- *network,
- SendMessage(
- WhenDeserializedAs<ClientToServerMessage>(
- // Check that the deserialized message has the invalidation acks,
- // registrations, info message, and header fields we expect.
- AllOf(Property(&ClientToServerMessage::invalidation_ack_message,
- EqualsProto(*invalidation_message)),
- Property(&ClientToServerMessage::registration_message,
- EqualsProto(*reg_message)),
- Property(&ClientToServerMessage::info_message,
- EqualsProto(*info_message)),
- Property(&ClientToServerMessage::header,
- ClientHeaderMatches(header))))))
- .WillOnce(SaveArg<0>(&actual_serialized));
-
- TimeDelta wait_time = GetMaxBatchingDelay(config);
- internal_scheduler->PassTime(wait_time);
-
- ClientToServerMessage actual_message;
- actual_message.ParseFromString(actual_serialized);
-
- ASSERT_FALSE(actual_message.has_initialize_message());
- ASSERT_GE(actual_message.header().client_time_ms(),
- InvalidationClientUtil::GetTimeInMillis(start_time));
- ASSERT_LE(actual_message.header().client_time_ms(),
- InvalidationClientUtil::GetTimeInMillis(start_time + wait_time));
-}
-
-// Check that if the protocol handler receives a message with several sub-
-// messages set, it makes all the appropriate calls on the listener.
-TEST_F(ProtocolHandlerTest, IncomingCompositeMessage) {
- // Build up a message with a number of sub-messages in it:
- ServerToClientMessage message;
-
- // First the header.
- token = "test token";
- InitServerHeader(token, message.mutable_header());
-
- // Fabricate a few object ids for use in invalidations and registration
- // statuses.
- vector<ObjectIdP> object_ids;
- InitTestObjectIds(3, &object_ids);
-
- // Add invalidations.
- vector<InvalidationP> invalidations;
- MakeInvalidationsFromObjectIds(object_ids, &invalidations);
- for (int i = 0; i < 3; ++i) {
- message.mutable_invalidation_message()->add_invalidation()->CopyFrom(
- invalidations[i]);
- }
-
- // Add registration statuses.
- vector<RegistrationStatus> registration_statuses;
- MakeRegistrationStatusesFromObjectIds(object_ids, true, true,
- ®istration_statuses);
- for (int i = 0; i < 3; ++i) {
- message.mutable_registration_status_message()
- ->add_registration_status()->CopyFrom(registration_statuses[i]);
- }
-
- // Add a registration sync request message.
- message.mutable_registration_sync_request_message();
-
- // Add an info request message.
- message.mutable_info_request_message()->add_info_type(
- InfoRequestMessage_InfoType_GET_PERFORMANCE_COUNTERS);
-
- // The header we expect the listener to be called with.
- ServerMessageHeader expected_header;
- expected_header.InitFrom(&token, &summary);
-
- ParsedMessage parsed_message;
- ProcessMessage(message, &parsed_message);
- ASSERT_TRUE(HeaderEqual(expected_header, parsed_message.header));
- ASSERT_TRUE(parsed_message.invalidation_message != NULL);
- ASSERT_TRUE(parsed_message.registration_status_message != NULL);
- ASSERT_TRUE(parsed_message.registration_sync_request_message != NULL);
- ASSERT_TRUE(parsed_message.info_request_message != NULL);
-}
-
-// Test that the protocol handler drops an invalid message.
-TEST_F(ProtocolHandlerTest, InvalidInboundMessage) {
- // Make an invalid message (omit protocol version from header).
- ServerToClientMessage message;
- string token = "test token";
- ServerHeader* header = message.mutable_header();
- InitServerHeader(token, header);
- header->clear_protocol_version();
-
- // Add an info request message to check that it doesn't get processed.
- message.mutable_info_request_message()->add_info_type(
- InfoRequestMessage_InfoType_GET_PERFORMANCE_COUNTERS);
- ParsedMessage parsed_message;
- ProcessMessage(message, &parsed_message);
- ASSERT_EQ(1, statistics->GetClientErrorCounterForTest(
- Statistics::ClientErrorType_INCOMING_MESSAGE_FAILURE));
-}
-
-// Test that the protocol handler drops a message whose major version doesn't
-// match what it understands.
-TEST_F(ProtocolHandlerTest, MajorVersionMismatch) {
- // Make a message with a different protocol major version.
- ServerToClientMessage message;
- token = "test token";
- ServerHeader* header = message.mutable_header();
- InitServerHeader(token, header);
- header->mutable_protocol_version()->mutable_version()->set_major_version(1);
-
- // Add an info request message to check that it doesn't get processed.
- message.mutable_info_request_message()->add_info_type(
- InfoRequestMessage_InfoType_GET_PERFORMANCE_COUNTERS);
-
- ParsedMessage parsed_message;
- ProcessMessage(message, &parsed_message);
- ASSERT_EQ(1, statistics->GetClientErrorCounterForTest(
- Statistics::ClientErrorType_PROTOCOL_VERSION_FAILURE));
-}
-
-// Test that the protocol handler doesn't drop a message whose minor version
-// doesn't match what it understands.
-TEST_F(ProtocolHandlerTest, MinorVersionMismatch) {
- // Make a message with a different protocol minor version.
- ServerToClientMessage message;
- token = "test token";
- ServerHeader* header = message.mutable_header();
- InitServerHeader(token, header);
- header->mutable_protocol_version()->mutable_version()->set_minor_version(4);
-
- ServerMessageHeader expected_header;
- expected_header.InitFrom(&token, &summary);
-
- ParsedMessage parsed_message;
- ProcessMessage(message, &parsed_message);
- ASSERT_TRUE(HeaderEqual(expected_header, parsed_message.header));
- ASSERT_EQ(0, statistics->GetClientErrorCounterForTest(
- Statistics::ClientErrorType_PROTOCOL_VERSION_FAILURE));
-}
-
-// Test that the protocol handler honors a config message (even if the server
-// token doesn't match) and does not call any listener methods.
-TEST_F(ProtocolHandlerTest, ConfigMessage) {
- // Fabricate a config message.
- ServerToClientMessage message;
- token = "test token";
- InitServerHeader(token, message.mutable_header());
- token = "token-that-should-mismatch";
-
- int next_message_delay_ms = 2000 * 1000;
- message.mutable_config_change_message()->set_next_message_delay_ms(
- next_message_delay_ms);
-
- ParsedMessage parsed_message;
- ProcessMessage(message, &parsed_message);
-
- // Check that the protocol handler recorded receiving the config change
- // message, and that it has updated the next time it will send a message.
- ASSERT_EQ(1, statistics->GetReceivedMessageCounterForTest(
- Statistics::ReceivedMessageType_CONFIG_CHANGE));
- ASSERT_EQ(
- InvalidationClientUtil::GetTimeInMillis(
- start_time + TimeDelta::FromMilliseconds(next_message_delay_ms)),
- protocol_handler->GetNextMessageSendTimeMsForTest());
-
- // Request to send an info message, and check that it doesn't get sent.
- vector<pair<string, int> > empty_vector;
- internal_scheduler->Schedule(
- Scheduler::NoDelay(),
- NewPermanentCallback(
- protocol_handler.get(), &ProtocolHandler::SendInfoMessage,
- empty_vector, NULL, false, batching_task.get()));
-
- // Keep simulating passage of time until just before the quiet period ends.
- // Nothing should be sent. (The mock network will catch any attempts to send
- // and fail the test.)
- internal_scheduler->PassTime(
- TimeDelta::FromMilliseconds(next_message_delay_ms - 1));
-}
-
-// Test that the protocol handler properly delivers an error message to the
-// listener.
-TEST_F(ProtocolHandlerTest, ErrorMessage) {
- // Fabricate an error message.
- ServerToClientMessage message;
- token = "test token";
- InitServerHeader(token, message.mutable_header());
-
- // Add an error message.
- ErrorMessage::Code error_code = ErrorMessage_Code_AUTH_FAILURE;
- string description = "invalid auth token";
- InitErrorMessage(error_code, description, message.mutable_error_message());
- ServerMessageHeader expected_header;
- expected_header.InitFrom(&token, &summary);
-
- // Deliver the message.
- ParsedMessage parsed_message;
- ProcessMessage(message, &parsed_message);
- ASSERT_TRUE(HeaderEqual(expected_header, parsed_message.header));
- ASSERT_TRUE(parsed_message.error_message != NULL);
-}
-
-// Tests that the protocol handler accepts a message from the server if the
-// token doesn't match the client's (the caller is responsible for checking
-// the token).
-TEST_F(ProtocolHandlerTest, TokenMismatch) {
- // Create the server message with one token.
- token = "test token";
- ServerToClientMessage message;
- InitServerHeader(token, message.mutable_header());
-
- // Give the client a different token.
- token = "token-that-should-mismatch";
-
- // Deliver the message.
- ParsedMessage parsed_message;
- bool accepted = ProcessMessage(message, &parsed_message);
- ASSERT_TRUE(accepted);
-
- ASSERT_EQ(0, statistics->GetClientErrorCounterForTest(
- Statistics::ClientErrorType_TOKEN_MISMATCH));
-}
-
-// Tests that the protocol handler won't send out a non-initialize message if
-// the client has no token.
-TEST_F(ProtocolHandlerTest, TokenMissing) {
- token = "";
- vector<pair<string, int> > empty_vector;
-
- internal_scheduler->Schedule(
- Scheduler::NoDelay(),
- NewPermanentCallback(
- protocol_handler.get(),
- &ProtocolHandler::SendInfoMessage, empty_vector, NULL, true,
- batching_task.get()));
-
- internal_scheduler->PassTime(GetMaxBatchingDelay(config));
-
- ASSERT_EQ(1, statistics->GetClientErrorCounterForTest(
- Statistics::ClientErrorType_TOKEN_MISSING_FAILURE));
-}
-
-// Tests that the protocol handler won't send out a message that fails
-// validation (in this case, an invalidation ack with a missing version).
-TEST_F(ProtocolHandlerTest, InvalidOutboundMessage) {
- token = "test token";
-
- vector<ObjectIdP> object_ids;
- InitTestObjectIds(1, &object_ids);
- vector<InvalidationP> invalidations;
- MakeInvalidationsFromObjectIds(object_ids, &invalidations);
- invalidations[0].clear_version();
-
- internal_scheduler->Schedule(
- Scheduler::NoDelay(),
- NewPermanentCallback(
- protocol_handler.get(),
- &ProtocolHandler::SendInvalidationAck,
- invalidations[0],
- batching_task.get()));
-
- internal_scheduler->PassTime(GetMaxBatchingDelay(config));
-
- ASSERT_EQ(1, statistics->GetClientErrorCounterForTest(
- Statistics::ClientErrorType_OUTGOING_MESSAGE_FAILURE));
-}
-
-// Tests that the protocol handler drops an unparseable message.
-TEST_F(ProtocolHandlerTest, UnparseableInboundMessage) {
- // Make an unparseable message.
- string serialized = "this can't be a valid protocol buffer!";
- ParsedMessage parsed_message;
- bool accepted = protocol_handler->HandleIncomingMessage(serialized,
- &parsed_message);
- ASSERT_FALSE(accepted);
-}
-
-} // namespace invalidation
diff --git a/google/cacheinvalidation/impl/recurring-task.cc b/google/cacheinvalidation/impl/recurring-task.cc
deleted file mode 100644
index 3196c8f..0000000
--- a/google/cacheinvalidation/impl/recurring-task.cc
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// An abstraction for scheduling recurring tasks.
-//
-
-#include "google/cacheinvalidation/impl/recurring-task.h"
-#include "google/cacheinvalidation/impl/log-macro.h"
-
-namespace invalidation {
-
-RecurringTask::RecurringTask(string name, Scheduler* scheduler, Logger* logger,
- Smearer* smearer, ExponentialBackoffDelayGenerator* delay_generator,
- TimeDelta initial_delay, TimeDelta timeout_delay) : name_(name),
- scheduler_(scheduler), logger_(logger), smearer_(smearer),
- delay_generator_(delay_generator), initial_delay_(initial_delay),
- timeout_delay_(timeout_delay), is_scheduled_(false) {
-}
-
-void RecurringTask::EnsureScheduled(string debug_reason) {
- RecurringTask::EnsureScheduled(false, debug_reason);
-}
-
-void RecurringTask::EnsureScheduled(bool is_retry, string debug_reason) {
- CHECK(scheduler_->IsRunningOnThread());
- if (is_scheduled_) {
- return;
- }
- TimeDelta delay;
- if (is_retry) {
- // For a retried task, determine the delay to be timeout + extra delay
- // (depending on whether a delay generator was provided or not).
- if (delay_generator_.get() != NULL) {
- delay = timeout_delay_ + delay_generator_->GetNextDelay();
- } else {
- delay = timeout_delay_ + smearer_->GetSmearedDelay(initial_delay_);
- }
- } else {
- delay = smearer_->GetSmearedDelay(initial_delay_);
- }
-
- TLOG(logger_, FINE, "[%s] Scheduling %d with a delay %d, Now = %d",
- debug_reason.c_str(), name_.c_str(), delay.ToInternalValue(),
- scheduler_->GetCurrentTime().ToInternalValue());
- scheduler_->Schedule(delay, NewPermanentCallback(this,
- &RecurringTask::RunTaskAndRescheduleIfNeeded));
- is_scheduled_ = true;
-}
-
-void RecurringTask::RunTaskAndRescheduleIfNeeded() {
- CHECK(scheduler_->IsRunningOnThread()) << "Not on scheduler thread";
- is_scheduled_ = false;
-
- // Run the task. If the task asks for a retry, reschedule it after at a
- // timeout delay. Otherwise, resets the delay_generator.
- if (RunTask()) {
- // The task asked to be rescheduled, so reschedule it after a timeout has
- // occurred.
- CHECK((delay_generator_ != NULL) ||
- (initial_delay_ > Scheduler::NoDelay()))
- << "Spinning: No exp back off and initial delay is zero";
- EnsureScheduled(true, "Retry");
- } else if (delay_generator_ != NULL) {
- // The task asked not to be rescheduled. Treat it as having "succeeded"
- // and reset the delay generator.
- delay_generator_->Reset();
- }
-}
-
-} // namespace invalidation
diff --git a/google/cacheinvalidation/impl/recurring-task.h b/google/cacheinvalidation/impl/recurring-task.h
deleted file mode 100644
index 492a0f0..0000000
--- a/google/cacheinvalidation/impl/recurring-task.h
+++ /dev/null
@@ -1,128 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-//
-// An abstraction for scheduling recurring tasks. Combines idempotent scheduling
-// and smearing with conditional retries and exponential backoff. Does not
-// implement throttling. Designed to support a variety of use cases, including
-// the following capabilities.
-//
-// * Idempotent scheduling, e.g., ensuring that a batching task is scheduled
-// exactly once.
-// * Recurring tasks, e.g., periodic heartbeats.
-// * Retriable actions aimed at state change, e.g., sending initialization
-// messages.
-//
-// Each instance of this class manages the state for a single task. See the
-// invalidation-client-impl.cc for examples.
-
-#ifndef GOOGLE_CACHEINVALIDATION_IMPL_RECURRING_TASK_H_
-#define GOOGLE_CACHEINVALIDATION_IMPL_RECURRING_TASK_H_
-
-#include "google/cacheinvalidation/include/system-resources.h"
-#include "google/cacheinvalidation/impl/exponential-backoff-delay-generator.h"
-#include "google/cacheinvalidation/impl/smearer.h"
-
-namespace invalidation {
-
-class RecurringTask {
- public:
- /* Creates a recurring task with the given parameters. The specs of the
- * parameters are given in the instance variables.
- *
- * The created task is first scheduled with a smeared delay of
- * |initial_delay|. If the |this->run()| returns true on its execution, the
- * task is rescheduled after a |timeout_delay| + smeared delay of
- * |initial_delay| or |timeout_delay| + |delay_generator->GetNextDelay()|
- * depending on whether the |delay_generator| is null or not.
- *
- * Space for |scheduler|, |logger|, |smearer| is owned by the caller.
- * Space for |delay_generator| is owned by the callee.
- */
- RecurringTask(string name, Scheduler* scheduler, Logger* logger,
- Smearer* smearer, ExponentialBackoffDelayGenerator* delay_generator,
- TimeDelta initial_delay, TimeDelta timeout_delay);
-
- virtual ~RecurringTask() {}
-
- /* Run the task and return true if the task should be rescheduled after a
- * timeout. If false is returned, the task is not scheduled again until
- * |ensure_scheduled| is called again.
- */
- virtual bool RunTask() = 0;
-
- /* Ensures that the task is scheduled (with |debug_reason| as the reason to be
- * printed for debugging purposes). If the task has been scheduled, it is
- * not scheduled again.
- *
- * REQUIRES: Must be called from the scheduler thread.
- */
- void EnsureScheduled(string debug_reason);
-
- /* Space for the returned Smearer is still owned by this class. */
- Smearer* smearer() {
- return smearer_;
- }
-
- private:
- /* Run the task and check if it needs to be rescheduled. If so, reschedule it
- * after the appropriate delay.
- */
- void RunTaskAndRescheduleIfNeeded();
-
- /* Ensures that the task is scheduled if it is already not scheduled. If
- * already scheduled, this method is a no-op. If |is_retry| is |false|, smears
- * the |initial_delay_| and uses that delay for scheduling. If |is_retry| is
- * true, it determines the new delay to be
- * |timeout_delay_ + delay_generator.GetNextDelay()| if |delay_generator| is
- * non-null. If |delay_generator| is null, schedules the task after a delay of
- * |timeout_delay_| + smeared value of |initial_delay_|.
- *
- * REQUIRES: Must be called from the scheduler thread.
- */
- void EnsureScheduled(bool is_retry, string debug_reason);
-
- /* Name of the task (for debugging purposes mostly). */
- string name_;
-
- /* Scheduler for the scheduling the task as needed. */
- Scheduler* scheduler_;
-
- /* A logger. */
- Logger* logger_;
-
- /* A smearer for spreading the delays. */
- Smearer* smearer_;
-
- /* A delay generator for exponential backoff. */
- scoped_ptr<ExponentialBackoffDelayGenerator> delay_generator_;
-
- /*
- * The time after which the task is scheduled first. If no delayGenerator is
- * specified, this is also the delay used for retries.
- */
- TimeDelta initial_delay_;
-
- /* For a task that is retried, add this time to the delay. */
- TimeDelta timeout_delay_;
-
- /* If the task has been currently scheduled. */
- bool is_scheduled_;
-
- DISALLOW_COPY_AND_ASSIGN(RecurringTask);
-};
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_IMPL_RECURRING_TASK_H_
diff --git a/google/cacheinvalidation/impl/recurring-task_test.cc b/google/cacheinvalidation/impl/recurring-task_test.cc
deleted file mode 100644
index cbe45e2..0000000
--- a/google/cacheinvalidation/impl/recurring-task_test.cc
+++ /dev/null
@@ -1,236 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Unit tests for the RecurringTask class.
-
-#include "google/cacheinvalidation/client_test_internal.pb.h"
-#include "google/cacheinvalidation/deps/googletest.h"
-#include "google/cacheinvalidation/deps/random.h"
-#include "google/cacheinvalidation/deps/string_util.h"
-#include "google/cacheinvalidation/impl/recurring-task.h"
-#include "google/cacheinvalidation/test/deterministic-scheduler.h"
-#include "google/cacheinvalidation/test/test-logger.h"
-#include "google/cacheinvalidation/test/test-utils.h"
-
-namespace invalidation {
-
-class RecurringTaskTest;
-
-/* A Test task that tracks how many times it has been called and returns
- * true when the number of times, it has been called is less than the expected
- * number.
- */
-class TestTask : public RecurringTask {
- public:
- /* Initial delay used by the TestTask. */
- static TimeDelta initial_delay;
-
- /* Timeout delay used by the TestTask. */
- static TimeDelta timeout_delay;
-
- /* Creates a test task.
- *
- * |scheduler| Scheduler for the scheduling the task as needed.
- * |logger| A logger.
- * |smearer| For spreading/randomizing the delays.
- * |delay_generator| An exponential backoff generator for task retries (if
- * any).
- * |test_name| The name of the current test.
- * |max_runs| Maximum number of runs that are allowed.
- *
- * Space for all the objects with pointers is owned by the caller.
- */
- TestTask(Scheduler* scheduler, Logger* logger, Smearer* smearer,
- ExponentialBackoffDelayGenerator* delay_generator,
- const string& test_name, int max_runs)
- : RecurringTask(test_name, scheduler, logger, smearer, delay_generator,
- initial_delay, timeout_delay),
- current_runs(0),
- max_runs_(max_runs),
- scheduler_(scheduler),
- logger_(logger) {
- }
-
- virtual ~TestTask() {}
-
- // The actual implementation as required by the RecurringTask.
- virtual bool RunTask() {
- current_runs++;
- TLOG(logger_, INFO, "(%d) Task running: %d",
- scheduler_->GetCurrentTime().ToInternalValue(), current_runs);
- return current_runs < max_runs_;
- }
-
- /* The number of times that the task has been run. */
- int current_runs;
-
- private:
- /* Maximum number of runs that are allowed. */
- int max_runs_;
-
- /* Scheduler for the task. */
- Scheduler* scheduler_;
-
- /* A logger. */
- Logger* logger_;
-};
-
-// Tests the basic functionality of the RecurringTask abstraction.
-class RecurringTaskTest : public testing::Test {
- public:
- virtual ~RecurringTaskTest() {}
-
- // Performs setup for RecurringTask test.
- virtual void SetUp() {
- // Initialize values that are really constants.
- initial_exp_backoff_delay = TimeDelta::FromMilliseconds(100);
- TestTask::initial_delay = TimeDelta::FromMilliseconds(10);
- TestTask::timeout_delay = TimeDelta::FromMilliseconds(50);
- end_of_test_delay = 1000 * TestTask::timeout_delay;
-
- // Initialize state for every test.
- random.reset(new FakeRandom(0.99)); // The test expects a value close to 1.
- logger.reset(new TestLogger());
- scheduler.reset(new SimpleDeterministicScheduler(logger.get()));
- smearer.reset(new Smearer(random.get(), 0));
- delay_generator = new ExponentialBackoffDelayGenerator(
- random.get(), initial_exp_backoff_delay, kMaxExpBackoffFactor);
- scheduler->StartScheduler();
- }
-
- /* Maximum delay factory used by the ExponentialBackoffDelayGenerator. */
- static const int kMaxExpBackoffFactor;
-
- /* Default number of runs that runTask is called in TestTask. */
- static const int kDefaultNumRuns;
-
- /* Initial delay used by the ExponentialBackoffDelayGenerator. */
- static TimeDelta initial_exp_backoff_delay;
-
- /* A long time delay that the scheduler is run for at the end of the test. */
- static TimeDelta end_of_test_delay;
-
- //
- // Test state maintained for every test.
- //
-
- // A logger.
- scoped_ptr<Logger> logger;
-
- // Deterministic scheduler for careful scheduling of the tasks.
- scoped_ptr<DeterministicScheduler> scheduler;
-
- // For randomizing delays.
- scoped_ptr<Smearer> smearer;
-
- // A random number generator that always generates 1.
- scoped_ptr<Random> random;
-
- // A delay generator (if used in the test). Not a scoped_ptr since it ends
- // up being owned by the RecurringTask.
- ExponentialBackoffDelayGenerator* delay_generator;
-};
-
-// Definitions for the static variables.
-TimeDelta TestTask::initial_delay;
-TimeDelta TestTask::timeout_delay;
-TimeDelta RecurringTaskTest::initial_exp_backoff_delay;
-TimeDelta RecurringTaskTest::end_of_test_delay;
-const int RecurringTaskTest::kMaxExpBackoffFactor = 10;
-const int RecurringTaskTest::kDefaultNumRuns = 8;
-
-/* Tests a task that is run periodically at regular intervals (not exponential
- * backoff).
- */
-TEST_F(RecurringTaskTest, PeriodicTask) {
- /* Create a periodic task and pass time - make sure that the task runs exactly
- * the number of times as expected.
- */
- TestTask task(scheduler.get(), logger.get(), smearer.get(), NULL,
- "PeriodicTask", kDefaultNumRuns);
- task.EnsureScheduled("testPeriodicTask");
-
- TimeDelta delay = TestTask::initial_delay + TestTask::timeout_delay;
-
- // Pass time so that the task is run kDefaultNumRuns times.
- // First time, the task is scheduled after initial_delay. Then for
- // numRuns - 1, it is scheduled after a delay of
- // initial_delay + timeout_delay.
- scheduler->PassTime(TestTask::initial_delay +
- ((kDefaultNumRuns - 1) * delay));
- ASSERT_EQ(kDefaultNumRuns, task.current_runs);
-
- // Check that the passage of more time does not cause any more runs.
- scheduler->PassTime(end_of_test_delay);
- ASSERT_EQ(kDefaultNumRuns, task.current_runs);
- delete delay_generator;
-}
-
-/* Tests a task that is run periodically at regular intervals with
- * exponential backoff.
- */
-TEST_F(RecurringTaskTest, ExponentialBackoffTask) {
- /* Create a periodic task and pass time - make sure that the task runs
- * exactly the number of times as expected.
- */
- TestTask task(scheduler.get(), logger.get(), smearer.get(),
- delay_generator, "ExponentialBackoffTask", kDefaultNumRuns);
- task.EnsureScheduled("testExponentialBackoffTask");
-
- // Pass enough time so that exactly one event runs, two events run etc.
- scheduler->PassTime(TestTask::initial_delay);
- ASSERT_EQ(1, task.current_runs);
- scheduler->PassTime(TestTask::timeout_delay + initial_exp_backoff_delay);
- ASSERT_EQ(2, task.current_runs);
- scheduler->PassTime(
- TestTask::timeout_delay + (2 * initial_exp_backoff_delay));
- ASSERT_EQ(3, task.current_runs);
- scheduler->PassTime(
- TestTask::timeout_delay + (4 * initial_exp_backoff_delay));
- ASSERT_EQ(4, task.current_runs);
-
- // Check that the passage of more time does not cause any more runs.
- scheduler->PassTime(end_of_test_delay);
- ASSERT_EQ(kDefaultNumRuns, task.current_runs);
-}
-
-/* Tests a one-shot task (i.e. no repetition) that is run twice. */
-TEST_F(RecurringTaskTest, OneShotTask) {
- /* Create a no-repeating task and pass time - make sure that the task runs
- * exactly once. Run it again - and make sure it is run again.
- */
-
- // Call ensureScheduled multiple times; ensure that the event is not scheduled
- // multiple times.
- TestTask task(scheduler.get(), logger.get(), smearer.get(),
- delay_generator, "OneShotTask", 1);
- task.EnsureScheduled("testOneShotTask");
- task.EnsureScheduled("testOneShotTask-2");
- task.EnsureScheduled("testOneShotTask-3");
-
- // Pass enough time so that exactly one event runs.
- scheduler->PassTime(TestTask::initial_delay);
- ASSERT_EQ(1, task.current_runs);
-
- // Pass enough time so that exactly another event runs.
- task.EnsureScheduled("testOneShotTask-4");
- scheduler->PassTime(TestTask::initial_delay);
- ASSERT_EQ(2, task.current_runs);
-
- // Check that the passage of more time does not cause any more runs.
- scheduler->PassTime(end_of_test_delay);
- ASSERT_EQ(2, task.current_runs);
-}
-
-} // namespace invalidation
diff --git a/google/cacheinvalidation/impl/registration-manager.cc b/google/cacheinvalidation/impl/registration-manager.cc
deleted file mode 100644
index 3e4574e..0000000
--- a/google/cacheinvalidation/impl/registration-manager.cc
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Object to track desired client registrations. This class belongs to caller
-// (e.g., InvalidationClientImpl) and is not thread-safe - the caller has to use
-// this class in a thread-safe manner.
-
-#include "google/cacheinvalidation/impl/registration-manager.h"
-
-#include "google/cacheinvalidation/impl/client-protocol-namespace-fix.h"
-#include "google/cacheinvalidation/impl/log-macro.h"
-#include "google/cacheinvalidation/impl/proto-helpers.h"
-#include "google/cacheinvalidation/impl/simple-registration-store.h"
-
-namespace invalidation {
-
-RegistrationManager::RegistrationManager(
- Logger* logger, Statistics* statistics, DigestFunction* digest_function)
- : desired_registrations_(new SimpleRegistrationStore(digest_function)),
- statistics_(statistics),
- logger_(logger) {
- // Initialize the server summary with a 0 size and the digest corresponding to
- // it. Using defaultInstance would wrong since the server digest will not
- // match unnecessarily and result in an info message being sent.
- GetClientSummary(&last_known_server_summary_);
-}
-
-void RegistrationManager::PerformOperations(
- const vector<ObjectIdP>& object_ids, RegistrationP::OpType reg_op_type,
- vector<ObjectIdP>* oids_to_send) {
- // Record that we have pending operations on the objects.
- vector<ObjectIdP>::const_iterator iter = object_ids.begin();
- for (; iter != object_ids.end(); iter++) {
- pending_operations_[*iter] = reg_op_type;
- }
- // Update the digest appropriately.
- if (reg_op_type == RegistrationP_OpType_REGISTER) {
- desired_registrations_->Add(object_ids, oids_to_send);
- } else {
- desired_registrations_->Remove(object_ids, oids_to_send);
- }
-}
-
-void RegistrationManager::GetRegistrations(
- const string& digest_prefix, int prefix_len, RegistrationSubtree* builder) {
- vector<ObjectIdP> oids;
- desired_registrations_->GetElements(digest_prefix, prefix_len, &oids);
- for (size_t i = 0; i < oids.size(); ++i) {
- builder->add_registered_object()->CopyFrom(oids[i]);
- }
-}
-
-void RegistrationManager::HandleRegistrationStatus(
- const RepeatedPtrField<RegistrationStatus>& registration_statuses,
- vector<bool>* success_status) {
-
- // Local-processing result code for each element of
- // registrationStatuses. Indicates whether the registration status was
- // compatible with the client's desired state (e.g., a successful unregister
- // from the server when we desire a registration is incompatible).
- for (int i = 0; i < registration_statuses.size(); ++i) {
- const RegistrationStatus& registration_status =
- registration_statuses.Get(i);
- const ObjectIdP& object_id_proto =
- registration_status.registration().object_id();
-
- // The object is no longer pending, since we have received a server status
- // for it, so remove it from the pendingOperations map. (It may or may not
- // have existed in the map, since we can receive spontaneous status messages
- // from the server.)
- pending_operations_.erase(object_id_proto);
-
- // We start off with the local-processing set as success, then potentially
- // fail.
- bool is_success = true;
-
- // if the server operation succeeded, then local processing fails on
- // "incompatibility" as defined above.
- if (registration_status.status().code() == StatusP_Code_SUCCESS) {
- bool app_wants_registration =
- desired_registrations_->Contains(object_id_proto);
- bool is_op_registration =
- (registration_status.registration().op_type() ==
- RegistrationP_OpType_REGISTER);
- bool discrepancy_exists = is_op_registration ^ app_wants_registration;
- if (discrepancy_exists) {
- // Remove the registration and set isSuccess to false, which will cause
- // the caller to issue registration-failure to the application.
- desired_registrations_->Remove(object_id_proto);
- statistics_->RecordError(
- Statistics::ClientErrorType_REGISTRATION_DISCREPANCY);
- TLOG(logger_, INFO,
- "Ticl discrepancy detected: registered = %d, requested = %d. "
- "Removing %s from requested",
- is_op_registration, app_wants_registration,
- ProtoHelpers::ToString(object_id_proto).c_str());
- is_success = false;
- }
- } else {
- // If the server operation failed, then local processing also fails.
- desired_registrations_->Remove(object_id_proto);
- TLOG(logger_, FINE, "Removing %s from committed",
- ProtoHelpers::ToString(object_id_proto).c_str());
- is_success = false;
- }
- success_status->push_back(is_success);
- }
-}
-
-void RegistrationManager::GetClientSummary(RegistrationSummary* summary) {
- summary->set_num_registrations(desired_registrations_->size());
- summary->set_registration_digest(desired_registrations_->GetDigest());
-}
-
-string RegistrationManager::ToString() {
- return StringPrintf(
- "Last known digest: %s, Requested regs: %s",
- ProtoHelpers::ToString(last_known_server_summary_).c_str(),
- desired_registrations_->ToString().c_str());
-}
-
-const char* RegistrationManager::kEmptyPrefix = "";
-
-} // namespace invalidation
diff --git a/google/cacheinvalidation/impl/registration-manager.h b/google/cacheinvalidation/impl/registration-manager.h
deleted file mode 100644
index 3490399..0000000
--- a/google/cacheinvalidation/impl/registration-manager.h
+++ /dev/null
@@ -1,198 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Object to track desired client registrations. This class belongs to caller
-// (e.g., InvalidationClientImpl) and is not thread-safe - the caller has to use
-// this class in a thread-safe manner.
-
-#ifndef GOOGLE_CACHEINVALIDATION_IMPL_REGISTRATION_MANAGER_H_
-#define GOOGLE_CACHEINVALIDATION_IMPL_REGISTRATION_MANAGER_H_
-
-#include <map>
-#include <set>
-
-#include "google/cacheinvalidation/include/system-resources.h"
-#include "google/cacheinvalidation/deps/digest-function.h"
-#include "google/cacheinvalidation/deps/scoped_ptr.h"
-#include "google/cacheinvalidation/impl/client-protocol-namespace-fix.h"
-#include "google/cacheinvalidation/impl/digest-store.h"
-#include "google/cacheinvalidation/impl/proto-helpers.h"
-#include "google/cacheinvalidation/impl/statistics.h"
-
-namespace invalidation {
-
-using INVALIDATION_STL_NAMESPACE::map;
-using INVALIDATION_STL_NAMESPACE::set;
-
-class RegistrationManager {
- public:
- RegistrationManager(Logger* logger, Statistics* statistics,
- DigestFunction* digest_function);
-
- /* Sets the digest store to be digest_store for testing purposes.
- *
- * REQUIRES: This method is called before the Ticl has done any operations on
- * this object.
- */
- void SetDigestStoreForTest(DigestStore<ObjectIdP>* digest_store) {
- desired_registrations_.reset(digest_store);
- GetClientSummary(&last_known_server_summary_);
- }
-
- void GetRegisteredObjectsForTest(vector<ObjectIdP>* registrations) {
- desired_registrations_->GetElements(kEmptyPrefix, 0, registrations);
- }
-
- /* (Un)registers for object_ids. When the function returns, oids_to_send will
- * have been modified to contain those object ids for which registration
- * messages must be sent to the server.
- */
- void PerformOperations(const vector<ObjectIdP>& object_ids,
- RegistrationP::OpType reg_op_type,
- vector<ObjectIdP>* oids_to_send);
-
- /* Initializes a registration subtree for registrations where the digest of
- * the object id begins with the prefix digest_prefix of prefix_len bits. This
- * method may also return objects whose digest prefix does not match
- * digest_prefix.
- */
- void GetRegistrations(const string& digest_prefix, int prefix_len,
- RegistrationSubtree* builder);
-
- /*
- * Handles registration operation statuses from the server. Modifies |result|
- * to contain one boolean per registration status, that indicates whether the
- * registration operation was both successful and agreed with the desired
- * client state (i.e., for each registration status,
- * (status.optype == register) ==
- * desiredRegistrations.contains(status.objectid)).
- * <p>
- * REQUIRES: the caller subsequently make an informRegistrationStatus or
- * informRegistrationFailure upcall on the listener for each registration in
- * {@code registrationStatuses}.
- */
- void HandleRegistrationStatus(
- const RepeatedPtrField<RegistrationStatus>& registration_statuses,
- vector<bool>* result);
-
- /*
- * Removes all desired registrations and pending operations. Returns all
- * object ids that were affected.
- * <p>
- * REQUIRES: the caller issue a permanent failure upcall to the listener for
- * all returned object ids.
- */
- void RemoveRegisteredObjects(vector<ObjectIdP>* result) {
- // Add the formerly desired- and pending- registrations to result.
- desired_registrations_->RemoveAll(result);
- map<ObjectIdP, RegistrationP::OpType, ProtoCompareLess>::iterator
- pending_iter = pending_operations_.begin();
- for (; pending_iter != pending_operations_.end(); pending_iter++) {
- result->push_back(pending_iter->first);
- }
- pending_operations_.clear();
-
- // De-dup result.
- set<ObjectIdP, ProtoCompareLess> unique_oids(result->begin(),
- result->end());
- result->assign(unique_oids.begin(), unique_oids.end());
- }
-
- //
- // Digest-related methods
- //
-
- /* Modifies client_summary to contain the summary of the desired
- * registrations (by the client). */
- void GetClientSummary(RegistrationSummary* client_summary);
-
- /* Modifies server_summary to contain the last known summary from the server.
- * If none, modifies server_summary to contain the summary corresponding
- * to 0 registrations. */
- void GetServerSummary(RegistrationSummary* server_summary) {
- server_summary->CopyFrom(last_known_server_summary_);
- }
-
- /* Informs the manager of a new registration state summary from the server.
- * Modifies upcalls to contain zero or more RegistrationP. For each added
- * RegistrationP, the caller should make an inform-registration-status upcall
- * on the listener.
- */
- void InformServerRegistrationSummary(const RegistrationSummary& reg_summary,
- vector<RegistrationP>* upcalls) {
- last_known_server_summary_.CopyFrom(reg_summary);
- if (IsStateInSyncWithServer()) {
- // If we are now in sync with the server, then the caller should make
- // inform-reg-status upcalls for all operations that we had pending, if
- // any; they are also no longer pending.
- map<ObjectIdP, RegistrationP::OpType, ProtoCompareLess>::iterator
- pending_iter = pending_operations_.begin();
- for (; pending_iter != pending_operations_.end(); pending_iter++) {
- RegistrationP reg_p;
- ProtoHelpers::InitRegistrationP(pending_iter->first,
- pending_iter->second, ®_p);
- upcalls->push_back(reg_p);
- }
- pending_operations_.clear();
- }
- }
-
- /* Returns whether the local registration state and server state agree, based
- * on the last received server summary (from InformServerRegistrationSummary).
- */
- bool IsStateInSyncWithServer() {
- RegistrationSummary summary;
- GetClientSummary(&summary);
- return (last_known_server_summary_.num_registrations() ==
- summary.num_registrations()) &&
- (last_known_server_summary_.registration_digest() ==
- summary.registration_digest());
- }
-
- string ToString();
-
- // Empty hash prefix.
- static const char* kEmptyPrefix;
-
- private:
- /* The set of regisrations that the application has requested for. */
- scoped_ptr<DigestStore<ObjectIdP> > desired_registrations_;
-
- /* Statistics objects to track number of sent messages, etc. */
- Statistics* statistics_;
-
- /* Latest known server registration state summary. */
- RegistrationSummary last_known_server_summary_;
-
- /*
- * Map of object ids and operation types for which we have not yet issued any
- * registration-status upcall to the listener. We need this so that we can
- * synthesize success upcalls if registration sync, rather than a server
- * message, communicates to us that we have a successful (un)registration.
- * <p>
- * This is a map from object id to type, rather than a set of RegistrationP,
- * because a set of RegistrationP would assume that we always get a response
- * for every operation we issue, which isn't necessarily true (i.e., the
- * server might send back an unregistration status in response to a
- * registration request).
- */
- map<ObjectIdP, RegistrationP::OpType, ProtoCompareLess>
- pending_operations_;
-
- Logger* logger_;
-};
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_IMPL_REGISTRATION_MANAGER_H_
diff --git a/google/cacheinvalidation/impl/repeated-field-namespace-fix.h b/google/cacheinvalidation/impl/repeated-field-namespace-fix.h
deleted file mode 100644
index 94ba25a..0000000
--- a/google/cacheinvalidation/impl/repeated-field-namespace-fix.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2013 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-//
-// Brings RepeatedField classes into invalidation namespace.
-
-#ifndef GOOGLE_CACHEINVALIDATION_IMPL_REPEATED_FIELD_NAMESPACE_FIX_H_
-#define GOOGLE_CACHEINVALIDATION_IMPL_REPEATED_FIELD_NAMESPACE_FIX_H_
-
-#include "google/protobuf/repeated_field.h"
-
-namespace invalidation {
-
-using ::google::protobuf::RepeatedField;
-using ::google::protobuf::RepeatedPtrField;
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_IMPL_REPEATED_FIELD_NAMESPACE_FIX_H_
diff --git a/google/cacheinvalidation/impl/run-state.h b/google/cacheinvalidation/impl/run-state.h
deleted file mode 100644
index f330438..0000000
--- a/google/cacheinvalidation/impl/run-state.h
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// An abstraction that keeps track of whether the caller is started or stopped
-// and only allows the following transitions NOT_STARTED -> STARTED ->
-// STOPPED. This class is thread-safe.
-
-#ifndef GOOGLE_CACHEINVALIDATION_IMPL_RUN_STATE_H_
-#define GOOGLE_CACHEINVALIDATION_IMPL_RUN_STATE_H_
-
-#include "google/cacheinvalidation/client.pb.h"
-#include "google/cacheinvalidation/deps/logging.h"
-#include "google/cacheinvalidation/deps/mutex.h"
-#include "google/cacheinvalidation/deps/string_util.h"
-
-namespace invalidation {
-
-using ::ipc::invalidation::RunStateP_State;
-using ::ipc::invalidation::RunStateP_State_NOT_STARTED;
-using ::ipc::invalidation::RunStateP_State_STARTED;
-using ::ipc::invalidation::RunStateP_State_STOPPED;
-
-class RunState {
- public:
- RunState() : current_state_(RunStateP_State_NOT_STARTED) {}
-
- /* Marks the current state to be STARTED.
- *
- * REQUIRES: Current state is NOT_STARTED.
- */
- void Start() {
- MutexLock m(&lock_);
- CHECK(current_state_ == RunStateP_State_NOT_STARTED) << "Cannot start: "
- << current_state_;
- current_state_ = RunStateP_State_STARTED;
- }
-
- /* Marks the current state to be STOPPED.
- *
- * REQUIRES: Current state is STARTED.
- */
- void Stop() {
- MutexLock m(&lock_);
- CHECK(current_state_ == RunStateP_State_STARTED) << "Cannot stop: "
- << current_state_;
- current_state_ = RunStateP_State_STOPPED;
- }
-
- /* Returns true iff Start has been called on this but Stop has not been
- * called.
- */
- bool IsStarted() const {
- // Don't treat locking a mutex as mutation.
- MutexLock m((Mutex *) &lock_); // NOLINT
- return current_state_ == RunStateP_State_STARTED;
- }
-
- /* Returns true iff Start and Stop have been called on this object. */
- bool IsStopped() const {
- // Don't treat locking a mutex as mutation.
- MutexLock m((Mutex *) &lock_); // NOLINT
- return current_state_ == RunStateP_State_STOPPED;
- }
-
- string ToString() {
- return StringPrintf("<RunState %d>", current_state_);
- }
-
- private:
- RunStateP_State current_state_;
- Mutex lock_;
-};
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_IMPL_RUN_STATE_H_
diff --git a/google/cacheinvalidation/impl/safe-storage.cc b/google/cacheinvalidation/impl/safe-storage.cc
deleted file mode 100644
index f418fbd..0000000
--- a/google/cacheinvalidation/impl/safe-storage.cc
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// An implementation of the Storage resource that schedules the callbacks on the
-// given scheduler thread.
-//
-
-#include "google/cacheinvalidation/impl/safe-storage.h"
-
-namespace invalidation {
-
-void SafeStorage::SetSystemResources(SystemResources* resources) {
- scheduler_ = resources->internal_scheduler();
-}
-
-void SafeStorage::WriteKey(const string& key, const string& value,
- WriteKeyCallback* done) {
- delegate_->WriteKey(key, value,
- NewPermanentCallback(this, &SafeStorage::WriteCallback, done));
-}
-
-void SafeStorage::WriteCallback(WriteKeyCallback* done, Status status) {
- scheduler_->Schedule(
- Scheduler::NoDelay(),
- /* Owns 'done'. */ NewPermanentCallback(done, status));
-}
-
-void SafeStorage::ReadKey(const string& key, ReadKeyCallback* done) {
- delegate_->ReadKey(key,
- NewPermanentCallback(this, &SafeStorage::ReadCallback, done));
-}
-
-void SafeStorage::ReadCallback(ReadKeyCallback* done,
- StatusStringPair read_result) {
- scheduler_->Schedule(
- Scheduler::NoDelay(),
- /* Owns 'done'. */ NewPermanentCallback(done, read_result));
-}
-
-void SafeStorage::DeleteKey(const string& key, DeleteKeyCallback* done) {
- delegate_->DeleteKey(key,
- NewPermanentCallback(this, &SafeStorage::DeleteCallback, done));
-}
-
-void SafeStorage::DeleteCallback(DeleteKeyCallback* done, bool result) {
- scheduler_->Schedule(
- Scheduler::NoDelay(),
- /* Owns 'done'. */ NewPermanentCallback(done, result));
-}
-
-void SafeStorage::ReadAllKeys(ReadAllKeysCallback* key_callback) {
- delegate_->ReadAllKeys(
- NewPermanentCallback(this, &SafeStorage::ReadAllCallback, key_callback));
-}
-
-void SafeStorage::ReadAllCallback(ReadAllKeysCallback* key_callback,
- StatusStringPair result) {
- scheduler_->Schedule(
- Scheduler::NoDelay(),
- /* Owns 'key_callback'. */ NewPermanentCallback(key_callback, result));
-}
-
-} // namespace invalidation
diff --git a/google/cacheinvalidation/impl/safe-storage.h b/google/cacheinvalidation/impl/safe-storage.h
deleted file mode 100644
index b6ec2dc..0000000
--- a/google/cacheinvalidation/impl/safe-storage.h
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-//
-// An implementation of the Storage resource that schedules the callbacks on the
-// given scheduler thread.
-
-#ifndef GOOGLE_CACHEINVALIDATION_IMPL_SAFE_STORAGE_H_
-#define GOOGLE_CACHEINVALIDATION_IMPL_SAFE_STORAGE_H_
-
-#include "google/cacheinvalidation/include/system-resources.h"
-#include "google/cacheinvalidation/include/types.h"
-
-namespace invalidation {
-
-// An implementation of the Storage resource that schedules the callbacks on the
-// given scheduler thread.
-class SafeStorage : public Storage {
- public:
- /* Creates a new instance. Storage for |delegate| is owned by caller. */
- explicit SafeStorage(Storage* delegate) : delegate_(delegate) {
- }
-
- virtual ~SafeStorage() {}
-
- // All public methods below are methods of the Storage interface.
- virtual void SetSystemResources(SystemResources* resources);
-
- virtual void WriteKey(const string& key, const string& value,
- WriteKeyCallback* done);
-
- virtual void ReadKey(const string& key, ReadKeyCallback* done);
-
- virtual void DeleteKey(const string& key, DeleteKeyCallback* done);
-
- virtual void ReadAllKeys(ReadAllKeysCallback* key_callback);
-
- private:
- /* Callback invoked when WriteKey finishes. */
- void WriteCallback(WriteKeyCallback* done, Status status);
-
- /* Callback invoked when ReadKey finishes. */
- void ReadCallback(ReadKeyCallback* done, StatusStringPair read_result);
-
- /* Callback invoked when DeleteKey finishes. */
- void DeleteCallback(DeleteKeyCallback* done, bool result);
-
- /* Callback invoked when ReadAllKeys finishes. */
- void ReadAllCallback(ReadAllKeysCallback* key_callback,
- StatusStringPair result);
-
- /* The delegate to which the calls are forwarded. */
- Storage* delegate_;
-
- /* The scheduler on which the callbacks are scheduled. */
- Scheduler* scheduler_;
-};
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_IMPL_SAFE_STORAGE_H_
diff --git a/google/cacheinvalidation/impl/simple-registration-store.cc b/google/cacheinvalidation/impl/simple-registration-store.cc
deleted file mode 100644
index 98d284a..0000000
--- a/google/cacheinvalidation/impl/simple-registration-store.cc
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Simple, map-based implementation of DigestStore.
-
-#include "google/cacheinvalidation/impl/simple-registration-store.h"
-
-#include "google/cacheinvalidation/impl/object-id-digest-utils.h"
-
-namespace invalidation {
-
-bool SimpleRegistrationStore::Add(const ObjectIdP& oid) {
- const string digest = ObjectIdDigestUtils::GetDigest(oid, digest_function_);
- bool will_add = (registrations_.find(digest) == registrations_.end());
- if (will_add) {
- registrations_[digest] = oid;
- RecomputeDigest();
- }
- return will_add;
-}
-
-void SimpleRegistrationStore::Add(const vector<ObjectIdP>& oids,
- vector<ObjectIdP>* oids_to_send) {
- for (size_t i = 0; i < oids.size(); ++i) {
- const ObjectIdP& oid = oids[i];
- const string digest = ObjectIdDigestUtils::GetDigest(oid, digest_function_);
- bool will_add = (registrations_.find(digest) == registrations_.end());
- if (will_add) {
- registrations_[digest] = oid;
- oids_to_send->push_back(oid);
- }
- }
- if (!oids_to_send->empty()) {
- // Only recompute the digest if we made changes.
- RecomputeDigest();
- }
-}
-
-bool SimpleRegistrationStore::Remove(const ObjectIdP& oid) {
- const string digest = ObjectIdDigestUtils::GetDigest(oid, digest_function_);
- bool will_remove = (registrations_.find(digest) != registrations_.end());
- if (will_remove) {
- registrations_.erase(digest);
- RecomputeDigest();
- }
- return will_remove;
-}
-
-void SimpleRegistrationStore::Remove(const vector<ObjectIdP>& oids,
- vector<ObjectIdP>* oids_to_send) {
- for (size_t i = 0; i < oids.size(); ++i) {
- const ObjectIdP& oid = oids[i];
- const string digest = ObjectIdDigestUtils::GetDigest(oid, digest_function_);
- bool will_remove = (registrations_.find(digest) != registrations_.end());
- if (will_remove) {
- registrations_.erase(digest);
- oids_to_send->push_back(oid);
- }
- }
- if (!oids_to_send->empty()) {
- // Only recompute the digest if we made changes.
- RecomputeDigest();
- }
-}
-
-void SimpleRegistrationStore::RemoveAll(vector<ObjectIdP>* oids) {
- for (map<string, ObjectIdP>::const_iterator iter = registrations_.begin();
- iter != registrations_.end(); ++iter) {
- oids->push_back(iter->second);
- }
- registrations_.clear();
- RecomputeDigest();
-}
-
-bool SimpleRegistrationStore::Contains(const ObjectIdP& oid) {
- return registrations_.find(
- ObjectIdDigestUtils::GetDigest(oid, digest_function_)) !=
- registrations_.end();
-}
-
-void SimpleRegistrationStore::GetElements(
- const string& oid_digest_prefix, int prefix_len,
- vector<ObjectIdP>* result) {
- // We always return all the registrations and let the Ticl sort it out.
- for (map<string, ObjectIdP>::iterator iter = registrations_.begin();
- iter != registrations_.end(); ++iter) {
- result->push_back(iter->second);
- }
-}
-
-void SimpleRegistrationStore::RecomputeDigest() {
- digest_ = ObjectIdDigestUtils::GetDigest(
- registrations_, digest_function_);
-}
-
-} // namespace invalidation
diff --git a/google/cacheinvalidation/impl/simple-registration-store.h b/google/cacheinvalidation/impl/simple-registration-store.h
deleted file mode 100644
index 226cb87..0000000
--- a/google/cacheinvalidation/impl/simple-registration-store.h
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Simple, map-based implementation of DigestStore.
-
-#ifndef GOOGLE_CACHEINVALIDATION_IMPL_SIMPLE_REGISTRATION_STORE_H_
-#define GOOGLE_CACHEINVALIDATION_IMPL_SIMPLE_REGISTRATION_STORE_H_
-
-#include <map>
-
-#include "google/cacheinvalidation/deps/digest-function.h"
-#include "google/cacheinvalidation/deps/string_util.h"
-#include "google/cacheinvalidation/impl/client-protocol-namespace-fix.h"
-#include "google/cacheinvalidation/impl/digest-store.h"
-
-namespace invalidation {
-
-using INVALIDATION_STL_NAMESPACE::map;
-
-class SimpleRegistrationStore : public DigestStore<ObjectIdP> {
- public:
- explicit SimpleRegistrationStore(DigestFunction* digest_function)
- : digest_function_(digest_function) {
- RecomputeDigest();
- }
-
- virtual ~SimpleRegistrationStore() {}
-
- virtual bool Add(const ObjectIdP& oid);
-
- virtual void Add(const vector<ObjectIdP>& oids,
- vector<ObjectIdP>* oids_to_send);
-
- virtual bool Remove(const ObjectIdP& oid);
-
- virtual void Remove(const vector<ObjectIdP>& oids,
- vector<ObjectIdP>* oids_to_send);
-
- virtual void RemoveAll(vector<ObjectIdP>* oids);
-
- virtual bool Contains(const ObjectIdP& oid);
-
- virtual int size() {
- return registrations_.size();
- }
-
- virtual string GetDigest() {
- return digest_;
- }
-
- virtual void GetElements(const string& oid_digest_prefix, int prefix_len,
- vector<ObjectIdP>* result);
-
- virtual string ToString() {
- return StringPrintf("SimpleRegistrationStore: %d registrations",
- static_cast<int>(registrations_.size()));
- }
-
- private:
- /* Recomputes the digests over all objects and sets this.digest. */
- void RecomputeDigest();
-
- /* All the registrations in the store mappd from the digest to the ibject id.
- */
- map<string, ObjectIdP> registrations_;
-
- /* The function used to compute digests of objects. */
- DigestFunction* digest_function_;
-
- /* The memoized digest of all objects in registrations. */
- string digest_;
-};
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_IMPL_SIMPLE_REGISTRATION_STORE_H_
diff --git a/google/cacheinvalidation/impl/smearer.h b/google/cacheinvalidation/impl/smearer.h
deleted file mode 100644
index 7fc43f0..0000000
--- a/google/cacheinvalidation/impl/smearer.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// An abstraction to "smear" values by a given percent. Useful for randomizing
-// delays a little bit so that (say) processes do not get synchronized on time
-// inadvertently, e.g., a heartbeat task that sends a message every few minutes
-// is smeared so that all clients do not end up sending a message at the same
-// time. In particular, given a |delay|, returns a value that is randomly
-// distributed between
-// [delay - smearPercent * delay, delay + smearPercent * delay]
-
-#ifndef GOOGLE_CACHEINVALIDATION_IMPL_SMEARER_H_
-#define GOOGLE_CACHEINVALIDATION_IMPL_SMEARER_H_
-
-#include "google/cacheinvalidation/deps/logging.h"
-#include "google/cacheinvalidation/deps/random.h"
-#include "google/cacheinvalidation/deps/scoped_ptr.h"
-
-namespace invalidation {
-
-class Smearer {
- public:
- /* Creates a smearer with the given random number generator.
- * REQUIRES: 0 <= smear_percent <= 100
- * Caller continues to own space for random.
- */
- Smearer(Random* random, int smear_percent) : random_(random),
- smear_fraction_(smear_percent / 100.0) {
- CHECK((smear_percent >= 0) && (smear_percent <= 100));
- }
-
- /* Given a delay, returns a value that is randomly distributed between
- * (delay - smear_percent * delay, delay + smear_percent * delay)
- */
- TimeDelta GetSmearedDelay(TimeDelta delay) {
- // Get a random number between -1 and 1 and then multiply that by the
- // smear fraction.
- double smear_factor = (2 * random_->RandDouble() - 1.0) * smear_fraction_;
- return TimeDelta::FromMilliseconds(
- delay.InMilliseconds() * (1.0 + smear_factor));
- }
-
- private:
- Random* random_;
-
- /* The percentage (0, 1.0] for smearing the delay. */
- double smear_fraction_;
-};
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_IMPL_SMEARER_H_
diff --git a/google/cacheinvalidation/impl/statistics.cc b/google/cacheinvalidation/impl/statistics.cc
deleted file mode 100644
index 382d45c..0000000
--- a/google/cacheinvalidation/impl/statistics.cc
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Statistics for the Ticl, e.g., number of registration calls, number of token
-// mismatches, etc.
-
-#include "google/cacheinvalidation/impl/statistics.h"
-
-namespace invalidation {
-
-const char* Statistics::SentMessageType_names[] = {
- "INFO",
- "INITIALIZE",
- "INVALIDATION_ACK",
- "REGISTRATION",
- "REGISTRATION_SYNC",
- "TOTAL",
-};
-
-const char* Statistics::ReceivedMessageType_names[] = {
- "INFO_REQUEST",
- "INVALIDATION",
- "REGISTRATION_STATUS",
- "REGISTRATION_SYNC_REQUEST",
- "TOKEN_CONTROL",
- "ERROR",
- "CONFIG_CHANGE",
- "TOTAL",
-};
-
-const char* Statistics::IncomingOperationType_names[] = {
- "ACKNOWLEDGE",
- "REGISTRATION",
- "UNREGISTRATION",
-};
-
-const char* Statistics::ListenerEventType_names[] = {
- "INFORM_ERROR",
- "INFORM_REGISTRATION_FAILURE",
- "INFORM_REGISTRATION_STATUS",
- "INVALIDATE",
- "INVALIDATE_ALL",
- "INVALIDATE_UNKNOWN",
- "REISSUE_REGISTRATIONS",
-};
-
-const char* Statistics::ClientErrorType_names[] = {
- "ACKNOWLEDGE_HANDLE_FAILURE",
- "INCOMING_MESSAGE_FAILURE",
- "OUTGOING_MESSAGE_FAILURE",
- "PERSISTENT_DESERIALIZATION_FAILURE",
- "PERSISTENT_READ_FAILURE",
- "PERSISTENT_WRITE_FAILURE",
- "PROTOCOL_VERSION_FAILURE",
- "REGISTRATION_DISCREPANCY",
- "NONCE_MISMATCH",
- "TOKEN_MISMATCH",
- "TOKEN_MISSING_FAILURE",
- "TOKEN_TRANSIENT_FAILURE",
-};
-
-Statistics::Statistics() {
- InitializeMap(sent_message_types_, SentMessageType_MAX + 1);
- InitializeMap(received_message_types_, ReceivedMessageType_MAX + 1);
- InitializeMap(incoming_operation_types_, IncomingOperationType_MAX + 1);
- InitializeMap(listener_event_types_, ListenerEventType_MAX + 1);
- InitializeMap(client_error_types_, ClientErrorType_MAX + 1);
-}
-
-void Statistics::GetNonZeroStatistics(
- vector<pair<string, int> >* performance_counters) {
- // Add the non-zero values from the different maps to performance_counters.
- FillWithNonZeroStatistics(
- sent_message_types_, SentMessageType_MAX + 1, SentMessageType_names,
- "SentMessageType.", performance_counters);
- FillWithNonZeroStatistics(
- received_message_types_, ReceivedMessageType_MAX + 1,
- ReceivedMessageType_names, "ReceivedMessageType.",
- performance_counters);
- FillWithNonZeroStatistics(
- incoming_operation_types_, IncomingOperationType_MAX + 1,
- IncomingOperationType_names, "IncomingOperationType.",
- performance_counters);
- FillWithNonZeroStatistics(
- listener_event_types_, ListenerEventType_MAX + 1, ListenerEventType_names,
- "ListenerEventType.", performance_counters);
- FillWithNonZeroStatistics(
- client_error_types_, ClientErrorType_MAX + 1, ClientErrorType_names,
- "ClientErrorType.", performance_counters);
-}
-
-/* Modifies result to contain those statistics from map whose value is > 0. */
-void Statistics::FillWithNonZeroStatistics(
- int map[], int size, const char* names[], const char* prefix,
- vector<pair<string, int> >* destination) {
- for (int i = 0; i < size; ++i) {
- if (map[i] > 0) {
- destination->push_back(
- make_pair(StringPrintf("%s%s", prefix, names[i]), map[i]));
- }
- }
-}
-
-void Statistics::InitializeMap(int map[], int size) {
- for (int i = 0; i < size; ++i) {
- map[i] = 0;
- }
-}
-
-} // namespace invalidation
diff --git a/google/cacheinvalidation/impl/statistics.h b/google/cacheinvalidation/impl/statistics.h
deleted file mode 100644
index fcbc49e..0000000
--- a/google/cacheinvalidation/impl/statistics.h
+++ /dev/null
@@ -1,234 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Statistics for the Ticl, e.g., number of registration calls, number of token
-// mismatches, etc.
-
-#ifndef GOOGLE_CACHEINVALIDATION_IMPL_STATISTICS_H_
-#define GOOGLE_CACHEINVALIDATION_IMPL_STATISTICS_H_
-
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "google/cacheinvalidation/deps/stl-namespace.h"
-#include "google/cacheinvalidation/deps/string_util.h"
-
-namespace invalidation {
-
-using INVALIDATION_STL_NAMESPACE::pair;
-using INVALIDATION_STL_NAMESPACE::string;
-using INVALIDATION_STL_NAMESPACE::vector;
-
-class Statistics {
- public:
- // Implementation: To classify the statistics a bit better, we have a few
- // enums to track different different types of statistics, e.g., sent message
- // types, errors, etc. For each statistic type, we create a map and provide a
- // method to record an event for each type of statistic.
-
- /* Types of messages sent to the server: ClientToServerMessage for their
- * description.
- */
- enum SentMessageType {
- SentMessageType_INFO,
- SentMessageType_INITIALIZE,
- SentMessageType_INVALIDATION_ACK,
- SentMessageType_REGISTRATION,
- SentMessageType_REGISTRATION_SYNC,
- SentMessageType_TOTAL, // Refers to the actual ClientToServerMessage
- // message sent on the network.
- };
- static const SentMessageType SentMessageType_MIN = SentMessageType_INFO;
- static const SentMessageType SentMessageType_MAX = SentMessageType_TOTAL;
- static const char* SentMessageType_names[];
-
- /* Types of messages received from the server: ServerToClientMessage for their
- * description.
- */
- enum ReceivedMessageType {
- ReceivedMessageType_INFO_REQUEST,
- ReceivedMessageType_INVALIDATION,
- ReceivedMessageType_REGISTRATION_STATUS,
- ReceivedMessageType_REGISTRATION_SYNC_REQUEST,
- ReceivedMessageType_TOKEN_CONTROL,
- ReceivedMessageType_ERROR,
- ReceivedMessageType_CONFIG_CHANGE,
- ReceivedMessageType_TOTAL, // Refers to the actual ServerToClientMessage
- // messages received from the network.
- };
- static const ReceivedMessageType ReceivedMessageType_MIN =
- ReceivedMessageType_INFO_REQUEST;
- static const ReceivedMessageType ReceivedMessageType_MAX =
- ReceivedMessageType_TOTAL;
- static const char* ReceivedMessageType_names[];
-
- /* Interesting API calls coming from the application (see InvalidationClient).
- */
- enum IncomingOperationType {
- IncomingOperationType_ACKNOWLEDGE,
- IncomingOperationType_REGISTRATION,
- IncomingOperationType_UNREGISTRATION,
- };
- static const IncomingOperationType IncomingOperationType_MIN =
- IncomingOperationType_ACKNOWLEDGE;
- static const IncomingOperationType IncomingOperationType_MAX =
- IncomingOperationType_UNREGISTRATION;
- static const char* IncomingOperationType_names[];
-
- /* Different types of events issued by the InvalidationListener. */
- enum ListenerEventType {
- ListenerEventType_INFORM_ERROR,
- ListenerEventType_INFORM_REGISTRATION_FAILURE,
- ListenerEventType_INFORM_REGISTRATION_STATUS,
- ListenerEventType_INVALIDATE,
- ListenerEventType_INVALIDATE_ALL,
- ListenerEventType_INVALIDATE_UNKNOWN,
- ListenerEventType_REISSUE_REGISTRATIONS,
- };
- static const ListenerEventType ListenerEventType_MIN =
- ListenerEventType_INFORM_ERROR;
- static const ListenerEventType ListenerEventType_MAX =
- ListenerEventType_REISSUE_REGISTRATIONS;
- static const char* ListenerEventType_names[];
-
- /* Different types of errors observed by the Ticl. */
- enum ClientErrorType {
- /* Acknowledge call received from client with a bad handle. */
- ClientErrorType_ACKNOWLEDGE_HANDLE_FAILURE,
-
- /* Incoming message dropped due to parsing, validation problems. */
- ClientErrorType_INCOMING_MESSAGE_FAILURE,
-
- /* Tried to send an outgoing message that was invalid. */
- ClientErrorType_OUTGOING_MESSAGE_FAILURE,
-
- /* Persistent state failed to deserialize correctly. */
- ClientErrorType_PERSISTENT_DESERIALIZATION_FAILURE,
-
- /* Read of blob from persistent state failed. */
- ClientErrorType_PERSISTENT_READ_FAILURE,
-
- /* Write of blob from persistent state failed. */
- ClientErrorType_PERSISTENT_WRITE_FAILURE,
-
- /* Message received with incompatible protocol version. */
- ClientErrorType_PROTOCOL_VERSION_FAILURE,
-
- /* Registration at client and server is different, e.g., client thinks it is
- * registered while the server says it is unregistered (of course, sync will
- * fix it).
- */
- ClientErrorType_REGISTRATION_DISCREPANCY,
-
- /* The nonce from the server did not match the current nonce by the client.
- */
- ClientErrorType_NONCE_MISMATCH,
-
- /* The current token at the client is different from the token in the
- * incoming message.
- */
- ClientErrorType_TOKEN_MISMATCH,
-
- /* No message sent due to token missing. */
- ClientErrorType_TOKEN_MISSING_FAILURE,
-
- /* Received a message with a token (transient) failure. */
- ClientErrorType_TOKEN_TRANSIENT_FAILURE,
- };
- static const ClientErrorType ClientErrorType_MIN =
- ClientErrorType_ACKNOWLEDGE_HANDLE_FAILURE;
- static const ClientErrorType ClientErrorType_MAX =
- ClientErrorType_TOKEN_TRANSIENT_FAILURE;
- static const char* ClientErrorType_names[];
-
- // Arrays for each type of Statistic to keep track of how many times each
- // event has occurred.
-
- Statistics();
-
- /* Returns the counter value for client_error_type. */
- int GetClientErrorCounterForTest(ClientErrorType client_error_type) {
- return client_error_types_[client_error_type];
- }
-
- /* Returns the counter value for sent_message_type. */
- int GetSentMessageCounterForTest(SentMessageType sent_message_type) {
- return sent_message_types_[sent_message_type];
- }
-
- /* Returns the counter value for received_message_type. */
- int GetReceivedMessageCounterForTest(
- ReceivedMessageType received_message_type) {
- return received_message_types_[received_message_type];
- }
-
- /* Records the fact that a message of type sent_message_type has been sent. */
- void RecordSentMessage(SentMessageType sent_message_type) {
- ++sent_message_types_[sent_message_type];
- }
-
- /* Records the fact that a message of type received_message_type has been
- * received.
- */
- void RecordReceivedMessage(ReceivedMessageType received_message_type) {
- ++received_message_types_[received_message_type];
- }
-
- /* Records the fact that the application has made a call of type
- * incoming_operation_type.
- */
- void RecordIncomingOperation(IncomingOperationType incoming_operation_type) {
- ++incoming_operation_types_[incoming_operation_type];
- }
-
- /* Records the fact that the listener has issued an event of type
- * listener_event_type.
- */
- void RecordListenerEvent(ListenerEventType listener_event_type) {
- ++listener_event_types_[listener_event_type];
- }
-
- /* Records the fact that the client has observed an error of type
- * client_error_type.
- */
- void RecordError(ClientErrorType client_error_type) {
- ++client_error_types_[client_error_type];
- }
-
- /* Modifies performance_counters to contain all the statistics that are
- * non-zero. Each pair has the name of the statistic event and the number of
- * times that event has occurred since the client started.
- */
- void GetNonZeroStatistics(vector<pair<string, int> >* performance_counters);
-
- /* Modifies result to contain those statistics from map whose value is > 0. */
- static void FillWithNonZeroStatistics(
- int map[], int size, const char* names[], const char* prefix,
- vector<pair<string, int> >* destination);
-
- /* Initialzes all values for keys in map to be 0. */
- static void InitializeMap(int map[], int size);
-
- private:
- int sent_message_types_[SentMessageType_MAX + 1];
- int received_message_types_[ReceivedMessageType_MAX + 1];
- int incoming_operation_types_[IncomingOperationType_MAX + 1];
- int listener_event_types_[ListenerEventType_MAX + 1];
- int client_error_types_[ClientErrorType_MAX + 1];
-};
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_IMPL_STATISTICS_H_
diff --git a/google/cacheinvalidation/impl/throttle.cc b/google/cacheinvalidation/impl/throttle.cc
deleted file mode 100644
index fa84fc8..0000000
--- a/google/cacheinvalidation/impl/throttle.cc
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Throttles calls to a function.
-
-#include "google/cacheinvalidation/impl/throttle.h"
-
-#include <algorithm>
-
-#include "google/cacheinvalidation/include/system-resources.h"
-#include "google/cacheinvalidation/deps/callback.h"
-
-namespace invalidation {
-
-using INVALIDATION_STL_NAMESPACE::max;
-
-Throttle::Throttle(
- const RepeatedPtrField<RateLimitP>& rate_limits, Scheduler* scheduler,
- Closure* listener)
- : rate_limits_(rate_limits), scheduler_(scheduler), listener_(listener),
- timer_scheduled_(false) {
-
- // Find the largest 'count' in all of the rate limits, as this is the size of
- // the buffer of recent messages we need to retain.
- max_recent_events_ = 1;
- for (size_t i = 0; i < static_cast<size_t>(rate_limits_.size()); ++i) {
- const RateLimitP& rate_limit = rate_limits.Get(i);
- CHECK(rate_limit.window_ms() > rate_limit.count()) <<
- "Windows size too small";
- max_recent_events_ = max(static_cast<int>(max_recent_events_),
- rate_limits_.Get(i).count());
- }
-}
-
-void Throttle::Fire() {
- if (timer_scheduled_) {
- // We're already rate-limited and have a deferred call scheduled. Just
- // return. The flag will be reset when the deferred task runs.
- return;
- }
- // Go through all of the limits to see if we've hit one. If so, schedule a
- // task to try again once that limit won't be violated. If no limits would be
- // violated, send.
- Time now = scheduler_->GetCurrentTime();
- for (size_t i = 0; i < static_cast<size_t>(rate_limits_.size()); ++i) {
- RateLimitP rate_limit = rate_limits_.Get(i);
-
- // We're now checking whether sending would violate a rate limit of 'count'
- // messages per 'window_size'.
- int count = rate_limit.count();
- TimeDelta window_size = TimeDelta::FromMilliseconds(rate_limit.window_ms());
-
- // First, see how many messages we've sent so far (up to the size of our
- // recent message buffer).
- int num_recent_messages = recent_event_times_.size();
-
- // Check whether we've sent enough messages yet that we even need to
- // consider this rate limit.
- if (num_recent_messages >= count) {
- // If we've sent enough messages to reach this limit, see how long ago we
- // sent the first message in the interval, and add sufficient delay to
- // avoid violating the rate limit.
-
- // We have sent at least 'count' messages. See how long ago we sent the
- // 'count'-th last message. This defines the start of a window in which
- // no more than 'count' messages may be sent.
- Time window_start = recent_event_times_[num_recent_messages - count];
-
- // The end of this window is 'window_size' after the start.
- Time window_end = window_start + window_size;
-
- // Check where the end of the window is relative to the current time. If
- // the end of the window is in the future, then sending now would violate
- // the rate limit, so we must defer.
- TimeDelta window_end_from_now = window_end - now;
- if (window_end_from_now > TimeDelta::FromSeconds(0)) {
- // Rate limit would be violated, so schedule a task to try again.
-
- // Set the flag to indicate we have a deferred task scheduled. No need
- // to continue checking other rate limits now.
- timer_scheduled_ = true;
- scheduler_->Schedule(
- window_end_from_now,
- NewPermanentCallback(this, &Throttle::RetryFire));
- return;
- }
- }
- }
- // We checked all the rate limits, and none would have been violated, so it's
- // safe to call the listener.
- listener_->Run();
-
- // Record the fact that we're triggering an event now.
- recent_event_times_.push_back(scheduler_->GetCurrentTime());
-
- // Only save up to max_recent_events_ event times.
- if (recent_event_times_.size() > max_recent_events_) {
- recent_event_times_.pop_front();
- }
-}
-
-} // namespace invalidation
diff --git a/google/cacheinvalidation/impl/throttle.h b/google/cacheinvalidation/impl/throttle.h
deleted file mode 100644
index 448dcf8..0000000
--- a/google/cacheinvalidation/impl/throttle.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Throttles calls to a function.
-
-#ifndef GOOGLE_CACHEINVALIDATION_IMPL_THROTTLE_H_
-#define GOOGLE_CACHEINVALIDATION_IMPL_THROTTLE_H_
-
-#include <cstddef>
-#include <deque>
-#include <vector>
-
-#include "google/cacheinvalidation/deps/callback.h"
-#include "google/cacheinvalidation/deps/logging.h"
-#include "google/cacheinvalidation/deps/scoped_ptr.h"
-#include "google/cacheinvalidation/deps/stl-namespace.h"
-#include "google/cacheinvalidation/deps/time.h"
-#include "google/cacheinvalidation/impl/client-protocol-namespace-fix.h"
-
-namespace invalidation {
-
-class Scheduler;
-
-using INVALIDATION_STL_NAMESPACE::deque;
-using INVALIDATION_STL_NAMESPACE::vector;
-
-// Provides an abstraction for multi-level rate-limiting. For example, the
-// default limits state that no more than one message should be sent per second,
-// or six per minute. Rate-limiting is implemented by maintaining a buffer of
-// recent messages, which is as large as the highest 'count' property. Note:
-// this means the object consumes space proportional to the _largest_ 'count'.
-class Throttle {
- public:
- // Constructs a throttler to enforce the given rate limits for the given
- // listener, using the given system resources. Ownership of scheduler is
- // retained by the caller, but the throttle takes ownership of the listener.
- Throttle(const RepeatedPtrField<RateLimitP>& rate_limits,
- Scheduler* scheduler, Closure* listener);
-
- // If calling the listener would not violate the rate limits, does so.
- // Otherwise, schedules a timer to do so as soon as doing so would not violate
- // the rate limits, unless such a timer is already set, in which case does
- // nothing. I.e., once the rate limit is reached, additional calls are not
- // queued.
- void Fire();
-
- private:
- // Retries a call to Fire() after some delay.
- void RetryFire() {
- timer_scheduled_ = false;
- Fire();
- }
-
- // Rate limits to be enforced by this object.
- RepeatedPtrField<RateLimitP> rate_limits_;
-
- // Scheduler for reading the current time and scheduling tasks that need to be
- // delayed.
- Scheduler* scheduler_;
-
- // The closure whose calls are throttled.
- scoped_ptr<Closure> listener_;
-
- // Whether we've already scheduled a deferred call.
- bool timer_scheduled_;
-
- // A buffer of recent events, so we can determine the length of the interval
- // in which we made the most recent K events.
- deque<Time> recent_event_times_;
-
- // The maximum size of the recent_event_times_ buffer.
- size_t max_recent_events_;
-};
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_IMPL_THROTTLE_H_
diff --git a/google/cacheinvalidation/impl/throttle_test.cc b/google/cacheinvalidation/impl/throttle_test.cc
deleted file mode 100644
index 2df0de0..0000000
--- a/google/cacheinvalidation/impl/throttle_test.cc
+++ /dev/null
@@ -1,191 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Tests the throttle.
-
-#include "google/cacheinvalidation/deps/googletest.h"
-#include "google/cacheinvalidation/impl/proto-helpers.h"
-#include "google/cacheinvalidation/impl/throttle.h"
-#include "google/cacheinvalidation/test/deterministic-scheduler.h"
-#include "google/cacheinvalidation/test/test-logger.h"
-
-namespace invalidation {
-
-class ThrottleTest : public testing::Test {
- public:
- ThrottleTest() : call_count_(0) {}
-
- virtual ~ThrottleTest() {}
-
- // Increments the call count.
- void IncrementCounter() {
- ++call_count_;
- }
-
- // Increments the call count and checks state to ensure that rate limits are
- // being observed.
- void IncrementAndCheckRateLimits() {
- // Increment the call count.
- ++call_count_;
- // Check that we haven't been called within the last one second.
- Time now = scheduler_->GetCurrentTime();
- ASSERT_TRUE((now - last_call_time_) >= TimeDelta::FromSeconds(1));
- // Update the last time we were called to now.
- last_call_time_ = now;
- // Check that enough time has passed to allow the number of calls we've
- // received.
- Time min_time = start_time_ + TimeDelta::FromMinutes(
- (call_count_ - 1) / kMessagesPerMinute);
- ASSERT_TRUE(min_time <= now);
- }
-
- void SetUp() {
- logger_.reset(new TestLogger());
- scheduler_.reset(new DeterministicScheduler(logger_.get()));
- start_time_ = scheduler_->GetCurrentTime();
- call_count_ = 0;
- last_call_time_ = Time() - TimeDelta::FromHours(1);
- ProtoHelpers::InitRateLimitP(1000, kMessagesPerSecond, rate_limits_.Add());
- ProtoHelpers::InitRateLimitP(60 * 1000, kMessagesPerMinute,
- rate_limits_.Add());
- }
-
- int call_count_;
- Time start_time_;
- Time last_call_time_;
- scoped_ptr<DeterministicScheduler> scheduler_;
- scoped_ptr<Logger> logger_;
- RepeatedPtrField<RateLimitP> rate_limits_;
-
- static const int kMessagesPerSecond;
- static const int kMessagesPerMinute;
-};
-
-const int ThrottleTest::kMessagesPerSecond = 1;
-const int ThrottleTest::kMessagesPerMinute = 6;
-
-/* Make a throttler similar to what we expect the Ticl to use and check that it
- * behaves as expected when called at a number of specific times. More
- * specifically:
- *
- * 1. Check that the first call to Fire() triggers a call immediately.
- * 2. Subsequent calls within the next one second don't trigger any calls.
- * 3. After one second, one (and only one) buffered call is triggered.
- * 4. If we Fire() slowly, each will trigger an immediate call until we reach
- * the per-minute rate limit.
- * 5. However, after a minute, another call i.
- */
-TEST_F(ThrottleTest, ThrottlingScripted) {
- scheduler_->StartScheduler();
- Closure* listener =
- NewPermanentCallback(this, &ThrottleTest::IncrementCounter);
-
- scoped_ptr<Throttle> throttle(
- new Throttle(rate_limits_, scheduler_.get(), listener));
-
- // The first time we fire(), it should call right away.
- throttle->Fire();
- scheduler_->PassTime(TimeDelta());
- ASSERT_EQ(1, call_count_);
-
- // However, if we now fire() a bunch more times within one second, there
- // should be no more calls to the listener ...
- TimeDelta short_interval = TimeDelta::FromMilliseconds(80);
- int fire_count = 10;
- ASSERT_TRUE(short_interval * fire_count < TimeDelta::FromSeconds(1));
- for (int i = 0; i < fire_count; ++i) {
- scheduler_->PassTime(short_interval);
- throttle->Fire();
- ASSERT_EQ(1, call_count_);
- }
-
- // Time since first event is now fireCount * intervalBetweenFires, i.e., 800.
-
- // ... until the short throttle interval passes, at which time it should be
- // called once more.
- scheduler_->PassTime(
- start_time_ + TimeDelta::FromSeconds(1) - scheduler_->GetCurrentTime());
-
- ASSERT_EQ(2, call_count_);
-
- // However, the prior fire() calls don't get queued up, so no more calls to
- // the listener will occur unless we fire() again.
- scheduler_->PassTime(TimeDelta::FromSeconds(2));
- ASSERT_EQ(2, call_count_);
-
- // At this point, we've fired twice within a few seconds. We can fire
- // (kMessagesPerMinute - 2) more times within a minute until we get
- // throttled.
- TimeDelta long_interval = TimeDelta::FromSeconds(3);
- for (int i = 0; i < kMessagesPerMinute - 2; ++i) {
- throttle->Fire();
- ASSERT_EQ(3 + i, call_count_);
- scheduler_->PassTime(long_interval);
- ASSERT_EQ(3 + i, call_count_);
- }
-
- // Now we've sent kMessagesPerMinute times. If we fire again, nothing should
- // happen.
- throttle->Fire();
- scheduler_->PassTime(TimeDelta());
- ASSERT_EQ(kMessagesPerMinute, call_count_);
-
- // Now if we fire slowly, we still shouldn't make calls, since we'd violate
- // the larger rate limit interval.
- int fire_attempts =
- ((start_time_ + TimeDelta::FromMinutes(1) - scheduler_->GetCurrentTime())
- / long_interval) - 1;
- // This value should be 20.
- for (int i = 0; i < fire_attempts; ++i) {
- scheduler_->PassTime(long_interval);
- throttle->Fire();
- ASSERT_EQ(kMessagesPerMinute, call_count_);
- }
-
- Time time_to_send_again = start_time_ + TimeDelta::FromMinutes(1);
- scheduler_->PassTime(time_to_send_again - scheduler_->GetCurrentTime());
-
- ASSERT_EQ(kMessagesPerMinute + 1, call_count_);
-}
-
-/* Test that if we keep calling fire() every millisecond, we never violate the
- * rate limits, and the expected number of total events is allowed through.
- */
-TEST_F(ThrottleTest, ThrottlingStorm) {
- scheduler_->StartScheduler();
- Closure* listener =
- NewPermanentCallback(this, &ThrottleTest::IncrementAndCheckRateLimits);
-
- // Throttler allowing one call per second and six per minute.
- scoped_ptr<Throttle> throttle(
- new Throttle(rate_limits_, scheduler_.get(), listener));
-
- // For five minutes, call Fire() every ten milliseconds, and make sure the
- // rate limits are respected.
- TimeDelta fine_interval = TimeDelta::FromMilliseconds(10);
- int duration_minutes = 5;
- TimeDelta duration = TimeDelta::FromMinutes(duration_minutes);
- int num_iterations = duration / fine_interval;
- for (int i = 0; i < num_iterations; ++i) {
- throttle->Fire();
- scheduler_->PassTime(fine_interval);
- }
-
- // Expect kMessagesPerMinute to be sent per minute for duration_minutes, plus
- // one extra because we end on the precise boundary at which the next message
- // is allowed to be sent.
- ASSERT_EQ((kMessagesPerMinute * duration_minutes) + 1, call_count_);
-}
-
-} // namespace invalidation
diff --git a/google/cacheinvalidation/impl/ticl-message-validator.cc b/google/cacheinvalidation/impl/ticl-message-validator.cc
deleted file mode 100644
index 9a602cb..0000000
--- a/google/cacheinvalidation/impl/ticl-message-validator.cc
+++ /dev/null
@@ -1,369 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Validator for v2 protocol messages.
-
-#include "google/cacheinvalidation/impl/ticl-message-validator.h"
-
-#include "google/cacheinvalidation/impl/log-macro.h"
-#include "google/cacheinvalidation/impl/proto-helpers.h"
-#include "google/cacheinvalidation/include/system-resources.h"
-
-namespace invalidation {
-
-// High-level design: validation works via the collaboration of a set of macros
-// and template method specializations that obey a specific protocol. A
-// validator for a particular type is defined by a specialization of the method:
-//
-// template<typename T>
-// void TiclMessageValidator::Validate(const T& message, bool* result);
-//
-// A macro, DEFINE_VALIDATOR(type) is defined below to help prevent mistakes in
-// these definitions and to improve code readability. For example, to define
-// the validator for the type ObjectIdP, we'd write:
-//
-// DEFINE_VALIDATOR(ObjectIdP) { /* validation constraints ... */ }
-//
-// The choice of the names |message| and |result| is significant, as many of the
-// macros assume that these refer respectively to the message being validated
-// and the address in which the validation result is to be stored.
-//
-// When a validator is called, |*result| is initially |true|. To reject the
-// message, the validator sets |*result| to |false| and returns. Otherwise, it
-// simply allows control flow to continue; if no reason is found to reject the
-// message, control eventually returns to the caller with |*result| still set to
-// |true|, indicating that the message is acceptable. This protocol keeps the
-// bodies of the validation methods clean--otherwise they would all need need to
-// end with explicit |return| statements.
-//
-// A validator typically consists of a collection of constraints, at least one
-// per field in the message. Several macros are defined for common constraints,
-// including:
-//
-// REQUIRE(field): requires that (optional) |field| be present and valid.
-// ALLOW(field): allows (optional) |field| if valid.
-// ZERO_OR_MORE(field): validates each element of the (repeated) |field|.
-// ONE_OR_MORE(field): like ZERO_OR_MORE, but requires at least one element.
-// NON_EMPTY(field): checks that the string |field| is non-empty (if present).
-// NON_NEGATIVE(field): checks that the integral |field| is >= 0 (if present).
-//
-// For custom constraints, the CONDITION(expr) macro allows an arbitrary boolean
-// expression, which will generally refer to |message|.
-//
-// Note that REQUIRE, ALLOW, ZERO_OR_MORE, and ONE_OR_MORE all perform recursive
-// validation of the mentioned fields. A validation method must therefore be
-// defined for the type of the field, or there will be a link-time error.
-
-
-// Macros:
-
-// Macro to define a specialization of the |Validate| method for the given
-// |type|. This must be followed by a method body in curly braces defining
-// constraints on |message|, which is bound to a value of the given type. If
-// |message| is valid, no action is necessary; if invalid, a diagnostic message
-// should be logged via |logger_|, and |*result| should be set to false.
-#define DEFINE_VALIDATOR(type) \
- template<> \
- void TiclMessageValidator::Validate(const type& message, bool* result)
-
-// Expands into a conditional that checks whether |field| is present in
-// |message| and valid.
-#define REQUIRE(field) \
- if (!message.has_##field()) { \
- TLOG(logger_, SEVERE, "required field " #field " missing from %s", \
- ProtoHelpers::ToString(message).c_str()); \
- *result = false; \
- return; \
- } \
- ALLOW(field);
-
-// Expands into a conditional that checks whether |field| is present in
-// |message|. If so, validates |message.field()|; otherwise, does nothing.
-#define ALLOW(field) \
- if (message.has_##field()) { \
- Validate(message.field(), result); \
- if (!*result) { \
- TLOG(logger_, SEVERE, "field " #field " failed validation in %s", \
- ProtoHelpers::ToString(message).c_str()); \
- return; \
- } \
- }
-
-// Expands into a conditional that checks that, if |field| is present in
-// |message|, then it is greater than or equal to |value|.
-#define GREATER_OR_EQUAL(field, value) \
- if (message.has_##field() && (message.field() < value)) { \
- TLOG(logger_, SEVERE, \
- #field " must be greater than or equal to %d; was %d", \
- value, message.field()); \
- *result = false; \
- return; \
- }
-
-// Expands into a conditional that checks that, if the specified numeric |field|
-// is present, that it is non-negative.
-#define NON_NEGATIVE(field) GREATER_OR_EQUAL(field, 0)
-
-// Expands into a conditional that checks that, if the specified string |field|
-// is present, that it is non-empty.
-#define NON_EMPTY(field) \
- if (message.has_##field() && message.field().empty()) { \
- TLOG(logger_, SEVERE, #field " must be non-empty"); \
- *result = false; \
- return; \
- }
-
-// Expands into a loop that checks that all elements of the repeated |field| are
-// valid.
-#define ZERO_OR_MORE(field) \
- for (int i = 0; i < message.field##_size(); ++i) { \
- Validate(message.field(i), result); \
- if (!*result) { \
- TLOG(logger_, SEVERE, "field " #field " #%d failed validation in %s", \
- i, ProtoHelpers::ToString(message).c_str()); \
- *result = false; \
- return; \
- } \
- }
-
-// Expands into a loop that checks that there is at least one element of the
-// repeated |field|, and that all are valid.
-#define ONE_OR_MORE(field) \
- if (message.field##_size() == 0) { \
- TLOG(logger_, SEVERE, "at least one " #field " required in %s", \
- ProtoHelpers::ToString(message).c_str()); \
- *result = false; \
- return; \
- } \
- ZERO_OR_MORE(field)
-
-// Expands into code that checks that the arbitrary condition |expr| is true.
-#define CONDITION(expr) \
- *result = expr; \
- if (!*result) { \
- TLOG(logger_, SEVERE, #expr " not satisfied by %s", \
- ProtoHelpers::ToString(message).c_str()); \
- return; \
- }
-
-
-// Validators:
-
-// No constraints on primitive types by default.
-DEFINE_VALIDATOR(bool) {}
-DEFINE_VALIDATOR(int) {}
-DEFINE_VALIDATOR(int64) {}
-DEFINE_VALIDATOR(string) {}
-
-// Similarly, for now enum values are always considered valid.
-DEFINE_VALIDATOR(ErrorMessage::Code) {}
-DEFINE_VALIDATOR(InfoRequestMessage::InfoType) {}
-DEFINE_VALIDATOR(InitializeMessage::DigestSerializationType) {}
-DEFINE_VALIDATOR(RegistrationP::OpType) {}
-DEFINE_VALIDATOR(StatusP::Code) {}
-
-DEFINE_VALIDATOR(Version) {
- REQUIRE(major_version);
- NON_NEGATIVE(major_version);
- REQUIRE(minor_version);
- NON_NEGATIVE(minor_version);
-}
-
-DEFINE_VALIDATOR(ProtocolVersion) {
- REQUIRE(version);
-}
-
-DEFINE_VALIDATOR(ObjectIdP) {
- REQUIRE(name);
- REQUIRE(source);
- NON_NEGATIVE(source);
-}
-
-DEFINE_VALIDATOR(InvalidationP) {
- REQUIRE(object_id);
- REQUIRE(is_known_version);
- REQUIRE(version);
- NON_NEGATIVE(version);
- ALLOW(payload);
-}
-
-DEFINE_VALIDATOR(RegistrationP) {
- REQUIRE(object_id);
- REQUIRE(op_type);
-}
-
-DEFINE_VALIDATOR(RegistrationSummary) {
- REQUIRE(num_registrations);
- NON_NEGATIVE(num_registrations);
- REQUIRE(registration_digest);
- NON_EMPTY(registration_digest);
-}
-
-DEFINE_VALIDATOR(InvalidationMessage) {
- ONE_OR_MORE(invalidation);
-}
-
-DEFINE_VALIDATOR(ClientHeader) {
- REQUIRE(protocol_version);
- ALLOW(client_token);
- NON_EMPTY(client_token);
- ALLOW(registration_summary);
- REQUIRE(client_time_ms);
- REQUIRE(max_known_server_time_ms);
- ALLOW(message_id);
- ALLOW(client_type);
-}
-
-DEFINE_VALIDATOR(ApplicationClientIdP) {
- REQUIRE(client_type);
- REQUIRE(client_name);
- NON_EMPTY(client_name);
-}
-
-DEFINE_VALIDATOR(InitializeMessage) {
- REQUIRE(client_type);
- REQUIRE(nonce);
- NON_EMPTY(nonce);
- REQUIRE(digest_serialization_type);
- REQUIRE(application_client_id);
-}
-
-DEFINE_VALIDATOR(RegistrationMessage) {
- ONE_OR_MORE(registration);
-}
-
-DEFINE_VALIDATOR(ClientVersion) {
- REQUIRE(version);
- REQUIRE(platform);
- REQUIRE(language);
- REQUIRE(application_info);
-}
-
-DEFINE_VALIDATOR(PropertyRecord) {
- REQUIRE(name);
- REQUIRE(value);
-}
-
-DEFINE_VALIDATOR(RateLimitP) {
- REQUIRE(window_ms);
- GREATER_OR_EQUAL(window_ms, 1000);
- CONDITION(message.window_ms() > message.count());
- REQUIRE(count);
-}
-
-DEFINE_VALIDATOR(ProtocolHandlerConfigP) {
- ALLOW(batching_delay_ms);
- ZERO_OR_MORE(rate_limit);
-}
-
-DEFINE_VALIDATOR(ClientConfigP) {
- REQUIRE(version);
- ALLOW(network_timeout_delay_ms);
- ALLOW(write_retry_delay_ms);
- ALLOW(heartbeat_interval_ms);
- ALLOW(perf_counter_delay_ms);
- ALLOW(max_exponential_backoff_factor);
- ALLOW(smear_percent);
- ALLOW(is_transient);
- ALLOW(initial_persistent_heartbeat_delay_ms);
- ALLOW(channel_supports_offline_delivery);
- REQUIRE(protocol_handler_config);
- ALLOW(offline_heartbeat_threshold_ms);
- ALLOW(allow_suppression);
-}
-
-DEFINE_VALIDATOR(InfoMessage) {
- REQUIRE(client_version);
- ZERO_OR_MORE(config_parameter);
- ZERO_OR_MORE(performance_counter);
- ALLOW(client_config);
- ALLOW(server_registration_summary_requested);
-}
-
-DEFINE_VALIDATOR(RegistrationSubtree) {
- ZERO_OR_MORE(registered_object);
-}
-
-DEFINE_VALIDATOR(RegistrationSyncMessage) {
- ONE_OR_MORE(subtree);
-}
-
-DEFINE_VALIDATOR(ClientToServerMessage) {
- REQUIRE(header);
- ALLOW(info_message);
- ALLOW(initialize_message);
- ALLOW(invalidation_ack_message);
- ALLOW(registration_message);
- ALLOW(registration_sync_message);
- CONDITION(message.has_initialize_message() ^
- message.header().has_client_token());
-}
-
-DEFINE_VALIDATOR(ServerHeader) {
- REQUIRE(protocol_version);
- REQUIRE(client_token);
- NON_EMPTY(client_token);
- ALLOW(registration_summary);
- REQUIRE(server_time_ms);
- NON_NEGATIVE(server_time_ms);
- ALLOW(message_id);
- NON_EMPTY(message_id);
-}
-
-DEFINE_VALIDATOR(StatusP) {
- REQUIRE(code);
- ALLOW(description);
-}
-
-DEFINE_VALIDATOR(TokenControlMessage) {
- ALLOW(new_token);
-}
-
-DEFINE_VALIDATOR(ErrorMessage) {
- REQUIRE(code);
- REQUIRE(description);
-}
-
-DEFINE_VALIDATOR(RegistrationStatus) {
- REQUIRE(registration);
- REQUIRE(status);
-}
-
-DEFINE_VALIDATOR(RegistrationStatusMessage) {
- ONE_OR_MORE(registration_status);
-}
-
-DEFINE_VALIDATOR(RegistrationSyncRequestMessage) {}
-
-DEFINE_VALIDATOR(InfoRequestMessage) {
- ONE_OR_MORE(info_type);
-}
-
-DEFINE_VALIDATOR(ConfigChangeMessage) {
- ALLOW(next_message_delay_ms);
- GREATER_OR_EQUAL(next_message_delay_ms, 1);
-}
-
-DEFINE_VALIDATOR(ServerToClientMessage) {
- REQUIRE(header);
- ALLOW(token_control_message);
- ALLOW(invalidation_message);
- ALLOW(registration_status_message);
- ALLOW(registration_sync_request_message);
- ALLOW(config_change_message);
- ALLOW(info_request_message);
- ALLOW(error_message);
-}
-
-} // namespace invalidation
diff --git a/google/cacheinvalidation/impl/ticl-message-validator.h b/google/cacheinvalidation/impl/ticl-message-validator.h
deleted file mode 100644
index ce0afcb..0000000
--- a/google/cacheinvalidation/impl/ticl-message-validator.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Validator for v2 protocol messages.
-
-#ifndef GOOGLE_CACHEINVALIDATION_IMPL_TICL_MESSAGE_VALIDATOR_H_
-#define GOOGLE_CACHEINVALIDATION_IMPL_TICL_MESSAGE_VALIDATOR_H_
-
-#include "google/cacheinvalidation/impl/client-protocol-namespace-fix.h"
-
-namespace invalidation {
-
-class Logger;
-
-class TiclMessageValidator {
- public:
- TiclMessageValidator(Logger* logger) : logger_(logger) {}
-
- // Generic IsValid() method. Delegates to the private |Validate| helper
- // method.
- template<typename T>
- bool IsValid(const T& message) {
- bool result = true;
- Validate(message, &result);
- return result;
- }
-
- private:
- // Validates a message. For each type of message to be validated, there
- // should be a specialization of this method. Instead of returning a boolean,
- // the method stores |false| in |*result| if the message is invalid. Thus,
- // the caller must initialize |*result| to |true|. Following this pattern
- // allows the specific validation methods to be simpler (i.e., a method that
- // accepts all messages has an empty body instead of having to return |true|).
- template<typename T>
- void Validate(const T& message, bool* result);
-
- private:
- Logger* logger_;
-};
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_IMPL_TICL_MESSAGE_VALIDATOR_H_
diff --git a/google/cacheinvalidation/include/invalidation-client-factory.h b/google/cacheinvalidation/include/invalidation-client-factory.h
deleted file mode 100644
index 4b92495..0000000
--- a/google/cacheinvalidation/include/invalidation-client-factory.h
+++ /dev/null
@@ -1,162 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-//
-// Factory for the invalidation client library.
-
-#ifndef GOOGLE_CACHEINVALIDATION_INCLUDE_INVALIDATION_CLIENT_FACTORY_H_
-#define GOOGLE_CACHEINVALIDATION_INCLUDE_INVALIDATION_CLIENT_FACTORY_H_
-
-#include <string>
-
-#include "google/cacheinvalidation/include/types.h"
-#include "google/cacheinvalidation/include/invalidation-listener.h"
-#include "google/cacheinvalidation/include/system-resources.h"
-#include "google/cacheinvalidation/deps/stl-namespace.h"
-
-namespace invalidation {
-
-using INVALIDATION_STL_NAMESPACE::string;
-
-/* Application-provided configuration for an invalidation client. */
-class InvalidationClientConfig {
- public:
- /* Constructs an InvalidationClientConfig instance.
- *
- * Arguments:
- * client_type Client type code as assigned by the notification system's
- * backend.
- * client_name Id/name of the client in the application's own naming
- * scheme.
- * application_name Name of the application using the library (for
- * debugging/monitoring)
- * allow_suppression If false, invalidateUnknownVersion() is called
- * whenever suppression occurs.
- */
- InvalidationClientConfig(int client_type,
- const string& client_name,
- const string& application_name,
- bool allow_suppression) :
- client_type_(client_type), client_name_(client_name),
- application_name_(application_name),
- allow_suppression_(allow_suppression) {
- }
-
- int32 client_type() const {
- return client_type_;
- }
-
- const string& client_name() const {
- return client_name_;
- }
-
- const string& application_name() const {
- return application_name_;
- }
-
- bool allow_suppression() const {
- return allow_suppression_;
- }
-
- private:
- const int32 client_type_;
- const string client_name_;
- const string application_name_;
- const bool allow_suppression_;
-};
-
-// A class for new factory methods. These methods will be static, so this class
-// is essentially just a namespace. This is more consistent with how the
-// factory works in other languages, and it avoids overload issues with the old
-// methods defined below.
-class ClientFactory {
- public:
- /* Constructs an invalidation client library instance with a default
- * configuration. Caller owns returned space.
- *
- * Arguments:
- * resources SystemResources to use for logging, scheduling, persistence,
- * and network connectivity
- * config configuration provided by the application
- * listener callback object for invalidation events
- */
- static InvalidationClient* Create(
- SystemResources* resources,
- const InvalidationClientConfig& config,
- InvalidationListener* listener);
-
- /* Constructs an invalidation client library instance with a configuration
- * initialized for testing. Caller owns returned space.
- *
- * Arguments:
- * resources SystemResources to use for logging, scheduling, persistence,
- * and network connectivity
- * client_type client type code as assigned by the notification system's
- * backend
- * client_name id/name of the client in the application's own naming scheme
- * application_name name of the application using the library (for
- * debugging/monitoring)
- * listener callback object for invalidation events
- */
- static InvalidationClient* CreateForTest(
- SystemResources* resources,
- const InvalidationClientConfig& config,
- InvalidationListener* listener);
-};
-
-/* Constructs an invalidation client library instance with a default
- * configuration. Deprecated, please use the version which takes an
- * InvalidationClientConfig. Caller owns returned space.
- *
- * Arguments:
- * resources SystemResources to use for logging, scheduling, persistence,
- * and network connectivity
- * client_type client type code as assigned by the notification system's
- * backend
- * client_name id/name of the client in the application's own naming scheme
- * application_name name of the application using the library (for
- * debugging/monitoring)
- * listener callback object for invalidation events
- */
-InvalidationClient* CreateInvalidationClient(
- SystemResources* resources,
- int client_type,
- const string& client_name,
- const string& application_name,
- InvalidationListener* listener);
-
-/* Constructs an invalidation client library instance with a configuration
- * initialized for testing. Deprecated, please use the version which takes an
- * InvalidationClientConfig. Caller owns returned space.
- *
- * Arguments:
- * resources SystemResources to use for logging, scheduling, persistence,
- * and network connectivity
- * client_type client type code as assigned by the notification system's
- * backend
- * client_name id/name of the client in the application's own naming scheme
- * application_name name of the application using the library (for
- * debugging/monitoring)
- * listener callback object for invalidation events
- */
-InvalidationClient* CreateInvalidationClientForTest(
- SystemResources* resources,
- int client_type,
- const string& client_name,
- const string& application_name,
- InvalidationListener* listener);
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_INCLUDE_INVALIDATION_CLIENT_FACTORY_H_
diff --git a/google/cacheinvalidation/include/invalidation-client.h b/google/cacheinvalidation/include/invalidation-client.h
deleted file mode 100644
index ec4d955..0000000
--- a/google/cacheinvalidation/include/invalidation-client.h
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Interface for the invalidation client library.
-
-#ifndef GOOGLE_CACHEINVALIDATION_INCLUDE_INVALIDATION_CLIENT_H_
-#define GOOGLE_CACHEINVALIDATION_INCLUDE_INVALIDATION_CLIENT_H_
-
-#include <vector>
-
-#include "google/cacheinvalidation/deps/stl-namespace.h"
-
-namespace invalidation {
-
-using ::INVALIDATION_STL_NAMESPACE::vector;
-
-class AckHandle;
-class Invalidation;
-class ObjectId;
-
-class InvalidationClient {
- public:
- virtual ~InvalidationClient() {}
-
- /* Starts the client. This method must be called before any other method is
- * invoked. The client is considered to be started after
- * InvalidationListener::Ready has received by the application.
- *
- * REQUIRES: Start has not already been called.
- * The resources given to the client must have been started by the caller.
- */
- virtual void Start() = 0;
-
- /* Stops the client. After this method has been called, it is an error to call
- * any other method.
- *
- * REQUIRES: Start has already been called.
- * Does not stop the resources bound to this client.
- */
- virtual void Stop() = 0;
-
- /* Requests that the Ticl register to receive notifications for the object
- * with id object_id. The library guarantees that the caller will be informed
- * of the results of this call either via
- * InvalidationListener::InformRegistrationStatus or
- * InvalidationListener::InformRegistrationFailure unless the library informs
- * the caller of a connection failure via
- * InvalidationListener::InformError. The caller should consider the
- * registration to have succeeded only if it gets a call
- * InvalidationListener::InformRegistrationStatus for object_id with
- * InvalidationListener::RegistrationState::REGISTERED. Note that if the
- * network is disconnected, the listener events will probably show up when the
- * network connection is repaired.
- *
- * REQUIRES: Start has been called and and InvalidationListener::Ready has
- * been received by the application's listener.
- */
- virtual void Register(const ObjectId& object_id) = 0;
-
- /* Registrations for multiple objects. See the specs on Register(const
- * ObjectId&) for more details. If the caller needs to register for a number
- * of object ids, this method is more efficient than calling Register in a
- * loop.
- */
- virtual void Register(const vector<ObjectId>& object_ids) = 0;
-
- /* Requests that the Ticl unregister for notifications for the object with id
- * object_id. The library guarantees that the caller will be informed of the
- * results of this call either via
- * InvalidationListener::InformRegistrationStatus or
- * InvalidationListener::InformRegistrationFailure unless the library informs
- * the caller of a connection failure via
- * InvalidationListener::InformError. The caller should consider the
- * unregistration to have succeeded only if it gets a call
- * InvalidationListener::InformRegistrationStatus for object_id with
- * InvalidationListener::RegistrationState::UNREGISTERED. Note that if the
- * network is disconnected, the listener events will probably show up when the
- * network connection is repaired.
- *
- * REQUIRES: Start has been called and and InvalidationListener::Ready has
- * been receiveed by the application's listener.
- */
- virtual void Unregister(const ObjectId& object_id) = 0;
-
- /* Unregistrations for multiple objects. See the specs on Unregister(const
- * ObjectId&) for more details. If the caller needs to unregister for a number
- * of object ids, this method is more efficient than calling Unregister in a
- * loop.
- */
- virtual void Unregister(const vector<ObjectId>& object_ids) = 0;
-
- /* Acknowledges the InvalidationListener event that was delivered with the
- * provided acknowledgement handle. This indicates that the client has
- * accepted responsibility for processing the event and it does not need to be
- * redelivered later.
- *
- * REQUIRES: Start been called and and InvalidationListener::Ready has been
- * received by the application's listener.
- */
- virtual void Acknowledge(const AckHandle& ackHandle) = 0;
-};
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_INCLUDE_INVALIDATION_CLIENT_H_
diff --git a/google/cacheinvalidation/include/invalidation-listener.h b/google/cacheinvalidation/include/invalidation-listener.h
deleted file mode 100644
index aa881e4..0000000
--- a/google/cacheinvalidation/include/invalidation-listener.h
+++ /dev/null
@@ -1,193 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Interface through which invalidation-related events are delivered by the
-// library to the application. Each event must be acknowledged by the
-// application. Each includes an AckHandle that the application must use to call
-// InvalidationClient::Acknowledge after it is done handling that event.
-
-#ifndef GOOGLE_CACHEINVALIDATION_INCLUDE_INVALIDATION_LISTENER_H_
-#define GOOGLE_CACHEINVALIDATION_INCLUDE_INVALIDATION_LISTENER_H_
-
-#include <string>
-
-#include "google/cacheinvalidation/deps/stl-namespace.h"
-
-namespace invalidation {
-
-using INVALIDATION_STL_NAMESPACE::string;
-
-class AckHandle;
-class ErrorInfo;
-class Invalidation;
-class InvalidationClient;
-class ObjectId;
-
-class InvalidationListener {
- public:
- /* Possible registration states for an object. */
- enum RegistrationState {
- REGISTERED,
- UNREGISTERED
- };
-
- virtual ~InvalidationListener() {}
-
- /* Called in response to the InvalidationClient::Start call. Indicates that
- * the InvalidationClient is now ready for use, i.e., calls such as
- * register/unregister can be performed on that object.
- *
- * Arguments:
- * client - the InvalidationClient invoking the listener
- */
- virtual void Ready(InvalidationClient* client) = 0;
-
- /* Indicates that an object has been updated to a particular version.
- *
- * The Ticl guarantees that this callback will be invoked at least once for
- * every invalidation that it guaranteed to deliver. It does not guarantee
- * exactly-once delivery or in-order delivery (with respect to the version
- * number).
- *
- * The application should acknowledge this event by calling
- * InvalidationClient::Acknowledge(const AckHandle&) with the provided
- * ack_handle otherwise the event may be redelivered.
- *
- * Arguments:
- * client - the InvalidationClient invoking the listener
- * ack_handle - event acknowledgement handle
- */
- virtual void Invalidate(InvalidationClient* client,
- const Invalidation& invalidation,
- const AckHandle& ack_handle) = 0;
-
- /* As Invalidate, but for an unknown application store version. The object may
- * or may not have been updated - to ensure that the application does not miss
- * an update from its backend, the application must check and/or fetch the
- * latest version from its store.
- */
- virtual void InvalidateUnknownVersion(InvalidationClient* client,
- const ObjectId& object_id,
- const AckHandle& ack_handle) = 0;
-
- /* Indicates that the application should consider all objects to have changed.
- * This event is generally sent when the client has been disconnected from the
- * network for too long a period and has been unable to resynchronize with the
- * update stream, but it may be invoked arbitrarily (although the service
- * tries hard not to invoke it under normal circumstances).
- *
- * The application should acknowledge this event by calling
- * InvalidationClient::Acknowledge(const AckHandle&) with the provided
- * ack_handle otherwise the event may be redelivered.
- *
- * Arguments:
- * client - the InvalidationClient invoking the listener
- * ack_handle - event acknowledgement handle
- */
- virtual void InvalidateAll(InvalidationClient* client,
- const AckHandle& ack_handle) = 0;
-
- /* Indicates that the registration state of an object has changed.
- *
- * The application should acknowledge this event by calling
- * InvalidationClient::Acknowledge(AckHandle) with the provided ack_handle;
- * otherwise the event may be redelivered.
- *
- * Arguments:
- * client - the InvalidationClient invoking the listener
- * object_id - the id of the object whose state changed
- * reg_state - the new state
- */
- virtual void InformRegistrationStatus(InvalidationClient* client,
- const ObjectId& object_id,
- RegistrationState reg_state) = 0;
-
- /* Indicates that an object registration or unregistration operation may have
- * failed.
- *
- * The application should acknowledge this event by calling
- * InvalidationClient::acknowledge(AckHandle) with the provided ack_handle;
- * otherwise the event may be redelivered.
- *
- * For transient failures, the application can retry the registration later -
- * if it chooses to do so, it must use a sensible backoff policy such as
- * exponential backoff. For permanent failures, it must not automatically
- * retry without fixing the situation (e.g., by presenting a dialog box to the
- * user).
- *
- * Arguments:
- * client - the {@link InvalidationClient} invoking the listener
- * object_id - the id of the object whose state changed
- * is_transient - whether the error is transient or permanent
- * errorMessage - extra information about the message
- */
- virtual void InformRegistrationFailure(InvalidationClient* client,
- const ObjectId& object_id,
- bool is_transient,
- const string& error_message) = 0;
-
- /* Indicates that the all registrations for the client are in an unknown state
- * (e.g., they could have been removed). The application MUST inform the
- * InvalidationClient of its registrations once it receives this event. The
- * requested objects are those for which the digest of their serialized object
- * ids matches a particular prefix bit-pattern. The digest for an object id is
- * computed as following (the digest chosen for this method is SHA-1):
- *
- * Digest digest();
- * digest.Update(Little endian encoding of object source type)
- * digest.Update(object name)
- * digest.GetDigestSummary()
- *
- * For a set of objects, digest is computed by sorting lexicographically based
- * on their digests and then performing the update process given above (i.e.,
- * calling digest.update on each object's digest and then calling
- * getDigestSummary at the end).
- *
- * IMPORTANT: A client can always register for more objects than what is
- * requested here. For example, in response to this call, the client can
- * ignore the prefix parameters and register for all its objects.
- *
- * The application should acknowledge this event by calling
- * InvalidationClient::Acknowledge(const AckHandle&) with the provided
- * ack_handle otherwise the event may be redelivered. The acknowledge using
- * ack_handle must be called after all the InvalidationClient::Register calls
- * have been made.
- *
- * Arguments:
- * client - the InvalidationClient invoking the listener
- * prefix - prefix of the object ids as described above.
- * prefix_length - number of bits in prefix to consider.
- */
- virtual void ReissueRegistrations(InvalidationClient* client,
- const string& prefix,
- int prefix_length) = 0;
-
- /* Informs the listener about errors that have occurred in the backend, e.g.,
- * authentication, authorization problems.
- *
- * The application should acknowledge this event by calling
- * InvalidationClient::Acknowledge(const AckHandle&) with the provided
- * ack_handle otherwise the event may be redelivered.
- *
- * Arguments:
- * client - the InvalidationClient invoking the listener
- * error_info - information about the error
- */
- virtual void InformError(InvalidationClient* client,
- const ErrorInfo& error_info) = 0;
-};
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_INCLUDE_INVALIDATION_LISTENER_H_
diff --git a/google/cacheinvalidation/include/system-resources.h b/google/cacheinvalidation/include/system-resources.h
deleted file mode 100644
index 979140c..0000000
--- a/google/cacheinvalidation/include/system-resources.h
+++ /dev/null
@@ -1,266 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Interfaces for the system resources used by the Ticl. System resources are an
-// abstraction layer over the host operating system that provides the Ticl with
-// the ability to schedule events, send network messages, store data, and
-// perform logging.
-//
-// NOTE: All the resource types and SystemResources are required to be
-// thread-safe.
-
-#ifndef GOOGLE_CACHEINVALIDATION_INCLUDE_SYSTEM_RESOURCES_H_
-#define GOOGLE_CACHEINVALIDATION_INCLUDE_SYSTEM_RESOURCES_H_
-
-#include <string>
-#include <utility>
-
-#include "google/cacheinvalidation/deps/callback.h"
-#include "google/cacheinvalidation/deps/stl-namespace.h"
-#include "google/cacheinvalidation/deps/time.h"
-
-namespace invalidation {
-
-using INVALIDATION_STL_NAMESPACE::pair;
-using INVALIDATION_STL_NAMESPACE::string;
-
-class Status;
-class SystemResources; // Declared below.
-
-typedef pair<Status, string> StatusStringPair;
-typedef INVALIDATION_CALLBACK1_TYPE(string) MessageCallback;
-typedef INVALIDATION_CALLBACK1_TYPE(bool) NetworkStatusCallback;
-typedef INVALIDATION_CALLBACK1_TYPE(StatusStringPair) ReadKeyCallback;
-typedef INVALIDATION_CALLBACK1_TYPE(Status) WriteKeyCallback;
-typedef INVALIDATION_CALLBACK1_TYPE(bool) DeleteKeyCallback;
-typedef INVALIDATION_CALLBACK1_TYPE(StatusStringPair) ReadAllKeysCallback;
-
-/* Interface for a component of a SystemResources implementation constructed by
- * calls to set* methods of SystemResourcesBuilder.
- *
- * The SystemResourcesBuilder allows applications to create a single
- * SystemResources implementation by composing individual building blocks, each
- * of which implements one of the four required interfaces (Logger, Storage,
- * NetworkChannel, Scheduler).
- *
- * However, each interface implementation may require functionality from
- * another. For example, the network implementation may need to do logging. In
- * order to allow this, we require that the interface implementations also
- * implement ResourceComponent, which specifies the single method
- * SetSystemResources. It is guaranteed that this method will be invoked exactly
- * once on each interface implementation and before any other calls are
- * made. Implementations can then save a reference to the provided resources for
- * later use.
- *
- * Note: for the obvious reasons of infinite recursion, implementations should
- * not attempt to access themselves through the provided SystemResources.
- */
-class ResourceComponent {
- public:
- virtual ~ResourceComponent() {}
-
- /* Supplies a |SystemResources| instance to the component. */
- virtual void SetSystemResources(SystemResources* resources) = 0;
-};
-
-/* Interface specifying the logging functionality provided by
- * SystemResources.
- */
-class Logger : public ResourceComponent {
- public:
- enum LogLevel {
- FINE_LEVEL,
- INFO_LEVEL,
- WARNING_LEVEL,
- SEVERE_LEVEL
- };
-
- virtual ~Logger() {}
-
- /* Logs a message.
- *
- * Arguments:
- * level - the level at which the message should be logged (e.g., INFO)
- * file - the file from which the message is being logged
- * line - the line number from which the message is being logged
- * template - the string to log, optionally containing %s sequences
- * ... - values to substitute for %s sequences in template
- */
- virtual void Log(LogLevel level, const char* file, int line,
- const char* format, ...) = 0;
-};
-
-/* Interface specifying the scheduling functionality provided by
- * SystemResources.
- */
-class Scheduler : public ResourceComponent {
- public:
- virtual ~Scheduler() {}
-
- /* Function returning a zero time delta, for readability. */
- static TimeDelta NoDelay() {
- return TimeDelta::FromMilliseconds(0);
- }
-
- /* Schedules runnable to be run on scheduler's thread after at least
- * delay.
- * Callee owns the runnable and must delete it after the task has run
- * (or if the scheduler is shut down before the task has run).
- */
- virtual void Schedule(TimeDelta delay, Closure* runnable) = 0;
-
- /* Returns whether the current code is executing on the scheduler's thread.
- */
- virtual bool IsRunningOnThread() const = 0;
-
- /* Returns the current time in milliseconds since *some* epoch (NOT
- * necessarily the UNIX epoch). The only requirement is that this time
- * advance at the rate of real time.
- */
- virtual Time GetCurrentTime() const = 0;
-};
-
-/* Interface specifying the network functionality provided by
- * SystemResources.
- */
-class NetworkChannel : public ResourceComponent {
- public:
- virtual ~NetworkChannel() {}
-
- /* Sends outgoing_message to the data center. */
- // Implementation note: this is currently a serialized ClientToServerMessage
- // protocol buffer. Implementors MAY NOT rely on this fact.
- virtual void SendMessage(const string& outgoing_message) = 0;
-
- /* Sets the receiver to which messages from the data center will be delivered.
- * Ownership of |incoming_receiver| is transferred to the network channel.
- */
- // Implementation note: this is currently a serialized ServerToClientMessage
- // protocol buffer. Implementors MAY NOT rely on this fact.
- virtual void SetMessageReceiver(MessageCallback* incoming_receiver) = 0;
-
- /* Informs the network channel that network_status_receiver be informed about
- * changes to network status changes. If the network is connected, the channel
- * should call network_Status_Receiver->Run(true) and when the network is
- * disconnected, it should call network_status_receiver->Run(false). Note that
- * multiple receivers can be registered with the channel to receive such
- * status updates.
- *
- * The informing of the status to the network_status_receiver can be
- * implemented in a best-effort manner with the caveat that indicating
- * incorrectly that the network is connected can result in unnecessary calls
- * for SendMessage. Incorrect information that the network is disconnected can
- * result in messages not being sent by the client library.
- *
- * Ownership of network_status_receiver is transferred to the network channel.
- */
- virtual void AddNetworkStatusReceiver(
- NetworkStatusCallback* network_status_receiver) = 0;
-};
-
-/* Interface specifying the storage functionality provided by
- * SystemResources. Basically, the required functionality is a small subset of
- * the method of a regular hash map.
- */
-class Storage : public ResourceComponent {
- public:
- virtual ~Storage() {}
-
- /* Attempts to persist value for the given key. Invokes done when finished,
- * passing a value that indicates whether it was successful.
- *
- * Note: If a wrie W1 finishes unsuccessfully and then W2 is issued for the
- * same key and W2 finishes successfully, W1 must NOT later overwrite W2.
- * Callee owns |done| after this call. After it calls |done->Run()|, it must
- * delete |done|.
- *
- * REQUIRES: Neither key nor value is null.
- */
- virtual void WriteKey(const string& key, const string& value,
- WriteKeyCallback* done) = 0;
-
- /* Reads the value corresponding to key and calls done with the result. If it
- * finds the key, passes a success status and the value. Else passes a failure
- * status and a null value.
- * Callee owns |done| after this call. After it calls |done->Run()|, it must
- * delete |done|.
- */
- virtual void ReadKey(const string& key, ReadKeyCallback* done) = 0;
-
- /* Deletes the key, value pair corresponding to key. If the deletion succeeds,
- * calls done with true; else calls it with false.
- * Callee owns |done| after this call. After it calls |done->Run()|, it must
- * delete |done|.
- */
- virtual void DeleteKey(const string& key, DeleteKeyCallback* done) = 0;
-
- /* Reads all the keys from the underlying store and then calls key_callback
- * with each key that was written earlier and not deleted. When all the keys
- * are done, calls key_callback with null. With each key, the code can
- * indicate a failed status, in which case the iteration stops.
- * Caller continues to own |key_callback|.
- */
- virtual void ReadAllKeys(ReadAllKeysCallback* key_callback) = 0;
-};
-
-class SystemResources {
- public:
- virtual ~SystemResources() {}
-
- /* Starts the resources.
- *
- * REQUIRES: This method is called before the resources are used.
- */
- virtual void Start() = 0;
-
- /* Stops the resources. After this point, all the resources will eventually
- * stop doing any work (e.g., scheduling, sending/receiving messages from the
- * network etc). They will eventually convert any further operations to
- * no-ops.
- *
- * REQUIRES: Start has been called.
- */
- virtual void Stop() = 0;
-
- /* Returns whether the resources are started. */
- virtual bool IsStarted() const = 0;
-
- /* Returns information about the client operating system/platform, e.g.,
- * Windows, ChromeOS (for debugging/monitoring purposes).
- */
- virtual string platform() const = 0;
-
- /* Returns an object that can be used to do logging. */
- virtual Logger* logger() = 0;
-
- /* Returns an object that can be used to persist data locally. */
- virtual Storage* storage() = 0;
-
- /* Returns an object that can be used to send and receive messages. */
- virtual NetworkChannel* network() = 0;
-
- /* Returns an object that can be used by the client library to schedule its
- * internal events.
- */
- virtual Scheduler* internal_scheduler() = 0;
-
- /* Returns an object that can be used to schedule events for the
- * application.
- */
- virtual Scheduler* listener_scheduler() = 0;
-};
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_INCLUDE_SYSTEM_RESOURCES_H_
diff --git a/google/cacheinvalidation/include/types.h b/google/cacheinvalidation/include/types.h
deleted file mode 100644
index 4e3be27..0000000
--- a/google/cacheinvalidation/include/types.h
+++ /dev/null
@@ -1,369 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Types used by the invalidation client library and its applications.
-
-#ifndef GOOGLE_CACHEINVALIDATION_INCLUDE_TYPES_H_
-#define GOOGLE_CACHEINVALIDATION_INCLUDE_TYPES_H_
-
-#include <string>
-
-#include "google/cacheinvalidation/deps/logging.h"
-#include "google/cacheinvalidation/deps/stl-namespace.h"
-
-namespace invalidation {
-
-using INVALIDATION_STL_NAMESPACE::string;
-
-/* Represents an opaque handle that can be used to acknowledge an invalidation
- * event by calling InvalidationClient::Acknowledge(AckHandle) to indicate that
- * the client has successfully handled the event.
- */
-class AckHandle {
- public:
- /* Creates a new ack handle from the serialized handle_data representation. */
- explicit AckHandle(const string& handle_data) : handle_data_(handle_data) {}
-
- const string& handle_data() const {
- return handle_data_;
- }
-
- bool operator==(const AckHandle& ack_handle) const {
- return handle_data() == ack_handle.handle_data();
- }
-
- bool IsNoOp() const {
- return handle_data_.empty();
- }
-
- private:
- /* The serialized representation of the handle. */
- string handle_data_;
-};
-
-/* An identifier for application clients in an application-defined way. I.e., a
- * client name in an application naming scheme. This is not interpreted by the
- * invalidation system - however, it is used opaquely to squelch invalidations
- * for the cient causing an update, e.g., if a client C whose app client id is
- * C.appClientId changes object X and the backend store informs the backend
- * invalidation sytsem that X was modified by X.appClientId, the invalidation to
- * C can then be squelched by the invalidation system.
- */
-class ApplicationClientId {
- public:
- /* Creates an application id for the given client_Name. */
- explicit ApplicationClientId(const string& client_name)
- : client_name_(client_name) {}
-
- const string& client_name() const {
- return client_name_;
- }
-
- bool operator==(const ApplicationClientId& app_client_id) const {
- return client_name() == app_client_id.client_name();
- }
-
- private:
- string client_name_;
-};
-
-/* Possible reasons for error in InvalidationListener::InformError. The
- * application writer must NOT assume that this is complete list since error
- * codes may be added later. That is, for error codes that it cannot handle,
- * it should not necessarily just crash the code. It may want to present a
- * dialog box to the user (say). For each ErrorReason, the ErrorInfo object
- * has a context object. We describe the type and meaning of the context for
- * each enum value below.
- */
-class ErrorReason {
- public:
- /* The provided authentication/authorization token is not valid for use. */
- static const int AUTH_FAILURE = 1;
-
- /* An unknown failure - more human-readable information is in the error
- * message.
- */
- static const int UNKNOWN_FAILURE = -1;
-};
-
-/* Extra information about the error - cast to appropriate subtype as specified
- * for the reason.
- */
-class ErrorContext {
- public:
- virtual ~ErrorContext() {}
-};
-
-/* A context with numeric data. */
-class NumberContext : public ErrorContext {
- public:
- explicit NumberContext(int number) : number_(number) {}
-
- virtual ~NumberContext() {}
-
- int number() {
- return number_;
- }
-
- private:
- int number_;
-};
-
-/* Information about an error given to the application. */
-class ErrorInfo {
- public:
- /* Constructs an ErrorInfo object given the reason for the error, whether it
- * is transient or permanent, and a helpful message describing the error.
- */
- ErrorInfo(int error_reason, bool is_transient,
- const string& error_message, const ErrorContext& context)
- : error_reason_(error_reason),
- is_transient_(is_transient),
- error_message_(error_message),
- context_(context) {}
-
- int error_reason() const {
- return error_reason_;
- }
-
- bool is_transient() const {
- return is_transient_;
- }
-
- const string& error_message() const {
- return error_message_;
- }
-
- const ErrorContext& context() const {
- return context_;
- }
-
- private:
- /* The cause of the failure. */
- int error_reason_;
-
- /* Is the error transient or permanent. See discussion in Status::Code for
- * permanent and transient failure handling.
- */
- bool is_transient_;
-
- /* Human-readable description of the error. */
- string error_message_;
-
- /* Extra information about the error - cast to appropriate object as specified
- * for the reason.
- */
- ErrorContext context_;
-};
-
-/* A class to represent a unique object id that an application can register or
- * unregister for.
- */
-class ObjectId {
- public:
- ObjectId() : is_initialized_(false) {}
-
- /* Creates an object id for the given source and name (the name is copied). */
- ObjectId(int source, const string& name)
- : is_initialized_(true), source_(source), name_(name) {}
-
- void Init(int source, const string& name) {
- is_initialized_ = true;
- source_ = source;
- name_ = name;
- }
-
- int source() const {
- CHECK(is_initialized_);
- return source_;
- }
-
- const string& name() const {
- CHECK(is_initialized_);
- return name_;
- }
-
- bool operator==(const ObjectId& object_id) const {
- CHECK(is_initialized_);
- CHECK(object_id.is_initialized_);
- return (source() == object_id.source()) && (name() == object_id.name());
- }
-
- private:
- /* Whether the object id has been initialized. */
- bool is_initialized_;
-
- /* The invalidation source type. */
- int source_;
-
- /* The name/unique id for the object. */
- string name_;
-};
-
-/* A class to represent an invalidation for a given object/version and an
- * optional payload.
- */
-class Invalidation {
- public:
- Invalidation() : is_initialized_(false) {}
-
- /* Creates a restarted invalidation for the given object and version. */
- Invalidation(const ObjectId& object_id, int64 version) {
- Init(object_id, version, true);
- }
-
- /* Creates an invalidation for the given object, version, and payload. */
- Invalidation(const ObjectId& object_id, int64 version,
- const string& payload) {
- Init(object_id, version, payload, true);
- }
-
- /*
- * Creates an invalidation for the given object, version, payload,
- * and restarted flag.
- */
- Invalidation(const ObjectId& object_id, int64 version, const string& payload,
- bool is_trickle_restart) {
- Init(object_id, version, payload, is_trickle_restart);
- }
-
-
- void Init(const ObjectId& object_id, int64 version, bool is_trickle_restart) {
- Init(object_id, version, false, "", is_trickle_restart);
- }
-
- void Init(const ObjectId& object_id, int64 version, const string& payload,
- bool is_trickle_restart) {
- Init(object_id, version, true, payload, is_trickle_restart);
- }
-
- const ObjectId& object_id() const {
- return object_id_;
- }
-
- int64 version() const {
- return version_;
- }
-
- bool has_payload() const {
- return has_payload_;
- }
-
- const string& payload() const {
- return payload_;
- }
-
- // This method is for internal use only.
- bool is_trickle_restart_for_internal_use() const {
- return is_trickle_restart_;
- }
-
- bool operator==(const Invalidation& invalidation) const {
- return (object_id() == invalidation.object_id()) &&
- (version() == invalidation.version()) &&
- (is_trickle_restart_for_internal_use() ==
- invalidation.is_trickle_restart_for_internal_use()) &&
- (has_payload() == invalidation.has_payload()) &&
- (payload() == invalidation.payload());
- }
-
- private:
- void Init(const ObjectId& object_id, int64 version, bool has_payload,
- const string& payload, bool is_trickle_restart) {
- is_initialized_ = true;
- object_id_.Init(object_id.source(), object_id.name());
- version_ = version;
- has_payload_ = has_payload;
- payload_ = payload;
- is_trickle_restart_ = is_trickle_restart;
- }
-
- /* Whether this invalidation has been initialized. */
- bool is_initialized_;
-
- /* The object being invalidated/updated. */
- ObjectId object_id_;
-
- /* The new version of the object. */
- int64 version_;
-
- /* Whether or not the invalidation includes a payload. */
- bool has_payload_;
-
- /* Optional payload for the client. */
- string payload_;
-
- /* Flag whether the trickle restarts at this invalidation. */
- bool is_trickle_restart_;
-};
-
-/* Information given to about a operation - success, temporary or permanent
- * failure.
- */
-class Status {
- public:
- /* Actual status of the operation: Whether successful, transient or permanent
- * failure.
- */
- enum Code {
- /* Operation was successful. */
- SUCCESS,
-
- /* Operation had a transient failure. The application can retry the failed
- * operation later - if it chooses to do so, it must use a sensible backoff
- * policy such as exponential backoff.
- */
- TRANSIENT_FAILURE,
-
- /* Opration has a permanent failure. Application must not automatically
- * retry without fixing the situation (e.g., by presenting a dialog box to
- * the user).
- */
- PERMANENT_FAILURE
- };
-
- /* Creates a new Status object given the code and message. */
- Status(Code code, const string& message) : code_(code), message_(message) {}
-
- bool IsSuccess() const {
- return code_ == SUCCESS;
- }
-
- bool IsTransientFailure() const {
- return code_ == TRANSIENT_FAILURE;
- }
-
- bool IsPermanentFailure() const {
- return code_ == PERMANENT_FAILURE;
- }
-
- const string& message() const {
- return message_;
- }
-
- bool operator==(const Status& status) const {
- return (code_ == status.code_) && (message() == status.message());
- }
-
- private:
- /* Success or failure. */
- Code code_;
-
- /* A message describing why the state was unknown, for debugging. */
- string message_;
-};
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_INCLUDE_TYPES_H_
diff --git a/google/cacheinvalidation/test/deterministic-scheduler.cc b/google/cacheinvalidation/test/deterministic-scheduler.cc
deleted file mode 100644
index 3def8f7..0000000
--- a/google/cacheinvalidation/test/deterministic-scheduler.cc
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "google/cacheinvalidation/test/deterministic-scheduler.h"
-
-namespace invalidation {
-
-void DeterministicScheduler::StopScheduler() {
- run_state_.Stop();
- // Delete any tasks that haven't been run.
- while (!work_queue_.empty()) {
- TaskEntry top_elt = work_queue_.top();
- work_queue_.pop();
- delete top_elt.task;
- }
-}
-
-void DeterministicScheduler::Schedule(TimeDelta delay, Closure* task) {
- CHECK(IsCallbackRepeatable(task));
- CHECK(run_state_.IsStarted());
- TLOG(logger_, INFO, "(Now: %d) Enqueuing %p with delay %d",
- current_time_.ToInternalValue(), task, delay.InMilliseconds());
- work_queue_.push(TaskEntry(GetCurrentTime() + delay, current_id_++, task));
-}
-
-void DeterministicScheduler::PassTime(TimeDelta delta_time, TimeDelta step) {
- CHECK(delta_time >= TimeDelta()) << "cannot pass a negative amount of time";
- TimeDelta cumulative = TimeDelta();
-
- // Run tasks that are ready to run now.
- RunReadyTasks();
-
- // Advance in increments of |step| until doing so would cause us to go past
- // the requested |delta_time|.
- while ((cumulative + step) < delta_time) {
- ModifyTime(step);
- cumulative += step;
- RunReadyTasks();
- }
-
- // Then advance one final time to finish out the interval.
- ModifyTime(delta_time - cumulative);
- RunReadyTasks();
-}
-
-void DeterministicScheduler::RunReadyTasks() {
- running_internal_ = true;
- while (RunNextTask()) {
- continue;
- }
- running_internal_ = false;
-}
-
-bool DeterministicScheduler::RunNextTask() {
- if (!work_queue_.empty()) {
- // The queue is not empty, so get the first task and see if its scheduled
- // execution time has passed.
- TaskEntry top_elt = work_queue_.top();
- if (top_elt.time <= GetCurrentTime()) {
- // The task is scheduled to run in the past or present, so remove it
- // from the queue and run the task.
- work_queue_.pop();
- TLOG(logger_, FINE, "(Now: %d) Running task %p",
- current_time_.ToInternalValue(), top_elt.task);
- top_elt.task->Run();
- delete top_elt.task;
- return true;
- }
- }
- return false;
-}
-
-} // namespace invalidation
diff --git a/google/cacheinvalidation/test/deterministic-scheduler.h b/google/cacheinvalidation/test/deterministic-scheduler.h
deleted file mode 100644
index 932932f..0000000
--- a/google/cacheinvalidation/test/deterministic-scheduler.h
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// An implementation of the Scheduler interface for unit testing (in a
-// single-threaded environment).
-
-#ifndef GOOGLE_CACHEINVALIDATION_TEST_DETERMINISTIC_SCHEDULER_H_
-#define GOOGLE_CACHEINVALIDATION_TEST_DETERMINISTIC_SCHEDULER_H_
-
-#include <queue>
-#include <string>
-#include <utility>
-
-#include "google/cacheinvalidation/include/system-resources.h"
-#include "google/cacheinvalidation/deps/callback.h"
-#include "google/cacheinvalidation/deps/logging.h"
-#include "google/cacheinvalidation/deps/string_util.h"
-#include "google/cacheinvalidation/deps/time.h"
-#include "google/cacheinvalidation/impl/log-macro.h"
-#include "google/cacheinvalidation/impl/run-state.h"
-
-namespace invalidation {
-
-// An entry in the work queue. Ensures that tasks don't run until their
-// scheduled time, and for a given time, they run in the order in which they
-// were enqueued.
-struct TaskEntry {
- TaskEntry(Time time, int64 id, Closure* task)
- : time(time), id(id), task(task) {}
-
- bool operator<(const TaskEntry& other) const {
- // Priority queue returns *largest* element first.
- return (time > other.time) ||
- ((time == other.time) && (id > other.id));
- }
- Time time; // the time at which to run
- int64 id; // the order in which this task was enqueued
- Closure* task; // the task to be run
-};
-
-class DeterministicScheduler : public Scheduler {
- public:
- // Caller retains ownershup of |logger|.
- explicit DeterministicScheduler(Logger* logger)
- : current_id_(0), running_internal_(false), logger_(logger) {}
-
- virtual ~DeterministicScheduler() {
- StopScheduler();
- }
-
- virtual void SetSystemResources(SystemResources* resources) {
- // Nothing to do.
- }
-
- virtual Time GetCurrentTime() const {
- return current_time_;
- }
-
- void StartScheduler() {
- run_state_.Start();
- }
-
- void StopScheduler();
-
- virtual void Schedule(TimeDelta delay, Closure* task);
-
- virtual bool IsRunningOnThread() const {
- return running_internal_;
- }
-
- void SetInitialTime(Time new_time) {
- current_time_ = new_time;
- }
-
- // Passes |delta_time| in increments of at most |step|, executing all pending
- // tasks during that interval.
- void PassTime(TimeDelta delta_time, TimeDelta step);
-
- // Passes |delta_time| in default-sized increments, executing all pending
- // tasks.
- void PassTime(TimeDelta delta_time) {
- PassTime(delta_time, DefaultTimeStep());
- }
-
- private:
- // Runs all the work in the queue that should be executed by the current time.
- // Note that tasks run may enqueue additional immediate tasks, and this call
- // won't return until they've completed as well. While these tasks are
- // running, the running_internal_ flag is set, so IsRunningOnThread()
- // will return true.
- void RunReadyTasks();
-
- // Default time step when simulating passage of time. Chosen to be
- // significantly smaller than any scheduling interval used by the client
- // library.
- static TimeDelta DefaultTimeStep() {
- return TimeDelta::FromMilliseconds(10);
- }
-
- void ModifyTime(TimeDelta delta_time) {
- current_time_ += delta_time;
- }
-
- // Attempts to run a task, returning true is there was a task to run.
- bool RunNextTask();
-
- // The current time, which may be set by the test.
- Time current_time_;
-
- // The id number of the next task.
- uint64 current_id_;
-
- // Whether or not the scheduler has been started/stopped.
- RunState run_state_;
-
- // Whether or not we're currently running internal tasks from the internal
- // queue.
- bool running_internal_;
-
- // A priority queue on which the actual tasks are enqueued.
- std::priority_queue<TaskEntry> work_queue_;
-
- // A logger.
- Logger* logger_;
-};
-
-// A simple deterministic scheduler that always indicates that it is on
-// the correct thread.
-class SimpleDeterministicScheduler : public DeterministicScheduler {
- public:
- explicit SimpleDeterministicScheduler(Logger* logger)
- : DeterministicScheduler(logger) {}
-
- virtual bool IsRunningOnThread() const {
- return true;
- }
-};
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_TEST_DETERMINISTIC_SCHEDULER_H_
diff --git a/google/cacheinvalidation/test/test-logger.cc b/google/cacheinvalidation/test/test-logger.cc
deleted file mode 100644
index 74e0a47..0000000
--- a/google/cacheinvalidation/test/test-logger.cc
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "google/cacheinvalidation/deps/string_util.h"
-#include "google/cacheinvalidation/test/test-logger.h"
-
-namespace invalidation {
-
-TestLogger::~TestLogger() {}
-
-void TestLogger::Log(LogLevel level, const char* file, int line,
- const char* format, ...) {
- va_list ap;
- va_start(ap, format);
- string result;
- StringAppendV(&result, format, ap);
- switch (level) {
- case FINE_LEVEL:
- case INFO_LEVEL:
- LogMessage(file, line, logging::LOG_INFO).stream() << result;
- break;
-
- case WARNING_LEVEL:
- LogMessage(file, line, logging::LOG_WARNING).stream() << result;
- break;
-
- case SEVERE_LEVEL:
- LogMessage(file, line, logging::LOG_ERROR).stream() << result;
- break;
-
- default:
- LOG(FATAL) << "unknown log level: " << level;
- break;
- }
- va_end(ap);
-}
-
-void TestLogger::SetSystemResources(SystemResources* resources) {
- // Nothing to do (logger uses no other resources).
-}
-
-} // namespace invalidation
diff --git a/google/cacheinvalidation/test/test-logger.h b/google/cacheinvalidation/test/test-logger.h
deleted file mode 100644
index 55de320..0000000
--- a/google/cacheinvalidation/test/test-logger.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef GOOGLE_CACHEINVALIDATION_TEST_TEST_LOGGER_H_
-#define GOOGLE_CACHEINVALIDATION_TEST_TEST_LOGGER_H_
-
-#include "google/cacheinvalidation/include/system-resources.h"
-#include "google/cacheinvalidation/deps/logging.h"
-
-namespace invalidation {
-
-// A simple logger implementation for testing.
-class TestLogger : public Logger {
- public:
- virtual ~TestLogger();
-
- // Overrides from Logger.
- virtual void Log(LogLevel level, const char* file, int line,
- const char* format, ...);
-
- virtual void SetSystemResources(SystemResources* resources);
-};
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_TEST_TEST_LOGGER_H_
diff --git a/google/cacheinvalidation/test/test-utils.cc b/google/cacheinvalidation/test/test-utils.cc
deleted file mode 100644
index 27c602c..0000000
--- a/google/cacheinvalidation/test/test-utils.cc
+++ /dev/null
@@ -1,254 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-//
-// Helper classes for tests including a mock Scheduler, a mock network and a
-// mock storage layer.
-
-#include <set>
-
-#include "google/cacheinvalidation/impl/proto-converter.h"
-#include "google/cacheinvalidation/test/test-utils.h"
-#include "google/cacheinvalidation/test/test-logger.h"
-#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
-
-namespace invalidation {
-
-using ::google::protobuf::io::StringOutputStream;
-using ::testing::DeleteArg;
-using ::testing::StrictMock;
-
-// Creates an Action InvokeNetworkStatusCallback<k>() that calls the Run method
-// on the kth argument with value |true|.
-ACTION_TEMPLATE(
- InvokeNetworkStatusCallback,
- HAS_1_TEMPLATE_PARAMS(int, k),
- AND_0_VALUE_PARAMS()) {
- std::tr1::get<k>(args)->Run(true);
-}
-
-const char* UnitTestBase::kClientToken = "Dummy";
-
-void UnitTestBase::SetUp() {
- // Start time at an arbitrary point, just to make sure we don't depend on it
- // being 0.
- start_time = Time() + TimeDelta::FromDays(9);
- statistics.reset(new Statistics());
- reg_summary.reset(new RegistrationSummary());
- InitZeroRegistrationSummary(reg_summary.get());
- InitSystemResources(); // Set up system resources
- message_callback = NULL;
-
- // Start the scheduler and resources.
- internal_scheduler->StartScheduler();
- resources->Start();
-}
-
-void UnitTestBase::TearDown() {
- if (message_callback != NULL) {
- delete message_callback;
- message_callback = NULL;
- }
-}
-
-void UnitTestBase::InitSystemResources() {
- logger = new TestLogger();
-
- // Use a deterministic scheduler for the protocol handler's internals, since
- // we want precise control over when batching intervals expire.
- internal_scheduler = new DeterministicScheduler(logger);
- internal_scheduler->SetInitialTime(start_time);
-
- // Use a mock network to let us trap the protocol handler's message receiver
- // and its attempts to send messages.
- network = new StrictMock<MockNetwork>();
- listener_scheduler = new StrictMock<MockScheduler>();
-
- // Storage shouldn't be used by the protocol handler, so use a strict mock
- // to catch any accidental calls.
- storage = new StrictMock<MockStorage>();
-
- // The BasicSystemResources will set itself in the components.
- EXPECT_CALL(*network, SetSystemResources(_));
- EXPECT_CALL(*storage, SetSystemResources(_));
- EXPECT_CALL(*listener_scheduler, SetSystemResources(_));
-
- // Create the actual resources.
- resources.reset(new BasicSystemResources(
- logger, internal_scheduler, listener_scheduler, network, storage,
- "unit-test"));
-}
-
-void UnitTestBase::InitCommonExpectations() {
- // When we construct the protocol handler, it will set a message receiver on
- // the network. Intercept the call and save the callback.
- EXPECT_CALL(*network, SetMessageReceiver(_))
- .WillOnce(SaveArg<0>(&message_callback));
-
- // It will also add a network status receiver. The network channel takes
- // ownership. Invoke it once with |true| just to exercise that code path,
- // then delete it since we won't need it anymore.
- EXPECT_CALL(*network, AddNetworkStatusReceiver(_))
- .WillOnce(DoAll(InvokeNetworkStatusCallback<0>(), DeleteArg<0>()));
-}
-
-void UnitTestBase::InitRegistrationMessage(const vector<ObjectIdP>& oids,
- bool is_reg, RegistrationMessage *reg_message) {
- RegistrationP::OpType op_type = is_reg ?
- RegistrationP::REGISTER : RegistrationP::UNREGISTER;
- for (size_t i = 0; i < oids.size(); i++) {
- ProtoHelpers::InitRegistrationP(
- oids[i], op_type, reg_message->add_registration());
- }
-}
-
-void UnitTestBase::InitErrorMessage(ErrorMessage::Code error_code,
- const string& description, ErrorMessage* error_message) {
- error_message->set_code(error_code);
- error_message->set_description(description);
-}
-
-void UnitTestBase::InitInvalidationMessage(const vector<InvalidationP>& invs,
- InvalidationMessage *inv_message) {
- for (size_t i = 0; i < invs.size(); ++i) {
- inv_message->add_invalidation()->CopyFrom(invs[i]);
- }
-}
-
-TimeDelta UnitTestBase::EndOfTestWaitTime() {
- return TimeDelta::FromSeconds(50);
-}
-
-TimeDelta UnitTestBase::MessageHandlingDelay() {
- return TimeDelta::FromMilliseconds(50);
-}
-
-void UnitTestBase::InitTestObjectIds(int count, vector<ObjectIdP>* object_ids) {
- for (int i = 0; i < count; ++i) {
- ObjectIdP object_id;
- object_id.set_source(ObjectSource_Type_TEST);
- object_id.set_name(StringPrintf("oid%d", i));
- object_ids->push_back(object_id);
- }
-}
-
-void UnitTestBase::ConvertFromObjectIdProtos(
- const vector<ObjectIdP>& oid_protos, vector<ObjectId> *oids) {
- for (size_t i = 0; i < oid_protos.size(); ++i) {
- ObjectId object_id;
- ProtoConverter::ConvertFromObjectIdProto(oid_protos[i], &object_id);
- oids->push_back(object_id);
- }
-}
-
-void UnitTestBase::ConvertFromInvalidationProtos(
- const vector<InvalidationP>& inv_protos, vector<Invalidation> *invs) {
- for (size_t i = 0; i < inv_protos.size(); ++i) {
- Invalidation inv;
- ProtoConverter::ConvertFromInvalidationProto(inv_protos[i], &inv);
- invs->push_back(inv);
- }
-}
-
-void UnitTestBase::MakeInvalidationsFromObjectIds(
- const vector<ObjectIdP>& object_ids,
- vector<InvalidationP>* invalidations) {
- for (size_t i = 0; i < object_ids.size(); ++i) {
- InvalidationP invalidation;
- invalidation.mutable_object_id()->CopyFrom(object_ids[i]);
- invalidation.set_is_known_version(true);
- invalidation.set_is_trickle_restart(true);
-
- // Pick an arbitrary version number; it shouldn't really matter, but we
- // try not to make them correlated too much with the object name.
- invalidation.set_version(100 + ((i * 19) % 31));
- invalidations->push_back(invalidation);
- }
-}
-
-void UnitTestBase::MakeRegistrationStatusesFromObjectIds(
- const vector<ObjectIdP>& object_ids, bool is_reg, bool is_success,
- vector<RegistrationStatus>* registration_statuses) {
- for (size_t i = 0; i < object_ids.size(); ++i) {
- RegistrationStatus registration_status;
- registration_status.mutable_registration()->mutable_object_id()->CopyFrom(
- object_ids[i]);
- registration_status.mutable_registration()->set_op_type(
- is_reg ? RegistrationP::REGISTER : RegistrationP::UNREGISTER);
- registration_status.mutable_status()->set_code(
- is_success ? StatusP::SUCCESS : StatusP::TRANSIENT_FAILURE);
- registration_statuses->push_back(registration_status);
- }
-}
-
-TimeDelta UnitTestBase::GetMaxDelay(int delay_ms) {
- int64 extra_delay_ms = (delay_ms * kDefaultSmearPercent) / 100.0;
- return TimeDelta::FromMilliseconds(extra_delay_ms + delay_ms);
-}
-
-TimeDelta UnitTestBase::GetMaxBatchingDelay(
- const ProtocolHandlerConfigP& config) {
- return GetMaxDelay(config.batching_delay_ms());
-}
-
-void UnitTestBase::InitZeroRegistrationSummary(RegistrationSummary* summary) {
- summary->set_num_registrations(0);
- // "\3329..." can trigger MSVC to warn about "octal escape sequence terminated
- // by decimal number", so break the string between the two to avoid the
- // warning.
- string zero_digest(
- "\332" "9\243\356^kK\r2U\277\357\225`\030\220\257\330\007\t");
- summary->set_registration_digest(zero_digest);
-}
-
-void UnitTestBase::InitServerHeader(const string& token, ServerHeader* header) {
- ProtoHelpers::InitProtocolVersion(header->mutable_protocol_version());
- header->set_client_token(token);
- if (reg_summary.get() != NULL) {
- header->mutable_registration_summary()->CopyFrom(*reg_summary.get());
- }
-
- // Use arbitrary server time and message id, since they don't matter.
- header->set_server_time_ms(314159265);
- header->set_message_id("message-id-for-test");
-}
-
-bool UnitTestBase::CompareMessages(
- const ::google::protobuf::MessageLite& expected,
- const ::google::protobuf::MessageLite& actual) {
- // TODO: Fill in proper implementation.
- return true;
-}
-
-void UnitTestBase::ProcessIncomingMessage(const ServerToClientMessage& message,
- TimeDelta delay) {
- string serialized;
- message.SerializeToString(&serialized);
- message_callback->Run(serialized);
- internal_scheduler->PassTime(delay);
-}
-
-Matcher<ClientHeader> UnitTestBase::ClientHeaderMatches(
- const ClientHeader* header) {
- return AllOf(Property(&ClientHeader::protocol_version,
- EqualsProto(header->protocol_version())),
- Property(&ClientHeader::registration_summary,
- EqualsProto(header->registration_summary())),
- Property(&ClientHeader::max_known_server_time_ms,
- header->max_known_server_time_ms()),
- Property(&ClientHeader::message_id,
- header->message_id()));
-}
-
-} // namespace invalidation
diff --git a/google/cacheinvalidation/test/test-utils.h b/google/cacheinvalidation/test/test-utils.h
deleted file mode 100644
index 4c55803..0000000
--- a/google/cacheinvalidation/test/test-utils.h
+++ /dev/null
@@ -1,320 +0,0 @@
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-//
-// Helper classes for tests including a mock Scheduler, a mock network, a
-// mock storage layer, and a mock listener.
-
-#ifndef GOOGLE_CACHEINVALIDATION_TEST_TEST_UTILS_H_
-#define GOOGLE_CACHEINVALIDATION_TEST_TEST_UTILS_H_
-
-#include "google/cacheinvalidation/client_protocol.pb.h"
-#include "google/cacheinvalidation/include/invalidation-listener.h"
-#include "google/cacheinvalidation/include/types.h"
-#include "google/cacheinvalidation/types.pb.h"
-#include "google/cacheinvalidation/deps/gmock.h"
-#include "google/cacheinvalidation/deps/string_util.h"
-#include "google/cacheinvalidation/impl/basic-system-resources.h"
-#include "google/cacheinvalidation/impl/constants.h"
-#include "google/cacheinvalidation/impl/log-macro.h"
-#include "google/cacheinvalidation/impl/protocol-handler.h"
-#include "google/cacheinvalidation/impl/statistics.h"
-#include "google/cacheinvalidation/test/deterministic-scheduler.h"
-
-namespace invalidation {
-
-using ::ipc::invalidation::ObjectSource_Type_TEST;
-using ::ipc::invalidation::ClientHeader;
-using ::ipc::invalidation::ClientVersion;
-using ::ipc::invalidation::InvalidationP;
-using ::ipc::invalidation::ObjectIdP;
-using ::ipc::invalidation::ProtocolVersion;
-using ::ipc::invalidation::RegistrationP_OpType_REGISTER;
-using ::ipc::invalidation::RegistrationP_OpType_UNREGISTER;
-using ::ipc::invalidation::RegistrationStatus;
-using ::ipc::invalidation::RegistrationSummary;
-using ::ipc::invalidation::ServerHeader;
-using ::ipc::invalidation::ServerToClientMessage;
-using ::ipc::invalidation::StatusP_Code_SUCCESS;
-using ::ipc::invalidation::Version;
-using ::google::protobuf::MessageLite;
-using ::testing::_;
-using ::testing::EqualsProto;
-using ::testing::Matcher;
-using ::testing::Property;
-using ::testing::SaveArg;
-using ::testing::StrictMock;
-
-/* A random class whose RandDouble method always returns a given constant. */
-class FakeRandom : public Random {
- public:
- // Constructs a fake random generator that always returns |return_value|,
- // which must be in the range [0, 1).
- explicit FakeRandom(double return_value)
- : Random(0), return_value_(return_value) {
- CHECK_GE(return_value_, 0.0);
- CHECK_LT(return_value_, 1.0);
- }
-
- virtual ~FakeRandom() {}
-
- virtual double RandDouble() {
- return return_value_;
- }
-
- private:
- double return_value_;
-};
-
-// A mock of the Scheduler interface.
-class MockScheduler : public Scheduler {
- public:
- MOCK_METHOD2(Schedule, void(TimeDelta, Closure*)); // NOLINT
- MOCK_CONST_METHOD0(IsRunningOnThread, bool());
- MOCK_CONST_METHOD0(GetCurrentTime, Time());
- MOCK_METHOD1(SetSystemResources, void(SystemResources*)); // NOLINT
-};
-
-// A mock of the Network interface.
-class MockNetwork : public NetworkChannel {
- public:
- MOCK_METHOD1(SendMessage, void(const string&)); // NOLINT
- MOCK_METHOD1(SetMessageReceiver, void(MessageCallback*)); // NOLINT
- MOCK_METHOD1(AddNetworkStatusReceiver, void(NetworkStatusCallback*)); // NOLINT
- MOCK_METHOD1(SetSystemResources, void(SystemResources*)); // NOLINT
-};
-
-// A mock of the Storage interface.
-class MockStorage : public Storage {
- public:
- MOCK_METHOD3(WriteKey, void(const string&, const string&, WriteKeyCallback*)); // NOLINT
- MOCK_METHOD2(ReadKey, void(const string&, ReadKeyCallback*)); // NOLINT
- MOCK_METHOD2(DeleteKey, void(const string&, DeleteKeyCallback*)); // NOLINT
- MOCK_METHOD1(ReadAllKeys, void(ReadAllKeysCallback*)); // NOLINT
- MOCK_METHOD1(SetSystemResources, void(SystemResources*)); // NOLINT
-};
-
-// A mock of the InvalidationListener interface.
-class MockInvalidationListener : public InvalidationListener {
- public:
- MOCK_METHOD1(Ready, void(InvalidationClient*)); // NOLINT
-
- MOCK_METHOD3(Invalidate,
- void(InvalidationClient *, const Invalidation&, // NOLINT
- const AckHandle&)); // NOLINT
-
- MOCK_METHOD3(InvalidateUnknownVersion,
- void(InvalidationClient *, const ObjectId&,
- const AckHandle&)); // NOLINT
-
- MOCK_METHOD2(InvalidateAll,
- void(InvalidationClient *, const AckHandle&)); // NOLINT
-
- MOCK_METHOD3(InformRegistrationStatus,
- void(InvalidationClient*, const ObjectId&, RegistrationState)); // NOLINT
-
- MOCK_METHOD4(InformRegistrationFailure,
- void(InvalidationClient*, const ObjectId&, bool, const string&));
-
- MOCK_METHOD3(ReissueRegistrations,
- void(InvalidationClient*, const string&, int));
-
- MOCK_METHOD2(InformError,
- void(InvalidationClient*, const ErrorInfo&));
-};
-
-// A base class for unit tests to share common methods and helper routines.
-class UnitTestBase : public testing::Test {
- public:
- // Default smearing to be done to randomize delays. Zero to get
- // precise delays.
- static const int kDefaultSmearPercent = 0;
-
- // The token or nonce used by default for a client in client to server or
- // server to client messages.
- static const char *kClientToken;
-
- // When "waiting" at the end of a test to make sure nothing happens, how long
- // to wait.
- static TimeDelta EndOfTestWaitTime();
-
- // When "waiting" at the end of a test to make sure nothing happens, how long
- // to wait. This delay will not only allow to run the processing on the
- // workqueue but will also give some 'extra' time to the code to do other
- // (incorrect) activities if there is a bug, e.g., make an uneccessary
- // listener call, etc.
- static TimeDelta MessageHandlingDelay();
-
- // Populates |object_ids| with |count| object ids in the TEST id space, each
- // named oid<n>.
- static void InitTestObjectIds(int count, vector<ObjectIdP>* object_ids);
-
- // Converts object id protos in |oid_protos| to ObjecIds in |oids|.
- static void ConvertFromObjectIdProtos(const vector<ObjectIdP>& oid_protos,
- vector<ObjectId> *oids);
-
- // Converts invalidation protos in |inv_protos| to Invalidations in |invs|.
- static void ConvertFromInvalidationProtos(
- const vector<InvalidationP>& inv_protos, vector<Invalidation> *invs);
-
- // For each object id in |object_ids|, adds an invalidation to |invalidations|
- // for that object at an arbitrary version.
- static void MakeInvalidationsFromObjectIds(
- const vector<ObjectIdP>& object_ids,
- vector<InvalidationP>* invalidations);
-
- // For each object in |object_ids|, makes a SUCCESSful registration status for
- // that object, alternating between REGISTER and UNREGISTER. The precise
- // contents of these messages are unimportant to the protocol handler; we just
- // need them to pass the message validator.
- static void MakeRegistrationStatusesFromObjectIds(
- const vector<ObjectIdP>& object_ids, bool is_reg, bool is_success,
- vector<RegistrationStatus>* registration_statuses);
-
- // Returns the maximum smeared delay possible for |delay_ms| given the
- // |Smearer|'s default smearing.
- static TimeDelta GetMaxDelay(int delay_ms);
-
- // Returns the maximum batching delay that a message will incur in the
- // protocol handler.
- static TimeDelta GetMaxBatchingDelay(const ProtocolHandlerConfigP& config);
-
- // Initializes |summary| with a registration summary for 0 objects.
- static void InitZeroRegistrationSummary(RegistrationSummary* summary);
-
- // Creates a matcher for the parts of the header that the test can predict.
- static Matcher<ClientHeader> ClientHeaderMatches(const ClientHeader* header);
-
- // Initialize |reg_message| to contain registrations for all objects in |oids|
- // with |is_reg| indicating whether the operation is register or unregister.
- static void InitRegistrationMessage(const vector<ObjectIdP>& oids,
- bool is_reg, RegistrationMessage *reg_message);
-
- // Initializes |inv_message| to contain the invalidations |invs|.
- static void InitInvalidationMessage(const vector<InvalidationP>& invs,
- InvalidationMessage *inv_message);
-
- // Initializes |error_message| to contain given the |error_code| and error
- // |description|.
- static void InitErrorMessage(ErrorMessage::Code error_code,
- const string& description, ErrorMessage* error_message);
-
- // Performs setup for protocol handler unit tests, e.g. creating resource
- // components and setting up common expectations for certain mock objects.
- virtual void SetUp();
-
- // Tears down the test, e.g., drains any schedulers if needed.
- virtual void TearDown();
-
- // Initializes the basic system resources, using mocks for various components.
- void InitSystemResources();
-
- // Sets up some common expectations for the system resources.
- void InitCommonExpectations();
-
- // Initializes a server header with the given token (registration summary is
- // picked up the internal state |reg_summary|).
- void InitServerHeader(const string& token, ServerHeader* header);
-
- // Gives a ServerToClientMessage |message| to the protocol handler and
- // passes time in the internal scheduler by |delay| waiting for processing to
- // be done.
- void ProcessIncomingMessage(const ServerToClientMessage& message,
- TimeDelta delay);
-
- // Returns true iff the messages are equal (with lists interpreted as sets).
- bool CompareMessages(
- const ::google::protobuf::MessageLite& expected,
- const ::google::protobuf::MessageLite& actual);
-
- // Checks that |vec1| and |vec2| contain the same number of elements
- // and each element in |vec1| is present in |vec2| and vice-versa (Uses the
- // == operator for comparing). Returns true iff it is the case. Note that this
- // method will return true for (aab, abb)
- template <class T>
- static bool CompareVectorsAsSets(const vector<T>& vec1,
- const vector<T>& vec2) {
- if (vec1.size() != vec2.size()) {
- return false;
- }
- for (size_t i = 0; i < vec1.size(); i++) {
- bool found = false;
- for (size_t j = 0; (j < vec2.size()) && !found; j++) {
- found = found || (vec1[i] == vec2[j]);
- }
- if (!found) {
- return false;
- }
- }
- return true;
- }
-
- //
- // Internal state
- //
-
- // The time at which the test started. Initialized to an arbitrary value to
- // ensure that we don't depend on it starting at 0.
- Time start_time;
-
- // Components of BasicSystemResources. It takes ownership of all of these,
- // and its destructor deletes them, so we need to create fresh ones for each
- // test.
-
- // Use a deterministic scheduler for the protocol handler's internals, since
- // we want precise control over when batching intervals expire.
- DeterministicScheduler* internal_scheduler;
-
- // DeterministicScheduler or MockScheduler depending on the test.
- MockScheduler* listener_scheduler;
-
- // Use a mock network to let us trap the protocol handler's message receiver
- // and its attempts to send messages.
- MockNetwork* network;
-
- // A logger.
- Logger* logger;
-
- // Storage shouldn't be used by the protocol handler, so use a strict mock to
- // catch any accidental calls.
- MockStorage* storage;
-
- // System resources (owned by the test).
- scoped_ptr<BasicSystemResources> resources;
-
- // Statistics object for counting occurrences of different types of events.
- scoped_ptr<Statistics> statistics;
-
- // Message callback installed by the protocol handler. Captured by the mock
- // network.
- MessageCallback* message_callback;
-
- // Registration summary to be placed in messages from the client to the server
- // and vice-versa.
- scoped_ptr<RegistrationSummary> reg_summary;
-};
-
-// Creates an action InvokeAndDeleteClosure<k> that invokes the kth closure and
-// deletes it after the Run method has been called.
-ACTION_TEMPLATE(
- InvokeAndDeleteClosure,
- HAS_1_TEMPLATE_PARAMS(int, k),
- AND_0_VALUE_PARAMS()) {
- std::tr1::get<k>(args)->Run();
- delete std::tr1::get<k>(args);
-}
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_TEST_TEST_UTILS_H_
diff --git a/google/cacheinvalidation/types.proto b/google/cacheinvalidation/types.proto
deleted file mode 100644
index f953b79..0000000
--- a/google/cacheinvalidation/types.proto
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2011 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Enums definitions for main types in the cache invalidation system.
-
-syntax = "proto2";
-
-option optimize_for = LITE_RUNTIME;
-
-package ipc.invalidation;
-
-// The type of client / application.
-message ClientType {
- enum Type {
- INTERNAL = 1;
- TEST = 2; // Uncontrolled client space for use by anyone for testing.
- DEMO = 4; // A demo client type that can be used for testing.
-
- // Numbers below 1000 are reserved for internal use.
- CHROME_SYNC = 1004;
- CHROME_SYNC_ANDROID = 1018;
- CHROME_SYNC_IOS = 1038;
- CHROME_SYNC_GCM_DESKTOP = 1055;
- CHROME_SYNC_GCM_IOS = 1056;
- }
- optional Type type = 1;
-}
-
-// The property that hosts the object.
-message ObjectSource {
- //
- // NOTE: This enum MUST be kept in sync with ObjectIdP.Source in
- // internal.proto.
- //
- enum Type {
- INTERNAL = 1;
- TEST = 2; // Uncontrolled object space for use by anyone for testing.
- DEMO = 4; // A demo object source that can be used for testing.
-
- // Numbers below 1000 are reserved for internal use.
- CHROME_SYNC = 1004;
- COSMO_CHANGELOG = 1014;
- CHROME_COMPONENTS = 1025;
- CHROME_PUSH_MESSAGING = 1030;
- }
- optional Type type = 1;
-}
-
-// A dummy message to enclose various enum constant declarations.
-message Constants {
- // Constants related to object versions.
- enum ObjectVersion {
- // Version number used to indicate that an object's version is unknown.
- UNKNOWN = 0;
- }
-}
diff --git a/java/COPYING b/java/COPYING
deleted file mode 100644
index d645695..0000000
--- a/java/COPYING
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/java/com/google/ipc/invalidation/common/BaseCommonInvalidationConstants.java b/java/com/google/ipc/invalidation/common/BaseCommonInvalidationConstants.java
deleted file mode 100644
index 4244c2e..0000000
--- a/java/com/google/ipc/invalidation/common/BaseCommonInvalidationConstants.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.ipc.invalidation.common;
-
-/** Various constants common to clients and servers used in version 2 of the Ticl. */
-public class BaseCommonInvalidationConstants {
- /** Major version of the client library. */
- public static final int CLIENT_MAJOR_VERSION = 3;
-
- /**
- * Minor version of the client library, defined to be equal to the datestamp of the build
- * (e.g. 20130401).
- */
- public static final int CLIENT_MINOR_VERSION = BuildConstants.BUILD_DATESTAMP;
-
- /** Major version of the protocol between the client and the server. */
- public static final int PROTOCOL_MAJOR_VERSION = 3;
-
- /** Minor version of the protocol between the client and the server. */
- public static final int PROTOCOL_MINOR_VERSION = 2;
-
- /** Major version of the client config. */
- public static final int CONFIG_MAJOR_VERSION = 3;
-
- /** Minor version of the client config. */
- public static final int CONFIG_MINOR_VERSION = 2;
-}
diff --git a/java/com/google/ipc/invalidation/common/BuildConstants.java b/java/com/google/ipc/invalidation/common/BuildConstants.java
deleted file mode 100644
index a8a3a65..0000000
--- a/java/com/google/ipc/invalidation/common/BuildConstants.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * Copyright 2013 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http: *www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS-IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.common;
-
-/** Build constant definitions. */
-class BuildConstants {
- static final int BUILD_DATESTAMP = 20140825;
-}
diff --git a/java/com/google/ipc/invalidation/common/DigestFunction.java b/java/com/google/ipc/invalidation/common/DigestFunction.java
deleted file mode 100644
index 421c372..0000000
--- a/java/com/google/ipc/invalidation/common/DigestFunction.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.ipc.invalidation.common;
-
-/**
- * Interface specifying a function to compute digests.
- *
- */
-public interface DigestFunction {
- /** Clears the digest state. */
- void reset();
-
- /** Adds {@code data} to the digest being computed. */
- void update(byte[] data);
-
- /**
- * Returns the digest of the data added by {@link #update}. After this call has been made,
- * reset must be called before {@link #update} and {@link #getDigest} can be called.
- */
- byte[] getDigest();
-}
diff --git a/java/com/google/ipc/invalidation/common/ObjectIdDigestUtils.java b/java/com/google/ipc/invalidation/common/ObjectIdDigestUtils.java
deleted file mode 100644
index 248803e..0000000
--- a/java/com/google/ipc/invalidation/common/ObjectIdDigestUtils.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.common;
-
-import com.google.ipc.invalidation.util.Bytes;
-import com.google.ipc.invalidation.util.Preconditions;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-
-/**
- * Digest-related utilities for object ids.
- *
- */
-public class ObjectIdDigestUtils {
- /**
- * Implementation of {@link DigestFunction} using SHA-1.
- */
- public static class Sha1DigestFunction
- implements DigestFunction {
- /** Digest implementation. */
- private MessageDigest sha1;
-
- /**
- * Whether the {@link #reset()} method needs to be called. This is set to true
- * when {@link #getDigest()} is called and aims to prevent subtle bugs caused by
- * failing to reset the object before computing a new digest.
- */
- private boolean resetNeeded = false;
-
- public Sha1DigestFunction() {
- try {
- this.sha1 = MessageDigest.getInstance("SHA-1");
- } catch (NoSuchAlgorithmException exception) {
- throw new RuntimeException(exception);
- }
- }
-
- @Override
- public void reset() {
- resetNeeded = false;
- sha1.reset();
- }
-
- @Override
- public void update(byte[] data) {
- Preconditions.checkState(!resetNeeded);
- sha1.update(data);
- }
-
- @Override
- public byte[] getDigest() {
- Preconditions.checkState(!resetNeeded);
- resetNeeded = true;
- return sha1.digest();
- }
- }
-
- /**
- * Returns the digest of {@code objectIdDigests} using {@code digestFn}.
- * <p>
- * REQUIRES: {@code objectIdDigests} iterate in sorted order.
- */
- public static Bytes getDigest(Iterable<Bytes> objectIdDigests, DigestFunction digestFn) {
- digestFn.reset();
- for (Bytes objectIdDigest : objectIdDigests) {
- digestFn.update(objectIdDigest.getByteArray());
- }
- return new Bytes(digestFn.getDigest());
- }
-
- /**
- * Returns the digest for the object id with source {@code objectSource} and name
- * {@code objectName} using {@code digestFn}.
- */
- public static Bytes getDigest(int objectSource, byte[] objectName, DigestFunction digestFn) {
- digestFn.reset();
- ByteBuffer buffer = ByteBuffer.allocate(Integer.SIZE / 8).order(ByteOrder.LITTLE_ENDIAN);
- buffer.putInt(objectSource);
-
- // Little endian number for type followed by bytes.
- digestFn.update(buffer.array());
- digestFn.update(objectName);
- return new Bytes(digestFn.getDigest());
- }
-}
diff --git a/java/com/google/ipc/invalidation/external/client/InvalidationClient.java b/java/com/google/ipc/invalidation/external/client/InvalidationClient.java
deleted file mode 100644
index 80103a6..0000000
--- a/java/com/google/ipc/invalidation/external/client/InvalidationClient.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.external.client;
-
-import com.google.ipc.invalidation.external.client.types.AckHandle;
-import com.google.ipc.invalidation.external.client.types.ObjectId;
-
-import java.util.Collection;
-
-/**
- * Interface for the invalidation client library (Ticl).
- *
- */
-public interface InvalidationClient {
-
- /**
- * Starts the client. This method MUST be called before any other method is invoked. The client is
- * considered to be started after {@link InvalidationListener#ready} has received by the
- * application.
- * <p>
- * REQUIRES: {@link #start} has not already been called.
- * Also, the resources given to the client must have been started by the caller.
- */
- void start();
-
- /**
- * Stops the client. After this method has been called, it is an error to call any other method.
- * Does not stop the resources bound to this client.
- * <p>
- * REQUIRES: {@link #start} has already been called.
- */
- void stop();
-
- /**
- * Registers to receive invalidations for the object with id {@code objectId}.
- * <p>
- * The library guarantees that the caller will be informed of the results of this call either via
- * {@link InvalidationListener#informRegistrationStatus} or
- * {@link InvalidationListener#informRegistrationFailure}.
- * <p>
- * The caller should consider the registration to have succeeded only if it gets a call
- * {@link InvalidationListener#informRegistrationStatus} for {@code objectId} with
- * {@code InvalidationListener.RegistrationState.REGISTERED}. Note that if the network is
- * disconnected, the listener events will probably show up after the network connection is
- * repaired.
- * <p>
- * REQUIRES: {@link #start} has been called and {@link InvalidationListener#ready} has been
- * received by the application's listener.
- */
- void register(ObjectId objectId);
-
- /**
- * Registers to receive invalidations for multiple objects. See the specs on
- * {@link #register(ObjectId)} for more details. If the caller needs to register for a number of
- * object ids, this method is more efficient than calling {@code register} in a loop.
- */
- void register(Collection<ObjectId> objectIds);
-
- /**
- * Unregisters for invalidations for the object with id {@code objectId}.
- * <p>
- * The library guarantees that the caller will be informed of the results of this call either via
- * {@link InvalidationListener#informRegistrationStatus} or
- * {@link InvalidationListener#informRegistrationFailure} unless the library informs the caller of
- * a connection failure via {@link InvalidationListener#informError}.
- * <p>
- * The caller should consider the unregistration to have succeeded only if it gets a call
- * {@link InvalidationListener#informRegistrationStatus} for {@code objectId} with
- * {@link InvalidationListener.RegistrationState#UNREGISTERED}.
- * Note that if the network is disconnected, the listener events will probably show up when the
- * network connection is repaired.
- * <p>
- * REQUIRES: {@link #start} has been called and and {@link InvalidationListener#ready} has been
- * receiveed by the application's listener.
- */
- void unregister(ObjectId objectId);
-
- /**
- * Unregisters for multiple objects. See the specs on {@link #unregister(ObjectId)} for more
- * details. If the caller needs to unregister for a number of object ids, this method is more
- * efficient than calling {@code unregister} in a loop.
- */
- void unregister(Collection<ObjectId> objectIds);
-
- /**
- * Acknowledges the {@link InvalidationListener} event that was delivered with the provided
- * acknowledgement handle. This indicates that the client has accepted responsibility for
- * processing the event and it does not need to be redelivered later.
- * <p>
- * REQUIRES: {@link #start} has been called and and {@link InvalidationListener#ready} has been
- * received by the application's listener.
- */
- void acknowledge(AckHandle ackHandle);
-}
diff --git a/java/com/google/ipc/invalidation/external/client/InvalidationClientConfig.java b/java/com/google/ipc/invalidation/external/client/InvalidationClientConfig.java
deleted file mode 100644
index ca976f2..0000000
--- a/java/com/google/ipc/invalidation/external/client/InvalidationClientConfig.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.ipc.invalidation.external.client;
-
-/**
- * Application-provided configuration for an invalidation client.
- *
- */
-public class InvalidationClientConfig {
-
- /** Client type code as assigned by the notification system's backend. */
- public final int clientType;
-
- /** Id/name of the client in the application's own naming scheme. */
- public final byte[] clientName;
-
- /** Name of the application using the library (for debugging/monitoring) */
- public final String applicationName;
-
- /** If false, invalidateUnknownVersion() is called whenever suppression occurs. */
- public final boolean allowSuppression;
-
- public InvalidationClientConfig(int clientType, byte[] clientName, String applicationName,
- boolean allowSuppression) {
- this.clientType = clientType;
- this.clientName = clientName;
- this.applicationName = applicationName;
- this.allowSuppression = allowSuppression;
- }
-}
diff --git a/java/com/google/ipc/invalidation/external/client/InvalidationClientFactory.java b/java/com/google/ipc/invalidation/external/client/InvalidationClientFactory.java
deleted file mode 100644
index a40854a..0000000
--- a/java/com/google/ipc/invalidation/external/client/InvalidationClientFactory.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.external.client;
-
-import com.google.ipc.invalidation.ticl.InvalidationClientCore;
-import com.google.ipc.invalidation.ticl.InvalidationClientImpl;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientConfigP;
-
-import java.util.Random;
-
-/**
- * Factory for creating invalidation clients.
- *
- */
-public class InvalidationClientFactory {
- /**
- * Constructs an invalidation client library instance.
- *
- * @param resources {@link SystemResources} to use for logging, scheduling, persistence, and
- * network connectivity
- * @param clientConfig application provided configuration for the client.
- * @param listener callback object for invalidation events
- */
- public static InvalidationClient createClient(SystemResources resources,
- InvalidationClientConfig clientConfig, InvalidationListener listener) {
- ClientConfigP.Builder internalConfigBuilder = InvalidationClientCore.createConfig().toBuilder();
- internalConfigBuilder.allowSuppression = clientConfig.allowSuppression;
- ClientConfigP internalConfig = internalConfigBuilder.build();
- Random random = new Random(resources.getInternalScheduler().getCurrentTimeMs());
- return new InvalidationClientImpl(resources, random, clientConfig.clientType,
- clientConfig.clientName, internalConfig, clientConfig.applicationName, listener);
- }
-
- private InvalidationClientFactory() {} // Prevents instantiation.
-}
diff --git a/java/com/google/ipc/invalidation/external/client/InvalidationListener.java b/java/com/google/ipc/invalidation/external/client/InvalidationListener.java
deleted file mode 100644
index 3d17d1c..0000000
--- a/java/com/google/ipc/invalidation/external/client/InvalidationListener.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.external.client;
-
-import com.google.ipc.invalidation.external.client.types.AckHandle;
-import com.google.ipc.invalidation.external.client.types.ErrorInfo;
-import com.google.ipc.invalidation.external.client.types.Invalidation;
-import com.google.ipc.invalidation.external.client.types.ObjectId;
-
-/**
- * Listener Interface that must be implemented by clients to receive object invalidations,
- * registration status events, and error events.
- * <p>
- * After the application publishes an invalidation (oid, version) to , guarantees to send
- * at least one of the following events to listeners that have registered for oid:
- * <ol>
- * <li> Invalidate(oid, version)
- * <li> Invalidate(oid, laterVersion) where laterVersion >= version
- * <li> InvalidateUnknownVersion(oid)
- * </ol>
- * <p>
- * Each invalidation must be acknowledged by the application. Each includes an AckHandle that
- * the application must use to call {@link InvalidationClient#acknowledge} after it is done handling
- * that event.
- * <p>
- * Please see http://go/-api for additional information on the API and semantics.
- * <p>
- * Please see {@link com.google.ipc.invalidation.external.client.contrib.SimpleListener} for a
- * base class that implements some events on behalf of the application.
- * <p>
- */
-public interface InvalidationListener {
- /** Possible registration states for an object. */
- public enum RegistrationState {
- REGISTERED,
- UNREGISTERED
- }
-
- /**
- * Called in response to the {@code InvalidationClient.start} call. Indicates that the
- * InvalidationClient is now ready for use, i.e., calls such as register/unregister can be
- * performed on that object.
- * <p>
- * The application MUST NOT issue calls such as register/unregister on the InvalidationClient
- * before receiving this event.
- *
- * @param client the {@link InvalidationClient} invoking the listener
- */
- void ready(InvalidationClient client);
-
- /**
- * Indicates that an object has been updated to a particular version.
- * <ul>
- * <li> When it receives this call, the application MUST hit its backend to fetch the
- * updated state of the object, unless it already has has a version at least as recent as that
- * of the invalidation.
- *
- * <li> MAY choose to drop older versions of invalidations, as long as it calls
- * {@link #invalidate} with a later version of the same object, or calls
- * {@link #invalidateUnknownVersion}.
- *
- * <li> MAY reorder or duplicate invalidations.
- *
- * <li> MAY drop a published payload without notice.
- *
- * <li> The application MUST acknowledge this event by calling
- * {@link InvalidationClient#acknowledge} with the provided {@code ackHandle}, otherwise the
- * event will be redelivered.
- * </ul>
- *
- * @param client the {@link InvalidationClient} invoking the listener
- * @param ackHandle event acknowledgement handle
- */
- void invalidate(InvalidationClient client, Invalidation invalidation, AckHandle ackHandle);
-
- /**
- * Indicates that an object has been updated, but the version number and payload are unknown.
- *
- * <ul>
- * <li> When it receives this call, the application MUST hit its backend to fetch the updated
- * state of the object, regardless of what version it has in its cache.
- *
- * <li> The application MUST acknowledge this event by calling
- * {@link InvalidationClient#acknowledge} with the provided {@code ackHandle}, otherwise the
- * event will be redelivered.
- * </ul>
- *
- * @param client the {@link InvalidationClient} invoking the listener
- * @param ackHandle event acknowledgement handle
- */
- void invalidateUnknownVersion(InvalidationClient client, ObjectId objectId,
- AckHandle ackHandle);
-
- /**
- * Indicates that the application should consider all objects to have changed. This event is sent
- * extremely rarely.
- *
- * <ul>
- * <li> The application MUST hit its backend to fetch the updated state of all objects,
- * regardless of what version it has in its cache.
- *
- * <li> The application MUST acknowledge this event by calling
- * {@link InvalidationClient#acknowledge} with the provided {@code ackHandle}, otherwise the
- * event will be redelivered.
- * </ul>
- *
- * @param client the {@link InvalidationClient} invoking the listener
- * @param ackHandle event acknowledgement handle
- */
- void invalidateAll(InvalidationClient client, AckHandle ackHandle);
-
- /**
- * Indicates that the registration state of an object has changed.
- *
- * @param client the {@link InvalidationClient} invoking the listener
- * @param objectId the id of the object whose state changed
- * @param regState the new state
- */
- void informRegistrationStatus(InvalidationClient client, ObjectId objectId,
- RegistrationState regState);
-
- /**
- * Indicates that an object registration or unregistration operation may have failed.
- * <p>
- * For transient failures, the application MAY retry the registration later. If it chooses to do
- * so, it MUST use exponential backoff or other sensible backoff policy..
- * <p>
- * For permanent failures, the application MUST NOT automatically retry without fixing the
- * situation (e.g., by presenting a dialog box to the user).
- *
- * @param client the {@link InvalidationClient} invoking the listener
- * @param objectId the id of the object whose state changed
- * @param isTransient whether the error is transient or permanent
- * @param errorMessage extra information about the message
- */
- void informRegistrationFailure(InvalidationClient client, ObjectId objectId,
- boolean isTransient, String errorMessage);
-
- /**
- * Indicates that all registrations for the client are in an unknown state (e.g., may have
- * dropped registrations.)
- *
- * The application MUST call {@link InvalidationClient#register} for all objects that it wishes
- * to be registered for.
- *
- * @param client the {@link InvalidationClient} invoking the listener
- * @param ignored clients can ignore this argument.
- * @param ignored2 clients can ignore this argument.
- */
- void reissueRegistrations(InvalidationClient client, byte[] ignored, int ignored2);
-
- /**
- * Informs the listener about errors that have occurred in the backend.
- *
- * If the error reason is AUTH_FAILURE, the application may notify the user.
- * Otherwise, the application should log the error info for debugging purposes but take no
- * other action.
- *
- * @param client the {@link InvalidationClient} invoking the listener
- * @param errorInfo information about the error
- */
- void informError(InvalidationClient client, ErrorInfo errorInfo);
-}
diff --git a/java/com/google/ipc/invalidation/external/client/SystemResources.java b/java/com/google/ipc/invalidation/external/client/SystemResources.java
deleted file mode 100644
index e93b73a..0000000
--- a/java/com/google/ipc/invalidation/external/client/SystemResources.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.external.client;
-
-import com.google.ipc.invalidation.external.client.types.Callback;
-import com.google.ipc.invalidation.external.client.types.SimplePair;
-import com.google.ipc.invalidation.external.client.types.Status;
-import com.google.ipc.invalidation.util.BaseLogger;
-
-/**
- * Interfaces for the system resources used by the Ticl. System resources are an abstraction layer
- * over the host operating system that provides the Ticl with the ability to schedule events, send
- * network messages, store data, and perform logging.
- * <p>
- * NOTE: All the resource types and SystemResources are required to be thread-safe.
- *
- */
-public interface SystemResources {
-
- /** Interface specifying the logging functionality provided by {@link SystemResources}. */
- public interface Logger extends BaseLogger, ResourceComponent {}
-
- /** Interface specifying the scheduling functionality provided by {@link SystemResources}. */
- public interface Scheduler extends ResourceComponent {
-
- /** Symbolic constant representing no scheduling delay, for readability. */
- static final int NO_DELAY = 0;
-
- /**
- * Schedules {@code runnable} to be run on scheduler's thread after at least {@code delayMs}
- * milliseconds.
- */
- void schedule(int delayMs, Runnable runnable);
-
- /** Returns whether the current code is executing on the scheduler's thread. */
- boolean isRunningOnThread();
-
- /**
- * Returns the current time in milliseconds since *some* epoch (NOT necessarily the UNIX epoch).
- * The only requirement is that this time advance at the rate of real time.
- */
- long getCurrentTimeMs();
- }
-
- /** Interface specifying the network functionality provided by {@link SystemResources}. */
- public interface NetworkChannel extends ResourceComponent {
- /** Interface implemented by listeners for network events. */
- public interface NetworkListener {
- /** Upcall made when a network message has been received from the data center. */
- // Implementation note: this is currently a serialized ServerToClientMessage protocol buffer.
- // Implementors MAY NOT rely on this fact.
- void onMessageReceived(byte[] message);
-
- /**
- * Upcall made when the network online status has changed. It will be invoked with
- * a boolean indicating whether the network is connected.
- * <p>
- * This is a best-effort upcall. Note that indicating incorrectly that the network is
- * connected can result in unnecessary calls for {@link #sendMessage}. Incorrect information
- * that the network is disconnected can result in messages not being sent by the client
- * library.
- */
- void onOnlineStatusChange(boolean isOnline);
-
- /**
- * Upcall made when the network address has changed. Note that the network channel
- * implementation is responsible for determining what constitutes the network address and what
- * it means to have it change.
- * <p>
- * This is a best-effort call; however, failure to invoke it may prevent the client from
- * receiving messages and cause it to behave as though offline until its next heartbeat.
- */
- void onAddressChange();
- }
-
- /** Sends {@code outgoingMessage} to the data center. */
- // Implementation note: this is currently a serialized ClientToServerMessage protocol buffer.
- // Implementors MAY NOT rely on this fact.
- void sendMessage(byte[] outgoingMessage);
-
- /**
- * Sets the {@link NetworkListener} to which events will be delivered.
- * <p>
- * REQUIRES: no listener already be registered.
- */
- void setListener(NetworkListener listener);
- }
-
- /**
- * Interface specifying the storage functionality provided by {@link SystemResources}. Basically,
- * the required functionality is a small subset of the method of a regular hash map.
- */
- public interface Storage extends ResourceComponent {
-
- /**
- * Attempts to persist {@code value} for the given {@code key}. Invokes {@code done} when
- * finished, passing a value that indicates whether it was successful.
- * <p>
- * Note: If a wrie W1 finishes unsuccessfully and then W2 is issued for the same key and W2
- * finishes successfully, W1 must NOT later overwrite W2.
- * <p>
- * REQUIRES: Neither {@code key} nor {@code value} is null.
- */
- void writeKey(String key, byte[] value, Callback<Status> done);
-
- /**
- * Reads the value corresponding to {@code key} and calls {@code done} with the result.
- * If it finds the key, passes a success status and the value. Else passes a failure status
- * and a null value.
- */
- void readKey(String key, Callback<SimplePair<Status, byte[]>> done);
-
- /**
- * Deletes the key, value pair corresponding to {@code key}. If the deletion succeeds, calls
- * {@code done} with true; else calls it with false. A deletion of a key that does not exist
- * is considered to have succeeded.
- */
- void deleteKey(String key, Callback<Boolean> done);
-
- /**
- * Reads all the keys from the underlying store and then calls {@code keyCallback} with
- * each key that was written earlier and not deleted. When all the keys are done, calls
- * {@code keyCallback} with {@code null}. With each key, the code can indicate a
- * failed status, in which case the iteration stops.
- */
- void readAllKeys(Callback<SimplePair<Status, String>> keyCallback);
- }
-
- /**
- * Interface for a component of a {@link SystemResources} implementation constructed by calls to
- * set* methods of {@link SystemResourcesBuilder}.
- * <p>
- * The SystemResourcesBuilder allows applications to create a single {@link SystemResources}
- * implementation by composing individual building blocks, each of which implements one of the
- * four required interfaces ({@link Logger}, {@link Storage}, {@link NetworkChannel},
- * {@link Scheduler}).
- * <p>
- * However, each interface implementation may require functionality from another. For example, the
- * network implementation may need to do logging. In order to allow this, we require that the
- * interface implementations also implement {@code ResourceComponent}, which specifies the single
- * method {@link #setSystemResources}. It is guaranteed that this method will be invoked exactly
- * once on each interface implementation and before any other calls are made. Implementations can
- * then save a reference to the provided resources for later use.
- * <p>
- * Note: for the obvious reasons of infinite recursion, implementations should not attempt to
- * access themselves through the provided {@link SystemResources}.
- */
- public interface ResourceComponent {
-
- /** Supplies a {@link SystemResources} instance to the component. */
- void setSystemResources(SystemResources resources);
- }
-
- //
- // End of nested interfaces
- //
-
- /**
- * Starts the resources.
- * <p>
- * REQUIRES: This method is called before the resources are used.
- */
- void start();
-
- /**
- * Stops the resources. After this point, all the resources will eventually stop doing any work
- * (e.g., scheduling, sending/receiving messages from the network etc). They will eventually
- * convert any further operations to no-ops.
- * <p>
- * REQUIRES: Start has been called.
- */
- void stop();
-
- /** Returns whether the resources are started. */
- boolean isStarted();
-
- /**
- * Returns information about the client operating system/platform, e.g., Windows, ChromeOS (for
- * debugging/monitoring purposes).
- */
- String getPlatform();
-
- /** Returns an object that can be used to do logging. */
- Logger getLogger();
-
- /** Returns an object that can be used to persist data locally. */
- Storage getStorage();
-
- /** Returns an object that can be used to send and receive messages. */
- NetworkChannel getNetwork();
-
- /** Returns an object that can be used by the client library to schedule its internal events. */
- Scheduler getInternalScheduler();
-
- /** Returns an object that can be used to schedule events for the application. */
- Scheduler getListenerScheduler();
-}
diff --git a/java/com/google/ipc/invalidation/external/client/SystemResourcesBuilder.java b/java/com/google/ipc/invalidation/external/client/SystemResourcesBuilder.java
deleted file mode 100644
index 72aae74..0000000
--- a/java/com/google/ipc/invalidation/external/client/SystemResourcesBuilder.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.external.client;
-
-import com.google.ipc.invalidation.external.client.SystemResources.Logger;
-import com.google.ipc.invalidation.external.client.SystemResources.NetworkChannel;
-import com.google.ipc.invalidation.external.client.SystemResources.Scheduler;
-import com.google.ipc.invalidation.external.client.SystemResources.Storage;
-import com.google.ipc.invalidation.ticl.BasicSystemResources;
-import com.google.ipc.invalidation.util.Preconditions;
-
-
-/**
- * A builder to override some or all resource components in {@code SystemResources} . See
- * discussion in {@code ResourceComponent} as well.
- *
- */
-
- // The resources used for constructing the SystemResources in builder.
-public class SystemResourcesBuilder {
- private Scheduler internalScheduler;
- private Scheduler listenerScheduler;
- private Logger logger;
- private NetworkChannel network;
- private Storage storage;
- private String platform;
-
- /** If the build method has been called on this builder. */
- private boolean sealed;
-
- /** See specs at {@code DefaultResourcesFactory.createDefaultResourcesBuilder}. */
- public SystemResourcesBuilder(Logger logger, Scheduler internalScheduler,
- Scheduler listenerScheduler, NetworkChannel network, Storage storage) {
- this.logger = logger;
- this.internalScheduler = internalScheduler;
- this.listenerScheduler = listenerScheduler;
- this.network = network;
- this.storage = storage;
- }
-
- /** Returns a new builder that shares all the resources of {@code builder} but is not sealed. */
- public SystemResourcesBuilder(SystemResourcesBuilder builder) {
- this.logger = builder.logger;
- this.internalScheduler = builder.internalScheduler;
- this.listenerScheduler = builder.listenerScheduler;
- this.network = builder.network;
- this.storage = builder.storage;
- this.sealed = false;
- }
-
- /** Returns the internal scheduler. */
- public Scheduler getInternalScheduler() {
- return internalScheduler;
- }
-
- /** Returns the listener scheduler. */
- public Scheduler getListenerScheduler() {
- return listenerScheduler;
- }
-
- /** Returns the network channel. */
- public NetworkChannel getNetwork() {
- return network;
- }
-
- /** Returns the logger. */
- public Logger getLogger() {
- return logger;
- }
-
- /** Returns the storage. */
- public Storage getStorage() {
- return storage;
- }
-
- /**
- * Sets the scheduler for scheduling internal events to be {@code internalScheduler}.
- * <p>
- * REQUIRES: {@link #build} has not been called.
- */
- public SystemResourcesBuilder setInternalScheduler(Scheduler internalScheduler) {
- Preconditions.checkState(!sealed, "Builder's build method has already been called");
- this.internalScheduler = internalScheduler;
- return this;
- }
-
- /**
- * Sets the scheduler for scheduling listener events to be {@code listenerScheduler}.
- * <p>
- * REQUIRES: {@link #build} has not been called.
- */
- public SystemResourcesBuilder setListenerScheduler(Scheduler listenerScheduler) {
- Preconditions.checkState(!sealed, "Builder's build method has already been called");
- this.listenerScheduler = listenerScheduler;
- return this;
- }
-
- /**
- * Sets the logger to be {@code logger}.
- * <p>
- * REQUIRES: {@link #build} has not been called.
- */
- public SystemResourcesBuilder setLogger(Logger logger) {
- Preconditions.checkState(!sealed, "Builder's build method has already been called");
- this.logger = logger;
- return this;
- }
-
- /**
- * Sets the network channel for communicating with the server to be {@code network}.
- * <p>
- * REQUIRES: {@link #build} has not been called.
- */
- public SystemResourcesBuilder setNetwork(NetworkChannel network) {
- Preconditions.checkState(!sealed, "Builder's build method has already been called");
- this.network = network;
- return this;
- }
-
- /**
- * Sets the persistence layer to be {@code storage}.
- * <p>
- * REQUIRES: {@link #build} has not been called.
- */
- public SystemResourcesBuilder setStorage(Storage storage) {
- Preconditions.checkState(!sealed, "Builder's build method has already been called");
- this.storage = storage;
- return this;
- }
-
- /**
- * Sets the platform to be {@code platform}.
- * <p>
- * REQUIRES: {@link #build} has not been called.
- */
- public SystemResourcesBuilder setPlatform(String platform) {
- Preconditions.checkState(!sealed, "Builder's build method has already been called");
- this.platform = platform;
- return this;
- }
-
- /**
- * Builds the {@code SystemResources} object with the given resource components and returns it.
- * <p>
- * Caller must not call any mutation method (on this SystemResourcesBuilder) after
- * {@code build} has been called (i.e., build and the set* methods)
- */
- public SystemResources build() {
- Preconditions.checkState(!sealed, "Builder's build method has already been called");
- seal();
- return new BasicSystemResources(logger, internalScheduler, listenerScheduler, network, storage,
- platform);
- }
-
- /** Seals the builder so that no mutation method can be called on this. */
- protected void seal() {
- Preconditions.checkState(!sealed, "Builder's already sealed");
- sealed = true;
- }
-}
diff --git a/java/com/google/ipc/invalidation/external/client/android/service/AndroidLogger.java b/java/com/google/ipc/invalidation/external/client/android/service/AndroidLogger.java
deleted file mode 100644
index 301cabd..0000000
--- a/java/com/google/ipc/invalidation/external/client/android/service/AndroidLogger.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.external.client.android.service;
-
-import com.google.ipc.invalidation.external.client.SystemResources;
-import com.google.ipc.invalidation.external.client.SystemResources.Logger;
-import com.google.ipc.invalidation.util.Formatter;
-
-import android.util.Log;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.logging.Level;
-
-
-/**
- * Provides the implementation of {@link Logger} for Android. The logging tag will be based upon the
- * top-level class name containing the code invoking the logger (the outer class, not an inner or
- * anonymous class name). For severe and warning level messages, the Android logger will also
- * dump the stack trace of the first argument if it is a throwable.
- */
-public class AndroidLogger implements Logger {
-
- /** Creates a new AndroidLogger that uses the provided value as the Android logging tag */
- public static AndroidLogger forTag(String tag) {
- return new AndroidLogger(tag, null);
- }
-
- /** Creates a new AndroidLogger that will compute a tag value dynamically based upon the class
- * that calls into the logger and will prepend the provided prefix (if any) on all
- * logged messages.
- */
- public static AndroidLogger forPrefix(String prefix) {
- return new AndroidLogger(null, prefix);
- }
-
- /**
- * If {@code false}, then Log.isLoggable() is called to filter log messages
- */
- private static boolean filteringDisabled = false;
-
- /**
- * Maps from a Java {@link Level} to the android {@link Log} priority value used to log
- * messages at that level.
- */
- private static Map<Level, Integer> levelToPriority = new HashMap<Level, Integer>();
-
- static {
- // Define the mappings for Java log levels to the associated Android log priorities
- levelToPriority.put(Level.INFO, Log.INFO);
- levelToPriority.put(Level.WARNING, Log.WARN);
- levelToPriority.put(Level.SEVERE, Log.ERROR);
- levelToPriority.put(Level.FINE, Log.DEBUG);
- levelToPriority.put(Level.FINER, Log.VERBOSE);
- levelToPriority.put(Level.FINEST, Log.VERBOSE);
- levelToPriority.put(Level.CONFIG, Log.INFO);
- }
-
- /**
- * Disables log filtering so all logged messages will be captured.
- */
- public static void disableFilteringForTest() {
- filteringDisabled = true;
- }
-
- /**
- * The default minimum Android log level. We default to 0 to ensure everything is logged.
- * This should be a value from the {@link Log} constants.
- */
- private static int minimumLogLevel = 0;
-
- /**
- * The maximum length of an Android logging tag. There's no formal constants but the constraint is
- * mentioned in the Log javadoc
- */
- private static final int MAX_TAG_LENGTH = 23;
-
- /** Constant tag to use for logged messages (or {@code null} to use topmost class on stack */
- private final String tag;
-
- /** Prefix added to Android logging messages */
- private final String logPrefix;
-
- /** Creates a logger that prefixes every logging stmt with {@code logPrefix}. */
- private AndroidLogger(String tag, String logPrefix) {
- this.tag = tag;
- this.logPrefix = logPrefix;
- }
-
- @Override
- public boolean isLoggable(Level level) {
- return isLoggable(getTag(), levelToPriority(level));
- }
-
- @Override
- public void log(Level level, String template, Object... args) {
- int androidLevel = levelToPriority(level);
- String tag = getTag();
- if (isLoggable(tag, androidLevel)) {
- Log.println(androidLevel, tag, format(template, args));
- }
- }
-
- @Override
- public void severe(String template, Object...args) {
- String tag = getTag();
- if (isLoggable(tag, Log.ERROR)) {
- // If the first argument is an exception, use the form of Log that will dump a stack trace
- if ((args.length > 0) && (args[0] instanceof Throwable)) {
- Log.e(tag, format(template, args), (Throwable) args[0]);
- } else {
- Log.e(tag, format(template, args));
- }
- }
- }
-
- @Override
- public void warning(String template, Object...args) {
- String tag = getTag();
- if (isLoggable(tag, Log.WARN)){
- // If the first argument is an exception, use the form of Log that will dump a stack trace
- if ((args.length > 0) && (args[0] instanceof Throwable)) {
- Log.w(tag, format(template, args), (Throwable) args[0]);
- } else {
- Log.w(tag, format(template, args));
- }
- }
- }
-
- @Override
- public void info(String template, Object...args) {
- String tag = getTag();
- if (isLoggable(tag, Log.INFO)) {
- Log.i(tag, format(template, args));
- }
- }
-
- @Override
- public void fine(String template, Object...args) {
- String tag = getTag();
- if (isLoggable(tag, Log.DEBUG)) {
- Log.d(tag, format(template, args));
- }
- }
-
- @Override
- public void setSystemResources(SystemResources resources) {
- // No-op.
- }
-
- /** Given a Java logging level, returns the corresponding Android log priority. */
- private static int levelToPriority(Level level) {
- Integer priority = levelToPriority.get(level);
- if (priority != null) {
- return priority;
- }
- throw new IllegalArgumentException("Unsupported level: " + level);
- }
-
- /** Formats the content of a logged messages for output, prepending the log prefix if any. */
- private String format(String template, Object...args) {
- return (logPrefix != null) ?
- ("[" + logPrefix + "] " + Formatter.format(template, args)) :
- Formatter.format(template, args);
- }
-
- /** Returns the Android logging tag that should be placed on logged messages */
- private String getTag() {
- if (tag != null) {
- return tag;
- }
-
- StackTraceElement[] stackTrace = new Throwable().getStackTrace();
- String className = null;
- for (int i = 0; i < stackTrace.length; i++) {
- className = stackTrace[i].getClassName();
-
- // Skip over this class's methods
- if (!className.equals(AndroidLogger.class.getName())) {
- break;
- }
- }
-
- // Compute the unqualified class name w/out any inner class, then truncate to the
- // maximum tag length.
- int unqualBegin = className.lastIndexOf('.') + 1;
- if (unqualBegin < 0) { // should never happen, but be safe
- unqualBegin = 0;
- }
- int unqualEnd = className.indexOf('$', unqualBegin);
- if (unqualEnd < 0) {
- unqualEnd = className.length();
- }
- if ((unqualEnd - unqualBegin) > MAX_TAG_LENGTH) {
- unqualEnd = unqualBegin + MAX_TAG_LENGTH;
- }
- return className.substring(unqualBegin, unqualEnd);
- }
-
- /**
- * Add additional constraint on logging. In addition to the normal check of
- * {@link Log#isLoggable(String, int)} for logging, this also requires a minimum
- * log level of the given value. This should be a value from the {@link Log} constants.
- */
- public static void setMinimumAndroidLogLevel(int logLevel) {
- minimumLogLevel = logLevel;
- }
-
- /**
- * Returns {@code true} is the provided tag/level will produce logged output.
- */
-
- boolean isLoggable(String tag, int priority) {
- return filteringDisabled || (priority >= minimumLogLevel && Log.isLoggable(tag, priority));
- }
-}
diff --git a/java/com/google/ipc/invalidation/external/client/android2/AndroidClientFactory.java b/java/com/google/ipc/invalidation/external/client/android2/AndroidClientFactory.java
deleted file mode 100644
index 82c53d9..0000000
--- a/java/com/google/ipc/invalidation/external/client/android2/AndroidClientFactory.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.ipc.invalidation.external.client.android2;
-
-import com.google.ipc.invalidation.ticl.InvalidationClientCore;
-import com.google.ipc.invalidation.ticl.android2.AndroidTiclManifest;
-import com.google.ipc.invalidation.ticl.android2.ProtocolIntents;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientConfigP;
-import com.google.ipc.invalidation.util.Bytes;
-
-import android.content.Context;
-import android.content.Intent;
-
-/**
- * Factory for creating Android clients.
- *
- */
-public final class AndroidClientFactory {
- /**
- * Creates a new client.
- * <p>
- * REQUIRES: no client exist, or a client exists with the same type and name as provided. In
- * the latter case, this call is a no-op.
- *
- * @param context Android system context
- * @param clientType type of the client to create
- * @param clientName name of the client to create
- */
- public static void createClient(Context context, int clientType, byte[] clientName) {
- ClientConfigP config = InvalidationClientCore.createConfig();
- Intent intent = ProtocolIntents.InternalDowncalls.newCreateClientIntent(
- clientType, Bytes.fromByteArray(clientName), config, false);
- intent.setClassName(context, new AndroidTiclManifest(context).getTiclServiceClass());
- context.startService(intent);
- }
-
- private AndroidClientFactory() {
- // Disallow instantiation.
- }
-}
diff --git a/java/com/google/ipc/invalidation/external/client/android2/AndroidManifest.xml b/java/com/google/ipc/invalidation/external/client/android2/AndroidManifest.xml
deleted file mode 100644
index 840c41f..0000000
--- a/java/com/google/ipc/invalidation/external/client/android2/AndroidManifest.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
- <!-- Copyright 2011 Google Inc. All Rights Reserved. -->
- <!-- Common configuration settings for application using client invalidation library. -->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.google.ipc.invalidation.client.android2">
-
- <!-- App receives GCM messages. -->
- <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
- <!-- GCM connects to Google Services. -->
- <uses-permission android:name="android.permission.INTERNET" />
- <!-- GCM requires a Google account. -->
- <uses-permission android:name="android.permission.GET_ACCOUNTS" />
- <uses-permission android:name="android.permission.USE_CREDENTIALS" />
- <!-- Keeps the processor from sleeping when a message is received. -->
- <uses-permission android:name="android.permission.WAKE_LOCK" />
-
- <application>
- <!-- Ticl service. -->
- <service android:exported="false"
- android:name="com.google.ipc.invalidation.ticl.android2.TiclService"/>
-
- <!-- Ticl sender. -->
- <service android:exported="false"
- android:name="com.google.ipc.invalidation.ticl.android2.channel.AndroidMessageSenderService"/>
-
- <!-- Receiver for scheduler alarms. -->
- <receiver android:exported="false"
- android:name="com.google.ipc.invalidation.ticl.android2.AndroidInternalScheduler$AlarmReceiver"/>
-
- <!-- GCM Broadcast Receiver -->
- <receiver android:exported="true"
- android:name="com.google.ipc.invalidation.external.client.contrib.MultiplexingGcmListener$GCMReceiver"
- android:permission="com.google.android.c2dm.permission.SEND">
- <intent-filter>
- <action android:name="com.google.android.c2dm.intent.RECEIVE" />
- <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
- <category android:name="com.google.ipc.invalidation.ticl.android2" />
- </intent-filter>
- </receiver>
-
- <!-- GCM multiplexer -->
- <service android:exported="false"
- android:name="com.google.ipc.invalidation.external.client.contrib.MultiplexingGcmListener">
- <meta-data android:name="sender_ids" android:value="[email protected]"/>
- </service>
-
- <!-- Invalidation service multiplexed GCM receiver -->
- <service android:exported="false"
- android:name="com.google.ipc.invalidation.ticl.android2.channel.AndroidMessageReceiverService"
- android:enabled="true"/>
- <receiver android:exported="false"
- android:name="com.google.ipc.invalidation.ticl.android2.channel.AndroidMessageReceiverService$Receiver">
- <intent-filter>
- <action android:name="com.google.ipc.invalidation.gcmmplex.EVENT" />
- </intent-filter>
- </receiver>
- </application>
-</manifest>
diff --git a/java/com/google/ipc/invalidation/external/client/contrib/AndroidListener.java b/java/com/google/ipc/invalidation/external/client/contrib/AndroidListener.java
deleted file mode 100644
index b9a4e9a..0000000
--- a/java/com/google/ipc/invalidation/external/client/contrib/AndroidListener.java
+++ /dev/null
@@ -1,661 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.ipc.invalidation.external.client.contrib;
-
-import com.google.ipc.invalidation.external.client.InvalidationClient;
-import com.google.ipc.invalidation.external.client.InvalidationClientConfig;
-import com.google.ipc.invalidation.external.client.InvalidationListener;
-import com.google.ipc.invalidation.external.client.InvalidationListener.RegistrationState;
-import com.google.ipc.invalidation.external.client.SystemResources.Logger;
-import com.google.ipc.invalidation.external.client.android.service.AndroidLogger;
-import com.google.ipc.invalidation.external.client.types.AckHandle;
-import com.google.ipc.invalidation.external.client.types.ErrorInfo;
-import com.google.ipc.invalidation.external.client.types.Invalidation;
-import com.google.ipc.invalidation.external.client.types.ObjectId;
-import com.google.ipc.invalidation.ticl.InvalidationClientCore;
-import com.google.ipc.invalidation.ticl.ProtoWrapperConverter;
-import com.google.ipc.invalidation.ticl.android2.AndroidClock;
-import com.google.ipc.invalidation.ticl.android2.AndroidInvalidationListenerIntentMapper;
-import com.google.ipc.invalidation.ticl.android2.ProtocolIntents;
-import com.google.ipc.invalidation.ticl.android2.channel.AndroidChannelConstants.AuthTokenConstants;
-import com.google.ipc.invalidation.ticl.proto.AndroidListenerProtocol;
-import com.google.ipc.invalidation.ticl.proto.AndroidListenerProtocol.RegistrationCommand;
-import com.google.ipc.invalidation.ticl.proto.AndroidListenerProtocol.StartCommand;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientConfigP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationMessage;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP;
-import com.google.ipc.invalidation.util.Bytes;
-import com.google.ipc.invalidation.util.Preconditions;
-import com.google.ipc.invalidation.util.ProtoWrapper.ValidationException;
-
-import android.app.IntentService;
-import android.app.PendingIntent;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-
-/**
- * Simplified listener contract for Android clients. Takes care of exponential back-off when
- * register or unregister are called for an object after a failure has occurred. Also suppresses
- * redundant register requests.
- *
- * <p>A sample implementation of an {@link AndroidListener} is shown below:
- *
- * <p><code>
- * class ExampleListener extends AndroidListener {
- * @Override
- * public void reissueRegistrations(byte[] clientId) {
- * List<ObjectId> desiredRegistrations = ...;
- * register(clientId, desiredRegistrations);
- * }
- *
- * @Override
- * public void invalidate(Invalidation invalidation, final byte[] ackHandle) {
- * // Track the most recent version of the object (application-specific) and then acknowledge
- * // the invalidation.
- * ...
- * acknowledge(ackHandle);
- * }
- *
- * @Override
- * public void informRegistrationFailure(byte[] clientId, ObjectId objectId,
- * boolean isTransient, String errorMessage) {
- * // Try again if there is a transient failure and we still care whether the object is
- * // registered or not.
- * if (isTransient) {
- * boolean shouldRetry = ...;
- * if (shouldRetry) {
- * boolean shouldBeRegistered = ...;
- * if (shouldBeRegistered) {
- * register(clientId, ImmutableList.of(objectId));
- * } else {
- * unregister(clientId, ImmutableList.of(objectId));
- * }
- * }
- * }
- * }
- *
- * ...
- * }
- * </code>
- *
- * <p>See {@link com.google.ipc.invalidation.examples.android2} for a complete sample.
- *
- */
-public abstract class AndroidListener extends IntentService {
-
- /** External alarm receiver that allows the listener to respond to alarm intents. */
- public static final class AlarmReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- Preconditions.checkNotNull(context);
- Preconditions.checkNotNull(intent);
- if (intent.hasExtra(AndroidListenerIntents.EXTRA_REGISTRATION)) {
- AndroidListenerIntents.issueAndroidListenerIntent(context, intent);
- }
- }
- }
-
- /** The logger. */
- private static final Logger logger = AndroidLogger.forPrefix("");
-
- /** Initial retry delay for exponential backoff (1 minute). */
-
- static int initialMaxDelayMs = (int) TimeUnit.SECONDS.toMillis(60);
-
- /** Maximum delay factor for exponential backoff (6 hours). */
-
- static int maxDelayFactor = 6 * 60;
-
- /** The last client ID passed to the ready up-call. */
-
- static Bytes lastClientIdForTest;
-
- /**
- * Invalidation listener implementation. We implement the interface on a private field rather
- * than directly to avoid leaking methods that should not be directly called by the client
- * application. The listener must be called only on intent service thread.
- */
- private final InvalidationListener invalidationListener = new InvalidationListener() {
- @Override
- public final void ready(final InvalidationClient client) {
- Bytes clientId = state.getClientId();
- AndroidListener.lastClientIdForTest = clientId;
- AndroidListener.this.ready(clientId.getByteArray());
- }
-
- @Override
- public final void reissueRegistrations(final InvalidationClient client, byte[] prefix,
- int prefixLength) {
- AndroidListener.this.reissueRegistrations(state.getClientId().getByteArray());
- }
-
- @Override
- public final void informRegistrationStatus(final InvalidationClient client,
- final ObjectId objectId, final RegistrationState regState) {
- state.informRegistrationSuccess(objectId);
- AndroidListener.this.informRegistrationStatus(state.getClientId().getByteArray(), objectId,
- regState);
- }
-
- @Override
- public final void informRegistrationFailure(final InvalidationClient client,
- final ObjectId objectId, final boolean isTransient, final String errorMessage) {
- state.informRegistrationFailure(objectId, isTransient);
- AndroidListener.this.informRegistrationFailure(state.getClientId().getByteArray(), objectId,
- isTransient, errorMessage);
- }
-
- @Override
- public void invalidate(InvalidationClient client, Invalidation invalidation,
- AckHandle ackHandle) {
- AndroidListener.this.invalidate(invalidation, ackHandle.getHandleData());
- }
-
- @Override
- public void invalidateUnknownVersion(InvalidationClient client, ObjectId objectId,
- AckHandle ackHandle) {
- AndroidListener.this.invalidateUnknownVersion(objectId, ackHandle.getHandleData());
- }
-
- @Override
- public void invalidateAll(InvalidationClient client, AckHandle ackHandle) {
- AndroidListener.this.invalidateAll(ackHandle.getHandleData());
- }
-
- @Override
- public void informError(InvalidationClient client, ErrorInfo errorInfo) {
- AndroidListener.this.informError(errorInfo);
- }
- };
-
- /**
- * The internal state of the listener. Lazy initialization, triggered by {@link #onHandleIntent}.
- */
- private AndroidListenerState state;
-
- /** The clock to use when scheduling retry call-backs. */
- private final AndroidClock clock = new AndroidClock.SystemClock();
-
- /**
- * The mapper used to route intents to the invalidation listener. Lazy initialization triggered
- * by {@link #onCreate}.
- */
- private AndroidInvalidationListenerIntentMapper intentMapper;
-
- /** Initializes {@link AndroidListener}. */
- protected AndroidListener() {
- super("");
-
- // If the process dies before an intent is handled, setIntentRedelivery(true) ensures that the
- // last intent is redelivered. This optimization is not necessary for correctness: on restart,
- // all registrations will be reissued and unacked invalidations will be resent anyways.
- setIntentRedelivery(true);
- }
-
- /** See specs for {@link InvalidationClient#start}. */
- public static Intent createStartIntent(Context context, InvalidationClientConfig config) {
- Preconditions.checkNotNull(context);
- Preconditions.checkNotNull(config);
- Preconditions.checkNotNull(config.clientName);
-
- return AndroidListenerIntents.createStartIntent(context, config.clientType,
- Bytes.fromByteArray(config.clientName), config.allowSuppression);
- }
-
- /** See specs for {@link InvalidationClient#start}. */
- public static Intent createStartIntent(Context context, int clientType, byte[] clientName) {
- Preconditions.checkNotNull(context);
- Preconditions.checkNotNull(clientName);
-
- final boolean allowSuppression = true;
- return AndroidListenerIntents.createStartIntent(context, clientType,
- Bytes.fromByteArray(clientName), allowSuppression);
- }
-
- /** See specs for {@link InvalidationClient#stop}. */
- public static Intent createStopIntent(Context context) {
- Preconditions.checkNotNull(context);
-
- return AndroidListenerIntents.createStopIntent(context);
- }
-
- /**
- * See specs for {@link InvalidationClient#register}.
- *
- * @param context the context
- * @param clientId identifier for the client service for which we are registering
- * @param objectIds the object ids being registered
- */
- public static Intent createRegisterIntent(Context context, byte[] clientId,
- Iterable<ObjectId> objectIds) {
- Preconditions.checkNotNull(context);
- Preconditions.checkNotNull(clientId);
- Preconditions.checkNotNull(objectIds);
-
- final boolean isRegister = true;
- return AndroidListenerIntents.createRegistrationIntent(context, Bytes.fromByteArray(clientId),
- objectIds, isRegister);
- }
-
- /**
- * See specs for {@link InvalidationClient#register}.
- *
- * @param clientId identifier for the client service for which we are registering
- * @param objectIds the object ids being registered
- */
- public void register(byte[] clientId, Iterable<ObjectId> objectIds) {
- Preconditions.checkNotNull(clientId);
- Preconditions.checkNotNull(objectIds);
-
- Context context = getApplicationContext();
- context.startService(createRegisterIntent(context, clientId, objectIds));
- }
-
- /**
- * See specs for {@link InvalidationClient#unregister}.
- *
- * @param context the context
- * @param clientId identifier for the client service for which we are unregistering
- * @param objectIds the object ids being unregistered
- */
- public static Intent createUnregisterIntent(Context context, byte[] clientId,
- Iterable<ObjectId> objectIds) {
- Preconditions.checkNotNull(context);
- Preconditions.checkNotNull(clientId);
- Preconditions.checkNotNull(objectIds);
-
- final boolean isRegister = false;
- return AndroidListenerIntents.createRegistrationIntent(context, Bytes.fromByteArray(clientId),
- objectIds, isRegister);
- }
-
- /**
- * Sets the authorization token and type used by the invalidation client. Call in response to
- * {@link #requestAuthToken} calls.
- *
- * @param pendingIntent pending intent passed to {@link #requestAuthToken}
- * @param authToken authorization token
- * @param authType authorization token typo
- */
- public static void setAuthToken(Context context, PendingIntent pendingIntent, String authToken,
- String authType) {
- Preconditions.checkNotNull(pendingIntent);
- Preconditions.checkNotNull(authToken);
- Preconditions.checkNotNull(authType);
-
- AndroidListenerIntents.issueAuthTokenResponse(context, pendingIntent, authToken, authType);
- }
-
- /**
- * See specs for {@link InvalidationClient#unregister}.
- *
- * @param clientId identifier for the client service for which we are registering
- * @param objectIds the object ids being unregistered
- */
- public void unregister(byte[] clientId, Iterable<ObjectId> objectIds) {
- Preconditions.checkNotNull(clientId);
- Preconditions.checkNotNull(objectIds);
-
- Context context = getApplicationContext();
- context.startService(createUnregisterIntent(context, clientId, objectIds));
- }
-
- /** See specs for {@link InvalidationClient#acknowledge}. */
- public static Intent createAcknowledgeIntent(Context context, byte[] ackHandle) {
- Preconditions.checkNotNull(context);
- Preconditions.checkNotNull(ackHandle);
-
- return AndroidListenerIntents.createAckIntent(context, ackHandle);
- }
-
- /** See specs for {@link InvalidationClient#acknowledge}. */
- public void acknowledge(byte[] ackHandle) {
- Preconditions.checkNotNull(ackHandle);
-
- Context context = getApplicationContext();
- context.startService(createAcknowledgeIntent(context, ackHandle));
- }
-
- /**
- * See specs for {@link InvalidationListener#ready}.
- *
- * @param clientId the client identifier that must be passed to {@link #createRegisterIntent}
- * and {@link #createUnregisterIntent}
- */
- public abstract void ready(byte[] clientId);
-
- /**
- * See specs for {@link InvalidationListener#reissueRegistrations}.
- *
- * @param clientId the client identifier that must be passed to {@link #createRegisterIntent}
- * and {@link #createUnregisterIntent}
- */
- public abstract void reissueRegistrations(byte[] clientId);
-
- /**
- * See specs for {@link InvalidationListener#informError}.
- */
- public abstract void informError(ErrorInfo errorInfo);
-
- /**
- * See specs for {@link InvalidationListener#invalidate}.
- *
- * @param invalidation the invalidation
- * @param ackHandle event acknowledgment handle
- */
- public abstract void invalidate(Invalidation invalidation, byte[] ackHandle);
-
- /**
- * See specs for {@link InvalidationListener#invalidateUnknownVersion}.
- *
- * @param objectId identifier for the object with unknown version
- * @param ackHandle event acknowledgment handle
- */
- public abstract void invalidateUnknownVersion(ObjectId objectId, byte[] ackHandle);
-
- /**
- * See specs for {@link InvalidationListener#invalidateAll}.
- *
- * @param ackHandle event acknowledgment handle
- */
- public abstract void invalidateAll(byte[] ackHandle);
-
- /**
- * Read listener state.
- *
- * @return serialized state or {@code null} if it is not available
- */
- public abstract byte[] readState();
-
- /** Write listener state to some location. */
- public abstract void writeState(byte[] data);
-
- /**
- * See specs for {@link InvalidationListener#informRegistrationFailure}.
- */
- public abstract void informRegistrationFailure(byte[] clientId, ObjectId objectId,
- boolean isTransient, String errorMessage);
-
- /**
- * See specs for (@link InvalidationListener#informRegistrationStatus}.
- */
- public abstract void informRegistrationStatus(byte[] clientId, ObjectId objectId,
- RegistrationState regState);
-
- /**
- * Called when an authorization token is needed. Respond by calling {@link #setAuthToken}.
- *
- * @param pendingIntent pending intent that must be used in {@link #setAuthToken} response.
- * @param invalidAuthToken the existing invalid token or null if none exists. Implementation
- * should invalidate the token.
- */
- public abstract void requestAuthToken(PendingIntent pendingIntent,
- String invalidAuthToken);
-
- /**
- * Handles invalidations received while the client is stopped. An implementation may choose to
- * do work in response to these invalidations (delivered best-effort by the invalidation system).
- * Not intended for use by most client implementations.
- */
- protected void backgroundInvalidateForInternalUse(
- @SuppressWarnings("unused") Iterable<Invalidation> invalidations) {
- // Ignore background invalidations by default.
- }
-
- @Override
- public void onCreate() {
- super.onCreate();
-
- // Initialize the intent mapper (now that context is available).
- intentMapper = new AndroidInvalidationListenerIntentMapper(invalidationListener, this);
- }
-
- /**
- * Derived classes may override this method to handle custom intents. This is a recommended
- * pattern for invalidation-related intents, e.g. for registration and unregistration. Derived
- * classes should call {@code super.onHandleIntent(intent)} for any intents they did not
- * handle on their own.
- */
- @Override
- protected void onHandleIntent(Intent intent) {
- if (intent == null) {
- return;
- }
-
- // We lazily initialize state in calls to onHandleIntent rather than initializing in onCreate
- // because onCreate runs on the UI thread and initializeState performs I/O.
- if (state == null) {
- initializeState();
- }
-
- // Handle any intents specific to the AndroidListener. For other intents, defer to the
- // intentMapper, which handles listener upcalls corresponding to the InvalidationListener
- // methods.
- if (!tryHandleAuthTokenRequestIntent(intent) &&
- !tryHandleRegistrationIntent(intent) &&
- !tryHandleStartIntent(intent) &&
- !tryHandleStopIntent(intent) &&
- !tryHandleAckIntent(intent) &&
- !tryHandleBackgroundInvalidationsIntent(intent)) {
- intentMapper.handleIntent(intent);
- }
-
- // Always check to see if we need to persist state changes after handling an intent.
- if (state.getIsDirty()) {
- writeState(state.marshal().toByteArray());
- state.resetIsDirty();
- }
- }
-
- /** Returns invalidation client that can be used to trigger intents against the TICL service. */
- private InvalidationClient getClient() {
- return intentMapper.client;
- }
-
- /**
- * Initializes listener state either from persistent proto (if available) or from scratch.
- */
- private void initializeState() {
- AndroidListenerProtocol.AndroidListenerState proto = getPersistentState();
- if (proto != null) {
- state = new AndroidListenerState(initialMaxDelayMs, maxDelayFactor, proto);
- } else {
- state = new AndroidListenerState(initialMaxDelayMs, maxDelayFactor);
- }
- }
-
- /**
- * Reads and parses persistent state for the listener. Returns {@code null} if the state does not
- * exist or is invalid.
- */
- private AndroidListenerProtocol.AndroidListenerState getPersistentState() {
- // Defer to application code to read the blob containing the state proto.
- byte[] stateData = readState();
- try {
- if (null != stateData) {
- AndroidListenerProtocol.AndroidListenerState state =
- AndroidListenerProtocol.AndroidListenerState.parseFrom(stateData);
- if (!AndroidListenerProtos.isValidAndroidListenerState(state)) {
- logger.warning("Invalid listener state.");
- return null;
- }
- return state;
- }
- } catch (ValidationException exception) {
- logger.warning("Failed to parse listener state: %s", exception);
- }
- return null;
- }
-
- /**
- * Tries to handle a request for an authorization token. Returns {@code true} iff the intent is
- * an auth token request.
- */
- private boolean tryHandleAuthTokenRequestIntent(Intent intent) {
- if (!AndroidListenerIntents.isAuthTokenRequest(intent)) {
- return false;
- }
-
- // Check for invalid auth token. Subclass may have to invalidate it if it exists in the call
- // to getNewAuthToken.
- String invalidAuthToken = intent.getStringExtra(
- AuthTokenConstants.EXTRA_INVALIDATE_AUTH_TOKEN);
- // Intent also includes a pending intent that we can use to pass back our response.
- PendingIntent pendingIntent = intent.getParcelableExtra(
- AuthTokenConstants.EXTRA_PENDING_INTENT);
- if (pendingIntent == null) {
- logger.warning("Authorization request without pending intent extra.");
- } else {
- // Delegate to client application to figure out what the new token should be and the auth
- // type.
- requestAuthToken(pendingIntent, invalidAuthToken);
- }
- return true;
- }
-
- /** Tries to handle a stop intent. Returns {@code true} iff the intent is a stop intent. */
- private boolean tryHandleStopIntent(Intent intent) {
- if (!AndroidListenerIntents.isStopIntent(intent)) {
- return false;
- }
- getClient().stop();
- return true;
- }
-
- /**
- * Tries to handle a registration intent. Returns {@code true} iff the intent is a registration
- * intent.
- */
- private boolean tryHandleRegistrationIntent(Intent intent) {
- RegistrationCommand command = AndroidListenerIntents.findRegistrationCommand(intent);
- if ((command == null) || !AndroidListenerProtos.isValidRegistrationCommand(command)) {
- return false;
- }
- // Make sure the registration is intended for this client. If not, we ignore it (suggests
- // there is a new client now).
- if (!command.getClientId().equals(state.getClientId())) {
- logger.warning("Ignoring registration request for old client. Old ID = %s, New ID = %s",
- command.getClientId(), state.getClientId());
- return true;
- }
- boolean isRegister = command.getIsRegister();
- for (ObjectIdP objectIdP : command.getObjectId()) {
- ObjectId objectId = ProtoWrapperConverter.convertFromObjectIdProto(objectIdP);
- // We may need to delay the registration command (if it is not already delayed).
- int delayMs = 0;
- if (!command.getIsDelayed()) {
- delayMs = state.getNextDelay(objectId);
- }
- if (delayMs == 0) {
- issueRegistration(objectId, isRegister);
- } else {
- AndroidListenerIntents.issueDelayedRegistrationIntent(getApplicationContext(), clock,
- state.getClientId(), objectId, isRegister, delayMs, state.getNextRequestCode());
- }
- }
- return true;
- }
-
- /**
- * Called when the client application requests a new registration. If a redundant register request
- * is made -- i.e. when the application attempts to register an object that is already in the
- * {@code AndroidListenerState#desiredRegistrations} collection -- the method returns immediately.
- * Unregister requests are never ignored since we can't reliably determine whether an unregister
- * request is redundant: our policy on failures of any kind is to remove the registration from
- * the {@code AndroidListenerState#desiredRegistrations} collection.
- */
- private void issueRegistration(ObjectId objectId, boolean isRegister) {
- if (isRegister) {
- if (state.addDesiredRegistration(objectId)) {
- // Don't bother if we think it's already registered. Note that we remove the object from the
- // collection when there is a failure.
- getClient().register(objectId);
- }
- } else {
- // Remove the object ID from the desired registration collection so that subsequent attempts
- // to re-register are not ignored.
- state.removeDesiredRegistration(objectId);
- getClient().unregister(objectId);
- }
- }
-
- /** Tries to handle a start intent. Returns {@code true} iff the intent is a start intent. */
- private boolean tryHandleStartIntent(Intent intent) {
- StartCommand command = AndroidListenerIntents.findStartCommand(intent);
- if ((command == null) || !AndroidListenerProtos.isValidStartCommand(command)) {
- return false;
- }
- // Reset the state so that we make no assumptions about desired registrations and can ignore
- // messages directed at the wrong instance.
- state = new AndroidListenerState(initialMaxDelayMs, maxDelayFactor);
- boolean skipStartForTest = false;
- ClientConfigP clientConfig = InvalidationClientCore.createConfig();
- if (command.getAllowSuppression() != clientConfig.getAllowSuppression()) {
- ClientConfigP.Builder clientConfigBuilder = clientConfig.toBuilder();
- clientConfigBuilder.allowSuppression = command.getAllowSuppression();
- clientConfig = clientConfigBuilder.build();
- }
- Intent startIntent = ProtocolIntents.InternalDowncalls.newCreateClientIntent(
- command.getClientType(), command.getClientName(), clientConfig, skipStartForTest);
- AndroidListenerIntents.issueTiclIntent(getApplicationContext(), startIntent);
- return true;
- }
-
- /** Tries to handle an ack intent. Returns {@code true} iff the intent is an ack intent. */
- private boolean tryHandleAckIntent(Intent intent) {
- byte[] data = AndroidListenerIntents.findAckHandle(intent);
- if (data == null) {
- return false;
- }
- getClient().acknowledge(AckHandle.newInstance(data));
- return true;
- }
-
- /**
- * Tries to handle a background invalidation intent. Returns {@code true} iff the intent is a
- * background invalidation intent.
- */
- private boolean tryHandleBackgroundInvalidationsIntent(Intent intent) {
- byte[] data = intent.getByteArrayExtra(ProtocolIntents.BACKGROUND_INVALIDATION_KEY);
- if (data == null) {
- return false;
- }
- try {
- InvalidationMessage invalidationMessage = InvalidationMessage.parseFrom(data);
- List<Invalidation> invalidations = new ArrayList<Invalidation>();
- for (InvalidationP invalidation : invalidationMessage.getInvalidation()) {
- invalidations.add(ProtoWrapperConverter.convertFromInvalidationProto(invalidation));
- }
- backgroundInvalidateForInternalUse(invalidations);
- } catch (ValidationException exception) {
- logger.info("Failed to parse background invalidation intent payload: %s",
- exception.getMessage());
- }
- return false;
- }
-
- /** Returns the current state of the listener, for tests. */
- AndroidListenerState getStateForTest() {
- return state;
- }
-}
diff --git a/java/com/google/ipc/invalidation/external/client/contrib/AndroidListenerIntents.java b/java/com/google/ipc/invalidation/external/client/contrib/AndroidListenerIntents.java
deleted file mode 100644
index d799ef6..0000000
--- a/java/com/google/ipc/invalidation/external/client/contrib/AndroidListenerIntents.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.ipc.invalidation.external.client.contrib;
-
-import com.google.ipc.invalidation.external.client.SystemResources.Logger;
-import com.google.ipc.invalidation.external.client.android.service.AndroidLogger;
-import com.google.ipc.invalidation.external.client.contrib.AndroidListener.AlarmReceiver;
-import com.google.ipc.invalidation.external.client.types.ObjectId;
-import com.google.ipc.invalidation.ticl.android2.AndroidClock;
-import com.google.ipc.invalidation.ticl.android2.AndroidTiclManifest;
-import com.google.ipc.invalidation.ticl.android2.channel.AndroidChannelConstants.AuthTokenConstants;
-import com.google.ipc.invalidation.ticl.proto.AndroidListenerProtocol.RegistrationCommand;
-import com.google.ipc.invalidation.ticl.proto.AndroidListenerProtocol.StartCommand;
-import com.google.ipc.invalidation.util.Bytes;
-import com.google.ipc.invalidation.util.ProtoWrapper.ValidationException;
-
-import android.app.AlarmManager;
-import android.app.PendingIntent;
-import android.app.PendingIntent.CanceledException;
-import android.content.Context;
-import android.content.Intent;
-
-
-/**
- * Static helper class supporting construction and decoding of intents issued and handled by the
- * {@link AndroidListener}.
- *
- */
-class AndroidListenerIntents {
-
- /** The logger. */
- private static final Logger logger = AndroidLogger.forPrefix("");
-
- /** Key of Intent byte[] holding a {@link RegistrationCommand} protocol buffer. */
- static final String EXTRA_REGISTRATION =
- "com.google.ipc.invalidation.android_listener.REGISTRATION";
-
- /** Key of Intent byte[] holding a {@link StartCommand} protocol buffer. */
- static final String EXTRA_START =
- "com.google.ipc.invalidation.android_listener.START";
-
- /** Key of Intent extra indicating that the client should stop. */
- static final String EXTRA_STOP =
- "com.google.ipc.invalidation.android_listener.STOP";
-
- /** Key of Intent extra holding a byte[] that is ack handle data. */
- static final String EXTRA_ACK =
- "com.google.ipc.invalidation.android_listener.ACK";
-
- /**
- * Issues the given {@code intent} to the TICL service class registered in the {@code context}.
- */
- static void issueTiclIntent(Context context, Intent intent) {
- context.startService(intent.setClassName(context,
- new AndroidTiclManifest(context).getTiclServiceClass()));
- }
-
- /**
- * Issues the given {@code intent} to the {@link AndroidListener} class registered in the
- * {@code context}.
- */
- static void issueAndroidListenerIntent(Context context, Intent intent) {
- context.startService(setAndroidListenerClass(context, intent));
- }
-
- /**
- * Returns the ack handle from the given intent if it has the appropriate extra. Otherwise,
- * returns {@code null}.
- */
- static byte[] findAckHandle(Intent intent) {
- return intent.getByteArrayExtra(EXTRA_ACK);
- }
-
- /**
- * Returns {@link RegistrationCommand} extra from the given intent or null if no valid
- * registration command exists.
- */
- static RegistrationCommand findRegistrationCommand(Intent intent) {
- // Check that the extra exists.
- byte[] data = intent.getByteArrayExtra(EXTRA_REGISTRATION);
- if (null == data) {
- return null;
- }
-
- // Attempt to parse the extra.
- try {
- return RegistrationCommand.parseFrom(data);
- } catch (ValidationException exception) {
- logger.warning("Received invalid proto: %s", exception);
- return null;
- }
- }
-
- /**
- * Returns {@link StartCommand} extra from the given intent or null if no valid start command
- * exists.
- */
- static StartCommand findStartCommand(Intent intent) {
- // Check that the extra exists.
- byte[] data = intent.getByteArrayExtra(EXTRA_START);
- if (null == data) {
- return null;
- }
-
- // Attempt to parse the extra.
- try {
- return StartCommand.parseFrom(data);
- } catch (ValidationException exception) {
- logger.warning("Received invalid proto: %s", exception);
- return null;
- }
- }
-
- /** Returns {@code true} if the intent has the 'stop' extra. */
- static boolean isStopIntent(Intent intent) {
- return intent.hasExtra(EXTRA_STOP);
- }
-
- /** Issues a registration retry with delay. */
- static void issueDelayedRegistrationIntent(Context context, AndroidClock clock,
- Bytes clientId, ObjectId objectId, boolean isRegister, int delayMs, int requestCode) {
- RegistrationCommand command = isRegister ?
- AndroidListenerProtos.newDelayedRegisterCommand(clientId, objectId) :
- AndroidListenerProtos.newDelayedUnregisterCommand(clientId, objectId);
- Intent intent = new Intent()
- .putExtra(EXTRA_REGISTRATION, command.toByteArray())
- .setClass(context, AlarmReceiver.class);
-
- // Create a pending intent that will cause the AlarmManager to fire the above intent.
- PendingIntent pendingIntent = PendingIntent.getBroadcast(context, requestCode, intent,
- PendingIntent.FLAG_ONE_SHOT);
-
- // Schedule the pending intent after the appropriate delay.
- AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
- long executeMs = clock.nowMs() + delayMs;
- alarmManager.set(AlarmManager.RTC, executeMs, pendingIntent);
- }
-
- /** Creates a 'start-client' intent. */
- static Intent createStartIntent(Context context, int clientType, Bytes clientName,
- boolean allowSuppression) {
- Intent intent = new Intent();
- // Create proto for the start command.
- StartCommand command =
- AndroidListenerProtos.newStartCommand(clientType, clientName, allowSuppression);
- intent.putExtra(EXTRA_START, command.toByteArray());
- return setAndroidListenerClass(context, intent);
- }
-
- /** Creates a 'stop-client' intent. */
- static Intent createStopIntent(Context context) {
- // Stop command just has the extra (its content doesn't matter).
- Intent intent = new Intent();
- intent.putExtra(EXTRA_STOP, true);
- return setAndroidListenerClass(context, intent);
- }
-
- /** Create an ack intent. */
- static Intent createAckIntent(Context context, byte[] ackHandle) {
- // Ack intent has an extra containing the ack handle data.
- Intent intent = new Intent();
- intent.putExtra(EXTRA_ACK, ackHandle);
- return setAndroidListenerClass(context, intent);
- }
-
- /** Constructs an intent with {@link RegistrationCommand} proto. */
- static Intent createRegistrationIntent(Context context, Bytes clientId,
- Iterable<ObjectId> objectIds, boolean isRegister) {
- // Registration intent has an extra containing the RegistrationCommand proto.
- Intent intent = new Intent();
- RegistrationCommand command =
- AndroidListenerProtos.newRegistrationCommand(clientId, objectIds, isRegister);
- intent.putExtra(EXTRA_REGISTRATION, command.toByteArray());
- return setAndroidListenerClass(context, intent);
- }
-
- /** Sets the appropriate class for {@link AndroidListener} service intents. */
- static Intent setAndroidListenerClass(Context context, Intent intent) {
- String simpleListenerClass = new AndroidTiclManifest(context).getListenerServiceClass();
- return intent.setClassName(context, simpleListenerClass);
- }
-
- /** Returns {@code true} iff the given intent is an authorization token request. */
- static boolean isAuthTokenRequest(Intent intent) {
- return AuthTokenConstants.ACTION_REQUEST_AUTH_TOKEN.equals(intent.getAction());
- }
-
- /**
- * Given an authorization token request intent and authorization information ({@code authToken}
- * and {@code authType}) issues a response.
- */
- static void issueAuthTokenResponse(Context context, PendingIntent pendingIntent, String authToken,
- String authType) {
- Intent responseIntent = new Intent()
- .putExtra(AuthTokenConstants.EXTRA_AUTH_TOKEN, authToken)
- .putExtra(AuthTokenConstants.EXTRA_AUTH_TOKEN_TYPE, authType);
- try {
- pendingIntent.send(context, 0, responseIntent);
- } catch (CanceledException exception) {
- logger.warning("Canceled auth request: %s", exception);
- }
- }
-
- // Prevent instantiation.
- private AndroidListenerIntents() {
- }
-}
diff --git a/java/com/google/ipc/invalidation/external/client/contrib/AndroidListenerManifest.xml b/java/com/google/ipc/invalidation/external/client/contrib/AndroidListenerManifest.xml
deleted file mode 100644
index 3783df2..0000000
--- a/java/com/google/ipc/invalidation/external/client/contrib/AndroidListenerManifest.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
- <!-- Copyright 2011 Google Inc. All Rights Reserved. -->
- <!-- Manifest for AndroidListener. Must be merged with
- j/c/g/ipc/invalidation/external/client/android2/AndroidManifest.xml. -->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.google.ipc.invalidation.external.client.contrib">
- <application>
- <!-- Receiver for scheduler alarms. -->
- <receiver android:exported="false"
- android:name="com.google.ipc.invalidation.external.client.contrib.AndroidListener$AlarmReceiver"/>
- </application>
-</manifest>
diff --git a/java/com/google/ipc/invalidation/external/client/contrib/AndroidListenerProtos.java b/java/com/google/ipc/invalidation/external/client/contrib/AndroidListenerProtos.java
deleted file mode 100644
index c5b077e..0000000
--- a/java/com/google/ipc/invalidation/external/client/contrib/AndroidListenerProtos.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.ipc.invalidation.external.client.contrib;
-
-import com.google.ipc.invalidation.external.client.types.ObjectId;
-import com.google.ipc.invalidation.ticl.ProtoWrapperConverter;
-import com.google.ipc.invalidation.ticl.TiclExponentialBackoffDelayGenerator;
-import com.google.ipc.invalidation.ticl.proto.AndroidListenerProtocol.AndroidListenerState;
-import com.google.ipc.invalidation.ticl.proto.AndroidListenerProtocol.AndroidListenerState.RetryRegistrationState;
-import com.google.ipc.invalidation.ticl.proto.AndroidListenerProtocol.RegistrationCommand;
-import com.google.ipc.invalidation.ticl.proto.AndroidListenerProtocol.StartCommand;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP;
-import com.google.ipc.invalidation.util.Bytes;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-/**
- * Static helper class supporting construction of valid {code AndroidListenerProtocol} messages.
- *
- */
-class AndroidListenerProtos {
-
- /** Creates a retry register command for the given object and client. */
- static RegistrationCommand newDelayedRegisterCommand(Bytes clientId, ObjectId objectId) {
- final boolean isRegister = true;
- return newDelayedRegistrationCommand(clientId, objectId, isRegister);
- }
-
- /** Creates a retry unregister command for the given object and client. */
- static RegistrationCommand newDelayedUnregisterCommand(Bytes clientId, ObjectId objectId) {
- final boolean isRegister = false;
- return newDelayedRegistrationCommand(clientId, objectId, isRegister);
- }
-
- /** Creates proto for {@link AndroidListener} state. */
- static AndroidListenerState newAndroidListenerState(Bytes clientId, int requestCodeSeqNum,
- Map<ObjectId, TiclExponentialBackoffDelayGenerator> delayGenerators,
- Collection<ObjectId> desiredRegistrations) {
- ArrayList<RetryRegistrationState> retryRegistrationState =
- new ArrayList<RetryRegistrationState>(delayGenerators.size());
- for (Entry<ObjectId, TiclExponentialBackoffDelayGenerator> entry : delayGenerators.entrySet()) {
- retryRegistrationState.add(
- newRetryRegistrationState(entry.getKey(), entry.getValue()));
- }
- return AndroidListenerState.create(
- ProtoWrapperConverter.convertToObjectIdProtoCollection(desiredRegistrations),
- retryRegistrationState, clientId, requestCodeSeqNum);
- }
-
- /** Creates proto for retry registration state. */
- static RetryRegistrationState newRetryRegistrationState(ObjectId objectId,
- TiclExponentialBackoffDelayGenerator delayGenerator) {
- return RetryRegistrationState.create(ProtoWrapperConverter.convertToObjectIdProto(objectId),
- delayGenerator.marshal());
- }
-
- /** Returns {@code true} iff the given proto is valid. */
- static boolean isValidAndroidListenerState(AndroidListenerState state) {
- return state.hasClientId() && state.hasRequestCodeSeqNum();
- }
-
- /** Returns {@code true} iff the given proto is valid. */
- static boolean isValidRegistrationCommand(RegistrationCommand command) {
- return command.hasIsRegister() && command.hasClientId() && command.hasIsDelayed();
- }
-
- /** Returns {@code true} iff the given proto is valid. */
- static boolean isValidStartCommand(StartCommand command) {
- return command.hasClientType() && command.hasClientName();
- }
-
- /** Creates start command proto. */
- static StartCommand newStartCommand(int clientType, Bytes clientName,
- boolean allowSuppression) {
- return StartCommand.create(clientType, clientName, allowSuppression);
- }
-
- static RegistrationCommand newRegistrationCommand(Bytes clientId,
- Iterable<ObjectId> objectIds, boolean isRegister) {
- return RegistrationCommand.create(isRegister,
- ProtoWrapperConverter.convertToObjectIdProtoCollection(objectIds), clientId,
- /* isDelayed */ false);
- }
-
- private static RegistrationCommand newDelayedRegistrationCommand(Bytes clientId,
- ObjectId objectId, boolean isRegister) {
- List<ObjectIdP> objectIds = new ArrayList<ObjectIdP>(1);
- objectIds.add(ProtoWrapperConverter.convertToObjectIdProto(objectId));
- return RegistrationCommand.create(isRegister, objectIds, clientId, /* isDelayed */ true);
- }
-
- // Prevent instantiation.
- private AndroidListenerProtos() {
- }
-}
diff --git a/java/com/google/ipc/invalidation/external/client/contrib/AndroidListenerState.java b/java/com/google/ipc/invalidation/external/client/contrib/AndroidListenerState.java
deleted file mode 100644
index 0b0bf52..0000000
--- a/java/com/google/ipc/invalidation/external/client/contrib/AndroidListenerState.java
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.ipc.invalidation.external.client.contrib;
-
-import com.google.ipc.invalidation.external.client.types.ObjectId;
-import com.google.ipc.invalidation.ticl.ProtoWrapperConverter;
-import com.google.ipc.invalidation.ticl.TiclExponentialBackoffDelayGenerator;
-import com.google.ipc.invalidation.ticl.proto.AndroidListenerProtocol;
-import com.google.ipc.invalidation.ticl.proto.AndroidListenerProtocol.AndroidListenerState.RetryRegistrationState;
-import com.google.ipc.invalidation.ticl.proto.Client.ExponentialBackoffState;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP;
-import com.google.ipc.invalidation.util.Bytes;
-import com.google.ipc.invalidation.util.Marshallable;
-import com.google.ipc.invalidation.util.TypedUtil;
-
-import java.nio.ByteBuffer;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Random;
-import java.util.Set;
-import java.util.UUID;
-
-
-/**
- * Encapsulates state to simplify persistence and tracking of changes. Internally maintains an
- * {@link #isDirty} bit. Call {@link #resetIsDirty} to indicate that changes have been persisted.
- *
- * <p>Notes on the {@link #desiredRegistrations} (DR) and {@link #delayGenerators} (DG) collections:
- * When the client application registers for an object, it is immediately added to DR. Similarly,
- * an object is removed from DR when the application unregisters. If a registration failure is
- * reported, the object is removed from DR if it exists and a delay generator is added to DG if one
- * does not already exist. (In the face of a failure, we assume that the registration is not desired
- * by the application unless/until the application retries.) When there is a successful
- * registration, the corresponding DG entry is removed. There are two independent collections rather
- * than one since we may be applying exponential backoff for an object when it is not in DR, and we
- * may have no reason to delay operations against an object in DR as well.
- *
- * <p>By removing objects from the {@link #desiredRegistrations} collection on failures, we are
- * essentially assuming that the client application doesn't care about the registration until we're
- * told otherwise -- by a subsequent call to register or unregister.
- *
- */
-final class AndroidListenerState
- implements Marshallable<AndroidListenerProtocol.AndroidListenerState> {
-
- /**
- * Exponential backoff delay generators used to determine delay before registration retries.
- * There is a delay generator for every failing object.
- */
- private final Map<ObjectId, TiclExponentialBackoffDelayGenerator> delayGenerators =
- new HashMap<ObjectId, TiclExponentialBackoffDelayGenerator>();
-
- /** The set of registrations for which the client wants to be registered. */
- private final Set<ObjectId> desiredRegistrations;
-
- /** Random generator used for all delay generators. */
- private final Random random = new Random();
-
- /** Initial maximum retry delay for exponential backoff. */
- private final int initialMaxDelayMs;
-
- /** Maximum delay factor for exponential backoff (relative to {@link #initialMaxDelayMs}). */
- private final int maxDelayFactor;
-
- /** Sequence number for alarm manager request codes. */
- private int requestCodeSeqNum;
-
- /**
- * Dirty flag. {@code true} whenever changes are made, reset to false when {@link #resetIsDirty}
- * is called. State initialized from a proto is assumed to be initially clean.
- */
- private boolean isDirty;
-
- /**
- * The identifier for the current client. The ID is randomly generated and is used to ensure that
- * messages are not handled by the wrong client instance.
- */
- private final Bytes clientId;
-
- /** Initializes state for a new client. */
- AndroidListenerState(int initialMaxDelayMs, int maxDelayFactor) {
- desiredRegistrations = new HashSet<ObjectId>();
- clientId = createGloballyUniqueClientId();
- // Assigning a client ID dirties the state because calling the constructor twice produces
- // different results.
- isDirty = true;
- requestCodeSeqNum = 0;
- this.initialMaxDelayMs = initialMaxDelayMs;
- this.maxDelayFactor = maxDelayFactor;
- }
-
- /** Initializes state from proto. */
- AndroidListenerState(int initialMaxDelayMs, int maxDelayFactor,
- AndroidListenerProtocol.AndroidListenerState state) {
- desiredRegistrations = new HashSet<ObjectId>();
- for (ObjectIdP objectIdProto : state.getRegistration()) {
- desiredRegistrations.add(ProtoWrapperConverter.convertFromObjectIdProto(objectIdProto));
- }
- for (RetryRegistrationState retryState : state.getRetryRegistrationState()) {
- ObjectIdP objectIdP = retryState.getNullableObjectId();
- if (objectIdP == null) {
- continue;
- }
- ObjectId objectId = ProtoWrapperConverter.convertFromObjectIdProto(objectIdP);
- delayGenerators.put(objectId, new TiclExponentialBackoffDelayGenerator(random,
- initialMaxDelayMs, maxDelayFactor, retryState.getExponentialBackoffState()));
- }
- clientId = state.getClientId();
- requestCodeSeqNum = state.getRequestCodeSeqNum();
- isDirty = false;
- this.initialMaxDelayMs = initialMaxDelayMs;
- this.maxDelayFactor = maxDelayFactor;
- }
-
- /** Increments and returns sequence number for alarm manager request codes. */
- int getNextRequestCode() {
- isDirty = true;
- return ++requestCodeSeqNum;
- }
-
- /**
- * See specs for {@link TiclExponentialBackoffDelayGenerator#getNextDelay}. Gets next delay for
- * the given {@code objectId}. If a delay generator does not yet exist for the object, one is
- * created.
- */
- int getNextDelay(ObjectId objectId) {
- TiclExponentialBackoffDelayGenerator delayGenerator =
- delayGenerators.get(objectId);
- if (delayGenerator == null) {
- delayGenerator = new TiclExponentialBackoffDelayGenerator(random, initialMaxDelayMs,
- maxDelayFactor);
- delayGenerators.put(objectId, delayGenerator);
- }
- // Requesting a delay from a delay generator modifies its internal state.
- isDirty = true;
- return delayGenerator.getNextDelay();
- }
-
- /** Inform that there has been a successful registration for an object. */
- void informRegistrationSuccess(ObjectId objectId) {
- // Since registration was successful, we can remove exponential backoff (if any) for the given
- // object.
- resetDelayGeneratorFor(objectId);
- }
-
- /**
- * Inform that there has been a registration failure.
- *
- * <p>Remove the object from the desired registrations collection whenever there's a failure. We
- * don't care if the op that failed was actually an unregister because we never suppress an
- * unregister request (even if the object is not in the collection). See
- * {@link AndroidListener#issueRegistration}.
- */
- public void informRegistrationFailure(ObjectId objectId, boolean isTransient) {
- removeDesiredRegistration(objectId);
- if (!isTransient) {
- // There should be no retries for the object, so remove any backoff state associated with it.
- resetDelayGeneratorFor(objectId);
- }
- }
-
- /**
- * If there is a backoff delay generator for the given object, removes it and sets dirty flag.
- */
- private void resetDelayGeneratorFor(ObjectId objectId) {
- if (TypedUtil.remove(delayGenerators, objectId) != null) {
- isDirty = true;
- }
- }
-
- /** Adds the given registration. Returns {@code true} if it was not already tracked. */
- boolean addDesiredRegistration(ObjectId objectId) {
- if (desiredRegistrations.add(objectId)) {
- isDirty = true;
- return true;
- }
- return false;
- }
-
- /** Removes the given registration. Returns {@code true} if it was actually tracked. */
- boolean removeDesiredRegistration(ObjectId objectId) {
- if (desiredRegistrations.remove(objectId)) {
- isDirty = true;
- return true;
- }
- return false;
- }
-
- /**
- * Resets the {@link #isDirty} flag to {@code false}. Call after marshalling and persisting state.
- */
- void resetIsDirty() {
- isDirty = false;
- }
-
- @Override
- public AndroidListenerProtocol.AndroidListenerState marshal() {
- return AndroidListenerProtos.newAndroidListenerState(clientId, requestCodeSeqNum,
- delayGenerators, desiredRegistrations);
- }
-
- /**
- * Gets the identifier for the current client. Used to determine if registrations commands are
- * relevant to this instance.
- */
- Bytes getClientId() {
- return clientId;
- }
-
- /** Returns {@code true} iff registration is desired for the given object. */
- boolean containsDesiredRegistration(ObjectId objectId) {
- return TypedUtil.contains(desiredRegistrations, objectId);
- }
-
- /**
- * Returns {@code true} if changes have been made since the last successful call to
- * {@link #resetIsDirty}.
- */
- boolean getIsDirty() {
- return isDirty;
- }
-
- @Override
- public int hashCode() {
- // Since the client ID is globally unique, it's sufficient as a hashCode.
- return clientId.hashCode();
- }
-
- /**
- * Overridden for tests which compare listener states to verify that they have been correctly
- * (un)marshalled. We implement equals rather than exposing private data.
- */
- @Override
- public boolean equals(Object object) {
- if (this == object) {
- return true;
- }
-
- if (!(object instanceof AndroidListenerState)) {
- return false;
- }
-
- AndroidListenerState that = (AndroidListenerState) object;
-
- return (this.isDirty == that.isDirty)
- && (this.requestCodeSeqNum == that.requestCodeSeqNum)
- && (this.desiredRegistrations.size() == that.desiredRegistrations.size())
- && (this.desiredRegistrations.containsAll(that.desiredRegistrations))
- && TypedUtil.<Bytes>equals(this.clientId, that.clientId)
- && equals(this.delayGenerators, that.delayGenerators);
- }
-
- /** Compares the contents of two {@link #delayGenerators} maps. */
- private static boolean equals(Map<ObjectId, TiclExponentialBackoffDelayGenerator> x,
- Map<ObjectId, TiclExponentialBackoffDelayGenerator> y) {
- if (x.size() != y.size()) {
- return false;
- }
- for (Entry<ObjectId, TiclExponentialBackoffDelayGenerator> xEntry : x.entrySet()) {
- TiclExponentialBackoffDelayGenerator yGenerator = y.get(xEntry.getKey());
- if ((yGenerator == null) || !TypedUtil.<ExponentialBackoffState>equals(
- xEntry.getValue().marshal(), yGenerator.marshal())) {
- return false;
- }
- }
- return true;
- }
-
- @Override
- public String toString() {
- return String.format(Locale.ROOT, "AndroidListenerState[%s]: isDirty = %b, "
- + "desiredRegistrations.size() = %d, delayGenerators.size() = %d, requestCodeSeqNum = %d",
- clientId, isDirty, desiredRegistrations.size(), delayGenerators.size(), requestCodeSeqNum);
- }
-
- /**
- * Constructs a new globally unique ID for the client. Can be used to determine if commands
- * originated from this instance of the listener.
- */
- private static Bytes createGloballyUniqueClientId() {
- UUID guid = UUID.randomUUID();
- byte[] bytes = new byte[16];
- ByteBuffer buffer = ByteBuffer.wrap(bytes);
- buffer.putLong(guid.getLeastSignificantBits());
- buffer.putLong(guid.getMostSignificantBits());
- return new Bytes(bytes);
- }
-}
diff --git a/java/com/google/ipc/invalidation/external/client/contrib/MultiplexingGcmListener.java b/java/com/google/ipc/invalidation/external/client/contrib/MultiplexingGcmListener.java
deleted file mode 100644
index 10cb3ce..0000000
--- a/java/com/google/ipc/invalidation/external/client/contrib/MultiplexingGcmListener.java
+++ /dev/null
@@ -1,359 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.external.client.contrib;
-
-import com.google.android.gcm.GCMBaseIntentService;
-import com.google.android.gcm.GCMBroadcastReceiver;
-import com.google.android.gcm.GCMRegistrar;
-import com.google.ipc.invalidation.external.client.SystemResources.Logger;
-import com.google.ipc.invalidation.external.client.android.service.AndroidLogger;
-import com.google.ipc.invalidation.ticl.android2.WakeLockManager;
-
-import android.app.IntentService;
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.pm.ServiceInfo;
-
-/**
- * A Google Cloud Messaging listener class that rebroadcasts events as package-scoped
- * broadcasts. This allows multiple components to share a single GCM connection.
- * <p>
- * This listener uses an API of broadcasted Intents that is modeled after that provided by
- * {@link GCMBaseIntentService}. For each upcall (e.g., onMessage, on Registered, etc) specified
- * by {@code GCMBaseIntentService}, there is an {@code EXTRA_OP_...} constant defined in
- * {@link Intents}.
- * <p>
- * Note that this class does <b>NOT</b> handle registering with GCM; applications are still required
- * to do that in the usual way (e.g., using the GCMRegistrar class from the GCM library).
- * <p>
- * In order to raise a {@code GCMBaseIntentService} event to listeners, this service will broadcast
- * an Intent with the following properties:
- * 1. The action of the Intent is {@link Intents#ACTION}
- * 2. There is a boolean-valued extra in the Intent whose key is the {@code EXTRA_OP_...} key
- * for that call and whose value is {@code true}. For any intent, exactly one {@code EXTRA_OP}
- * extra will be set.
- * 3. The Intent contains additional call-specific extras required to interpret it. (See note for
- * onMessage, below).
- * <p>
- * Clients of this service <b>MUST NOT</b> assume that there is a one-to-one mapping between
- * issued broadcasts and actual GCM intents. I.e., this service may issue broadcast intents
- * spontaneously, and it may not issue an intent for every GCM event.
- * <p>
- * For the onMessage() call, the broadcast intent will contain key/value extras containing the
- * message payload. These extras are guaranteed to be identical to those that would have been in
- * the Intent provided to the onMessage call. However, clients <b>MUST NOT</b> assume that the
- * Intent broadcast to communicate a GCM message is literally the same Intent generated by the GCM
- * client library.
- * <p>
- * This class does not expose the {@code onError} call, since according to the GCM documentation
- * there is nothing to do except log an error (which this class does).
- *
- */
-public class MultiplexingGcmListener extends GCMBaseIntentService {
- /* This class is public so that it can be instantiated by the Android runtime. */
-
- /** Constants used in broadcast Intents. */
- public static final class Intents {
- /** Prefix of the action and extras. */
- private static final String PREFIX = "com.google.ipc.invalidation.gcmmplex.";
-
- /** Action of all broadcast intents issued. */
- public static final String ACTION = PREFIX + "EVENT";
-
- /** Extra corresponding to an {@code onMessage} upcall. */
- public static final String EXTRA_OP_MESSAGE = PREFIX + "MESSAGE";
-
- /** Extra corresponding to an {@code onRegistered} upcall. */
- public static final String EXTRA_OP_REGISTERED = PREFIX + "REGISTERED";
-
- /** Extra corresponding to an {@code onUnregistered} upcall. */
- public static final String EXTRA_OP_UNREGISTERED = PREFIX + "UNREGISTERED";
-
- /** Extra corresponding to an {@code onDeletedMessages} upcall. */
- public static final String EXTRA_OP_DELETED_MESSAGES = PREFIX + "DELETED_MSGS";
-
- /**
- * Extra set iff the operation is {@link #EXTRA_OP_REGISTERED} or
- * {@link #EXTRA_OP_UNREGISTERED}; it is string-valued and holds the registration id.
- */
- public static final String EXTRA_DATA_REG_ID = PREFIX + "REGID";
-
- /**
- * Extra set iff the operation is {@link #EXTRA_OP_DELETED_MESSAGES}; it is integer-valued
- * and holds the number of deleted messages.
- */
- public static final String EXTRA_DATA_NUM_DELETED_MSGS = PREFIX + "NUM_DELETED_MSGS";
- }
-
- /**
- * {@link GCMBroadcastReceiver} that forwards GCM intents to the {@code MultiplexingGcmListener}
- * class.
- */
- public static class GCMReceiver extends GCMBroadcastReceiver {
- /* This class is public so that it can be instantiated by the Android runtime. */
- @Override
- protected String getGCMIntentServiceClassName(Context context) {
- return MultiplexingGcmListener.class.getName();
- }
- }
-
- /**
- * Convenience base class for client implementations. It provides base classes for a broadcast
- * receiver and an intent service that work together to handle events from the
- * {@code MultiplexingGcmListener} while holding a wake lock.
- * <p>
- * This class guarantees that the {@code onYYY} methods will be called holding a wakelock, and
- * that the wakelock will be automatically released when the method returns.
- * <p>
- * The wakelock will also be automatically released
- * {@link Receiver#WAKELOCK_TIMEOUT_MS} ms after the original Intent was received by the
- * {@link Receiver} class, to guard against leaks. Applications requiring a longer-duration
- * wakelock should acquire one on their own in the appropriate {@code onYYY} method.
- */
- public static abstract class AbstractListener extends IntentService {
- /** Prefix of all wakelocks acquired by the receiver and the intent service. */
- private static final String WAKELOCK_PREFIX = "multiplexing-gcm-listener:";
-
- /** Intent extra key used to hold wakelock names, for runtime checks. */
- private static final String EXTRA_WAKELOCK_NAME =
- "com.google.ipc.invalidation.gcmmplex.listener.WAKELOCK_NAME";
-
- /**
- * A {@code BroadcastReceiver} to receive intents from the {@code MultiplexingGcmListener}
- * service. It acquires a wakelock and forwards the intent to the service named by
- * {@link #getServiceClass}, which must be a subclass of {@code AbstractListener}.
- */
- public static abstract class Receiver extends BroadcastReceiver {
- /** Timeout after which wakelocks will be automatically released. */
- private static final int WAKELOCK_TIMEOUT_MS = 30 * 1000;
-
- @Override
- public final void onReceive(Context context, Intent intent) {
- // This method is final to prevent subclasses from overriding it and introducing errors in
- // the wakelock protocol.
- Class<?> serviceClass = getServiceClass();
-
- // If the service isn't an AbstractListener subclass, then it will not release the wakelock
- // properly, causing bugs.
- if (!AbstractListener.class.isAssignableFrom(serviceClass)) {
- throw new RuntimeException(
- "Service class is not a subclass of AbstractListener: " + serviceClass);
- }
- String wakelockKey = getWakelockKey(serviceClass);
- intent.setClass(context, serviceClass);
-
- // To avoid insidious bugs, tell the service which wakelock we acquired. The service will
- // log a warning if the lock it releases is not this lock.
- intent.putExtra(EXTRA_WAKELOCK_NAME, wakelockKey);
-
- // Acquire the lock and start the service. The service is responsible for releasing the
- // lock.
- WakeLockManager.getInstance(context).acquire(wakelockKey, WAKELOCK_TIMEOUT_MS);
- context.startService(intent);
- }
-
- /** Returns the class of the service that will handle intents. */
- protected abstract Class<?> getServiceClass();
- }
-
- protected AbstractListener(String name) {
- super(name);
-
- // If the process dies during a call to onHandleIntent, redeliver the intent when the service
- // restarts.
- setIntentRedelivery(true);
- }
-
- @Override
- public final void onHandleIntent(Intent intent) {
- if (intent == null) {
- return;
- }
-
- // This method is final to prevent subclasses from overriding it and introducing errors in
- // the wakelock protocol.
- try {
- doHandleIntent(intent);
- } finally {
- // Release the wakelock acquired by the receiver. The receiver provides the name of the
- // lock it acquired in the Intent so that we can sanity-check that we are releasing the
- // right lock.
- String receiverAcquiredWakelock = intent.getStringExtra(EXTRA_WAKELOCK_NAME);
- String wakelockToRelease = getWakelockKey(getClass());
- if (!wakelockToRelease.equals(receiverAcquiredWakelock)) {
- logger.warning("Receiver acquired wakelock '%s' but releasing '%s'",
- receiverAcquiredWakelock, wakelockToRelease);
- }
- WakeLockManager wakelockManager = WakeLockManager.getInstance(this);
- wakelockManager.release(wakelockToRelease);
- }
- }
-
- /** Handles {@code intent} while holding a wake lock. */
- private void doHandleIntent(Intent intent) {
- // Ensure this is an Intent we want to handle.
- if (!MultiplexingGcmListener.Intents.ACTION.equals(intent.getAction())) {
- logger.warning("Ignoring intent with unknown action: %s", intent);
- return;
- }
- // Dispatch based on the extras.
- if (intent.hasExtra(MultiplexingGcmListener.Intents.EXTRA_OP_MESSAGE)) {
- onMessage(intent);
- } else if (intent.hasExtra(MultiplexingGcmListener.Intents.EXTRA_OP_REGISTERED)) {
- onRegistered(intent.getStringExtra(MultiplexingGcmListener.Intents.EXTRA_DATA_REG_ID));
- } else if (intent.hasExtra(MultiplexingGcmListener.Intents.EXTRA_OP_UNREGISTERED)) {
- onUnregistered(intent.getStringExtra(MultiplexingGcmListener.Intents.EXTRA_DATA_REG_ID));
- } else if (intent.hasExtra(MultiplexingGcmListener.Intents.EXTRA_OP_DELETED_MESSAGES)) {
- int numDeleted =
- intent.getIntExtra(MultiplexingGcmListener.Intents.EXTRA_DATA_NUM_DELETED_MSGS, -1);
- if (numDeleted == -1) {
- logger.warning("Could not parse num-deleted field of GCM broadcast: %s", intent);
- return;
- }
- onDeletedMessages(numDeleted);
- } else {
- logger.warning("Broadcast GCM intent with no known operation: %s", intent);
- }
- }
-
- // These methods have the same specs as in {@code GCMBaseIntentService}.
- protected abstract void onMessage(Intent intent);
- protected abstract void onRegistered(String registrationId);
- protected abstract void onUnregistered(String registrationId);
- protected abstract void onDeletedMessages(int total);
-
- /**
- * Returns the name of the wakelock to acquire for the intent service implemented by
- * {@code clazz}.
- */
- private static String getWakelockKey(Class<?> clazz) {
- return WAKELOCK_PREFIX + clazz.getName();
- }
- }
-
- /**
- * Name of the metadata element within the {@code service} element whose value is a
- * comma-delimited list of GCM sender ids.
- */
- private static final String GCM_SENDER_IDS_METADATA_KEY = "sender_ids";
-
- /** Logger. */
- private static final Logger logger = AndroidLogger.forTag("MplexGcmListener");
-
- // All onYYY methods work by constructing an appropriate Intent and broadcasting it.
-
- @Override
- protected void onMessage(Context context, Intent intent) {
- Intent newIntent = new Intent();
- newIntent.putExtra(Intents.EXTRA_OP_MESSAGE, true);
-
- // Copy the extra keys containing the message payload into the new Intent.
- for (String extraKey : intent.getExtras().keySet()) {
- newIntent.putExtra(extraKey, intent.getStringExtra(extraKey));
- }
- rebroadcast(newIntent);
- }
-
- @Override
- protected void onRegistered(Context context, String registrationId) {
- Intent intent = new Intent();
- intent.putExtra(Intents.EXTRA_OP_REGISTERED, true);
- intent.putExtra(Intents.EXTRA_DATA_REG_ID, registrationId);
- rebroadcast(intent);
- }
-
- @Override
- protected void onUnregistered(Context context, String registrationId) {
- Intent intent = new Intent();
- intent.putExtra(Intents.EXTRA_OP_UNREGISTERED, true);
- intent.putExtra(Intents.EXTRA_DATA_REG_ID, registrationId);
- rebroadcast(intent);
- }
-
- @Override
- protected void onDeletedMessages(Context context, int total) {
- Intent intent = new Intent();
- intent.putExtra(Intents.EXTRA_OP_DELETED_MESSAGES, true);
- intent.putExtra(Intents.EXTRA_DATA_NUM_DELETED_MSGS, total);
- rebroadcast(intent);
- }
-
- @Override
- protected void onError(Context context, String errorId) {
- // This is called for unrecoverable errors, so just log a warning.
- logger.warning("GCM error: %s", errorId);
- }
-
- @Override
- protected String[] getSenderIds(Context context) {
- return readSenderIdsFromManifestOrDie(this);
- }
-
- /**
- * Broadcasts {@code intent} with the action set to {@link Intents#ACTION} and the package name
- * set to the package name of this service.
- */
- private void rebroadcast(Intent intent) {
- intent.setAction(Intents.ACTION);
- intent.setPackage(getPackageName());
- sendBroadcast(intent);
- }
-
- /**
- * Registers with GCM if not already registered. Also verifies that the device supports GCM
- * and that the manifest is correctly configured. Returns the existing registration id, if one
- * exists, or the empty string if one does not.
- *
- * @throws UnsupportedOperationException if the device does not have all GCM dependencies
- * @throws IllegalStateException if the manifest is not correctly configured
- */
- public static String initializeGcm(Context context) {
- GCMRegistrar.checkDevice(context);
- GCMRegistrar.checkManifest(context);
- final String regId = GCMRegistrar.getRegistrationId(context);
- if (regId.isEmpty()) {
- GCMRegistrar.register(context, readSenderIdsFromManifestOrDie(context));
- }
- return regId;
- }
-
- /**
- * Returns the GCM sender ids from {@link #GCM_SENDER_IDS_METADATA_KEY} or throws a
- * {@code RuntimeException} if they are not defined.
- */
-
- static String[] readSenderIdsFromManifestOrDie(Context context) {
- try {
- ServiceInfo serviceInfo = context.getPackageManager().getServiceInfo(
- new ComponentName(context, MultiplexingGcmListener.class), PackageManager.GET_META_DATA);
- if (serviceInfo.metaData == null) {
- throw new RuntimeException("Service has no metadata");
- }
- String senderIds = serviceInfo.metaData.getString(GCM_SENDER_IDS_METADATA_KEY);
- if (senderIds == null) {
- throw new RuntimeException("Service does not have the sender-ids metadata");
- }
- return senderIds.split(",");
- } catch (NameNotFoundException exception) {
- throw new RuntimeException("Could not read service info from manifest", exception);
- }
- }
-}
diff --git a/java/com/google/ipc/invalidation/external/client/types/AckHandle.java b/java/com/google/ipc/invalidation/external/client/types/AckHandle.java
deleted file mode 100644
index 67d5e08..0000000
--- a/java/com/google/ipc/invalidation/external/client/types/AckHandle.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.external.client.types;
-
-import java.util.Arrays;
-
-/**
- * Represents an opaque handle that can be used to acknowledge an invalidation event by calling
- * {@code InvalidationClient.acknowledge(AckHandle)} to indicate that the client has successfully
- * handled the event.
- *
- */
-public final class AckHandle {
-
- /** The serialized representation of the handle */
- private final byte[] handleData;
-
- /** Creates a new ack handle from the serialized {@code handleData} representation. */
- public static AckHandle newInstance(byte[] handleData) {
- return new AckHandle(handleData);
- }
-
- private AckHandle(byte[] handleData) {
- this.handleData = handleData;
- }
-
- public byte[] getHandleData() {
- return handleData;
- }
-
- @Override
- public boolean equals(Object object) {
- if (object == this) {
- return true;
- }
-
- if (!(object instanceof AckHandle)) {
- return false;
- }
-
- final AckHandle other = (AckHandle) object;
- return Arrays.equals(handleData, other.handleData);
- }
-
- @Override
- public int hashCode() {
- return Arrays.hashCode(handleData);
- }
-
- @Override
- public String toString() {
- return "AckHandle: " + BytesFormatter.toString(handleData);
- }
-}
diff --git a/java/com/google/ipc/invalidation/external/client/types/ApplicationClientId.java b/java/com/google/ipc/invalidation/external/client/types/ApplicationClientId.java
deleted file mode 100644
index fa3cdbc..0000000
--- a/java/com/google/ipc/invalidation/external/client/types/ApplicationClientId.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.external.client.types;
-
-import com.google.ipc.invalidation.util.Preconditions;
-
-import java.util.Arrays;
-
-/**
- * An identifier for application clients in an application-defined way. I.e., a client name in an
- * application naming scheme. This is not interpreted by the invalidation system - however, it is
- * used opaquely to squelch invalidations for the cient causing an update, e.g., if a client C
- * whose app client id is C.appClientId changes object X and the backend store informs the backend
- * invalidation sytsem that X was modified by X.appClientId, the invalidation to C can then be
- * squelched by the invalidation system.
- *
- */
-public final class ApplicationClientId {
-
- /** The opaque id of the client application. */
- private final byte[] clientName;
-
- /**
- * Creates an application client id for the given {@code clientName} (does not make a copy of the
- * byte array).
- */
- public static ApplicationClientId newInstance(byte[] appClientId) {
- return new ApplicationClientId(appClientId);
- }
-
- /** Creates an application id for the given {@code clientName}. */
- private ApplicationClientId(byte[] clientName) {
- this.clientName = Preconditions.checkNotNull(clientName, "clientName");
- }
-
- public byte[] getClientName() {
- return clientName;
- }
-
- @Override
- public boolean equals(Object object) {
- if (object == this) {
- return true;
- }
-
- if (!(object instanceof ApplicationClientId)) {
- return false;
- }
-
- final ApplicationClientId other = (ApplicationClientId) object;
- return Arrays.equals(clientName, other.clientName);
- }
-
- @Override
- public int hashCode() {
- return Arrays.hashCode(clientName);
- }
-
- @Override
- public String toString() {
- return "AppClientId: <, " + BytesFormatter.toString(clientName) + ">";
- }
-}
diff --git a/java/com/google/ipc/invalidation/external/client/types/BytesFormatter.java b/java/com/google/ipc/invalidation/external/client/types/BytesFormatter.java
deleted file mode 100644
index 9552cc9..0000000
--- a/java/com/google/ipc/invalidation/external/client/types/BytesFormatter.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.external.client.types;
-
-
-/**
- * A utility class to format bytes to string for ease of reading and debugging.
- *
- */
-class BytesFormatter {
-
- /**
- * Three arrays that store the representation of each character from 0 to 255.
- * The ith number's octal representation is: CHAR_OCTAL_STRINGS1[i],
- * CHAR_OCTAL_STRINGS2[i], CHAR_OCTAL_STRINGS3[i]
- * <p>
- * E.g., if the number 128, these arrays contain 2, 0, 0 at index 128. We use
- * 3 char arrays instead of an array of strings since the code path for a
- * character append operation is quite a bit shorter than the append operation
- * for strings.
- */
- private static final char[] CHAR_OCTAL_STRINGS1 = new char[256];
- private static final char[] CHAR_OCTAL_STRINGS2 = new char[256];
- private static final char[] CHAR_OCTAL_STRINGS3 = new char[256];
-
- static {
- // Initialize the array with the Octal string values so that we do not have
- // to do String.format for every byte during runtime.
- for (int i = 0; i < CHAR_OCTAL_STRINGS1.length; i++) {
- // Unsophisticated way to get an octal string padded to 3 characters.
- String intAsStr = Integer.toOctalString(i);
- switch (intAsStr.length()) {
- case 3:
- break;
- case 2:
- intAsStr = "0" + intAsStr;
- break;
- case 1:
- intAsStr = "00" + intAsStr;
- break;
- default:
- throw new RuntimeException("Bad integer value: " + intAsStr);
- }
- if (intAsStr.length() != 3) {
- throw new RuntimeException("Bad padding: " + intAsStr);
- }
- String value = '\\' + intAsStr;
- CHAR_OCTAL_STRINGS1[i] = value.charAt(1);
- CHAR_OCTAL_STRINGS2[i] = value.charAt(2);
- CHAR_OCTAL_STRINGS3[i] = value.charAt(3);
- }
- }
-
- /** Returns a human-readable string for the contents of {@code bytes}. */
- public static String toString(byte[] bytes) {
- if (bytes == null) {
- return null;
- }
- StringBuilder builder = new StringBuilder(3 * bytes.length);
- for (byte c : bytes) {
- switch(c) {
- case '\n': builder.append('\\'); builder.append('n'); break;
- case '\r': builder.append('\\'); builder.append('r'); break;
- case '\t': builder.append('\\'); builder.append('t'); break;
- case '\"': builder.append('\\'); builder.append('"'); break;
- case '\\': builder.append('\\'); builder.append('\\'); break;
- default:
- if ((c >= 32) && (c < 127) && c != '\'') {
- builder.append((char) c);
- } else {
- int byteValue = c;
- if (c < 0) {
- byteValue = c + 256;
- }
- builder.append('\\');
- builder.append(CHAR_OCTAL_STRINGS1[byteValue]);
- builder.append(CHAR_OCTAL_STRINGS2[byteValue]);
- builder.append(CHAR_OCTAL_STRINGS3[byteValue]);
- }
- }
- }
- return builder.toString();
- }
-
- private BytesFormatter() { // To prevent instantiation.
- }
-}
diff --git a/java/com/google/ipc/invalidation/external/client/types/Callback.java b/java/com/google/ipc/invalidation/external/client/types/Callback.java
deleted file mode 100644
index a1296cd..0000000
--- a/java/com/google/ipc/invalidation/external/client/types/Callback.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.external.client.types;
-
-
-/**
- * An interface to receive objects of a single type.
- *
- * @param <T> type of object received in the callback
- *
- */
-public interface Callback<T> {
- /**
- * Accepts the object provided by the caller.
- *
- * @param object received object
- */
- void accept(T object);
-}
diff --git a/java/com/google/ipc/invalidation/external/client/types/ErrorContext.java b/java/com/google/ipc/invalidation/external/client/types/ErrorContext.java
deleted file mode 100644
index e50d38c..0000000
--- a/java/com/google/ipc/invalidation/external/client/types/ErrorContext.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.external.client.types;
-
-/**
- * Extra information about the error in {@code ErrorInfo} - cast to appropriate subtype as
- * specified for the given reason.
- *
- */
-public class ErrorContext {
-
- /** A context with numeric data. */
- public static class NumberContext extends ErrorContext {
- private int number;
-
- public NumberContext(int number) {
- this.number = number;
- }
-
- int getNumber() {
- return number;
- }
- }
-}
diff --git a/java/com/google/ipc/invalidation/external/client/types/ErrorInfo.java b/java/com/google/ipc/invalidation/external/client/types/ErrorInfo.java
deleted file mode 100644
index 68b78b8..0000000
--- a/java/com/google/ipc/invalidation/external/client/types/ErrorInfo.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.external.client.types;
-
-/**
- * Information about an error given to the application.
- *
- */
-public final class ErrorInfo {
- /**
- * Possible reasons for error in {@code InvalidationListener.informError}. The application writer
- * must NOT assume that this is complete list since error codes may be added later. That is, for
- * error codes that it cannot handle, it should not necessarily just crash the code. It may want
- * to present a dialog box to the user (say). For each ErrorReason, the ErrorInfo object has a
- * context object. We describe the type and meaning of the context for each named constant below.
- */
- public static class ErrorReason {
- /** The provided authentication/authorization token is not valid for use. */
- public static final int AUTH_FAILURE = 1;
-
- /** An unknown failure - more human-readable information is in the error message. */
- public static final int UNKNOWN_FAILURE = -1;
-
- private ErrorReason() {} // not instantiable
- }
-
- /** The cause of the failure. */
- private final int errorReason;
-
- /**
- * Is the error transient or permanent. See discussion in {@code Status.Code} for permanent and
- * transient failure handling.
- */
- private final boolean isTransient;
-
- /** Human-readable description of the error. */
- private final String errorMessage;
-
- /** Extra information about the error - cast to appropriate object as specified by the reason. */
- private final Object context;
-
- /**
- * Returns a new ErrorInfo object given the reason for the error, whether it is transient or
- * permanent, a helpful error message and extra context about the error.
- */
- public static ErrorInfo newInstance(int errorReason, boolean isTransient,
- String errorMessage, ErrorContext context) {
- return new ErrorInfo(errorReason, isTransient, errorMessage, context);
- }
-
- private ErrorInfo(int errorReason, boolean isTransient, String errorMessage,
- ErrorContext context) {
- this.errorReason = errorReason;
- this.isTransient = isTransient;
- this.errorMessage = errorMessage;
- this.context = context;
- }
-
- public boolean isTransient() {
- return isTransient;
- }
-
- public String getErrorMessage() {
- return errorMessage;
- }
-
- public int getErrorReason() {
- return errorReason;
- }
-
- public Object getContext() {
- return context;
- }
-
- @Override
- public String toString() {
- return "ErrorInfo: " + errorReason + ", " + isTransient + ", " + errorMessage + ", " + context;
- }
-}
diff --git a/java/com/google/ipc/invalidation/external/client/types/Invalidation.java b/java/com/google/ipc/invalidation/external/client/types/Invalidation.java
deleted file mode 100644
index acfe952..0000000
--- a/java/com/google/ipc/invalidation/external/client/types/Invalidation.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.external.client.types;
-
-import com.google.ipc.invalidation.util.Preconditions;
-
-import java.util.Arrays;
-
-
-/**
- * A class to represent an invalidation for a given object/version and an optional payload.
- *
- */
-public final class Invalidation {
-
- /** The object being invalidated/updated. */
- private final ObjectId objectId;
-
- /** The new version of the object. */
- private final long version;
-
- /** Optional payload for the object. */
- private final byte[] payload;
-
- /** Whether this is a restarted invalidation, for internal use only. */
- private final boolean isTrickleRestart;
-
- /**
- * Creates an invalidation for the given {@code object} and {@code version}.
- */
- public static Invalidation newInstance(ObjectId objectId, long version) {
- return new Invalidation(objectId, version, null, true);
- }
-
- /**
- * Creates an invalidation for the given {@code object} and {@code version} and {@code payload}
- */
- public static Invalidation newInstance(ObjectId objectId, long version,
- byte[] payload) {
- return new Invalidation(objectId, version, payload, true);
- }
-
- /**
- * Creates an invalidation for the given {@code object}, {@code version} and optional
- * {@code payload} and internal {@code isTrickleRestart} flag.
- */
- public static Invalidation newInstance(ObjectId objectId, long version,
- byte[] payload, boolean isTrickleRestart) {
- return new Invalidation(objectId, version, payload, isTrickleRestart);
- }
-
- /**
- * Creates an invalidation for the given {@code object}, {@code version} and optional
- * {@code payload} and optional {@code componentStampLog}.
- */
- private Invalidation(ObjectId objectId, long version, byte[] payload,
- boolean isTrickleRestart) {
- this.objectId = Preconditions.checkNotNull(objectId, "objectId");
- this.version = version;
- this.payload = payload;
- this.isTrickleRestart = isTrickleRestart;
- }
-
- public ObjectId getObjectId() {
- return objectId;
- }
-
- public long getVersion() {
- return version;
- }
-
- /** Returns the optional payload for the object - if none exists, returns {@code null}. */
- public byte[] getPayload() {
- return payload;
- }
-
- @Override
- public boolean equals(Object object) {
- if (object == this) {
- return true;
- }
-
- if (!(object instanceof Invalidation)) {
- return false;
- }
-
- final Invalidation other = (Invalidation) object;
- if ((payload != null) != (other.payload != null)) {
- // One of the objects has a payload and the other one does not.
- return false;
- }
- // Both have a payload or not.
- return objectId.equals(other.objectId) && (version == other.version) &&
- (isTrickleRestart == other.isTrickleRestart) &&
- ((payload == null) || Arrays.equals(payload, other.payload));
- }
-
- @Override
- public int hashCode() {
- int result = 17;
- result = 31 * result + objectId.hashCode();
- result = 31 * result + (int) (version ^ (version >>> 32));
-
- // Booleans.hashCode() inlined here to reduce client library size.
- result = 31 * result + (isTrickleRestart ? 1231 : 1237);
- if (payload != null) {
- result = 31 * result + Arrays.hashCode(payload);
- }
- return result;
- }
-
- @Override
- public String toString() {
- return "Inv: <" + objectId + ", " + version + ", " + isTrickleRestart + ", " +
- BytesFormatter.toString(payload) + ">";
- }
-
- /** Returns whether this is a restarted invalidation, for internal use only. */
- public boolean getIsTrickleRestartForInternalUse() {
- return isTrickleRestart;
- }
-}
diff --git a/java/com/google/ipc/invalidation/external/client/types/ObjectId.java b/java/com/google/ipc/invalidation/external/client/types/ObjectId.java
deleted file mode 100644
index 2a6217f..0000000
--- a/java/com/google/ipc/invalidation/external/client/types/ObjectId.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.external.client.types;
-
-import com.google.ipc.invalidation.util.Preconditions;
-
-import java.util.Arrays;
-
-/**
- * A class to represent a unique object id that an application can register or
- * unregister for.
- *
- */
-public final class ObjectId {
-
- /** The invalidation source type. */
- private final int source;
-
- /** The name/unique id for the object. */
- private final byte[] name;
-
- /**
- * Creates an object id for the given {@code source} and id {@code name} (does not make a copy of
- * the array).
- */
- public static ObjectId newInstance(int source, byte[] name) {
- return new ObjectId(source, name);
- }
-
- /** Creates an object id for the given {@code source} and id {@code name}. */
- private ObjectId(int source, byte[] name) {
- Preconditions.checkState(source >= 0, "source");
- this.source = source;
- this.name = Preconditions.checkNotNull(name, "name");
- }
-
- public int getSource() {
- return source;
- }
-
- public byte[] getName() {
- return name;
- }
-
- @Override
- public boolean equals(Object object) {
- if (object == this) {
- return true;
- }
-
- if (!(object instanceof ObjectId)) {
- return false;
- }
-
- final ObjectId other = (ObjectId) object;
- if ((source != other.source) || !Arrays.equals(name, other.name)) {
- return false;
- }
- return true;
- }
-
- @Override
- public int hashCode() {
- return source ^ Arrays.hashCode(name);
- }
-
- @Override
- public String toString() {
- return "Oid: <" + source + ", " + BytesFormatter.toString(name) + ">";
- }
-}
diff --git a/java/com/google/ipc/invalidation/external/client/types/SimplePair.java b/java/com/google/ipc/invalidation/external/client/types/SimplePair.java
deleted file mode 100644
index aa5cb76..0000000
--- a/java/com/google/ipc/invalidation/external/client/types/SimplePair.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.external.client.types;
-
-
-/**
- * An immutable, semantic-free ordered pair of nullable values. These can be
- * accessed using the {@link #getFirst} and {@link #getSecond} methods. Equality
- * and hashing are defined in the natural way.
- *
- * @param <FirstType> The type of the first element
- * @param <SecondType> The type of the second element
- *
- */
-public final class SimplePair<FirstType, SecondType> {
- /**
- * Creates a new pair containing the given elements in order.
- */
- public static <FirstType, SecondType> SimplePair<FirstType, SecondType> of(
- FirstType first, SecondType second) {
- return new SimplePair<FirstType, SecondType>(first, second);
- }
-
- /**
- * The first element of the pair; see also {@link #getFirst}.
- */
- public final FirstType first;
-
- /**
- * The second element of the pair; see also {@link #getSecond}.
- */
- public final SecondType second;
-
- /**
- * Constructor. It is usually easier to call {@link #of}.
- */
- public SimplePair(FirstType first, SecondType second) {
- this.first = first;
- this.second = second;
- }
-
- /**
- * Returns the first element of this pair; see also {@link #first}.
- */
- public FirstType getFirst() {
- return first;
- }
-
- /**
- * Returns the second element of this pair; see also {@link #second}.
- */
- public SecondType getSecond() {
- return second;
- }
-
- @Override
- public boolean equals(Object object) {
- if (object instanceof SimplePair<?, ?>) {
- SimplePair<?, ?> that = (SimplePair<?, ?>) object;
- return areObjectsEqual(this.first, that.first) && areObjectsEqual(this.second, that.second);
- }
- return false;
- }
-
- /**
- * Determines whether two possibly-null objects are equal. Returns:
- *
- * <ul>
- * <li>{@code true} if {@code a} and {@code b} are both null.
- * <li>{@code true} if {@code a} and {@code b} are both non-null and they are
- * equal according to {@link Object#equals(Object)}.
- * <li>{@code false} in all other situations.
- * </ul>
- *
- * <p>This assumes that any non-null objects passed to this function conform
- * to the {@code equals()} contract.
- */
- private static boolean areObjectsEqual(Object a, Object b) {
- return a == b || (a != null && a.equals(b));
- }
-
- @Override
- public int hashCode() {
- int hash1 = first == null ? 0 : first.hashCode();
- int hash2 = second == null ? 0 : second.hashCode();
- return 31 * hash1 + hash2;
- }
-
- /**
- * {@inheritDoc}
- *
- * <p>This implementation returns a string in the form
- * {@code (first, second)}, where {@code first} and {@code second} are the
- * String representations of the first and second elements of this pair, as
- * given by {@link String#valueOf(Object)}. Subclasses are free to override
- * this behavior.
- */
- @Override public String toString() {
- return "(" + first + ", " + second + ")";
- }
-}
diff --git a/java/com/google/ipc/invalidation/external/client/types/Status.java b/java/com/google/ipc/invalidation/external/client/types/Status.java
deleted file mode 100644
index 0e6d39a..0000000
--- a/java/com/google/ipc/invalidation/external/client/types/Status.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.external.client.types;
-
-/**
- * Information given to about a operation - success, temporary or permanent failure.
- *
- */
-public final class Status {
-
- /** Actual status of the operation: Whether successful, transient or permanent failure. */
- public enum Code {
- /** Operation was successful. */
- SUCCESS,
-
- /**
- * Operation had a transient failure. The application can retry the failed operation later -
- * if it chooses to do so, it must use a sensible backoff policy such as exponential backoff.
- */
- TRANSIENT_FAILURE,
-
- /**
- * Opration has a permanent failure. Application must not automatically retry without fixing
- * the situation (e.g., by presenting a dialog box to the user).
- */
- PERMANENT_FAILURE
- }
-
- /** Success or failure. */
- private final Code code;
-
- /** A message describing why the state was unknown, for debugging. */
- private final String message;
-
- /** Creates a new Status object given the {@code code} and {@code message}. */
- public static Status newInstance(Status.Code code, String message) {
- return new Status(code, message);
- }
-
- private Status(Code code, String message) {
- this.code = code;
- this.message = message;
- }
-
- /** Returns true iff the status corresponds to a successful completion of the operation.*/
- public boolean isSuccess() {
- return code == Code.SUCCESS;
- }
-
- /**
- * Whether the failure is transient for an operation, e.g., for a {@code register} operation.
- * For transient failures, the application can retry the operation but it must use a sensible
- * policy such as exponential backoff so that it does not add significant load to the backend
- * servers.
- */
- public boolean isTransientFailure() {
- return code == Code.TRANSIENT_FAILURE;
- }
-
- /**
- * Whether the failure is transient for an operation, e.g., for a {@code register} operation.
- * See discussion in {@code Status.Code} for permanent and transient failure handling.
- */
- public boolean isPermanentFailure() {
- return code == Code.PERMANENT_FAILURE;
- }
-
- /** A message describing why the state was unknown, for debugging. */
- public String getMessage() {
- return message;
- }
-
- /** Returns the code for this status message. */
- public Code getCode() {
- return code;
- }
-
- @Override
- public String toString() {
- return "Code: " + code + ", " + message;
- }
-
- @Override
- public boolean equals(Object object) {
- if (object == this) {
- return true;
- }
-
- if (!(object instanceof Status)) {
- return false;
- }
-
- final Status other = (Status) object;
- if (code != other.code) {
- return false;
-
- }
- if (message == null) {
- return other.message == null;
- }
- return message.equals(other.message);
- }
-
- @Override
- public int hashCode() {
- return code.hashCode() ^ ((message == null) ? 0 : message.hashCode());
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/AckCache.java b/java/com/google/ipc/invalidation/ticl/AckCache.java
deleted file mode 100644
index 207b959..0000000
--- a/java/com/google/ipc/invalidation/ticl/AckCache.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.ipc.invalidation.ticl;
-
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP;
-import com.google.ipc.invalidation.util.TypedUtil;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * An ack "cache" that allows the TICL to avoid unnecessary delivery of a
- * known-version invalidation when the client has aleady acked a known-version,
- * restarted invalidation with the same or a greater version number.
- * <p>
- * This helps invalidation clients avoid unnecessary syncs against their backend
- * when invalidations for an object are redelivered or reordered, as can occur
- * frequently during a PCR or (to a lesser degree) as a result of internal
- * failures and channel flakiness.
- * <p>
- * This optimization is especially useful for applications that want to use
- * the TI Pubsub API to deliver invalidations, because version numbers are not
- * a concept in the API itself. While the client could include version numbers
- * in the payload, truncation messages do not include a payload.
- * <p>
- * The cache invalidation API does expose version numbers, so client
- * applications could implement the same logic themselves, but many
- * do not, so it is a useful convenience to implement this for them in the TICL.
- * <p>
- * Note this class currently only records acks for restarted, known-version
- * invalidations. While we might add ack tracking for continous invalidations at
- * some time in the future, tracking continuous invalidations has less of a
- * payoff than tracking restarted invalidations, because such an ack does not
- * implicitly ack earlier invalidations for that object, and greater complexity,
- * because of the potentially unbounded number of acks that need to be tracked
- * for each object.
- */
-class AckCache {
-
- /**
- * A map from object id to the (long) version number of the highest
- * <em>restarted, known version</em> invalidation for that object that has
- * been acked by the client.
- */
- private Map<ObjectIdP, Long> highestAckedVersionMap = new HashMap<ObjectIdP, Long>();
-
- /** Records the fact that the client has acknowledged the given invalidation. */
- void recordAck(InvalidationP inv) {
- if (!inv.getIsTrickleRestart() || !inv.getIsKnownVersion()) {
- return;
- }
-
- // If the invalidation version is newer than the highest acked version in the
- // map, then update the map.
- ObjectIdP objectId = inv.getObjectId();
- long version = inv.getVersion();
- if (version > getHighestAckedVersion(objectId)) {
- highestAckedVersionMap.put(objectId, version);
- }
- }
-
- /**
- * Returns true if the client has already acked a restarted invalidation with
- * a version number greater than or equal to that in {@code inv} and the same
- * object id, and {@code inv} is a known version invalidation. Unknown version
- * invalidations are never considered already acked.
- */
- boolean isAcked(InvalidationP inv) {
- return inv.getIsKnownVersion()
- && this.getHighestAckedVersion(inv.getObjectId()) >= inv.getVersion();
- }
-
-
- /**
- * Returns the highest acked version for the object id with the given key, or
- * -1 if no versions have been acked.
- */
- private long getHighestAckedVersion(ObjectIdP objectId) {
- Long version = TypedUtil.mapGet(highestAckedVersionMap, objectId);
- return (version != null) ? version : -1L;
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/BasicSystemResources.java b/java/com/google/ipc/invalidation/ticl/BasicSystemResources.java
deleted file mode 100644
index d2c3abb..0000000
--- a/java/com/google/ipc/invalidation/ticl/BasicSystemResources.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.ticl;
-
-import com.google.ipc.invalidation.external.client.SystemResources;
-
-
-/**
- * A simple implementation of {@code SystemResources} that just takes the resource components
- * and constructs a SystemResources object.
- *
- */
-public class BasicSystemResources implements SystemResources {
-
- // Components comprising the system resources. We delegate calls to these as appropriate.
- private final Scheduler internalScheduler;
- private final Scheduler listenerScheduler;
- private final Logger logger;
- private final NetworkChannel network;
- private final Storage storage;
-
- /** The state of the resources. */
- private RunState runState = new RunState();
-
- /** Information about the client operating system/platform, e.g., Windows, ChromeOS. */
- private final String platform;
-
- /**
- * Constructs an instance from resource components.
- *
- * @param logger implementation of the logger
- * @param internalScheduler scheduler for scheduling the library's internal events
- * @param listenerScheduler scheduler for scheduling the listener's events
- * @param network implementation of the network
- * @param storage implementation of storage
- * @param platform if not {@code null}, platform string for client version. If {@code null},
- * a default string will be constructed.
- */
- public BasicSystemResources(Logger logger, Scheduler internalScheduler,
- Scheduler listenerScheduler, NetworkChannel network, Storage storage,
- String platform) {
- this.logger = logger;
- this.storage = storage;
- this.network = network;
- if (platform != null) {
- this.platform = platform;
- } else {
- // If a platform string was not provided, try to compute a reasonable default.
- this.platform = System.getProperty("os.name") + "/" + System.getProperty("os.version") +
- "/" + System.getProperty("os.arch");
- }
-
- this.internalScheduler = internalScheduler;
- this.listenerScheduler = listenerScheduler;
-
- // Pass a reference to this object to all of the components, so that they can access
- // resources. E.g., so that the network can do logging.
- logger.setSystemResources(this);
- storage.setSystemResources(this);
- network.setSystemResources(this);
- internalScheduler.setSystemResources(this);
- listenerScheduler.setSystemResources(this);
- }
-
- @Override
- public void start() {
- runState.start();
- logger.info("Resources started");
- }
-
- @Override
- public void stop() {
- runState.stop();
- logger.info("Resources stopped");
- }
-
- @Override
- public boolean isStarted() {
- return runState.isStarted();
- }
-
- @Override
- public Logger getLogger() {
- return logger;
- }
-
- @Override
- public Storage getStorage() {
- return storage;
- }
-
- @Override
- public NetworkChannel getNetwork() {
- return network;
- }
-
- @Override
- public Scheduler getInternalScheduler() {
- return internalScheduler;
- }
-
- @Override
- public Scheduler getListenerScheduler() {
- return listenerScheduler;
- }
-
- @Override
- public String getPlatform() {
- return platform;
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/CheckingInvalidationListener.java b/java/com/google/ipc/invalidation/ticl/CheckingInvalidationListener.java
deleted file mode 100644
index 845037e..0000000
--- a/java/com/google/ipc/invalidation/ticl/CheckingInvalidationListener.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.ticl;
-
-import static com.google.ipc.invalidation.external.client.SystemResources.Scheduler.NO_DELAY;
-
-import com.google.ipc.invalidation.external.client.InvalidationClient;
-import com.google.ipc.invalidation.external.client.InvalidationListener;
-import com.google.ipc.invalidation.external.client.SystemResources.Logger;
-import com.google.ipc.invalidation.external.client.SystemResources.Scheduler;
-import com.google.ipc.invalidation.external.client.types.AckHandle;
-import com.google.ipc.invalidation.external.client.types.ErrorInfo;
-import com.google.ipc.invalidation.external.client.types.Invalidation;
-import com.google.ipc.invalidation.external.client.types.ObjectId;
-import com.google.ipc.invalidation.ticl.Statistics.ListenerEventType;
-import com.google.ipc.invalidation.util.NamedRunnable;
-import com.google.ipc.invalidation.util.Preconditions;
-
-
-/**
- * {@link InvalidationListener} wrapper that ensures that a delegate listener is called on the
- * proper thread and calls the listener method on the listener thread.
- *
- */
-class CheckingInvalidationListener implements InvalidationListener {
-
- /** The actual listener to which this listener delegates. */
- private final InvalidationListener delegate;
-
- /** The scheduler for scheduling internal events in the library. */
- private final Scheduler internalScheduler;
-
- /** The scheduler for scheduling events for the delegate. */
- private final Scheduler listenerScheduler;
-
- /** Statistics objects to track number of sent messages, etc. */
- private Statistics statistics;
-
- private final Logger logger;
-
- CheckingInvalidationListener(InvalidationListener delegate, Scheduler internalScheduler,
- Scheduler listenerScheduler, Logger logger) {
- this.delegate = Preconditions.checkNotNull(delegate, "Delegate cannot be null");
- this.internalScheduler = Preconditions.checkNotNull(internalScheduler,
- "Internal scheduler cannot be null");
- this.listenerScheduler = Preconditions.checkNotNull(listenerScheduler,
- "Listener scheduler cannot be null");
- this.logger = Preconditions.checkNotNull(logger, "Logger cannot be null");
- }
-
- void setStatistics(Statistics statistics) {
- this.statistics = Preconditions.checkNotNull(statistics, "Statistics cannot be null");
- }
-
- @Override
- public void invalidate(final InvalidationClient client, final Invalidation invalidation,
- final AckHandle ackHandle) {
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
- Preconditions.checkNotNull(ackHandle);
- listenerScheduler.schedule(NO_DELAY, new NamedRunnable("CheckingInvalListener.invalidate") {
- @Override
- public void run() {
- statistics.recordListenerEvent(ListenerEventType.INVALIDATE);
- delegate.invalidate(client, invalidation, ackHandle);
- }
- });
- }
-
- @Override
- public void invalidateUnknownVersion(final InvalidationClient client, final ObjectId objectId,
- final AckHandle ackHandle) {
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
- Preconditions.checkNotNull(ackHandle);
- listenerScheduler.schedule(NO_DELAY,
- new NamedRunnable("CheckingInvalListener.invalidateUnknownVersion") {
- @Override
- public void run() {
- statistics.recordListenerEvent(ListenerEventType.INVALIDATE_UNKNOWN);
- delegate.invalidateUnknownVersion(client, objectId, ackHandle);
- }
- });
- }
-
- @Override
- public void invalidateAll(final InvalidationClient client, final AckHandle ackHandle) {
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
- Preconditions.checkNotNull(ackHandle);
- listenerScheduler.schedule(NO_DELAY, new NamedRunnable("CheckingInvalListener.invalidateAll") {
- @Override
- public void run() {
- statistics.recordListenerEvent(ListenerEventType.INVALIDATE_ALL);
- delegate.invalidateAll(client, ackHandle);
- }
- });
- }
-
- @Override
- public void informRegistrationFailure(final InvalidationClient client, final ObjectId objectId,
- final boolean isTransient, final String errorMessage) {
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
- listenerScheduler.schedule(NO_DELAY, new NamedRunnable("CheckingInvalListener.regFailure") {
- @Override
- public void run() {
- statistics.recordListenerEvent(ListenerEventType.INFORM_REGISTRATION_FAILURE);
- delegate.informRegistrationFailure(client, objectId, isTransient, errorMessage);
- }
- });
- }
-
- @Override
- public void informRegistrationStatus(final InvalidationClient client, final ObjectId objectId,
- final RegistrationState regState) {
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
- listenerScheduler.schedule(NO_DELAY, new NamedRunnable("CheckingInvalListener.regStatus") {
- @Override
- public void run() {
- statistics.recordListenerEvent(ListenerEventType.INFORM_REGISTRATION_STATUS);
- delegate.informRegistrationStatus(client, objectId, regState);
- }
- });
- }
-
- @Override
- public void reissueRegistrations(final InvalidationClient client, final byte[] prefix,
- final int prefixLen) {
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
- listenerScheduler.schedule(NO_DELAY, new NamedRunnable("CheckingInvalListener.reissueRegs") {
- @Override
- public void run() {
- statistics.recordListenerEvent(ListenerEventType.REISSUE_REGISTRATIONS);
- delegate.reissueRegistrations(client, prefix, prefixLen);
- }
- });
- }
-
- @Override
- public void informError(final InvalidationClient client, final ErrorInfo errorInfo) {
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
- listenerScheduler.schedule(NO_DELAY, new NamedRunnable("CheckingInvalListener.informError") {
- @Override
- public void run() {
- statistics.recordListenerEvent(ListenerEventType.INFORM_ERROR);
- delegate.informError(client, errorInfo);
- }
- });
- }
-
- /** Returns the delegate {@link InvalidationListener}. */
- InvalidationListener getDelegate() {
- return delegate;
- }
-
- @Override
- public void ready(final InvalidationClient client) {
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
- listenerScheduler.schedule(NO_DELAY, new NamedRunnable("CheckingInvalListener.ready") {
- @Override
- public void run() {
- logger.info("Informing app that ticl is ready");
- delegate.ready(client);
- }
- });
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/DigestStore.java b/java/com/google/ipc/invalidation/ticl/DigestStore.java
deleted file mode 100644
index 05bde24..0000000
--- a/java/com/google/ipc/invalidation/ticl/DigestStore.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.ticl;
-
-import java.util.Collection;
-
-/**
- * Interface for a store that allows objects to be added/removed along with
- * the ability to get the digest for the whole or partial set of those objects.
- *
- * @param <ElementType> the type of the element stored in this
- *
- */
-public interface DigestStore<ElementType> {
-
- /** Returns the number of elements. */
- int size();
-
- /** Returns whether {@code element} is in the store. */
- boolean contains(ElementType element);
-
- /**
- * Returns a digest of the desired objects.
- * <p>
- * NOTE: the digest computations <b>MUST NOT</b> depend on the order in which the elements
- * were added.
- */
- byte[] getDigest();
-
- /**
- * Returns the elements whose digest prefixes begin with the bit prefix {@code digestPrefix}.
- * {@code prefixLen} is the length of {@code digestPrefix} in bits, which may be less than
- * {@code digestPrefix.length} (and may be 0). The implementing class can return *more* objects
- * than what has been specified by {@code digestPrefix}, e.g., it could return all the objects
- * in the store.
- */
- Collection<ElementType> getElements(byte[] digestPrefix, int prefixLen);
-
- /**
- * Adds {@code element} to the store. No-op if {@code element} is already present.
- * @return whether the element was added
- */
- boolean add(ElementType element);
-
- /**
- * Adds {@code elements} to the store. If any element in {@code elements} is already present,
- * the addition is a no-op for that element.
- * @return the elements that were added
- */
- Collection<ElementType> add(Collection<ElementType> elements);
-
- /**
- * Removes {@code element} from the store. No-op if {@code element} is not present.
- * @return whether the element was removed
- */
- boolean remove(ElementType element);
-
- /**
- * Remove {@code elements} to the store. If any element in {@code elements} is not present, the
- * removal is a no-op for that element.
- * @return the elements that were removed
- */
- Collection<ElementType> remove(Collection<ElementType> elements);
-
- /** Removes all elements in this and returns them. */
- Collection<ElementType> removeAll();
-}
diff --git a/java/com/google/ipc/invalidation/ticl/InvalidationClientCore.java b/java/com/google/ipc/invalidation/ticl/InvalidationClientCore.java
deleted file mode 100644
index 1eca3d4..0000000
--- a/java/com/google/ipc/invalidation/ticl/InvalidationClientCore.java
+++ /dev/null
@@ -1,1546 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.ticl;
-
-import static com.google.ipc.invalidation.external.client.SystemResources.Scheduler.NO_DELAY;
-
-import com.google.ipc.invalidation.common.DigestFunction;
-import com.google.ipc.invalidation.common.ObjectIdDigestUtils;
-import com.google.ipc.invalidation.external.client.InvalidationListener;
-import com.google.ipc.invalidation.external.client.InvalidationListener.RegistrationState;
-import com.google.ipc.invalidation.external.client.SystemResources;
-import com.google.ipc.invalidation.external.client.SystemResources.Logger;
-import com.google.ipc.invalidation.external.client.SystemResources.NetworkChannel;
-import com.google.ipc.invalidation.external.client.SystemResources.Scheduler;
-import com.google.ipc.invalidation.external.client.SystemResources.Storage;
-import com.google.ipc.invalidation.external.client.types.AckHandle;
-import com.google.ipc.invalidation.external.client.types.Callback;
-import com.google.ipc.invalidation.external.client.types.ErrorInfo;
-import com.google.ipc.invalidation.external.client.types.Invalidation;
-import com.google.ipc.invalidation.external.client.types.ObjectId;
-import com.google.ipc.invalidation.external.client.types.SimplePair;
-import com.google.ipc.invalidation.external.client.types.Status;
-import com.google.ipc.invalidation.ticl.ProtocolHandler.ParsedMessage;
-import com.google.ipc.invalidation.ticl.ProtocolHandler.ProtocolListener;
-import com.google.ipc.invalidation.ticl.ProtocolHandler.ServerMessageHeader;
-import com.google.ipc.invalidation.ticl.Statistics.ClientErrorType;
-import com.google.ipc.invalidation.ticl.Statistics.IncomingOperationType;
-import com.google.ipc.invalidation.ticl.Statistics.ReceivedMessageType;
-import com.google.ipc.invalidation.ticl.proto.ChannelCommon.NetworkEndpointId;
-import com.google.ipc.invalidation.ticl.proto.Client.AckHandleP;
-import com.google.ipc.invalidation.ticl.proto.Client.ExponentialBackoffState;
-import com.google.ipc.invalidation.ticl.proto.Client.PersistentTiclState;
-import com.google.ipc.invalidation.ticl.proto.Client.RunStateP;
-import com.google.ipc.invalidation.ticl.proto.ClientConstants;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ApplicationClientIdP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientConfigP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ErrorMessage;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.InfoRequestMessage.InfoType;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ProtocolHandlerConfigP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationStatus;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSubtree;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSummary;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version;
-import com.google.ipc.invalidation.ticl.proto.CommonProtos;
-import com.google.ipc.invalidation.ticl.proto.JavaClient.InvalidationClientState;
-import com.google.ipc.invalidation.ticl.proto.JavaClient.ProtocolHandlerState;
-import com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState;
-import com.google.ipc.invalidation.ticl.proto.JavaClient.RegistrationManagerStateP;
-import com.google.ipc.invalidation.ticl.proto.JavaClient.StatisticsState;
-import com.google.ipc.invalidation.util.Box;
-import com.google.ipc.invalidation.util.Bytes;
-import com.google.ipc.invalidation.util.InternalBase;
-import com.google.ipc.invalidation.util.Marshallable;
-import com.google.ipc.invalidation.util.Preconditions;
-import com.google.ipc.invalidation.util.ProtoWrapper.ValidationException;
-import com.google.ipc.invalidation.util.Smearer;
-import com.google.ipc.invalidation.util.TextBuilder;
-import com.google.ipc.invalidation.util.TypedUtil;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-import java.util.Set;
-import java.util.logging.Level;
-
-
-/**
- * Core implementation of the Invalidation Client Library (Ticl). Subclasses are required
- * to implement concurrency control for the Ticl.
- *
- */
-public abstract class InvalidationClientCore extends InternalBase
- implements Marshallable<InvalidationClientState>, ProtocolListener,
- TestableInvalidationClient {
-
- /**
- * A subclass of {@link RecurringTask} with simplified constructors to provide common
- * parameters automatically (scheduler, logger, smearer).
- */
- private abstract class TiclRecurringTask extends RecurringTask {
- /**
- * Constructs a task with {@code initialDelayMs} and {@code timeoutDelayMs}. If
- * {@code useExponentialBackoff}, an exponential backoff generator with initial delay
- * {@code timeoutDelayMs} is used as well; if not, exponential backoff is not used.
- */
- TiclRecurringTask(String name, int initialDelayMs, int timeoutDelayMs,
- boolean useExponentialBackoff) {
- super(name, internalScheduler, logger, smearer,
- useExponentialBackoff ? createExpBackOffGenerator(timeoutDelayMs, null) : null,
- initialDelayMs, timeoutDelayMs);
- }
-
- /**
- * Constructs an instance from {@code marshalledState} that does not use exponential backoff.
- * @param name name of the recurring task
- */
- private TiclRecurringTask(String name, RecurringTaskState marshalledState) {
- super(name, internalScheduler, logger, smearer, null, marshalledState);
- }
-
- /**
- * Constructs an instance from {@code marshalledState} that uses exponential backoff with an
- * initial backoff of {@code timeoutMs}.
- *
- * @param name name of the recurring task
- */
- private TiclRecurringTask(String name, int timeoutMs, RecurringTaskState marshalledState) {
- super(name, internalScheduler, logger, smearer,
- createExpBackOffGenerator(timeoutMs, marshalledState.getBackoffState()), marshalledState);
- }
- }
-
- /** A task for acquiring tokens from the server. */
- private class AcquireTokenTask extends TiclRecurringTask {
- private static final String TASK_NAME = "AcquireToken";
-
- AcquireTokenTask() {
- super(TASK_NAME, NO_DELAY, config.getNetworkTimeoutDelayMs(), true);
- }
-
- AcquireTokenTask(RecurringTaskState marshalledState) {
- super(TASK_NAME, config.getNetworkTimeoutDelayMs(), marshalledState);
- }
-
- @Override
- public boolean runTask() {
- // If token is still not assigned (as expected), sends a request. Otherwise, ignore.
- if (clientToken == null) {
- // Allocate a nonce and send a message requesting a new token.
- setNonce(generateNonce(random));
- protocolHandler.sendInitializeMessage(applicationClientId, nonce, batchingTask, TASK_NAME);
- return true; // Reschedule to check state, retry if necessary after timeout.
- } else {
- return false; // Don't reschedule.
- }
- }
- }
-
- /**
- * A task that schedules heartbeats when the registration summary at the client is not
- * in sync with the registration summary from the server.
- */
- private class RegSyncHeartbeatTask extends TiclRecurringTask {
- private static final String TASK_NAME = "RegSyncHeartbeat";
-
- RegSyncHeartbeatTask() {
- super(TASK_NAME, config.getNetworkTimeoutDelayMs(), config.getNetworkTimeoutDelayMs(), true);
- }
-
- RegSyncHeartbeatTask(RecurringTaskState marshalledState) {
- super(TASK_NAME, config.getNetworkTimeoutDelayMs(), marshalledState);
- }
-
- @Override
- public boolean runTask() {
- if (!registrationManager.isStateInSyncWithServer()) {
- // Simply send an info message to ensure syncing happens.
- logger.info("Registration state not in sync with server: %s", registrationManager);
- sendInfoMessageToServer(false, true /* request server summary */);
- return true;
- } else {
- logger.info("Not sending message since state is now in sync");
- return false;
- }
- }
- }
-
- /** A task that writes the token to persistent storage. */
- private class PersistentWriteTask extends TiclRecurringTask {
- /*
- * This class implements a "train" of events that attempt to reliably write state to
- * storage. The train continues until runTask encounters a termination condition, in
- * which the state currently in memory and the state currently in storage match.
- */
-
- private static final String TASK_NAME = "PersistentWrite";
-
- /** The last client token that was written to to persistent state successfully. */
- private final Box<PersistentTiclState> lastWrittenState =
- Box.of(PersistentTiclState.DEFAULT_INSTANCE);
-
- PersistentWriteTask() {
- super(TASK_NAME, NO_DELAY, config.getWriteRetryDelayMs(), true);
- }
-
- PersistentWriteTask(RecurringTaskState marshalledState) {
- super(TASK_NAME, config.getWriteRetryDelayMs(), marshalledState);
- }
-
- @Override
- public boolean runTask() {
- if (clientToken == null) {
- // We cannot write without a token. We must do this check before creating the
- // PersistentTiclState because newPersistentTiclState cannot handle null tokens.
- return false;
- }
-
- // Compute the state that we will write if we decide to go ahead with the write.
- final PersistentTiclState state =
- PersistentTiclState.create(clientToken, lastMessageSendTimeMs);
- byte[] serializedState = PersistenceUtils.serializeState(state, digestFn);
-
- // Decide whether or not to do the write. The decision varies depending on whether or
- // not the channel supports offline delivery. If we decide not to do the write, then
- // that means the in-memory and stored state match semantically, and the train stops.
- if (config.getChannelSupportsOfflineDelivery()) {
- // For offline delivery, we want the entire state to match, since we write the last
- // send time for every message.
- if (state.equals(lastWrittenState.get())) {
- return false;
- }
- } else {
- // If we do not support offline delivery, we avoid writing the state on each message, and
- // we avoid checking the last-sent time (we check only the client token).
- if (TypedUtil.<Bytes>equals(
- state.getClientToken(), lastWrittenState.get().getClientToken())) {
- return false;
- }
- }
-
- // We decided to do the write.
- storage.writeKey(CLIENT_TOKEN_KEY, serializedState, new Callback<Status>() {
- @Override
- public void accept(Status status) {
- logger.info("Write state completed: %s for %s", status, state);
- Preconditions.checkState(resources.getInternalScheduler().isRunningOnThread());
- if (status.isSuccess()) {
- // Set lastWrittenToken to be the token that was written (NOT clientToken - which
- // could have changed while the write was happening).
- lastWrittenState.set(state);
- } else {
- statistics.recordError(ClientErrorType.PERSISTENT_WRITE_FAILURE);
- }
- }
- });
- return true; // Reschedule after timeout to make sure that write does happen.
- }
- }
-
- /** A task for sending heartbeats to the server. */
- private class HeartbeatTask extends TiclRecurringTask {
- private static final String TASK_NAME = "Heartbeat";
-
- /** Next time that the performance counters are sent to the server. */
- private long nextPerformanceSendTimeMs;
-
- HeartbeatTask() {
- super(TASK_NAME, config.getHeartbeatIntervalMs(), NO_DELAY, false);
- }
-
- HeartbeatTask(RecurringTaskState marshalledState) {
- super(TASK_NAME, marshalledState);
- }
-
- @Override
- public boolean runTask() {
- // Send info message. If needed, send performance counters and reset the next performance
- // counter send time.
- logger.info("Sending heartbeat to server: %s", this);
- boolean mustSendPerfCounters =
- nextPerformanceSendTimeMs > internalScheduler.getCurrentTimeMs();
- if (mustSendPerfCounters) {
- this.nextPerformanceSendTimeMs = internalScheduler.getCurrentTimeMs() +
- getSmearer().getSmearedDelay(config.getPerfCounterDelayMs());
- }
- sendInfoMessageToServer(mustSendPerfCounters, !registrationManager.isStateInSyncWithServer());
- return true; // Reschedule.
- }
- }
-
- /** The task that is scheduled to send batched messages to the server (when needed). **/
- static class BatchingTask extends RecurringTask {
- /*
- * This class is static and extends RecurringTask directly so that it can be instantiated
- * independently in ProtocolHandlerTest.
- */
- private static final String TASK_NAME = "Batching";
-
- /** {@link ProtocolHandler} instance from which messages will be pulled. */
- private final ProtocolHandler protocolHandler;
-
- /** Creates a new instance with default state. */
- BatchingTask(ProtocolHandler protocolHandler, SystemResources resources, Smearer smearer,
- int batchingDelayMs) {
- super(TASK_NAME, resources.getInternalScheduler(), resources.getLogger(), smearer, null,
- batchingDelayMs, NO_DELAY);
- this.protocolHandler = protocolHandler;
- }
-
- /** Creates a new instance with state from {@code marshalledState}. */
- BatchingTask(ProtocolHandler protocolHandler, SystemResources resources, Smearer smearer,
- RecurringTaskState marshalledState) {
- super(TASK_NAME, resources.getInternalScheduler(), resources.getLogger(), smearer, null,
- marshalledState);
- this.protocolHandler = protocolHandler;
- }
-
- @Override
- public boolean runTask() {
- protocolHandler.sendMessageToServer();
- return false; // Don't reschedule.
- }
- }
-
- /**
- * A (slightly strange) recurring task that executes exactly once for the first heartbeat
- * performed by a Ticl restarting from persistent state. The Android Ticl implementation
- * requires that all work to be scheduled in the future occur in the form of a recurring task,
- * hence this class.
- */
- private class InitialPersistentHeartbeatTask extends TiclRecurringTask {
- private static final String TASK_NAME = "InitialPersistentHeartbeat";
-
- InitialPersistentHeartbeatTask(int delayMs) {
- super(TASK_NAME, delayMs, NO_DELAY, false);
- }
-
- @Override
- public boolean runTask() {
- sendInfoMessageToServer(false, true);
- return false; // Don't reschedule.
- }
- }
-
- //
- // End of nested classes.
- //
-
- /** The single key used to write all the Ticl state. */
- public static final String CLIENT_TOKEN_KEY = "ClientToken";
-
- /** Resources for the Ticl. */
- private final SystemResources resources;
-
- /**
- * Reference into the resources object for cleaner code. All Ticl code must execute on this
- * scheduler.
- */
- private final Scheduler internalScheduler;
-
- /** Logger reference into the resources object for cleaner code. */
- private final Logger logger;
-
- /** Storage for the Ticl persistent state. */
- Storage storage;
-
- /** Application callback interface. */
- final InvalidationListener listener;
-
- /** Configuration for this instance. */
- private ClientConfigP config;
-
- /** Application identifier for this client. */
- private final ApplicationClientIdP applicationClientId;
-
- /** Object maintaining the registration state for this client. */
- private final RegistrationManager registrationManager;
-
- /** Object handling low-level wire format interactions. */
- private final ProtocolHandler protocolHandler;
-
- /** The function for computing the registration and persistence state digests. */
- private final DigestFunction digestFn = new ObjectIdDigestUtils.Sha1DigestFunction();
-
- /** The state of the Ticl whether it has started or not. */
- private final RunState ticlState;
-
- /** Statistics objects to track number of sent messages, etc. */
- final Statistics statistics;
-
- /** A smearer to make sure that delays are randomized a little bit. */
- private final Smearer smearer;
-
- /** Current client token known from the server. */
- private Bytes clientToken = null;
-
- // After the client starts, exactly one of nonce and clientToken is non-null.
-
- /** If not {@code null}, nonce for pending identifier request. */
- private Bytes nonce = null;
-
- /** Whether we should send registrations to the server or not. */
- private boolean shouldSendRegistrations;
-
- /** Whether the network is online. Assume so when we start. */
- private boolean isOnline = true;
-
- /** A random number generator. */
- private final Random random;
-
- /** Last time a message was sent to the server. */
- private long lastMessageSendTimeMs = 0;
-
- /** A task for acquiring the token (if the client has no token). */
- private AcquireTokenTask acquireTokenTask;
-
- /** Task for checking if reg summary is out of sync and then sending a heartbeat to the server. */
- private RegSyncHeartbeatTask regSyncHeartbeatTask;
-
- /** Task for writing the state blob to persistent storage. */
- private PersistentWriteTask persistentWriteTask;
-
- /** A task for periodic heartbeats. */
- private HeartbeatTask heartbeatTask;
-
- /** Task to send all batched messages to the server. */
- private BatchingTask batchingTask;
-
- /** Task to do the first heartbeat after a persistent restart. */
- private InitialPersistentHeartbeatTask initialPersistentHeartbeatTask;
-
- /** A cache of already acked invalidations to avoid duplicate delivery. */
- private final AckCache ackCache = new AckCache();
-
- /**
- * Constructs a client.
- *
- * @param resources resources to use during execution
- * @param random a random number generator
- * @param clientType client type code
- * @param clientName application identifier for the client
- * @param config configuration for the client
- * @param applicationName name of the application using the library (for debugging/monitoring)
- * @param regManagerState marshalled registration manager state, if any
- * @param protocolHandlerState marshalled protocol handler state, if any
- * @param listener application callback
- */
- private InvalidationClientCore(final SystemResources resources, Random random, int clientType,
- final byte[] clientName, ClientConfigP config, String applicationName,
- RunStateP ticlRunState,
- RegistrationManagerStateP regManagerState,
- ProtocolHandlerState protocolHandlerState,
- StatisticsState statisticsState,
- InvalidationListener listener) {
- this.resources = Preconditions.checkNotNull(resources);
- this.random = random;
- this.logger = Preconditions.checkNotNull(resources.getLogger());
- this.internalScheduler = resources.getInternalScheduler();
- this.storage = resources.getStorage();
- this.config = config;
- this.ticlState = (ticlRunState == null) ? new RunState() : new RunState(ticlRunState);
- this.smearer = new Smearer(random, this.config.getSmearPercent());
- this.applicationClientId = ApplicationClientIdP.create(clientType, new Bytes(clientName));
- this.listener = listener;
- this.statistics = (statisticsState != null)
- ? Statistics.deserializeStatistics(resources.getLogger(), statisticsState.getCounter())
- : new Statistics();
- this.registrationManager = new RegistrationManager(logger, statistics, digestFn,
- regManagerState);
- this.protocolHandler = new ProtocolHandler(config.getProtocolHandlerConfig(), resources,
- smearer, statistics, clientType, applicationName, this, protocolHandlerState);
- }
-
- /**
- * Constructs a client with default state.
- *
- * @param resources resources to use during execution
- * @param random a random number generator
- * @param clientType client type code
- * @param clientName application identifier for the client
- * @param config configuration for the client
- * @param applicationName name of the application using the library (for debugging/monitoring)
- * @param listener application callback
- */
- public InvalidationClientCore(final SystemResources resources, Random random, int clientType,
- final byte[] clientName, ClientConfigP config, String applicationName,
- InvalidationListener listener) {
- this(resources, random, clientType, clientName, config, applicationName, null, null, null, null,
- listener);
- createSchedulingTasks(null);
- registerWithNetwork(resources);
- logger.info("Created client: %s", this);
- }
-
- /**
- * Constructs a client with state initialized from {@code marshalledState}.
- *
- * @param resources resources to use during execution
- * @param random a random number generator
- * @param clientType client type code
- * @param clientName application identifier for the client
- * @param config configuration for the client
- * @param applicationName name of the application using the library (for debugging/monitoring)
- * @param listener application callback
- */
- public InvalidationClientCore(final SystemResources resources, Random random, int clientType,
- final byte[] clientName, ClientConfigP config, String applicationName,
- InvalidationClientState marshalledState, InvalidationListener listener) {
- this(resources, random, clientType, clientName, config, applicationName,
- marshalledState.getRunState(), marshalledState.getRegistrationManagerState(),
- marshalledState.getProtocolHandlerState(), marshalledState.getStatisticsState(), listener);
- // Unmarshall.
- if (marshalledState.hasClientToken()) {
- clientToken = marshalledState.getClientToken();
- }
- if (marshalledState.hasNonce()) {
- nonce = marshalledState.getNonce();
- }
- this.shouldSendRegistrations = marshalledState.getShouldSendRegistrations();
- this.lastMessageSendTimeMs = marshalledState.getLastMessageSendTimeMs();
- this.isOnline = marshalledState.getIsOnline();
- createSchedulingTasks(marshalledState);
-
- // We register with the network after unmarshalling our isOnline value. This is because when
- // we register with the network, it may give us a new value for isOnline. If we unmarshalled
- // after registering, then we would clobber the new value with the old marshalled value, which
- // is wrong.
- registerWithNetwork(resources);
- logger.info("Created client: %s", this);
- }
-
- /**
- * Registers handlers for received messages and network status changes with the network of
- * {@code resources}.
- */
- private void registerWithNetwork(final SystemResources resources) {
- resources.getNetwork().setListener(new NetworkChannel.NetworkListener() {
- @Override
- public void onMessageReceived(byte[] incomingMessage) {
- InvalidationClientCore.this.handleIncomingMessage(incomingMessage);
- }
- @Override
- public void onOnlineStatusChange(boolean isOnline) {
- InvalidationClientCore.this.handleNetworkStatusChange(isOnline);
- }
- @Override
- public void onAddressChange() {
- // Send a message to the server. The header will include the new network address.
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
- sendInfoMessageToServer(false, false);
- }
- });
- }
-
- /** Returns a default config builder for the client. */
- public static ClientConfigP createConfig() {
- Version version =
- Version.create(ClientConstants.CONFIG_MAJOR_VERSION, ClientConstants.CONFIG_MINOR_VERSION);
- ProtocolHandlerConfigP protocolHandlerConfig = ProtocolHandler.createConfig();
- ClientConfigP.Builder builder = new ClientConfigP.Builder(version, protocolHandlerConfig);
- return builder.build();
- }
-
- /** Returns a configuration builder with parameters set for unit tests. */
- public static ClientConfigP createConfigForTest() {
- Version version =
- Version.create(ClientConstants.CONFIG_MAJOR_VERSION, ClientConstants.CONFIG_MINOR_VERSION);
- ProtocolHandlerConfigP protocolHandlerConfig = ProtocolHandler.createConfigForTest();
- ClientConfigP.Builder builder = new ClientConfigP.Builder(version, protocolHandlerConfig);
- builder.networkTimeoutDelayMs = 2 * 1000;
- builder.heartbeatIntervalMs = 5 * 1000;
- builder.writeRetryDelayMs = 500;
- return builder.build();
- }
-
- /**
- * Creates the tasks used by the Ticl for token acquisition, heartbeats, persistent writes and
- * registration sync.
- *
- * @param marshalledState saved state of recurring tasks
- */
- private void createSchedulingTasks(InvalidationClientState marshalledState) {
- if (marshalledState == null) {
- this.acquireTokenTask = new AcquireTokenTask();
- this.heartbeatTask = new HeartbeatTask();
- this.regSyncHeartbeatTask = new RegSyncHeartbeatTask();
- this.persistentWriteTask = new PersistentWriteTask();
- this.batchingTask = new BatchingTask(protocolHandler, resources, smearer,
- config.getProtocolHandlerConfig().getBatchingDelayMs());
- } else {
- this.acquireTokenTask = new AcquireTokenTask(marshalledState.getAcquireTokenTaskState());
- this.heartbeatTask = new HeartbeatTask(marshalledState.getHeartbeatTaskState());
- this.regSyncHeartbeatTask =
- new RegSyncHeartbeatTask(marshalledState.getRegSyncHeartbeatTaskState());
- this.persistentWriteTask =
- new PersistentWriteTask(marshalledState.getPersistentWriteTaskState());
- this.batchingTask = new BatchingTask(protocolHandler, resources, smearer,
- marshalledState.getBatchingTaskState());
- if (marshalledState.hasLastWrittenState()) {
- persistentWriteTask.lastWrittenState.set(marshalledState.getLastWrittenState());
- }
- }
- // The handling of new InitialPersistentHeartbeatTask is a little strange. We create one when
- // the Ticl is first created so that it can be called by the scheduler if it had been scheduled
- // in the past. Otherwise, when we are ready to schedule one ourselves, we create a new instance
- // with the proper delay, then schedule it. We have to do this because we don't know what delay
- // to use here, since we don't compute it until start().
- this.initialPersistentHeartbeatTask = new InitialPersistentHeartbeatTask(0);
- }
-
- /** Returns the configuration used by the client. */
- protected ClientConfigP getConfig() {
- return config;
- }
-
- // Methods for TestableInvalidationClient.
-
- @Override
-
- public ClientConfigP getConfigForTest() {
- return getConfig();
- }
-
- @Override
-
- public byte[] getApplicationClientIdForTest() {
- return applicationClientId.toByteArray();
- }
-
- /** Returns the application client id of this client. */
- protected ApplicationClientIdP getApplicationClientIdP() {
- return applicationClientId;
- }
-
- @Override
-
- public InvalidationListener getInvalidationListenerForTest() {
- return (listener instanceof CheckingInvalidationListener) ?
- ((CheckingInvalidationListener) this.listener).getDelegate() : this.listener;
- }
-
-
- public SystemResources getResourcesForTest() {
- return resources;
- }
-
- public SystemResources getResources() {
- return resources;
- }
-
- @Override
-
- public Statistics getStatisticsForTest() {
- return statistics;
- }
-
- Statistics getStatistics() {
- return statistics;
- }
-
- @Override
-
- public DigestFunction getDigestFunctionForTest() {
- return this.digestFn;
- }
-
- @Override
-
- public long getNextMessageSendTimeMsForTest() {
- Preconditions.checkState(resources.getInternalScheduler().isRunningOnThread());
- return protocolHandler.getNextMessageSendTimeMsForTest();
- }
-
- @Override
-
- public RegistrationManagerState getRegistrationManagerStateCopyForTest() {
- Preconditions.checkState(resources.getInternalScheduler().isRunningOnThread());
- return registrationManager.getRegistrationManagerStateCopyForTest();
- }
-
- @Override
-
- public void changeNetworkTimeoutDelayForTest(int networkTimeoutDelayMs) {
- ClientConfigP.Builder builder = config.toBuilder();
- builder.networkTimeoutDelayMs = networkTimeoutDelayMs;
- config = builder.build();
- createSchedulingTasks(null);
- }
-
- @Override
-
- public void changeHeartbeatDelayForTest(int heartbeatDelayMs) {
- ClientConfigP.Builder builder = config.toBuilder();
- builder.heartbeatIntervalMs = heartbeatDelayMs;
- config = builder.build();
- createSchedulingTasks(null);
- }
-
- @Override
-
- public void setDigestStoreForTest(DigestStore<ObjectIdP> digestStore) {
- Preconditions.checkState(!resources.isStarted());
- registrationManager.setDigestStoreForTest(digestStore);
- }
-
- @Override
-
- public Bytes getClientTokenForTest() {
- return getClientToken();
- }
-
- @Override
-
- public String getClientTokenKeyForTest() {
- return CLIENT_TOKEN_KEY;
- }
-
- @Override
- public boolean isStartedForTest() {
- return isStarted();
- }
-
- /**
- * Returns whether the Ticl is started, i.e., whether it at some point had a session with the
- * data center after being constructed.
- */
- protected boolean isStarted() {
- return ticlState.isStarted();
- }
-
- @Override
- public void stopResources() {
- resources.stop();
- }
-
- @Override
- public long getResourcesTimeMs() {
- return resources.getInternalScheduler().getCurrentTimeMs();
- }
-
- @Override
- public Scheduler getInternalSchedulerForTest() {
- return resources.getInternalScheduler();
- }
-
- @Override
- public Storage getStorage() {
- return storage;
- }
-
- @Override
- public NetworkEndpointId getNetworkIdForTest() {
- NetworkChannel network = resources.getNetwork();
- if (!(network instanceof TestableNetworkChannel)) {
- throw new UnsupportedOperationException(
- "getNetworkIdForTest requires a TestableNetworkChannel, not: " + network.getClass());
- }
- return ((TestableNetworkChannel) network).getNetworkIdForTest();
- }
-
- // End of methods for TestableInvalidationClient
-
- @Override // InvalidationClient
- public void start() {
- Preconditions.checkState(resources.isStarted(), "Resources must be started before starting " +
- "the Ticl");
- if (ticlState.isStarted()) {
- logger.severe("Ignoring start call since already started: client = %s", this);
- return;
- }
-
- // Initialize the nonce so that we can maintain the invariant that exactly one of
- // "nonce" and "clientToken" is non-null.
- setNonce(generateNonce(random));
-
- logger.info("Starting with Java config: %s", config);
- // Read the state blob and then schedule startInternal once the value is there.
- scheduleStartAfterReadingStateBlob();
- }
-
- /**
- * Implementation of {@link #start} on the internal thread with the persistent
- * {@code serializedState} if any. Starts the TICL protocol and makes the TICL ready to receive
- * registrations, invalidations, etc.
- */
- private void startInternal(byte[] serializedState) {
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
-
- // Initialize the session manager using the persisted client token.
- PersistentTiclState persistentState =
- (serializedState == null) ? null : PersistenceUtils.deserializeState(logger,
- serializedState, digestFn);
-
- if ((serializedState != null) && (persistentState == null)) {
- // In this case, we'll proceed as if we had no persistent state -- i.e., obtain a new client
- // id from the server.
- statistics.recordError(ClientErrorType.PERSISTENT_DESERIALIZATION_FAILURE);
- logger.severe("Failed deserializing persistent state: %s",
- Bytes.toLazyCompactString(serializedState));
- }
- if (persistentState != null) {
- // If we have persistent state, use the previously-stored token and send a heartbeat to
- // let the server know that we've restarted, since we may have been marked offline.
-
- // In the common case, the server will already have all of our
- // registrations, but we won't know for sure until we've gotten its summary.
- // We'll ask the application for all of its registrations, but to avoid
- // making the registrar redo the work of performing registrations that
- // probably already exist, we'll suppress sending them to the registrar.
- logger.info("Restarting from persistent state: %s", persistentState.getClientToken());
- setNonce(null);
- setClientToken(persistentState.getClientToken());
- shouldSendRegistrations = false;
-
- // Schedule an info message for the near future.
- int initialHeartbeatDelayMs = computeInitialPersistentHeartbeatDelayMs(
- config, resources, persistentState.getLastMessageSendTimeMs());
- initialPersistentHeartbeatTask = new InitialPersistentHeartbeatTask(initialHeartbeatDelayMs);
- initialPersistentHeartbeatTask.ensureScheduled("");
-
- // We need to ensure that heartbeats are sent, regardless of whether we start fresh or from
- // persistent state. The line below ensures that they are scheduled in the persistent startup
- // case. For the other case, the task is scheduled when we acquire a token.
- heartbeatTask.ensureScheduled("Startup-after-persistence");
- } else {
- // If we had no persistent state or couldn't deserialize the state that we had, start fresh.
- // Request a new client identifier.
-
- // The server can't possibly have our registrations, so whatever we get
- // from the application we should send to the registrar.
- logger.info("Starting with no previous state");
- shouldSendRegistrations = true;
- acquireToken("Startup");
- }
-
- // listener.ready() is called when ticl has acquired a new token.
- }
-
- /**
- * Returns the delay for the initial heartbeat, given that the last message to the server was
- * sent at {@code lastSendTimeMs}.
- * @param config configuration object used by the client
- * @param resources resources used by the client
- */
-
- static int computeInitialPersistentHeartbeatDelayMs(ClientConfigP config,
- SystemResources resources, long lastSendTimeMs) {
- // There are five cases:
- // 1. Channel does not support offline delivery. We delay a little bit to allow the
- // application to reissue its registrations locally and avoid triggering registration
- // sync with the data center due to a hash mismatch. This is the "minimum delay," and we
- // never use a delay less than it.
- //
- // All other cases are for channels supporting offline delivery.
- //
- // 2. Last send time is in the future (something weird happened). Use the minimum delay.
- // 3. We have been asleep for more than one heartbeat interval. Use the minimum delay.
- // 4. We have been asleep for less than one heartbeat interval.
- // (a). The time remaining to the end of the interval is less than the minimum delay.
- // Use the minimum delay.
- // (b). The time remaining to the end of the interval is more than the minimum delay.
- // Use the remaining delay.
- final long nowMs = resources.getInternalScheduler().getCurrentTimeMs();
- final int initialHeartbeatDelayMs;
- if (!config.getChannelSupportsOfflineDelivery()) {
- // Case 1.
- initialHeartbeatDelayMs = config.getInitialPersistentHeartbeatDelayMs();
- } else {
- // Offline delivery cases (2, 3, 4).
- // The default of the last send time is zero, so even if it wasn't written in the persistent
- // state, this logic is still correct.
- if ((lastSendTimeMs > nowMs) || // Case 2.
- ((lastSendTimeMs + config.getHeartbeatIntervalMs()) < nowMs)) { // Case 3.
- // Either something strange happened and the last send time is in the future, or we
- // have been asleep for more than one heartbeat interval. Send immediately.
- initialHeartbeatDelayMs = config.getInitialPersistentHeartbeatDelayMs();
- } else {
- // Case 4.
- // We have been asleep for less than one heartbeat interval. Send after it expires,
- // but ensure we let the initial heartbeat interval elapse.
- final long timeSinceLastMessageMs = nowMs - lastSendTimeMs;
- final int remainingHeartbeatIntervalMs =
- (int) (config.getHeartbeatIntervalMs() - timeSinceLastMessageMs);
- initialHeartbeatDelayMs = Math.max(remainingHeartbeatIntervalMs,
- config.getInitialPersistentHeartbeatDelayMs());
- }
- }
- resources.getLogger().info("Computed heartbeat delay %s from: offline-delivery = %s, "
- + "initial-persistent-delay = %s, heartbeat-interval = %s, nowMs = %s",
- initialHeartbeatDelayMs, config.getChannelSupportsOfflineDelivery(),
- config.getInitialPersistentHeartbeatDelayMs(), config.getHeartbeatIntervalMs(),
- nowMs);
- return initialHeartbeatDelayMs;
- }
-
- @Override // InvalidationClient
- public void stop() {
- logger.warning("Ticl being stopped: %s", InvalidationClientCore.this);
- if (ticlState.isStarted()) { // RunState is thread-safe.
- ticlState.stop();
- }
- }
-
- @Override // InvalidationClient
- public void register(ObjectId objectId) {
- List<ObjectId> objectIds = new ArrayList<ObjectId>();
- objectIds.add(objectId);
- performRegisterOperations(objectIds, RegistrationP.OpType.REGISTER);
- }
-
- @Override // InvalidationClient
- public void unregister(ObjectId objectId) {
- List<ObjectId> objectIds = new ArrayList<ObjectId>();
- objectIds.add(objectId);
- performRegisterOperations(objectIds, RegistrationP.OpType.UNREGISTER);
- }
-
- @Override // InvalidationClient
- public void register(Collection<ObjectId> objectIds) {
- performRegisterOperations(objectIds, RegistrationP.OpType.REGISTER);
- }
-
- @Override // InvalidationClient
- public void unregister(Collection<ObjectId> objectIds) {
- performRegisterOperations(objectIds, RegistrationP.OpType.UNREGISTER);
- }
-
- /**
- * Implementation of (un)registration.
- *
- * @param objectIds object ids on which to operate
- * @param regOpType whether to register or unregister
- */
- private void performRegisterOperations(final Collection<ObjectId> objectIds,
- final int regOpType) {
- Preconditions.checkState(!objectIds.isEmpty(), "Must specify some object id");
- Preconditions.checkState(internalScheduler.isRunningOnThread(),
- "Not running on internal thread");
-
- if (ticlState.isStopped()) {
- // The Ticl has been stopped. This might be some old registration op coming in. Just ignore
- // instead of crashing.
- logger.severe("Ticl stopped: register (%s) of %s ignored.", regOpType, objectIds);
- return;
- }
- if (!ticlState.isStarted()) {
- // We must be in the NOT_STARTED state, since we can't be in STOPPED or STARTED (since the
- // previous if-check didn't succeeded, and isStarted uses a != STARTED test).
- logger.severe(
- "Ticl is not yet started; failing registration call; client = %s, objects = %s, op = %s",
- this, objectIds, regOpType);
- for (ObjectId objectId : objectIds) {
- listener.informRegistrationFailure(this, objectId, true, "Client not yet ready");
- }
- return;
- }
-
- List<ObjectIdP> objectIdProtos = new ArrayList<ObjectIdP>(objectIds.size());
- for (ObjectId objectId : objectIds) {
- Preconditions.checkNotNull(objectId, "Must specify object id");
- ObjectIdP objectIdProto = ProtoWrapperConverter.convertToObjectIdProto(objectId);
- IncomingOperationType opType = (regOpType == RegistrationP.OpType.REGISTER) ?
- IncomingOperationType.REGISTRATION : IncomingOperationType.UNREGISTRATION;
- statistics.recordIncomingOperation(opType);
- logger.info("Register %s, %s", objectIdProto, regOpType);
- objectIdProtos.add(objectIdProto);
- }
-
- // Update the registration manager state, then have the protocol client send a message.
- // performOperations returns only those elements of objectIdProtos that caused a state
- // change (i.e., elements not present if regOpType == REGISTER or elements that were present
- // if regOpType == UNREGISTER).
- Collection<ObjectIdP> objectProtosToSend = registrationManager.performOperations(
- objectIdProtos, regOpType);
-
- // Check whether we should suppress sending registrations because we don't
- // yet know the server's summary.
- if (shouldSendRegistrations && (!objectProtosToSend.isEmpty())) {
- protocolHandler.sendRegistrations(objectProtosToSend, regOpType, batchingTask);
- }
- InvalidationClientCore.this.regSyncHeartbeatTask.ensureScheduled("performRegister");
- }
-
- @Override // InvalidationClient
- public void acknowledge(final AckHandle acknowledgeHandle) {
- Preconditions.checkNotNull(acknowledgeHandle);
- Preconditions.checkState(internalScheduler.isRunningOnThread(),
- "Not running on internal thread");
-
- // Parse and validate the ack handle first.
- AckHandleP ackHandle;
- try {
- ackHandle = AckHandleP.parseFrom(acknowledgeHandle.getHandleData());
- } catch (ValidationException exception) {
- logger.warning("Bad ack handle : %s",
- Bytes.toLazyCompactString(acknowledgeHandle.getHandleData()));
- statistics.recordError(ClientErrorType.ACKNOWLEDGE_HANDLE_FAILURE);
- return;
- }
-
- // Currently, only invalidations have non-trivial ack handle.
- InvalidationP invalidation = ackHandle.getNullableInvalidation();
- if (invalidation == null) {
- logger.warning("Ack handle without invalidation : %s",
- Bytes.toLazyCompactString(acknowledgeHandle.getHandleData()));
- statistics.recordError(ClientErrorType.ACKNOWLEDGE_HANDLE_FAILURE);
- return;
- }
-
- // Don't send the payload back.
- if (invalidation.hasPayload()) {
- InvalidationP.Builder builder = invalidation.toBuilder();
- builder.payload = null;
- invalidation = builder.build();
- }
- statistics.recordIncomingOperation(IncomingOperationType.ACKNOWLEDGE);
- protocolHandler.sendInvalidationAck(invalidation, batchingTask);
-
- // Record that the invalidation has been acknowledged to potentially avoid unnecessary delivery
- // of earlier invalidations for the same object.
- ackCache.recordAck(invalidation);
- }
-
- //
- // Protocol listener methods
- //
-
- @Override
- public Bytes getClientToken() {
- Preconditions.checkState((clientToken == null) || (nonce == null));
- return clientToken;
- }
-
- @Override
- public void handleMessageSent() {
- // The ProtocolHandler just sent a message to the server. If the channel supports offline
- // delivery (see the comment in the ClientConfigP), store this time to stable storage. This
- // only needs to be a best-effort write; if it fails, then we will "forget" that we sent the
- // message and heartbeat needlessly when next restarted. That is a performance/battery bug,
- // not a correctness bug.
- lastMessageSendTimeMs = getResourcesTimeMs();
- if (config.getChannelSupportsOfflineDelivery()) {
- // Write whether or not we have a token. The persistent write task is a no-op if there is
- // no token. We only write if the channel supports offline delivery. We could do the write
- // regardless, and may want to do so in the future, since it might simplify some of the
- // Ticl implementation.
- persistentWriteTask.ensureScheduled("sent-message");
- }
- }
-
- @Override
- public RegistrationSummary getRegistrationSummary() {
- return registrationManager.getRegistrationSummary();
- }
-
- //
- // Private methods and toString.
- //
-
- void handleNetworkStatusChange(final boolean isOnline) {
- // If we're back online and haven't sent a message to the server in a while, send a heartbeat to
- // make sure the server knows we're online.
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
- boolean wasOnline = this.isOnline;
- this.isOnline = isOnline;
- if (isOnline && !wasOnline && (internalScheduler.getCurrentTimeMs() >
- lastMessageSendTimeMs + config.getOfflineHeartbeatThresholdMs())) {
- logger.log(Level.INFO,
- "Sending heartbeat after reconnection, previous send was %s ms ago",
- internalScheduler.getCurrentTimeMs() - lastMessageSendTimeMs);
- sendInfoMessageToServer(false, !registrationManager.isStateInSyncWithServer());
- }
- }
-
- /**
- * Handles an {@code incomingMessage} from the data center. If it is valid and addressed to
- * this client, dispatches to methods to handle sub-parts of the message; if not, drops the
- * message.
- */
- void handleIncomingMessage(byte[] incomingMessage) {
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
- statistics.recordReceivedMessage(ReceivedMessageType.TOTAL);
- ParsedMessage parsedMessage = protocolHandler.handleIncomingMessage(incomingMessage);
- if (parsedMessage == null) {
- // Invalid message.
- return;
- }
-
- // Ensure we have either a matching token or a matching nonce.
- if (!validateToken(parsedMessage)) {
- return;
- }
-
- // Handle a token-control message, if present.
- if (parsedMessage.tokenControlMessage != null) {
- statistics.recordReceivedMessage(ReceivedMessageType.TOKEN_CONTROL);
- handleTokenChanged(parsedMessage.header.token,
- parsedMessage.tokenControlMessage.hasNewToken() ?
- parsedMessage.tokenControlMessage.getNewToken() : null);
- }
-
- // We might have lost our token or failed to acquire one. Ensure that we do not proceed in
- // either case.
- if (clientToken == null) {
- return;
- }
-
- // First, handle the message header.
- handleIncomingHeader(parsedMessage.header);
-
- // Then, handle any work remaining in the message.
- if (parsedMessage.invalidationMessage != null) {
- statistics.recordReceivedMessage(ReceivedMessageType.INVALIDATION);
- handleInvalidations(parsedMessage.invalidationMessage.getInvalidation());
- }
- if (parsedMessage.registrationStatusMessage != null) {
- statistics.recordReceivedMessage(ReceivedMessageType.REGISTRATION_STATUS);
- handleRegistrationStatus(parsedMessage.registrationStatusMessage.getRegistrationStatus());
- }
- if (parsedMessage.registrationSyncRequestMessage != null) {
- statistics.recordReceivedMessage(ReceivedMessageType.REGISTRATION_SYNC_REQUEST);
- handleRegistrationSyncRequest();
- }
- if (parsedMessage.infoRequestMessage != null) {
- statistics.recordReceivedMessage(ReceivedMessageType.INFO_REQUEST);
- handleInfoMessage(parsedMessage.infoRequestMessage.getInfoType());
- }
- if (parsedMessage.errorMessage != null) {
- statistics.recordReceivedMessage(ReceivedMessageType.ERROR);
- handleErrorMessage(parsedMessage.header, parsedMessage.errorMessage.getCode(),
- parsedMessage.errorMessage.getDescription());
- }
- }
-
- /**
- * Handles a token-control message.
- * @param headerToken token in the server message
- * @param newToken the new token provided, or {@code null} if this is a destroy message.
- */
- private void handleTokenChanged(Bytes headerToken, final Bytes newToken) {
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
-
- // The server is either supplying a new token in response to an InitializeMessage, spontaneously
- // destroying a token we hold, or spontaneously upgrading a token we hold.
-
- if (newToken != null) {
- // Note: headerToken cannot be null, so a null nonce or clientToken will always be non-equal.
- boolean headerTokenMatchesNonce = TypedUtil.<Bytes>equals(headerToken, nonce);
- boolean headerTokenMatchesExistingToken = TypedUtil.<Bytes>equals(headerToken, clientToken);
- boolean shouldAcceptToken = headerTokenMatchesNonce || headerTokenMatchesExistingToken;
- if (!shouldAcceptToken) {
- logger.info("Ignoring new token; %s does not match nonce = %s or existing token = %s",
- newToken, nonce, clientToken);
- return;
- }
- logger.info("New token being assigned at client: %s, Old = %s", newToken, clientToken);
-
- // Start the regular heartbeats now.
- heartbeatTask.ensureScheduled("Heartbeat-after-new-token");
- setNonce(null);
- setClientToken(newToken);
- persistentWriteTask.ensureScheduled("Write-after-new-token");
- } else {
- logger.info("Destroying existing token: %s", clientToken);
- acquireToken("Destroy");
- }
- }
-
- /** Handles a server {@code header}. */
- private void handleIncomingHeader(ServerMessageHeader header) {
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
- if (nonce != null) {
- throw new IllegalStateException(
- "Cannot process server header with non-null nonce (have " + nonce + "): " + header);
- }
- if (header.registrationSummary != null) {
- // We've received a summary from the server, so if we were suppressing registrations, we
- // should now allow them to go to the registrar.
- shouldSendRegistrations = true;
-
- // Pass the registration summary to the registration manager. If we are now in agreement
- // with the server and we had any pending operations, we can tell the listener that those
- // operations have succeeded.
- Set<RegistrationP> upcalls =
- registrationManager.informServerRegistrationSummary(header.registrationSummary);
- logger.fine("Received new server registration summary (%s); will make %s upcalls",
- header.registrationSummary, upcalls.size());
- for (RegistrationP registration : upcalls) {
- ObjectId objectId =
- ProtoWrapperConverter.convertFromObjectIdProto(registration.getObjectId());
- RegistrationState regState = convertOpTypeToRegState(registration.getOpType());
- listener.informRegistrationStatus(this, objectId, regState);
- }
- }
- }
-
- /** Handles incoming {@code invalidations}. */
- private void handleInvalidations(Collection<InvalidationP> invalidations) {
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
-
- for (InvalidationP invalidation : invalidations) {
- AckHandle ackHandle = AckHandle.newInstance(AckHandleP.create(invalidation).toByteArray());
- if (ackCache.isAcked(invalidation)) {
- // If the ack cache indicates that the client has already acked a restarted invalidation
- // with an equal or greater version, then the TICL can simply acknowledge it immediately
- // rather than delivering it to the listener.
- logger.info("Stale invalidation {0}, not delivering", invalidation);
- acknowledge(ackHandle);
- statistics.recordReceivedMessage(ReceivedMessageType.STALE_INVALIDATION);
- } else if (CommonProtos.isAllObjectId(invalidation.getObjectId())) {
- logger.info("Issuing invalidate all");
- listener.invalidateAll(InvalidationClientCore.this, ackHandle);
- } else {
- // Regular object. Could be unknown version or not.
- Invalidation inv = ProtoWrapperConverter.convertFromInvalidationProto(invalidation);
-
- boolean isSuppressed = invalidation.getIsTrickleRestart();
- logger.info("Issuing invalidate (known-version = %s, is-trickle-restart = %s): %s",
- invalidation.getIsKnownVersion(), isSuppressed, inv);
-
- // Issue invalidate if the invalidation had a known version AND either no suppression has
- // occurred or the client allows suppression.
- if (invalidation.getIsKnownVersion() &&
- (!isSuppressed || InvalidationClientCore.this.config.getAllowSuppression())) {
- listener.invalidate(InvalidationClientCore.this, inv, ackHandle);
- } else {
- // Otherwise issue invalidateUnknownVersion.
- listener.invalidateUnknownVersion(InvalidationClientCore.this, inv.getObjectId(),
- ackHandle);
- }
- }
- }
- }
-
- /** Handles incoming registration statuses. */
- private void handleRegistrationStatus(List<RegistrationStatus> regStatusList) {
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
- List<Boolean> localProcessingStatuses =
- registrationManager.handleRegistrationStatus(regStatusList);
- Preconditions.checkState(localProcessingStatuses.size() == regStatusList.size(),
- "Not all registration statuses were processed");
-
- // Inform app about the success or failure of each registration based
- // on what the registration manager has indicated.
- for (int i = 0; i < regStatusList.size(); ++i) {
- RegistrationStatus regStatus = regStatusList.get(i);
- boolean wasSuccess = localProcessingStatuses.get(i);
- logger.fine("Process reg status: %s", regStatus);
-
- ObjectId objectId = ProtoWrapperConverter.convertFromObjectIdProto(
- regStatus.getRegistration().getObjectId());
- if (wasSuccess) {
- // Server operation was both successful and agreed with what the client wanted.
- int regOpType = regStatus.getRegistration().getOpType();
- InvalidationListener.RegistrationState regState = convertOpTypeToRegState(regOpType);
- listener.informRegistrationStatus(InvalidationClientCore.this, objectId, regState);
- } else {
- // Server operation either failed or disagreed with client's intent (e.g., successful
- // unregister, but the client wanted a registration).
- String description = CommonProtos.isSuccess(regStatus.getStatus())
- ? "Registration discrepancy detected" : regStatus.getStatus().getDescription();
- boolean isPermanent = CommonProtos.isPermanentFailure(regStatus.getStatus());
- listener.informRegistrationFailure(InvalidationClientCore.this, objectId, !isPermanent,
- description);
- }
- }
- }
-
- /** Handles a registration sync request. */
- private void handleRegistrationSyncRequest() {
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
- // Send all the registrations in the reg sync message.
- // Generate a single subtree for all the registrations.
- RegistrationSubtree subtree =
- registrationManager.getRegistrations(Bytes.EMPTY_BYTES.getByteArray(), 0);
- protocolHandler.sendRegistrationSyncSubtree(subtree, batchingTask);
- }
-
- /** Handles an info message request. */
- private void handleInfoMessage(Collection<Integer> infoTypes) {
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
- boolean mustSendPerformanceCounters = false;
- for (int infoType : infoTypes) {
- mustSendPerformanceCounters = (infoType == InfoType.GET_PERFORMANCE_COUNTERS);
- if (mustSendPerformanceCounters) {
- break;
- }
- }
- sendInfoMessageToServer(mustSendPerformanceCounters,
- !registrationManager.isStateInSyncWithServer());
- }
-
- /** Handles an error message. */
- private void handleErrorMessage(ServerMessageHeader header, int code, String description) {
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
-
- // If it is an auth failure, we shut down the ticl.
- logger.severe("Received error message: %s, %s, %s", header, code, description);
-
- // Translate the code to error reason.
- int reason;
- switch (code) {
- case ErrorMessage.Code.AUTH_FAILURE:
- reason = ErrorInfo.ErrorReason.AUTH_FAILURE;
- break;
- case ErrorMessage.Code.UNKNOWN_FAILURE:
- default:
- reason = ErrorInfo.ErrorReason.UNKNOWN_FAILURE;
- break;
- }
-
- // Issue an informError to the application.
- ErrorInfo errorInfo = ErrorInfo.newInstance(reason, false, description, null);
- listener.informError(this, errorInfo);
-
- // If this is an auth failure, remove registrations and stop the Ticl. Otherwise do nothing.
- if (code != ErrorMessage.Code.AUTH_FAILURE) {
- return;
- }
-
- // If there are any registrations, remove them and issue registration failure.
- Collection<ObjectIdP> desiredRegistrations = registrationManager.removeRegisteredObjects();
- logger.warning("Issuing failure for %s objects", desiredRegistrations.size());
- for (ObjectIdP objectId : desiredRegistrations) {
- listener.informRegistrationFailure(this,
- ProtoWrapperConverter.convertFromObjectIdProto(objectId), false,
- "Auth error: " + description);
- }
- }
-
- /**
- * Returns whether the token in the header of {@code parsedMessage} matches either the
- * client token or nonce of this Ticl (depending on which is non-{@code null}).
- */
- private boolean validateToken(ParsedMessage parsedMessage) {
- if (clientToken != null) {
- // Client token case.
- if (!TypedUtil.<Bytes>equals(clientToken, parsedMessage.header.token)) {
- logger.info("Incoming message has bad token: server = %s, client = %s",
- parsedMessage.header.token, clientToken);
- statistics.recordError(ClientErrorType.TOKEN_MISMATCH);
- return false;
- }
- return true;
- } else if (nonce != null) {
- // Nonce case.
- if (!TypedUtil.<Bytes>equals(nonce, parsedMessage.header.token)) {
- statistics.recordError(ClientErrorType.NONCE_MISMATCH);
- logger.info("Rejecting server message with mismatched nonce: Client = %s, Server = %s",
- nonce, parsedMessage.header.token);
- return false;
- } else {
- logger.info("Accepting server message with matching nonce: %s", nonce);
- return true;
- }
- }
- // Neither token nor nonce; ignore message.
- logger.warning("Neither token nor nonce was set in validateToken: %s, %s", clientToken, nonce);
- return false;
- }
-
- /**
- * Requests a new client identifier from the server.
- * <p>
- * REQUIRES: no token currently be held.
- *
- * @param debugString information to identify the caller
- */
- private void acquireToken(final String debugString) {
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
-
- // Clear the current token and schedule the token acquisition.
- setClientToken(null);
- acquireTokenTask.ensureScheduled(debugString);
- }
-
- /**
- * Sends an info message to the server. If {@code mustSendPerformanceCounters} is true,
- * the performance counters are sent regardless of when they were sent earlier.
- */
- private void sendInfoMessageToServer(boolean mustSendPerformanceCounters,
- boolean requestServerSummary) {
- logger.info("Sending info message to server; request server summary = %s",
- requestServerSummary);
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
-
- List<SimplePair<String, Integer>> performanceCounters =
- new ArrayList<SimplePair<String, Integer>>();
- ClientConfigP configToSend = null;
- if (mustSendPerformanceCounters) {
- statistics.getNonZeroStatistics(performanceCounters);
- configToSend = config;
- }
- protocolHandler.sendInfoMessage(performanceCounters, configToSend, requestServerSummary,
- batchingTask);
- }
-
- /** Reads the Ticl state from persistent storage (if any) and calls {@code startInternal}. */
- private void scheduleStartAfterReadingStateBlob() {
- storage.readKey(CLIENT_TOKEN_KEY, new Callback<SimplePair<Status, byte[]>>() {
- @Override
- public void accept(final SimplePair<Status, byte[]> readResult) {
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
- final byte[] serializedState = readResult.getFirst().isSuccess() ?
- readResult.getSecond() : null;
- // Call start now.
- if (!readResult.getFirst().isSuccess()) {
- statistics.recordError(ClientErrorType.PERSISTENT_READ_FAILURE);
- logger.warning("Could not read state blob: %s", readResult.getFirst().getMessage());
- }
- startInternal(serializedState);
- }
- });
- }
-
- /**
- * Converts an operation type {@code regOpType} to a
- * {@code InvalidationListener.RegistrationState}.
- */
- private static InvalidationListener.RegistrationState convertOpTypeToRegState(int regOpType) {
- InvalidationListener.RegistrationState regState =
- regOpType == RegistrationP.OpType.REGISTER ?
- InvalidationListener.RegistrationState.REGISTERED :
- InvalidationListener.RegistrationState.UNREGISTERED;
- return regState;
- }
-
- /**
- * Sets the nonce to {@code newNonce}.
- * <p>
- * REQUIRES: {@code newNonce} be null or {@link #clientToken} be null.
- * The goal is to ensure that a nonce is never set unless there is no
- * client token, unless the nonce is being cleared.
- */
- private void setNonce(Bytes newNonce) {
- if ((newNonce != null) && (clientToken != null)) {
- throw new IllegalStateException("Tried to set nonce with existing token " + clientToken);
- }
- this.nonce = newNonce;
- }
-
- /**
- * Returns a randomly generated nonce. Visible for testing only.
- */
-
- static Bytes generateNonce(Random random) {
- // Generate 8 random bytes.
- byte[] randomBytes = new byte[8];
- random.nextBytes(randomBytes);
- return new Bytes(randomBytes);
- }
-
- /**
- * Sets the clientToken to {@code newClientToken}.
- * <p>
- * REQUIRES: {@code newClientToken} be null or {@link #nonce} be null.
- * The goal is to ensure that a token is never set unless there is no
- * nonce, unless the token is being cleared.
- */
- private void setClientToken(Bytes newClientToken) {
- if ((newClientToken != null) && (nonce != null)) {
- throw new IllegalStateException("Tried to set token with existing nonce " + nonce);
- }
-
- // If the ticl is in the process of being started and we are getting a new token (either from
- // persistence or from the server, start the ticl and inform the application.
- boolean finishStartingTicl = !ticlState.isStarted() &&
- (clientToken == null) && (newClientToken != null);
- this.clientToken = newClientToken;
-
- if (finishStartingTicl) {
- finishStartingTiclAndInformListener();
- }
- }
-
- /** Start the ticl and inform the listener that it is ready. */
- private void finishStartingTiclAndInformListener() {
- Preconditions.checkState(!ticlState.isStarted());
- ticlState.start();
- listener.ready(this);
-
- // We are not currently persisting our registration digest, so regardless of whether or not
- // we are restarting from persistent state, we need to query the application for all of
- // its registrations.
- listener.reissueRegistrations(InvalidationClientCore.this, RegistrationManager.EMPTY_PREFIX, 0);
- logger.info("Ticl started: %s", this);
- }
-
- /**
- * Returns an exponential backoff generator with {@code initialDelayMs} and other state as
- * given in {@code marshalledState}.
- */
- private TiclExponentialBackoffDelayGenerator createExpBackOffGenerator(int initialDelayMs,
- ExponentialBackoffState marshalledState) {
- if (marshalledState != null) {
- return new TiclExponentialBackoffDelayGenerator(random, initialDelayMs,
- config.getMaxExponentialBackoffFactor(), marshalledState);
- } else {
- return new TiclExponentialBackoffDelayGenerator(random, initialDelayMs,
- config.getMaxExponentialBackoffFactor());
- }
- }
-
- /** Returns a map from recurring task name to the runnable for that recurring task. */
- protected Map<String, Runnable> getRecurringTasks() {
- final int numPersistentTasks = 6;
- HashMap<String, Runnable> tasks = new HashMap<String, Runnable>(numPersistentTasks);
- tasks.put(AcquireTokenTask.TASK_NAME, acquireTokenTask.getRunnable());
- tasks.put(RegSyncHeartbeatTask.TASK_NAME, regSyncHeartbeatTask.getRunnable());
- tasks.put(PersistentWriteTask.TASK_NAME, persistentWriteTask.getRunnable());
- tasks.put(HeartbeatTask.TASK_NAME, heartbeatTask.getRunnable());
- tasks.put(BatchingTask.TASK_NAME, batchingTask.getRunnable());
- tasks.put(InitialPersistentHeartbeatTask.TASK_NAME,
- initialPersistentHeartbeatTask.getRunnable());
- return tasks;
- }
-
- @Override
- public void toCompactString(TextBuilder builder) {
- builder.append("Client: ").append(applicationClientId).append(", ")
- .append(clientToken).append(", ").append(ticlState);
- }
-
- @Override
- public InvalidationClientState marshal() {
- Preconditions.checkState(internalScheduler.isRunningOnThread(),
- "Not running on internal thread");
- InvalidationClientState.Builder builder = new InvalidationClientState.Builder();
- builder.runState = ticlState.marshal();
- builder.clientToken = clientToken;
- builder.nonce = nonce;
- builder.shouldSendRegistrations = shouldSendRegistrations;
- builder.lastMessageSendTimeMs = lastMessageSendTimeMs;
- builder.isOnline = isOnline;
- builder.protocolHandlerState = protocolHandler.marshal();
- builder.registrationManagerState = registrationManager.marshal();
- builder.acquireTokenTaskState = acquireTokenTask.marshal();
- builder.regSyncHeartbeatTaskState = regSyncHeartbeatTask.marshal();
- builder.persistentWriteTaskState = persistentWriteTask.marshal();
- builder.heartbeatTaskState = heartbeatTask.marshal();
- builder.batchingTaskState = batchingTask.marshal();
- builder.lastWrittenState = persistentWriteTask.lastWrittenState.get();
- builder.statisticsState = statistics.marshal();
- return builder.build();
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/InvalidationClientImpl.java b/java/com/google/ipc/invalidation/ticl/InvalidationClientImpl.java
deleted file mode 100644
index 4ba7337..0000000
--- a/java/com/google/ipc/invalidation/ticl/InvalidationClientImpl.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.ipc.invalidation.ticl;
-
-import static com.google.ipc.invalidation.external.client.SystemResources.Scheduler.NO_DELAY;
-
-import com.google.ipc.invalidation.external.client.InvalidationListener;
-import com.google.ipc.invalidation.external.client.SystemResources;
-import com.google.ipc.invalidation.external.client.types.AckHandle;
-import com.google.ipc.invalidation.external.client.types.ObjectId;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientConfigP;
-
-import java.util.Collection;
-import java.util.Random;
-
-/**
- * Implementation of the standard Java Ticl. This class extends {@link InvalidationClientCore}
- * with additional thread-safety related constructs. Specifically, it ensures that:
- * <p>
- * 1. All application calls into the Ticl execute on the internal scheduler.
- * <p>
- * 2. The storage layer always executes callbacks on the internal scheduler thread.
- * <p>
- * 3. All calls into the listener are made on the listener scheduler thread.
- */
-public class InvalidationClientImpl extends InvalidationClientCore {
- public InvalidationClientImpl(final SystemResources resources, Random random, int clientType,
- final byte[] clientName, ClientConfigP config, String applicationName,
- InvalidationListener listener) {
- super(
- // We will make Storage a SafeStorage after the constructor call. It's not possible to
- // construct a new resources around the existing components and pass that to super(...)
- // because then subsequent calls on the first resources object (e.g., start) would not
- // affect the new resources object that the Ticl would be using.
- resources,
-
- // Pass basic parameters through unmodified.
- random, clientType, clientName, config, applicationName,
-
- // Wrap the listener in a CheckingInvalidationListener to enforce appropriate threading.
- new CheckingInvalidationListener(listener,
- resources.getInternalScheduler(), resources.getListenerScheduler(),
- resources.getLogger())
- ); // End super.
-
- // Make Storage safe.
- this.storage = new SafeStorage(resources.getStorage());
- this.storage.setSystemResources(resources);
-
- // CheckingInvalidationListener needs the statistics object created by our super() call, so
- // we can't provide it at construction-time (since it hasn't been created yet).
- ((CheckingInvalidationListener) this.listener).setStatistics(statistics);
-
- }
-
- // Methods below are public methods from InvalidationClient that must first enqueue onto the
- // internal thread.
-
- @Override
- public void start() {
- getResources().getInternalScheduler().schedule(NO_DELAY, new Runnable() {
- @Override
- public void run() {
- InvalidationClientImpl.super.start();
- }
- });
- }
-
- @Override
- public void stop() {
- getResources().getInternalScheduler().schedule(NO_DELAY, new Runnable() {
- @Override
- public void run() {
- InvalidationClientImpl.super.stop();
- }
- });
- }
-
- @Override
- public void register(final ObjectId objectId) {
- getResources().getInternalScheduler().schedule(NO_DELAY, new Runnable() {
- @Override
- public void run() {
- InvalidationClientImpl.super.register(objectId);
- }
- });
- }
-
- @Override
- public void register(final Collection<ObjectId> objectIds) {
- getResources().getInternalScheduler().schedule(NO_DELAY, new Runnable() {
- @Override
- public void run() {
- InvalidationClientImpl.super.register(objectIds);
- }
- });
- }
-
- @Override
- public void unregister(final ObjectId objectId) {
- getResources().getInternalScheduler().schedule(NO_DELAY, new Runnable() {
- @Override
- public void run() {
- InvalidationClientImpl.super.unregister(objectId);
- }
- });
- }
-
- @Override
- public void unregister(final Collection<ObjectId> objectIds) {
- getResources().getInternalScheduler().schedule(NO_DELAY, new Runnable() {
- @Override
- public void run() {
- InvalidationClientImpl.super.unregister(objectIds);
- }
- });
- }
-
- @Override
- public void acknowledge(final AckHandle ackHandle) {
- getResources().getInternalScheduler().schedule(NO_DELAY, new Runnable() {
- @Override
- public void run() {
- InvalidationClientImpl.super.acknowledge(ackHandle);
- }
- });
- }
-
- // End InvalidationClient methods.
-
- @Override // InvalidationClientCore; overriding to add concurrency control.
- void handleIncomingMessage(final byte[] message) {
- getResources().getInternalScheduler().schedule(NO_DELAY, new Runnable() {
- @Override
- public void run() {
- InvalidationClientImpl.super.handleIncomingMessage(message);
- }
- });
- }
-
- @Override // InvalidationClientCore; overriding to add concurrency control.
- public void handleNetworkStatusChange(final boolean isOnline) {
- getResources().getInternalScheduler().schedule(NO_DELAY, new Runnable() {
- @Override
- public void run() {
- InvalidationClientImpl.super.handleNetworkStatusChange(isOnline);
- }
- });
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/MemoryStorageImpl.java b/java/com/google/ipc/invalidation/ticl/MemoryStorageImpl.java
deleted file mode 100644
index 1b2a93a..0000000
--- a/java/com/google/ipc/invalidation/ticl/MemoryStorageImpl.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.ticl;
-
-import com.google.ipc.invalidation.external.client.SystemResources;
-import com.google.ipc.invalidation.external.client.SystemResources.Scheduler;
-import com.google.ipc.invalidation.external.client.SystemResources.Storage;
-import com.google.ipc.invalidation.external.client.types.Callback;
-import com.google.ipc.invalidation.external.client.types.SimplePair;
-import com.google.ipc.invalidation.external.client.types.Status;
-import com.google.ipc.invalidation.util.Bytes;
-import com.google.ipc.invalidation.util.InternalBase;
-import com.google.ipc.invalidation.util.NamedRunnable;
-import com.google.ipc.invalidation.util.TextBuilder;
-import com.google.ipc.invalidation.util.TypedUtil;
-
-import java.util.HashMap;
-import java.util.Map;
-
-
-/**
- * Map-based in-memory implementation of {@link Storage}.
- *
- */
-public class MemoryStorageImpl extends InternalBase implements Storage {
- private Scheduler scheduler;
- private Map<String, byte[]> ticlPersistentState = new HashMap<String, byte[]>();
-
- @Override
- public void writeKey(final String key, final byte[] value, final Callback<Status> callback) {
- // Need to schedule immediately because C++ locks aren't reentrant, and
- // C++ locking code assumes that this call will not return directly.
-
- // Schedule the write even if the resources are started since the
- // scheduler will prevent it from running in case the resources have been
- // stopped.
- scheduler.schedule(Scheduler.NO_DELAY,
- new NamedRunnable("MemoryStorage.writeKey") {
- @Override
- public void run() {
- ticlPersistentState.put(key, value);
- callback.accept(Status.newInstance(Status.Code.SUCCESS, ""));
- }
- });
- }
-
- int numKeysForTest() {
- return ticlPersistentState.size();
- }
-
- @Override
- public void setSystemResources(SystemResources resources) {
- this.scheduler = resources.getInternalScheduler();
- }
-
- @Override
- public void readKey(final String key, final Callback<SimplePair<Status, byte[]>> done) {
- scheduler.schedule(Scheduler.NO_DELAY,
- new NamedRunnable("MemoryStorage.readKey") {
- @Override
- public void run() {
- byte[] value = TypedUtil.mapGet(ticlPersistentState, key);
- final SimplePair<Status, byte[]> result;
- if (value != null) {
- result = SimplePair.of(Status.newInstance(Status.Code.SUCCESS, ""), value);
- } else {
- String error = "No value present in map for " + key;
- result = SimplePair.of(Status.newInstance(Status.Code.PERMANENT_FAILURE, error), null);
- }
- done.accept(result);
- }
- });
- }
-
- @Override
- public void deleteKey(final String key, final Callback<Boolean> done) {
- scheduler.schedule(Scheduler.NO_DELAY,
- new NamedRunnable("MemoryStorage.deleteKey") {
- @Override
- public void run() {
- TypedUtil.remove(ticlPersistentState, key);
- done.accept(true);
- }
- });
- }
-
- @Override
- public void readAllKeys(final Callback<SimplePair<Status, String>> done) {
- scheduler.schedule(Scheduler.NO_DELAY,
- new NamedRunnable("MemoryStorage.readAllKeys") {
- @Override
- public void run() {
- Status successStatus = Status.newInstance(Status.Code.SUCCESS, "");
- for (String key : ticlPersistentState.keySet()) {
- done.accept(SimplePair.of(successStatus, key));
- }
- done.accept(null);
- }
- });
- }
-
- /**
- * Same as write except without any callbacks and is NOT done on the internal thread.
- * Test code should typically call this before starting the client.
- */
- void writeForTest(final String key, final byte[] value) {
- ticlPersistentState.put(key, value);
- }
-
- /**
- * Sets the scheduler, for tests. The Android tests use this to supply a scheduler that executes
- * no-delay items in-line.
- */
- public void setSchedulerForTest(Scheduler newScheduler) {
- scheduler = newScheduler;
- }
-
- /**
- * Same as read except without any callbacks and is NOT done on the internal thread.
- */
- public byte[] readForTest(final String key) {
- return ticlPersistentState.get(key);
- }
-
- @Override
- public void toCompactString(TextBuilder builder) {
- builder.append("Storage state: ");
- for (Map.Entry<String, byte[]> entry : ticlPersistentState.entrySet()) {
- builder.appendFormat("<%s, %s>, ", entry.getKey(), Bytes.toString(entry.getValue()));
- }
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/PersistenceUtils.java b/java/com/google/ipc/invalidation/ticl/PersistenceUtils.java
deleted file mode 100644
index be4fe21..0000000
--- a/java/com/google/ipc/invalidation/ticl/PersistenceUtils.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.ticl;
-
-import com.google.ipc.invalidation.common.DigestFunction;
-import com.google.ipc.invalidation.external.client.SystemResources.Logger;
-import com.google.ipc.invalidation.ticl.proto.Client.PersistentStateBlob;
-import com.google.ipc.invalidation.ticl.proto.Client.PersistentTiclState;
-import com.google.ipc.invalidation.util.Bytes;
-import com.google.ipc.invalidation.util.ProtoWrapper.ValidationException;
-import com.google.ipc.invalidation.util.TypedUtil;
-
-/**
- * Utility methods for handling the Ticl persistent state.
- *
- */
-public class PersistenceUtils {
-
- /** Serializes a Ticl state blob. */
- public static byte[] serializeState(
- PersistentTiclState state, DigestFunction digestFn) {
- Bytes mac = generateMac(state, digestFn);
- return PersistentStateBlob.create(state, mac).toByteArray();
- }
-
- /**
- * Deserializes a Ticl state blob. Returns either the parsed state or {@code null}
- * if it could not be parsed.
- */
- public static PersistentTiclState deserializeState(Logger logger, byte[] stateBlobBytes,
- DigestFunction digestFn) {
- PersistentStateBlob stateBlob;
- try {
- // Try parsing the envelope protocol buffer.
- stateBlob = PersistentStateBlob.parseFrom(stateBlobBytes);
- } catch (ValidationException exception) {
- logger.severe("Failed deserializing Ticl state: %s", exception.getMessage());
- return null;
- }
-
- // Check the mac in the envelope against the recomputed mac from the state.
- PersistentTiclState ticlState = stateBlob.getTiclState();
- Bytes mac = generateMac(ticlState, digestFn);
- if (!TypedUtil.<Bytes>equals(mac, stateBlob.getAuthenticationCode())) {
- logger.warning("Ticl state failed MAC check: computed %s vs %s", mac,
- stateBlob.getAuthenticationCode());
- return null;
- }
- return ticlState;
- }
-
- /** Returns a message authentication code over {@code state}. */
- private static Bytes generateMac(PersistentTiclState state, DigestFunction digestFn) {
- digestFn.reset();
- digestFn.update(state.toByteArray());
- return new Bytes(digestFn.getDigest());
- }
-
- private PersistenceUtils() {
- // Prevent instantiation.
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/ProtoWrapperConverter.java b/java/com/google/ipc/invalidation/ticl/ProtoWrapperConverter.java
deleted file mode 100644
index 79f5f18..0000000
--- a/java/com/google/ipc/invalidation/ticl/ProtoWrapperConverter.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.ticl;
-
-import com.google.ipc.invalidation.external.client.types.Invalidation;
-import com.google.ipc.invalidation.external.client.types.ObjectId;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP;
-import com.google.ipc.invalidation.ticl.proto.CommonProtos;
-import com.google.ipc.invalidation.util.Bytes;
-import com.google.ipc.invalidation.util.Preconditions;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-/**
- * Utilities to convert between {@link com.google.ipc.invalidation.util.ProtoWrapper ProtoWrapper}
- * wrappers and externally-exposed types in the Ticl.
- */
-public class ProtoWrapperConverter {
-
- /**
- * Converts an object id protocol buffer {@code objectId} to the
- * corresponding external type and returns it.
- */
- public static ObjectId convertFromObjectIdProto(ObjectIdP objectIdProto) {
- Preconditions.checkNotNull(objectIdProto);
- return ObjectId.newInstance(objectIdProto.getSource(), objectIdProto.getName().getByteArray());
- }
-
- /**
- * Converts an object id {@code objectId} to the corresponding protocol buffer
- * and returns it.
- */
- public static ObjectIdP convertToObjectIdProto(ObjectId objectId) {
- Preconditions.checkNotNull(objectId);
- return ObjectIdP.create(objectId.getSource(), new Bytes(objectId.getName()));
- }
-
- /**
- * Returns a list of {@link ObjectIdP} by converting each element of {@code objectIds} to
- * an {@code ObjectIdP}.
- */
- public static Collection<ObjectIdP> convertToObjectIdProtoCollection(
- Iterable<ObjectId> objectIds) {
- int expectedSize = (objectIds instanceof Collection) ? ((Collection<?>) objectIds).size() : 1;
- ArrayList<ObjectIdP> objectIdPs = new ArrayList<ObjectIdP>(expectedSize);
- for (ObjectId objectId : objectIds) {
- objectIdPs.add(convertToObjectIdProto(objectId));
- }
- return objectIdPs;
- }
-
- /**
- * Returns a list of {@link ObjectId} by converting each element of {@code objectIdProtos} to
- * an {@code ObjectId}.
- */
- public static Collection<ObjectId> convertFromObjectIdProtoCollection(
- Collection<ObjectIdP> objectIdProtos) {
- ArrayList<ObjectId> objectIds = new ArrayList<ObjectId>(objectIdProtos.size());
- for (ObjectIdP objectIdProto : objectIdProtos) {
- objectIds.add(convertFromObjectIdProto(objectIdProto));
- }
- return objectIds;
- }
-
- /**
- * Converts an invalidation protocol buffer {@code invalidation} to the
- * corresponding external object and returns it
- */
- public static Invalidation convertFromInvalidationProto(InvalidationP invalidation) {
- Preconditions.checkNotNull(invalidation);
- ObjectId objectId = convertFromObjectIdProto(invalidation.getObjectId());
-
- // No bridge arrival time in invalidation.
- return Invalidation.newInstance(objectId, invalidation.getVersion(),
- invalidation.hasPayload() ? invalidation.getPayload().getByteArray() : null,
- invalidation.getIsTrickleRestart());
- }
-
- /**
- * Converts an invalidation {@code invalidation} to the corresponding protocol
- * buffer and returns it.
- */
- public static InvalidationP convertToInvalidationProto(Invalidation invalidation) {
- Preconditions.checkNotNull(invalidation);
- ObjectIdP objectId = convertToObjectIdProto(invalidation.getObjectId());
-
- // Invalidations clients do not know about trickle restarts. Every invalidation is allowed
- // to suppress earlier invalidations and acks implicitly acknowledge all previous
- // invalidations. Therefore the correct semanantics are provided by setting isTrickleRestart to
- // true.
- return CommonProtos.newInvalidationP(objectId, invalidation.getVersion(),
- invalidation.getIsTrickleRestartForInternalUse(), invalidation.getPayload());
- }
-
- private ProtoWrapperConverter() { // To prevent instantiation.
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/ProtocolHandler.java b/java/com/google/ipc/invalidation/ticl/ProtocolHandler.java
deleted file mode 100644
index 131de39..0000000
--- a/java/com/google/ipc/invalidation/ticl/ProtocolHandler.java
+++ /dev/null
@@ -1,661 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.ticl;
-
-import com.google.ipc.invalidation.external.client.SystemResources;
-import com.google.ipc.invalidation.external.client.SystemResources.Logger;
-import com.google.ipc.invalidation.external.client.SystemResources.NetworkChannel;
-import com.google.ipc.invalidation.external.client.SystemResources.Scheduler;
-import com.google.ipc.invalidation.external.client.types.SimplePair;
-import com.google.ipc.invalidation.ticl.InvalidationClientCore.BatchingTask;
-import com.google.ipc.invalidation.ticl.Statistics.ClientErrorType;
-import com.google.ipc.invalidation.ticl.Statistics.ReceivedMessageType;
-import com.google.ipc.invalidation.ticl.Statistics.SentMessageType;
-import com.google.ipc.invalidation.ticl.proto.ClientConstants;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ApplicationClientIdP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientConfigP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientHeader;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientToServerMessage;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientVersion;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ConfigChangeMessage;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ErrorMessage;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.InfoMessage;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.InfoRequestMessage;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.InitializeMessage;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.InitializeMessage.DigestSerializationType;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationMessage;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.PropertyRecord;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ProtocolHandlerConfigP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.RateLimitP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationMessage;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationP.OpType;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationStatusMessage;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSubtree;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSummary;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSyncMessage;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSyncRequestMessage;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ServerHeader;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ServerToClientMessage;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.TokenControlMessage;
-import com.google.ipc.invalidation.ticl.proto.CommonProtos;
-import com.google.ipc.invalidation.ticl.proto.JavaClient.BatcherState;
-import com.google.ipc.invalidation.ticl.proto.JavaClient.ProtocolHandlerState;
-import com.google.ipc.invalidation.util.Bytes;
-import com.google.ipc.invalidation.util.InternalBase;
-import com.google.ipc.invalidation.util.Marshallable;
-import com.google.ipc.invalidation.util.Preconditions;
-import com.google.ipc.invalidation.util.ProtoWrapper;
-import com.google.ipc.invalidation.util.ProtoWrapper.ValidationException;
-import com.google.ipc.invalidation.util.Smearer;
-import com.google.ipc.invalidation.util.TextBuilder;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-
-/**
- * A layer for interacting with low-level protocol messages. Parses messages from the server and
- * calls appropriate functions on the {@code ProtocolListener} to handle various types of message
- * content. Also buffers message data from the client and constructs and sends messages to the
- * server.
- * <p>
- * This class implements {@link Marshallable}, so its state can be written to a protocol buffer,
- * and instances can be restored from such protocol buffers. Additionally, the nested class
- * {@link Batcher} also implements {@code Marshallable} for the same reason.
- * <p>
- * Note that while we talk about "marshalling," in this context we mean marshalling to protocol
- * buffers, not raw bytes.
- *
- */
-class ProtocolHandler implements Marshallable<ProtocolHandlerState> {
- /** Class that batches messages to the server. */
- private static class Batcher implements Marshallable<BatcherState> {
- /** Statistics to be updated when messages are created. */
- private final Statistics statistics;
-
- /** Resources used for logging and thread assertions. */
- private final SystemResources resources;
-
- /** Set of pending registrations stored as a map for overriding later operations. */
- private final Map<ObjectIdP, Integer> pendingRegistrations = new HashMap<ObjectIdP, Integer>();
-
- /** Set of pending invalidation acks. */
- private final Set<InvalidationP> pendingAckedInvalidations = new HashSet<InvalidationP>();
-
- /** Set of pending registration sub trees for registration sync. */
- private final Set<RegistrationSubtree> pendingRegSubtrees = new HashSet<RegistrationSubtree>();
-
- /** Pending initialization message to send to the server, if any. */
- private InitializeMessage pendingInitializeMessage = null;
-
- /** Pending info message to send to the server, if any. */
- private InfoMessage pendingInfoMessage = null;
-
- /** Creates a batcher. */
- Batcher(SystemResources resources, Statistics statistics) {
- this.resources = resources;
- this.statistics = statistics;
- }
-
- /** Creates a batcher from {@code marshalledState}. */
- Batcher(SystemResources resources, Statistics statistics, BatcherState marshalledState) {
- this(resources, statistics);
- for (ObjectIdP registration : marshalledState.getRegistration()) {
- pendingRegistrations.put(registration, RegistrationP.OpType.REGISTER);
- }
- for (ObjectIdP unregistration : marshalledState.getUnregistration()) {
- pendingRegistrations.put(unregistration, RegistrationP.OpType.UNREGISTER);
- }
- for (InvalidationP ack : marshalledState.getAcknowledgement()) {
- pendingAckedInvalidations.add(ack);
- }
- for (RegistrationSubtree subtree : marshalledState.getRegistrationSubtree()) {
- pendingRegSubtrees.add(subtree);
- }
- pendingInitializeMessage = marshalledState.getNullableInitializeMessage();
- if (marshalledState.hasInfoMessage()) {
- pendingInfoMessage = marshalledState.getInfoMessage();
- }
- }
-
- /** Sets the initialize message to be sent. */
- void setInitializeMessage(InitializeMessage msg) {
- pendingInitializeMessage = msg;
- }
-
- /** Sets the info message to be sent. */
- void setInfoMessage(InfoMessage msg) {
- pendingInfoMessage = msg;
- }
-
- /** Adds a registration on {@code oid} of {@code opType} to the registrations to be sent. */
- void addRegistration(ObjectIdP oid, Integer opType) {
- pendingRegistrations.put(oid, opType);
- }
-
- /** Adds {@code ack} to the set of acknowledgements to be sent. */
- void addAck(InvalidationP ack) {
- pendingAckedInvalidations.add(ack);
- }
-
- /** Adds {@code subtree} to the set of registration subtrees to be sent. */
- void addRegSubtree(RegistrationSubtree subtree) {
- pendingRegSubtrees.add(subtree);
- }
-
- /**
- * Returns a builder for a {@link ClientToServerMessage} to be sent to the server. Crucially,
- * the builder does <b>NOT</b> include the message header.
- * @param hasClientToken whether the client currently holds a token
- */
- ClientToServerMessage toMessage(final ClientHeader header, boolean hasClientToken) {
- final InitializeMessage initializeMessage;
- final RegistrationMessage registrationMessage;
- final RegistrationSyncMessage registrationSyncMessage;
- final InvalidationMessage invalidationAckMessage;
- final InfoMessage infoMessage;
-
- if (pendingInitializeMessage != null) {
- statistics.recordSentMessage(SentMessageType.INITIALIZE);
- initializeMessage = pendingInitializeMessage;
- pendingInitializeMessage = null;
- } else {
- initializeMessage = null;
- }
-
- // Note: Even if an initialize message is being sent, we can send additional
- // messages such as regisration messages, etc to the server. But if there is no token
- // and an initialize message is not being sent, we cannot send any other message.
-
- if (!hasClientToken && (initializeMessage == null)) {
- // Cannot send any message
- resources.getLogger().warning(
- "Cannot send message since no token and no initialize msg");
- statistics.recordError(ClientErrorType.TOKEN_MISSING_FAILURE);
- return null;
- }
-
- // Check for pending batched operations and add to message builder if needed.
-
- // Add reg, acks, reg subtrees - clear them after adding.
- if (!pendingAckedInvalidations.isEmpty()) {
- invalidationAckMessage = createInvalidationAckMessage();
- statistics.recordSentMessage(SentMessageType.INVALIDATION_ACK);
- } else {
- invalidationAckMessage = null;
- }
-
- // Check regs.
- if (!pendingRegistrations.isEmpty()) {
- registrationMessage = createRegistrationMessage();
- statistics.recordSentMessage(SentMessageType.REGISTRATION);
- } else {
- registrationMessage = null;
- }
-
- // Check reg substrees.
- if (!pendingRegSubtrees.isEmpty()) {
- // If there are multiple pending reg subtrees, only one is sent.
- ArrayList<RegistrationSubtree> regSubtrees = new ArrayList<RegistrationSubtree>(1);
- regSubtrees.add(pendingRegSubtrees.iterator().next());
- registrationSyncMessage = RegistrationSyncMessage.create(regSubtrees);
- pendingRegSubtrees.clear();
- statistics.recordSentMessage(SentMessageType.REGISTRATION_SYNC);
- } else {
- registrationSyncMessage = null;
- }
-
- // Check if an info message has to be sent.
- if (pendingInfoMessage != null) {
- statistics.recordSentMessage(SentMessageType.INFO);
- infoMessage = pendingInfoMessage;
- pendingInfoMessage = null;
- } else {
- infoMessage = null;
- }
-
- return ClientToServerMessage.create(header, initializeMessage, registrationMessage,
- registrationSyncMessage, invalidationAckMessage, infoMessage);
- }
-
- /**
- * Creates a registration message based on registrations from {@code pendingRegistrations}
- * and returns it.
- * <p>
- * REQUIRES: pendingRegistrations.size() > 0
- */
- private RegistrationMessage createRegistrationMessage() {
- Preconditions.checkState(!pendingRegistrations.isEmpty());
-
- // Run through the pendingRegistrations map.
- List<RegistrationP> pendingRegistrations =
- new ArrayList<RegistrationP>(this.pendingRegistrations.size());
- for (Map.Entry<ObjectIdP, Integer> entry : this.pendingRegistrations.entrySet()) {
- pendingRegistrations.add(RegistrationP.create(entry.getKey(), entry.getValue()));
- }
- this.pendingRegistrations.clear();
- return RegistrationMessage.create(pendingRegistrations);
- }
-
- /**
- * Creates an invalidation ack message based on acks from {@code pendingAckedInvalidations} and
- * returns it.
- * <p>
- * REQUIRES: pendingAckedInvalidations.size() > 0
- */
- private InvalidationMessage createInvalidationAckMessage() {
- Preconditions.checkState(!pendingAckedInvalidations.isEmpty());
- InvalidationMessage ackMessage =
- InvalidationMessage.create(new ArrayList<InvalidationP>(pendingAckedInvalidations));
- pendingAckedInvalidations.clear();
- return ackMessage;
- }
-
- @Override
- public BatcherState marshal() {
- // Marshall (un)registrations.
- ArrayList<ObjectIdP> registrations = new ArrayList<ObjectIdP>(pendingRegistrations.size());
- ArrayList<ObjectIdP> unregistrations = new ArrayList<ObjectIdP>(pendingRegistrations.size());
- for (Map.Entry<ObjectIdP, Integer> entry : pendingRegistrations.entrySet()) {
- Integer opType = entry.getValue();
- ObjectIdP oid = entry.getKey();
- new ArrayList<ObjectIdP>(pendingRegistrations.size());
- switch (opType) {
- case OpType.REGISTER:
- registrations.add(oid);
- break;
- case OpType.UNREGISTER:
- unregistrations.add(oid);
- break;
- default:
- throw new IllegalArgumentException(opType.toString());
- }
- }
- return BatcherState.create(registrations, unregistrations, pendingAckedInvalidations,
- pendingRegSubtrees, pendingInitializeMessage, pendingInfoMessage);
- }
- }
-
- /** Representation of a message header for use in a server message. */
- static class ServerMessageHeader extends InternalBase {
- /**
- * Constructs an instance.
- *
- * @param token server-sent token
- * @param registrationSummary summary over server registration state
- */
- ServerMessageHeader(Bytes token, RegistrationSummary registrationSummary) {
- this.token = token;
- this.registrationSummary = registrationSummary;
- }
-
- /** Server-sent token. */
- Bytes token;
-
- /** Summary of the client's registration state at the server. */
- RegistrationSummary registrationSummary;
-
- @Override
- public void toCompactString(TextBuilder builder) {
- builder.appendFormat("Token: %s, Summary: %s", token, registrationSummary);
- }
- }
-
- /**
- * Representation of a message receiver for the server. Such a message is guaranteed to be
- * valid, but the session token is <b>not</b> checked.
- */
- static class ParsedMessage {
- /*
- * Each of these fields corresponds directly to a field in the ServerToClientMessage protobuf.
- * It is non-null iff the corresponding hasYYY method in the protobuf would return true.
- */
- final ServerMessageHeader header;
- final TokenControlMessage tokenControlMessage;
- final InvalidationMessage invalidationMessage;
- final RegistrationStatusMessage registrationStatusMessage;
- final RegistrationSyncRequestMessage registrationSyncRequestMessage;
- final ConfigChangeMessage configChangeMessage;
- final InfoRequestMessage infoRequestMessage;
- final ErrorMessage errorMessage;
-
- /** Constructs an instance from a {@code rawMessage}. */
- ParsedMessage(ServerToClientMessage rawMessage) {
- // For each field, assign it to the corresponding protobuf field if present, else null.
- ServerHeader messageHeader = rawMessage.getHeader();
- header = new ServerMessageHeader(messageHeader.getClientToken(),
- messageHeader.getNullableRegistrationSummary());
- tokenControlMessage =
- rawMessage.hasTokenControlMessage() ? rawMessage.getTokenControlMessage() : null;
- invalidationMessage = rawMessage.getNullableInvalidationMessage();
- registrationStatusMessage = rawMessage.getNullableRegistrationStatusMessage();
- registrationSyncRequestMessage = rawMessage.hasRegistrationSyncRequestMessage()
- ? rawMessage.getRegistrationSyncRequestMessage() : null;
- configChangeMessage =
- rawMessage.hasConfigChangeMessage() ? rawMessage.getConfigChangeMessage() : null;
- infoRequestMessage = rawMessage.getNullableInfoRequestMessage();
- errorMessage = rawMessage.getNullableErrorMessage();
- }
- }
-
- /**
- * Listener for protocol events. The handler guarantees that the call will be made on the internal
- * thread that the SystemResources provides.
- */
- interface ProtocolListener {
- /** Records that a message was sent to the server at the current time. */
- void handleMessageSent();
-
- /** Returns a summary of the current desired registrations. */
- RegistrationSummary getRegistrationSummary();
-
- /** Returns the current server-assigned client token, if any. */
- Bytes getClientToken();
- }
-
- /** Information about the client, e.g., application name, OS, etc. */
- private final ClientVersion clientVersion;
-
- /** A logger. */
- private final Logger logger;
-
- /** Scheduler for the client's internal processing. */
- private final Scheduler internalScheduler;
-
- /** Network channel for sending and receiving messages to and from the server. */
- private final NetworkChannel network;
-
- /** The protocol listener. */
- private final ProtocolListener listener;
-
- /** Batches messages to the server. */
- private final Batcher batcher;
-
- /** A debug message id that is added to every message to the server. */
- private int messageId = 1;
-
- // State specific to a client. If we want to support multiple clients, this could
- // be in a map or could be eliminated (e.g., no batching).
-
- /** The last known time from the server. */
- private long lastKnownServerTimeMs = 0;
-
- /**
- * The next time before which a message cannot be sent to the server. If this is less than current
- * time, a message can be sent at any time.
- */
- private long nextMessageSendTimeMs = 0;
-
- /** Statistics objects to track number of sent messages, etc. */
- private final Statistics statistics;
-
- /** Client type for inclusion in headers. */
- private final int clientType;
-
- /**
- * Creates an instance.
- *
- * @param config configuration for the client
- * @param resources resources to use
- * @param smearer a smearer to randomize delays
- * @param statistics track information about messages sent/received, etc
- * @param applicationName name of the application using the library (for debugging/monitoring)
- * @param listener callback for protocol events
- */
- ProtocolHandler(ProtocolHandlerConfigP config, final SystemResources resources,
- Smearer smearer, Statistics statistics, int clientType, String applicationName,
- ProtocolListener listener, ProtocolHandlerState marshalledState) {
- this.logger = resources.getLogger();
- this.statistics = statistics;
- this.internalScheduler = resources.getInternalScheduler();
- this.network = resources.getNetwork();
- this.listener = listener;
- this.clientVersion = CommonProtos.newClientVersion(resources.getPlatform(), "Java",
- applicationName);
- this.clientType = clientType;
- if (marshalledState == null) {
- // If there is no marshalled state, construct a clean batcher.
- this.batcher = new Batcher(resources, statistics);
- } else {
- // Otherwise, restore the batcher from the marshalled state.
- this.batcher = new Batcher(resources, statistics, marshalledState.getBatcherState());
- this.messageId = marshalledState.getMessageId();
- this.lastKnownServerTimeMs = marshalledState.getLastKnownServerTimeMs();
- this.nextMessageSendTimeMs = marshalledState.getNextMessageSendTimeMs();
- }
- logger.info("Created protocol handler for application %s, platform %s", applicationName,
- resources.getPlatform());
- }
-
- /** Returns a default config for the protocol handler. */
- static ProtocolHandlerConfigP createConfig() {
- // Allow at most 3 messages every 5 seconds.
- int windowMs = 5 * 1000;
- int numMessagesPerWindow = 3;
-
- List<RateLimitP> rateLimits = new ArrayList<RateLimitP>();
- rateLimits.add(RateLimitP.create(windowMs, numMessagesPerWindow));
- return ProtocolHandlerConfigP.create(null, rateLimits);
- }
-
- /** Returns a configuration object with parameters set for unit tests. */
- static ProtocolHandlerConfigP createConfigForTest() {
- // No rate limits
- int smallBatchDelayForTest = 200;
- return ProtocolHandlerConfigP.create(smallBatchDelayForTest, new ArrayList<RateLimitP>(0));
- }
-
- /**
- * Returns the next time a message is allowed to be sent to the server. Typically, this will be
- * in the past, meaning that the client is free to send a message at any time.
- */
- public long getNextMessageSendTimeMsForTest() {
- return nextMessageSendTimeMs;
- }
-
- /**
- * Handles a message from the server. If the message can be processed (i.e., is valid, is
- * of the right version, and is not a silence message), returns a {@link ParsedMessage}
- * representing it. Otherwise, returns {@code null}.
- * <p>
- * This class intercepts and processes silence messages. In this case, it will discard any other
- * data in the message.
- * <p>
- * Note that this method does <b>not</b> check the session token of any message.
- */
- ParsedMessage handleIncomingMessage(byte[] incomingMessage) {
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
- ServerToClientMessage message;
- try {
- message = ServerToClientMessage.parseFrom(incomingMessage);
- } catch (ValidationException exception) {
- statistics.recordError(ClientErrorType.INCOMING_MESSAGE_FAILURE);
- logger.warning("Incoming message is invalid: %s", Bytes.toLazyCompactString(incomingMessage));
- return null;
- }
-
- // Check the version of the message.
- if (message.getHeader().getProtocolVersion().getVersion().getMajorVersion() !=
- ClientConstants.PROTOCOL_MAJOR_VERSION) {
- statistics.recordError(ClientErrorType.PROTOCOL_VERSION_FAILURE);
- logger.severe("Dropping message with incompatible version: %s", message);
- return null;
- }
-
- // Check if it is a ConfigChangeMessage which indicates that messages should no longer be
- // sent for a certain duration. Perform this check before the token is even checked.
- if (message.hasConfigChangeMessage()) {
- ConfigChangeMessage configChangeMsg = message.getConfigChangeMessage();
- statistics.recordReceivedMessage(ReceivedMessageType.CONFIG_CHANGE);
- if (configChangeMsg.hasNextMessageDelayMs()) { // Validator has ensured that it is positive.
- nextMessageSendTimeMs =
- internalScheduler.getCurrentTimeMs() + configChangeMsg.getNextMessageDelayMs();
- }
- return null; // Ignore all other messages in the envelope.
- }
-
- lastKnownServerTimeMs = Math.max(lastKnownServerTimeMs, message.getHeader().getServerTimeMs());
- return new ParsedMessage(message);
- }
-
- /**
- * Sends a message to the server to request a client token.
- *
- * @param applicationClientId application-specific client id
- * @param nonce nonce for the request
- * @param debugString information to identify the caller
- */
- void sendInitializeMessage(ApplicationClientIdP applicationClientId, Bytes nonce,
- BatchingTask batchingTask, String debugString) {
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
- if (applicationClientId.getClientType() != clientType) {
- // This condition is not fatal, but it probably represents a bug somewhere if it occurs.
- logger.warning(
- "Client type in application id does not match constructor-provided type: %s vs %s",
- applicationClientId, clientType);
- }
-
- // Simply store the message in pendingInitializeMessage and send it when the batching task runs.
- InitializeMessage initializeMsg = InitializeMessage.create(clientType, nonce,
- applicationClientId, DigestSerializationType.BYTE_BASED);
- batcher.setInitializeMessage(initializeMsg);
- logger.info("Batching initialize message for client: %s, %s", debugString, initializeMsg);
- batchingTask.ensureScheduled(debugString);
- }
-
- /**
- * Sends an info message to the server with the performance counters supplied
- * in {@code performanceCounters} and the config supplies in
- * {@code configParams}.
- *
- * @param requestServerRegistrationSummary indicates whether to request the
- * server's registration summary
- */
- void sendInfoMessage(List<SimplePair<String, Integer>> performanceCounters,
- ClientConfigP clientConfig, boolean requestServerRegistrationSummary,
- BatchingTask batchingTask) {
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
-
- List<PropertyRecord> performanceCounterRecords =
- new ArrayList<PropertyRecord>(performanceCounters.size());
- for (SimplePair<String, Integer> counter : performanceCounters) {
- performanceCounterRecords.add(PropertyRecord.create(counter.first, counter.second));
- }
- InfoMessage infoMessage = InfoMessage.create(clientVersion, /* configParameter */ null,
- performanceCounterRecords, requestServerRegistrationSummary, clientConfig);
-
- // Simply store the message in pendingInfoMessage and send it when the batching task runs.
- batcher.setInfoMessage(infoMessage);
- batchingTask.ensureScheduled("Send-info");
- }
-
- /**
- * Sends a registration request to the server.
- *
- * @param objectIds object ids on which to (un)register
- * @param regOpType whether to register or unregister
- */
- void sendRegistrations(Collection<ObjectIdP> objectIds, Integer regOpType,
- BatchingTask batchingTask) {
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
- for (ObjectIdP objectId : objectIds) {
- batcher.addRegistration(objectId, regOpType);
- }
- batchingTask.ensureScheduled("Send-registrations");
- }
-
- /** Sends an acknowledgement for {@code invalidation} to the server. */
- void sendInvalidationAck(InvalidationP invalidation, BatchingTask batchingTask) {
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
- // We could summarize acks when there are suppressing invalidations - we don't since it is
- // unlikely to be too beneficial here.
- logger.fine("Sending ack for invalidation %s", invalidation);
- batcher.addAck(invalidation);
- batchingTask.ensureScheduled("Send-Ack");
- }
-
- /**
- * Sends a single registration subtree to the server.
- *
- * @param regSubtree subtree to send
- */
- void sendRegistrationSyncSubtree(RegistrationSubtree regSubtree, BatchingTask batchingTask) {
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
- batcher.addRegSubtree(regSubtree);
- logger.info("Adding subtree: %s", regSubtree);
- batchingTask.ensureScheduled("Send-reg-sync");
- }
-
- /** Sends pending data to the server (e.g., registrations, acks, registration sync messages). */
- void sendMessageToServer() {
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
- if (nextMessageSendTimeMs > internalScheduler.getCurrentTimeMs()) {
- logger.warning("In quiet period: not sending message to server: %s > %s",
- nextMessageSendTimeMs, internalScheduler.getCurrentTimeMs());
- return;
- }
-
- // Create the message from the batcher.
- ClientToServerMessage message;
- try {
- message = batcher.toMessage(createClientHeader(), listener.getClientToken() != null);
- if (message == null) {
- // Happens when we don't have a token and are not sending an initialize message. Logged
- // in batcher.toMessage().
- return;
- }
- } catch (ProtoWrapper.ValidationArgumentException exception) {
- logger.severe("Tried to send invalid message: %s", batcher);
- statistics.recordError(ClientErrorType.OUTGOING_MESSAGE_FAILURE);
- return;
- }
- ++messageId;
-
- statistics.recordSentMessage(SentMessageType.TOTAL);
- logger.fine("Sending message to server: %s", message);
- network.sendMessage(message.toByteArray());
-
- // Record that the message was sent. We're invoking the listener directly, rather than
- // scheduling a new work unit to do it. It would be safer to do a schedule, but that's hard to
- // do in Android, we wrote this listener (it's InvalidationClientCore, so we know what it does),
- // and it's the last line of this function.
- listener.handleMessageSent();
- }
-
- /** Returns the header to include on a message to the server. */
- private ClientHeader createClientHeader() {
- Preconditions.checkState(internalScheduler.isRunningOnThread(), "Not on internal thread");
- return ClientHeader.create(ClientConstants.PROTOCOL_VERSION,
- listener.getClientToken(), listener.getRegistrationSummary(),
- internalScheduler.getCurrentTimeMs(), lastKnownServerTimeMs, Integer.toString(messageId),
- clientType);
- }
-
- @Override
- public ProtocolHandlerState marshal() {
- return ProtocolHandlerState.create(messageId, lastKnownServerTimeMs, nextMessageSendTimeMs,
- batcher.marshal());
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/RecurringTask.java b/java/com/google/ipc/invalidation/ticl/RecurringTask.java
deleted file mode 100644
index 8973854..0000000
--- a/java/com/google/ipc/invalidation/ticl/RecurringTask.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.ticl;
-
-import com.google.ipc.invalidation.external.client.SystemResources.Logger;
-import com.google.ipc.invalidation.external.client.SystemResources.Scheduler;
-import com.google.ipc.invalidation.ticl.proto.Client.ExponentialBackoffState;
-import com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState;
-import com.google.ipc.invalidation.util.ExponentialBackoffDelayGenerator;
-import com.google.ipc.invalidation.util.InternalBase;
-import com.google.ipc.invalidation.util.Marshallable;
-import com.google.ipc.invalidation.util.NamedRunnable;
-import com.google.ipc.invalidation.util.Preconditions;
-import com.google.ipc.invalidation.util.Smearer;
-import com.google.ipc.invalidation.util.TextBuilder;
-
-
-/**
- * An abstraction for scheduling recurring tasks. Combines idempotent scheduling and smearing with
- * conditional retries and exponential backoff. Does not implement throttling. Designed to support a
- * variety of use cases, including:
- *
- * <ul>
- * <li>Idempotent scheduling, e.g., ensuring that a batching task is scheduled exactly once.
- * <li>Recurring tasks, e.g., periodic heartbeats.
- * <li>Retriable actions aimed at state change, e.g., sending initialization messages.
- * </ul>
- * Each instance of this class manages the state for a single task. Examples:
- *
- * <pre>
- * batchingTask = new RecurringTask("Batching", scheduler, logger, smearer, null,
- * batchingDelayMs, NO_DELAY) {
- * @Override
- * public boolean runTask() {
- * throttle.fire();
- * return false; // don't reschedule.
- * }
- * };
- * heartbeatTask = new RecurringTask("Heartbeat", scheduler, logger, smearer, null,
- * heartbeatDelayMs, NO_DELAY) {
- * @Override
- * public boolean runTask() {
- * sendInfoMessageToServer(false, !registrationManager.isStateInSyncWithServer());
- * return true; // reschedule
- * }
- * };
- * initializeTask = new RecurringTask("Token", scheduler, logger, smearer, expDelayGen, NO_DELAY,
- * networkTimeoutMs) {
- * @Override
- * public boolean runTask() {
- * // If token is still not assigned (as expected), sends a request. Otherwise, ignore.
- * if (clientToken == null) {
- * // Allocate a nonce and send a message requesting a new token.
- * setNonce(ByteString.copyFromUtf8(Long.toString(internalScheduler.getCurrentTimeMs())));
- * protocolHandler.sendInitializeMessage(applicationClientId, nonce, debugString);
- * return true; // reschedule to check state, retry if necessary after timeout
- * } else {
- * return false; // don't reschedule
- * }
- * }
- * };
- *</pre>
- *
- */
-public abstract class RecurringTask extends InternalBase
- implements Marshallable<RecurringTaskState> {
-
- /** Name of the task (for debugging purposes mostly). */
- private final String name;
-
- /** A logger */
- private final Logger logger;
-
- /** Scheduler for the scheduling the task as needed. */
- private final Scheduler scheduler;
-
- /**
- * The time after which the task is scheduled first. If no delayGenerator is specified, this is
- * also the delay used for retries.
- */
- private final int initialDelayMs;
-
- /** For a task that is retried, add this time to the delay. */
- private final int timeoutDelayMs;
-
- /** A smearer for spreading the delays. */
- private final Smearer smearer;
-
- /** A delay generator for exponential backoff. */
- private final TiclExponentialBackoffDelayGenerator delayGenerator;
-
- /** The runnable that is scheduled for the task. */
- private final NamedRunnable runnable;
-
- /** If the task has been currently scheduled. */
- private boolean isScheduled;
-
- /**
- * Creates a recurring task with the given parameters. The specs of the parameters are given in
- * the instance variables.
- * <p>
- * The created task is first scheduled with a smeared delay of {@code initialDelayMs}. If the
- * {@code this.run()} returns true on its execution, the task is rescheduled after a
- * {@code timeoutDelayMs} + smeared delay of {@code initialDelayMs} or {@code timeoutDelayMs} +
- * {@code delayGenerator.getNextDelay()} depending on whether the {@code delayGenerator} is null
- * or not.
- */
-
- public RecurringTask(String name, Scheduler scheduler, Logger logger, Smearer smearer,
- TiclExponentialBackoffDelayGenerator delayGenerator,
- final int initialDelayMs, final int timeoutDelayMs) {
- this.delayGenerator = delayGenerator;
- this.name = Preconditions.checkNotNull(name);
- this.logger = Preconditions.checkNotNull(logger);
- this.scheduler = Preconditions.checkNotNull(scheduler);
- this.smearer = Preconditions.checkNotNull(smearer);
- this.initialDelayMs = initialDelayMs;
- this.isScheduled = false;
- this.timeoutDelayMs = timeoutDelayMs;
-
- // Create a runnable that runs the task. If the task asks for a retry, reschedule it after
- // at a timeout delay. Otherwise, resets the delayGenerator.
- this.runnable = createRunnable();
- }
-
- /**
- * Creates a recurring task from {@code marshalledState}. Other parameters are as in the
- * constructor above.
- */
- RecurringTask(String name, Scheduler scheduler, Logger logger, Smearer smearer,
- TiclExponentialBackoffDelayGenerator delayGenerator,
- RecurringTaskState marshalledState) {
- this(name, scheduler, logger, smearer, delayGenerator, marshalledState.getInitialDelayMs(),
- marshalledState.getTimeoutDelayMs());
- this.isScheduled = marshalledState.getScheduled();
- }
-
- private NamedRunnable createRunnable() {
- return new NamedRunnable(name) {
- @Override
- public void run() {
- Preconditions.checkState(scheduler.isRunningOnThread(), "Not on scheduler thread");
- isScheduled = false;
- if (runTask()) {
- // The task asked to be rescheduled, so reschedule it after a timeout has occured.
- Preconditions.checkState((delayGenerator != null) || (initialDelayMs != 0),
- "Spinning: No exp back off and initialdelay is zero");
- ensureScheduled(true, "Retry");
- } else if (delayGenerator != null) {
- // The task asked not to be rescheduled. Treat it as having "succeeded" and reset the
- // delay generator.
- delayGenerator.reset();
- }
- }
- };
- }
-
- /**
- * Run the task and return true if the task should be rescheduled after a timeout. If false is
- * returned, the task is not scheduled again until {@code ensureScheduled} is called again.
- */
- public abstract boolean runTask();
-
- /** Returns the smearer used for randomizing delays. */
- Smearer getSmearer() {
- return smearer;
- }
-
- /** Returns the delay generator, if any. */
- ExponentialBackoffDelayGenerator getDelayGenerator() {
- return delayGenerator;
- }
-
- /**
- * Ensures that the task is scheduled (with {@code debugReason} as the reason to be printed
- * for debugging purposes). If the task has been scheduled, it is not scheduled again.
- * <p>
- * REQUIRES: Must be called from the scheduler thread.
- */
-
- public void ensureScheduled(String debugReason) {
- ensureScheduled(false, debugReason);
- }
-
- /**
- * Ensures that the task is scheduled if it is already not scheduled. If already scheduled, this
- * method is a no-op.
- *
- * @param isRetry If this is {@code false}, smears the {@code initialDelayMs} and uses that delay
- * for scheduling. If {@code isRetry} is true, it determines the new delay to be
- * {@code timeoutDelayMs} + {@ocde delayGenerator.getNextDelay()} if
- * {@code delayGenerator} is non-null. If {@code delayGenerator} is null, schedules the
- * task after a delay of {@code timeoutDelayMs} + smeared value of {@code initialDelayMs}
- * <p>
- * REQUIRES: Must be called from the scheduler thread.
- */
- private void ensureScheduled(boolean isRetry, String debugReason) {
- Preconditions.checkState(scheduler.isRunningOnThread());
- if (isScheduled) {
- return;
- }
- final int delayMs;
-
- if (isRetry) {
- // For a retried task, determine the delay to be timeout + extra delay (depending on whether
- // a delay generator was provided or not).
- if (delayGenerator != null) {
- delayMs = timeoutDelayMs + delayGenerator.getNextDelay();
- } else {
- delayMs = timeoutDelayMs + smearer.getSmearedDelay(initialDelayMs);
- }
- } else {
- delayMs = smearer.getSmearedDelay(initialDelayMs);
- }
-
- logger.fine("[%s] Scheduling %s with a delay %s, Now = %s", debugReason, name, delayMs,
- scheduler.getCurrentTimeMs());
- scheduler.schedule(delayMs, runnable);
- isScheduled = true;
- }
-
- /** For use only in the Android scheduler. */
- public NamedRunnable getRunnable() {
- return runnable;
- }
-
- @Override
- public RecurringTaskState marshal() {
- ExponentialBackoffState backoffState =
- (delayGenerator == null) ? null : delayGenerator.marshal();
- return RecurringTaskState.create(initialDelayMs, timeoutDelayMs, isScheduled, backoffState);
- }
-
- @Override
- public void toCompactString(TextBuilder builder) {
- builder.append("<RecurringTask: name=").append(name)
- .append(", initialDelayMs=").append(initialDelayMs)
- .append(", timeoutDelayMs=").append(timeoutDelayMs)
- .append(", isScheduled=").append(isScheduled)
- .append(">");
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/RegistrationManager.java b/java/com/google/ipc/invalidation/ticl/RegistrationManager.java
deleted file mode 100644
index e985295..0000000
--- a/java/com/google/ipc/invalidation/ticl/RegistrationManager.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.ticl;
-
-import com.google.ipc.invalidation.common.DigestFunction;
-import com.google.ipc.invalidation.external.client.SystemResources.Logger;
-import com.google.ipc.invalidation.ticl.Statistics.ClientErrorType;
-import com.google.ipc.invalidation.ticl.TestableInvalidationClient.RegistrationManagerState;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationP.OpType;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationStatus;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSubtree;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSummary;
-import com.google.ipc.invalidation.ticl.proto.CommonProtos;
-import com.google.ipc.invalidation.ticl.proto.JavaClient.RegistrationManagerStateP;
-import com.google.ipc.invalidation.util.Bytes;
-import com.google.ipc.invalidation.util.InternalBase;
-import com.google.ipc.invalidation.util.Marshallable;
-import com.google.ipc.invalidation.util.TextBuilder;
-import com.google.ipc.invalidation.util.TypedUtil;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-
-/**
- * Object to track desired client registrations. This class belongs to caller (e.g.,
- * InvalidationClientImpl) and is not thread-safe - the caller has to use this class in a
- * thread-safe manner.
- *
- */
-class RegistrationManager extends InternalBase implements Marshallable<RegistrationManagerStateP> {
-
- /** Prefix used to request all registrations. */
- static final byte[] EMPTY_PREFIX = new byte[]{};
-
- /** The set of regisrations that the application has requested for. */
- private DigestStore<ObjectIdP> desiredRegistrations;
-
- /** Statistics objects to track number of sent messages, etc. */
- private final Statistics statistics;
-
- /** Latest known server registration state summary. */
- private RegistrationSummary lastKnownServerSummary;
-
- /**
- * Map of object ids and operation types for which we have not yet issued any registration-status
- * upcall to the listener. We need this so that we can synthesize success upcalls if registration
- * sync, rather than a server message, communicates to us that we have a successful
- * (un)registration.
- * <p>
- * This is a map from object id to type, rather than a set of {@code RegistrationP}, because
- * a set of {@code RegistrationP} would assume that we always get a response for every operation
- * we issue, which isn't necessarily true (i.e., the server might send back an unregistration
- * status in response to a registration request).
- */
- private final Map<ObjectIdP, Integer> pendingOperations = new HashMap<ObjectIdP, Integer>();
-
- private final Logger logger;
-
- public RegistrationManager(Logger logger, Statistics statistics, DigestFunction digestFn,
- RegistrationManagerStateP registrationManagerState) {
- this.logger = logger;
- this.statistics = statistics;
- this.desiredRegistrations = new SimpleRegistrationStore(digestFn);
-
- if (registrationManagerState == null) {
- // Initialize the server summary with a 0 size and the digest corresponding
- // to it. Using defaultInstance would wrong since the server digest will
- // not match unnecessarily and result in an info message being sent.
- this.lastKnownServerSummary = getRegistrationSummary();
- } else {
- this.lastKnownServerSummary = registrationManagerState.getNullableLastKnownServerSummary();
- if (this.lastKnownServerSummary == null) {
- // If no server summary is set, use a default with size 0.
- this.lastKnownServerSummary = getRegistrationSummary();
- }
- desiredRegistrations.add(registrationManagerState.getRegistrations());
- for (RegistrationP regOp : registrationManagerState.getPendingOperations()) {
- pendingOperations.put(regOp.getObjectId(), regOp.getOpType());
- }
- }
- }
-
- /**
- * Returns a copy of the registration manager's state
- * <p>
- * Direct test code MUST not call this method on a random thread. It must be called on the
- * InvalidationClientImpl's internal thread.
- */
-
- RegistrationManagerState getRegistrationManagerStateCopyForTest() {
- List<ObjectIdP> registeredObjects = new ArrayList<ObjectIdP>();
- registeredObjects.addAll(desiredRegistrations.getElements(EMPTY_PREFIX, 0));
- return new RegistrationManagerState(getRegistrationSummary(), lastKnownServerSummary,
- registeredObjects);
- }
-
- /**
- * Sets the digest store to be {@code digestStore} for testing purposes.
- * <p>
- * REQUIRES: This method is called before the Ticl has done any operations on this object.
- */
-
- void setDigestStoreForTest(DigestStore<ObjectIdP> digestStore) {
- this.desiredRegistrations = digestStore;
- this.lastKnownServerSummary = getRegistrationSummary();
- }
-
- /** Perform registration/unregistation for all objects in {@code objectIds}. */
- Collection<ObjectIdP> performOperations(Collection<ObjectIdP> objectIds, int regOpType) {
- // Record that we have pending operations on the objects.
- for (ObjectIdP objectId : objectIds) {
- pendingOperations.put(objectId, regOpType);
- }
- // Update the digest appropriately.
- if (regOpType == RegistrationP.OpType.REGISTER) {
- return desiredRegistrations.add(objectIds);
- } else {
- return desiredRegistrations.remove(objectIds);
- }
- }
-
- /**
- * Returns a registration subtree for registrations where the digest of the object id begins with
- * the prefix {@code digestPrefix} of {@code prefixLen} bits. This method may also return objects
- * whose digest prefix does not match {@code digestPrefix}.
- */
- RegistrationSubtree getRegistrations(byte[] digestPrefix, int prefixLen) {
- return RegistrationSubtree.create(desiredRegistrations.getElements(digestPrefix, prefixLen));
- }
-
- /**
- * Handles registration operation statuses from the server. Returns a list of booleans, one per
- * registration status, that indicates whether the registration operation was both successful and
- * agreed with the desired client state (i.e., for each registration status,
- * (status.optype == register) == desiredRegistrations.contains(status.objectid)).
- * <p>
- * REQUIRES: the caller subsequently make an informRegistrationStatus or informRegistrationFailure
- * upcall on the listener for each registration in {@code registrationStatuses}.
- */
- List<Boolean> handleRegistrationStatus(List<RegistrationStatus> registrationStatuses) {
- // Local-processing result code for each element of registrationStatuses.
- List<Boolean> localStatuses = new ArrayList<Boolean>(registrationStatuses.size());
- for (RegistrationStatus registrationStatus : registrationStatuses) {
- ObjectIdP objectIdProto = registrationStatus.getRegistration().getObjectId();
-
- // The object is no longer pending, since we have received a server status for it, so
- // remove it from the pendingOperations map. (It may or may not have existed in the map,
- // since we can receive spontaneous status messages from the server.)
- TypedUtil.remove(pendingOperations, objectIdProto);
-
- // We start off with the local-processing set as success, then potentially fail.
- boolean isSuccess = true;
-
- // if the server operation succeeded, then local processing fails on "incompatibility" as
- // defined above.
- if (CommonProtos.isSuccess(registrationStatus.getStatus())) {
- boolean appWantsRegistration = desiredRegistrations.contains(objectIdProto);
- boolean isOpRegistration =
- registrationStatus.getRegistration().getOpType() == RegistrationP.OpType.REGISTER;
- boolean discrepancyExists = isOpRegistration ^ appWantsRegistration;
- if (discrepancyExists) {
- // Remove the registration and set isSuccess to false, which will cause the caller to
- // issue registration-failure to the application.
- desiredRegistrations.remove(objectIdProto);
- statistics.recordError(ClientErrorType.REGISTRATION_DISCREPANCY);
- logger.info("Ticl discrepancy detected: registered = %s, requested = %s. " +
- "Removing %s from requested",
- isOpRegistration, appWantsRegistration, objectIdProto);
- isSuccess = false;
- }
- } else {
- // If the server operation failed, then also local processing fails.
- desiredRegistrations.remove(objectIdProto);
- logger.fine("Removing %s from committed", objectIdProto);
- isSuccess = false;
- }
- localStatuses.add(isSuccess);
- }
- return localStatuses;
- }
-
- /**
- * Removes all desired registrations and pending operations. Returns all object ids
- * that were affected.
- * <p>
- * REQUIRES: the caller issue a permanent failure upcall to the listener for all returned object
- * ids.
- */
- Collection<ObjectIdP> removeRegisteredObjects() {
- int numObjects = desiredRegistrations.size() + pendingOperations.size();
- Set<ObjectIdP> failureCalls = new HashSet<ObjectIdP>(numObjects);
- failureCalls.addAll(desiredRegistrations.removeAll());
- failureCalls.addAll(pendingOperations.keySet());
- pendingOperations.clear();
- return failureCalls;
- }
-
- //
- // Digest-related methods
- //
-
- /** Returns a summary of the desired registrations. */
- RegistrationSummary getRegistrationSummary() {
- return RegistrationSummary.create(desiredRegistrations.size(),
- new Bytes(desiredRegistrations.getDigest()));
- }
-
- /**
- * Informs the manager of a new registration state summary from the server.
- * Returns a possibly-empty map of <object-id, reg-op-type>. For each entry in the map,
- * the caller should make an inform-registration-status upcall on the listener.
- */
- Set<RegistrationP> informServerRegistrationSummary(
- RegistrationSummary regSummary) {
- if (regSummary != null) {
- this.lastKnownServerSummary = regSummary;
- }
- if (isStateInSyncWithServer()) {
- // If we are now in sync with the server, then the caller should make inform-reg-status
- // upcalls for all operations that we had pending, if any; they are also no longer pending.
- Set<RegistrationP> upcallsToMake = new HashSet<RegistrationP>(pendingOperations.size());
- for (Map.Entry<ObjectIdP, Integer> entry : pendingOperations.entrySet()) {
- ObjectIdP objectId = entry.getKey();
- boolean isReg = entry.getValue() == OpType.REGISTER;
- upcallsToMake.add(CommonProtos.newRegistrationP(objectId, isReg));
- }
- pendingOperations.clear();
- return upcallsToMake;
- } else {
- // If we are not in sync with the server, then the caller should make no upcalls.
- return Collections.emptySet();
- }
- }
-
- /**
- * Returns whether the local registration state and server state agree, based on the last
- * received server summary (from {@link #informServerRegistrationSummary}).
- */
- boolean isStateInSyncWithServer() {
- return TypedUtil.<RegistrationSummary>equals(lastKnownServerSummary, getRegistrationSummary());
- }
-
- @Override
- public void toCompactString(TextBuilder builder) {
- builder.appendFormat("Last known digest: %s, Requested regs: %s", lastKnownServerSummary,
- desiredRegistrations);
- }
-
- @Override
- public RegistrationManagerStateP marshal() {
- List<ObjectIdP> desiredRegistrations =
- new ArrayList<ObjectIdP>(this.desiredRegistrations.getElements(EMPTY_PREFIX, 0));
- List<RegistrationP> pendingOperations =
- new ArrayList<RegistrationP>(this.pendingOperations.size());
- for (Map.Entry<ObjectIdP, Integer> entry : this.pendingOperations.entrySet()) {
- pendingOperations.add(RegistrationP.create(entry.getKey(), entry.getValue()));
- }
- return RegistrationManagerStateP.create(desiredRegistrations, lastKnownServerSummary,
- pendingOperations);
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/RunState.java b/java/com/google/ipc/invalidation/ticl/RunState.java
deleted file mode 100644
index 6e022b0..0000000
--- a/java/com/google/ipc/invalidation/ticl/RunState.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.ticl;
-
-import com.google.ipc.invalidation.ticl.proto.Client.RunStateP;
-import com.google.ipc.invalidation.util.Marshallable;
-
-/**
- * An abstraction that keeps track of whether the caller is started or stopped and only allows
- * the following transitions NOT_STARTED -> STARTED -> STOPPED. This class is thread-safe.
- *
- */
-public class RunState implements Marshallable<RunStateP> {
- /** Current run state ({@link RunStateP}). */
- private Integer currentState;
- private Object lock = new Object();
-
- /** Constructs a new instance in the {@code NOT_STARTED} state. */
- public RunState() {
- currentState = RunStateP.State.NOT_STARTED;
- }
-
- /** Constructs a new instance with the state given in {@code runState}. */
- RunState(RunStateP runState) {
- this.currentState = runState.getState();
- }
-
- /**
- * Marks the current state to be STARTED.
- * <p>
- * REQUIRES: Current state is NOT_STARTED.
- */
- public void start() {
- synchronized (lock) {
- if (currentState != RunStateP.State.NOT_STARTED) {
- throw new IllegalStateException("Cannot start: " + currentState);
- }
- currentState = RunStateP.State.STARTED;
- }
- }
-
- /**
- * Marks the current state to be STOPPED.
- * <p>
- * REQUIRES: Current state is STARTED.
- */
- public void stop() {
- synchronized (lock) {
- if (currentState != RunStateP.State.STARTED) {
- throw new IllegalStateException("Cannot stop: " + currentState);
- }
- currentState = RunStateP.State.STOPPED;
- }
- }
-
- /**
- * Returns true iff {@link #start} has been called on this but {@link #stop} has not been called.
- */
- public boolean isStarted() {
- synchronized (lock) {
- return currentState == RunStateP.State.STARTED;
- }
- }
-
- /** Returns true iff {@link #start} and {@link #stop} have been called on this object. */
- public boolean isStopped() {
- synchronized (lock) {
- return currentState == RunStateP.State.STOPPED;
- }
- }
-
- @Override
- public RunStateP marshal() {
- return RunStateP.create(currentState);
- }
-
- @Override
- public String toString() {
- return "<RunState: " + currentState + ">";
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/SafeStorage.java b/java/com/google/ipc/invalidation/ticl/SafeStorage.java
deleted file mode 100644
index 55d754a..0000000
--- a/java/com/google/ipc/invalidation/ticl/SafeStorage.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.ticl;
-
-import static com.google.ipc.invalidation.external.client.SystemResources.Scheduler.NO_DELAY;
-
-import com.google.ipc.invalidation.external.client.SystemResources;
-import com.google.ipc.invalidation.external.client.SystemResources.Scheduler;
-import com.google.ipc.invalidation.external.client.SystemResources.Storage;
-import com.google.ipc.invalidation.external.client.types.Callback;
-import com.google.ipc.invalidation.external.client.types.SimplePair;
-import com.google.ipc.invalidation.external.client.types.Status;
-import com.google.ipc.invalidation.util.NamedRunnable;
-import com.google.ipc.invalidation.util.Preconditions;
-
-/**
- * An implementation of the Storage resource that schedules the callbacks on the given scheduler
- * thread.
- *
- */
-public class SafeStorage implements Storage {
-
- /** The delegate to which the calls are forwarded. */
- private final Storage delegate;
-
- /** The scheduler on which the callbacks are scheduled. */
- private Scheduler scheduler;
-
- SafeStorage(Storage delegate) {
- this.delegate = Preconditions.checkNotNull(delegate);
- }
-
- @Override
- public void setSystemResources(SystemResources resources) {
- this.scheduler = resources.getInternalScheduler();
- }
-
- @Override
- public void writeKey(String key, byte[] value, final Callback<Status> done) {
- delegate.writeKey(key, value, new Callback<Status>() {
- @Override
- public void accept(final Status status) {
- scheduler.schedule(NO_DELAY, new NamedRunnable("SafeStorage.writeKey") {
- @Override
- public void run() {
- done.accept(status);
- }
- });
- }
- });
- }
-
- @Override
- public void readKey(String key, final Callback<SimplePair<Status, byte[]>> done) {
- delegate.readKey(key, new Callback<SimplePair<Status, byte[]>>() {
- @Override
- public void accept(final SimplePair<Status, byte[]> result) {
- scheduler.schedule(NO_DELAY, new NamedRunnable("SafeStorage.readKey") {
- @Override
- public void run() {
- done.accept(result);
- }
- });
- }
- });
- }
-
- @Override
- public void deleteKey(String key, final Callback<Boolean> done) {
- delegate.deleteKey(key, new Callback<Boolean>() {
- @Override
- public void accept(final Boolean success) {
- scheduler.schedule(NO_DELAY, new NamedRunnable("SafeStorage.deleteKey") {
- @Override
- public void run() {
- done.accept(success);
- }
- });
- }
- });
- }
-
- @Override
- public void readAllKeys(final Callback<SimplePair<Status, String>> keyCallback) {
- delegate.readAllKeys(new Callback<SimplePair<Status, String>>() {
- @Override
- public void accept(final SimplePair<Status, String> keyResult) {
- scheduler.schedule(NO_DELAY, new NamedRunnable("SafeStorage.readAllKeys") {
- @Override
- public void run() {
- keyCallback.accept(keyResult);
- }
- });
- }
- });
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/SimpleRegistrationStore.java b/java/com/google/ipc/invalidation/ticl/SimpleRegistrationStore.java
deleted file mode 100644
index 3ecbef9..0000000
--- a/java/com/google/ipc/invalidation/ticl/SimpleRegistrationStore.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.ticl;
-
-import com.google.ipc.invalidation.common.DigestFunction;
-import com.google.ipc.invalidation.common.ObjectIdDigestUtils;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP;
-import com.google.ipc.invalidation.util.Bytes;
-import com.google.ipc.invalidation.util.InternalBase;
-import com.google.ipc.invalidation.util.TextBuilder;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.SortedMap;
-import java.util.TreeMap;
-
-/**
- * Simple, map-based implementation of {@link DigestStore}.
- *
- */
-class SimpleRegistrationStore extends InternalBase implements DigestStore<ObjectIdP> {
-
- /** All the registrations in the store mapped from the digest to the Object Id. */
- private final SortedMap<Bytes, ObjectIdP> registrations = new TreeMap<Bytes, ObjectIdP>();
-
- /** The function used to compute digests of objects. */
- private final DigestFunction digestFunction;
-
- /** The memoized digest of all objects in registrations. */
- private Bytes digest;
-
- SimpleRegistrationStore(DigestFunction digestFunction) {
- this.digestFunction = digestFunction;
- recomputeDigest();
- }
-
- @Override
- public boolean add(ObjectIdP oid) {
- if (registrations.put(ObjectIdDigestUtils.getDigest(oid.getSource(),
- oid.getName().getByteArray(), digestFunction), oid) == null) {
- recomputeDigest();
- return true;
- }
- return false;
- }
-
- @Override
- public Collection<ObjectIdP> add(Collection<ObjectIdP> oids) {
- Collection<ObjectIdP> addedOids = new ArrayList<ObjectIdP>();
- for (ObjectIdP oid : oids) {
- if (registrations.put(ObjectIdDigestUtils.getDigest(oid.getSource(),
- oid.getName().getByteArray(), digestFunction), oid) == null) {
- // There was no previous value, so this is a new item.
- addedOids.add(oid);
- }
- }
- if (!addedOids.isEmpty()) {
- // Only recompute the digest if we made changes.
- recomputeDigest();
- }
- return addedOids;
- }
-
- @Override
- public boolean remove(ObjectIdP oid) {
- if (registrations.remove(ObjectIdDigestUtils.getDigest(oid.getSource(),
- oid.getName().getByteArray(), digestFunction)) != null) {
- recomputeDigest();
- return true;
- }
- return false;
- }
-
- @Override
- public Collection<ObjectIdP> remove(Collection<ObjectIdP> oids) {
- Collection<ObjectIdP> removedOids = new ArrayList<ObjectIdP>();
- for (ObjectIdP oid : oids) {
- if (registrations.remove(ObjectIdDigestUtils.getDigest(oid.getSource(),
- oid.getName().getByteArray(), digestFunction)) != null) {
- removedOids.add(oid);
- }
- }
- if (!removedOids.isEmpty()) {
- // Only recompute the digest if we made changes.
- recomputeDigest();
- }
- return removedOids;
- }
-
- @Override
- public Collection<ObjectIdP> removeAll() {
- Collection<ObjectIdP> result = new ArrayList<ObjectIdP>(registrations.values());
- registrations.clear();
- recomputeDigest();
- return result;
- }
-
- @Override
- public boolean contains(ObjectIdP oid) {
- return registrations.containsKey(ObjectIdDigestUtils.getDigest(oid.getSource(),
- oid.getName().getByteArray(), digestFunction));
- }
-
- @Override
- public int size() {
- return registrations.size();
- }
-
- @Override
- public byte[] getDigest() {
- return digest.getByteArray();
- }
-
- @Override
- public Collection<ObjectIdP> getElements(byte[] oidDigestPrefix, int prefixLen) {
- // We always return all the registrations and let the Ticl sort it out.
- return registrations.values();
- }
-
- /** Recomputes the digests over all objects and sets {@code this.digest}. */
- private void recomputeDigest() {
- this.digest = ObjectIdDigestUtils.getDigest(registrations.keySet(), digestFunction);
- }
-
- @Override
- public void toCompactString(TextBuilder builder) {
- builder
- .append("<SimpleRegistrationStore: registrations=")
- .append(registrations.values())
- .append(", digest=")
- .append(digest)
- .append(">");
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/Statistics.java b/java/com/google/ipc/invalidation/ticl/Statistics.java
deleted file mode 100644
index 899955e..0000000
--- a/java/com/google/ipc/invalidation/ticl/Statistics.java
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.ticl;
-
-import com.google.ipc.invalidation.external.client.SystemResources.Logger;
-import com.google.ipc.invalidation.external.client.types.SimplePair;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.PropertyRecord;
-import com.google.ipc.invalidation.ticl.proto.JavaClient.StatisticsState;
-import com.google.ipc.invalidation.util.InternalBase;
-import com.google.ipc.invalidation.util.Marshallable;
-import com.google.ipc.invalidation.util.TextBuilder;
-import com.google.ipc.invalidation.util.TypedUtil;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Statistics for the Ticl, e.g., number of registration calls, number of token mismatches, etc.
- *
- */
-public class Statistics extends InternalBase implements Marshallable<StatisticsState> {
-
- // Implementation: To classify the statistics a bit better, we have a few enums to track different
- // types of statistics, e.g., sent message types, errors, etc. For each statistic type, we create
- // a map and provide a method to record an event for each type of statistic.
-
- /** Types of messages sent to the server: {@code ClientToServerMessage} for their description. */
- public enum SentMessageType {
- INFO,
- INITIALIZE,
- INVALIDATION_ACK,
- REGISTRATION,
- REGISTRATION_SYNC,
- TOTAL, // Refers to the actual ClientToServerMessage message sent on the network.
- }
-
- /**
- * Types of messages received from the server: {@code ServerToClientMessage} for their
- * description.
- */
- public enum ReceivedMessageType {
- INFO_REQUEST,
- INVALIDATION,
- REGISTRATION_STATUS,
- REGISTRATION_SYNC_REQUEST,
- TOKEN_CONTROL,
- ERROR,
- CONFIG_CHANGE,
- STALE_INVALIDATION, // An already acked INVALIDATION.
- TOTAL, // Refers to the actual ServerToClientMessage messages received from the network.
- }
-
- /** Interesting API calls coming from the application ({@code InvalidationClient}). */
- public enum IncomingOperationType {
- ACKNOWLEDGE,
- REGISTRATION,
- UNREGISTRATION,
- }
-
- /** Different types of events issued by the {@code InvalidationListener}). */
- public enum ListenerEventType {
- INFORM_ERROR,
- INFORM_REGISTRATION_FAILURE,
- INFORM_REGISTRATION_STATUS,
- INVALIDATE,
- INVALIDATE_ALL,
- INVALIDATE_UNKNOWN,
- REISSUE_REGISTRATIONS,
- }
-
- /** Different types of errors observed by the Ticl. */
- public enum ClientErrorType {
- /** Acknowledge call received from client with a bad handle. */
- ACKNOWLEDGE_HANDLE_FAILURE,
-
- /** Incoming message dropped due to parsing, validation problems. */
- INCOMING_MESSAGE_FAILURE,
-
- /** Tried to send an outgoing message that was invalid. */
- OUTGOING_MESSAGE_FAILURE,
-
- /** Persistent state failed to deserialize correctly. */
- PERSISTENT_DESERIALIZATION_FAILURE,
-
- /** Read of blob from persistent state failed. */
- PERSISTENT_READ_FAILURE,
-
- /** Write of blob from persistent state failed. */
- PERSISTENT_WRITE_FAILURE,
-
- /** Message received with incompatible protocol version. */
- PROTOCOL_VERSION_FAILURE,
-
- /**
- * Registration at client and server is different, e.g., client thinks it is registered while
- * the server says it is unregistered (of course, sync will fix it).
- */
- REGISTRATION_DISCREPANCY,
-
- /** The nonce from the server did not match the current nonce by the client. */
- NONCE_MISMATCH,
-
- /** The current token at the client is different from the token in the incoming message. */
- TOKEN_MISMATCH,
-
- /** No message sent due to token missing. */
- TOKEN_MISSING_FAILURE,
-
- /** Received a message with a token (transient) failure. */
- TOKEN_TRANSIENT_FAILURE,
- }
-
- // Names of statistics types. Do not rely on reflection to determine type names because Proguard
- // may change them for Android clients.
- private static final String SENT_MESSAGE_TYPE_NAME = "SentMessageType";
- private static final String INCOMING_OPERATION_TYPE_NAME = "IncomingOperationType";
- private static final String RECEIVED_MESSAGE_TYPE_NAME = "ReceivedMessageType";
- private static final String LISTENER_EVENT_TYPE_NAME = "ListenerEventType";
- private static final String CLIENT_ERROR_TYPE_NAME = "ClientErrorType";
-
- // Map from stats enum names to values. Used in place of Enum.valueOf() because this method
- // invokes Enum.values() via reflection, and that method may be renamed by Proguard.
- private static final Map<String, SentMessageType> SENT_MESSAGE_TYPE_NAME_TO_VALUE_MAP =
- createValueOfMap(SentMessageType.values());
- private static final Map<String, IncomingOperationType>
- INCOMING_OPERATION_TYPE_NAME_TO_VALUE_MAP = createValueOfMap(IncomingOperationType.values());
- private static final Map<String, ReceivedMessageType> RECEIVED_MESSAGE_TYPE_NAME_TO_VALUE_MAP =
- createValueOfMap(ReceivedMessageType.values());
- private static final Map<String, ListenerEventType> LISTENER_EVENT_TYPE_NAME_TO_VALUE_MAP =
- createValueOfMap(ListenerEventType.values());
- private static final Map<String, ClientErrorType> CLIENT_ERROR_TYPE_NAME_TO_VALUE_MAP =
- createValueOfMap(ClientErrorType.values());
-
- // Maps for each type of Statistic to keep track of how many times each event has occurred.
-
- private final Map<SentMessageType, Integer> sentMessageTypes =
- new HashMap<SentMessageType, Integer>();
- private final Map<ReceivedMessageType, Integer> receivedMessageTypes =
- new HashMap<ReceivedMessageType, Integer>();
- private final Map<IncomingOperationType, Integer> incomingOperationTypes =
- new HashMap<IncomingOperationType, Integer>();
- private final Map<ListenerEventType, Integer> listenerEventTypes =
- new HashMap<ListenerEventType, Integer>();
- private final Map<ClientErrorType, Integer> clientErrorTypes =
- new HashMap<ClientErrorType, Integer>();
-
- public Statistics() {
- initializeMap(sentMessageTypes, SentMessageType.values());
- initializeMap(receivedMessageTypes, ReceivedMessageType.values());
- initializeMap(incomingOperationTypes, IncomingOperationType.values());
- initializeMap(listenerEventTypes, ListenerEventType.values());
- initializeMap(clientErrorTypes, ClientErrorType.values());
- }
-
- /** Returns a copy of this. */
- public Statistics getCopyForTest() {
- Statistics statistics = new Statistics();
- statistics.sentMessageTypes.putAll(sentMessageTypes);
- statistics.receivedMessageTypes.putAll(receivedMessageTypes);
- statistics.incomingOperationTypes.putAll(incomingOperationTypes);
- statistics.listenerEventTypes.putAll(listenerEventTypes);
- statistics.clientErrorTypes.putAll(clientErrorTypes);
- return statistics;
- }
-
- /** Returns the counter value for {@code clientErrorType}. */
- int getClientErrorCounterForTest(ClientErrorType clientErrorType) {
- return TypedUtil.mapGet(clientErrorTypes, clientErrorType);
- }
-
- /** Returns the counter value for {@code sentMessageType}. */
- int getSentMessageCounterForTest(SentMessageType sentMessageType) {
- return TypedUtil.mapGet(sentMessageTypes, sentMessageType);
- }
-
- /** Returns the counter value for {@code receivedMessageType}. */
- int getReceivedMessageCounterForTest(ReceivedMessageType receivedMessageType) {
- return TypedUtil.mapGet(receivedMessageTypes, receivedMessageType);
- }
-
- /** Records the fact that a message of type {@code sentMessageType} has been sent. */
- public void recordSentMessage(SentMessageType sentMessageType) {
- incrementValue(sentMessageTypes, sentMessageType);
- }
-
- /** Records the fact that a message of type {@code receivedMessageType} has been received. */
- public void recordReceivedMessage(ReceivedMessageType receivedMessageType) {
- incrementValue(receivedMessageTypes, receivedMessageType);
- }
-
- /**
- * Records the fact that the application has made a call of type
- * {@code incomingOperationType}.
- */
- public void recordIncomingOperation(IncomingOperationType incomingOperationType) {
- incrementValue(incomingOperationTypes, incomingOperationType);
- }
-
- /** Records the fact that the listener has issued an event of type {@code listenerEventType}. */
- public void recordListenerEvent(ListenerEventType listenerEventType) {
- incrementValue(listenerEventTypes, listenerEventType);
- }
-
- /** Records the fact that the client has observed an error of type {@code clientErrorType}. */
- public void recordError(ClientErrorType clientErrorType) {
- incrementValue(clientErrorTypes, clientErrorType);
- }
-
- /**
- * Modifies {@code performanceCounters} to contain all the statistics that are non-zero. Each pair
- * has the name of the statistic event and the number of times that event has occurred since the
- * client started.
- */
- public void getNonZeroStatistics(List<SimplePair<String, Integer>> performanceCounters) {
- // Add the non-zero values from the different maps to performanceCounters.
- fillWithNonZeroStatistics(sentMessageTypes, performanceCounters, SENT_MESSAGE_TYPE_NAME);
- fillWithNonZeroStatistics(receivedMessageTypes, performanceCounters,
- RECEIVED_MESSAGE_TYPE_NAME);
- fillWithNonZeroStatistics(incomingOperationTypes, performanceCounters,
- INCOMING_OPERATION_TYPE_NAME);
- fillWithNonZeroStatistics(listenerEventTypes, performanceCounters, LISTENER_EVENT_TYPE_NAME);
- fillWithNonZeroStatistics(clientErrorTypes, performanceCounters, CLIENT_ERROR_TYPE_NAME);
- }
-
- /** Modifies {@code result} to contain those statistics from {@code map} whose value is > 0. */
- private static <Key extends Enum<Key>> void fillWithNonZeroStatistics(Map<Key, Integer> map,
- List<SimplePair<String, Integer>> destination, String typeName) {
- String prefix = typeName + ".";
- for (Map.Entry<Key, Integer> entry : map.entrySet()) {
- if (entry.getValue() > 0) {
- destination.add(SimplePair.of(prefix + entry.getKey().name(), entry.getValue()));
- }
- }
- }
-
- /** Initializes a map from enum names to values of the given {@code keys}. */
- private static <Key extends Enum<Key>> Map<String, Key> createValueOfMap(Key[] keys) {
- HashMap<String, Key> map = new HashMap<String, Key>();
- for (Key key : keys) {
- map.put(key.name(), key);
- }
- return map;
- }
-
- /** Increments the value of {@code map}[{@code key}] by 1. */
- private static <Key> void incrementValue(Map<Key, Integer> map, Key key) {
- map.put(key, TypedUtil.mapGet(map, key) + 1);
- }
-
- /** Initializes all values for {@code keys} in {@code map} to be 0. */
- private static <Key> void initializeMap(Map<Key, Integer> map, Key[] keys) {
- for (Key key : keys) {
- map.put(key, 0);
- }
- }
-
- @Override
- public void toCompactString(TextBuilder builder) {
- List<SimplePair<String, Integer>> nonZeroValues = new ArrayList<SimplePair<String, Integer>>();
- getNonZeroStatistics(nonZeroValues);
- builder.appendFormat("Client Statistics: %s\n", nonZeroValues);
- }
-
- @Override
- public StatisticsState marshal() {
- // Get all the non-zero counters, convert them to proto PropertyRecord messages, and return
- // a StatisticsState containing the records.
- List<SimplePair<String, Integer>> counters = new ArrayList<SimplePair<String, Integer>>();
- getNonZeroStatistics(counters);
- List<PropertyRecord> propertyRecords = new ArrayList<PropertyRecord>(counters.size());
- for (SimplePair<String, Integer> counter : counters) {
- propertyRecords.add(PropertyRecord.create(counter.getFirst(), counter.getSecond()));
- }
- return StatisticsState.create(propertyRecords);
- }
-
- /**
- * Given the serialized {@code performanceCounters} of the client statistics, returns a Statistics
- * object with the performance counter values from {@code performanceCounters}.
- */
-
- public static Statistics deserializeStatistics(Logger logger,
- Collection<PropertyRecord> performanceCounters) {
- Statistics statistics = new Statistics();
-
- // For each counter, parse out the counter name and value.
- for (PropertyRecord performanceCounter : performanceCounters) {
- String counterName = performanceCounter.getName();
- String[] parts = counterName.split("\\.");
- if (parts.length != 2) {
- logger.warning("Perf counter name must of form: class.value, skipping: %s", counterName);
- continue;
- }
- String className = parts[0];
- String fieldName = parts[1];
- int counterValue = performanceCounter.getValue();
-
- // Call the relevant method in a loop (i.e., depending on the type of the class).
- if (TypedUtil.<String>equals(className, SENT_MESSAGE_TYPE_NAME)) {
- incrementPerformanceCounterValue(logger, SENT_MESSAGE_TYPE_NAME_TO_VALUE_MAP,
- statistics.sentMessageTypes, fieldName, counterValue);
- } else if (TypedUtil.<String>equals(className, INCOMING_OPERATION_TYPE_NAME)) {
- incrementPerformanceCounterValue(logger, INCOMING_OPERATION_TYPE_NAME_TO_VALUE_MAP,
- statistics.incomingOperationTypes, fieldName, counterValue);
- } else if (TypedUtil.<String>equals(className, RECEIVED_MESSAGE_TYPE_NAME)) {
- incrementPerformanceCounterValue(logger, RECEIVED_MESSAGE_TYPE_NAME_TO_VALUE_MAP,
- statistics.receivedMessageTypes, fieldName, counterValue);
- } else if (TypedUtil.<String>equals(className, LISTENER_EVENT_TYPE_NAME)) {
- incrementPerformanceCounterValue(logger, LISTENER_EVENT_TYPE_NAME_TO_VALUE_MAP,
- statistics.listenerEventTypes, fieldName, counterValue);
- } else if (TypedUtil.<String>equals(className, CLIENT_ERROR_TYPE_NAME)) {
- incrementPerformanceCounterValue(logger, CLIENT_ERROR_TYPE_NAME_TO_VALUE_MAP,
- statistics.clientErrorTypes, fieldName, counterValue);
- } else {
- logger.warning("Skipping unknown enum class name %s", className);
- }
- }
- return statistics;
- }
-
- /**
- * Looks for an enum value with the given {@code fieldName} in {@code valueOfMap} and increments
- * the corresponding entry in {@code counts} by {@code counterValue}. Call to update statistics
- * for a single performance counter.
- */
- private static <Key extends Enum<Key>> void incrementPerformanceCounterValue(Logger logger,
- Map<String, Key> valueOfMap, Map<Key, Integer> counts, String fieldName, int counterValue) {
- Key type = TypedUtil.mapGet(valueOfMap, fieldName);
- if (type != null) {
- int currentValue = TypedUtil.mapGet(counts, type);
- counts.put(type, currentValue + counterValue);
- } else {
- logger.warning("Skipping unknown enum value name %s", fieldName);
- }
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/TestableInvalidationClient.java b/java/com/google/ipc/invalidation/ticl/TestableInvalidationClient.java
deleted file mode 100644
index 898c10b..0000000
--- a/java/com/google/ipc/invalidation/ticl/TestableInvalidationClient.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.ticl;
-
-import com.google.ipc.invalidation.common.DigestFunction;
-import com.google.ipc.invalidation.external.client.InvalidationClient;
-import com.google.ipc.invalidation.external.client.InvalidationListener;
-import com.google.ipc.invalidation.external.client.SystemResources;
-import com.google.ipc.invalidation.ticl.proto.ChannelCommon.NetworkEndpointId;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientConfigP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSummary;
-import com.google.ipc.invalidation.util.Bytes;
-import com.google.ipc.invalidation.util.InternalBase;
-import com.google.ipc.invalidation.util.Preconditions;
-import com.google.ipc.invalidation.util.TextBuilder;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-
-/**
- * An interface that exposes some extra methods for testing an invalidation client implementation.
- *
- */
-public interface TestableInvalidationClient extends InvalidationClient {
-
- /** The state of the registration manager exposed for testing. */
- public class RegistrationManagerState extends InternalBase {
-
- /** The registration summary of all objects registered by the client (known at the client). */
- private final RegistrationSummary clientSummary;
-
- /** The last known registration summary from the server. */
- private final RegistrationSummary serverSummary;
-
- /** The objects registered by the client (as known at the client). */
- private final Collection<ObjectIdP> registeredObjects;
-
- public RegistrationManagerState(RegistrationSummary clientSummary,
- RegistrationSummary serverSummary, ObjectIdP[] registeredObjects) {
- this(clientSummary, serverSummary, new ArrayList<ObjectIdP>(registeredObjects.length));
- for (ObjectIdP registeredObject : registeredObjects) {
- this.registeredObjects.add(registeredObject);
- }
- }
-
- public RegistrationManagerState(RegistrationSummary clientSummary,
- RegistrationSummary serverSummary, Collection<ObjectIdP> registeredObjects) {
- this.clientSummary = Preconditions.checkNotNull(clientSummary);
- this.serverSummary = Preconditions.checkNotNull(serverSummary);
- this.registeredObjects = Preconditions.checkNotNull(registeredObjects);
- }
-
- public RegistrationSummary getClientSummary() {
- return clientSummary;
- }
-
- public RegistrationSummary getServerSummary() {
- return serverSummary;
- }
-
- public Collection<ObjectIdP> getRegisteredObjects() {
- return registeredObjects;
- }
-
- @Override
- public void toCompactString(TextBuilder builder) {
- builder.append("<RegistrationManagerState: clientSummary=").append(clientSummary);
- builder.append(", serverSummary=").append(serverSummary);
- builder.append(", registeredObjects=<").append(registeredObjects).append(">");
- }
- }
-
- /** Returns whether the Ticl is started. */
- boolean isStartedForTest();
-
- /** Stops the system resources. */
- void stopResources();
-
- /** Returns the current time on the client. */
- long getResourcesTimeMs();
-
- /** Returns the client internal scheduler */
- SystemResources.Scheduler getInternalSchedulerForTest();
-
- /** Returns the client storage. */
- SystemResources.Storage getStorage();
-
- /** Returns a snapshot of the performance counters/statistics . */
- Statistics getStatisticsForTest();
-
- /** Returns the digest function used for computing digests for object registrations. */
- DigestFunction getDigestFunctionForTest();
-
- /**
- * Returns a copy of the registration manager's state
- * <p>
- * REQUIRES: This method is called on the internal scheduler.
- */
- RegistrationManagerState getRegistrationManagerStateCopyForTest();
-
- /**
- * Changes the existing delay for the network timeout delay in the operation scheduler to be
- * {@code delayMs}.
- */
- void changeNetworkTimeoutDelayForTest(int delayMs);
-
- /**
- * Changes the existing delay for the heartbeat delay in the operation scheduler to be
- * {@code delayMs}.
- */
- void changeHeartbeatDelayForTest(int delayMs);
-
- /**
- * Sets the digest store to be {@code digestStore} for testing purposes.
- * <p>
- * REQUIRES: This method is called before the Ticl has been started.
- */
- void setDigestStoreForTest(DigestStore<ObjectIdP> digestStore);
-
- /** Returns the client id that is used for squelching invalidations on the server side. */
- byte[] getApplicationClientIdForTest();
-
- /** Returns the listener that was registered by the caller. */
- InvalidationListener getInvalidationListenerForTest();
-
- /** Returns the current client token. */
- Bytes getClientTokenForTest();
-
- /** Returns the single key used to write all the Ticl state. */
- String getClientTokenKeyForTest();
-
- /** Returns the next time a message is allowed to be sent to the server (could be in the past). */
- long getNextMessageSendTimeMsForTest();
-
- /** Returns the configuration used by the client. */
- ClientConfigP getConfigForTest();
-
- /**
- * Returns the network endpoint id of the client. May throw {@code UnsupportedOperationException}.
- */
- NetworkEndpointId getNetworkIdForTest();
-}
diff --git a/java/com/google/ipc/invalidation/ticl/TestableNetworkChannel.java b/java/com/google/ipc/invalidation/ticl/TestableNetworkChannel.java
deleted file mode 100644
index 79cc662..0000000
--- a/java/com/google/ipc/invalidation/ticl/TestableNetworkChannel.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.ticl;
-
-import com.google.ipc.invalidation.external.client.SystemResources;
-import com.google.ipc.invalidation.ticl.proto.ChannelCommon.NetworkEndpointId;
-
-/**
- * Extension of {@link com.google.ipc.invalidation.external.client.SystemResources.NetworkChannel}
- * that adds a method to get the network endpoint id.
- *
- */
-public interface TestableNetworkChannel extends SystemResources.NetworkChannel {
- /**
- * Returns the network id for testing. May throw {@link UnsupportedOperationException}.
- */
- NetworkEndpointId getNetworkIdForTest();
-
-}
diff --git a/java/com/google/ipc/invalidation/ticl/TiclExponentialBackoffDelayGenerator.java b/java/com/google/ipc/invalidation/ticl/TiclExponentialBackoffDelayGenerator.java
deleted file mode 100644
index fd6d826..0000000
--- a/java/com/google/ipc/invalidation/ticl/TiclExponentialBackoffDelayGenerator.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.ipc.invalidation.ticl;
-
-import com.google.ipc.invalidation.ticl.proto.Client.ExponentialBackoffState;
-import com.google.ipc.invalidation.util.ExponentialBackoffDelayGenerator;
-import com.google.ipc.invalidation.util.Marshallable;
-
-import java.util.Random;
-
-/**
- * A subclass of {@link ExponentialBackoffDelayGenerator} that supports (un)marshalling to and from
- * protocol buffers.
- *
- */
-public class TiclExponentialBackoffDelayGenerator
- extends ExponentialBackoffDelayGenerator implements Marshallable<ExponentialBackoffState> {
-
- /**
- * Creates an exponential backoff delay generator. Parameters are as in
- * {@link ExponentialBackoffDelayGenerator#ExponentialBackoffDelayGenerator(Random, int, int)}.
- */
- public TiclExponentialBackoffDelayGenerator(Random random, int initialMaxDelay,
- int maxExponentialFactor) {
- super(random, initialMaxDelay, maxExponentialFactor);
- }
-
- /**
- * Restores a generator from {@code marshalledState}. Other parameters are as in
- * {@link ExponentialBackoffDelayGenerator#ExponentialBackoffDelayGenerator(Random, int, int)}.
- *
- * @param marshalledState marshalled state from which to restore.
- */
- public TiclExponentialBackoffDelayGenerator(Random random, int initialMaxDelay,
- int maxExponentialFactor, ExponentialBackoffState marshalledState) {
- super(random, initialMaxDelay, maxExponentialFactor, marshalledState.getCurrentMaxDelay(),
- marshalledState.getInRetryMode());
- }
-
- @Override
- public ExponentialBackoffState marshal() {
- return ExponentialBackoffState.create(getCurrentMaxDelay(), getInRetryMode());
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/android2/AndroidClock.java b/java/com/google/ipc/invalidation/ticl/android2/AndroidClock.java
deleted file mode 100644
index 84bd15f..0000000
--- a/java/com/google/ipc/invalidation/ticl/android2/AndroidClock.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.ticl.android2;
-
-/**
- * Interface for the Android Ticl that provides a source of time.
- *
- */
-public interface AndroidClock {
- /**
- * Implementation of {@code AndroidClock} that uses {@link System#currentTimeMillis()}.
- */
- static class SystemClock implements AndroidClock {
- @Override
- public long nowMs() {
- return System.currentTimeMillis();
- }
- }
-
- /** Returns milliseconds elapsed since the Unix epoch. */
- long nowMs();
-}
diff --git a/java/com/google/ipc/invalidation/ticl/android2/AndroidInternalScheduler.java b/java/com/google/ipc/invalidation/ticl/android2/AndroidInternalScheduler.java
deleted file mode 100644
index f867d6c..0000000
--- a/java/com/google/ipc/invalidation/ticl/android2/AndroidInternalScheduler.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.ticl.android2;
-
-import com.google.ipc.invalidation.external.client.SystemResources;
-import com.google.ipc.invalidation.external.client.SystemResources.Logger;
-import com.google.ipc.invalidation.external.client.SystemResources.Scheduler;
-import com.google.ipc.invalidation.ticl.RecurringTask;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.AndroidSchedulerEvent;
-import com.google.ipc.invalidation.util.NamedRunnable;
-import com.google.ipc.invalidation.util.Preconditions;
-import com.google.ipc.invalidation.util.TypedUtil;
-
-import android.app.AlarmManager;
-import android.app.PendingIntent;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-
-import java.util.HashMap;
-import java.util.Map;
-
-
-/**
- * Scheduler for controlling access to internal Ticl state in Android.
- * <p>
- * This class maintains a map from recurring task names to the recurring task instances in the
- * associated Ticl. To schedule a recurring task, it uses the {@link AlarmManager} to schedule
- * an intent to itself at the appropriate time in the future. This intent contains the name of
- * the task to run; when it is received, this class looks up the appropriate recurring task
- * instance and runs it.
- * <p>
- * Note that this class only supports scheduling recurring tasks, not ordinary runnables. In
- * order for it to be used, the application must declare the AlarmReceiver of the scheduler
- * in the application's manifest file; see the implementation comment in AlarmReceiver for
- * details.
- *
- */
-public final class AndroidInternalScheduler implements Scheduler {
- /** Class that receives AlarmManager broadcasts and reissues them as intents for this service. */
- public static final class AlarmReceiver extends BroadcastReceiver {
- /*
- * This class needs to be public so that it can be instantiated by the Android runtime.
- * Additionally, it should be declared as a broadcast receiver in the application manifest:
- * <receiver android:name="com.google.ipc.invalidation.ticl.android2.\
- * AndroidInternalScheduler$AlarmReceiver" android:enabled="true"/>
- */
-
- @Override
- public void onReceive(Context context, Intent intent) {
- // Resend the intent to the service so that it's processed on the handler thread and with
- // the automatic shutdown logic provided by IntentService.
- intent.setClassName(context, new AndroidTiclManifest(context).getTiclServiceClass());
- context.startService(intent);
- }
- }
-
- /**
- * If {@code true}, {@link #isRunningOnThread} will verify that calls are being made from either
- * the {@link TiclService} or the {@link TestableTiclService.TestableClient}.
- */
- public static boolean checkStackForTest = false;
-
- /** Class name of the testable client class, for checking call stacks in tests. */
- private static final String TESTABLE_CLIENT_CLASSNAME_FOR_TEST =
- "com.google.ipc.invalidation.ticl.android2.TestableTiclService$TestableClient";
-
- /**
- * {@link RecurringTask}-created runnables that can be executed by this instance, by their names.
- */
- private final Map<String, Runnable> registeredTasks = new HashMap<String, Runnable>();
-
- /** Android system context. */
- private final Context context;
-
- /** Source of time for computing scheduling delays. */
- private final AndroidClock clock;
-
- private Logger logger;
-
- /** Id of the Ticl for which this scheduler will process events. */
- private long ticlId = -1;
-
- AndroidInternalScheduler(Context context, AndroidClock clock) {
- this.context = Preconditions.checkNotNull(context);
- this.clock = Preconditions.checkNotNull(clock);
- }
-
- @Override
- public void setSystemResources(SystemResources resources) {
- this.logger = Preconditions.checkNotNull(resources.getLogger());
- }
-
- @Override
- public void schedule(int delayMs, Runnable runnable) {
- if (!(runnable instanceof NamedRunnable)) {
- throw new RuntimeException("Unsupported: can only schedule named runnables, not " + runnable);
- }
- // Create an intent that will cause the service to run the right recurring task. We explicitly
- // target it to our AlarmReceiver so that no other process in the system can receive it and so
- // that our AlarmReceiver will not be able to receive events from any other broadcaster (which
- // it would be if we used action-based targeting).
- String taskName = ((NamedRunnable) runnable).getName();
- Intent eventIntent = ProtocolIntents.newSchedulerIntent(taskName, ticlId);
- eventIntent.setClass(context, AlarmReceiver.class);
-
- // Create a pending intent that will cause the AlarmManager to fire the above intent.
- PendingIntent sender = PendingIntent.getBroadcast(context,
- (int) (Integer.MAX_VALUE * Math.random()), eventIntent, PendingIntent.FLAG_ONE_SHOT);
-
- // Schedule the pending intent after the appropriate delay.
- AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
- long executeMs = clock.nowMs() + delayMs;
- alarmManager.set(AlarmManager.RTC, executeMs, sender);
- }
-
- /**
- * Handles an event intent created in {@link #schedule} by running the corresponding recurring
- * task.
- * <p>
- * REQUIRES: a recurring task with the name in the intent be present in {@link #registeredTasks}.
- */
- void handleSchedulerEvent(AndroidSchedulerEvent event) {
- Runnable recurringTaskRunnable = TypedUtil.mapGet(registeredTasks, event.getEventName());
- if (recurringTaskRunnable == null) {
- throw new NullPointerException("No task registered for " + event.getEventName());
- }
- if (ticlId != event.getTiclId()) {
- logger.warning("Ignoring event with wrong ticl id (not %s): %s", ticlId, event);
- return;
- }
- recurringTaskRunnable.run();
- }
-
- /**
- * Registers {@code task} so that it can be subsequently run by the scheduler.
- * <p>
- * REQUIRES: no recurring task with the same name be already present in {@link #registeredTasks}.
- */
- void registerTask(String name, Runnable runnable) {
- Runnable previous = registeredTasks.put(name, runnable);
- if (previous != null) {
- String message = new StringBuilder()
- .append("Cannot overwrite task registered on ")
- .append(name)
- .append(", ")
- .append(this)
- .append("; tasks = ")
- .append(registeredTasks.keySet())
- .toString();
- throw new IllegalStateException(message);
- }
- }
-
- @Override
- public boolean isRunningOnThread() {
- if (!checkStackForTest) {
- return true;
- }
- // If requested, check that the current stack looks legitimate.
- for (StackTraceElement stackElement : Thread.currentThread().getStackTrace()) {
- if (stackElement.getMethodName().equals("onHandleIntent") &&
- stackElement.getClassName().contains("TiclService")) {
- // Called from the TiclService.
- return true;
- }
- if (stackElement.getClassName().equals(TESTABLE_CLIENT_CLASSNAME_FOR_TEST)) {
- // Called from the TestableClient.
- return true;
- }
- }
- return false;
- }
-
- @Override
- public long getCurrentTimeMs() {
- return clock.nowMs();
- }
-
- /** Removes the registered tasks. */
- void reset() {
- logger.fine("Clearing registered tasks on %s", this);
- registeredTasks.clear();
- }
-
- /**
- * Sets the id of the ticl for which this scheduler will process events. We do not know the
- * Ticl id until done constructing the Ticl, and we need the scheduler to construct a Ticl. This
- * method breaks what would otherwise be a dependency cycle on getting the Ticl id.
- */
- void setTiclId(long ticlId) {
- this.ticlId = ticlId;
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/android2/AndroidInvalidationClientImpl.java b/java/com/google/ipc/invalidation/ticl/android2/AndroidInvalidationClientImpl.java
deleted file mode 100644
index a6cecb1..0000000
--- a/java/com/google/ipc/invalidation/ticl/android2/AndroidInvalidationClientImpl.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.ipc.invalidation.ticl.android2;
-
-import com.google.ipc.invalidation.external.client.InvalidationClient;
-import com.google.ipc.invalidation.external.client.InvalidationListener;
-import com.google.ipc.invalidation.external.client.SystemResources;
-import com.google.ipc.invalidation.external.client.SystemResources.Logger;
-import com.google.ipc.invalidation.external.client.types.AckHandle;
-import com.google.ipc.invalidation.external.client.types.ErrorInfo;
-import com.google.ipc.invalidation.external.client.types.Invalidation;
-import com.google.ipc.invalidation.external.client.types.ObjectId;
-import com.google.ipc.invalidation.ticl.InvalidationClientCore;
-import com.google.ipc.invalidation.ticl.ProtoWrapperConverter;
-import com.google.ipc.invalidation.ticl.android2.ProtocolIntents.ListenerUpcalls;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.AndroidTiclState;
-import com.google.ipc.invalidation.ticl.proto.Client.AckHandleP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ApplicationClientIdP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientConfigP;
-import com.google.ipc.invalidation.util.Preconditions;
-import com.google.ipc.invalidation.util.ProtoWrapper.ValidationException;
-
-import android.app.Service;
-import android.content.Context;
-import android.content.Intent;
-
-import java.util.Arrays;
-import java.util.Map;
-import java.util.Random;
-
-
-/**
- * Android specialization of {@link InvalidationClientCore}. Configures the internal scheduler of
- * the provided resources with references to the recurring tasks in the Ticl and also provides
- * an {@link InvalidationListener} instance to the Ticl that will forward upcalls to the
- * actual application listener using {@link Intent}s.
- * <p>
- * This class requires that {@code SystemResources} {@code Storage} implementations be synchronous.
- * I.e., they must invoke their callbacks inline. We require this because it is very difficult
- * to handle asynchrony in an Android {@code IntentService}. Every async point requires marshalling
- * the Ticl state to disk. Additionally, we must be able to resume processing where we left off;
- * i.e., we must be able to (morally) save the value of the program counter. Intents, unlike Java
- * callbacks, do not implicitly save the PC value, so we need to manually encode it in Intent
- * data. This is extremely awkward, so we avoid asynchrony in the storage API.
- *
- */
-class AndroidInvalidationClientImpl extends InvalidationClientCore {
- /** Class implementing the application listener stub (allows overriding default for tests). */
- static Class<? extends Service> listenerServiceClassForTest = null;
-
- /**
- * {@link InvalidationListener} implementation that forwards all calls to a remote listener
- * using Android intents.
- */
- static class IntentForwardingListener implements InvalidationListener {
-
- /** Android system context. */
- private final Context context;
-
- /** Logger from Ticl resources. */
- private final Logger logger;
-
- IntentForwardingListener(Context context, Logger logger) {
- this.context = Preconditions.checkNotNull(context);
- this.logger = Preconditions.checkNotNull(logger);
- }
-
- // All calls are implemented by marshalling the arguments to an Intent and sending the Intent
- // to the application.
-
- @Override
- public void ready(InvalidationClient client) {
- issueIntent(context, ListenerUpcalls.newReadyIntent());
- }
-
- @Override
- public void invalidate(InvalidationClient client, Invalidation invalidation,
- AckHandle ackHandle) {
- try {
- AckHandleP ackHandleP = AckHandleP.parseFrom(ackHandle.getHandleData());
- issueIntent(context, ListenerUpcalls.newInvalidateIntent(
- ProtoWrapperConverter.convertToInvalidationProto(invalidation), ackHandleP));
- } catch (ValidationException exception) {
- // Log and drop invalid call.
- logBadAckHandle("invalidate", ackHandle);
- }
- }
-
- @Override
- public void invalidateUnknownVersion(InvalidationClient client, ObjectId objectId,
- AckHandle ackHandle) {
- try {
- AckHandleP ackHandleP = AckHandleP.parseFrom(ackHandle.getHandleData());
- issueIntent(context, ListenerUpcalls.newInvalidateUnknownIntent(
- ProtoWrapperConverter.convertToObjectIdProto(objectId), ackHandleP));
- } catch (ValidationException exception) {
- // Log and drop invalid call.
- logBadAckHandle("invalidateUnknownVersion", ackHandle);
- }
- }
-
- @Override
- public void invalidateAll(InvalidationClient client, AckHandle ackHandle) {
- try {
- AckHandleP ackHandleP = AckHandleP.parseFrom(ackHandle.getHandleData());
- issueIntent(context, ListenerUpcalls.newInvalidateAllIntent(ackHandleP));
- } catch (ValidationException exception) {
- // Log and drop invalid call.
- logBadAckHandle("invalidateAll", ackHandle);
- }
- }
-
- @Override
- public void informRegistrationStatus(
- InvalidationClient client, ObjectId objectId, RegistrationState regState) {
- Intent intent = ListenerUpcalls.newRegistrationStatusIntent(
- ProtoWrapperConverter.convertToObjectIdProto(objectId),
- regState == RegistrationState.REGISTERED);
- issueIntent(context, intent);
- }
-
- @Override
- public void informRegistrationFailure(InvalidationClient client, ObjectId objectId,
- boolean isTransient, String errorMessage) {
- issueIntent(context, ListenerUpcalls.newRegistrationFailureIntent(
- ProtoWrapperConverter.convertToObjectIdProto(objectId), isTransient, errorMessage));
- }
-
- @Override
- public void reissueRegistrations(InvalidationClient client, byte[] prefix, int prefixLength) {
- issueIntent(context, ListenerUpcalls.newReissueRegistrationsIntent(prefix, prefixLength));
- }
-
- @Override
- public void informError(InvalidationClient client, ErrorInfo errorInfo) {
- issueIntent(context, ListenerUpcalls.newErrorIntent(errorInfo));
- }
-
- /**
- * Sends {@code intent} to the real listener via the listener intent service class.
- */
- static void issueIntent(Context context, Intent intent) {
- intent.setClassName(context, (listenerServiceClassForTest != null) ?
- listenerServiceClassForTest.getName() :
- new AndroidTiclManifest(context).getListenerServiceClass());
- context.startService(intent);
- }
-
- /**
- * Logs a warning that a listener upcall to {@code method} has been dropped because
- * {@code unparseableHandle} could not be parsed.
- */
- private void logBadAckHandle(String method, AckHandle unparseableHandle) {
- logger.warning("Dropping call to %s; could not parse ack handle data %s",
- method, Arrays.toString(unparseableHandle.getHandleData()));
- }
- }
-
- /**
- * Unique identifier for this Ticl. This is used to ensure that scheduler intents for other Ticls
- * are not incorrectly delivered to this instance.
- */
- private final long schedulingId;
-
- /**
- * Creates a fresh instance.
- *
- * @param context Android system context
- * @param resources Ticl resources to use
- * @param random random number generator for the Ticl
- * @param clientType type of the Ticl
- * @param clientName unique application name for the Ticl
- * @param config configuration to use
- */
- AndroidInvalidationClientImpl(Context context, SystemResources resources, Random random,
- int clientType, byte[] clientName, ClientConfigP config) {
- super(resources, random, clientType, clientName, config, getApplicationName(context),
- new IntentForwardingListener(context, resources.getLogger()));
- this.schedulingId = resources.getInternalScheduler().getCurrentTimeMs();
- resources.getLogger().fine("Create new Ticl scheduling id: %s", schedulingId);
- initializeSchedulerWithRecurringTasks();
- }
-
- /**
- * Creates an instance with state restored from {@code marshalledState}. Other parameters are as
- * in {@link InvalidationClientCore}.
- */
- AndroidInvalidationClientImpl(Context context, SystemResources resources, Random random,
- AndroidTiclState marshalledState) {
- super(resources,
- random,
- marshalledState.getMetadata().getClientType(),
- marshalledState.getMetadata().getClientName().getByteArray(),
- marshalledState.getMetadata().getClientConfig(),
- getApplicationName(context),
- marshalledState.getTiclState(),
- new IntentForwardingListener(context, resources.getLogger()));
- this.schedulingId = marshalledState.getMetadata().getTiclId();
- initializeSchedulerWithRecurringTasks();
- }
-
- /** Returns the name of the application using the Ticl. */
- private static String getApplicationName(Context context) {
- return context.getPackageName();
- }
-
- /**
- * Provides the internal scheduler with references to each of the recurring tasks that can be
- * executed.
- */
- private void initializeSchedulerWithRecurringTasks() {
- if (!(getResources().getInternalScheduler() instanceof AndroidInternalScheduler)) {
- throw new IllegalStateException("Scheduler must be an AndroidInternalScheduler, not "
- + getResources().getInternalScheduler());
- }
- AndroidInternalScheduler scheduler =
- (AndroidInternalScheduler) getResources().getInternalScheduler();
- for (Map.Entry<String, Runnable> entry : getRecurringTasks().entrySet()) {
- scheduler.registerTask(entry.getKey(), entry.getValue());
- }
- }
-
- /** Returns the scheduling id of this Ticl. */
- long getSchedulingId() {
- return schedulingId;
- }
-
- // This method appears to serve no purpose, since it's just a delegation to the superclass method
- // with the same access level (protected). However, protected also implies package access, so what
- // this is doing is making this method visible to TiclStateManager.
- @Override
- protected ApplicationClientIdP getApplicationClientIdP() {
- return super.getApplicationClientIdP();
- }
-
- // Similar rationale as getApplicationClientIdP.
- @Override
- protected ClientConfigP getConfig() {
- return super.getConfig();
- }
-
- // Similar rationale as getApplicationClientIdP.
- @Override
- protected boolean isStarted() {
- return super.isStarted();
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/android2/AndroidInvalidationClientStub.java b/java/com/google/ipc/invalidation/ticl/android2/AndroidInvalidationClientStub.java
deleted file mode 100644
index 1683eda..0000000
--- a/java/com/google/ipc/invalidation/ticl/android2/AndroidInvalidationClientStub.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.ticl.android2;
-
-import com.google.ipc.invalidation.external.client.InvalidationClient;
-import com.google.ipc.invalidation.external.client.SystemResources.Logger;
-import com.google.ipc.invalidation.external.client.types.AckHandle;
-import com.google.ipc.invalidation.external.client.types.ObjectId;
-import com.google.ipc.invalidation.ticl.ProtoWrapperConverter;
-import com.google.ipc.invalidation.ticl.android2.ProtocolIntents.ClientDowncalls;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP;
-import com.google.ipc.invalidation.util.Preconditions;
-
-import android.content.Context;
-import android.content.Intent;
-
-import java.util.Collection;
-import java.util.Collections;
-
-/**
- * Implementation of {@link InvalidationClient} that uses intents to send commands to an Android
- * service hosting the actual Ticl. This class is a proxy for the Android service.
- *
- */
-class AndroidInvalidationClientStub implements InvalidationClient {
- /** Android system context. */
- private final Context context;
-
- /** Class implementing the Ticl service. */
- private final String serviceClass;
-
- /** logger. */
- private final Logger logger;
-
- /** Creates an instance from {@code context} and {@code logger}. */
- AndroidInvalidationClientStub(Context context, Logger logger) {
- this.context = Preconditions.checkNotNull(context.getApplicationContext());
- this.logger = Preconditions.checkNotNull(logger);
- this.serviceClass = new AndroidTiclManifest(context).getTiclServiceClass();
- }
-
- @Override
- public void start() {
- throw new UnsupportedOperationException(
- "Android clients are automatically started when created");
- }
-
- // All calls work by marshalling the arguments to an Intent and sending the Intent to the Ticl
- // service.
-
- @Override
- public void stop() {
- issueIntent(ClientDowncalls.newStopIntent());
- }
-
- @Override
- public void register(ObjectId objectId) {
- Collection<ObjectIdP> objects =
- Collections.singletonList(ProtoWrapperConverter.convertToObjectIdProto(objectId));
- issueIntent(ClientDowncalls.newRegistrationIntent(objects));
- }
-
- @Override
- public void register(Collection<ObjectId> objectIds) {
- Collection<ObjectIdP> objectIdPs =
- ProtoWrapperConverter.convertToObjectIdProtoCollection(objectIds);
- issueIntent(ClientDowncalls.newRegistrationIntent(objectIdPs));
- }
-
- @Override
- public void unregister(ObjectId objectId) {
- Collection<ObjectIdP> objects =
- Collections.singletonList(ProtoWrapperConverter.convertToObjectIdProto(objectId));
- issueIntent(ClientDowncalls.newUnregistrationIntent(objects));
- }
-
- @Override
- public void unregister(Collection<ObjectId> objectIds) {
- Collection<ObjectIdP> objectIdPs =
- ProtoWrapperConverter.convertToObjectIdProtoCollection(objectIds);
- issueIntent(ClientDowncalls.newUnregistrationIntent(objectIdPs));
- }
-
- @Override
- public void acknowledge(AckHandle ackHandle) {
- issueIntent(ClientDowncalls.newAcknowledgeIntent(ackHandle.getHandleData()));
- }
-
- /** Sends {@code intent} to the service implemented by {@link #serviceClass}. */
- private void issueIntent(Intent intent) {
- intent.setClassName(context, serviceClass);
- context.startService(intent);
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/android2/AndroidInvalidationListenerIntentMapper.java b/java/com/google/ipc/invalidation/ticl/android2/AndroidInvalidationListenerIntentMapper.java
deleted file mode 100644
index ed1ec51..0000000
--- a/java/com/google/ipc/invalidation/ticl/android2/AndroidInvalidationListenerIntentMapper.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.ipc.invalidation.ticl.android2;
-
-import com.google.ipc.invalidation.external.client.InvalidationClient;
-import com.google.ipc.invalidation.external.client.InvalidationListener;
-import com.google.ipc.invalidation.external.client.InvalidationListener.RegistrationState;
-import com.google.ipc.invalidation.external.client.android.service.AndroidLogger;
-import com.google.ipc.invalidation.external.client.types.AckHandle;
-import com.google.ipc.invalidation.external.client.types.ErrorInfo;
-import com.google.ipc.invalidation.ticl.ProtoWrapperConverter;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.ErrorUpcall;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.InvalidateUpcall;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.RegistrationFailureUpcall;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.RegistrationStatusUpcall;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.ReissueRegistrationsUpcall;
-import com.google.ipc.invalidation.util.ProtoWrapper.ValidationException;
-
-import android.content.Context;
-import android.content.Intent;
-
-import java.util.Arrays;
-
-
-/**
- * Routes intents to the appropriate methods in {@link InvalidationListener}. Typically, an instance
- * of the mapper should be created in {@code IntentService#onCreate} and the {@link #handleIntent}
- * method called in {@code IntentService#onHandleIntent}.
- *
- */
-public final class AndroidInvalidationListenerIntentMapper {
-
- /** The logger. */
- private final AndroidLogger logger = AndroidLogger.forPrefix("");
-
- /** Client passed to the listener (supports downcalls). */
- public final InvalidationClient client;
-
- /** Listener to which intents are routed. */
- private final InvalidationListener listener;
-
- /**
- * Initializes
- *
- * @param listener the listener to which intents should be routed
- * @param context the context used by the listener to issue downcalls to the TICL
- */
- public AndroidInvalidationListenerIntentMapper(InvalidationListener listener, Context context) {
- client = new AndroidInvalidationClientStub(context, logger);
- this.listener = listener;
- }
-
- /**
- * Handles a listener upcall by decoding the protocol buffer in {@code intent} and dispatching
- * to the appropriate method on the {@link #listener}.
- */
- public void handleIntent(Intent intent) {
- // TODO: use wakelocks
-
- // Unmarshall the arguments from the Intent and make the appropriate call on the listener.
- ListenerUpcall upcall = tryParseIntent(intent);
- if (upcall == null) {
- return;
- }
-
- if (upcall.hasReady()) {
- listener.ready(client);
- } else if (upcall.getNullableInvalidate() != null) {
- // Handle all invalidation-related upcalls on a common path, since they require creating
- // an AckHandleP.
- onInvalidateUpcall(upcall.getNullableInvalidate(), listener);
- } else if (upcall.getNullableRegistrationStatus() != null) {
- RegistrationStatusUpcall regStatus = upcall.getNullableRegistrationStatus();
- listener.informRegistrationStatus(client,
- ProtoWrapperConverter.convertFromObjectIdProto(regStatus.getObjectId()),
- regStatus.getIsRegistered() ?
- RegistrationState.REGISTERED : RegistrationState.UNREGISTERED);
- } else if (upcall.getNullableRegistrationFailure() != null) {
- RegistrationFailureUpcall failure = upcall.getNullableRegistrationFailure();
- listener.informRegistrationFailure(client,
- ProtoWrapperConverter.convertFromObjectIdProto(failure.getObjectId()),
- failure.getTransient(),
- failure.getMessage());
- } else if (upcall.getNullableReissueRegistrations() != null) {
- ReissueRegistrationsUpcall reissueRegs = upcall.getNullableReissueRegistrations();
- listener.reissueRegistrations(client, reissueRegs.getPrefix().getByteArray(),
- reissueRegs.getLength());
- } else if (upcall.getNullableError() != null) {
- ErrorUpcall error = upcall.getNullableError();
- ErrorInfo errorInfo = ErrorInfo.newInstance(error.getErrorCode(), error.getIsTransient(),
- error.getErrorMessage(), null);
- listener.informError(client, errorInfo);
- } else {
- logger.warning("Dropping listener Intent with unknown call: %s", upcall);
- }
- }
-
- /**
- * Handles an invalidation-related listener {@code upcall} by dispatching to the appropriate
- * method on an instance of {@link InvalidationListener}.
- */
- private void onInvalidateUpcall(InvalidateUpcall invalidate, InvalidationListener listener) {
- AckHandle ackHandle = AckHandle.newInstance(invalidate.getAckHandle().getByteArray());
- if (invalidate.getNullableInvalidation() != null) {
- listener.invalidate(client,
- ProtoWrapperConverter.convertFromInvalidationProto(invalidate.getNullableInvalidation()),
- ackHandle);
- } else if (invalidate.hasInvalidateAll()) {
- listener.invalidateAll(client, ackHandle);
- } else if (invalidate.getNullableInvalidateUnknown() != null) {
- listener.invalidateUnknownVersion(client,
- ProtoWrapperConverter.convertFromObjectIdProto(invalidate.getNullableInvalidateUnknown()),
- ackHandle);
- } else {
- throw new RuntimeException("Invalid invalidate upcall: " + invalidate);
- }
- }
-
- /**
- * Returns a valid {@link ListenerUpcall} from {@code intent}, or {@code null} if one
- * could not be parsed.
- */
- private ListenerUpcall tryParseIntent(Intent intent) {
- if (intent == null) {
- return null;
- }
- byte[] upcallBytes = intent.getByteArrayExtra(ProtocolIntents.LISTENER_UPCALL_KEY);
- if (upcallBytes == null) {
- return null;
- }
- try {
- ListenerUpcall upcall = ListenerUpcall.parseFrom(upcallBytes);
- return upcall;
- } catch (ValidationException exception) {
- logger.severe("Could not parse listener upcall from %s", Arrays.toString(upcallBytes));
- return null;
- }
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/android2/AndroidInvalidationListenerStub.java b/java/com/google/ipc/invalidation/ticl/android2/AndroidInvalidationListenerStub.java
deleted file mode 100644
index 527157d..0000000
--- a/java/com/google/ipc/invalidation/ticl/android2/AndroidInvalidationListenerStub.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.ticl.android2;
-
-import com.google.ipc.invalidation.external.client.InvalidationListener;
-import com.google.ipc.invalidation.external.client.android.service.AndroidLogger;
-
-import android.app.IntentService;
-import android.content.Intent;
-
-
-/**
- * Class implementing the {@link InvalidationListener} in the application using the client.
- * This class is configured with the name of the application class implementing the
- * {@link InvalidationListener} for the application. It receives upcalls from the Ticl as
- * {@link Intent}s and dispatches them against dynamically created instances of the provided
- * class. In this way, it serves as a bridge between the intent protocol and the application.
- */
-public class AndroidInvalidationListenerStub extends IntentService {
- /* This class needs to be public so that the Android runtime can start it as a service. */
-
- private final AndroidLogger logger = AndroidLogger.forPrefix("");
-
- /** The mapper used to route intents to the invalidation listener. */
- private AndroidInvalidationListenerIntentMapper intentMapper;
-
- public AndroidInvalidationListenerStub() {
- super("");
- setIntentRedelivery(true);
- }
-
- @Override
- public void onCreate() {
- super.onCreate();
- InvalidationListener listener = createListener(getListenerClass());
- intentMapper = new AndroidInvalidationListenerIntentMapper(listener, getApplicationContext());
- }
-
- @SuppressWarnings("unchecked")
- private Class<? extends InvalidationListener> getListenerClass() {
- try {
- // Find the listener class that the application wants to use to receive upcalls.
- return (Class<? extends InvalidationListener>)
- Class.forName(new AndroidTiclManifest(this).getListenerClass());
- } catch (ClassNotFoundException exception) {
- throw new RuntimeException("Invalid listener class", exception);
- }
- }
-
- /**
- * Handles a listener upcall by decoding the protocol buffer in {@code intent} and dispatching
- * to the appropriate method on an instance of {@link InvalidationListener}.
- */
- @Override
- public void onHandleIntent(Intent intent) {
- logger.fine("onHandleIntent({0})", intent);
- intentMapper.handleIntent(intent);
- }
-
- private InvalidationListener createListener(Class<? extends InvalidationListener> listenerClass) {
- // Create an instance of the application listener class to handle the upcall.
- try {
- return listenerClass.newInstance();
- } catch (InstantiationException exception) {
- throw new RuntimeException("Could not create listener", exception);
- } catch (IllegalAccessException exception) {
- throw new RuntimeException("Could not create listener", exception);
- }
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/android2/AndroidManifest.xml b/java/com/google/ipc/invalidation/ticl/android2/AndroidManifest.xml
deleted file mode 100644
index 4d66538..0000000
--- a/java/com/google/ipc/invalidation/ticl/android2/AndroidManifest.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
- <!-- Copyright 2011 Google Inc. All Rights Reserved. -->
- <!-- Test application for Android Client API and implementation. -->
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.google.ipc.invalidation.ticl.android2.tests"
- android:versionName="2.3.0">
- <!--Unit test runner application -->
- <application>
- <uses-library android:name="android.test.runner"/>
- </application>
-
- <instrumentation
- android:name="android.test.InstrumentationTestRunner"
- android:targetPackage="com.google.ipc.invalidation.ticl.android2"/>
- </manifest>
diff --git a/java/com/google/ipc/invalidation/ticl/android2/AndroidStorage.java b/java/com/google/ipc/invalidation/ticl/android2/AndroidStorage.java
deleted file mode 100644
index a98ec2a..0000000
--- a/java/com/google/ipc/invalidation/ticl/android2/AndroidStorage.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.ipc.invalidation.ticl.android2;
-
-import com.google.ipc.invalidation.external.client.SystemResources;
-import com.google.ipc.invalidation.external.client.SystemResources.Storage;
-import com.google.ipc.invalidation.external.client.types.Callback;
-import com.google.ipc.invalidation.external.client.types.SimplePair;
-import com.google.ipc.invalidation.external.client.types.Status;
-import com.google.ipc.invalidation.ticl.InvalidationClientCore;
-import com.google.ipc.invalidation.util.Preconditions;
-
-import android.content.Context;
-
-import java.io.DataInputStream;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-
-/**
- * Implementation of {@link Storage} for the Android Ticl. This implementation supports only
- * the {@link InvalidationClientCore#CLIENT_TOKEN_KEY}. As required by Android storage
- * implementations, it executes all callbacks synchronously.
- *
- */
-public class AndroidStorage implements Storage {
- /** Name of the file in which state will be stored. */
- private static final String STATE_FILENAME = "ticl_storage.bin";
-
- /** Maximum size of the file which we are willing to read. */
- private static final int MAX_STATE_FILE_SIZE_BYTES = 4096;
-
- private final Context context;
-
- public AndroidStorage(Context context) {
- this.context = Preconditions.checkNotNull(context);
- }
-
- @Override
- public void setSystemResources(SystemResources resources) {
- }
-
- @Override
- public void writeKey(String key, byte[] value, Callback<Status> done) {
- // We only support the CLIENT_TOKEN_KEY.
- if (!key.equals(InvalidationClientCore.CLIENT_TOKEN_KEY)) {
- done.accept(Status.newInstance(Status.Code.PERMANENT_FAILURE, "Key unsupported: " + key));
- return;
- }
- // Write the data.
- FileOutputStream outstream = null;
- Status status = null;
- try {
- outstream = context.openFileOutput(STATE_FILENAME, Context.MODE_PRIVATE);
- outstream.write(value);
- status = Status.newInstance(Status.Code.SUCCESS, "");
- } catch (FileNotFoundException exception) {
- status = Status.newInstance(Status.Code.PERMANENT_FAILURE, "File not found: " + exception);
- } catch (IOException exception) {
- status = Status.newInstance(Status.Code.PERMANENT_FAILURE, "File not found: " + exception);
- } finally {
- if (outstream != null) {
- try {
- outstream.close();
- } catch (IOException exception) {
- status = Status.newInstance(
- Status.Code.PERMANENT_FAILURE, "Failed to close file: " + exception);
- }
- }
- }
- done.accept(status);
- }
-
- @Override
- public void readKey(String key, Callback<SimplePair<Status, byte[]>> done) {
- // We only support the CLIENT_TOKEN_KEY.
- if (!key.equals(InvalidationClientCore.CLIENT_TOKEN_KEY)) {
- Status status = Status.newInstance(Status.Code.PERMANENT_FAILURE, "Key unsupported: " + key);
- done.accept(SimplePair.of(status, (byte[]) null));
- return;
- }
- // Read and return the data.
- FileInputStream instream = null;
- SimplePair<Status, byte[]> result = null;
- try {
- instream = context.openFileInput(STATE_FILENAME);
- long fileSizeBytes = instream.getChannel().size();
- if (fileSizeBytes > MAX_STATE_FILE_SIZE_BYTES) {
- Status status =
- Status.newInstance(Status.Code.PERMANENT_FAILURE, "File too big: " + fileSizeBytes);
- result = SimplePair.of(status, (byte[]) null);
- }
- // Cast to int must be safe due to the above size check.
- DataInputStream input = new DataInputStream(instream);
- byte[] fileData = new byte[(int) fileSizeBytes];
- input.readFully(fileData);
- result = SimplePair.of(Status.newInstance(Status.Code.SUCCESS, ""), fileData);
- } catch (FileNotFoundException exception) {
- Status status =
- Status.newInstance(Status.Code.PERMANENT_FAILURE, "File not found: " + exception);
- result = SimplePair.of(status, (byte[]) null);
- } catch (IOException exception) {
- Status status =
- Status.newInstance(Status.Code.TRANSIENT_FAILURE, "IO exception: " + exception);
- result = SimplePair.of(status, (byte[]) null);
- } finally {
- if (instream != null) {
- try {
- instream.close();
- } catch (IOException exception) {
- Status status =
- Status.newInstance(
- Status.Code.TRANSIENT_FAILURE, "Failed to close file: " + exception);
- result = SimplePair.of(status, (byte[]) null);
- }
- }
- }
- done.accept(result);
- }
-
- @Override
- public void deleteKey(String key, Callback<Boolean> done) {
- // We only support the CLIENT_TOKEN_KEY.
- if (!key.equals(InvalidationClientCore.CLIENT_TOKEN_KEY)) {
- done.accept(false);
- return;
- }
- if (!context.getFileStreamPath(STATE_FILENAME).exists()) {
- // Deletion "succeeds" if the key didn't exist.
- done.accept(true);
- } else {
- // Otherwise it succeeds based on whether the IO operation succeeded.
- done.accept(context.deleteFile(STATE_FILENAME));
- }
- }
-
- @Override
- public void readAllKeys(Callback<SimplePair<Status, String>> keyCallback) {
- // If the state file exists, supply the CLIENT_TOKEN_KEY as a present key.
- if (context.getFileStreamPath(STATE_FILENAME).exists()) {
- Status status = Status.newInstance(Status.Code.SUCCESS, "");
- keyCallback.accept(SimplePair.of(status, InvalidationClientCore.CLIENT_TOKEN_KEY));
- }
- keyCallback.accept(null);
- }
-
- static void deleteStateForTest(Context context) {
- context.deleteFile(STATE_FILENAME);
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/android2/AndroidTiclManifest.java b/java/com/google/ipc/invalidation/ticl/android2/AndroidTiclManifest.java
deleted file mode 100644
index 1f4ab07..0000000
--- a/java/com/google/ipc/invalidation/ticl/android2/AndroidTiclManifest.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.ticl.android2;
-
-import com.google.ipc.invalidation.util.Preconditions;
-
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-
-import java.util.HashMap;
-import java.util.Map;
-
-
-/**
- * Interface to the {@code AndroidManifest.xml} that provides access to the configuration data
- * required by the Android Ticl.
- *
- */
-public class AndroidTiclManifest {
-
- /**
- * Cache of {@link ApplicationMetadata} to avoid repeatedly scanning manifest. The key is the
- * package name for the context.
- */
- private static final Map<String, ApplicationMetadata> applicationMetadataCache =
- new HashMap<String, ApplicationMetadata>();
-
- /** Application metadata from the Android manifest. */
- private final ApplicationMetadata metadata;
-
- public AndroidTiclManifest(Context context) {
- metadata = createApplicationMetadata(Preconditions.checkNotNull(context));
- }
-
- /** Returns the name of the class implementing the Ticl service. */
- public String getTiclServiceClass() {
- return metadata.ticlServiceClass;
- }
-
- /** Returns the name of the class on which listener events will be invoked. */
- String getListenerClass() {
- return metadata.listenerClass;
- }
-
- /** Returns the name of the class implementing the invalidation listener intent service. */
- public String getListenerServiceClass() {
- return metadata.listenerServiceClass;
- }
-
- /**
- * Returns the name of the class implementing the background invalidation listener intent service.
- */
- String getBackgroundInvalidationListenerServiceClass() {
- return metadata.backgroundInvalidationListenerServiceClass;
- }
-
- /**
- * If it has not already been cached for the given {@code context}, creates and caches application
- * metadata from the manifest.
- */
- private static ApplicationMetadata createApplicationMetadata(Context context) {
- synchronized (applicationMetadataCache) {
- String packageName = context.getPackageName();
- ApplicationMetadata metadata = applicationMetadataCache.get(packageName);
- if (metadata == null) {
- metadata = new ApplicationMetadata(context);
- applicationMetadataCache.put(packageName, metadata);
- }
- return metadata;
- }
- }
-
- /** Application metadata for a specific context. */
- private static final class ApplicationMetadata {
- /**
- * Name of the {@code <application>} metadata element whose value gives the Java class that
- * implements the application {@code InvalidationListener}. Must be set if
- * {@link #LISTENER_SERVICE_NAME_KEY} is not set.
- */
- private static final String LISTENER_NAME_KEY = "ipc.invalidation.ticl.listener_class";
-
- /**
- * Name of the {@code <application>} metadata element whose value gives the Java class that
- * implements the Ticl service. Should only be set in tests.
- */
- private static final String TICL_SERVICE_NAME_KEY = "ipc.invalidation.ticl.service_class";
-
- /**
- * Name of the {@code <application>} metadata element whose value gives the Java class that
- * implements the application's invalidation listener intent service.
- */
- private static final String LISTENER_SERVICE_NAME_KEY =
- "ipc.invalidation.ticl.listener_service_class";
-
- /**
- * Name of the {@code <application>} metadata element whose value gives the Java class that
- * implements the application's background invalidation listener intent service.
- */
- private static final String BACKGROUND_INVALIDATION_LISTENER_SERVICE_NAME_KEY =
- "ipc.invalidation.ticl.background_invalidation_listener_service_class";
-
- /** Default values returned if not overriden by the manifest file. */
- private static final Map<String, String> DEFAULTS = new HashMap<String, String>();
- static {
- DEFAULTS.put(TICL_SERVICE_NAME_KEY,
- "com.google.ipc.invalidation.ticl.android2.TiclService");
- DEFAULTS.put(LISTENER_NAME_KEY, "");
- DEFAULTS.put(LISTENER_SERVICE_NAME_KEY,
- "com.google.ipc.invalidation.ticl.android2.AndroidInvalidationListenerStub");
- DEFAULTS.put(BACKGROUND_INVALIDATION_LISTENER_SERVICE_NAME_KEY, null);
- }
-
- private final String ticlServiceClass;
- private final String listenerClass;
- private final String listenerServiceClass;
- private final String backgroundInvalidationListenerServiceClass;
-
- ApplicationMetadata(Context context) {
- ApplicationInfo appInfo;
- try {
- // Read metadata from manifest.xml
- appInfo = context.getPackageManager()
- .getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
- } catch (NameNotFoundException exception) {
- throw new RuntimeException("Cannot read own application info", exception);
- }
- ticlServiceClass = readApplicationMetadata(appInfo, TICL_SERVICE_NAME_KEY);
- listenerClass = readApplicationMetadata(appInfo, LISTENER_NAME_KEY);
- listenerServiceClass = readApplicationMetadata(appInfo, LISTENER_SERVICE_NAME_KEY);
- backgroundInvalidationListenerServiceClass =
- readApplicationMetadata(appInfo, BACKGROUND_INVALIDATION_LISTENER_SERVICE_NAME_KEY);
- }
-
- /**
- * Returns the metadata-provided value for {@code key} in {@code appInfo} if one
- * exists, or the value from {@link #DEFAULTS} if one does not.
- */
- private static String readApplicationMetadata(ApplicationInfo appInfo, String key) {
- String value = null;
- if (appInfo.metaData != null) {
- value = appInfo.metaData.getString(key);
- }
- // Return the manifest value if present or the default value if not.
- return (value != null) ? value : DEFAULTS.get(key);
- }
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/android2/ProtocolIntents.java b/java/com/google/ipc/invalidation/ticl/android2/ProtocolIntents.java
deleted file mode 100644
index c5b19ca..0000000
--- a/java/com/google/ipc/invalidation/ticl/android2/ProtocolIntents.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.ipc.invalidation.ticl.android2;
-
-import com.google.ipc.invalidation.external.client.types.ErrorInfo;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.AndroidNetworkSendRequest;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.AndroidSchedulerEvent;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall.AckDowncall;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall.RegistrationDowncall;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall.StartDowncall;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall.StopDowncall;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.InternalDowncall;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.InternalDowncall.CreateClient;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.InternalDowncall.NetworkStatus;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.InternalDowncall.ServerMessage;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.ErrorUpcall;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.InvalidateUpcall;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.ReadyUpcall;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.RegistrationFailureUpcall;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.RegistrationStatusUpcall;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.ReissueRegistrationsUpcall;
-import com.google.ipc.invalidation.ticl.proto.Client.AckHandleP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientConfigP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationMessage;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version;
-import com.google.ipc.invalidation.util.Bytes;
-
-import android.content.Intent;
-
-import java.util.Collection;
-
-/**
- * Factory class for {@link Intent}s used between the application, Ticl, and listener in the
- * Android Ticl.
- *
- */
-public class ProtocolIntents {
- /** Version of the on-device protocol. */
- static final Version ANDROID_PROTOCOL_VERSION_VALUE = Version.create(1, 0);
-
- /** Key of Intent byte[] extra holding a client downcall protocol buffer. */
- public static final String CLIENT_DOWNCALL_KEY = "ipcinv-downcall";
-
- /** Key of Intent byte[] extra holding an internal downcall protocol buffer. */
- public static final String INTERNAL_DOWNCALL_KEY = "ipcinv-internal-downcall";
-
- /** Key of Intent byte[] extra holding a listener upcall protocol buffer. */
- public static final String LISTENER_UPCALL_KEY = "ipcinv-upcall";
-
- /** Key of Intent byte[] extra holding a schedule event protocol buffer. */
- public static final String SCHEDULER_KEY = "ipcinv-scheduler";
-
- /** Key of Intent byte[] extra holding an outbound message protocol buffer. */
- public static final String OUTBOUND_MESSAGE_KEY = "ipcinv-outbound-message";
-
- /** Key of Intent byte[] extra holding an invalidation message protocol buffer. */
- public static final String BACKGROUND_INVALIDATION_KEY = "ipcinv-background-inv";
-
- /** Intents corresponding to calls on {@code InvalidationClient}. */
- public static class ClientDowncalls {
- public static Intent newStartIntent() {
- Intent intent = new Intent();
- intent.putExtra(CLIENT_DOWNCALL_KEY, ClientDowncall.createWithStart(
- ANDROID_PROTOCOL_VERSION_VALUE, StartDowncall.DEFAULT_INSTANCE).toByteArray());
- return intent;
- }
-
- public static Intent newStopIntent() {
- Intent intent = new Intent();
- intent.putExtra(CLIENT_DOWNCALL_KEY, ClientDowncall.createWithStop(
- ANDROID_PROTOCOL_VERSION_VALUE, StopDowncall.DEFAULT_INSTANCE).toByteArray());
- return intent;
- }
-
- public static Intent newAcknowledgeIntent(byte[] ackHandleData) {
- AckDowncall ackDowncall = AckDowncall.create(new Bytes(ackHandleData));
- Intent intent = new Intent();
- intent.putExtra(CLIENT_DOWNCALL_KEY, ClientDowncall.createWithAck(
- ANDROID_PROTOCOL_VERSION_VALUE, ackDowncall).toByteArray());
- return intent;
- }
-
- public static Intent newRegistrationIntent(Collection<ObjectIdP> registrations) {
- RegistrationDowncall regDowncall =
- RegistrationDowncall.createWithRegistrations(registrations);
- Intent intent = new Intent();
- intent.putExtra(CLIENT_DOWNCALL_KEY, ClientDowncall.createWithRegistrations(
- ANDROID_PROTOCOL_VERSION_VALUE, regDowncall).toByteArray());
- return intent;
- }
-
- public static Intent newUnregistrationIntent(Collection<ObjectIdP> unregistrations) {
- RegistrationDowncall regDowncall =
- RegistrationDowncall.createWithUnregistrations(unregistrations);
- Intent intent = new Intent();
- intent.putExtra(CLIENT_DOWNCALL_KEY, ClientDowncall.createWithRegistrations(
- ANDROID_PROTOCOL_VERSION_VALUE, regDowncall).toByteArray());
- return intent;
- }
-
- private ClientDowncalls() {
- // Disallow instantiation.
- }
- }
-
- /** Intents for non-public calls on the Ticl (currently, network-related calls. */
- public static class InternalDowncalls {
- public static Intent newServerMessageIntent(Bytes serverMessage) {
- Intent intent = new Intent();
- intent.putExtra(INTERNAL_DOWNCALL_KEY, InternalDowncall.createWithServerMessage(
- ANDROID_PROTOCOL_VERSION_VALUE, ServerMessage.create(serverMessage))
- .toByteArray());
- return intent;
- }
-
- public static Intent newNetworkStatusIntent(Boolean status) {
- Intent intent = new Intent();
- intent.putExtra(INTERNAL_DOWNCALL_KEY, InternalDowncall.createWithNetworkStatus(
- ANDROID_PROTOCOL_VERSION_VALUE, NetworkStatus.create(status)).toByteArray());
- return intent;
- }
-
- public static Intent newNetworkAddrChangeIntent() {
- Intent intent = new Intent();
- intent.putExtra(INTERNAL_DOWNCALL_KEY, InternalDowncall.createWithNetworkAddrChange(
- ANDROID_PROTOCOL_VERSION_VALUE, true).toByteArray());
- return intent;
- }
-
- public static Intent newCreateClientIntent(int clientType, Bytes clientName,
- ClientConfigP config, boolean skipStartForTest) {
- CreateClient createClient =
- CreateClient.create(clientType, clientName, config, skipStartForTest);
- Intent intent = new Intent();
- intent.putExtra(INTERNAL_DOWNCALL_KEY, InternalDowncall.createWithCreateClient(
- ANDROID_PROTOCOL_VERSION_VALUE, createClient).toByteArray());
- return intent;
- }
-
- private InternalDowncalls() {
- // Disallow instantiation.
- }
- }
-
- /** Intents corresponding to calls on {@code InvalidationListener}. */
- public static class ListenerUpcalls {
- public static Intent newReadyIntent() {
- Intent intent = new Intent();
- intent.putExtra(LISTENER_UPCALL_KEY, ListenerUpcall.createWithReady(
- ANDROID_PROTOCOL_VERSION_VALUE, ReadyUpcall.DEFAULT_INSTANCE).toByteArray());
- return intent;
- }
-
- public static Intent newInvalidateIntent(InvalidationP invalidation, AckHandleP ackHandle) {
- Intent intent = new Intent();
- InvalidateUpcall invUpcall =
- InvalidateUpcall.createWithInvalidation(new Bytes(ackHandle.toByteArray()), invalidation);
- intent.putExtra(LISTENER_UPCALL_KEY, ListenerUpcall.createWithInvalidate(
- ANDROID_PROTOCOL_VERSION_VALUE, invUpcall).toByteArray());
- return intent;
- }
-
- public static Intent newInvalidateUnknownIntent(ObjectIdP object, AckHandleP ackHandle) {
- Intent intent = new Intent();
- InvalidateUpcall invUpcall =
- InvalidateUpcall.createWithInvalidateUnknown(new Bytes(ackHandle.toByteArray()), object);
- intent.putExtra(LISTENER_UPCALL_KEY, ListenerUpcall.createWithInvalidate(
- ANDROID_PROTOCOL_VERSION_VALUE, invUpcall).toByteArray());
- return intent;
- }
-
- public static Intent newInvalidateAllIntent(AckHandleP ackHandle) {
- Intent intent = new Intent();
- InvalidateUpcall invUpcall = InvalidateUpcall.createWithInvalidateAll(
- new Bytes(ackHandle.toByteArray()), true);
- intent.putExtra(LISTENER_UPCALL_KEY, ListenerUpcall.createWithInvalidate(
- ANDROID_PROTOCOL_VERSION_VALUE, invUpcall).toByteArray());
- return intent;
- }
-
- public static Intent newRegistrationStatusIntent(ObjectIdP object, boolean isRegistered) {
- Intent intent = new Intent();
- RegistrationStatusUpcall regUpcall = RegistrationStatusUpcall.create(object, isRegistered);
- intent.putExtra(LISTENER_UPCALL_KEY, ListenerUpcall.createWithRegistrationStatus(
- ANDROID_PROTOCOL_VERSION_VALUE, regUpcall).toByteArray());
- return intent;
- }
-
- public static Intent newRegistrationFailureIntent(ObjectIdP object, boolean isTransient,
- String message) {
- Intent intent = new Intent();
- RegistrationFailureUpcall regUpcall =
- RegistrationFailureUpcall.create(object, isTransient, message);
- intent.putExtra(LISTENER_UPCALL_KEY, ListenerUpcall.createWithRegistrationFailure(
- ANDROID_PROTOCOL_VERSION_VALUE, regUpcall).toByteArray());
- return intent;
- }
-
- public static Intent newReissueRegistrationsIntent(byte[] prefix, int length) {
- Intent intent = new Intent();
- ReissueRegistrationsUpcall reissueRegistrations =
- ReissueRegistrationsUpcall.create(new Bytes(prefix), length);
- intent.putExtra(LISTENER_UPCALL_KEY, ListenerUpcall.createWithReissueRegistrations(
- ANDROID_PROTOCOL_VERSION_VALUE, reissueRegistrations).toByteArray());
- return intent;
- }
-
- public static Intent newErrorIntent(ErrorInfo errorInfo) {
- Intent intent = new Intent();
- ErrorUpcall errorUpcall = ErrorUpcall.create(errorInfo.getErrorReason(),
- errorInfo.getErrorMessage(), errorInfo.isTransient());
- intent.putExtra(LISTENER_UPCALL_KEY, ListenerUpcall.createWithError(
- ANDROID_PROTOCOL_VERSION_VALUE, errorUpcall).toByteArray());
- return intent;
- }
-
- private ListenerUpcalls() {
- // Disallow instantiation.
- }
- }
-
- /** Returns a new intent encoding a request to execute the scheduled action {@code eventName}. */
- public static Intent newSchedulerIntent(String eventName, long ticlId) {
- byte[] eventBytes = AndroidSchedulerEvent.create(ANDROID_PROTOCOL_VERSION_VALUE, eventName,
- ticlId).toByteArray();
- return new Intent().putExtra(SCHEDULER_KEY, eventBytes);
- }
-
- /** Returns a new intent encoding a message to send to the data center. */
- public static Intent newOutboundMessageIntent(byte[] message) {
- byte[] payloadBytes = AndroidNetworkSendRequest.create(ANDROID_PROTOCOL_VERSION_VALUE,
- new Bytes(message)).toByteArray();
- return new Intent().putExtra(OUTBOUND_MESSAGE_KEY, payloadBytes);
- }
-
- /** Returns a new intent encoding background invalidation messages. */
- public static Intent newBackgroundInvalidationIntent(InvalidationMessage invalidationMessage) {
- byte[] payloadBytes = invalidationMessage.toByteArray();
- return new Intent().putExtra(BACKGROUND_INVALIDATION_KEY, payloadBytes);
- }
-
- private ProtocolIntents() {
- // Disallow instantiation.
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/android2/ResourcesFactory.java b/java/com/google/ipc/invalidation/ticl/android2/ResourcesFactory.java
deleted file mode 100644
index 067b243..0000000
--- a/java/com/google/ipc/invalidation/ticl/android2/ResourcesFactory.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.ticl.android2;
-
-import com.google.ipc.invalidation.external.client.SystemResources;
-import com.google.ipc.invalidation.external.client.SystemResources.Scheduler;
-import com.google.ipc.invalidation.external.client.android.service.AndroidLogger;
-import com.google.ipc.invalidation.ticl.BasicSystemResources;
-import com.google.ipc.invalidation.ticl.android2.channel.AndroidNetworkChannel;
-import com.google.ipc.invalidation.util.Preconditions;
-
-import android.content.Context;
-
-/**
- * Factory class for Android system resources.
- *
- */
-public class ResourcesFactory {
- /**
- * A scheduler that supports no operations. Used as the listener scheduler, which should never be
- * called in Android.
- */
- private static class InvalidScheduler implements Scheduler {
- @Override
- public void setSystemResources(SystemResources resources) {
- }
-
- @Override
- public void schedule(int delayMs, Runnable runnable) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean isRunningOnThread() {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public long getCurrentTimeMs() {
- throw new UnsupportedOperationException();
- }
-
- }
-
- /** Implementation of {@link SystemResources} for the Android Ticl. */
- public static class AndroidResources extends BasicSystemResources {
- /** Android system context. */
- private final Context context;
-
- /** Ticl-provided receiver for network events. */
- private NetworkChannel.NetworkListener networkListener;
-
- /**
- * Creates an instance of resources for production code.
- *
- * @param context Android system context
- * @param clock source of time for the internal scheduler
- * @param logPrefix log prefix
- */
- private AndroidResources(Context context, AndroidClock clock, String logPrefix) {
- super(AndroidLogger.forPrefix(logPrefix), new AndroidInternalScheduler(context, clock),
- new InvalidScheduler(), new AndroidNetworkChannel(context), new AndroidStorage(context),
- getPlatformString());
- this.context = Preconditions.checkNotNull(context);
- }
-
- /** Creates an instance for test from the provided resources and context. */
-
- AndroidResources(Logger logger, AndroidInternalScheduler internalScheduler,
- NetworkChannel network, Storage storage, Context context) {
- super(logger, internalScheduler, new InvalidScheduler(), network, storage,
- getPlatformString());
- this.context = Preconditions.checkNotNull(context);
- }
-
- /** Returns the Android system context. */
- Context getContext() {
- return context;
- }
-
- /**
- * Sets the network message listener provided by the Ticl. The network calls this method when
- * the Ticl provides it with a listener; the Ticl service later retrieves the listener when
- * it has a network event to communicate to the Ticl.
- */
- public void setNetworkListener(NetworkChannel.NetworkListener networkListener) {
- if (this.networkListener != null) {
- throw new IllegalStateException("Listener already set: " + networkListener);
- }
- this.networkListener = Preconditions.checkNotNull(networkListener);
- }
-
- /** Clears the network listener. */
- void clearNetworkListener() {
- this.networkListener = null;
- }
-
- /** Returns the network listener provided by the Ticl. */
- NetworkChannel.NetworkListener getNetworkListener() {
- return Preconditions.checkNotNull(networkListener, "network listener not yet set");
- }
-
- /** Returns the platform string to use when constructing the resources. */
- private static String getPlatformString() {
- return "Android-" + android.os.Build.VERSION.RELEASE;
- }
- }
-
- /**
- * Creates a production instance.
- *
- * @param context Android system context
- * @param clock source of time for the internal scheduler
- * @param prefix log prefix
- */
- static AndroidResources createResources(Context context, AndroidClock clock, String prefix) {
- return new AndroidResources(context, clock, prefix);
- }
-
- private ResourcesFactory() {
- // Prevent instantiation.
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/android2/TiclService.java b/java/com/google/ipc/invalidation/ticl/android2/TiclService.java
deleted file mode 100644
index ff979f1..0000000
--- a/java/com/google/ipc/invalidation/ticl/android2/TiclService.java
+++ /dev/null
@@ -1,389 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.ticl.android2;
-
-import com.google.ipc.invalidation.common.DigestFunction;
-import com.google.ipc.invalidation.common.ObjectIdDigestUtils;
-import com.google.ipc.invalidation.external.client.types.AckHandle;
-import com.google.ipc.invalidation.external.client.types.Callback;
-import com.google.ipc.invalidation.external.client.types.ErrorInfo;
-import com.google.ipc.invalidation.external.client.types.ObjectId;
-import com.google.ipc.invalidation.external.client.types.SimplePair;
-import com.google.ipc.invalidation.external.client.types.Status;
-import com.google.ipc.invalidation.ticl.InvalidationClientCore;
-import com.google.ipc.invalidation.ticl.PersistenceUtils;
-import com.google.ipc.invalidation.ticl.ProtoWrapperConverter;
-import com.google.ipc.invalidation.ticl.android2.AndroidInvalidationClientImpl.IntentForwardingListener;
-import com.google.ipc.invalidation.ticl.android2.ResourcesFactory.AndroidResources;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.AndroidSchedulerEvent;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall.RegistrationDowncall;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.InternalDowncall;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.InternalDowncall.CreateClient;
-import com.google.ipc.invalidation.ticl.proto.Client.PersistentTiclState;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ServerToClientMessage;
-import com.google.ipc.invalidation.util.Bytes;
-import com.google.ipc.invalidation.util.ProtoWrapper.ValidationException;
-
-import android.app.IntentService;
-import android.content.Intent;
-
-import java.util.Collection;
-
-
-/**
- * An {@link IntentService} that manages a single Ticl.
- * <p>
- * Concurrency model: {@link IntentService} guarantees that calls to {@link #onHandleIntent} will
- * be executed serially on a dedicated thread. They may perform blocking work without blocking
- * the application calling the service.
- * <p>
- * This thread will be used as the internal-scheduler thread for the Ticl.
- *
- */
-public class TiclService extends IntentService {
- /** This class must be public so that Android can instantiate it as a service. */
-
- /** Resources for the created Ticls. */
- private AndroidResources resources;
-
- /** The function for computing persistence state digests when rewriting them. */
- private final DigestFunction digestFn = new ObjectIdDigestUtils.Sha1DigestFunction();
-
- public TiclService() {
- super("TiclService");
-
- // If the process dies during a call to onHandleIntent, redeliver the intent when the service
- // restarts.
- setIntentRedelivery(true);
- }
-
- /**
- * Returns the resources to use for a Ticl. Normally, we use a new resources instance
- * for every call, but for existing tests, we need to be able to override this function
- * and return the same instance each time.
- */
- AndroidResources createResources() {
- return ResourcesFactory.createResources(this, new AndroidClock.SystemClock(), "TiclService");
- }
-
- @Override
- protected void onHandleIntent(Intent intent) {
- // TODO: We may want to use wakelocks to prevent the phone from sleeping
- // before we have finished handling the Intent.
-
- if (intent == null) {
- return;
- }
-
- // We create resources anew each time.
- resources = createResources();
- resources.start();
- resources.getLogger().fine("onHandleIntent(%s)", intent);
-
- try {
- // Dispatch the appropriate handler function based on which extra key is set.
- if (intent.hasExtra(ProtocolIntents.CLIENT_DOWNCALL_KEY)) {
- handleClientDowncall(intent.getByteArrayExtra(ProtocolIntents.CLIENT_DOWNCALL_KEY));
- } else if (intent.hasExtra(ProtocolIntents.INTERNAL_DOWNCALL_KEY)) {
- handleInternalDowncall(intent.getByteArrayExtra(ProtocolIntents.INTERNAL_DOWNCALL_KEY));
- } else if (intent.hasExtra(ProtocolIntents.SCHEDULER_KEY)) {
- handleSchedulerEvent(intent.getByteArrayExtra(ProtocolIntents.SCHEDULER_KEY));
- } else {
- resources.getLogger().warning("Received Intent without any recognized extras: %s", intent);
- }
- } finally {
- // Null out resources to prevent accidentally using them in the future before they have been
- // properly re-created.
- resources.stop();
- resources = null;
- }
- }
-
- /** Handles a request to call a function on the ticl. */
- private void handleClientDowncall(byte[] clientDowncallBytes) {
- // Parse and validate the request.
- final ClientDowncall downcall;
- try {
- downcall = ClientDowncall.parseFrom(clientDowncallBytes);
- } catch (ValidationException exception) {
- resources.getLogger().warning("Failed parsing ClientDowncall from %s: %s",
- Bytes.toLazyCompactString(clientDowncallBytes), exception.getMessage());
- return;
- }
-
- resources.getLogger().fine("Handle client downcall: %s", downcall);
-
- // Restore the appropriate Ticl.
- // TODO: what if this is the "wrong" Ticl?
- AndroidInvalidationClientImpl ticl = loadExistingTicl();
- if (ticl == null) {
- resources.getLogger().warning("Dropping client downcall since no Ticl: %s", downcall);
- return;
- }
-
- // Call the appropriate method.
- if (downcall.getNullableAck() != null) {
- ticl.acknowledge(
- AckHandle.newInstance(downcall.getNullableAck().getAckHandle().getByteArray()));
- } else if (downcall.hasStart()) {
- ticl.start();
- } else if (downcall.hasStop()) {
- ticl.stop();
- } else if (downcall.getNullableRegistrations() != null) {
- RegistrationDowncall regDowncall = downcall.getNullableRegistrations();
- if (!regDowncall.getRegistrations().isEmpty()) {
- Collection<ObjectId> objects =
- ProtoWrapperConverter.convertFromObjectIdProtoCollection(regDowncall.getRegistrations());
- ticl.register(objects);
- }
- if (!regDowncall.getUnregistrations().isEmpty()) {
- Collection<ObjectId> objects = ProtoWrapperConverter.convertFromObjectIdProtoCollection(
- regDowncall.getUnregistrations());
- ticl.unregister(objects);
- }
- } else {
- throw new RuntimeException("Invalid downcall passed validation: " + downcall);
- }
- // If we are stopping the Ticl, then just delete its persisted in-memory state, since no
- // operations on a stopped Ticl are valid. Otherwise, save the Ticl in-memory state to
- // stable storage.
- if (downcall.hasStop()) {
- TiclStateManager.deleteStateFile(this);
- } else {
- TiclStateManager.saveTicl(this, resources.getLogger(), ticl);
- }
- }
-
- /** Handles an internal downcall on the Ticl. */
- private void handleInternalDowncall(byte[] internalDowncallBytes) {
- // Parse and validate the request.
- final InternalDowncall downcall;
- try {
- downcall = InternalDowncall.parseFrom(internalDowncallBytes);
- } catch (ValidationException exception) {
- resources.getLogger().warning("Failed parsing InternalDowncall from %s: %s",
- Bytes.toLazyCompactString(internalDowncallBytes),
- exception.getMessage());
- return;
- }
- resources.getLogger().fine("Handle internal downcall: %s", downcall);
-
- // Message from the data center; just forward it to the Ticl.
- if (downcall.getNullableServerMessage() != null) {
- // We deliver the message regardless of whether the Ticl existed, since we'll want to
- // rewrite persistent state in the case where it did not.
- // TODO: what if this is the "wrong" Ticl?
- AndroidInvalidationClientImpl ticl = TiclStateManager.restoreTicl(this, resources);
- handleServerMessage((ticl != null),
- downcall.getNullableServerMessage().getData().getByteArray());
- if (ticl != null) {
- TiclStateManager.saveTicl(this, resources.getLogger(), ticl);
- }
- return;
- }
-
- // Network online/offline status change; just forward it to the Ticl.
- if (downcall.getNullableNetworkStatus() != null) {
- // Network status changes only make sense for Ticls that do exist.
- // TODO: what if this is the "wrong" Ticl?
- AndroidInvalidationClientImpl ticl = TiclStateManager.restoreTicl(this, resources);
- if (ticl != null) {
- resources.getNetworkListener().onOnlineStatusChange(
- downcall.getNullableNetworkStatus().getIsOnline());
- TiclStateManager.saveTicl(this, resources.getLogger(), ticl);
- }
- return;
- }
-
- // Client network address change; just forward it to the Ticl.
- if (downcall.getNetworkAddrChange()) {
- AndroidInvalidationClientImpl ticl = TiclStateManager.restoreTicl(this, resources);
- if (ticl != null) {
- resources.getNetworkListener().onAddressChange();
- TiclStateManager.saveTicl(this, resources.getLogger(), ticl);
- }
- return;
- }
-
- // Client creation request (meta operation).
- if (downcall.getNullableCreateClient() != null) {
- handleCreateClient(downcall.getNullableCreateClient());
- return;
- }
- throw new RuntimeException(
- "Invalid internal downcall passed validation: " + downcall);
- }
-
- /** Handles a {@code createClient} request. */
- private void handleCreateClient(CreateClient createClient) {
- // Ensure no Ticl currently exists.
- TiclStateManager.deleteStateFile(this);
-
- // Create the requested Ticl.
- resources.getLogger().fine("Create client: creating");
- TiclStateManager.createTicl(this, resources, createClient.getClientType(),
- createClient.getClientName().getByteArray(), createClient.getClientConfig(),
- createClient.getSkipStartForTest());
- }
-
- /**
- * Handles a {@code message} for a {@code ticl}. If the {@code ticl} is started, delivers the
- * message. If the {@code ticl} is not started, drops the message and clears the last message send
- * time in the Ticl persistent storage so that the Ticl will send a heartbeat the next time it
- * starts.
- */
- private void handleServerMessage(boolean isTiclStarted, byte[] message) {
- if (isTiclStarted) {
- // Normal case -- message for a started Ticl. Deliver the message.
- resources.getNetworkListener().onMessageReceived(message);
- return;
- }
-
- // Even if the client is stopped, attempt to send invalidations if the client is configured to
- // receive them.
- maybeSendBackgroundInvalidationIntent(message);
-
- // The Ticl isn't started. Rewrite persistent storage so that the last-send-time is a long
- // time ago. The next time the Ticl starts, it will send a message to the data center, which
- // ensures that it will be marked online and that the dropped message (or an equivalent) will
- // be delivered.
- // Android storage implementations are required to execute callbacks inline, so this code
- // all executes synchronously.
- resources.getLogger().fine("Message for unstarted Ticl; rewrite state");
- resources.getStorage().readKey(InvalidationClientCore.CLIENT_TOKEN_KEY,
- new Callback<SimplePair<Status, byte[]>>() {
- @Override
- public void accept(SimplePair<Status, byte[]> result) {
- byte[] stateBytes = result.second;
- if (stateBytes == null) {
- resources.getLogger().info("No persistent state found for client; not rewriting");
- return;
- }
- // Create new state identical to the old state except with a cleared
- // lastMessageSendTimeMs.
- PersistentTiclState state = PersistenceUtils.deserializeState(
- resources.getLogger(), stateBytes, digestFn);
- if (state == null) {
- resources.getLogger().warning("Ignoring invalid Ticl state: %s",
- Bytes.toLazyCompactString(stateBytes));
- return;
- }
- PersistentTiclState.Builder stateBuilder = state.toBuilder();
- stateBuilder.lastMessageSendTimeMs = 0L;
- state = stateBuilder.build();
-
- // Serialize the new state and write it to storage.
- byte[] newClientState = PersistenceUtils.serializeState(state, digestFn);
- resources.getStorage().writeKey(InvalidationClientCore.CLIENT_TOKEN_KEY, newClientState,
- new Callback<Status>() {
- @Override
- public void accept(Status status) {
- if (status.getCode() != Status.Code.SUCCESS) {
- resources.getLogger().warning(
- "Failed saving rewritten persistent state to storage");
- }
- }
- });
- }
- });
- }
-
- /**
- * If a service is registered to handle them, forward invalidations received while the
- * invalidation client is stopped.
- */
- private void maybeSendBackgroundInvalidationIntent(byte[] message) {
- // If a service is registered to receive background invalidations, parse the message to see if
- // any of them should be forwarded.
- AndroidTiclManifest manifest = new AndroidTiclManifest(getApplicationContext());
- String backgroundServiceClass =
- manifest.getBackgroundInvalidationListenerServiceClass();
- if (backgroundServiceClass != null) {
- try {
- ServerToClientMessage s2cMessage = ServerToClientMessage.parseFrom(message);
- if (s2cMessage.getNullableInvalidationMessage() != null) {
- Intent intent = ProtocolIntents.newBackgroundInvalidationIntent(
- s2cMessage.getNullableInvalidationMessage());
- intent.setClassName(getApplicationContext(), backgroundServiceClass);
- startService(intent);
- }
- } catch (ValidationException exception) {
- resources.getLogger().info("Failed to parse message: %s", exception.getMessage());
- }
- }
- }
-
- /** Handles a request to call a particular recurring task on the Ticl. */
- private void handleSchedulerEvent(byte[] schedulerEventBytes) {
- // Parse and validate the request.
- final AndroidSchedulerEvent event;
- try {
- event = AndroidSchedulerEvent.parseFrom(schedulerEventBytes);
- } catch (ValidationException exception) {
- resources.getLogger().warning("Failed parsing SchedulerEvent from %s: %s",
- Bytes.toLazyCompactString(schedulerEventBytes), exception.getMessage());
- return;
- }
-
- resources.getLogger().fine("Handle scheduler event: %s", event);
-
- // Restore the appropriate Ticl.
- AndroidInvalidationClientImpl ticl = TiclStateManager.restoreTicl(this, resources);
-
- // If the Ticl didn't exist, drop the event.
- if (ticl == null) {
- resources.getLogger().fine("Dropping event %s; Ticl state does not exist",
- event.getEventName());
- return;
- }
-
- // Invoke the appropriate event.
- AndroidInternalScheduler ticlScheduler =
- (AndroidInternalScheduler) resources.getInternalScheduler();
- ticlScheduler.handleSchedulerEvent(event);
-
- // Save the Ticl state to persistent storage.
- TiclStateManager.saveTicl(this, resources.getLogger(), ticl);
- }
-
- /**
- * Returns the existing Ticl from persistent storage, or {@code null} if it does not exist.
- * If it does not exist, raises an error to the listener. This function should be used
- * only when loading a Ticl in response to a client-application call, since it raises an error
- * back to the application.
- */
- private AndroidInvalidationClientImpl loadExistingTicl() {
- AndroidInvalidationClientImpl ticl = TiclStateManager.restoreTicl(this, resources);
- if (ticl == null) {
- informListenerOfPermanentError("Client does not exist on downcall");
- }
- return ticl;
- }
-
- /** Informs the listener of a non-retryable {@code error}. */
- private void informListenerOfPermanentError(final String error) {
- ErrorInfo errorInfo = ErrorInfo.newInstance(0, false, error, null);
- Intent errorIntent = ProtocolIntents.ListenerUpcalls.newErrorIntent(errorInfo);
- IntentForwardingListener.issueIntent(this, errorIntent);
- }
-
- /** Returns the resources used for the current Ticl. */
- AndroidResources getSystemResourcesForTest() {
- return resources;
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/android2/TiclStateManager.java b/java/com/google/ipc/invalidation/ticl/android2/TiclStateManager.java
deleted file mode 100644
index bf9ded0..0000000
--- a/java/com/google/ipc/invalidation/ticl/android2/TiclStateManager.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.ticl.android2;
-
-import com.google.ipc.invalidation.common.ObjectIdDigestUtils.Sha1DigestFunction;
-import com.google.ipc.invalidation.external.client.SystemResources;
-import com.google.ipc.invalidation.external.client.SystemResources.Logger;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.AndroidTiclState;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.AndroidTiclState.Metadata;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.AndroidTiclStateWithDigest;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ApplicationClientIdP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientConfigP;
-import com.google.ipc.invalidation.util.Bytes;
-import com.google.ipc.invalidation.util.Preconditions;
-import com.google.ipc.invalidation.util.ProtoWrapper.ValidationException;
-import com.google.ipc.invalidation.util.TypedUtil;
-
-import android.content.Context;
-
-import java.io.DataInput;
-import java.io.DataInputStream;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Random;
-
-
-/**
- * Class to save and restore instances of {@code InvalidationClient} to and from stable storage.
- *
- */
-class TiclStateManager {
- /** Name of the file to which Ticl state will be persisted. */
- private static final String TICL_STATE_FILENAME = "android_ticl_service_state.bin";
-
- /**
- * Maximum size of a Ticl state file. Files with larger size will be ignored as invalid. We use
- * this because we allocate an array of bytes of the same size as the Ticl file and want to
- * avoid accidentally allocating huge arrays.
- */
- private static final int MAX_TICL_FILE_SIZE_BYTES = 100 * 1024; // 100 kilobytes
-
- /** Random number generator for created Ticls. */
- private static final Random random = new Random();
-
- /**
- * Restores the Ticl from persistent storage if it exists. Otherwise, returns {@code null}.
- * @param context Android system context
- * @param resources resources to use for the Ticl
- */
- static AndroidInvalidationClientImpl restoreTicl(Context context,
- SystemResources resources) {
- AndroidTiclState state = readTiclState(context, resources.getLogger());
- if (state == null) {
- return null;
- }
- AndroidInvalidationClientImpl ticl = new AndroidInvalidationClientImpl(context, resources,
- random, state);
- setSchedulerId(resources, ticl);
- return ticl;
- }
-
- /** Creates a new Ticl. Persistent stroage must not exist. */
- static void createTicl(Context context, SystemResources resources, int clientType,
- byte[] clientName, ClientConfigP config, boolean skipStartForTest) {
- Preconditions.checkState(!doesStateFileExist(context), "Ticl already exists");
- AndroidInvalidationClientImpl ticl = new AndroidInvalidationClientImpl(context, resources,
- random, clientType, clientName, config);
- if (!skipStartForTest) {
- // Ticls are started when created unless this should be skipped for tests; we allow tests
- // to skip starting Ticls because many integration tests assume that Ticls will not be
- // started when created.
- setSchedulerId(resources, ticl);
- ticl.start();
- }
- saveTicl(context, resources.getLogger(), ticl);
- }
-
- /**
- * Sets the scheduling id on the scheduler in {@code resources} to {@code ticl.getSchedulingId()}.
- */
- private static void setSchedulerId(SystemResources resources,
- AndroidInvalidationClientImpl ticl) {
- AndroidInternalScheduler scheduler =
- (AndroidInternalScheduler) resources.getInternalScheduler();
- scheduler.setTiclId(ticl.getSchedulingId());
- }
-
- /**
- * Saves a Ticl instance to persistent storage.
- *
- * @param context Android system context
- * @param logger logger
- * @param ticl the Ticl instance to save
- */
- static void saveTicl(Context context, Logger logger, AndroidInvalidationClientImpl ticl) {
- FileOutputStream outputStream = null;
- try {
-
- // Create a protobuf with the Ticl state and a digest over it.
- AndroidTiclStateWithDigest digestedState = createDigestedState(ticl);
-
- // Write the protobuf to storage.
- outputStream = openStateFileForWriting(context);
- outputStream.write(digestedState.toByteArray());
- outputStream.close();
- } catch (FileNotFoundException exception) {
- logger.warning("Could not write Ticl state: %s", exception);
- } catch (IOException exception) {
- logger.warning("Could not write Ticl state: %s", exception);
- } finally {
- try {
- if (outputStream != null) {
- outputStream.close();
- }
- } catch (IOException exception) {
- logger.warning("Exception closing Ticl state file: %s", exception);
- }
- }
- }
-
- /**
- * Reads and returns the Android Ticl state from persistent storage. If the state was missing
- * or invalid, returns {@code null}.
- */
- static AndroidTiclState readTiclState(Context context, Logger logger) {
- FileInputStream inputStream = null;
- try {
- inputStream = openStateFileForReading(context);
- DataInput input = new DataInputStream(inputStream);
- long fileSizeBytes = inputStream.getChannel().size();
- if (fileSizeBytes > MAX_TICL_FILE_SIZE_BYTES) {
- logger.warning("Ignoring too-large Ticl state file with size %s > %s",
- fileSizeBytes, MAX_TICL_FILE_SIZE_BYTES);
- } else {
- // Cast to int must be safe due to the above size check.
- byte[] fileData = new byte[(int) fileSizeBytes];
- input.readFully(fileData);
- AndroidTiclStateWithDigest androidState = AndroidTiclStateWithDigest.parseFrom(fileData);
-
- // Validate the digest in the method.
- if (isDigestValid(androidState, logger)) {
- return Preconditions.checkNotNull(androidState.getState(),
- "validator ensures that state is set");
- } else {
- logger.warning("Android Ticl state failed digest check: %s", androidState);
- }
- }
- } catch (FileNotFoundException exception) {
- logger.info("Ticl state file does not exist: %s", TICL_STATE_FILENAME);
- } catch (ValidationException exception) {
- logger.warning("Could not read Ticl state: %s", exception);
- } catch (IOException exception) {
- logger.warning("Could not read Ticl state: %s", exception);
- } finally {
- try {
- if (inputStream != null) {
- inputStream.close();
- }
- } catch (IOException exception) {
- logger.warning("Exception closing Ticl state file: %s", exception);
- }
- }
- return null;
- }
-
- /**
- * Returns a {@link AndroidTiclStateWithDigest} containing {@code ticlState} and its computed
- * digest.
- */
- private static AndroidTiclStateWithDigest createDigestedState(
- AndroidInvalidationClientImpl ticl) {
- Sha1DigestFunction digester = new Sha1DigestFunction();
- ApplicationClientIdP ticlAppId = ticl.getApplicationClientIdP();
- Metadata metadata = Metadata.create(ticlAppId.getClientType(), ticlAppId.getClientName(),
- ticl.getSchedulingId(), ticl.getConfig());
- AndroidTiclState state = AndroidTiclState.create(ProtocolIntents.ANDROID_PROTOCOL_VERSION_VALUE,
- ticl.marshal(), metadata);
- digester.update(state.toByteArray());
- AndroidTiclStateWithDigest verifiedState =
- AndroidTiclStateWithDigest.create(state, new Bytes(digester.getDigest()));
- return verifiedState;
- }
-
- /** Returns whether the digest in {@code state} is correct. */
- private static boolean isDigestValid(AndroidTiclStateWithDigest state, Logger logger) {
- Sha1DigestFunction digester = new Sha1DigestFunction();
- digester.update(state.getState().toByteArray());
- byte[] computedDigest = digester.getDigest();
- if (!TypedUtil.<Bytes>equals(new Bytes(computedDigest), state.getDigest())) {
- logger.warning("Android TICL state digest mismatch; computed %s for %s",
- computedDigest, state);
- return false;
- }
- return true;
- }
-
- /** Opens {@link #TICL_STATE_FILENAME} for writing. */
- private static FileOutputStream openStateFileForWriting(Context context)
- throws FileNotFoundException {
- return context.openFileOutput(TICL_STATE_FILENAME, Context.MODE_PRIVATE);
- }
-
- /** Opens {@link #TICL_STATE_FILENAME} for reading. */
- private static FileInputStream openStateFileForReading(Context context)
- throws FileNotFoundException {
- return context.openFileInput(TICL_STATE_FILENAME);
- }
-
- /** Deletes {@link #TICL_STATE_FILENAME}. */
- public static void deleteStateFile(Context context) {
- context.deleteFile(TICL_STATE_FILENAME);
- }
-
- /** Returns whether the state file exists, for tests. */
- static boolean doesStateFileExistForTest(Context context) {
- return doesStateFileExist(context);
- }
-
- /** Returns whether the state file exists. */
- private static boolean doesStateFileExist(Context context) {
- return context.getFileStreamPath(TICL_STATE_FILENAME).exists();
- }
-
- private TiclStateManager() {
- // Disallow instantiation.
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/android2/WakeLockManager.java b/java/com/google/ipc/invalidation/ticl/android2/WakeLockManager.java
deleted file mode 100644
index f3c3103..0000000
--- a/java/com/google/ipc/invalidation/ticl/android2/WakeLockManager.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.ticl.android2;
-
-import com.google.ipc.invalidation.external.client.SystemResources.Logger;
-import com.google.ipc.invalidation.external.client.android.service.AndroidLogger;
-import com.google.ipc.invalidation.util.Preconditions;
-
-import android.content.Context;
-import android.os.Build;
-import android.os.PowerManager;
-import android.os.PowerManager.WakeLock;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-/**
- * Singleton that manages wake locks identified by a key. Wake locks are refcounted so if they are
- * acquired multiple times with the same key they will not unlocked until they are released an
- * equivalent number of times.
- */
-public class WakeLockManager {
- /** Logger. */
- private static final Logger logger = AndroidLogger.forTag("WakeLockMgr");
-
- /** Lock over all state. Must be acquired by all non-private methods. */
- private static final Object LOCK = new Object();
-
- /**
- * SDK_INT version taken from android.BUILD.VERSION_CODE.ICE_CREAM_SANDWICH. We cannot reference
- * the field directly because if it is not inlined by the Java compiler, it will not be available
- * in the earlier versions of Android for which the version check in acquire() exists.
- */
- private static final int ICE_CREAM_SANDWICH_VERSION_CODE = 14;
-
- /** Singleton instance. */
- private static WakeLockManager theManager;
-
- /** Wake locks by key. */
- private final Map<Object, PowerManager.WakeLock> wakeLocks =
- new HashMap<Object, PowerManager.WakeLock>();
-
- private final PowerManager powerManager;
-
- private final Context applicationContext;
-
- private WakeLockManager(Context context) {
- powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
- applicationContext = Preconditions.checkNotNull(context);
- }
-
- /** Returns the wake lock manager. */
- public static WakeLockManager getInstance(Context context) {
- Preconditions.checkNotNull(context);
- Preconditions.checkNotNull(context.getApplicationContext());
- synchronized (LOCK) {
- if (theManager == null) {
- theManager = new WakeLockManager(context.getApplicationContext());
- } else {
- if (theManager.applicationContext != context.getApplicationContext()) {
- String message = new StringBuilder()
- .append("Provided context ")
- .append(context.getApplicationContext())
- .append("does not match stored context ")
- .append(theManager.applicationContext)
- .toString();
- throw new IllegalStateException(message);
- }
- }
- return theManager;
- }
- }
-
- /**
- * Acquires a wake lock identified by the {@code key} that will be automatically released after at
- * most {@code timeoutMs}.
- */
- public void acquire(Object key, int timeoutMs) {
- synchronized (LOCK) {
- cleanup();
- Preconditions.checkNotNull(key, "Key can not be null");
-
- // Prior to ICS, acquiring a lock with a timeout and then explicitly releasing the lock
- // results in runtime errors. We rely on the invalidation system correctly releasing locks
- // rather than defensively requesting a timeout.
- if (Build.VERSION.SDK_INT >= ICE_CREAM_SANDWICH_VERSION_CODE) {
- log(key, "acquiring with timeout " + timeoutMs);
- getWakeLock(key).acquire(timeoutMs);
- } else {
- log(key, "acquiring");
- getWakeLock(key).acquire();
- }
- }
- }
-
- /**
- * Releases the wake lock identified by the {@code key} if it is currently held.
- */
- public void release(Object key) {
- synchronized (LOCK) {
- cleanup();
- Preconditions.checkNotNull(key, "Key can not be null");
- PowerManager.WakeLock wakelock = getWakeLock(key);
-
- // If the lock is not held (if for instance there is a wake lock timeout), we cannot release
- // again without triggering a RuntimeException.
- if (!wakelock.isHeld()) {
- logger.warning("Over-release of wakelock: %s", key);
- return;
- }
-
- // We held the wake lock recently, so it's likely safe to release it. Between the isHeld()
- // check and the release() call, the wake lock may time out however and we catch the resulting
- // RuntimeException.
- try {
- wakelock.release();
- } catch (RuntimeException exception) {
- logger.warning("Over-release of wakelock: %s, %s", key, exception);
- }
- log(key, "released");
-
- // Now if the lock is not held, that means we were the last holder, so we should remove it
- // from the map.
- if (!wakelock.isHeld()) {
- wakeLocks.remove(key);
- log(key, "freed");
- }
- }
- }
-
- /**
- * Returns whether there is currently a wake lock held for the provided {@code key}.
- */
- public boolean isHeld(Object key) {
- synchronized (LOCK) {
- cleanup();
- Preconditions.checkNotNull(key, "Key can not be null");
- if (!wakeLocks.containsKey(key)) {
- return false;
- }
- return getWakeLock(key).isHeld();
- }
- }
-
- /** Returns whether the manager has any active (held) wake locks. */
-
- public boolean hasWakeLocks() {
- synchronized (LOCK) {
- cleanup();
- return !wakeLocks.isEmpty();
- }
- }
-
- /** Discards (without releasing) all wake locks. */
-
- public void resetForTest() {
- synchronized (LOCK) {
- cleanup();
- wakeLocks.clear();
- }
- }
-
- /**
- * Returns a wake lock to use for {@code key}. If a lock is already present in the map,
- * returns that lock. Else, creates a new lock, installs it in the map, and returns it.
- * <p>
- * REQUIRES: caller must hold {@link #LOCK}.
- */
- private PowerManager.WakeLock getWakeLock(Object key) {
- if (key == null) {
- throw new IllegalArgumentException("Key can not be null");
- }
- PowerManager.WakeLock wakeLock = wakeLocks.get(key);
- if (wakeLock == null) {
- wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, key.toString());
- wakeLocks.put(key, wakeLock);
- }
- return wakeLock;
- }
-
- /**
- * Removes any non-held wake locks from {@link #wakeLocks}. Such locks may be present when a
- * wake lock acquired with a timeout is not released before the timeout expires. We only
- * explicitly remove wake locks from the map when {@link #release} is called, so a timeout results
- * in a non-held wake lock in the map.
- * <p>
- * Must be called as the first line of all non-private methods.
- * <p>
- * REQUIRES: caller must hold {@link #LOCK}.
- */
- private void cleanup() {
- Iterator<Map.Entry<Object, WakeLock>> wakeLockIter = wakeLocks.entrySet().iterator();
-
- // Check each map entry.
- while (wakeLockIter.hasNext()) {
- Map.Entry<Object, WakeLock> wakeLockEntry = wakeLockIter.next();
- if (!wakeLockEntry.getValue().isHeld()) {
- // Warn and remove the entry from the map if the lock is not held.
- logger.warning("Found un-held wakelock '%s' -- timed-out?", wakeLockEntry.getKey());
- wakeLockIter.remove();
- }
- }
- }
-
- /** Logs a debug message that {@code action} has occurred for {@code key}. */
- private static void log(Object key, String action) {
- logger.fine("WakeLock %s for key: {%s}", action, key);
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidChannelConstants.java b/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidChannelConstants.java
deleted file mode 100644
index bc0f4c2..0000000
--- a/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidChannelConstants.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.ipc.invalidation.ticl.android2.channel;
-
-import com.google.ipc.invalidation.ticl.proto.AndroidChannel.MajorVersion;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version;
-
-/**
- * Constants used by the network channel.
- *
- */
-public final class AndroidChannelConstants {
-
- /** Constants used in Intents sent to retrieve auth tokens from the application. */
- public static class AuthTokenConstants {
- /**
- * Action requesting that an auth token to send a message be provided. This is the action
- * used in the intent to the application.
- */
- public static final String ACTION_REQUEST_AUTH_TOKEN =
- "com.google.ipc.invalidation.AUTH_TOKEN_REQUEST";
-
- /** Extra in an auth token request response providing the pending intent. */
- public static final String EXTRA_PENDING_INTENT =
- "com.google.ipc.invalidation.AUTH_TOKEN_PENDING_INTENT";
-
- /**
- * Extra in an auth token request message indicating that the token provided as the value
- * was invalid when last used. This may be set on the intent to the application.
- */
- public static final String EXTRA_INVALIDATE_AUTH_TOKEN =
- "com.google.ipc.invalidaton.AUTH_TOKEN_INVALIDATE";
-
- /** Extra in the intent from the application that provides the auth token string. */
- public static final String EXTRA_AUTH_TOKEN = "com.google.ipc.invalidation.AUTH_TOKEN";
-
- /**
- * Extra in the intent from the application that provides the so-called "auth token type". If
- * the auth token is a GoogleLogin token, then this value must name the Gaia service (e.g.,
- * "chromiumsync") for which the token was generated. If the auth token is a Gaia OAuth2 token,
- * then this value must have the form "oauth2:{scope}", where {scope} is a Google API
- * authentication scope such as "https://www.googleapis.com/auth/chromesync".
- */
- public static final String EXTRA_AUTH_TOKEN_TYPE =
- "com.google.ipc.invalidation.AUTH_TOKEN_TYPE";
-
- /**
- * Extra in the intent from the application that provides the message to send. We store this
- * ourselves in the intent inside the pending intent that we give to the application.
- */
- static final String EXTRA_STORED_MESSAGE = "com.google.ipc.invalidation.AUTH_TOKEN_MSG";
-
- /**
- * Extra in the intent from the application that indicates whether the intent is for a retry
- * after a failed authentication. If we find that an auth token no longer works, we will tell
- * the application to invalidate it, retrieve a new one, and send us back the message and the
- * new token, but we do not want to go into an infinite loop if authentication never succeeds.
- */
- static final String EXTRA_IS_RETRY = "com.google.ipc.invalidation.AUTH_TOKEN_IS_RETRY";
- }
-
- /** Constants used in HTTP requests to the data center. */
- public static class HttpConstants {
- /** The URL of the invalidation channel service */
- public static final String CHANNEL_URL = "https://clients4.google.com/";
-
- /** The MIME content type to use for requests that contain binary protobuf */
- public static final String PROTO_CONTENT_TYPE = "application/x-protobuffer";
-
- /** The relative URL to use to send inbound client requests to the Android frontend */
- public static final String REQUEST_URL = "/invalidation/android/request/";
-
- /**
- * The name of the query parameter that contains the service name that should be used to
- * validate the authentication token provided with the request.
- */
- public static final String SERVICE_PARAMETER = "service";
-
- /**
- * The name of the header that contains the echoed token. This token is included in all C2DM
- * messages to the client and is echoed back under this header on all client HTTP requests.
- */
- public static final String ECHO_HEADER = "echo-token";
- }
-
- /** Constants used in C2DM messages. */
- public static class C2dmConstants {
- /**
- * Name of C2DM parameter containing message content. If not set, data is retrieved via
- * the mailbox frontend
- */
- public static final String CONTENT_PARAM = "content";
-
- /** Name of the C2DM parameter containing an opaque token to be echoed on HTTP requests. */
- public static final String ECHO_PARAM = "echo-token";
- }
-
- /** The channel version expected by this channel implementation. */
- public static final Version CHANNEL_VERSION = Version.create(MajorVersion.INITIAL, 0);
-
- /**
- * An extra set on an intent to the AndroidMessageSenderService to inform it that a GCM
- * registration id change has occurred. This is sent by the AndroidMessageReceiverService
- * to trigger the sender service to send any buffered messages when a GCM registration id first
- * becomes available.
- * <p>
- * The value associated with this extra is ignored.
- */
- static final String MESSAGE_SENDER_SVC_GCM_REGID_CHANGE =
- "com.google.ipc.invalidation.channel.sender.gcm_regid_change";
-
- private AndroidChannelConstants() {
- // Disallow instantiation.
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidChannelPreferences.java b/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidChannelPreferences.java
deleted file mode 100644
index 1dc4c92..0000000
--- a/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidChannelPreferences.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.ipc.invalidation.ticl.android2.channel;
-
-import com.google.ipc.invalidation.external.client.SystemResources.Logger;
-import com.google.ipc.invalidation.external.client.android.service.AndroidLogger;
-import com.google.ipc.invalidation.ticl.android2.channel.AndroidChannelConstants.C2dmConstants;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.util.Base64;
-
-
-/** Accessor class for shared preference entries used by the channel. */
- public class AndroidChannelPreferences {
- /** Name of the preferences in which channel preferences are stored. */
- private static final String PREFERENCES_NAME = "com.google.ipc.invalidation.gcmchannel";
-
- /**
- * Preferences entry used to buffer the last message sent by the Ticl in the case where a GCM
- * registration id is not currently available.
- */
- private static final String BUFFERED_MSG_PREF = "buffered-msg";
-
- private static final Logger logger = AndroidLogger.forTag("ChannelPrefs");
-
- /** Sets the token echoed on subsequent HTTP requests. */
- static void setEchoToken(Context context, String token) {
- SharedPreferences.Editor editor = getPreferences(context).edit();
-
- // This might fail, but at worst it just means we lose an echo token; the channel
- // needs to be able to handle that anyway since it can never assume an echo token
- // makes it to the client (since the channel can drop messages).
- editor.putString(C2dmConstants.ECHO_PARAM, token);
- if (!editor.commit()) {
- logger.warning("Failed writing shared preferences for: setEchoToken");
- }
- }
-
- /** Returns the echo token that should be included on HTTP requests. */
-
- public static String getEchoToken(Context context) {
- return getPreferences(context).getString(C2dmConstants.ECHO_PARAM, null);
- }
-
- /** Buffers the last message sent by the Ticl. Overwrites any previously buffered message. */
- static void bufferMessage(Context context, byte[] message) {
- SharedPreferences.Editor editor = getPreferences(context).edit();
- String encodedMessage =
- Base64.encodeToString(message, Base64.URL_SAFE | Base64.NO_WRAP | Base64.NO_PADDING);
- editor.putString(BUFFERED_MSG_PREF, encodedMessage);
-
- // This might fail, but at worst we'll just drop a message, which the Ticl must be prepared to
- // handle.
- if (!editor.commit()) {
- logger.warning("Failed writing shared preferences for: bufferMessage");
- }
- }
-
- /**
- * Removes and returns the buffered Ticl message, if any. If no message was buffered, returns
- * {@code null}.
- */
- static byte[] takeBufferedMessage(Context context) {
- SharedPreferences preferences = getPreferences(context);
- String message = preferences.getString(BUFFERED_MSG_PREF, null);
- if (message == null) {
- // No message was buffered.
- return null;
- }
- // There is a message to return. Remove the stored value from the preferences.
- SharedPreferences.Editor editor = preferences.edit();
- editor.remove(BUFFERED_MSG_PREF);
-
- // If this fails, we might send the same message twice, which is fine.
- if (!editor.commit()) {
- logger.warning("Failed writing shared preferences for: takeBufferedMessage");
- }
-
- // Return the decoded message.
- return Base64.decode(message, Base64.URL_SAFE);
- }
-
- /** Returns whether a message has been buffered, for tests. */
- public static boolean hasBufferedMessageForTest(Context context) {
- return getPreferences(context).contains(BUFFERED_MSG_PREF);
- }
-
- /** Returns a new {@link SharedPreferences} instance to access the channel preferences. */
- private static SharedPreferences getPreferences(Context context) {
- return context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE);
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidMessageReceiverService.java b/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidMessageReceiverService.java
deleted file mode 100644
index 54d0fb9..0000000
--- a/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidMessageReceiverService.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.ipc.invalidation.ticl.android2.channel;
-
-import com.google.android.gcm.GCMRegistrar;
-import com.google.ipc.invalidation.external.client.SystemResources.Logger;
-import com.google.ipc.invalidation.external.client.android.service.AndroidLogger;
-import com.google.ipc.invalidation.external.client.contrib.MultiplexingGcmListener;
-import com.google.ipc.invalidation.ticl.android2.AndroidTiclManifest;
-import com.google.ipc.invalidation.ticl.android2.ProtocolIntents;
-import com.google.ipc.invalidation.ticl.android2.channel.AndroidChannelConstants.C2dmConstants;
-import com.google.ipc.invalidation.ticl.proto.AndroidChannel.AddressedAndroidMessage;
-import com.google.ipc.invalidation.util.ProtoWrapper.ValidationException;
-
-import android.content.Context;
-import android.content.Intent;
-import android.util.Base64;
-
-
-/**
- * Service that receives messages from using GCM.
- *
- */
-public class AndroidMessageReceiverService extends MultiplexingGcmListener.AbstractListener {
- /*
- * This class is public so that it can be instantiated by the Android runtime. All of the
- * {@code onYYY} methods are called holding a wakelock that will be automatically released when
- * they return, since this is a subclass of {@code AbstractListener}.
- */
-
- /**
- * Receiver for broadcasts by the multiplexed GCM service. It forwards them to
- * AndroidMessageReceiverService.
- */
- public static class Receiver extends MultiplexingGcmListener.AbstractListener.Receiver {
- /* This class is public so that it can be instantiated by the Android runtime. */
- @Override
- protected Class<?> getServiceClass() {
- return AndroidMessageReceiverService.class;
- }
- }
-
- private final Logger logger = AndroidLogger.forTag("MsgRcvrSvc");
-
- public AndroidMessageReceiverService() {
- super("AndroidMessageReceiverService");
- }
-
- @Override
- protected void onMessage(Intent intent) {
- // Forward the message to the Ticl service.
- if (intent.hasExtra(C2dmConstants.CONTENT_PARAM)) {
- String content = intent.getStringExtra(C2dmConstants.CONTENT_PARAM);
- byte[] msgBytes = Base64.decode(content, Base64.URL_SAFE);
- try {
- // Look up the name of the Ticl service class from the manifest.
- String serviceClass = new AndroidTiclManifest(this).getTiclServiceClass();
- AddressedAndroidMessage addrMessage = AddressedAndroidMessage.parseFrom(msgBytes);
- Intent msgIntent =
- ProtocolIntents.InternalDowncalls.newServerMessageIntent(addrMessage.getMessage());
- msgIntent.setClassName(this, serviceClass);
- startService(msgIntent);
- } catch (ValidationException exception) {
- logger.warning("Failed parsing inbound message: %s", exception);
- }
- } else {
- logger.fine("GCM Intent has no message content: %s", intent);
- }
-
- // Store the echo token.
- String echoToken = intent.getStringExtra(C2dmConstants.ECHO_PARAM);
- if (echoToken != null) {
- AndroidChannelPreferences.setEchoToken(this, echoToken);
- }
- }
-
- @Override
- protected void onRegistered(String registrationId) {
- // Inform the sender service that the registration id has changed. If the sender service
- // had buffered a message because no registration id was previously available, this intent
- // will cause it to send that message.
- Intent sendBuffered = new Intent();
- final String ignoredData = "";
- sendBuffered.putExtra(AndroidChannelConstants.MESSAGE_SENDER_SVC_GCM_REGID_CHANGE, ignoredData);
- sendBuffered.setClass(this, AndroidMessageSenderService.class);
- startService(sendBuffered);
-
- // Inform the Ticl service that the registration id has changed. This will cause it to send
- // a message to the data center and update the GCM registration id stored at the data center.
- Intent updateServer = ProtocolIntents.InternalDowncalls.newNetworkAddrChangeIntent();
- updateServer.setClassName(this, new AndroidTiclManifest(this).getTiclServiceClass());
- startService(updateServer);
- }
-
- @Override
- protected void onUnregistered(String registrationId) {
- // Nothing to do.
- }
-
- @Override
- protected void onDeletedMessages(int total) {
- // This method must be implemented if we start using non-collapsable messages with GCM. For
- // now, there is nothing to do.
- }
-
- /**
- * Initializes GCM as a convenience method for tests. In production, applications should handle
- * this.
- */
- public static void initializeGcmForTest(Context context, Logger logger, String senderId) {
- // Initialize GCM.
- GCMRegistrar.checkDevice(context);
- GCMRegistrar.checkManifest(context);
- String regId = GCMRegistrar.getRegistrationId(context);
- if (regId.isEmpty()) {
- logger.info("Not registered with GCM; registering");
- GCMRegistrar.register(context, senderId);
- } else {
- logger.fine("Already registered with GCM: %s", regId);
- }
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidMessageSenderService.java b/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidMessageSenderService.java
deleted file mode 100644
index 3e7c3e7..0000000
--- a/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidMessageSenderService.java
+++ /dev/null
@@ -1,400 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.ipc.invalidation.ticl.android2.channel;
-
-import com.google.android.gcm.GCMRegistrar;
-import com.google.ipc.invalidation.external.client.SystemResources.Logger;
-import com.google.ipc.invalidation.external.client.android.service.AndroidLogger;
-import com.google.ipc.invalidation.ticl.android2.AndroidTiclManifest;
-import com.google.ipc.invalidation.ticl.android2.ProtocolIntents;
-import com.google.ipc.invalidation.ticl.android2.channel.AndroidChannelConstants.AuthTokenConstants;
-import com.google.ipc.invalidation.ticl.android2.channel.AndroidChannelConstants.HttpConstants;
-import com.google.ipc.invalidation.ticl.proto.AndroidService.AndroidNetworkSendRequest;
-import com.google.ipc.invalidation.ticl.proto.ChannelCommon.NetworkEndpointId;
-import com.google.ipc.invalidation.ticl.proto.CommonProtos;
-import com.google.ipc.invalidation.util.Preconditions;
-import com.google.ipc.invalidation.util.ProtoWrapper.ValidationException;
-
-import android.app.IntentService;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Build;
-import android.util.Base64;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.HttpURLConnection;
-import java.net.MalformedURLException;
-import java.net.ProtocolException;
-import java.net.URL;
-import java.util.Arrays;
-
-
-/**
- * Service that sends messages to the data center using HTTP POSTs authenticated as a Google
- * account.
- * <p>
- * Messages are sent as byte-serialized {@code ClientToServerMessage} protocol buffers.
- * Additionally, the POST requests echo the latest value of the echo token received on C2DM
- * messages from the data center.
- *
- */
-public class AndroidMessageSenderService extends IntentService {
- /* This class is public so that it can be instantiated by the Android runtime. */
-
- /**
- * A prefix on the "auth token type" that indicates we're using an OAuth2 token to authenticate.
- */
- private static final String OAUTH2_TOKEN_TYPE_PREFIX = "oauth2:";
-
- /**
- * Client key used in network endpoint ids. We only have one client at present, so there is no
- * need for a key.
- */
- private static final String NO_CLIENT_KEY = "";
-
- /** An override of the URL, for testing. */
- private static String channelUrlForTest = null;
-
- private final Logger logger = AndroidLogger.forTag("MsgSenderSvc");
-
- /** The last message sent, for tests. */
- public static byte[] lastTiclMessageForTest = null;
-
- public AndroidMessageSenderService() {
- super("AndroidNetworkService");
- setIntentRedelivery(true);
- }
-
- @Override
- public void onCreate() {
- super.onCreate();
-
- // HTTP connection reuse was buggy pre-Froyo, so disable it on those platforms.
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.FROYO) {
- System.setProperty("http.keepAlive", "false");
- }
- }
-
- @Override
- protected void onHandleIntent(Intent intent) {
- if (intent == null) {
- return;
- }
-
- if (intent.hasExtra(ProtocolIntents.OUTBOUND_MESSAGE_KEY)) {
- // Request from the Ticl service to send a message.
- handleOutboundMessage(intent.getByteArrayExtra(ProtocolIntents.OUTBOUND_MESSAGE_KEY));
- } else if (intent.hasExtra(AndroidChannelConstants.AuthTokenConstants.EXTRA_AUTH_TOKEN)) {
- // Reply from the app with an auth token and a message to send.
- handleAuthTokenResponse(intent);
- } else if (intent.hasExtra(AndroidChannelConstants.MESSAGE_SENDER_SVC_GCM_REGID_CHANGE)) {
- handleGcmRegIdChange();
- } else {
- logger.warning("Ignoring intent: %s", intent);
- }
- }
-
- /**
- * Handles a request to send a message to the data center. Validates the message and sends
- * an intent to the application to obtain an auth token to use on the HTTP request to the
- * data center.
- */
- private void handleOutboundMessage(byte[] sendRequestBytes) {
- // Parse and validate the send request.
- final AndroidNetworkSendRequest sendRequest;
- try {
- sendRequest = AndroidNetworkSendRequest.parseFrom(sendRequestBytes);
- } catch (ValidationException exception) {
- logger.warning("Invalid AndroidNetworkSendRequest from %s: %s",
- sendRequestBytes, exception);
- return;
- }
-
- // Request an auth token from the application to use when sending the message.
- byte[] message = sendRequest.getMessage().getByteArray();
- requestAuthTokenForMessage(message, null);
- }
-
- /**
- * Requests an auth token from the application to use to send {@code message} to the data
- * center.
- * <p>
- * If not {@code null}, {@code invalidAuthToken} is an auth token that was previously
- * found to be invalid. The intent sent to the application to request the new token will include
- * the invalid token so that the application can invalidate it in the {@code AccountManager}.
- */
- private void requestAuthTokenForMessage(byte[] message, String invalidAuthToken) {
- /*
- * Send an intent requesting an auth token. This intent will contain a pending intent
- * that the recipient can use to send back the token (by attaching the token as a string
- * extra). That pending intent will also contain the message that we were just asked to send,
- * so that it will be echoed back to us with the token. This avoids our having to persist
- * the message while waiting for the token.
- */
-
- // This is the intent that the application will send back to us (the pending intent allows
- // it to send the intent). It contains the stored message. We require that it be delivered to
- // this class only, as a security check.
- Intent tokenResponseIntent = new Intent(this, getClass());
- tokenResponseIntent.putExtra(AuthTokenConstants.EXTRA_STORED_MESSAGE, message);
-
- // If we have an invalid auth token, set a bit in the intent that the application will send
- // back to us. This will let us know that it is a retry; if sending subsequently fails again,
- // we will not do any further retries.
- tokenResponseIntent.putExtra(AuthTokenConstants.EXTRA_IS_RETRY, invalidAuthToken != null);
-
- // The pending intent allows the application to send us the tokenResponseIntent.
- PendingIntent pendingIntent = PendingIntent.getService(
- this, Arrays.hashCode(message), tokenResponseIntent, PendingIntent.FLAG_ONE_SHOT);
-
- // We send the pending intent as an extra in a normal intent to the application. The
- // invalidation listener service must handle AUTH_TOKEN_REQUEST intents.
- Intent requestTokenIntent = new Intent(AuthTokenConstants.ACTION_REQUEST_AUTH_TOKEN);
- requestTokenIntent.putExtra(AuthTokenConstants.EXTRA_PENDING_INTENT, pendingIntent);
- if (invalidAuthToken != null) {
- requestTokenIntent.putExtra(AuthTokenConstants.EXTRA_INVALIDATE_AUTH_TOKEN, invalidAuthToken);
- }
- String simpleListenerClass =
- new AndroidTiclManifest(getApplicationContext()).getListenerServiceClass();
- requestTokenIntent.setClassName(getApplicationContext(), simpleListenerClass);
- try {
- startService(requestTokenIntent);
- } catch (SecurityException exception) {
- logger.warning("unable to request auth token: %s", exception);
- }
- }
-
- /**
- * Handles an intent received from the application that contains both a message to send and
- * an auth token and type to use when sending it. This is called when the reply to the intent
- * sent in {@link #requestAuthTokenForMessage(byte[], String)} is received.
- */
- private void handleAuthTokenResponse(Intent intent) {
- if (!(intent.hasExtra(AuthTokenConstants.EXTRA_STORED_MESSAGE)
- && intent.hasExtra(AuthTokenConstants.EXTRA_AUTH_TOKEN)
- && intent.hasExtra(AuthTokenConstants.EXTRA_AUTH_TOKEN_TYPE)
- && intent.hasExtra(AuthTokenConstants.EXTRA_IS_RETRY))) {
- logger.warning("auth-token-response intent missing fields: %s, %s",
- intent, intent.getExtras());
- return;
- }
- boolean isRetryForInvalidAuthToken =
- intent.getBooleanExtra(AuthTokenConstants.EXTRA_IS_RETRY, false);
- deliverOutboundMessage(
- intent.getByteArrayExtra(AuthTokenConstants.EXTRA_STORED_MESSAGE),
- intent.getStringExtra(AuthTokenConstants.EXTRA_AUTH_TOKEN),
- intent.getStringExtra(AuthTokenConstants.EXTRA_AUTH_TOKEN_TYPE),
- isRetryForInvalidAuthToken);
- }
-
- /**
- * Sends {@code outgoingMessage} to the data center as a serialized ClientToServerMessage using an
- * HTTP POST.
- * <p>
- * If the HTTP POST fails due to an authentication failure and this is not a retry for an invalid
- * auth token ({@code isRetryForInvalidAuthToken} is {@code false}), then it will call
- * {@link #requestAuthTokenForMessage(byte[], String)} with {@code authToken} to invalidate the
- * token and retry.
- *
- * @param authToken the auth token to use in the HTTP POST
- * @param authTokenType the type of the auth token
- */
- private void deliverOutboundMessage(byte[] outgoingMessage, String authToken,
- String authTokenType, boolean isRetryForInvalidAuthToken) {
- NetworkEndpointId networkEndpointId = getNetworkEndpointId(this, logger);
- if (networkEndpointId == null) {
- // No GCM registration; buffer the message to send when we become registered.
- logger.info("Buffering message to the data center: no GCM registration id");
- AndroidChannelPreferences.bufferMessage(this, outgoingMessage);
- return;
- }
- logger.fine("Delivering outbound message: %s bytes", outgoingMessage.length);
- lastTiclMessageForTest = outgoingMessage;
- URL url = null;
- HttpURLConnection urlConnection = null;
- try {
- // Open the connection.
- boolean isOAuth2Token = authTokenType.startsWith(OAUTH2_TOKEN_TYPE_PREFIX);
- url = buildUrl(isOAuth2Token ? null : authTokenType, networkEndpointId);
- urlConnection = createUrlConnectionForPost(this, url, authToken, isOAuth2Token);
-
- // We are seeing EOFException errors when reusing connections. Request that the connection is
- // closed on response to work around this issue. Client-to-server messages are batched and
- // infrequent so there isn't much benefit in connection reuse here.
- urlConnection.setRequestProperty("Connection", "close");
- urlConnection.setFixedLengthStreamingMode(outgoingMessage.length);
- urlConnection.connect();
-
- // Write the outgoing message.
- urlConnection.getOutputStream().write(outgoingMessage);
-
- // Consume all of the response. We do not do anything with the response (except log it for
- // non-200 response codes), and do not expect any, but certain versions of the Apache HTTP
- // library have a bug that causes connections to leak when the response is not fully consumed;
- // out of sheer paranoia, we do the same thing here.
- String response = readCompleteStream(urlConnection.getInputStream());
-
- // Retry authorization failures and log other non-200 response codes.
- final int responseCode = urlConnection.getResponseCode();
- switch (responseCode) {
- case HttpURLConnection.HTTP_OK:
- case HttpURLConnection.HTTP_NO_CONTENT:
- break;
- case HttpURLConnection.HTTP_UNAUTHORIZED:
- if (!isRetryForInvalidAuthToken) {
- // If we had an auth failure and this is not a retry of an auth failure, then ask the
- // application to invalidate authToken and give us a new one with which to retry. We
- // check that this attempt was not a retry to avoid infinite loops if authorization
- // always fails.
- requestAuthTokenForMessage(outgoingMessage, authToken);
- }
- break;
- default:
- logger.warning("Unexpected response code %s for HTTP POST to %s; response = %s",
- responseCode, url, response);
- }
- } catch (MalformedURLException exception) {
- logger.warning("Malformed URL: %s", exception);
- } catch (IOException exception) {
- logger.warning("IOException sending to the data center (%s): %s", url, exception);
- } finally {
- if (urlConnection != null) {
- urlConnection.disconnect();
- }
- }
- }
-
- /**
- * Handles a change in the GCM registration id by sending the buffered client message (if any)
- * to the data center.
- */
- private void handleGcmRegIdChange() {
- byte[] bufferedMessage = AndroidChannelPreferences.takeBufferedMessage(this);
- if (bufferedMessage != null) {
- // Rejoin the start of the code path that handles sending outbound messages.
- requestAuthTokenForMessage(bufferedMessage, null);
- }
- }
-
- /**
- * Returns a URL to use to send a message to the data center.
- *
- * @param gaiaServiceId Gaia service for which the request will be authenticated (when using a
- * GoogleLogin token), or {@code null} when using an OAuth2 token.
- * @param networkEndpointId network id of the client
- */
- private static URL buildUrl(String gaiaServiceId, NetworkEndpointId networkEndpointId)
- throws MalformedURLException {
- StringBuilder urlBuilder = new StringBuilder();
-
- // Build base URL that targets the inbound request service with the encoded network endpoint
- // id.
- urlBuilder.append((channelUrlForTest != null) ? channelUrlForTest : HttpConstants.CHANNEL_URL);
- urlBuilder.append(HttpConstants.REQUEST_URL);
-
- // TODO: We should be sending a ClientGatewayMessage in the request body
- // instead of appending the client's network endpoint id to the request URL. Once we do that, we
- // should use a UriBuilder to build up a structured Uri object instead of the brittle string
- // concatenation we're doing below.
- urlBuilder.append(base64Encode(networkEndpointId.toByteArray()));
-
- // Add query parameter indicating the service to authenticate against
- if (gaiaServiceId != null) {
- urlBuilder.append('?');
- urlBuilder.append(HttpConstants.SERVICE_PARAMETER);
- urlBuilder.append('=');
- urlBuilder.append(gaiaServiceId);
- }
- return new URL(urlBuilder.toString());
- }
-
- /**
- * Returns an {@link HttpURLConnection} to use to POST a message to the data center. Sets
- * the content-type and user-agent headers; also sets the echo token header if we have an
- * echo token.
- *
- * @param context Android context
- * @param url URL to which to post
- * @param authToken auth token to provide in the request header
- * @param isOAuth2Token whether the token is an OAuth2 token (vs. a GoogleLogin token)
- */
-
- public static HttpURLConnection createUrlConnectionForPost(Context context, URL url,
- String authToken, boolean isOAuth2Token) throws IOException {
- HttpURLConnection connection = (HttpURLConnection) url.openConnection();
- try {
- connection.setRequestMethod("POST");
- } catch (ProtocolException exception) {
- throw new RuntimeException("Cannot set request method to POST: " + exception);
- }
- connection.setDoOutput(true);
- if (isOAuth2Token) {
- connection.setRequestProperty("Authorization", "Bearer " + authToken);
- } else {
- connection.setRequestProperty("Authorization", "GoogleLogin auth=" + authToken);
- }
- connection.setRequestProperty("Content-Type", HttpConstants.PROTO_CONTENT_TYPE);
- connection.setRequestProperty("User-Agent",
- context.getApplicationInfo().className + "(" + Build.VERSION.RELEASE + ")");
- String echoToken = AndroidChannelPreferences.getEchoToken(context);
- if (echoToken != null) {
- // If we have a token to echo to the server, echo it.
- connection.setRequestProperty(HttpConstants.ECHO_HEADER, echoToken);
- }
- return connection;
- }
-
- /** Reads and all data from {@code in}. */
- private static String readCompleteStream(InputStream in) throws IOException {
- StringBuffer buffer = new StringBuffer();
- BufferedReader reader = new BufferedReader(new InputStreamReader(in));
- String line;
- while ((line = reader.readLine()) != null) {
- buffer.append(line);
- }
- return buffer.toString();
- }
-
- /** Returns a base-64 encoded version of {@code bytes}. */
- private static String base64Encode(byte[] bytes) {
- return Base64.encodeToString(bytes, Base64.URL_SAFE | Base64.NO_WRAP | Base64.NO_PADDING);
- }
-
- /** Returns the network id for this channel, or {@code null} if one cannot be determined. */
-
-
- public static NetworkEndpointId getNetworkEndpointId(Context context, Logger logger) {
- String registrationId = GCMRegistrar.getRegistrationId(context);
- if ((registrationId == null) || registrationId.isEmpty()) {
- // No registration with GCM; we cannot compute a network id. The GCM documentation says the
- // string is never null, but we'll be paranoid.
- logger.warning("No GCM registration id; cannot determine our network endpoint id: %s",
- registrationId);
- return null;
- }
- return CommonProtos.newAndroidEndpointId(registrationId, NO_CLIENT_KEY,
- context.getPackageName(), AndroidChannelConstants.CHANNEL_VERSION);
- }
-
- /** Sets the channel url to {@code url}, for tests. */
- public static void setChannelUrlForTest(String url) {
- channelUrlForTest = Preconditions.checkNotNull(url);
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidNetworkChannel.java b/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidNetworkChannel.java
deleted file mode 100644
index afce69c..0000000
--- a/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidNetworkChannel.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.ipc.invalidation.ticl.android2.channel;
-
-import com.google.ipc.invalidation.external.client.SystemResources;
-import com.google.ipc.invalidation.ticl.TestableNetworkChannel;
-import com.google.ipc.invalidation.ticl.android2.ProtocolIntents;
-import com.google.ipc.invalidation.ticl.android2.ResourcesFactory.AndroidResources;
-import com.google.ipc.invalidation.ticl.proto.ChannelCommon.NetworkEndpointId;
-import com.google.ipc.invalidation.util.Preconditions;
-
-import android.content.Context;
-import android.content.Intent;
-
-/**
- * A network channel for Android that receives messages by GCM and that sends messages
- * using HTTP.
- *
- */
-public class AndroidNetworkChannel implements TestableNetworkChannel {
- private final Context context;
- private AndroidResources resources;
-
- public AndroidNetworkChannel(Context context) {
- this.context = Preconditions.checkNotNull(context);
- }
-
- @Override
- public void sendMessage(byte[] outgoingMessage) {
- Intent intent = ProtocolIntents.newOutboundMessageIntent(outgoingMessage);
- intent.setClassName(context, AndroidMessageSenderService.class.getName());
- context.startService(intent);
- }
-
- @Override
- public void setListener(NetworkListener listener) {
- resources.setNetworkListener(listener);
- }
-
- @Override
- public void setSystemResources(SystemResources resources) {
- this.resources = (AndroidResources) Preconditions.checkNotNull(resources);
- }
-
- @Override
- public NetworkEndpointId getNetworkIdForTest() {
- return AndroidMessageSenderService.getNetworkEndpointId(context, resources.getLogger());
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/proto/AndroidChannel.java b/java/com/google/ipc/invalidation/ticl/proto/AndroidChannel.java
deleted file mode 100644
index a922f0d..0000000
--- a/java/com/google/ipc/invalidation/ticl/proto/AndroidChannel.java
+++ /dev/null
@@ -1,354 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-// Generated by j/c/g/ipc/invalidation/common/proto_wrapper_generator
-package com.google.ipc.invalidation.ticl.proto;
-
-import com.google.ipc.invalidation.util.Bytes;
-import com.google.ipc.invalidation.util.ProtoWrapper;
-import com.google.ipc.invalidation.util.ProtoWrapper.ValidationException;
-import com.google.ipc.invalidation.util.TextBuilder;
-import com.google.protobuf.nano.MessageNano;
-import com.google.protobuf.nano.InvalidProtocolBufferNanoException;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-
-public interface AndroidChannel {
-
- public static final class AndroidEndpointId extends ProtoWrapper {
- public static AndroidEndpointId create(String c2DmRegistrationId,
- String clientKey,
- String senderId,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version channelVersion,
- String packageName) {
- return new AndroidEndpointId(c2DmRegistrationId, clientKey, senderId, channelVersion, packageName);
- }
-
- public static final AndroidEndpointId DEFAULT_INSTANCE = new AndroidEndpointId(null, null, null, null, null);
-
- private final long __hazzerBits;
- private final String c2DmRegistrationId;
- private final String clientKey;
- private final String senderId;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version channelVersion;
- private final String packageName;
-
- private AndroidEndpointId(String c2DmRegistrationId,
- String clientKey,
- String senderId,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version channelVersion,
- String packageName) {
- int hazzerBits = 0;
- if (c2DmRegistrationId != null) {
- hazzerBits |= 0x1;
- this.c2DmRegistrationId = c2DmRegistrationId;
- } else {
- this.c2DmRegistrationId = "";
- }
- if (clientKey != null) {
- hazzerBits |= 0x2;
- this.clientKey = clientKey;
- } else {
- this.clientKey = "";
- }
- if (senderId != null) {
- hazzerBits |= 0x4;
- this.senderId = senderId;
- } else {
- this.senderId = "";
- }
- this.channelVersion = channelVersion;
- if (packageName != null) {
- hazzerBits |= 0x8;
- this.packageName = packageName;
- } else {
- this.packageName = "";
- }
- this.__hazzerBits = hazzerBits;
- }
-
- public String getC2DmRegistrationId() { return c2DmRegistrationId; }
- public boolean hasC2DmRegistrationId() { return (0x1 & __hazzerBits) != 0; }
-
- public String getClientKey() { return clientKey; }
- public boolean hasClientKey() { return (0x2 & __hazzerBits) != 0; }
-
- public String getSenderId() { return senderId; }
- public boolean hasSenderId() { return (0x4 & __hazzerBits) != 0; }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version getNullableChannelVersion() { return channelVersion; }
-
- public String getPackageName() { return packageName; }
- public boolean hasPackageName() { return (0x8 & __hazzerBits) != 0; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof AndroidEndpointId)) { return false; }
- AndroidEndpointId other = (AndroidEndpointId) obj;
- return __hazzerBits == other.__hazzerBits
- && (!hasC2DmRegistrationId() || equals(c2DmRegistrationId, other.c2DmRegistrationId))
- && (!hasClientKey() || equals(clientKey, other.clientKey))
- && (!hasSenderId() || equals(senderId, other.senderId))
- && equals(channelVersion, other.channelVersion)
- && (!hasPackageName() || equals(packageName, other.packageName));
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- if (hasC2DmRegistrationId()) {
- result = result * 31 + c2DmRegistrationId.hashCode();
- }
- if (hasClientKey()) {
- result = result * 31 + clientKey.hashCode();
- }
- if (hasSenderId()) {
- result = result * 31 + senderId.hashCode();
- }
- if (channelVersion != null) {
- result = result * 31 + channelVersion.hashCode();
- }
- if (hasPackageName()) {
- result = result * 31 + packageName.hashCode();
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<AndroidEndpointId:");
- if (hasC2DmRegistrationId()) {
- builder.append(" c2dm_registration_id=").append(c2DmRegistrationId);
- }
- if (hasClientKey()) {
- builder.append(" client_key=").append(clientKey);
- }
- if (hasSenderId()) {
- builder.append(" sender_id=").append(senderId);
- }
- if (channelVersion != null) {
- builder.append(" channel_version=").append(channelVersion);
- }
- if (hasPackageName()) {
- builder.append(" package_name=").append(packageName);
- }
- builder.append('>');
- }
-
- public static AndroidEndpointId parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoAndroidChannel.AndroidEndpointId(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static AndroidEndpointId fromMessageNano(com.google.protos.ipc.invalidation.NanoAndroidChannel.AndroidEndpointId message) {
- if (message == null) { return null; }
- return new AndroidEndpointId(message.c2DmRegistrationId,
- message.clientKey,
- message.senderId,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version.fromMessageNano(message.channelVersion),
- message.packageName);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoAndroidChannel.AndroidEndpointId toMessageNano() {
- com.google.protos.ipc.invalidation.NanoAndroidChannel.AndroidEndpointId msg = new com.google.protos.ipc.invalidation.NanoAndroidChannel.AndroidEndpointId();
- msg.c2DmRegistrationId = hasC2DmRegistrationId() ? c2DmRegistrationId : null;
- msg.clientKey = hasClientKey() ? clientKey : null;
- msg.senderId = hasSenderId() ? senderId : null;
- msg.channelVersion = this.channelVersion != null ? channelVersion.toMessageNano() : null;
- msg.packageName = hasPackageName() ? packageName : null;
- return msg;
- }
- }
-
- public static final class AddressedAndroidMessage extends ProtoWrapper {
- public static AddressedAndroidMessage create(String clientKey,
- Bytes message) {
- return new AddressedAndroidMessage(clientKey, message);
- }
-
- public static final AddressedAndroidMessage DEFAULT_INSTANCE = new AddressedAndroidMessage(null, null);
-
- private final long __hazzerBits;
- private final String clientKey;
- private final Bytes message;
-
- private AddressedAndroidMessage(String clientKey,
- Bytes message) {
- int hazzerBits = 0;
- if (clientKey != null) {
- hazzerBits |= 0x1;
- this.clientKey = clientKey;
- } else {
- this.clientKey = "";
- }
- if (message != null) {
- hazzerBits |= 0x2;
- this.message = message;
- } else {
- this.message = Bytes.EMPTY_BYTES;
- }
- this.__hazzerBits = hazzerBits;
- }
-
- public String getClientKey() { return clientKey; }
- public boolean hasClientKey() { return (0x1 & __hazzerBits) != 0; }
-
- public Bytes getMessage() { return message; }
- public boolean hasMessage() { return (0x2 & __hazzerBits) != 0; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof AddressedAndroidMessage)) { return false; }
- AddressedAndroidMessage other = (AddressedAndroidMessage) obj;
- return __hazzerBits == other.__hazzerBits
- && (!hasClientKey() || equals(clientKey, other.clientKey))
- && (!hasMessage() || equals(message, other.message));
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- if (hasClientKey()) {
- result = result * 31 + clientKey.hashCode();
- }
- if (hasMessage()) {
- result = result * 31 + message.hashCode();
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<AddressedAndroidMessage:");
- if (hasClientKey()) {
- builder.append(" client_key=").append(clientKey);
- }
- if (hasMessage()) {
- builder.append(" message=").append(message);
- }
- builder.append('>');
- }
-
- public static AddressedAndroidMessage parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoAndroidChannel.AddressedAndroidMessage(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static AddressedAndroidMessage fromMessageNano(com.google.protos.ipc.invalidation.NanoAndroidChannel.AddressedAndroidMessage message) {
- if (message == null) { return null; }
- return new AddressedAndroidMessage(message.clientKey,
- Bytes.fromByteArray(message.message));
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoAndroidChannel.AddressedAndroidMessage toMessageNano() {
- com.google.protos.ipc.invalidation.NanoAndroidChannel.AddressedAndroidMessage msg = new com.google.protos.ipc.invalidation.NanoAndroidChannel.AddressedAndroidMessage();
- msg.clientKey = hasClientKey() ? clientKey : null;
- msg.message = hasMessage() ? message.getByteArray() : null;
- return msg;
- }
- }
-
- public static final class AddressedAndroidMessageBatch extends ProtoWrapper {
- public static AddressedAndroidMessageBatch create(Collection<com.google.ipc.invalidation.ticl.proto.AndroidChannel.AddressedAndroidMessage> addressedMessage) {
- return new AddressedAndroidMessageBatch(addressedMessage);
- }
-
- public static final AddressedAndroidMessageBatch DEFAULT_INSTANCE = new AddressedAndroidMessageBatch(null);
-
- private final List<com.google.ipc.invalidation.ticl.proto.AndroidChannel.AddressedAndroidMessage> addressedMessage;
-
- private AddressedAndroidMessageBatch(Collection<com.google.ipc.invalidation.ticl.proto.AndroidChannel.AddressedAndroidMessage> addressedMessage) {
- this.addressedMessage = optional("addressed_message", addressedMessage);
- }
-
- public List<com.google.ipc.invalidation.ticl.proto.AndroidChannel.AddressedAndroidMessage> getAddressedMessage() { return addressedMessage; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof AddressedAndroidMessageBatch)) { return false; }
- AddressedAndroidMessageBatch other = (AddressedAndroidMessageBatch) obj;
- return equals(addressedMessage, other.addressedMessage);
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + addressedMessage.hashCode();
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<AddressedAndroidMessageBatch:");
- builder.append(" addressed_message=[").append(addressedMessage).append(']');
- builder.append('>');
- }
-
- public static AddressedAndroidMessageBatch parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoAndroidChannel.AddressedAndroidMessageBatch(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static AddressedAndroidMessageBatch fromMessageNano(com.google.protos.ipc.invalidation.NanoAndroidChannel.AddressedAndroidMessageBatch message) {
- if (message == null) { return null; }
- List<com.google.ipc.invalidation.ticl.proto.AndroidChannel.AddressedAndroidMessage> addressedMessage = new ArrayList<com.google.ipc.invalidation.ticl.proto.AndroidChannel.AddressedAndroidMessage>(message.addressedMessage.length);
- for (int i = 0; i < message.addressedMessage.length; i++) {
- addressedMessage.add(com.google.ipc.invalidation.ticl.proto.AndroidChannel.AddressedAndroidMessage.fromMessageNano(message.addressedMessage[i]));
- }
- return new AddressedAndroidMessageBatch(addressedMessage);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoAndroidChannel.AddressedAndroidMessageBatch toMessageNano() {
- com.google.protos.ipc.invalidation.NanoAndroidChannel.AddressedAndroidMessageBatch msg = new com.google.protos.ipc.invalidation.NanoAndroidChannel.AddressedAndroidMessageBatch();
- msg.addressedMessage = new com.google.protos.ipc.invalidation.NanoAndroidChannel.AddressedAndroidMessage[addressedMessage.size()];
- for (int i = 0; i < msg.addressedMessage.length; i++) {
- msg.addressedMessage[i] = addressedMessage.get(i).toMessageNano();
- }
- return msg;
- }
- }
- public interface MajorVersion {
- public static final int INITIAL = 0;
- public static final int BATCH = 1;
- public static final int DEFAULT = 0;
- public static final int MIN_SUPPORTED = 0;
- public static final int MAX_SUPPORTED = 1;
- }
-
-}
diff --git a/java/com/google/ipc/invalidation/ticl/proto/AndroidListenerProtocol.java b/java/com/google/ipc/invalidation/ticl/proto/AndroidListenerProtocol.java
deleted file mode 100644
index 18443a1..0000000
--- a/java/com/google/ipc/invalidation/ticl/proto/AndroidListenerProtocol.java
+++ /dev/null
@@ -1,501 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-// Generated by j/c/g/ipc/invalidation/common/proto_wrapper_generator
-package com.google.ipc.invalidation.ticl.proto;
-
-import com.google.ipc.invalidation.util.Bytes;
-import com.google.ipc.invalidation.util.ProtoWrapper;
-import com.google.ipc.invalidation.util.ProtoWrapper.ValidationException;
-import com.google.ipc.invalidation.util.TextBuilder;
-import com.google.protobuf.nano.MessageNano;
-import com.google.protobuf.nano.InvalidProtocolBufferNanoException;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-
-public interface AndroidListenerProtocol {
-
- public static final class AndroidListenerState extends ProtoWrapper {
- public static final class RetryRegistrationState extends ProtoWrapper {
- public static RetryRegistrationState create(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP objectId,
- com.google.ipc.invalidation.ticl.proto.Client.ExponentialBackoffState exponentialBackoffState) {
- return new RetryRegistrationState(objectId, exponentialBackoffState);
- }
-
- public static final RetryRegistrationState DEFAULT_INSTANCE = new RetryRegistrationState(null, null);
-
- private final long __hazzerBits;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP objectId;
- private final com.google.ipc.invalidation.ticl.proto.Client.ExponentialBackoffState exponentialBackoffState;
-
- private RetryRegistrationState(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP objectId,
- com.google.ipc.invalidation.ticl.proto.Client.ExponentialBackoffState exponentialBackoffState) {
- int hazzerBits = 0;
- this.objectId = objectId;
- if (exponentialBackoffState != null) {
- hazzerBits |= 0x1;
- this.exponentialBackoffState = exponentialBackoffState;
- } else {
- this.exponentialBackoffState = com.google.ipc.invalidation.ticl.proto.Client.ExponentialBackoffState.DEFAULT_INSTANCE;
- }
- this.__hazzerBits = hazzerBits;
- }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP getNullableObjectId() { return objectId; }
-
- public com.google.ipc.invalidation.ticl.proto.Client.ExponentialBackoffState getExponentialBackoffState() { return exponentialBackoffState; }
- public boolean hasExponentialBackoffState() { return (0x1 & __hazzerBits) != 0; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof RetryRegistrationState)) { return false; }
- RetryRegistrationState other = (RetryRegistrationState) obj;
- return __hazzerBits == other.__hazzerBits
- && equals(objectId, other.objectId)
- && (!hasExponentialBackoffState() || equals(exponentialBackoffState, other.exponentialBackoffState));
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- if (objectId != null) {
- result = result * 31 + objectId.hashCode();
- }
- if (hasExponentialBackoffState()) {
- result = result * 31 + exponentialBackoffState.hashCode();
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<RetryRegistrationState:");
- if (objectId != null) {
- builder.append(" object_id=").append(objectId);
- }
- if (hasExponentialBackoffState()) {
- builder.append(" exponential_backoff_state=").append(exponentialBackoffState);
- }
- builder.append('>');
- }
-
- public static RetryRegistrationState parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoAndroidListenerProtocol.AndroidListenerState.RetryRegistrationState(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static RetryRegistrationState fromMessageNano(com.google.protos.ipc.invalidation.NanoAndroidListenerProtocol.AndroidListenerState.RetryRegistrationState message) {
- if (message == null) { return null; }
- return new RetryRegistrationState(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP.fromMessageNano(message.objectId),
- com.google.ipc.invalidation.ticl.proto.Client.ExponentialBackoffState.fromMessageNano(message.exponentialBackoffState));
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoAndroidListenerProtocol.AndroidListenerState.RetryRegistrationState toMessageNano() {
- com.google.protos.ipc.invalidation.NanoAndroidListenerProtocol.AndroidListenerState.RetryRegistrationState msg = new com.google.protos.ipc.invalidation.NanoAndroidListenerProtocol.AndroidListenerState.RetryRegistrationState();
- msg.objectId = this.objectId != null ? objectId.toMessageNano() : null;
- msg.exponentialBackoffState = hasExponentialBackoffState() ? exponentialBackoffState.toMessageNano() : null;
- return msg;
- }
- }
- public static AndroidListenerState create(Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> registration,
- Collection<com.google.ipc.invalidation.ticl.proto.AndroidListenerProtocol.AndroidListenerState.RetryRegistrationState> retryRegistrationState,
- Bytes clientId,
- Integer requestCodeSeqNum) {
- return new AndroidListenerState(registration, retryRegistrationState, clientId, requestCodeSeqNum);
- }
-
- public static final AndroidListenerState DEFAULT_INSTANCE = new AndroidListenerState(null, null, null, null);
-
- private final long __hazzerBits;
- private final List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> registration;
- private final List<com.google.ipc.invalidation.ticl.proto.AndroidListenerProtocol.AndroidListenerState.RetryRegistrationState> retryRegistrationState;
- private final Bytes clientId;
- private final int requestCodeSeqNum;
-
- private AndroidListenerState(Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> registration,
- Collection<com.google.ipc.invalidation.ticl.proto.AndroidListenerProtocol.AndroidListenerState.RetryRegistrationState> retryRegistrationState,
- Bytes clientId,
- Integer requestCodeSeqNum) {
- int hazzerBits = 0;
- this.registration = optional("registration", registration);
- this.retryRegistrationState = optional("retry_registration_state", retryRegistrationState);
- if (clientId != null) {
- hazzerBits |= 0x1;
- this.clientId = clientId;
- } else {
- this.clientId = Bytes.EMPTY_BYTES;
- }
- if (requestCodeSeqNum != null) {
- hazzerBits |= 0x2;
- this.requestCodeSeqNum = requestCodeSeqNum;
- } else {
- this.requestCodeSeqNum = 0;
- }
- this.__hazzerBits = hazzerBits;
- }
-
- public List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> getRegistration() { return registration; }
-
- public List<com.google.ipc.invalidation.ticl.proto.AndroidListenerProtocol.AndroidListenerState.RetryRegistrationState> getRetryRegistrationState() { return retryRegistrationState; }
-
- public Bytes getClientId() { return clientId; }
- public boolean hasClientId() { return (0x1 & __hazzerBits) != 0; }
-
- public int getRequestCodeSeqNum() { return requestCodeSeqNum; }
- public boolean hasRequestCodeSeqNum() { return (0x2 & __hazzerBits) != 0; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof AndroidListenerState)) { return false; }
- AndroidListenerState other = (AndroidListenerState) obj;
- return __hazzerBits == other.__hazzerBits
- && equals(registration, other.registration)
- && equals(retryRegistrationState, other.retryRegistrationState)
- && (!hasClientId() || equals(clientId, other.clientId))
- && (!hasRequestCodeSeqNum() || requestCodeSeqNum == other.requestCodeSeqNum);
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- result = result * 31 + registration.hashCode();
- result = result * 31 + retryRegistrationState.hashCode();
- if (hasClientId()) {
- result = result * 31 + clientId.hashCode();
- }
- if (hasRequestCodeSeqNum()) {
- result = result * 31 + hash(requestCodeSeqNum);
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<AndroidListenerState:");
- builder.append(" registration=[").append(registration).append(']');
- builder.append(" retry_registration_state=[").append(retryRegistrationState).append(']');
- if (hasClientId()) {
- builder.append(" client_id=").append(clientId);
- }
- if (hasRequestCodeSeqNum()) {
- builder.append(" request_code_seq_num=").append(requestCodeSeqNum);
- }
- builder.append('>');
- }
-
- public static AndroidListenerState parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoAndroidListenerProtocol.AndroidListenerState(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static AndroidListenerState fromMessageNano(com.google.protos.ipc.invalidation.NanoAndroidListenerProtocol.AndroidListenerState message) {
- if (message == null) { return null; }
- List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> registration = new ArrayList<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP>(message.registration.length);
- for (int i = 0; i < message.registration.length; i++) {
- registration.add(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP.fromMessageNano(message.registration[i]));
- }
- List<com.google.ipc.invalidation.ticl.proto.AndroidListenerProtocol.AndroidListenerState.RetryRegistrationState> retryRegistrationState = new ArrayList<com.google.ipc.invalidation.ticl.proto.AndroidListenerProtocol.AndroidListenerState.RetryRegistrationState>(message.retryRegistrationState.length);
- for (int i = 0; i < message.retryRegistrationState.length; i++) {
- retryRegistrationState.add(com.google.ipc.invalidation.ticl.proto.AndroidListenerProtocol.AndroidListenerState.RetryRegistrationState.fromMessageNano(message.retryRegistrationState[i]));
- }
- return new AndroidListenerState(registration,
- retryRegistrationState,
- Bytes.fromByteArray(message.clientId),
- message.requestCodeSeqNum);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoAndroidListenerProtocol.AndroidListenerState toMessageNano() {
- com.google.protos.ipc.invalidation.NanoAndroidListenerProtocol.AndroidListenerState msg = new com.google.protos.ipc.invalidation.NanoAndroidListenerProtocol.AndroidListenerState();
- msg.registration = new com.google.protos.ipc.invalidation.NanoClientProtocol.ObjectIdP[registration.size()];
- for (int i = 0; i < msg.registration.length; i++) {
- msg.registration[i] = registration.get(i).toMessageNano();
- }
- msg.retryRegistrationState = new com.google.protos.ipc.invalidation.NanoAndroidListenerProtocol.AndroidListenerState.RetryRegistrationState[retryRegistrationState.size()];
- for (int i = 0; i < msg.retryRegistrationState.length; i++) {
- msg.retryRegistrationState[i] = retryRegistrationState.get(i).toMessageNano();
- }
- msg.clientId = hasClientId() ? clientId.getByteArray() : null;
- msg.requestCodeSeqNum = hasRequestCodeSeqNum() ? requestCodeSeqNum : null;
- return msg;
- }
- }
-
- public static final class RegistrationCommand extends ProtoWrapper {
- public static RegistrationCommand create(Boolean isRegister,
- Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> objectId,
- Bytes clientId,
- Boolean isDelayed) {
- return new RegistrationCommand(isRegister, objectId, clientId, isDelayed);
- }
-
- public static final RegistrationCommand DEFAULT_INSTANCE = new RegistrationCommand(null, null, null, null);
-
- private final long __hazzerBits;
- private final boolean isRegister;
- private final List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> objectId;
- private final Bytes clientId;
- private final boolean isDelayed;
-
- private RegistrationCommand(Boolean isRegister,
- Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> objectId,
- Bytes clientId,
- Boolean isDelayed) {
- int hazzerBits = 0;
- if (isRegister != null) {
- hazzerBits |= 0x1;
- this.isRegister = isRegister;
- } else {
- this.isRegister = false;
- }
- this.objectId = optional("object_id", objectId);
- if (clientId != null) {
- hazzerBits |= 0x2;
- this.clientId = clientId;
- } else {
- this.clientId = Bytes.EMPTY_BYTES;
- }
- if (isDelayed != null) {
- hazzerBits |= 0x4;
- this.isDelayed = isDelayed;
- } else {
- this.isDelayed = false;
- }
- this.__hazzerBits = hazzerBits;
- }
-
- public boolean getIsRegister() { return isRegister; }
- public boolean hasIsRegister() { return (0x1 & __hazzerBits) != 0; }
-
- public List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> getObjectId() { return objectId; }
-
- public Bytes getClientId() { return clientId; }
- public boolean hasClientId() { return (0x2 & __hazzerBits) != 0; }
-
- public boolean getIsDelayed() { return isDelayed; }
- public boolean hasIsDelayed() { return (0x4 & __hazzerBits) != 0; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof RegistrationCommand)) { return false; }
- RegistrationCommand other = (RegistrationCommand) obj;
- return __hazzerBits == other.__hazzerBits
- && (!hasIsRegister() || isRegister == other.isRegister)
- && equals(objectId, other.objectId)
- && (!hasClientId() || equals(clientId, other.clientId))
- && (!hasIsDelayed() || isDelayed == other.isDelayed);
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- if (hasIsRegister()) {
- result = result * 31 + hash(isRegister);
- }
- result = result * 31 + objectId.hashCode();
- if (hasClientId()) {
- result = result * 31 + clientId.hashCode();
- }
- if (hasIsDelayed()) {
- result = result * 31 + hash(isDelayed);
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<RegistrationCommand:");
- if (hasIsRegister()) {
- builder.append(" is_register=").append(isRegister);
- }
- builder.append(" object_id=[").append(objectId).append(']');
- if (hasClientId()) {
- builder.append(" client_id=").append(clientId);
- }
- if (hasIsDelayed()) {
- builder.append(" is_delayed=").append(isDelayed);
- }
- builder.append('>');
- }
-
- public static RegistrationCommand parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoAndroidListenerProtocol.RegistrationCommand(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static RegistrationCommand fromMessageNano(com.google.protos.ipc.invalidation.NanoAndroidListenerProtocol.RegistrationCommand message) {
- if (message == null) { return null; }
- List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> objectId = new ArrayList<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP>(message.objectId.length);
- for (int i = 0; i < message.objectId.length; i++) {
- objectId.add(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP.fromMessageNano(message.objectId[i]));
- }
- return new RegistrationCommand(message.isRegister,
- objectId,
- Bytes.fromByteArray(message.clientId),
- message.isDelayed);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoAndroidListenerProtocol.RegistrationCommand toMessageNano() {
- com.google.protos.ipc.invalidation.NanoAndroidListenerProtocol.RegistrationCommand msg = new com.google.protos.ipc.invalidation.NanoAndroidListenerProtocol.RegistrationCommand();
- msg.isRegister = hasIsRegister() ? isRegister : null;
- msg.objectId = new com.google.protos.ipc.invalidation.NanoClientProtocol.ObjectIdP[objectId.size()];
- for (int i = 0; i < msg.objectId.length; i++) {
- msg.objectId[i] = objectId.get(i).toMessageNano();
- }
- msg.clientId = hasClientId() ? clientId.getByteArray() : null;
- msg.isDelayed = hasIsDelayed() ? isDelayed : null;
- return msg;
- }
- }
-
- public static final class StartCommand extends ProtoWrapper {
- public static StartCommand create(Integer clientType,
- Bytes clientName,
- Boolean allowSuppression) {
- return new StartCommand(clientType, clientName, allowSuppression);
- }
-
- public static final StartCommand DEFAULT_INSTANCE = new StartCommand(null, null, null);
-
- private final long __hazzerBits;
- private final int clientType;
- private final Bytes clientName;
- private final boolean allowSuppression;
-
- private StartCommand(Integer clientType,
- Bytes clientName,
- Boolean allowSuppression) {
- int hazzerBits = 0;
- if (clientType != null) {
- hazzerBits |= 0x1;
- this.clientType = clientType;
- } else {
- this.clientType = 0;
- }
- if (clientName != null) {
- hazzerBits |= 0x2;
- this.clientName = clientName;
- } else {
- this.clientName = Bytes.EMPTY_BYTES;
- }
- if (allowSuppression != null) {
- hazzerBits |= 0x4;
- this.allowSuppression = allowSuppression;
- } else {
- this.allowSuppression = false;
- }
- this.__hazzerBits = hazzerBits;
- }
-
- public int getClientType() { return clientType; }
- public boolean hasClientType() { return (0x1 & __hazzerBits) != 0; }
-
- public Bytes getClientName() { return clientName; }
- public boolean hasClientName() { return (0x2 & __hazzerBits) != 0; }
-
- public boolean getAllowSuppression() { return allowSuppression; }
- public boolean hasAllowSuppression() { return (0x4 & __hazzerBits) != 0; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof StartCommand)) { return false; }
- StartCommand other = (StartCommand) obj;
- return __hazzerBits == other.__hazzerBits
- && (!hasClientType() || clientType == other.clientType)
- && (!hasClientName() || equals(clientName, other.clientName))
- && (!hasAllowSuppression() || allowSuppression == other.allowSuppression);
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- if (hasClientType()) {
- result = result * 31 + hash(clientType);
- }
- if (hasClientName()) {
- result = result * 31 + clientName.hashCode();
- }
- if (hasAllowSuppression()) {
- result = result * 31 + hash(allowSuppression);
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<StartCommand:");
- if (hasClientType()) {
- builder.append(" client_type=").append(clientType);
- }
- if (hasClientName()) {
- builder.append(" client_name=").append(clientName);
- }
- if (hasAllowSuppression()) {
- builder.append(" allow_suppression=").append(allowSuppression);
- }
- builder.append('>');
- }
-
- public static StartCommand parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoAndroidListenerProtocol.StartCommand(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static StartCommand fromMessageNano(com.google.protos.ipc.invalidation.NanoAndroidListenerProtocol.StartCommand message) {
- if (message == null) { return null; }
- return new StartCommand(message.clientType,
- Bytes.fromByteArray(message.clientName),
- message.allowSuppression);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoAndroidListenerProtocol.StartCommand toMessageNano() {
- com.google.protos.ipc.invalidation.NanoAndroidListenerProtocol.StartCommand msg = new com.google.protos.ipc.invalidation.NanoAndroidListenerProtocol.StartCommand();
- msg.clientType = hasClientType() ? clientType : null;
- msg.clientName = hasClientName() ? clientName.getByteArray() : null;
- msg.allowSuppression = hasAllowSuppression() ? allowSuppression : null;
- return msg;
- }
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/proto/AndroidService.java b/java/com/google/ipc/invalidation/ticl/proto/AndroidService.java
deleted file mode 100644
index 0acdd52..0000000
--- a/java/com/google/ipc/invalidation/ticl/proto/AndroidService.java
+++ /dev/null
@@ -1,2009 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-// Generated by j/c/g/ipc/invalidation/common/proto_wrapper_generator
-package com.google.ipc.invalidation.ticl.proto;
-
-import com.google.ipc.invalidation.util.Bytes;
-import com.google.ipc.invalidation.util.ProtoWrapper;
-import com.google.ipc.invalidation.util.ProtoWrapper.ValidationException;
-import com.google.ipc.invalidation.util.TextBuilder;
-import com.google.protobuf.nano.MessageNano;
-import com.google.protobuf.nano.InvalidProtocolBufferNanoException;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-
-public interface AndroidService {
-
- public static final class ClientDowncall extends ProtoWrapper {
- public static final class StartDowncall extends ProtoWrapper {
- public static StartDowncall create() {
- return new StartDowncall();
- }
-
- public static final StartDowncall DEFAULT_INSTANCE = new StartDowncall();
-
-
- private StartDowncall() {
- }
-
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof StartDowncall)) { return false; }
- StartDowncall other = (StartDowncall) obj;
- return true;
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<StartDowncall:");
- builder.append('>');
- }
-
- public static StartDowncall parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoAndroidService.ClientDowncall.StartDowncall(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static StartDowncall fromMessageNano(com.google.protos.ipc.invalidation.NanoAndroidService.ClientDowncall.StartDowncall message) {
- if (message == null) { return null; }
- return new StartDowncall();
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoAndroidService.ClientDowncall.StartDowncall toMessageNano() {
- com.google.protos.ipc.invalidation.NanoAndroidService.ClientDowncall.StartDowncall msg = new com.google.protos.ipc.invalidation.NanoAndroidService.ClientDowncall.StartDowncall();
- return msg;
- }
- }
- public static final class StopDowncall extends ProtoWrapper {
- public static StopDowncall create() {
- return new StopDowncall();
- }
-
- public static final StopDowncall DEFAULT_INSTANCE = new StopDowncall();
-
-
- private StopDowncall() {
- }
-
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof StopDowncall)) { return false; }
- StopDowncall other = (StopDowncall) obj;
- return true;
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<StopDowncall:");
- builder.append('>');
- }
-
- public static StopDowncall parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoAndroidService.ClientDowncall.StopDowncall(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static StopDowncall fromMessageNano(com.google.protos.ipc.invalidation.NanoAndroidService.ClientDowncall.StopDowncall message) {
- if (message == null) { return null; }
- return new StopDowncall();
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoAndroidService.ClientDowncall.StopDowncall toMessageNano() {
- com.google.protos.ipc.invalidation.NanoAndroidService.ClientDowncall.StopDowncall msg = new com.google.protos.ipc.invalidation.NanoAndroidService.ClientDowncall.StopDowncall();
- return msg;
- }
- }
- public static final class AckDowncall extends ProtoWrapper {
- public static AckDowncall create(Bytes ackHandle) {
- return new AckDowncall(ackHandle);
- }
-
- private final Bytes ackHandle;
-
- private AckDowncall(Bytes ackHandle) throws ValidationArgumentException {
- required("ack_handle", ackHandle);
- this.ackHandle = ackHandle;
- }
-
- public Bytes getAckHandle() { return ackHandle; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof AckDowncall)) { return false; }
- AckDowncall other = (AckDowncall) obj;
- return equals(ackHandle, other.ackHandle);
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + ackHandle.hashCode();
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<AckDowncall:");
- builder.append(" ack_handle=").append(ackHandle);
- builder.append('>');
- }
-
- public static AckDowncall parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoAndroidService.ClientDowncall.AckDowncall(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static AckDowncall fromMessageNano(com.google.protos.ipc.invalidation.NanoAndroidService.ClientDowncall.AckDowncall message) {
- if (message == null) { return null; }
- return new AckDowncall(Bytes.fromByteArray(message.ackHandle));
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoAndroidService.ClientDowncall.AckDowncall toMessageNano() {
- com.google.protos.ipc.invalidation.NanoAndroidService.ClientDowncall.AckDowncall msg = new com.google.protos.ipc.invalidation.NanoAndroidService.ClientDowncall.AckDowncall();
- msg.ackHandle = ackHandle.getByteArray();
- return msg;
- }
- }
- public static final class RegistrationDowncall extends ProtoWrapper {
- public static RegistrationDowncall createWithRegistrations(Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> registrations) {
- return new RegistrationDowncall(registrations, null);
- }
-
- public static RegistrationDowncall createWithUnregistrations(Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> unregistrations) {
- return new RegistrationDowncall(null, unregistrations);
- }
-
- private final List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> registrations;
- private final List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> unregistrations;
-
- private RegistrationDowncall(Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> registrations,
- Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> unregistrations) throws ValidationArgumentException {
- this.registrations = optional("registrations", registrations);
- this.unregistrations = optional("unregistrations", unregistrations);
- String existingOneOfField = null;
- if (!this.registrations.isEmpty()) {
- existingOneOfField = "registrations";
- }
- if (!this.unregistrations.isEmpty()) {
- if (existingOneOfField != null) {
- oneOfViolation(existingOneOfField, "unregistrations");
- }
- existingOneOfField = "unregistrations";
- }
- if (existingOneOfField == null) { oneOfViolation(); }
- }
-
- public List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> getRegistrations() { return registrations; }
-
- public List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> getUnregistrations() { return unregistrations; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof RegistrationDowncall)) { return false; }
- RegistrationDowncall other = (RegistrationDowncall) obj;
- return equals(registrations, other.registrations)
- && equals(unregistrations, other.unregistrations);
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + registrations.hashCode();
- result = result * 31 + unregistrations.hashCode();
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<RegistrationDowncall:");
- builder.append(" registrations=[").append(registrations).append(']');
- builder.append(" unregistrations=[").append(unregistrations).append(']');
- builder.append('>');
- }
-
- public static RegistrationDowncall parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoAndroidService.ClientDowncall.RegistrationDowncall(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static RegistrationDowncall fromMessageNano(com.google.protos.ipc.invalidation.NanoAndroidService.ClientDowncall.RegistrationDowncall message) {
- if (message == null) { return null; }
- List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> registrations = new ArrayList<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP>(message.registrations.length);
- for (int i = 0; i < message.registrations.length; i++) {
- registrations.add(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP.fromMessageNano(message.registrations[i]));
- }
- List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> unregistrations = new ArrayList<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP>(message.unregistrations.length);
- for (int i = 0; i < message.unregistrations.length; i++) {
- unregistrations.add(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP.fromMessageNano(message.unregistrations[i]));
- }
- return new RegistrationDowncall(registrations,
- unregistrations);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoAndroidService.ClientDowncall.RegistrationDowncall toMessageNano() {
- com.google.protos.ipc.invalidation.NanoAndroidService.ClientDowncall.RegistrationDowncall msg = new com.google.protos.ipc.invalidation.NanoAndroidService.ClientDowncall.RegistrationDowncall();
- msg.registrations = new com.google.protos.ipc.invalidation.NanoClientProtocol.ObjectIdP[registrations.size()];
- for (int i = 0; i < msg.registrations.length; i++) {
- msg.registrations[i] = registrations.get(i).toMessageNano();
- }
- msg.unregistrations = new com.google.protos.ipc.invalidation.NanoClientProtocol.ObjectIdP[unregistrations.size()];
- for (int i = 0; i < msg.unregistrations.length; i++) {
- msg.unregistrations[i] = unregistrations.get(i).toMessageNano();
- }
- return msg;
- }
- }
- public static ClientDowncall createWithSerial(long serial,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version) {
- return new ClientDowncall(serial, version, null, null, null, null);
- }
-
- public static ClientDowncall createWithStart(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version,
- com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall.StartDowncall start) {
- return new ClientDowncall(null, version, start, null, null, null);
- }
-
- public static ClientDowncall createWithStop(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version,
- com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall.StopDowncall stop) {
- return new ClientDowncall(null, version, null, stop, null, null);
- }
-
- public static ClientDowncall createWithAck(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version,
- com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall.AckDowncall ack) {
- return new ClientDowncall(null, version, null, null, ack, null);
- }
-
- public static ClientDowncall createWithRegistrations(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version,
- com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall.RegistrationDowncall registrations) {
- return new ClientDowncall(null, version, null, null, null, registrations);
- }
-
- private final long __hazzerBits;
- private final long serial;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version;
- private final com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall.StartDowncall start;
- private final com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall.StopDowncall stop;
- private final com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall.AckDowncall ack;
- private final com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall.RegistrationDowncall registrations;
-
- private ClientDowncall(Long serial,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version,
- com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall.StartDowncall start,
- com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall.StopDowncall stop,
- com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall.AckDowncall ack,
- com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall.RegistrationDowncall registrations) throws ValidationArgumentException {
- int hazzerBits = 0;
- if (serial != null) {
- hazzerBits |= 0x1;
- this.serial = serial;
- } else {
- this.serial = 0;
- }
- required("version", version);
- this.version = version;
- if (start != null) {
- hazzerBits |= 0x2;
- this.start = start;
- } else {
- this.start = com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall.StartDowncall.DEFAULT_INSTANCE;
- }
- if (stop != null) {
- hazzerBits |= 0x4;
- this.stop = stop;
- } else {
- this.stop = com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall.StopDowncall.DEFAULT_INSTANCE;
- }
- this.ack = ack;
- this.registrations = registrations;
- this.__hazzerBits = hazzerBits;
- String existingOneOfField = null;
- if (hasStop()) {
- existingOneOfField = "stop";
- }
- if (hasStart()) {
- if (existingOneOfField != null) {
- oneOfViolation(existingOneOfField, "start");
- }
- existingOneOfField = "start";
- }
- if (hasSerial()) {
- if (existingOneOfField != null) {
- oneOfViolation(existingOneOfField, "serial");
- }
- existingOneOfField = "serial";
- }
- if (this.registrations != null) {
- if (existingOneOfField != null) {
- oneOfViolation(existingOneOfField, "registrations");
- }
- existingOneOfField = "registrations";
- }
- if (this.ack != null) {
- if (existingOneOfField != null) {
- oneOfViolation(existingOneOfField, "ack");
- }
- existingOneOfField = "ack";
- }
- if (existingOneOfField == null) { oneOfViolation(); }
- }
-
- public long getSerial() { return serial; }
- public boolean hasSerial() { return (0x1 & __hazzerBits) != 0; }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version getVersion() { return version; }
-
- public com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall.StartDowncall getStart() { return start; }
- public boolean hasStart() { return (0x2 & __hazzerBits) != 0; }
-
- public com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall.StopDowncall getStop() { return stop; }
- public boolean hasStop() { return (0x4 & __hazzerBits) != 0; }
-
- public com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall.AckDowncall getNullableAck() { return ack; }
-
- public com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall.RegistrationDowncall getNullableRegistrations() { return registrations; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof ClientDowncall)) { return false; }
- ClientDowncall other = (ClientDowncall) obj;
- return __hazzerBits == other.__hazzerBits
- && (!hasSerial() || serial == other.serial)
- && equals(version, other.version)
- && (!hasStart() || equals(start, other.start))
- && (!hasStop() || equals(stop, other.stop))
- && equals(ack, other.ack)
- && equals(registrations, other.registrations);
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- if (hasSerial()) {
- result = result * 31 + hash(serial);
- }
- result = result * 31 + version.hashCode();
- if (hasStart()) {
- result = result * 31 + start.hashCode();
- }
- if (hasStop()) {
- result = result * 31 + stop.hashCode();
- }
- if (ack != null) {
- result = result * 31 + ack.hashCode();
- }
- if (registrations != null) {
- result = result * 31 + registrations.hashCode();
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<ClientDowncall:");
- if (hasSerial()) {
- builder.append(" serial=").append(serial);
- }
- builder.append(" version=").append(version);
- if (hasStart()) {
- builder.append(" start=").append(start);
- }
- if (hasStop()) {
- builder.append(" stop=").append(stop);
- }
- if (ack != null) {
- builder.append(" ack=").append(ack);
- }
- if (registrations != null) {
- builder.append(" registrations=").append(registrations);
- }
- builder.append('>');
- }
-
- public static ClientDowncall parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoAndroidService.ClientDowncall(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static ClientDowncall fromMessageNano(com.google.protos.ipc.invalidation.NanoAndroidService.ClientDowncall message) {
- if (message == null) { return null; }
- return new ClientDowncall(message.serial,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version.fromMessageNano(message.version),
- com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall.StartDowncall.fromMessageNano(message.start),
- com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall.StopDowncall.fromMessageNano(message.stop),
- com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall.AckDowncall.fromMessageNano(message.ack),
- com.google.ipc.invalidation.ticl.proto.AndroidService.ClientDowncall.RegistrationDowncall.fromMessageNano(message.registrations));
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoAndroidService.ClientDowncall toMessageNano() {
- com.google.protos.ipc.invalidation.NanoAndroidService.ClientDowncall msg = new com.google.protos.ipc.invalidation.NanoAndroidService.ClientDowncall();
- msg.serial = hasSerial() ? serial : null;
- msg.version = version.toMessageNano();
- msg.start = hasStart() ? start.toMessageNano() : null;
- msg.stop = hasStop() ? stop.toMessageNano() : null;
- msg.ack = this.ack != null ? ack.toMessageNano() : null;
- msg.registrations = this.registrations != null ? registrations.toMessageNano() : null;
- return msg;
- }
- }
-
- public static final class InternalDowncall extends ProtoWrapper {
- public static final class ServerMessage extends ProtoWrapper {
- public static ServerMessage create(Bytes data) {
- return new ServerMessage(data);
- }
-
- private final Bytes data;
-
- private ServerMessage(Bytes data) throws ValidationArgumentException {
- required("data", data);
- this.data = data;
- }
-
- public Bytes getData() { return data; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof ServerMessage)) { return false; }
- ServerMessage other = (ServerMessage) obj;
- return equals(data, other.data);
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + data.hashCode();
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<ServerMessage:");
- builder.append(" data=").append(data);
- builder.append('>');
- }
-
- public static ServerMessage parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoAndroidService.InternalDowncall.ServerMessage(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static ServerMessage fromMessageNano(com.google.protos.ipc.invalidation.NanoAndroidService.InternalDowncall.ServerMessage message) {
- if (message == null) { return null; }
- return new ServerMessage(Bytes.fromByteArray(message.data));
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoAndroidService.InternalDowncall.ServerMessage toMessageNano() {
- com.google.protos.ipc.invalidation.NanoAndroidService.InternalDowncall.ServerMessage msg = new com.google.protos.ipc.invalidation.NanoAndroidService.InternalDowncall.ServerMessage();
- msg.data = data.getByteArray();
- return msg;
- }
- }
- public static final class NetworkStatus extends ProtoWrapper {
- public static NetworkStatus create(boolean isOnline) {
- return new NetworkStatus(isOnline);
- }
-
- private final boolean isOnline;
-
- private NetworkStatus(Boolean isOnline) throws ValidationArgumentException {
- required("is_online", isOnline);
- this.isOnline = isOnline;
- }
-
- public boolean getIsOnline() { return isOnline; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof NetworkStatus)) { return false; }
- NetworkStatus other = (NetworkStatus) obj;
- return isOnline == other.isOnline;
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + hash(isOnline);
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<NetworkStatus:");
- builder.append(" is_online=").append(isOnline);
- builder.append('>');
- }
-
- public static NetworkStatus parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoAndroidService.InternalDowncall.NetworkStatus(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static NetworkStatus fromMessageNano(com.google.protos.ipc.invalidation.NanoAndroidService.InternalDowncall.NetworkStatus message) {
- if (message == null) { return null; }
- return new NetworkStatus(message.isOnline);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoAndroidService.InternalDowncall.NetworkStatus toMessageNano() {
- com.google.protos.ipc.invalidation.NanoAndroidService.InternalDowncall.NetworkStatus msg = new com.google.protos.ipc.invalidation.NanoAndroidService.InternalDowncall.NetworkStatus();
- msg.isOnline = isOnline;
- return msg;
- }
- }
- public static final class CreateClient extends ProtoWrapper {
- public static CreateClient create(int clientType,
- Bytes clientName,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientConfigP clientConfig,
- boolean skipStartForTest) {
- return new CreateClient(clientType, clientName, clientConfig, skipStartForTest);
- }
-
- private final int clientType;
- private final Bytes clientName;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientConfigP clientConfig;
- private final boolean skipStartForTest;
-
- private CreateClient(Integer clientType,
- Bytes clientName,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientConfigP clientConfig,
- Boolean skipStartForTest) throws ValidationArgumentException {
- required("client_type", clientType);
- this.clientType = clientType;
- required("client_name", clientName);
- this.clientName = clientName;
- required("client_config", clientConfig);
- this.clientConfig = clientConfig;
- required("skip_start_for_test", skipStartForTest);
- this.skipStartForTest = skipStartForTest;
- }
-
- public int getClientType() { return clientType; }
-
- public Bytes getClientName() { return clientName; }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientConfigP getClientConfig() { return clientConfig; }
-
- public boolean getSkipStartForTest() { return skipStartForTest; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof CreateClient)) { return false; }
- CreateClient other = (CreateClient) obj;
- return clientType == other.clientType
- && equals(clientName, other.clientName)
- && equals(clientConfig, other.clientConfig)
- && skipStartForTest == other.skipStartForTest;
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + hash(clientType);
- result = result * 31 + clientName.hashCode();
- result = result * 31 + clientConfig.hashCode();
- result = result * 31 + hash(skipStartForTest);
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<CreateClient:");
- builder.append(" client_type=").append(clientType);
- builder.append(" client_name=").append(clientName);
- builder.append(" client_config=").append(clientConfig);
- builder.append(" skip_start_for_test=").append(skipStartForTest);
- builder.append('>');
- }
-
- public static CreateClient parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoAndroidService.InternalDowncall.CreateClient(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static CreateClient fromMessageNano(com.google.protos.ipc.invalidation.NanoAndroidService.InternalDowncall.CreateClient message) {
- if (message == null) { return null; }
- return new CreateClient(message.clientType,
- Bytes.fromByteArray(message.clientName),
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientConfigP.fromMessageNano(message.clientConfig),
- message.skipStartForTest);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoAndroidService.InternalDowncall.CreateClient toMessageNano() {
- com.google.protos.ipc.invalidation.NanoAndroidService.InternalDowncall.CreateClient msg = new com.google.protos.ipc.invalidation.NanoAndroidService.InternalDowncall.CreateClient();
- msg.clientType = clientType;
- msg.clientName = clientName.getByteArray();
- msg.clientConfig = clientConfig.toMessageNano();
- msg.skipStartForTest = skipStartForTest;
- return msg;
- }
- }
- public static InternalDowncall createWithServerMessage(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version,
- com.google.ipc.invalidation.ticl.proto.AndroidService.InternalDowncall.ServerMessage serverMessage) {
- return new InternalDowncall(version, serverMessage, null, null, null);
- }
-
- public static InternalDowncall createWithNetworkStatus(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version,
- com.google.ipc.invalidation.ticl.proto.AndroidService.InternalDowncall.NetworkStatus networkStatus) {
- return new InternalDowncall(version, null, networkStatus, null, null);
- }
-
- public static InternalDowncall createWithNetworkAddrChange(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version,
- boolean networkAddrChange) {
- return new InternalDowncall(version, null, null, networkAddrChange, null);
- }
-
- public static InternalDowncall createWithCreateClient(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version,
- com.google.ipc.invalidation.ticl.proto.AndroidService.InternalDowncall.CreateClient createClient) {
- return new InternalDowncall(version, null, null, null, createClient);
- }
-
- private final long __hazzerBits;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version;
- private final com.google.ipc.invalidation.ticl.proto.AndroidService.InternalDowncall.ServerMessage serverMessage;
- private final com.google.ipc.invalidation.ticl.proto.AndroidService.InternalDowncall.NetworkStatus networkStatus;
- private final boolean networkAddrChange;
- private final com.google.ipc.invalidation.ticl.proto.AndroidService.InternalDowncall.CreateClient createClient;
-
- private InternalDowncall(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version,
- com.google.ipc.invalidation.ticl.proto.AndroidService.InternalDowncall.ServerMessage serverMessage,
- com.google.ipc.invalidation.ticl.proto.AndroidService.InternalDowncall.NetworkStatus networkStatus,
- Boolean networkAddrChange,
- com.google.ipc.invalidation.ticl.proto.AndroidService.InternalDowncall.CreateClient createClient) throws ValidationArgumentException {
- int hazzerBits = 0;
- required("version", version);
- this.version = version;
- this.serverMessage = serverMessage;
- this.networkStatus = networkStatus;
- if (networkAddrChange != null) {
- hazzerBits |= 0x1;
- this.networkAddrChange = networkAddrChange;
- } else {
- this.networkAddrChange = false;
- }
- this.createClient = createClient;
- this.__hazzerBits = hazzerBits;
- String existingOneOfField = null;
- if (hasNetworkAddrChange()) {
- existingOneOfField = "network_addr_change";
- }
- if (this.networkStatus != null) {
- if (existingOneOfField != null) {
- oneOfViolation(existingOneOfField, "network_status");
- }
- existingOneOfField = "network_status";
- }
- if (this.createClient != null) {
- if (existingOneOfField != null) {
- oneOfViolation(existingOneOfField, "create_client");
- }
- existingOneOfField = "create_client";
- }
- if (this.serverMessage != null) {
- if (existingOneOfField != null) {
- oneOfViolation(existingOneOfField, "server_message");
- }
- existingOneOfField = "server_message";
- }
- if (existingOneOfField == null) { oneOfViolation(); }
- }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version getVersion() { return version; }
-
- public com.google.ipc.invalidation.ticl.proto.AndroidService.InternalDowncall.ServerMessage getNullableServerMessage() { return serverMessage; }
-
- public com.google.ipc.invalidation.ticl.proto.AndroidService.InternalDowncall.NetworkStatus getNullableNetworkStatus() { return networkStatus; }
-
- public boolean getNetworkAddrChange() { return networkAddrChange; }
- public boolean hasNetworkAddrChange() { return (0x1 & __hazzerBits) != 0; }
-
- public com.google.ipc.invalidation.ticl.proto.AndroidService.InternalDowncall.CreateClient getNullableCreateClient() { return createClient; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof InternalDowncall)) { return false; }
- InternalDowncall other = (InternalDowncall) obj;
- return __hazzerBits == other.__hazzerBits
- && equals(version, other.version)
- && equals(serverMessage, other.serverMessage)
- && equals(networkStatus, other.networkStatus)
- && (!hasNetworkAddrChange() || networkAddrChange == other.networkAddrChange)
- && equals(createClient, other.createClient);
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- result = result * 31 + version.hashCode();
- if (serverMessage != null) {
- result = result * 31 + serverMessage.hashCode();
- }
- if (networkStatus != null) {
- result = result * 31 + networkStatus.hashCode();
- }
- if (hasNetworkAddrChange()) {
- result = result * 31 + hash(networkAddrChange);
- }
- if (createClient != null) {
- result = result * 31 + createClient.hashCode();
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<InternalDowncall:");
- builder.append(" version=").append(version);
- if (serverMessage != null) {
- builder.append(" server_message=").append(serverMessage);
- }
- if (networkStatus != null) {
- builder.append(" network_status=").append(networkStatus);
- }
- if (hasNetworkAddrChange()) {
- builder.append(" network_addr_change=").append(networkAddrChange);
- }
- if (createClient != null) {
- builder.append(" create_client=").append(createClient);
- }
- builder.append('>');
- }
-
- public static InternalDowncall parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoAndroidService.InternalDowncall(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static InternalDowncall fromMessageNano(com.google.protos.ipc.invalidation.NanoAndroidService.InternalDowncall message) {
- if (message == null) { return null; }
- return new InternalDowncall(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version.fromMessageNano(message.version),
- com.google.ipc.invalidation.ticl.proto.AndroidService.InternalDowncall.ServerMessage.fromMessageNano(message.serverMessage),
- com.google.ipc.invalidation.ticl.proto.AndroidService.InternalDowncall.NetworkStatus.fromMessageNano(message.networkStatus),
- message.networkAddrChange,
- com.google.ipc.invalidation.ticl.proto.AndroidService.InternalDowncall.CreateClient.fromMessageNano(message.createClient));
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoAndroidService.InternalDowncall toMessageNano() {
- com.google.protos.ipc.invalidation.NanoAndroidService.InternalDowncall msg = new com.google.protos.ipc.invalidation.NanoAndroidService.InternalDowncall();
- msg.version = version.toMessageNano();
- msg.serverMessage = this.serverMessage != null ? serverMessage.toMessageNano() : null;
- msg.networkStatus = this.networkStatus != null ? networkStatus.toMessageNano() : null;
- msg.networkAddrChange = hasNetworkAddrChange() ? networkAddrChange : null;
- msg.createClient = this.createClient != null ? createClient.toMessageNano() : null;
- return msg;
- }
- }
-
- public static final class ListenerUpcall extends ProtoWrapper {
- public static final class ReadyUpcall extends ProtoWrapper {
- public static ReadyUpcall create() {
- return new ReadyUpcall();
- }
-
- public static final ReadyUpcall DEFAULT_INSTANCE = new ReadyUpcall();
-
-
- private ReadyUpcall() {
- }
-
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof ReadyUpcall)) { return false; }
- ReadyUpcall other = (ReadyUpcall) obj;
- return true;
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<ReadyUpcall:");
- builder.append('>');
- }
-
- public static ReadyUpcall parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.ReadyUpcall(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static ReadyUpcall fromMessageNano(com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.ReadyUpcall message) {
- if (message == null) { return null; }
- return new ReadyUpcall();
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.ReadyUpcall toMessageNano() {
- com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.ReadyUpcall msg = new com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.ReadyUpcall();
- return msg;
- }
- }
- public static final class InvalidateUpcall extends ProtoWrapper {
- public static InvalidateUpcall createWithInvalidation(Bytes ackHandle,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP invalidation) {
- return new InvalidateUpcall(ackHandle, invalidation, null, null);
- }
-
- public static InvalidateUpcall createWithInvalidateUnknown(Bytes ackHandle,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP invalidateUnknown) {
- return new InvalidateUpcall(ackHandle, null, invalidateUnknown, null);
- }
-
- public static InvalidateUpcall createWithInvalidateAll(Bytes ackHandle,
- boolean invalidateAll) {
- return new InvalidateUpcall(ackHandle, null, null, invalidateAll);
- }
-
- private final long __hazzerBits;
- private final Bytes ackHandle;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP invalidation;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP invalidateUnknown;
- private final boolean invalidateAll;
-
- private InvalidateUpcall(Bytes ackHandle,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP invalidation,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP invalidateUnknown,
- Boolean invalidateAll) throws ValidationArgumentException {
- int hazzerBits = 0;
- required("ack_handle", ackHandle);
- this.ackHandle = ackHandle;
- this.invalidation = invalidation;
- this.invalidateUnknown = invalidateUnknown;
- if (invalidateAll != null) {
- hazzerBits |= 0x1;
- this.invalidateAll = invalidateAll;
- } else {
- this.invalidateAll = false;
- }
- this.__hazzerBits = hazzerBits;
- String existingOneOfField = null;
- if (this.invalidateUnknown != null) {
- existingOneOfField = "invalidate_unknown";
- }
- if (this.invalidation != null) {
- if (existingOneOfField != null) {
- oneOfViolation(existingOneOfField, "invalidation");
- }
- existingOneOfField = "invalidation";
- }
- if (hasInvalidateAll()) {
- if (existingOneOfField != null) {
- oneOfViolation(existingOneOfField, "invalidate_all");
- }
- existingOneOfField = "invalidate_all";
- }
- if (existingOneOfField == null) { oneOfViolation(); }
- }
-
- public Bytes getAckHandle() { return ackHandle; }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP getNullableInvalidation() { return invalidation; }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP getNullableInvalidateUnknown() { return invalidateUnknown; }
-
- public boolean getInvalidateAll() { return invalidateAll; }
- public boolean hasInvalidateAll() { return (0x1 & __hazzerBits) != 0; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof InvalidateUpcall)) { return false; }
- InvalidateUpcall other = (InvalidateUpcall) obj;
- return __hazzerBits == other.__hazzerBits
- && equals(ackHandle, other.ackHandle)
- && equals(invalidation, other.invalidation)
- && equals(invalidateUnknown, other.invalidateUnknown)
- && (!hasInvalidateAll() || invalidateAll == other.invalidateAll);
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- result = result * 31 + ackHandle.hashCode();
- if (invalidation != null) {
- result = result * 31 + invalidation.hashCode();
- }
- if (invalidateUnknown != null) {
- result = result * 31 + invalidateUnknown.hashCode();
- }
- if (hasInvalidateAll()) {
- result = result * 31 + hash(invalidateAll);
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<InvalidateUpcall:");
- builder.append(" ack_handle=").append(ackHandle);
- if (invalidation != null) {
- builder.append(" invalidation=").append(invalidation);
- }
- if (invalidateUnknown != null) {
- builder.append(" invalidate_unknown=").append(invalidateUnknown);
- }
- if (hasInvalidateAll()) {
- builder.append(" invalidate_all=").append(invalidateAll);
- }
- builder.append('>');
- }
-
- public static InvalidateUpcall parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.InvalidateUpcall(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static InvalidateUpcall fromMessageNano(com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.InvalidateUpcall message) {
- if (message == null) { return null; }
- return new InvalidateUpcall(Bytes.fromByteArray(message.ackHandle),
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP.fromMessageNano(message.invalidation),
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP.fromMessageNano(message.invalidateUnknown),
- message.invalidateAll);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.InvalidateUpcall toMessageNano() {
- com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.InvalidateUpcall msg = new com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.InvalidateUpcall();
- msg.ackHandle = ackHandle.getByteArray();
- msg.invalidation = this.invalidation != null ? invalidation.toMessageNano() : null;
- msg.invalidateUnknown = this.invalidateUnknown != null ? invalidateUnknown.toMessageNano() : null;
- msg.invalidateAll = hasInvalidateAll() ? invalidateAll : null;
- return msg;
- }
- }
- public static final class RegistrationStatusUpcall extends ProtoWrapper {
- public static RegistrationStatusUpcall create(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP objectId,
- boolean isRegistered) {
- return new RegistrationStatusUpcall(objectId, isRegistered);
- }
-
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP objectId;
- private final boolean isRegistered;
-
- private RegistrationStatusUpcall(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP objectId,
- Boolean isRegistered) throws ValidationArgumentException {
- required("object_id", objectId);
- this.objectId = objectId;
- required("is_registered", isRegistered);
- this.isRegistered = isRegistered;
- }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP getObjectId() { return objectId; }
-
- public boolean getIsRegistered() { return isRegistered; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof RegistrationStatusUpcall)) { return false; }
- RegistrationStatusUpcall other = (RegistrationStatusUpcall) obj;
- return equals(objectId, other.objectId)
- && isRegistered == other.isRegistered;
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + objectId.hashCode();
- result = result * 31 + hash(isRegistered);
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<RegistrationStatusUpcall:");
- builder.append(" object_id=").append(objectId);
- builder.append(" is_registered=").append(isRegistered);
- builder.append('>');
- }
-
- public static RegistrationStatusUpcall parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.RegistrationStatusUpcall(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static RegistrationStatusUpcall fromMessageNano(com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.RegistrationStatusUpcall message) {
- if (message == null) { return null; }
- return new RegistrationStatusUpcall(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP.fromMessageNano(message.objectId),
- message.isRegistered);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.RegistrationStatusUpcall toMessageNano() {
- com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.RegistrationStatusUpcall msg = new com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.RegistrationStatusUpcall();
- msg.objectId = objectId.toMessageNano();
- msg.isRegistered = isRegistered;
- return msg;
- }
- }
- public static final class RegistrationFailureUpcall extends ProtoWrapper {
- public static RegistrationFailureUpcall create(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP objectId,
- boolean transient_,
- String message) {
- return new RegistrationFailureUpcall(objectId, transient_, message);
- }
-
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP objectId;
- private final boolean transient_;
- private final String message;
-
- private RegistrationFailureUpcall(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP objectId,
- Boolean transient_,
- String message) throws ValidationArgumentException {
- required("object_id", objectId);
- this.objectId = objectId;
- required("transient", transient_);
- this.transient_ = transient_;
- required("message", message);
- this.message = message;
- }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP getObjectId() { return objectId; }
-
- public boolean getTransient() { return transient_; }
-
- public String getMessage() { return message; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof RegistrationFailureUpcall)) { return false; }
- RegistrationFailureUpcall other = (RegistrationFailureUpcall) obj;
- return equals(objectId, other.objectId)
- && transient_ == other.transient_
- && equals(message, other.message);
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + objectId.hashCode();
- result = result * 31 + hash(transient_);
- result = result * 31 + message.hashCode();
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<RegistrationFailureUpcall:");
- builder.append(" object_id=").append(objectId);
- builder.append(" transient=").append(transient_);
- builder.append(" message=").append(message);
- builder.append('>');
- }
-
- public static RegistrationFailureUpcall parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.RegistrationFailureUpcall(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static RegistrationFailureUpcall fromMessageNano(com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.RegistrationFailureUpcall message) {
- if (message == null) { return null; }
- return new RegistrationFailureUpcall(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP.fromMessageNano(message.objectId),
- message.transient_,
- message.message);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.RegistrationFailureUpcall toMessageNano() {
- com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.RegistrationFailureUpcall msg = new com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.RegistrationFailureUpcall();
- msg.objectId = objectId.toMessageNano();
- msg.transient_ = transient_;
- msg.message = message;
- return msg;
- }
- }
- public static final class ReissueRegistrationsUpcall extends ProtoWrapper {
- public static ReissueRegistrationsUpcall create(Bytes prefix,
- int length) {
- return new ReissueRegistrationsUpcall(prefix, length);
- }
-
- private final Bytes prefix;
- private final int length;
-
- private ReissueRegistrationsUpcall(Bytes prefix,
- Integer length) throws ValidationArgumentException {
- required("prefix", prefix);
- this.prefix = prefix;
- required("length", length);
- this.length = length;
- }
-
- public Bytes getPrefix() { return prefix; }
-
- public int getLength() { return length; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof ReissueRegistrationsUpcall)) { return false; }
- ReissueRegistrationsUpcall other = (ReissueRegistrationsUpcall) obj;
- return equals(prefix, other.prefix)
- && length == other.length;
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + prefix.hashCode();
- result = result * 31 + hash(length);
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<ReissueRegistrationsUpcall:");
- builder.append(" prefix=").append(prefix);
- builder.append(" length=").append(length);
- builder.append('>');
- }
-
- public static ReissueRegistrationsUpcall parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.ReissueRegistrationsUpcall(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static ReissueRegistrationsUpcall fromMessageNano(com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.ReissueRegistrationsUpcall message) {
- if (message == null) { return null; }
- return new ReissueRegistrationsUpcall(Bytes.fromByteArray(message.prefix),
- message.length);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.ReissueRegistrationsUpcall toMessageNano() {
- com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.ReissueRegistrationsUpcall msg = new com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.ReissueRegistrationsUpcall();
- msg.prefix = prefix.getByteArray();
- msg.length = length;
- return msg;
- }
- }
- public static final class ErrorUpcall extends ProtoWrapper {
- public static ErrorUpcall create(int errorCode,
- String errorMessage,
- boolean isTransient) {
- return new ErrorUpcall(errorCode, errorMessage, isTransient);
- }
-
- private final int errorCode;
- private final String errorMessage;
- private final boolean isTransient;
-
- private ErrorUpcall(Integer errorCode,
- String errorMessage,
- Boolean isTransient) throws ValidationArgumentException {
- required("error_code", errorCode);
- this.errorCode = errorCode;
- required("error_message", errorMessage);
- this.errorMessage = errorMessage;
- required("is_transient", isTransient);
- this.isTransient = isTransient;
- }
-
- public int getErrorCode() { return errorCode; }
-
- public String getErrorMessage() { return errorMessage; }
-
- public boolean getIsTransient() { return isTransient; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof ErrorUpcall)) { return false; }
- ErrorUpcall other = (ErrorUpcall) obj;
- return errorCode == other.errorCode
- && equals(errorMessage, other.errorMessage)
- && isTransient == other.isTransient;
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + hash(errorCode);
- result = result * 31 + errorMessage.hashCode();
- result = result * 31 + hash(isTransient);
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<ErrorUpcall:");
- builder.append(" error_code=").append(errorCode);
- builder.append(" error_message=").append(errorMessage);
- builder.append(" is_transient=").append(isTransient);
- builder.append('>');
- }
-
- public static ErrorUpcall parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.ErrorUpcall(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static ErrorUpcall fromMessageNano(com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.ErrorUpcall message) {
- if (message == null) { return null; }
- return new ErrorUpcall(message.errorCode,
- message.errorMessage,
- message.isTransient);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.ErrorUpcall toMessageNano() {
- com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.ErrorUpcall msg = new com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall.ErrorUpcall();
- msg.errorCode = errorCode;
- msg.errorMessage = errorMessage;
- msg.isTransient = isTransient;
- return msg;
- }
- }
- public static ListenerUpcall createWithSerial(long serial,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version) {
- return new ListenerUpcall(serial, version, null, null, null, null, null, null);
- }
-
- public static ListenerUpcall createWithReady(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version,
- com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.ReadyUpcall ready) {
- return new ListenerUpcall(null, version, ready, null, null, null, null, null);
- }
-
- public static ListenerUpcall createWithInvalidate(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version,
- com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.InvalidateUpcall invalidate) {
- return new ListenerUpcall(null, version, null, invalidate, null, null, null, null);
- }
-
- public static ListenerUpcall createWithRegistrationStatus(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version,
- com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.RegistrationStatusUpcall registrationStatus) {
- return new ListenerUpcall(null, version, null, null, registrationStatus, null, null, null);
- }
-
- public static ListenerUpcall createWithRegistrationFailure(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version,
- com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.RegistrationFailureUpcall registrationFailure) {
- return new ListenerUpcall(null, version, null, null, null, registrationFailure, null, null);
- }
-
- public static ListenerUpcall createWithReissueRegistrations(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version,
- com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.ReissueRegistrationsUpcall reissueRegistrations) {
- return new ListenerUpcall(null, version, null, null, null, null, reissueRegistrations, null);
- }
-
- public static ListenerUpcall createWithError(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version,
- com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.ErrorUpcall error) {
- return new ListenerUpcall(null, version, null, null, null, null, null, error);
- }
-
- private final long __hazzerBits;
- private final long serial;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version;
- private final com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.ReadyUpcall ready;
- private final com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.InvalidateUpcall invalidate;
- private final com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.RegistrationStatusUpcall registrationStatus;
- private final com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.RegistrationFailureUpcall registrationFailure;
- private final com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.ReissueRegistrationsUpcall reissueRegistrations;
- private final com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.ErrorUpcall error;
-
- private ListenerUpcall(Long serial,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version,
- com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.ReadyUpcall ready,
- com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.InvalidateUpcall invalidate,
- com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.RegistrationStatusUpcall registrationStatus,
- com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.RegistrationFailureUpcall registrationFailure,
- com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.ReissueRegistrationsUpcall reissueRegistrations,
- com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.ErrorUpcall error) throws ValidationArgumentException {
- int hazzerBits = 0;
- if (serial != null) {
- hazzerBits |= 0x1;
- this.serial = serial;
- } else {
- this.serial = 0;
- }
- required("version", version);
- this.version = version;
- if (ready != null) {
- hazzerBits |= 0x2;
- this.ready = ready;
- } else {
- this.ready = com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.ReadyUpcall.DEFAULT_INSTANCE;
- }
- this.invalidate = invalidate;
- this.registrationStatus = registrationStatus;
- this.registrationFailure = registrationFailure;
- this.reissueRegistrations = reissueRegistrations;
- this.error = error;
- this.__hazzerBits = hazzerBits;
- String existingOneOfField = null;
- if (this.reissueRegistrations != null) {
- existingOneOfField = "reissue_registrations";
- }
- if (hasSerial()) {
- if (existingOneOfField != null) {
- oneOfViolation(existingOneOfField, "serial");
- }
- existingOneOfField = "serial";
- }
- if (this.registrationFailure != null) {
- if (existingOneOfField != null) {
- oneOfViolation(existingOneOfField, "registration_failure");
- }
- existingOneOfField = "registration_failure";
- }
- if (hasReady()) {
- if (existingOneOfField != null) {
- oneOfViolation(existingOneOfField, "ready");
- }
- existingOneOfField = "ready";
- }
- if (this.invalidate != null) {
- if (existingOneOfField != null) {
- oneOfViolation(existingOneOfField, "invalidate");
- }
- existingOneOfField = "invalidate";
- }
- if (this.registrationStatus != null) {
- if (existingOneOfField != null) {
- oneOfViolation(existingOneOfField, "registration_status");
- }
- existingOneOfField = "registration_status";
- }
- if (this.error != null) {
- if (existingOneOfField != null) {
- oneOfViolation(existingOneOfField, "error");
- }
- existingOneOfField = "error";
- }
- if (existingOneOfField == null) { oneOfViolation(); }
- }
-
- public long getSerial() { return serial; }
- public boolean hasSerial() { return (0x1 & __hazzerBits) != 0; }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version getVersion() { return version; }
-
- public com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.ReadyUpcall getReady() { return ready; }
- public boolean hasReady() { return (0x2 & __hazzerBits) != 0; }
-
- public com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.InvalidateUpcall getNullableInvalidate() { return invalidate; }
-
- public com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.RegistrationStatusUpcall getNullableRegistrationStatus() { return registrationStatus; }
-
- public com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.RegistrationFailureUpcall getNullableRegistrationFailure() { return registrationFailure; }
-
- public com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.ReissueRegistrationsUpcall getNullableReissueRegistrations() { return reissueRegistrations; }
-
- public com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.ErrorUpcall getNullableError() { return error; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof ListenerUpcall)) { return false; }
- ListenerUpcall other = (ListenerUpcall) obj;
- return __hazzerBits == other.__hazzerBits
- && (!hasSerial() || serial == other.serial)
- && equals(version, other.version)
- && (!hasReady() || equals(ready, other.ready))
- && equals(invalidate, other.invalidate)
- && equals(registrationStatus, other.registrationStatus)
- && equals(registrationFailure, other.registrationFailure)
- && equals(reissueRegistrations, other.reissueRegistrations)
- && equals(error, other.error);
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- if (hasSerial()) {
- result = result * 31 + hash(serial);
- }
- result = result * 31 + version.hashCode();
- if (hasReady()) {
- result = result * 31 + ready.hashCode();
- }
- if (invalidate != null) {
- result = result * 31 + invalidate.hashCode();
- }
- if (registrationStatus != null) {
- result = result * 31 + registrationStatus.hashCode();
- }
- if (registrationFailure != null) {
- result = result * 31 + registrationFailure.hashCode();
- }
- if (reissueRegistrations != null) {
- result = result * 31 + reissueRegistrations.hashCode();
- }
- if (error != null) {
- result = result * 31 + error.hashCode();
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<ListenerUpcall:");
- if (hasSerial()) {
- builder.append(" serial=").append(serial);
- }
- builder.append(" version=").append(version);
- if (hasReady()) {
- builder.append(" ready=").append(ready);
- }
- if (invalidate != null) {
- builder.append(" invalidate=").append(invalidate);
- }
- if (registrationStatus != null) {
- builder.append(" registration_status=").append(registrationStatus);
- }
- if (registrationFailure != null) {
- builder.append(" registration_failure=").append(registrationFailure);
- }
- if (reissueRegistrations != null) {
- builder.append(" reissue_registrations=").append(reissueRegistrations);
- }
- if (error != null) {
- builder.append(" error=").append(error);
- }
- builder.append('>');
- }
-
- public static ListenerUpcall parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static ListenerUpcall fromMessageNano(com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall message) {
- if (message == null) { return null; }
- return new ListenerUpcall(message.serial,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version.fromMessageNano(message.version),
- com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.ReadyUpcall.fromMessageNano(message.ready),
- com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.InvalidateUpcall.fromMessageNano(message.invalidate),
- com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.RegistrationStatusUpcall.fromMessageNano(message.registrationStatus),
- com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.RegistrationFailureUpcall.fromMessageNano(message.registrationFailure),
- com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.ReissueRegistrationsUpcall.fromMessageNano(message.reissueRegistrations),
- com.google.ipc.invalidation.ticl.proto.AndroidService.ListenerUpcall.ErrorUpcall.fromMessageNano(message.error));
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall toMessageNano() {
- com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall msg = new com.google.protos.ipc.invalidation.NanoAndroidService.ListenerUpcall();
- msg.serial = hasSerial() ? serial : null;
- msg.version = version.toMessageNano();
- msg.ready = hasReady() ? ready.toMessageNano() : null;
- msg.invalidate = this.invalidate != null ? invalidate.toMessageNano() : null;
- msg.registrationStatus = this.registrationStatus != null ? registrationStatus.toMessageNano() : null;
- msg.registrationFailure = this.registrationFailure != null ? registrationFailure.toMessageNano() : null;
- msg.reissueRegistrations = this.reissueRegistrations != null ? reissueRegistrations.toMessageNano() : null;
- msg.error = this.error != null ? error.toMessageNano() : null;
- return msg;
- }
- }
-
- public static final class AndroidSchedulerEvent extends ProtoWrapper {
- public static AndroidSchedulerEvent create(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version,
- String eventName,
- long ticlId) {
- return new AndroidSchedulerEvent(version, eventName, ticlId);
- }
-
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version;
- private final String eventName;
- private final long ticlId;
-
- private AndroidSchedulerEvent(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version,
- String eventName,
- Long ticlId) throws ValidationArgumentException {
- required("version", version);
- this.version = version;
- required("event_name", eventName);
- this.eventName = eventName;
- required("ticl_id", ticlId);
- this.ticlId = ticlId;
- }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version getVersion() { return version; }
-
- public String getEventName() { return eventName; }
-
- public long getTiclId() { return ticlId; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof AndroidSchedulerEvent)) { return false; }
- AndroidSchedulerEvent other = (AndroidSchedulerEvent) obj;
- return equals(version, other.version)
- && equals(eventName, other.eventName)
- && ticlId == other.ticlId;
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + version.hashCode();
- result = result * 31 + eventName.hashCode();
- result = result * 31 + hash(ticlId);
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<AndroidSchedulerEvent:");
- builder.append(" version=").append(version);
- builder.append(" event_name=").append(eventName);
- builder.append(" ticl_id=").append(ticlId);
- builder.append('>');
- }
-
- public static AndroidSchedulerEvent parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoAndroidService.AndroidSchedulerEvent(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static AndroidSchedulerEvent fromMessageNano(com.google.protos.ipc.invalidation.NanoAndroidService.AndroidSchedulerEvent message) {
- if (message == null) { return null; }
- return new AndroidSchedulerEvent(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version.fromMessageNano(message.version),
- message.eventName,
- message.ticlId);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoAndroidService.AndroidSchedulerEvent toMessageNano() {
- com.google.protos.ipc.invalidation.NanoAndroidService.AndroidSchedulerEvent msg = new com.google.protos.ipc.invalidation.NanoAndroidService.AndroidSchedulerEvent();
- msg.version = version.toMessageNano();
- msg.eventName = eventName;
- msg.ticlId = ticlId;
- return msg;
- }
- }
-
- public static final class AndroidNetworkSendRequest extends ProtoWrapper {
- public static AndroidNetworkSendRequest create(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version,
- Bytes message) {
- return new AndroidNetworkSendRequest(version, message);
- }
-
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version;
- private final Bytes message;
-
- private AndroidNetworkSendRequest(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version,
- Bytes message) throws ValidationArgumentException {
- required("version", version);
- this.version = version;
- required("message", message);
- this.message = message;
- }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version getVersion() { return version; }
-
- public Bytes getMessage() { return message; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof AndroidNetworkSendRequest)) { return false; }
- AndroidNetworkSendRequest other = (AndroidNetworkSendRequest) obj;
- return equals(version, other.version)
- && equals(message, other.message);
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + version.hashCode();
- result = result * 31 + message.hashCode();
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<AndroidNetworkSendRequest:");
- builder.append(" version=").append(version);
- builder.append(" message=").append(message);
- builder.append('>');
- }
-
- public static AndroidNetworkSendRequest parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoAndroidService.AndroidNetworkSendRequest(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static AndroidNetworkSendRequest fromMessageNano(com.google.protos.ipc.invalidation.NanoAndroidService.AndroidNetworkSendRequest message) {
- if (message == null) { return null; }
- return new AndroidNetworkSendRequest(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version.fromMessageNano(message.version),
- Bytes.fromByteArray(message.message));
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoAndroidService.AndroidNetworkSendRequest toMessageNano() {
- com.google.protos.ipc.invalidation.NanoAndroidService.AndroidNetworkSendRequest msg = new com.google.protos.ipc.invalidation.NanoAndroidService.AndroidNetworkSendRequest();
- msg.version = version.toMessageNano();
- msg.message = message.getByteArray();
- return msg;
- }
- }
-
- public static final class AndroidTiclState extends ProtoWrapper {
- public static final class Metadata extends ProtoWrapper {
- public static Metadata create(int clientType,
- Bytes clientName,
- long ticlId,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientConfigP clientConfig) {
- return new Metadata(clientType, clientName, ticlId, clientConfig);
- }
-
- private final int clientType;
- private final Bytes clientName;
- private final long ticlId;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientConfigP clientConfig;
-
- private Metadata(Integer clientType,
- Bytes clientName,
- Long ticlId,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientConfigP clientConfig) throws ValidationArgumentException {
- required("client_type", clientType);
- this.clientType = clientType;
- required("client_name", clientName);
- this.clientName = clientName;
- required("ticl_id", ticlId);
- this.ticlId = ticlId;
- required("client_config", clientConfig);
- this.clientConfig = clientConfig;
- }
-
- public int getClientType() { return clientType; }
-
- public Bytes getClientName() { return clientName; }
-
- public long getTiclId() { return ticlId; }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientConfigP getClientConfig() { return clientConfig; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof Metadata)) { return false; }
- Metadata other = (Metadata) obj;
- return clientType == other.clientType
- && equals(clientName, other.clientName)
- && ticlId == other.ticlId
- && equals(clientConfig, other.clientConfig);
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + hash(clientType);
- result = result * 31 + clientName.hashCode();
- result = result * 31 + hash(ticlId);
- result = result * 31 + clientConfig.hashCode();
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<Metadata:");
- builder.append(" client_type=").append(clientType);
- builder.append(" client_name=").append(clientName);
- builder.append(" ticl_id=").append(ticlId);
- builder.append(" client_config=").append(clientConfig);
- builder.append('>');
- }
-
- public static Metadata parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoAndroidService.AndroidTiclState.Metadata(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static Metadata fromMessageNano(com.google.protos.ipc.invalidation.NanoAndroidService.AndroidTiclState.Metadata message) {
- if (message == null) { return null; }
- return new Metadata(message.clientType,
- Bytes.fromByteArray(message.clientName),
- message.ticlId,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientConfigP.fromMessageNano(message.clientConfig));
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoAndroidService.AndroidTiclState.Metadata toMessageNano() {
- com.google.protos.ipc.invalidation.NanoAndroidService.AndroidTiclState.Metadata msg = new com.google.protos.ipc.invalidation.NanoAndroidService.AndroidTiclState.Metadata();
- msg.clientType = clientType;
- msg.clientName = clientName.getByteArray();
- msg.ticlId = ticlId;
- msg.clientConfig = clientConfig.toMessageNano();
- return msg;
- }
- }
- public static AndroidTiclState create(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version,
- com.google.ipc.invalidation.ticl.proto.JavaClient.InvalidationClientState ticlState,
- com.google.ipc.invalidation.ticl.proto.AndroidService.AndroidTiclState.Metadata metadata) {
- return new AndroidTiclState(version, ticlState, metadata);
- }
-
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version;
- private final com.google.ipc.invalidation.ticl.proto.JavaClient.InvalidationClientState ticlState;
- private final com.google.ipc.invalidation.ticl.proto.AndroidService.AndroidTiclState.Metadata metadata;
-
- private AndroidTiclState(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version,
- com.google.ipc.invalidation.ticl.proto.JavaClient.InvalidationClientState ticlState,
- com.google.ipc.invalidation.ticl.proto.AndroidService.AndroidTiclState.Metadata metadata) throws ValidationArgumentException {
- required("version", version);
- this.version = version;
- required("ticl_state", ticlState);
- this.ticlState = ticlState;
- required("metadata", metadata);
- this.metadata = metadata;
- }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version getVersion() { return version; }
-
- public com.google.ipc.invalidation.ticl.proto.JavaClient.InvalidationClientState getTiclState() { return ticlState; }
-
- public com.google.ipc.invalidation.ticl.proto.AndroidService.AndroidTiclState.Metadata getMetadata() { return metadata; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof AndroidTiclState)) { return false; }
- AndroidTiclState other = (AndroidTiclState) obj;
- return equals(version, other.version)
- && equals(ticlState, other.ticlState)
- && equals(metadata, other.metadata);
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + version.hashCode();
- result = result * 31 + ticlState.hashCode();
- result = result * 31 + metadata.hashCode();
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<AndroidTiclState:");
- builder.append(" version=").append(version);
- builder.append(" ticl_state=").append(ticlState);
- builder.append(" metadata=").append(metadata);
- builder.append('>');
- }
-
- public static AndroidTiclState parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoAndroidService.AndroidTiclState(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static AndroidTiclState fromMessageNano(com.google.protos.ipc.invalidation.NanoAndroidService.AndroidTiclState message) {
- if (message == null) { return null; }
- return new AndroidTiclState(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version.fromMessageNano(message.version),
- com.google.ipc.invalidation.ticl.proto.JavaClient.InvalidationClientState.fromMessageNano(message.ticlState),
- com.google.ipc.invalidation.ticl.proto.AndroidService.AndroidTiclState.Metadata.fromMessageNano(message.metadata));
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoAndroidService.AndroidTiclState toMessageNano() {
- com.google.protos.ipc.invalidation.NanoAndroidService.AndroidTiclState msg = new com.google.protos.ipc.invalidation.NanoAndroidService.AndroidTiclState();
- msg.version = version.toMessageNano();
- msg.ticlState = ticlState.toMessageNano();
- msg.metadata = metadata.toMessageNano();
- return msg;
- }
- }
-
- public static final class AndroidTiclStateWithDigest extends ProtoWrapper {
- public static AndroidTiclStateWithDigest create(com.google.ipc.invalidation.ticl.proto.AndroidService.AndroidTiclState state,
- Bytes digest) {
- return new AndroidTiclStateWithDigest(state, digest);
- }
-
- private final com.google.ipc.invalidation.ticl.proto.AndroidService.AndroidTiclState state;
- private final Bytes digest;
-
- private AndroidTiclStateWithDigest(com.google.ipc.invalidation.ticl.proto.AndroidService.AndroidTiclState state,
- Bytes digest) throws ValidationArgumentException {
- required("state", state);
- this.state = state;
- required("digest", digest);
- this.digest = digest;
- }
-
- public com.google.ipc.invalidation.ticl.proto.AndroidService.AndroidTiclState getState() { return state; }
-
- public Bytes getDigest() { return digest; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof AndroidTiclStateWithDigest)) { return false; }
- AndroidTiclStateWithDigest other = (AndroidTiclStateWithDigest) obj;
- return equals(state, other.state)
- && equals(digest, other.digest);
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + state.hashCode();
- result = result * 31 + digest.hashCode();
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<AndroidTiclStateWithDigest:");
- builder.append(" state=").append(state);
- builder.append(" digest=").append(digest);
- builder.append('>');
- }
-
- public static AndroidTiclStateWithDigest parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoAndroidService.AndroidTiclStateWithDigest(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static AndroidTiclStateWithDigest fromMessageNano(com.google.protos.ipc.invalidation.NanoAndroidService.AndroidTiclStateWithDigest message) {
- if (message == null) { return null; }
- return new AndroidTiclStateWithDigest(com.google.ipc.invalidation.ticl.proto.AndroidService.AndroidTiclState.fromMessageNano(message.state),
- Bytes.fromByteArray(message.digest));
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoAndroidService.AndroidTiclStateWithDigest toMessageNano() {
- com.google.protos.ipc.invalidation.NanoAndroidService.AndroidTiclStateWithDigest msg = new com.google.protos.ipc.invalidation.NanoAndroidService.AndroidTiclStateWithDigest();
- msg.state = state.toMessageNano();
- msg.digest = digest.getByteArray();
- return msg;
- }
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/proto/ChannelCommon.java b/java/com/google/ipc/invalidation/ticl/proto/ChannelCommon.java
deleted file mode 100644
index bed01e6..0000000
--- a/java/com/google/ipc/invalidation/ticl/proto/ChannelCommon.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-// Generated by j/c/g/ipc/invalidation/common/proto_wrapper_generator
-package com.google.ipc.invalidation.ticl.proto;
-
-import com.google.ipc.invalidation.util.Bytes;
-import com.google.ipc.invalidation.util.ProtoWrapper;
-import com.google.ipc.invalidation.util.ProtoWrapper.ValidationException;
-import com.google.ipc.invalidation.util.TextBuilder;
-import com.google.protobuf.nano.MessageNano;
-import com.google.protobuf.nano.InvalidProtocolBufferNanoException;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-
-public interface ChannelCommon {
-
- public static final class ChannelMessageEncoding extends ProtoWrapper {
- public interface MessageEncoding {
- public static final int PROTOBUF_BINARY_FORMAT = 1;
- public static final int PROTOBUF_JSON_FORMAT = 2;
- }
-
- public static ChannelMessageEncoding create() {
- return new ChannelMessageEncoding();
- }
-
- public static final ChannelMessageEncoding DEFAULT_INSTANCE = new ChannelMessageEncoding();
-
-
- private ChannelMessageEncoding() {
- }
-
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof ChannelMessageEncoding)) { return false; }
- ChannelMessageEncoding other = (ChannelMessageEncoding) obj;
- return true;
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<ChannelMessageEncoding:");
- builder.append('>');
- }
-
- public static ChannelMessageEncoding parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoChannelCommon.ChannelMessageEncoding(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static ChannelMessageEncoding fromMessageNano(com.google.protos.ipc.invalidation.NanoChannelCommon.ChannelMessageEncoding message) {
- if (message == null) { return null; }
- return new ChannelMessageEncoding();
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoChannelCommon.ChannelMessageEncoding toMessageNano() {
- com.google.protos.ipc.invalidation.NanoChannelCommon.ChannelMessageEncoding msg = new com.google.protos.ipc.invalidation.NanoChannelCommon.ChannelMessageEncoding();
- return msg;
- }
- }
-
- public static final class NetworkEndpointId extends ProtoWrapper {
- public interface NetworkAddress {
- public static final int TEST = 1;
- public static final int BUZZ = 111;
- public static final int STUBBY = 112;
- public static final int ANDROID = 113;
- public static final int LCS = 114;
- public static final int TIPS_STUBBY = 115;
- }
-
- public static NetworkEndpointId create(Integer networkAddress,
- Bytes clientAddress,
- Boolean isOffline) {
- return new NetworkEndpointId(networkAddress, clientAddress, isOffline);
- }
-
- public static final NetworkEndpointId DEFAULT_INSTANCE = new NetworkEndpointId(null, null, null);
-
- private final long __hazzerBits;
- private final int networkAddress;
- private final Bytes clientAddress;
- private final boolean isOffline;
-
- private NetworkEndpointId(Integer networkAddress,
- Bytes clientAddress,
- Boolean isOffline) {
- int hazzerBits = 0;
- if (networkAddress != null) {
- hazzerBits |= 0x1;
- this.networkAddress = networkAddress;
- } else {
- this.networkAddress = 1;
- }
- if (clientAddress != null) {
- hazzerBits |= 0x2;
- this.clientAddress = clientAddress;
- } else {
- this.clientAddress = Bytes.EMPTY_BYTES;
- }
- if (isOffline != null) {
- hazzerBits |= 0x4;
- this.isOffline = isOffline;
- } else {
- this.isOffline = false;
- }
- this.__hazzerBits = hazzerBits;
- }
-
- public int getNetworkAddress() { return networkAddress; }
- public boolean hasNetworkAddress() { return (0x1 & __hazzerBits) != 0; }
-
- public Bytes getClientAddress() { return clientAddress; }
- public boolean hasClientAddress() { return (0x2 & __hazzerBits) != 0; }
-
- public boolean getIsOffline() { return isOffline; }
- public boolean hasIsOffline() { return (0x4 & __hazzerBits) != 0; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof NetworkEndpointId)) { return false; }
- NetworkEndpointId other = (NetworkEndpointId) obj;
- return __hazzerBits == other.__hazzerBits
- && (!hasNetworkAddress() || networkAddress == other.networkAddress)
- && (!hasClientAddress() || equals(clientAddress, other.clientAddress))
- && (!hasIsOffline() || isOffline == other.isOffline);
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- if (hasNetworkAddress()) {
- result = result * 31 + hash(networkAddress);
- }
- if (hasClientAddress()) {
- result = result * 31 + clientAddress.hashCode();
- }
- if (hasIsOffline()) {
- result = result * 31 + hash(isOffline);
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<NetworkEndpointId:");
- if (hasNetworkAddress()) {
- builder.append(" network_address=").append(networkAddress);
- }
- if (hasClientAddress()) {
- builder.append(" client_address=").append(clientAddress);
- }
- if (hasIsOffline()) {
- builder.append(" is_offline=").append(isOffline);
- }
- builder.append('>');
- }
-
- public static NetworkEndpointId parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoChannelCommon.NetworkEndpointId(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static NetworkEndpointId fromMessageNano(com.google.protos.ipc.invalidation.NanoChannelCommon.NetworkEndpointId message) {
- if (message == null) { return null; }
- return new NetworkEndpointId(message.networkAddress,
- Bytes.fromByteArray(message.clientAddress),
- message.isOffline);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoChannelCommon.NetworkEndpointId toMessageNano() {
- com.google.protos.ipc.invalidation.NanoChannelCommon.NetworkEndpointId msg = new com.google.protos.ipc.invalidation.NanoChannelCommon.NetworkEndpointId();
- msg.networkAddress = hasNetworkAddress() ? networkAddress : null;
- msg.clientAddress = hasClientAddress() ? clientAddress.getByteArray() : null;
- msg.isOffline = hasIsOffline() ? isOffline : null;
- return msg;
- }
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/proto/Client.java b/java/com/google/ipc/invalidation/ticl/proto/Client.java
deleted file mode 100644
index c8e2196..0000000
--- a/java/com/google/ipc/invalidation/ticl/proto/Client.java
+++ /dev/null
@@ -1,483 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-// Generated by j/c/g/ipc/invalidation/common/proto_wrapper_generator
-package com.google.ipc.invalidation.ticl.proto;
-
-import com.google.ipc.invalidation.util.Bytes;
-import com.google.ipc.invalidation.util.ProtoWrapper;
-import com.google.ipc.invalidation.util.ProtoWrapper.ValidationException;
-import com.google.ipc.invalidation.util.TextBuilder;
-import com.google.protobuf.nano.MessageNano;
-import com.google.protobuf.nano.InvalidProtocolBufferNanoException;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-
-public interface Client {
-
- public static final class AckHandleP extends ProtoWrapper {
- public static AckHandleP create(com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP invalidation) {
- return new AckHandleP(invalidation);
- }
-
- public static final AckHandleP DEFAULT_INSTANCE = new AckHandleP(null);
-
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP invalidation;
-
- private AckHandleP(com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP invalidation) {
- this.invalidation = invalidation;
- }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP getNullableInvalidation() { return invalidation; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof AckHandleP)) { return false; }
- AckHandleP other = (AckHandleP) obj;
- return equals(invalidation, other.invalidation);
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- if (invalidation != null) {
- result = result * 31 + invalidation.hashCode();
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<AckHandleP:");
- if (invalidation != null) {
- builder.append(" invalidation=").append(invalidation);
- }
- builder.append('>');
- }
-
- public static AckHandleP parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClient.AckHandleP(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static AckHandleP fromMessageNano(com.google.protos.ipc.invalidation.NanoClient.AckHandleP message) {
- if (message == null) { return null; }
- return new AckHandleP(com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP.fromMessageNano(message.invalidation));
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClient.AckHandleP toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClient.AckHandleP msg = new com.google.protos.ipc.invalidation.NanoClient.AckHandleP();
- msg.invalidation = this.invalidation != null ? invalidation.toMessageNano() : null;
- return msg;
- }
- }
-
- public static final class PersistentTiclState extends ProtoWrapper {
- public static final class Builder {
- public Bytes clientToken;
- public Long lastMessageSendTimeMs;
- public Builder() {
- }
-
- public PersistentTiclState build() {
- return new PersistentTiclState(clientToken, lastMessageSendTimeMs);
- }
- }
-
- public static PersistentTiclState create(Bytes clientToken,
- Long lastMessageSendTimeMs) {
- return new PersistentTiclState(clientToken, lastMessageSendTimeMs);
- }
-
- public static final PersistentTiclState DEFAULT_INSTANCE = new PersistentTiclState(null, null);
-
- private final long __hazzerBits;
- private final Bytes clientToken;
- private final long lastMessageSendTimeMs;
-
- private PersistentTiclState(Bytes clientToken,
- Long lastMessageSendTimeMs) {
- int hazzerBits = 0;
- if (clientToken != null) {
- hazzerBits |= 0x1;
- this.clientToken = clientToken;
- } else {
- this.clientToken = Bytes.EMPTY_BYTES;
- }
- if (lastMessageSendTimeMs != null) {
- hazzerBits |= 0x2;
- this.lastMessageSendTimeMs = lastMessageSendTimeMs;
- } else {
- this.lastMessageSendTimeMs = 0;
- }
- this.__hazzerBits = hazzerBits;
- }
-
- public Bytes getClientToken() { return clientToken; }
- public boolean hasClientToken() { return (0x1 & __hazzerBits) != 0; }
-
- public long getLastMessageSendTimeMs() { return lastMessageSendTimeMs; }
- public boolean hasLastMessageSendTimeMs() { return (0x2 & __hazzerBits) != 0; }
-
- public Builder toBuilder() {
- Builder builder = new Builder();
- if (hasClientToken()) {
- builder.clientToken = clientToken;
- }
- if (hasLastMessageSendTimeMs()) {
- builder.lastMessageSendTimeMs = lastMessageSendTimeMs;
- }
- return builder;
- }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof PersistentTiclState)) { return false; }
- PersistentTiclState other = (PersistentTiclState) obj;
- return __hazzerBits == other.__hazzerBits
- && (!hasClientToken() || equals(clientToken, other.clientToken))
- && (!hasLastMessageSendTimeMs() || lastMessageSendTimeMs == other.lastMessageSendTimeMs);
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- if (hasClientToken()) {
- result = result * 31 + clientToken.hashCode();
- }
- if (hasLastMessageSendTimeMs()) {
- result = result * 31 + hash(lastMessageSendTimeMs);
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<PersistentTiclState:");
- if (hasClientToken()) {
- builder.append(" client_token=").append(clientToken);
- }
- if (hasLastMessageSendTimeMs()) {
- builder.append(" last_message_send_time_ms=").append(lastMessageSendTimeMs);
- }
- builder.append('>');
- }
-
- public static PersistentTiclState parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClient.PersistentTiclState(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static PersistentTiclState fromMessageNano(com.google.protos.ipc.invalidation.NanoClient.PersistentTiclState message) {
- if (message == null) { return null; }
- return new PersistentTiclState(Bytes.fromByteArray(message.clientToken),
- message.lastMessageSendTimeMs);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClient.PersistentTiclState toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClient.PersistentTiclState msg = new com.google.protos.ipc.invalidation.NanoClient.PersistentTiclState();
- msg.clientToken = hasClientToken() ? clientToken.getByteArray() : null;
- msg.lastMessageSendTimeMs = hasLastMessageSendTimeMs() ? lastMessageSendTimeMs : null;
- return msg;
- }
- }
-
- public static final class PersistentStateBlob extends ProtoWrapper {
- public static PersistentStateBlob create(com.google.ipc.invalidation.ticl.proto.Client.PersistentTiclState ticlState,
- Bytes authenticationCode) {
- return new PersistentStateBlob(ticlState, authenticationCode);
- }
-
- public static final PersistentStateBlob DEFAULT_INSTANCE = new PersistentStateBlob(null, null);
-
- private final long __hazzerBits;
- private final com.google.ipc.invalidation.ticl.proto.Client.PersistentTiclState ticlState;
- private final Bytes authenticationCode;
-
- private PersistentStateBlob(com.google.ipc.invalidation.ticl.proto.Client.PersistentTiclState ticlState,
- Bytes authenticationCode) {
- int hazzerBits = 0;
- if (ticlState != null) {
- hazzerBits |= 0x1;
- this.ticlState = ticlState;
- } else {
- this.ticlState = com.google.ipc.invalidation.ticl.proto.Client.PersistentTiclState.DEFAULT_INSTANCE;
- }
- if (authenticationCode != null) {
- hazzerBits |= 0x2;
- this.authenticationCode = authenticationCode;
- } else {
- this.authenticationCode = Bytes.EMPTY_BYTES;
- }
- this.__hazzerBits = hazzerBits;
- }
-
- public com.google.ipc.invalidation.ticl.proto.Client.PersistentTiclState getTiclState() { return ticlState; }
- public boolean hasTiclState() { return (0x1 & __hazzerBits) != 0; }
-
- public Bytes getAuthenticationCode() { return authenticationCode; }
- public boolean hasAuthenticationCode() { return (0x2 & __hazzerBits) != 0; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof PersistentStateBlob)) { return false; }
- PersistentStateBlob other = (PersistentStateBlob) obj;
- return __hazzerBits == other.__hazzerBits
- && (!hasTiclState() || equals(ticlState, other.ticlState))
- && (!hasAuthenticationCode() || equals(authenticationCode, other.authenticationCode));
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- if (hasTiclState()) {
- result = result * 31 + ticlState.hashCode();
- }
- if (hasAuthenticationCode()) {
- result = result * 31 + authenticationCode.hashCode();
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<PersistentStateBlob:");
- if (hasTiclState()) {
- builder.append(" ticl_state=").append(ticlState);
- }
- if (hasAuthenticationCode()) {
- builder.append(" authentication_code=").append(authenticationCode);
- }
- builder.append('>');
- }
-
- public static PersistentStateBlob parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClient.PersistentStateBlob(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static PersistentStateBlob fromMessageNano(com.google.protos.ipc.invalidation.NanoClient.PersistentStateBlob message) {
- if (message == null) { return null; }
- return new PersistentStateBlob(com.google.ipc.invalidation.ticl.proto.Client.PersistentTiclState.fromMessageNano(message.ticlState),
- Bytes.fromByteArray(message.authenticationCode));
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClient.PersistentStateBlob toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClient.PersistentStateBlob msg = new com.google.protos.ipc.invalidation.NanoClient.PersistentStateBlob();
- msg.ticlState = hasTiclState() ? ticlState.toMessageNano() : null;
- msg.authenticationCode = hasAuthenticationCode() ? authenticationCode.getByteArray() : null;
- return msg;
- }
- }
-
- public static final class RunStateP extends ProtoWrapper {
- public interface State {
- public static final int NOT_STARTED = 1;
- public static final int STARTED = 2;
- public static final int STOPPED = 3;
- }
-
- public static RunStateP create(Integer state) {
- return new RunStateP(state);
- }
-
- public static final RunStateP DEFAULT_INSTANCE = new RunStateP(null);
-
- private final long __hazzerBits;
- private final int state;
-
- private RunStateP(Integer state) {
- int hazzerBits = 0;
- if (state != null) {
- hazzerBits |= 0x1;
- this.state = state;
- } else {
- this.state = 1;
- }
- this.__hazzerBits = hazzerBits;
- }
-
- public int getState() { return state; }
- public boolean hasState() { return (0x1 & __hazzerBits) != 0; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof RunStateP)) { return false; }
- RunStateP other = (RunStateP) obj;
- return __hazzerBits == other.__hazzerBits
- && (!hasState() || state == other.state);
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- if (hasState()) {
- result = result * 31 + hash(state);
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<RunStateP:");
- if (hasState()) {
- builder.append(" state=").append(state);
- }
- builder.append('>');
- }
-
- public static RunStateP parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClient.RunStateP(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static RunStateP fromMessageNano(com.google.protos.ipc.invalidation.NanoClient.RunStateP message) {
- if (message == null) { return null; }
- return new RunStateP(message.state);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClient.RunStateP toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClient.RunStateP msg = new com.google.protos.ipc.invalidation.NanoClient.RunStateP();
- msg.state = hasState() ? state : null;
- return msg;
- }
- }
-
- public static final class ExponentialBackoffState extends ProtoWrapper {
- public static ExponentialBackoffState create(Integer currentMaxDelay,
- Boolean inRetryMode) {
- return new ExponentialBackoffState(currentMaxDelay, inRetryMode);
- }
-
- public static final ExponentialBackoffState DEFAULT_INSTANCE = new ExponentialBackoffState(null, null);
-
- private final long __hazzerBits;
- private final int currentMaxDelay;
- private final boolean inRetryMode;
-
- private ExponentialBackoffState(Integer currentMaxDelay,
- Boolean inRetryMode) {
- int hazzerBits = 0;
- if (currentMaxDelay != null) {
- hazzerBits |= 0x1;
- this.currentMaxDelay = currentMaxDelay;
- } else {
- this.currentMaxDelay = 0;
- }
- if (inRetryMode != null) {
- hazzerBits |= 0x2;
- this.inRetryMode = inRetryMode;
- } else {
- this.inRetryMode = false;
- }
- this.__hazzerBits = hazzerBits;
- }
-
- public int getCurrentMaxDelay() { return currentMaxDelay; }
- public boolean hasCurrentMaxDelay() { return (0x1 & __hazzerBits) != 0; }
-
- public boolean getInRetryMode() { return inRetryMode; }
- public boolean hasInRetryMode() { return (0x2 & __hazzerBits) != 0; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof ExponentialBackoffState)) { return false; }
- ExponentialBackoffState other = (ExponentialBackoffState) obj;
- return __hazzerBits == other.__hazzerBits
- && (!hasCurrentMaxDelay() || currentMaxDelay == other.currentMaxDelay)
- && (!hasInRetryMode() || inRetryMode == other.inRetryMode);
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- if (hasCurrentMaxDelay()) {
- result = result * 31 + hash(currentMaxDelay);
- }
- if (hasInRetryMode()) {
- result = result * 31 + hash(inRetryMode);
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<ExponentialBackoffState:");
- if (hasCurrentMaxDelay()) {
- builder.append(" current_max_delay=").append(currentMaxDelay);
- }
- if (hasInRetryMode()) {
- builder.append(" in_retry_mode=").append(inRetryMode);
- }
- builder.append('>');
- }
-
- public static ExponentialBackoffState parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClient.ExponentialBackoffState(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static ExponentialBackoffState fromMessageNano(com.google.protos.ipc.invalidation.NanoClient.ExponentialBackoffState message) {
- if (message == null) { return null; }
- return new ExponentialBackoffState(message.currentMaxDelay,
- message.inRetryMode);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClient.ExponentialBackoffState toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClient.ExponentialBackoffState msg = new com.google.protos.ipc.invalidation.NanoClient.ExponentialBackoffState();
- msg.currentMaxDelay = hasCurrentMaxDelay() ? currentMaxDelay : null;
- msg.inRetryMode = hasInRetryMode() ? inRetryMode : null;
- return msg;
- }
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/proto/ClientConstants.java b/java/com/google/ipc/invalidation/ticl/proto/ClientConstants.java
deleted file mode 100644
index 9612e40..0000000
--- a/java/com/google/ipc/invalidation/ticl/proto/ClientConstants.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.ipc.invalidation.ticl.proto;
-
-import com.google.ipc.invalidation.common.BaseCommonInvalidationConstants;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ProtocolVersion;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version;
-import com.google.ipc.invalidation.util.Bytes;
-
-/** Various constant protobufs used in version 2 of the Ticl. */
-public class ClientConstants extends BaseCommonInvalidationConstants {
-
- /** Version of the client currently being used by the client. */
- public static final Version CLIENT_VERSION_VALUE;
-
- /** Version of the protocol currently being used by the client/server for v2 clients. */
- public static final ProtocolVersion PROTOCOL_VERSION;
-
- /** Version of the protocol currently being used by the client/server for v1 clients. */
- public static final ProtocolVersion PROTOCOL_VERSION_V1;
-
- /** The value of ObjectSource.Type from types.proto. Must be kept in sync with that file. */
- public static final int INTERNAL_OBJECT_SOURCE_TYPE;
-
- /** Object id used to trigger a refresh of all cached objects ("invalidate-all"). */
- public static final ObjectIdP ALL_OBJECT_ID;
-
- static {
- CLIENT_VERSION_VALUE = Version.create(CLIENT_MAJOR_VERSION, CLIENT_MINOR_VERSION);
- PROTOCOL_VERSION =
- ProtocolVersion.create(Version.create(PROTOCOL_MAJOR_VERSION, PROTOCOL_MINOR_VERSION));
- PROTOCOL_VERSION_V1 =
- ProtocolVersion.create(Version.create(2, 0));
- INTERNAL_OBJECT_SOURCE_TYPE = 1;
- ALL_OBJECT_ID = ObjectIdP.create(INTERNAL_OBJECT_SOURCE_TYPE, Bytes.EMPTY_BYTES);
- }
-
- // Prevent instantiation.
- private ClientConstants() {
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/proto/ClientProtocol.java b/java/com/google/ipc/invalidation/ticl/proto/ClientProtocol.java
deleted file mode 100644
index 501e580..0000000
--- a/java/com/google/ipc/invalidation/ticl/proto/ClientProtocol.java
+++ /dev/null
@@ -1,3171 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-// Generated by j/c/g/ipc/invalidation/common/proto_wrapper_generator
-package com.google.ipc.invalidation.ticl.proto;
-
-import com.google.ipc.invalidation.util.Bytes;
-import com.google.ipc.invalidation.util.ProtoWrapper;
-import com.google.ipc.invalidation.util.ProtoWrapper.ValidationException;
-import com.google.ipc.invalidation.util.TextBuilder;
-import com.google.protobuf.nano.MessageNano;
-import com.google.protobuf.nano.InvalidProtocolBufferNanoException;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-
-public interface ClientProtocol {
-
- public static final class Version extends ProtoWrapper {
- public static Version create(int majorVersion,
- int minorVersion) {
- return new Version(majorVersion, minorVersion);
- }
-
- private final int majorVersion;
- private final int minorVersion;
-
- private Version(Integer majorVersion,
- Integer minorVersion) throws ValidationArgumentException {
- required("major_version", majorVersion);
- nonNegative("major_version", majorVersion);
- this.majorVersion = majorVersion;
- required("minor_version", minorVersion);
- nonNegative("minor_version", minorVersion);
- this.minorVersion = minorVersion;
- }
-
- public int getMajorVersion() { return majorVersion; }
-
- public int getMinorVersion() { return minorVersion; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof Version)) { return false; }
- Version other = (Version) obj;
- return majorVersion == other.majorVersion
- && minorVersion == other.minorVersion;
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + hash(majorVersion);
- result = result * 31 + hash(minorVersion);
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<Version:");
- builder.append(" major_version=").append(majorVersion);
- builder.append(" minor_version=").append(minorVersion);
- builder.append('>');
- }
-
- public static Version parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.Version(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static Version fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.Version message) {
- if (message == null) { return null; }
- return new Version(message.majorVersion,
- message.minorVersion);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.Version toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.Version msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.Version();
- msg.majorVersion = majorVersion;
- msg.minorVersion = minorVersion;
- return msg;
- }
- }
-
- public static final class ProtocolVersion extends ProtoWrapper {
- public static ProtocolVersion create(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version) {
- return new ProtocolVersion(version);
- }
-
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version;
-
- private ProtocolVersion(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version) throws ValidationArgumentException {
- required("version", version);
- this.version = version;
- }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version getVersion() { return version; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof ProtocolVersion)) { return false; }
- ProtocolVersion other = (ProtocolVersion) obj;
- return equals(version, other.version);
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + version.hashCode();
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<ProtocolVersion:");
- builder.append(" version=").append(version);
- builder.append('>');
- }
-
- public static ProtocolVersion parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.ProtocolVersion(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static ProtocolVersion fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.ProtocolVersion message) {
- if (message == null) { return null; }
- return new ProtocolVersion(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version.fromMessageNano(message.version));
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.ProtocolVersion toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.ProtocolVersion msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.ProtocolVersion();
- msg.version = version.toMessageNano();
- return msg;
- }
- }
-
- public static final class ClientVersion extends ProtoWrapper {
- public static ClientVersion create(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version,
- String platform,
- String language,
- String applicationInfo) {
- return new ClientVersion(version, platform, language, applicationInfo);
- }
-
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version;
- private final String platform;
- private final String language;
- private final String applicationInfo;
-
- private ClientVersion(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version,
- String platform,
- String language,
- String applicationInfo) throws ValidationArgumentException {
- required("version", version);
- this.version = version;
- required("platform", platform);
- this.platform = platform;
- required("language", language);
- this.language = language;
- required("application_info", applicationInfo);
- this.applicationInfo = applicationInfo;
- }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version getVersion() { return version; }
-
- public String getPlatform() { return platform; }
-
- public String getLanguage() { return language; }
-
- public String getApplicationInfo() { return applicationInfo; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof ClientVersion)) { return false; }
- ClientVersion other = (ClientVersion) obj;
- return equals(version, other.version)
- && equals(platform, other.platform)
- && equals(language, other.language)
- && equals(applicationInfo, other.applicationInfo);
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + version.hashCode();
- result = result * 31 + platform.hashCode();
- result = result * 31 + language.hashCode();
- result = result * 31 + applicationInfo.hashCode();
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<ClientVersion:");
- builder.append(" version=").append(version);
- builder.append(" platform=").append(platform);
- builder.append(" language=").append(language);
- builder.append(" application_info=").append(applicationInfo);
- builder.append('>');
- }
-
- public static ClientVersion parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.ClientVersion(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static ClientVersion fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.ClientVersion message) {
- if (message == null) { return null; }
- return new ClientVersion(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version.fromMessageNano(message.version),
- message.platform,
- message.language,
- message.applicationInfo);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.ClientVersion toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.ClientVersion msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.ClientVersion();
- msg.version = version.toMessageNano();
- msg.platform = platform;
- msg.language = language;
- msg.applicationInfo = applicationInfo;
- return msg;
- }
- }
-
- public static final class StatusP extends ProtoWrapper {
- public interface Code {
- public static final int SUCCESS = 1;
- public static final int TRANSIENT_FAILURE = 2;
- public static final int PERMANENT_FAILURE = 3;
- }
-
- public static StatusP create(int code,
- String description) {
- return new StatusP(code, description);
- }
-
- private final long __hazzerBits;
- private final int code;
- private final String description;
-
- private StatusP(Integer code,
- String description) throws ValidationArgumentException {
- int hazzerBits = 0;
- required("code", code);
- this.code = code;
- if (description != null) {
- hazzerBits |= 0x1;
- this.description = description;
- } else {
- this.description = "";
- }
- this.__hazzerBits = hazzerBits;
- }
-
- public int getCode() { return code; }
-
- public String getDescription() { return description; }
- public boolean hasDescription() { return (0x1 & __hazzerBits) != 0; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof StatusP)) { return false; }
- StatusP other = (StatusP) obj;
- return __hazzerBits == other.__hazzerBits
- && code == other.code
- && (!hasDescription() || equals(description, other.description));
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- result = result * 31 + hash(code);
- if (hasDescription()) {
- result = result * 31 + description.hashCode();
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<StatusP:");
- builder.append(" code=").append(code);
- if (hasDescription()) {
- builder.append(" description=").append(description);
- }
- builder.append('>');
- }
-
- public static StatusP parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.StatusP(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static StatusP fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.StatusP message) {
- if (message == null) { return null; }
- return new StatusP(message.code,
- message.description);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.StatusP toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.StatusP msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.StatusP();
- msg.code = code;
- msg.description = hasDescription() ? description : null;
- return msg;
- }
- }
-
- public static final class ObjectIdP extends ProtoWrapper {
- public static ObjectIdP create(int source,
- Bytes name) {
- return new ObjectIdP(source, name);
- }
-
- private final int source;
- private final Bytes name;
-
- private ObjectIdP(Integer source,
- Bytes name) throws ValidationArgumentException {
- required("source", source);
- nonNegative("source", source);
- this.source = source;
- required("name", name);
- this.name = name;
- }
-
- public int getSource() { return source; }
-
- public Bytes getName() { return name; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof ObjectIdP)) { return false; }
- ObjectIdP other = (ObjectIdP) obj;
- return source == other.source
- && equals(name, other.name);
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + hash(source);
- result = result * 31 + name.hashCode();
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<ObjectIdP:");
- builder.append(" source=").append(source);
- builder.append(" name=").append(name);
- builder.append('>');
- }
-
- public static ObjectIdP parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.ObjectIdP(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static ObjectIdP fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.ObjectIdP message) {
- if (message == null) { return null; }
- return new ObjectIdP(message.source,
- Bytes.fromByteArray(message.name));
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.ObjectIdP toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.ObjectIdP msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.ObjectIdP();
- msg.source = source;
- msg.name = name.getByteArray();
- return msg;
- }
- }
-
- public static final class ApplicationClientIdP extends ProtoWrapper {
- public static ApplicationClientIdP create(Integer clientType,
- Bytes clientName) {
- return new ApplicationClientIdP(clientType, clientName);
- }
-
- private final long __hazzerBits;
- private final int clientType;
- private final Bytes clientName;
-
- private ApplicationClientIdP(Integer clientType,
- Bytes clientName) throws ValidationArgumentException {
- int hazzerBits = 0;
- if (clientType != null) {
- hazzerBits |= 0x1;
- this.clientType = clientType;
- } else {
- this.clientType = 0;
- }
- required("client_name", clientName);
- nonEmpty("client_name", clientName);
- this.clientName = clientName;
- this.__hazzerBits = hazzerBits;
- }
-
- public int getClientType() { return clientType; }
- public boolean hasClientType() { return (0x1 & __hazzerBits) != 0; }
-
- public Bytes getClientName() { return clientName; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof ApplicationClientIdP)) { return false; }
- ApplicationClientIdP other = (ApplicationClientIdP) obj;
- return __hazzerBits == other.__hazzerBits
- && (!hasClientType() || clientType == other.clientType)
- && equals(clientName, other.clientName);
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- if (hasClientType()) {
- result = result * 31 + hash(clientType);
- }
- result = result * 31 + clientName.hashCode();
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<ApplicationClientIdP:");
- if (hasClientType()) {
- builder.append(" client_type=").append(clientType);
- }
- builder.append(" client_name=").append(clientName);
- builder.append('>');
- }
-
- public static ApplicationClientIdP parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.ApplicationClientIdP(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static ApplicationClientIdP fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.ApplicationClientIdP message) {
- if (message == null) { return null; }
- return new ApplicationClientIdP(message.clientType,
- Bytes.fromByteArray(message.clientName));
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.ApplicationClientIdP toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.ApplicationClientIdP msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.ApplicationClientIdP();
- msg.clientType = hasClientType() ? clientType : null;
- msg.clientName = clientName.getByteArray();
- return msg;
- }
- }
-
- public static final class InvalidationP extends ProtoWrapper {
- public static final class Builder {
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP objectId;
- public boolean isKnownVersion;
- public long version;
- public Bytes payload;
- public Long bridgeArrivalTimeMsDeprecated;
- public Boolean isTrickleRestart;
- public Builder(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP objectId,
- boolean isKnownVersion,
- long version) {
- this.objectId = objectId;this.isKnownVersion = isKnownVersion;this.version = version;}
-
- public InvalidationP build() {
- return new InvalidationP(objectId, isKnownVersion, version, payload, bridgeArrivalTimeMsDeprecated, isTrickleRestart);
- }
- }
-
- public static InvalidationP create(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP objectId,
- boolean isKnownVersion,
- long version,
- Bytes payload,
- Long bridgeArrivalTimeMsDeprecated,
- Boolean isTrickleRestart) {
- return new InvalidationP(objectId, isKnownVersion, version, payload, bridgeArrivalTimeMsDeprecated, isTrickleRestart);
- }
-
- private final long __hazzerBits;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP objectId;
- private final boolean isKnownVersion;
- private final long version;
- private final Bytes payload;
- private final long bridgeArrivalTimeMsDeprecated;
- private final boolean isTrickleRestart;
-
- private InvalidationP(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP objectId,
- Boolean isKnownVersion,
- Long version,
- Bytes payload,
- Long bridgeArrivalTimeMsDeprecated,
- Boolean isTrickleRestart) throws ValidationArgumentException {
- int hazzerBits = 0;
- required("object_id", objectId);
- this.objectId = objectId;
- required("is_known_version", isKnownVersion);
- this.isKnownVersion = isKnownVersion;
- required("version", version);
- nonNegative("version", version);
- this.version = version;
- if (payload != null) {
- hazzerBits |= 0x1;
- this.payload = payload;
- } else {
- this.payload = Bytes.EMPTY_BYTES;
- }
- if (bridgeArrivalTimeMsDeprecated != null) {
- hazzerBits |= 0x2;
- this.bridgeArrivalTimeMsDeprecated = bridgeArrivalTimeMsDeprecated;
- } else {
- this.bridgeArrivalTimeMsDeprecated = 0;
- }
- if (isTrickleRestart != null) {
- hazzerBits |= 0x4;
- this.isTrickleRestart = isTrickleRestart;
- } else {
- this.isTrickleRestart = true;
- }
- this.__hazzerBits = hazzerBits;
- check(isKnownVersion || (isTrickleRestart == null || isTrickleRestart),
- "is_trickle_restart required if not is_known_version");
- }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP getObjectId() { return objectId; }
-
- public boolean getIsKnownVersion() { return isKnownVersion; }
-
- public long getVersion() { return version; }
-
- public Bytes getPayload() { return payload; }
- public boolean hasPayload() { return (0x1 & __hazzerBits) != 0; }
-
- public long getBridgeArrivalTimeMsDeprecated() { return bridgeArrivalTimeMsDeprecated; }
- public boolean hasBridgeArrivalTimeMsDeprecated() { return (0x2 & __hazzerBits) != 0; }
-
- public boolean getIsTrickleRestart() { return isTrickleRestart; }
- public boolean hasIsTrickleRestart() { return (0x4 & __hazzerBits) != 0; }
-
- public Builder toBuilder() {
- Builder builder = new Builder(objectId, isKnownVersion, version);
- if (hasPayload()) {
- builder.payload = payload;
- }
- if (hasBridgeArrivalTimeMsDeprecated()) {
- builder.bridgeArrivalTimeMsDeprecated = bridgeArrivalTimeMsDeprecated;
- }
- if (hasIsTrickleRestart()) {
- builder.isTrickleRestart = isTrickleRestart;
- }
- return builder;
- }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof InvalidationP)) { return false; }
- InvalidationP other = (InvalidationP) obj;
- return __hazzerBits == other.__hazzerBits
- && equals(objectId, other.objectId)
- && isKnownVersion == other.isKnownVersion
- && version == other.version
- && (!hasPayload() || equals(payload, other.payload))
- && (!hasBridgeArrivalTimeMsDeprecated() || bridgeArrivalTimeMsDeprecated == other.bridgeArrivalTimeMsDeprecated)
- && (!hasIsTrickleRestart() || isTrickleRestart == other.isTrickleRestart);
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- result = result * 31 + objectId.hashCode();
- result = result * 31 + hash(isKnownVersion);
- result = result * 31 + hash(version);
- if (hasPayload()) {
- result = result * 31 + payload.hashCode();
- }
- if (hasBridgeArrivalTimeMsDeprecated()) {
- result = result * 31 + hash(bridgeArrivalTimeMsDeprecated);
- }
- if (hasIsTrickleRestart()) {
- result = result * 31 + hash(isTrickleRestart);
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<InvalidationP:");
- builder.append(" object_id=").append(objectId);
- builder.append(" is_known_version=").append(isKnownVersion);
- builder.append(" version=").append(version);
- if (hasPayload()) {
- builder.append(" payload=").append(payload);
- }
- if (hasBridgeArrivalTimeMsDeprecated()) {
- builder.append(" bridge_arrival_time_ms_deprecated=").append(bridgeArrivalTimeMsDeprecated);
- }
- if (hasIsTrickleRestart()) {
- builder.append(" is_trickle_restart=").append(isTrickleRestart);
- }
- builder.append('>');
- }
-
- public static InvalidationP parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.InvalidationP(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static InvalidationP fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.InvalidationP message) {
- if (message == null) { return null; }
- return new InvalidationP(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP.fromMessageNano(message.objectId),
- message.isKnownVersion,
- message.version,
- Bytes.fromByteArray(message.payload),
- message.bridgeArrivalTimeMsDeprecated,
- message.isTrickleRestart);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.InvalidationP toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.InvalidationP msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.InvalidationP();
- msg.objectId = objectId.toMessageNano();
- msg.isKnownVersion = isKnownVersion;
- msg.version = version;
- msg.payload = hasPayload() ? payload.getByteArray() : null;
- msg.bridgeArrivalTimeMsDeprecated = hasBridgeArrivalTimeMsDeprecated() ? bridgeArrivalTimeMsDeprecated : null;
- msg.isTrickleRestart = hasIsTrickleRestart() ? isTrickleRestart : null;
- return msg;
- }
- }
-
- public static final class RegistrationP extends ProtoWrapper {
- public interface OpType {
- public static final int REGISTER = 1;
- public static final int UNREGISTER = 2;
- }
-
- public static RegistrationP create(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP objectId,
- int opType) {
- return new RegistrationP(objectId, opType);
- }
-
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP objectId;
- private final int opType;
-
- private RegistrationP(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP objectId,
- Integer opType) throws ValidationArgumentException {
- required("object_id", objectId);
- this.objectId = objectId;
- required("op_type", opType);
- this.opType = opType;
- }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP getObjectId() { return objectId; }
-
- public int getOpType() { return opType; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof RegistrationP)) { return false; }
- RegistrationP other = (RegistrationP) obj;
- return equals(objectId, other.objectId)
- && opType == other.opType;
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + objectId.hashCode();
- result = result * 31 + hash(opType);
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<RegistrationP:");
- builder.append(" object_id=").append(objectId);
- builder.append(" op_type=").append(opType);
- builder.append('>');
- }
-
- public static RegistrationP parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationP(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static RegistrationP fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationP message) {
- if (message == null) { return null; }
- return new RegistrationP(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP.fromMessageNano(message.objectId),
- message.opType);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationP toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationP msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationP();
- msg.objectId = objectId.toMessageNano();
- msg.opType = opType;
- return msg;
- }
- }
-
- public static final class RegistrationSummary extends ProtoWrapper {
- public static RegistrationSummary create(int numRegistrations,
- Bytes registrationDigest) {
- return new RegistrationSummary(numRegistrations, registrationDigest);
- }
-
- private final int numRegistrations;
- private final Bytes registrationDigest;
-
- private RegistrationSummary(Integer numRegistrations,
- Bytes registrationDigest) throws ValidationArgumentException {
- required("num_registrations", numRegistrations);
- nonNegative("num_registrations", numRegistrations);
- this.numRegistrations = numRegistrations;
- required("registration_digest", registrationDigest);
- nonEmpty("registration_digest", registrationDigest);
- this.registrationDigest = registrationDigest;
- }
-
- public int getNumRegistrations() { return numRegistrations; }
-
- public Bytes getRegistrationDigest() { return registrationDigest; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof RegistrationSummary)) { return false; }
- RegistrationSummary other = (RegistrationSummary) obj;
- return numRegistrations == other.numRegistrations
- && equals(registrationDigest, other.registrationDigest);
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + hash(numRegistrations);
- result = result * 31 + registrationDigest.hashCode();
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<RegistrationSummary:");
- builder.append(" num_registrations=").append(numRegistrations);
- builder.append(" registration_digest=").append(registrationDigest);
- builder.append('>');
- }
-
- public static RegistrationSummary parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationSummary(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static RegistrationSummary fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationSummary message) {
- if (message == null) { return null; }
- return new RegistrationSummary(message.numRegistrations,
- Bytes.fromByteArray(message.registrationDigest));
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationSummary toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationSummary msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationSummary();
- msg.numRegistrations = numRegistrations;
- msg.registrationDigest = registrationDigest.getByteArray();
- return msg;
- }
- }
-
- public static final class ClientHeader extends ProtoWrapper {
- public static ClientHeader create(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ProtocolVersion protocolVersion,
- Bytes clientToken,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSummary registrationSummary,
- long clientTimeMs,
- long maxKnownServerTimeMs,
- String messageId,
- Integer clientType) {
- return new ClientHeader(protocolVersion, clientToken, registrationSummary, clientTimeMs, maxKnownServerTimeMs, messageId, clientType);
- }
-
- private final long __hazzerBits;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.ProtocolVersion protocolVersion;
- private final Bytes clientToken;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSummary registrationSummary;
- private final long clientTimeMs;
- private final long maxKnownServerTimeMs;
- private final String messageId;
- private final int clientType;
-
- private ClientHeader(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ProtocolVersion protocolVersion,
- Bytes clientToken,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSummary registrationSummary,
- Long clientTimeMs,
- Long maxKnownServerTimeMs,
- String messageId,
- Integer clientType) throws ValidationArgumentException {
- int hazzerBits = 0;
- required("protocol_version", protocolVersion);
- this.protocolVersion = protocolVersion;
- if (clientToken != null) {
- hazzerBits |= 0x1;
- nonEmpty("client_token", clientToken);
- this.clientToken = clientToken;
- } else {
- this.clientToken = Bytes.EMPTY_BYTES;
- }
- this.registrationSummary = registrationSummary;
- required("client_time_ms", clientTimeMs);
- nonNegative("client_time_ms", clientTimeMs);
- this.clientTimeMs = clientTimeMs;
- required("max_known_server_time_ms", maxKnownServerTimeMs);
- nonNegative("max_known_server_time_ms", maxKnownServerTimeMs);
- this.maxKnownServerTimeMs = maxKnownServerTimeMs;
- if (messageId != null) {
- hazzerBits |= 0x2;
- nonEmpty("message_id", messageId);
- this.messageId = messageId;
- } else {
- this.messageId = "";
- }
- if (clientType != null) {
- hazzerBits |= 0x4;
- this.clientType = clientType;
- } else {
- this.clientType = 0;
- }
- this.__hazzerBits = hazzerBits;
- }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.ProtocolVersion getProtocolVersion() { return protocolVersion; }
-
- public Bytes getClientToken() { return clientToken; }
- public boolean hasClientToken() { return (0x1 & __hazzerBits) != 0; }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSummary getNullableRegistrationSummary() { return registrationSummary; }
-
- public long getClientTimeMs() { return clientTimeMs; }
-
- public long getMaxKnownServerTimeMs() { return maxKnownServerTimeMs; }
-
- public String getMessageId() { return messageId; }
- public boolean hasMessageId() { return (0x2 & __hazzerBits) != 0; }
-
- public int getClientType() { return clientType; }
- public boolean hasClientType() { return (0x4 & __hazzerBits) != 0; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof ClientHeader)) { return false; }
- ClientHeader other = (ClientHeader) obj;
- return __hazzerBits == other.__hazzerBits
- && equals(protocolVersion, other.protocolVersion)
- && (!hasClientToken() || equals(clientToken, other.clientToken))
- && equals(registrationSummary, other.registrationSummary)
- && clientTimeMs == other.clientTimeMs
- && maxKnownServerTimeMs == other.maxKnownServerTimeMs
- && (!hasMessageId() || equals(messageId, other.messageId))
- && (!hasClientType() || clientType == other.clientType);
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- result = result * 31 + protocolVersion.hashCode();
- if (hasClientToken()) {
- result = result * 31 + clientToken.hashCode();
- }
- if (registrationSummary != null) {
- result = result * 31 + registrationSummary.hashCode();
- }
- result = result * 31 + hash(clientTimeMs);
- result = result * 31 + hash(maxKnownServerTimeMs);
- if (hasMessageId()) {
- result = result * 31 + messageId.hashCode();
- }
- if (hasClientType()) {
- result = result * 31 + hash(clientType);
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<ClientHeader:");
- builder.append(" protocol_version=").append(protocolVersion);
- if (hasClientToken()) {
- builder.append(" client_token=").append(clientToken);
- }
- if (registrationSummary != null) {
- builder.append(" registration_summary=").append(registrationSummary);
- }
- builder.append(" client_time_ms=").append(clientTimeMs);
- builder.append(" max_known_server_time_ms=").append(maxKnownServerTimeMs);
- if (hasMessageId()) {
- builder.append(" message_id=").append(messageId);
- }
- if (hasClientType()) {
- builder.append(" client_type=").append(clientType);
- }
- builder.append('>');
- }
-
- public static ClientHeader parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.ClientHeader(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static ClientHeader fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.ClientHeader message) {
- if (message == null) { return null; }
- return new ClientHeader(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ProtocolVersion.fromMessageNano(message.protocolVersion),
- Bytes.fromByteArray(message.clientToken),
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSummary.fromMessageNano(message.registrationSummary),
- message.clientTimeMs,
- message.maxKnownServerTimeMs,
- message.messageId,
- message.clientType);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.ClientHeader toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.ClientHeader msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.ClientHeader();
- msg.protocolVersion = protocolVersion.toMessageNano();
- msg.clientToken = hasClientToken() ? clientToken.getByteArray() : null;
- msg.registrationSummary = this.registrationSummary != null ? registrationSummary.toMessageNano() : null;
- msg.clientTimeMs = clientTimeMs;
- msg.maxKnownServerTimeMs = maxKnownServerTimeMs;
- msg.messageId = hasMessageId() ? messageId : null;
- msg.clientType = hasClientType() ? clientType : null;
- return msg;
- }
- }
-
- public static final class ClientToServerMessage extends ProtoWrapper {
- public static ClientToServerMessage create(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientHeader header,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.InitializeMessage initializeMessage,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationMessage registrationMessage,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSyncMessage registrationSyncMessage,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationMessage invalidationAckMessage,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.InfoMessage infoMessage) {
- return new ClientToServerMessage(header, initializeMessage, registrationMessage, registrationSyncMessage, invalidationAckMessage, infoMessage);
- }
-
- private final long __hazzerBits;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientHeader header;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.InitializeMessage initializeMessage;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationMessage registrationMessage;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSyncMessage registrationSyncMessage;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationMessage invalidationAckMessage;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.InfoMessage infoMessage;
-
- private ClientToServerMessage(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientHeader header,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.InitializeMessage initializeMessage,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationMessage registrationMessage,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSyncMessage registrationSyncMessage,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationMessage invalidationAckMessage,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.InfoMessage infoMessage) throws ValidationArgumentException {
- int hazzerBits = 0;
- required("header", header);
- this.header = header;
- this.initializeMessage = initializeMessage;
- this.registrationMessage = registrationMessage;
- this.registrationSyncMessage = registrationSyncMessage;
- this.invalidationAckMessage = invalidationAckMessage;
- if (infoMessage != null) {
- hazzerBits |= 0x1;
- this.infoMessage = infoMessage;
- } else {
- this.infoMessage = com.google.ipc.invalidation.ticl.proto.ClientProtocol.InfoMessage.DEFAULT_INSTANCE;
- }
- this.__hazzerBits = hazzerBits;
- check((initializeMessage != null) ^ header.hasClientToken(),
- "There should either be a client token or an initialization request");
- }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientHeader getHeader() { return header; }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.InitializeMessage getNullableInitializeMessage() { return initializeMessage; }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationMessage getNullableRegistrationMessage() { return registrationMessage; }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSyncMessage getNullableRegistrationSyncMessage() { return registrationSyncMessage; }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationMessage getNullableInvalidationAckMessage() { return invalidationAckMessage; }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.InfoMessage getInfoMessage() { return infoMessage; }
- public boolean hasInfoMessage() { return (0x1 & __hazzerBits) != 0; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof ClientToServerMessage)) { return false; }
- ClientToServerMessage other = (ClientToServerMessage) obj;
- return __hazzerBits == other.__hazzerBits
- && equals(header, other.header)
- && equals(initializeMessage, other.initializeMessage)
- && equals(registrationMessage, other.registrationMessage)
- && equals(registrationSyncMessage, other.registrationSyncMessage)
- && equals(invalidationAckMessage, other.invalidationAckMessage)
- && (!hasInfoMessage() || equals(infoMessage, other.infoMessage));
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- result = result * 31 + header.hashCode();
- if (initializeMessage != null) {
- result = result * 31 + initializeMessage.hashCode();
- }
- if (registrationMessage != null) {
- result = result * 31 + registrationMessage.hashCode();
- }
- if (registrationSyncMessage != null) {
- result = result * 31 + registrationSyncMessage.hashCode();
- }
- if (invalidationAckMessage != null) {
- result = result * 31 + invalidationAckMessage.hashCode();
- }
- if (hasInfoMessage()) {
- result = result * 31 + infoMessage.hashCode();
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<ClientToServerMessage:");
- builder.append(" header=").append(header);
- if (initializeMessage != null) {
- builder.append(" initialize_message=").append(initializeMessage);
- }
- if (registrationMessage != null) {
- builder.append(" registration_message=").append(registrationMessage);
- }
- if (registrationSyncMessage != null) {
- builder.append(" registration_sync_message=").append(registrationSyncMessage);
- }
- if (invalidationAckMessage != null) {
- builder.append(" invalidation_ack_message=").append(invalidationAckMessage);
- }
- if (hasInfoMessage()) {
- builder.append(" info_message=").append(infoMessage);
- }
- builder.append('>');
- }
-
- public static ClientToServerMessage parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.ClientToServerMessage(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static ClientToServerMessage fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.ClientToServerMessage message) {
- if (message == null) { return null; }
- return new ClientToServerMessage(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientHeader.fromMessageNano(message.header),
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.InitializeMessage.fromMessageNano(message.initializeMessage),
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationMessage.fromMessageNano(message.registrationMessage),
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSyncMessage.fromMessageNano(message.registrationSyncMessage),
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationMessage.fromMessageNano(message.invalidationAckMessage),
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.InfoMessage.fromMessageNano(message.infoMessage));
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.ClientToServerMessage toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.ClientToServerMessage msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.ClientToServerMessage();
- msg.header = header.toMessageNano();
- msg.initializeMessage = this.initializeMessage != null ? initializeMessage.toMessageNano() : null;
- msg.registrationMessage = this.registrationMessage != null ? registrationMessage.toMessageNano() : null;
- msg.registrationSyncMessage = this.registrationSyncMessage != null ? registrationSyncMessage.toMessageNano() : null;
- msg.invalidationAckMessage = this.invalidationAckMessage != null ? invalidationAckMessage.toMessageNano() : null;
- msg.infoMessage = hasInfoMessage() ? infoMessage.toMessageNano() : null;
- return msg;
- }
- }
-
- public static final class InitializeMessage extends ProtoWrapper {
- public interface DigestSerializationType {
- public static final int BYTE_BASED = 1;
- public static final int NUMBER_BASED = 2;
- }
-
- public static InitializeMessage create(int clientType,
- Bytes nonce,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.ApplicationClientIdP applicationClientId,
- int digestSerializationType) {
- return new InitializeMessage(clientType, nonce, applicationClientId, digestSerializationType);
- }
-
- private final int clientType;
- private final Bytes nonce;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.ApplicationClientIdP applicationClientId;
- private final int digestSerializationType;
-
- private InitializeMessage(Integer clientType,
- Bytes nonce,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.ApplicationClientIdP applicationClientId,
- Integer digestSerializationType) throws ValidationArgumentException {
- required("client_type", clientType);
- nonNegative("client_type", clientType);
- this.clientType = clientType;
- required("nonce", nonce);
- this.nonce = nonce;
- required("application_client_id", applicationClientId);
- this.applicationClientId = applicationClientId;
- required("digest_serialization_type", digestSerializationType);
- this.digestSerializationType = digestSerializationType;
- }
-
- public int getClientType() { return clientType; }
-
- public Bytes getNonce() { return nonce; }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.ApplicationClientIdP getApplicationClientId() { return applicationClientId; }
-
- public int getDigestSerializationType() { return digestSerializationType; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof InitializeMessage)) { return false; }
- InitializeMessage other = (InitializeMessage) obj;
- return clientType == other.clientType
- && equals(nonce, other.nonce)
- && equals(applicationClientId, other.applicationClientId)
- && digestSerializationType == other.digestSerializationType;
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + hash(clientType);
- result = result * 31 + nonce.hashCode();
- result = result * 31 + applicationClientId.hashCode();
- result = result * 31 + hash(digestSerializationType);
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<InitializeMessage:");
- builder.append(" client_type=").append(clientType);
- builder.append(" nonce=").append(nonce);
- builder.append(" application_client_id=").append(applicationClientId);
- builder.append(" digest_serialization_type=").append(digestSerializationType);
- builder.append('>');
- }
-
- public static InitializeMessage parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.InitializeMessage(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static InitializeMessage fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.InitializeMessage message) {
- if (message == null) { return null; }
- return new InitializeMessage(message.clientType,
- Bytes.fromByteArray(message.nonce),
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.ApplicationClientIdP.fromMessageNano(message.applicationClientId),
- message.digestSerializationType);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.InitializeMessage toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.InitializeMessage msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.InitializeMessage();
- msg.clientType = clientType;
- msg.nonce = nonce.getByteArray();
- msg.applicationClientId = applicationClientId.toMessageNano();
- msg.digestSerializationType = digestSerializationType;
- return msg;
- }
- }
-
- public static final class RegistrationMessage extends ProtoWrapper {
- public static RegistrationMessage create(Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationP> registration) {
- return new RegistrationMessage(registration);
- }
-
- private final List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationP> registration;
-
- private RegistrationMessage(Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationP> registration) throws ValidationArgumentException {
- this.registration = required("registration", registration);
- }
-
- public List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationP> getRegistration() { return registration; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof RegistrationMessage)) { return false; }
- RegistrationMessage other = (RegistrationMessage) obj;
- return equals(registration, other.registration);
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + registration.hashCode();
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<RegistrationMessage:");
- builder.append(" registration=[").append(registration).append(']');
- builder.append('>');
- }
-
- public static RegistrationMessage parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationMessage(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static RegistrationMessage fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationMessage message) {
- if (message == null) { return null; }
- List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationP> registration = new ArrayList<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationP>(message.registration.length);
- for (int i = 0; i < message.registration.length; i++) {
- registration.add(com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationP.fromMessageNano(message.registration[i]));
- }
- return new RegistrationMessage(registration);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationMessage toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationMessage msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationMessage();
- msg.registration = new com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationP[registration.size()];
- for (int i = 0; i < msg.registration.length; i++) {
- msg.registration[i] = registration.get(i).toMessageNano();
- }
- return msg;
- }
- }
-
- public static final class RegistrationSyncMessage extends ProtoWrapper {
- public static RegistrationSyncMessage create(Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSubtree> subtree) {
- return new RegistrationSyncMessage(subtree);
- }
-
- private final List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSubtree> subtree;
-
- private RegistrationSyncMessage(Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSubtree> subtree) throws ValidationArgumentException {
- this.subtree = required("subtree", subtree);
- }
-
- public List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSubtree> getSubtree() { return subtree; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof RegistrationSyncMessage)) { return false; }
- RegistrationSyncMessage other = (RegistrationSyncMessage) obj;
- return equals(subtree, other.subtree);
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + subtree.hashCode();
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<RegistrationSyncMessage:");
- builder.append(" subtree=[").append(subtree).append(']');
- builder.append('>');
- }
-
- public static RegistrationSyncMessage parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationSyncMessage(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static RegistrationSyncMessage fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationSyncMessage message) {
- if (message == null) { return null; }
- List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSubtree> subtree = new ArrayList<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSubtree>(message.subtree.length);
- for (int i = 0; i < message.subtree.length; i++) {
- subtree.add(com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSubtree.fromMessageNano(message.subtree[i]));
- }
- return new RegistrationSyncMessage(subtree);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationSyncMessage toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationSyncMessage msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationSyncMessage();
- msg.subtree = new com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationSubtree[subtree.size()];
- for (int i = 0; i < msg.subtree.length; i++) {
- msg.subtree[i] = subtree.get(i).toMessageNano();
- }
- return msg;
- }
- }
-
- public static final class RegistrationSubtree extends ProtoWrapper {
- public static RegistrationSubtree create(Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> registeredObject) {
- return new RegistrationSubtree(registeredObject);
- }
-
- public static final RegistrationSubtree DEFAULT_INSTANCE = new RegistrationSubtree(null);
-
- private final List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> registeredObject;
-
- private RegistrationSubtree(Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> registeredObject) {
- this.registeredObject = optional("registered_object", registeredObject);
- }
-
- public List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> getRegisteredObject() { return registeredObject; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof RegistrationSubtree)) { return false; }
- RegistrationSubtree other = (RegistrationSubtree) obj;
- return equals(registeredObject, other.registeredObject);
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + registeredObject.hashCode();
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<RegistrationSubtree:");
- builder.append(" registered_object=[").append(registeredObject).append(']');
- builder.append('>');
- }
-
- public static RegistrationSubtree parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationSubtree(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static RegistrationSubtree fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationSubtree message) {
- if (message == null) { return null; }
- List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> registeredObject = new ArrayList<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP>(message.registeredObject.length);
- for (int i = 0; i < message.registeredObject.length; i++) {
- registeredObject.add(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP.fromMessageNano(message.registeredObject[i]));
- }
- return new RegistrationSubtree(registeredObject);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationSubtree toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationSubtree msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationSubtree();
- msg.registeredObject = new com.google.protos.ipc.invalidation.NanoClientProtocol.ObjectIdP[registeredObject.size()];
- for (int i = 0; i < msg.registeredObject.length; i++) {
- msg.registeredObject[i] = registeredObject.get(i).toMessageNano();
- }
- return msg;
- }
- }
-
- public static final class InfoMessage extends ProtoWrapper {
- public static InfoMessage create(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientVersion clientVersion,
- Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.PropertyRecord> configParameter,
- Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.PropertyRecord> performanceCounter,
- Boolean serverRegistrationSummaryRequested,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientConfigP clientConfig) {
- return new InfoMessage(clientVersion, configParameter, performanceCounter, serverRegistrationSummaryRequested, clientConfig);
- }
-
- public static final InfoMessage DEFAULT_INSTANCE = new InfoMessage(null, null, null, null, null);
-
- private final long __hazzerBits;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientVersion clientVersion;
- private final List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.PropertyRecord> configParameter;
- private final List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.PropertyRecord> performanceCounter;
- private final boolean serverRegistrationSummaryRequested;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientConfigP clientConfig;
-
- private InfoMessage(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientVersion clientVersion,
- Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.PropertyRecord> configParameter,
- Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.PropertyRecord> performanceCounter,
- Boolean serverRegistrationSummaryRequested,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientConfigP clientConfig) {
- int hazzerBits = 0;
- this.clientVersion = clientVersion;
- this.configParameter = optional("config_parameter", configParameter);
- this.performanceCounter = optional("performance_counter", performanceCounter);
- if (serverRegistrationSummaryRequested != null) {
- hazzerBits |= 0x1;
- this.serverRegistrationSummaryRequested = serverRegistrationSummaryRequested;
- } else {
- this.serverRegistrationSummaryRequested = false;
- }
- this.clientConfig = clientConfig;
- this.__hazzerBits = hazzerBits;
- }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientVersion getNullableClientVersion() { return clientVersion; }
-
- public List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.PropertyRecord> getConfigParameter() { return configParameter; }
-
- public List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.PropertyRecord> getPerformanceCounter() { return performanceCounter; }
-
- public boolean getServerRegistrationSummaryRequested() { return serverRegistrationSummaryRequested; }
- public boolean hasServerRegistrationSummaryRequested() { return (0x1 & __hazzerBits) != 0; }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientConfigP getNullableClientConfig() { return clientConfig; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof InfoMessage)) { return false; }
- InfoMessage other = (InfoMessage) obj;
- return __hazzerBits == other.__hazzerBits
- && equals(clientVersion, other.clientVersion)
- && equals(configParameter, other.configParameter)
- && equals(performanceCounter, other.performanceCounter)
- && (!hasServerRegistrationSummaryRequested() || serverRegistrationSummaryRequested == other.serverRegistrationSummaryRequested)
- && equals(clientConfig, other.clientConfig);
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- if (clientVersion != null) {
- result = result * 31 + clientVersion.hashCode();
- }
- result = result * 31 + configParameter.hashCode();
- result = result * 31 + performanceCounter.hashCode();
- if (hasServerRegistrationSummaryRequested()) {
- result = result * 31 + hash(serverRegistrationSummaryRequested);
- }
- if (clientConfig != null) {
- result = result * 31 + clientConfig.hashCode();
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<InfoMessage:");
- if (clientVersion != null) {
- builder.append(" client_version=").append(clientVersion);
- }
- builder.append(" config_parameter=[").append(configParameter).append(']');
- builder.append(" performance_counter=[").append(performanceCounter).append(']');
- if (hasServerRegistrationSummaryRequested()) {
- builder.append(" server_registration_summary_requested=").append(serverRegistrationSummaryRequested);
- }
- if (clientConfig != null) {
- builder.append(" client_config=").append(clientConfig);
- }
- builder.append('>');
- }
-
- public static InfoMessage parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.InfoMessage(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static InfoMessage fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.InfoMessage message) {
- if (message == null) { return null; }
- List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.PropertyRecord> configParameter = new ArrayList<com.google.ipc.invalidation.ticl.proto.ClientProtocol.PropertyRecord>(message.configParameter.length);
- for (int i = 0; i < message.configParameter.length; i++) {
- configParameter.add(com.google.ipc.invalidation.ticl.proto.ClientProtocol.PropertyRecord.fromMessageNano(message.configParameter[i]));
- }
- List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.PropertyRecord> performanceCounter = new ArrayList<com.google.ipc.invalidation.ticl.proto.ClientProtocol.PropertyRecord>(message.performanceCounter.length);
- for (int i = 0; i < message.performanceCounter.length; i++) {
- performanceCounter.add(com.google.ipc.invalidation.ticl.proto.ClientProtocol.PropertyRecord.fromMessageNano(message.performanceCounter[i]));
- }
- return new InfoMessage(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientVersion.fromMessageNano(message.clientVersion),
- configParameter,
- performanceCounter,
- message.serverRegistrationSummaryRequested,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientConfigP.fromMessageNano(message.clientConfig));
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.InfoMessage toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.InfoMessage msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.InfoMessage();
- msg.clientVersion = this.clientVersion != null ? clientVersion.toMessageNano() : null;
- msg.configParameter = new com.google.protos.ipc.invalidation.NanoClientProtocol.PropertyRecord[configParameter.size()];
- for (int i = 0; i < msg.configParameter.length; i++) {
- msg.configParameter[i] = configParameter.get(i).toMessageNano();
- }
- msg.performanceCounter = new com.google.protos.ipc.invalidation.NanoClientProtocol.PropertyRecord[performanceCounter.size()];
- for (int i = 0; i < msg.performanceCounter.length; i++) {
- msg.performanceCounter[i] = performanceCounter.get(i).toMessageNano();
- }
- msg.serverRegistrationSummaryRequested = hasServerRegistrationSummaryRequested() ? serverRegistrationSummaryRequested : null;
- msg.clientConfig = this.clientConfig != null ? clientConfig.toMessageNano() : null;
- return msg;
- }
- }
-
- public static final class PropertyRecord extends ProtoWrapper {
- public static PropertyRecord create(String name,
- Integer value) {
- return new PropertyRecord(name, value);
- }
-
- public static final PropertyRecord DEFAULT_INSTANCE = new PropertyRecord(null, null);
-
- private final long __hazzerBits;
- private final String name;
- private final int value;
-
- private PropertyRecord(String name,
- Integer value) {
- int hazzerBits = 0;
- if (name != null) {
- hazzerBits |= 0x1;
- this.name = name;
- } else {
- this.name = "";
- }
- if (value != null) {
- hazzerBits |= 0x2;
- this.value = value;
- } else {
- this.value = 0;
- }
- this.__hazzerBits = hazzerBits;
- }
-
- public String getName() { return name; }
- public boolean hasName() { return (0x1 & __hazzerBits) != 0; }
-
- public int getValue() { return value; }
- public boolean hasValue() { return (0x2 & __hazzerBits) != 0; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof PropertyRecord)) { return false; }
- PropertyRecord other = (PropertyRecord) obj;
- return __hazzerBits == other.__hazzerBits
- && (!hasName() || equals(name, other.name))
- && (!hasValue() || value == other.value);
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- if (hasName()) {
- result = result * 31 + name.hashCode();
- }
- if (hasValue()) {
- result = result * 31 + hash(value);
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<PropertyRecord:");
- if (hasName()) {
- builder.append(" name=").append(name);
- }
- if (hasValue()) {
- builder.append(" value=").append(value);
- }
- builder.append('>');
- }
-
- public static PropertyRecord parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.PropertyRecord(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static PropertyRecord fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.PropertyRecord message) {
- if (message == null) { return null; }
- return new PropertyRecord(message.name,
- message.value);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.PropertyRecord toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.PropertyRecord msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.PropertyRecord();
- msg.name = hasName() ? name : null;
- msg.value = hasValue() ? value : null;
- return msg;
- }
- }
-
- public static final class ServerHeader extends ProtoWrapper {
- public static final class Builder {
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.ProtocolVersion protocolVersion;
- public Bytes clientToken;
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSummary registrationSummary;
- public long serverTimeMs;
- public String messageId;
- public Builder(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ProtocolVersion protocolVersion,
- Bytes clientToken,
- long serverTimeMs) {
- this.protocolVersion = protocolVersion;this.clientToken = clientToken;this.serverTimeMs = serverTimeMs;}
-
- public ServerHeader build() {
- return new ServerHeader(protocolVersion, clientToken, registrationSummary, serverTimeMs, messageId);
- }
- }
-
- public static ServerHeader create(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ProtocolVersion protocolVersion,
- Bytes clientToken,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSummary registrationSummary,
- long serverTimeMs,
- String messageId) {
- return new ServerHeader(protocolVersion, clientToken, registrationSummary, serverTimeMs, messageId);
- }
-
- private final long __hazzerBits;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.ProtocolVersion protocolVersion;
- private final Bytes clientToken;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSummary registrationSummary;
- private final long serverTimeMs;
- private final String messageId;
-
- private ServerHeader(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ProtocolVersion protocolVersion,
- Bytes clientToken,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSummary registrationSummary,
- Long serverTimeMs,
- String messageId) throws ValidationArgumentException {
- int hazzerBits = 0;
- required("protocol_version", protocolVersion);
- this.protocolVersion = protocolVersion;
- required("client_token", clientToken);
- nonEmpty("client_token", clientToken);
- this.clientToken = clientToken;
- this.registrationSummary = registrationSummary;
- required("server_time_ms", serverTimeMs);
- nonNegative("server_time_ms", serverTimeMs);
- this.serverTimeMs = serverTimeMs;
- if (messageId != null) {
- hazzerBits |= 0x1;
- nonEmpty("message_id", messageId);
- this.messageId = messageId;
- } else {
- this.messageId = "";
- }
- this.__hazzerBits = hazzerBits;
- }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.ProtocolVersion getProtocolVersion() { return protocolVersion; }
-
- public Bytes getClientToken() { return clientToken; }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSummary getNullableRegistrationSummary() { return registrationSummary; }
-
- public long getServerTimeMs() { return serverTimeMs; }
-
- public String getMessageId() { return messageId; }
- public boolean hasMessageId() { return (0x1 & __hazzerBits) != 0; }
-
- public Builder toBuilder() {
- Builder builder = new Builder(protocolVersion, clientToken, serverTimeMs);
- if (this.registrationSummary != null) {
- builder.registrationSummary = registrationSummary;
- }
- if (hasMessageId()) {
- builder.messageId = messageId;
- }
- return builder;
- }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof ServerHeader)) { return false; }
- ServerHeader other = (ServerHeader) obj;
- return __hazzerBits == other.__hazzerBits
- && equals(protocolVersion, other.protocolVersion)
- && equals(clientToken, other.clientToken)
- && equals(registrationSummary, other.registrationSummary)
- && serverTimeMs == other.serverTimeMs
- && (!hasMessageId() || equals(messageId, other.messageId));
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- result = result * 31 + protocolVersion.hashCode();
- result = result * 31 + clientToken.hashCode();
- if (registrationSummary != null) {
- result = result * 31 + registrationSummary.hashCode();
- }
- result = result * 31 + hash(serverTimeMs);
- if (hasMessageId()) {
- result = result * 31 + messageId.hashCode();
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<ServerHeader:");
- builder.append(" protocol_version=").append(protocolVersion);
- builder.append(" client_token=").append(clientToken);
- if (registrationSummary != null) {
- builder.append(" registration_summary=").append(registrationSummary);
- }
- builder.append(" server_time_ms=").append(serverTimeMs);
- if (hasMessageId()) {
- builder.append(" message_id=").append(messageId);
- }
- builder.append('>');
- }
-
- public static ServerHeader parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.ServerHeader(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static ServerHeader fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.ServerHeader message) {
- if (message == null) { return null; }
- return new ServerHeader(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ProtocolVersion.fromMessageNano(message.protocolVersion),
- Bytes.fromByteArray(message.clientToken),
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSummary.fromMessageNano(message.registrationSummary),
- message.serverTimeMs,
- message.messageId);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.ServerHeader toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.ServerHeader msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.ServerHeader();
- msg.protocolVersion = protocolVersion.toMessageNano();
- msg.clientToken = clientToken.getByteArray();
- msg.registrationSummary = this.registrationSummary != null ? registrationSummary.toMessageNano() : null;
- msg.serverTimeMs = serverTimeMs;
- msg.messageId = hasMessageId() ? messageId : null;
- return msg;
- }
- }
-
- public static final class ServerToClientMessage extends ProtoWrapper {
- public static final class Builder {
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.ServerHeader header;
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.TokenControlMessage tokenControlMessage;
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationMessage invalidationMessage;
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationStatusMessage registrationStatusMessage;
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSyncRequestMessage registrationSyncRequestMessage;
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.ConfigChangeMessage configChangeMessage;
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.InfoRequestMessage infoRequestMessage;
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.ErrorMessage errorMessage;
- public Builder(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ServerHeader header) {
- this.header = header;}
-
- public ServerToClientMessage build() {
- return new ServerToClientMessage(header, tokenControlMessage, invalidationMessage, registrationStatusMessage, registrationSyncRequestMessage, configChangeMessage, infoRequestMessage, errorMessage);
- }
- }
-
- public static ServerToClientMessage create(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ServerHeader header,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.TokenControlMessage tokenControlMessage,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationMessage invalidationMessage,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationStatusMessage registrationStatusMessage,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSyncRequestMessage registrationSyncRequestMessage,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.ConfigChangeMessage configChangeMessage,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.InfoRequestMessage infoRequestMessage,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.ErrorMessage errorMessage) {
- return new ServerToClientMessage(header, tokenControlMessage, invalidationMessage, registrationStatusMessage, registrationSyncRequestMessage, configChangeMessage, infoRequestMessage, errorMessage);
- }
-
- private final long __hazzerBits;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.ServerHeader header;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.TokenControlMessage tokenControlMessage;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationMessage invalidationMessage;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationStatusMessage registrationStatusMessage;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSyncRequestMessage registrationSyncRequestMessage;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.ConfigChangeMessage configChangeMessage;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.InfoRequestMessage infoRequestMessage;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.ErrorMessage errorMessage;
-
- private ServerToClientMessage(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ServerHeader header,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.TokenControlMessage tokenControlMessage,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationMessage invalidationMessage,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationStatusMessage registrationStatusMessage,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSyncRequestMessage registrationSyncRequestMessage,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.ConfigChangeMessage configChangeMessage,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.InfoRequestMessage infoRequestMessage,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.ErrorMessage errorMessage) throws ValidationArgumentException {
- int hazzerBits = 0;
- required("header", header);
- this.header = header;
- if (tokenControlMessage != null) {
- hazzerBits |= 0x1;
- this.tokenControlMessage = tokenControlMessage;
- } else {
- this.tokenControlMessage = com.google.ipc.invalidation.ticl.proto.ClientProtocol.TokenControlMessage.DEFAULT_INSTANCE;
- }
- this.invalidationMessage = invalidationMessage;
- this.registrationStatusMessage = registrationStatusMessage;
- if (registrationSyncRequestMessage != null) {
- hazzerBits |= 0x2;
- this.registrationSyncRequestMessage = registrationSyncRequestMessage;
- } else {
- this.registrationSyncRequestMessage = com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSyncRequestMessage.DEFAULT_INSTANCE;
- }
- if (configChangeMessage != null) {
- hazzerBits |= 0x4;
- this.configChangeMessage = configChangeMessage;
- } else {
- this.configChangeMessage = com.google.ipc.invalidation.ticl.proto.ClientProtocol.ConfigChangeMessage.DEFAULT_INSTANCE;
- }
- this.infoRequestMessage = infoRequestMessage;
- this.errorMessage = errorMessage;
- this.__hazzerBits = hazzerBits;
- }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.ServerHeader getHeader() { return header; }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.TokenControlMessage getTokenControlMessage() { return tokenControlMessage; }
- public boolean hasTokenControlMessage() { return (0x1 & __hazzerBits) != 0; }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationMessage getNullableInvalidationMessage() { return invalidationMessage; }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationStatusMessage getNullableRegistrationStatusMessage() { return registrationStatusMessage; }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSyncRequestMessage getRegistrationSyncRequestMessage() { return registrationSyncRequestMessage; }
- public boolean hasRegistrationSyncRequestMessage() { return (0x2 & __hazzerBits) != 0; }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.ConfigChangeMessage getConfigChangeMessage() { return configChangeMessage; }
- public boolean hasConfigChangeMessage() { return (0x4 & __hazzerBits) != 0; }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.InfoRequestMessage getNullableInfoRequestMessage() { return infoRequestMessage; }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.ErrorMessage getNullableErrorMessage() { return errorMessage; }
-
- public Builder toBuilder() {
- Builder builder = new Builder(header);
- if (hasTokenControlMessage()) {
- builder.tokenControlMessage = tokenControlMessage;
- }
- if (this.invalidationMessage != null) {
- builder.invalidationMessage = invalidationMessage;
- }
- if (this.registrationStatusMessage != null) {
- builder.registrationStatusMessage = registrationStatusMessage;
- }
- if (hasRegistrationSyncRequestMessage()) {
- builder.registrationSyncRequestMessage = registrationSyncRequestMessage;
- }
- if (hasConfigChangeMessage()) {
- builder.configChangeMessage = configChangeMessage;
- }
- if (this.infoRequestMessage != null) {
- builder.infoRequestMessage = infoRequestMessage;
- }
- if (this.errorMessage != null) {
- builder.errorMessage = errorMessage;
- }
- return builder;
- }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof ServerToClientMessage)) { return false; }
- ServerToClientMessage other = (ServerToClientMessage) obj;
- return __hazzerBits == other.__hazzerBits
- && equals(header, other.header)
- && (!hasTokenControlMessage() || equals(tokenControlMessage, other.tokenControlMessage))
- && equals(invalidationMessage, other.invalidationMessage)
- && equals(registrationStatusMessage, other.registrationStatusMessage)
- && (!hasRegistrationSyncRequestMessage() || equals(registrationSyncRequestMessage, other.registrationSyncRequestMessage))
- && (!hasConfigChangeMessage() || equals(configChangeMessage, other.configChangeMessage))
- && equals(infoRequestMessage, other.infoRequestMessage)
- && equals(errorMessage, other.errorMessage);
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- result = result * 31 + header.hashCode();
- if (hasTokenControlMessage()) {
- result = result * 31 + tokenControlMessage.hashCode();
- }
- if (invalidationMessage != null) {
- result = result * 31 + invalidationMessage.hashCode();
- }
- if (registrationStatusMessage != null) {
- result = result * 31 + registrationStatusMessage.hashCode();
- }
- if (hasRegistrationSyncRequestMessage()) {
- result = result * 31 + registrationSyncRequestMessage.hashCode();
- }
- if (hasConfigChangeMessage()) {
- result = result * 31 + configChangeMessage.hashCode();
- }
- if (infoRequestMessage != null) {
- result = result * 31 + infoRequestMessage.hashCode();
- }
- if (errorMessage != null) {
- result = result * 31 + errorMessage.hashCode();
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<ServerToClientMessage:");
- builder.append(" header=").append(header);
- if (hasTokenControlMessage()) {
- builder.append(" token_control_message=").append(tokenControlMessage);
- }
- if (invalidationMessage != null) {
- builder.append(" invalidation_message=").append(invalidationMessage);
- }
- if (registrationStatusMessage != null) {
- builder.append(" registration_status_message=").append(registrationStatusMessage);
- }
- if (hasRegistrationSyncRequestMessage()) {
- builder.append(" registration_sync_request_message=").append(registrationSyncRequestMessage);
- }
- if (hasConfigChangeMessage()) {
- builder.append(" config_change_message=").append(configChangeMessage);
- }
- if (infoRequestMessage != null) {
- builder.append(" info_request_message=").append(infoRequestMessage);
- }
- if (errorMessage != null) {
- builder.append(" error_message=").append(errorMessage);
- }
- builder.append('>');
- }
-
- public static ServerToClientMessage parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.ServerToClientMessage(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static ServerToClientMessage fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.ServerToClientMessage message) {
- if (message == null) { return null; }
- return new ServerToClientMessage(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ServerHeader.fromMessageNano(message.header),
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.TokenControlMessage.fromMessageNano(message.tokenControlMessage),
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationMessage.fromMessageNano(message.invalidationMessage),
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationStatusMessage.fromMessageNano(message.registrationStatusMessage),
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSyncRequestMessage.fromMessageNano(message.registrationSyncRequestMessage),
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.ConfigChangeMessage.fromMessageNano(message.configChangeMessage),
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.InfoRequestMessage.fromMessageNano(message.infoRequestMessage),
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.ErrorMessage.fromMessageNano(message.errorMessage));
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.ServerToClientMessage toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.ServerToClientMessage msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.ServerToClientMessage();
- msg.header = header.toMessageNano();
- msg.tokenControlMessage = hasTokenControlMessage() ? tokenControlMessage.toMessageNano() : null;
- msg.invalidationMessage = this.invalidationMessage != null ? invalidationMessage.toMessageNano() : null;
- msg.registrationStatusMessage = this.registrationStatusMessage != null ? registrationStatusMessage.toMessageNano() : null;
- msg.registrationSyncRequestMessage = hasRegistrationSyncRequestMessage() ? registrationSyncRequestMessage.toMessageNano() : null;
- msg.configChangeMessage = hasConfigChangeMessage() ? configChangeMessage.toMessageNano() : null;
- msg.infoRequestMessage = this.infoRequestMessage != null ? infoRequestMessage.toMessageNano() : null;
- msg.errorMessage = this.errorMessage != null ? errorMessage.toMessageNano() : null;
- return msg;
- }
- }
-
- public static final class TokenControlMessage extends ProtoWrapper {
- public static TokenControlMessage create(Bytes newToken) {
- return new TokenControlMessage(newToken);
- }
-
- public static final TokenControlMessage DEFAULT_INSTANCE = new TokenControlMessage(null);
-
- private final long __hazzerBits;
- private final Bytes newToken;
-
- private TokenControlMessage(Bytes newToken) {
- int hazzerBits = 0;
- if (newToken != null) {
- hazzerBits |= 0x1;
- this.newToken = newToken;
- } else {
- this.newToken = Bytes.EMPTY_BYTES;
- }
- this.__hazzerBits = hazzerBits;
- }
-
- public Bytes getNewToken() { return newToken; }
- public boolean hasNewToken() { return (0x1 & __hazzerBits) != 0; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof TokenControlMessage)) { return false; }
- TokenControlMessage other = (TokenControlMessage) obj;
- return __hazzerBits == other.__hazzerBits
- && (!hasNewToken() || equals(newToken, other.newToken));
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- if (hasNewToken()) {
- result = result * 31 + newToken.hashCode();
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<TokenControlMessage:");
- if (hasNewToken()) {
- builder.append(" new_token=").append(newToken);
- }
- builder.append('>');
- }
-
- public static TokenControlMessage parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.TokenControlMessage(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static TokenControlMessage fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.TokenControlMessage message) {
- if (message == null) { return null; }
- return new TokenControlMessage(Bytes.fromByteArray(message.newToken));
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.TokenControlMessage toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.TokenControlMessage msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.TokenControlMessage();
- msg.newToken = hasNewToken() ? newToken.getByteArray() : null;
- return msg;
- }
- }
-
- public static final class RegistrationStatus extends ProtoWrapper {
- public static RegistrationStatus create(com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationP registration,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.StatusP status) {
- return new RegistrationStatus(registration, status);
- }
-
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationP registration;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.StatusP status;
-
- private RegistrationStatus(com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationP registration,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.StatusP status) throws ValidationArgumentException {
- required("registration", registration);
- this.registration = registration;
- required("status", status);
- this.status = status;
- }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationP getRegistration() { return registration; }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.StatusP getStatus() { return status; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof RegistrationStatus)) { return false; }
- RegistrationStatus other = (RegistrationStatus) obj;
- return equals(registration, other.registration)
- && equals(status, other.status);
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + registration.hashCode();
- result = result * 31 + status.hashCode();
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<RegistrationStatus:");
- builder.append(" registration=").append(registration);
- builder.append(" status=").append(status);
- builder.append('>');
- }
-
- public static RegistrationStatus parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationStatus(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static RegistrationStatus fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationStatus message) {
- if (message == null) { return null; }
- return new RegistrationStatus(com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationP.fromMessageNano(message.registration),
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.StatusP.fromMessageNano(message.status));
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationStatus toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationStatus msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationStatus();
- msg.registration = registration.toMessageNano();
- msg.status = status.toMessageNano();
- return msg;
- }
- }
-
- public static final class RegistrationStatusMessage extends ProtoWrapper {
- public static RegistrationStatusMessage create(Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationStatus> registrationStatus) {
- return new RegistrationStatusMessage(registrationStatus);
- }
-
- private final List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationStatus> registrationStatus;
-
- private RegistrationStatusMessage(Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationStatus> registrationStatus) throws ValidationArgumentException {
- this.registrationStatus = required("registration_status", registrationStatus);
- }
-
- public List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationStatus> getRegistrationStatus() { return registrationStatus; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof RegistrationStatusMessage)) { return false; }
- RegistrationStatusMessage other = (RegistrationStatusMessage) obj;
- return equals(registrationStatus, other.registrationStatus);
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + registrationStatus.hashCode();
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<RegistrationStatusMessage:");
- builder.append(" registration_status=[").append(registrationStatus).append(']');
- builder.append('>');
- }
-
- public static RegistrationStatusMessage parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationStatusMessage(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static RegistrationStatusMessage fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationStatusMessage message) {
- if (message == null) { return null; }
- List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationStatus> registrationStatus = new ArrayList<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationStatus>(message.registrationStatus.length);
- for (int i = 0; i < message.registrationStatus.length; i++) {
- registrationStatus.add(com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationStatus.fromMessageNano(message.registrationStatus[i]));
- }
- return new RegistrationStatusMessage(registrationStatus);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationStatusMessage toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationStatusMessage msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationStatusMessage();
- msg.registrationStatus = new com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationStatus[registrationStatus.size()];
- for (int i = 0; i < msg.registrationStatus.length; i++) {
- msg.registrationStatus[i] = registrationStatus.get(i).toMessageNano();
- }
- return msg;
- }
- }
-
- public static final class RegistrationSyncRequestMessage extends ProtoWrapper {
- public static RegistrationSyncRequestMessage create() {
- return new RegistrationSyncRequestMessage();
- }
-
- public static final RegistrationSyncRequestMessage DEFAULT_INSTANCE = new RegistrationSyncRequestMessage();
-
-
- private RegistrationSyncRequestMessage() {
- }
-
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof RegistrationSyncRequestMessage)) { return false; }
- RegistrationSyncRequestMessage other = (RegistrationSyncRequestMessage) obj;
- return true;
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<RegistrationSyncRequestMessage:");
- builder.append('>');
- }
-
- public static RegistrationSyncRequestMessage parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationSyncRequestMessage(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static RegistrationSyncRequestMessage fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationSyncRequestMessage message) {
- if (message == null) { return null; }
- return new RegistrationSyncRequestMessage();
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationSyncRequestMessage toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationSyncRequestMessage msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationSyncRequestMessage();
- return msg;
- }
- }
-
- public static final class InvalidationMessage extends ProtoWrapper {
- public static InvalidationMessage create(Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP> invalidation) {
- return new InvalidationMessage(invalidation);
- }
-
- private final List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP> invalidation;
-
- private InvalidationMessage(Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP> invalidation) throws ValidationArgumentException {
- this.invalidation = required("invalidation", invalidation);
- }
-
- public List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP> getInvalidation() { return invalidation; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof InvalidationMessage)) { return false; }
- InvalidationMessage other = (InvalidationMessage) obj;
- return equals(invalidation, other.invalidation);
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + invalidation.hashCode();
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<InvalidationMessage:");
- builder.append(" invalidation=[").append(invalidation).append(']');
- builder.append('>');
- }
-
- public static InvalidationMessage parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.InvalidationMessage(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static InvalidationMessage fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.InvalidationMessage message) {
- if (message == null) { return null; }
- List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP> invalidation = new ArrayList<com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP>(message.invalidation.length);
- for (int i = 0; i < message.invalidation.length; i++) {
- invalidation.add(com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP.fromMessageNano(message.invalidation[i]));
- }
- return new InvalidationMessage(invalidation);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.InvalidationMessage toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.InvalidationMessage msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.InvalidationMessage();
- msg.invalidation = new com.google.protos.ipc.invalidation.NanoClientProtocol.InvalidationP[invalidation.size()];
- for (int i = 0; i < msg.invalidation.length; i++) {
- msg.invalidation[i] = invalidation.get(i).toMessageNano();
- }
- return msg;
- }
- }
-
- public static final class InfoRequestMessage extends ProtoWrapper {
- public interface InfoType {
- public static final int GET_PERFORMANCE_COUNTERS = 1;
- }
-
- public static InfoRequestMessage create(Collection<Integer> infoType) {
- return new InfoRequestMessage(infoType);
- }
-
- private final List<Integer> infoType;
-
- private InfoRequestMessage(Collection<Integer> infoType) throws ValidationArgumentException {
- this.infoType = required("info_type", infoType);
- }
-
- public List<Integer> getInfoType() { return infoType; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof InfoRequestMessage)) { return false; }
- InfoRequestMessage other = (InfoRequestMessage) obj;
- return equals(infoType, other.infoType);
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + infoType.hashCode();
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<InfoRequestMessage:");
- builder.append(" info_type=[").append(infoType).append(']');
- builder.append('>');
- }
-
- public static InfoRequestMessage parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.InfoRequestMessage(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static InfoRequestMessage fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.InfoRequestMessage message) {
- if (message == null) { return null; }
- List<Integer> infoType = new ArrayList<Integer>(message.infoType.length);
- for (int i = 0; i < message.infoType.length; i++) {
- infoType.add(message.infoType[i]);
- }
- return new InfoRequestMessage(infoType);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.InfoRequestMessage toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.InfoRequestMessage msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.InfoRequestMessage();
- msg.infoType = new int[infoType.size()];
- for (int i = 0; i < msg.infoType.length; i++) {
- msg.infoType[i] = infoType.get(i);
- }
- return msg;
- }
- }
-
- public static final class RateLimitP extends ProtoWrapper {
- public static RateLimitP create(int windowMs,
- int count) {
- return new RateLimitP(windowMs, count);
- }
-
- private final int windowMs;
- private final int count;
-
- private RateLimitP(Integer windowMs,
- Integer count) throws ValidationArgumentException {
- required("window_ms", windowMs);
- this.windowMs = windowMs;
- required("count", count);
- this.count = count;
- check(windowMs >= 1000 && windowMs > count, "Invalid window_ms and count");
- }
-
- public int getWindowMs() { return windowMs; }
-
- public int getCount() { return count; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof RateLimitP)) { return false; }
- RateLimitP other = (RateLimitP) obj;
- return windowMs == other.windowMs
- && count == other.count;
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + hash(windowMs);
- result = result * 31 + hash(count);
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<RateLimitP:");
- builder.append(" window_ms=").append(windowMs);
- builder.append(" count=").append(count);
- builder.append('>');
- }
-
- public static RateLimitP parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.RateLimitP(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static RateLimitP fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.RateLimitP message) {
- if (message == null) { return null; }
- return new RateLimitP(message.windowMs,
- message.count);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.RateLimitP toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.RateLimitP msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.RateLimitP();
- msg.windowMs = windowMs;
- msg.count = count;
- return msg;
- }
- }
-
- public static final class ProtocolHandlerConfigP extends ProtoWrapper {
- public static final class Builder {
- public Integer batchingDelayMs;
- public Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RateLimitP> rateLimit;
- public Builder() {
- }
-
- public ProtocolHandlerConfigP build() {
- return new ProtocolHandlerConfigP(batchingDelayMs, rateLimit);
- }
- }
-
- public static ProtocolHandlerConfigP create(Integer batchingDelayMs,
- Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RateLimitP> rateLimit) {
- return new ProtocolHandlerConfigP(batchingDelayMs, rateLimit);
- }
-
- public static final ProtocolHandlerConfigP DEFAULT_INSTANCE = new ProtocolHandlerConfigP(null, null);
-
- private final long __hazzerBits;
- private final int batchingDelayMs;
- private final List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RateLimitP> rateLimit;
-
- private ProtocolHandlerConfigP(Integer batchingDelayMs,
- Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RateLimitP> rateLimit) {
- int hazzerBits = 0;
- if (batchingDelayMs != null) {
- hazzerBits |= 0x1;
- this.batchingDelayMs = batchingDelayMs;
- } else {
- this.batchingDelayMs = 500;
- }
- this.rateLimit = optional("rate_limit", rateLimit);
- this.__hazzerBits = hazzerBits;
- }
-
- public int getBatchingDelayMs() { return batchingDelayMs; }
- public boolean hasBatchingDelayMs() { return (0x1 & __hazzerBits) != 0; }
-
- public List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RateLimitP> getRateLimit() { return rateLimit; }
-
- public Builder toBuilder() {
- Builder builder = new Builder();
- if (hasBatchingDelayMs()) {
- builder.batchingDelayMs = batchingDelayMs;
- }
- if (!this.rateLimit.isEmpty()) {
- builder.rateLimit = rateLimit;
- }
- return builder;
- }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof ProtocolHandlerConfigP)) { return false; }
- ProtocolHandlerConfigP other = (ProtocolHandlerConfigP) obj;
- return __hazzerBits == other.__hazzerBits
- && (!hasBatchingDelayMs() || batchingDelayMs == other.batchingDelayMs)
- && equals(rateLimit, other.rateLimit);
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- if (hasBatchingDelayMs()) {
- result = result * 31 + hash(batchingDelayMs);
- }
- result = result * 31 + rateLimit.hashCode();
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<ProtocolHandlerConfigP:");
- if (hasBatchingDelayMs()) {
- builder.append(" batching_delay_ms=").append(batchingDelayMs);
- }
- builder.append(" rate_limit=[").append(rateLimit).append(']');
- builder.append('>');
- }
-
- public static ProtocolHandlerConfigP parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.ProtocolHandlerConfigP(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static ProtocolHandlerConfigP fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.ProtocolHandlerConfigP message) {
- if (message == null) { return null; }
- List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RateLimitP> rateLimit = new ArrayList<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RateLimitP>(message.rateLimit.length);
- for (int i = 0; i < message.rateLimit.length; i++) {
- rateLimit.add(com.google.ipc.invalidation.ticl.proto.ClientProtocol.RateLimitP.fromMessageNano(message.rateLimit[i]));
- }
- return new ProtocolHandlerConfigP(message.batchingDelayMs,
- rateLimit);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.ProtocolHandlerConfigP toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.ProtocolHandlerConfigP msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.ProtocolHandlerConfigP();
- msg.batchingDelayMs = hasBatchingDelayMs() ? batchingDelayMs : null;
- msg.rateLimit = new com.google.protos.ipc.invalidation.NanoClientProtocol.RateLimitP[rateLimit.size()];
- for (int i = 0; i < msg.rateLimit.length; i++) {
- msg.rateLimit[i] = rateLimit.get(i).toMessageNano();
- }
- return msg;
- }
- }
-
- public static final class ClientConfigP extends ProtoWrapper {
- public static final class Builder {
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version;
- public Integer networkTimeoutDelayMs;
- public Integer writeRetryDelayMs;
- public Integer heartbeatIntervalMs;
- public Integer perfCounterDelayMs;
- public Integer maxExponentialBackoffFactor;
- public Integer smearPercent;
- public Boolean isTransient;
- public Integer initialPersistentHeartbeatDelayMs;
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.ProtocolHandlerConfigP protocolHandlerConfig;
- public Boolean channelSupportsOfflineDelivery;
- public Integer offlineHeartbeatThresholdMs;
- public Boolean allowSuppression;
- public Builder(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.ProtocolHandlerConfigP protocolHandlerConfig) {
- this.version = version;this.protocolHandlerConfig = protocolHandlerConfig;}
-
- public ClientConfigP build() {
- return new ClientConfigP(version, networkTimeoutDelayMs, writeRetryDelayMs, heartbeatIntervalMs, perfCounterDelayMs, maxExponentialBackoffFactor, smearPercent, isTransient, initialPersistentHeartbeatDelayMs, protocolHandlerConfig, channelSupportsOfflineDelivery, offlineHeartbeatThresholdMs, allowSuppression);
- }
- }
-
- public static ClientConfigP create(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version,
- Integer networkTimeoutDelayMs,
- Integer writeRetryDelayMs,
- Integer heartbeatIntervalMs,
- Integer perfCounterDelayMs,
- Integer maxExponentialBackoffFactor,
- Integer smearPercent,
- Boolean isTransient,
- Integer initialPersistentHeartbeatDelayMs,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.ProtocolHandlerConfigP protocolHandlerConfig,
- Boolean channelSupportsOfflineDelivery,
- Integer offlineHeartbeatThresholdMs,
- Boolean allowSuppression) {
- return new ClientConfigP(version, networkTimeoutDelayMs, writeRetryDelayMs, heartbeatIntervalMs, perfCounterDelayMs, maxExponentialBackoffFactor, smearPercent, isTransient, initialPersistentHeartbeatDelayMs, protocolHandlerConfig, channelSupportsOfflineDelivery, offlineHeartbeatThresholdMs, allowSuppression);
- }
-
- private final long __hazzerBits;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version;
- private final int networkTimeoutDelayMs;
- private final int writeRetryDelayMs;
- private final int heartbeatIntervalMs;
- private final int perfCounterDelayMs;
- private final int maxExponentialBackoffFactor;
- private final int smearPercent;
- private final boolean isTransient;
- private final int initialPersistentHeartbeatDelayMs;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.ProtocolHandlerConfigP protocolHandlerConfig;
- private final boolean channelSupportsOfflineDelivery;
- private final int offlineHeartbeatThresholdMs;
- private final boolean allowSuppression;
-
- private ClientConfigP(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version version,
- Integer networkTimeoutDelayMs,
- Integer writeRetryDelayMs,
- Integer heartbeatIntervalMs,
- Integer perfCounterDelayMs,
- Integer maxExponentialBackoffFactor,
- Integer smearPercent,
- Boolean isTransient,
- Integer initialPersistentHeartbeatDelayMs,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.ProtocolHandlerConfigP protocolHandlerConfig,
- Boolean channelSupportsOfflineDelivery,
- Integer offlineHeartbeatThresholdMs,
- Boolean allowSuppression) throws ValidationArgumentException {
- int hazzerBits = 0;
- required("version", version);
- this.version = version;
- if (networkTimeoutDelayMs != null) {
- hazzerBits |= 0x1;
- this.networkTimeoutDelayMs = networkTimeoutDelayMs;
- } else {
- this.networkTimeoutDelayMs = 60000;
- }
- if (writeRetryDelayMs != null) {
- hazzerBits |= 0x2;
- this.writeRetryDelayMs = writeRetryDelayMs;
- } else {
- this.writeRetryDelayMs = 10000;
- }
- if (heartbeatIntervalMs != null) {
- hazzerBits |= 0x4;
- this.heartbeatIntervalMs = heartbeatIntervalMs;
- } else {
- this.heartbeatIntervalMs = 1200000;
- }
- if (perfCounterDelayMs != null) {
- hazzerBits |= 0x8;
- this.perfCounterDelayMs = perfCounterDelayMs;
- } else {
- this.perfCounterDelayMs = 21600000;
- }
- if (maxExponentialBackoffFactor != null) {
- hazzerBits |= 0x10;
- this.maxExponentialBackoffFactor = maxExponentialBackoffFactor;
- } else {
- this.maxExponentialBackoffFactor = 500;
- }
- if (smearPercent != null) {
- hazzerBits |= 0x20;
- this.smearPercent = smearPercent;
- } else {
- this.smearPercent = 20;
- }
- if (isTransient != null) {
- hazzerBits |= 0x40;
- this.isTransient = isTransient;
- } else {
- this.isTransient = false;
- }
- if (initialPersistentHeartbeatDelayMs != null) {
- hazzerBits |= 0x80;
- this.initialPersistentHeartbeatDelayMs = initialPersistentHeartbeatDelayMs;
- } else {
- this.initialPersistentHeartbeatDelayMs = 2000;
- }
- required("protocol_handler_config", protocolHandlerConfig);
- this.protocolHandlerConfig = protocolHandlerConfig;
- if (channelSupportsOfflineDelivery != null) {
- hazzerBits |= 0x100;
- this.channelSupportsOfflineDelivery = channelSupportsOfflineDelivery;
- } else {
- this.channelSupportsOfflineDelivery = false;
- }
- if (offlineHeartbeatThresholdMs != null) {
- hazzerBits |= 0x200;
- this.offlineHeartbeatThresholdMs = offlineHeartbeatThresholdMs;
- } else {
- this.offlineHeartbeatThresholdMs = 60000;
- }
- if (allowSuppression != null) {
- hazzerBits |= 0x400;
- this.allowSuppression = allowSuppression;
- } else {
- this.allowSuppression = true;
- }
- this.__hazzerBits = hazzerBits;
- }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version getVersion() { return version; }
-
- public int getNetworkTimeoutDelayMs() { return networkTimeoutDelayMs; }
- public boolean hasNetworkTimeoutDelayMs() { return (0x1 & __hazzerBits) != 0; }
-
- public int getWriteRetryDelayMs() { return writeRetryDelayMs; }
- public boolean hasWriteRetryDelayMs() { return (0x2 & __hazzerBits) != 0; }
-
- public int getHeartbeatIntervalMs() { return heartbeatIntervalMs; }
- public boolean hasHeartbeatIntervalMs() { return (0x4 & __hazzerBits) != 0; }
-
- public int getPerfCounterDelayMs() { return perfCounterDelayMs; }
- public boolean hasPerfCounterDelayMs() { return (0x8 & __hazzerBits) != 0; }
-
- public int getMaxExponentialBackoffFactor() { return maxExponentialBackoffFactor; }
- public boolean hasMaxExponentialBackoffFactor() { return (0x10 & __hazzerBits) != 0; }
-
- public int getSmearPercent() { return smearPercent; }
- public boolean hasSmearPercent() { return (0x20 & __hazzerBits) != 0; }
-
- public boolean getIsTransient() { return isTransient; }
- public boolean hasIsTransient() { return (0x40 & __hazzerBits) != 0; }
-
- public int getInitialPersistentHeartbeatDelayMs() { return initialPersistentHeartbeatDelayMs; }
- public boolean hasInitialPersistentHeartbeatDelayMs() { return (0x80 & __hazzerBits) != 0; }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.ProtocolHandlerConfigP getProtocolHandlerConfig() { return protocolHandlerConfig; }
-
- public boolean getChannelSupportsOfflineDelivery() { return channelSupportsOfflineDelivery; }
- public boolean hasChannelSupportsOfflineDelivery() { return (0x100 & __hazzerBits) != 0; }
-
- public int getOfflineHeartbeatThresholdMs() { return offlineHeartbeatThresholdMs; }
- public boolean hasOfflineHeartbeatThresholdMs() { return (0x200 & __hazzerBits) != 0; }
-
- public boolean getAllowSuppression() { return allowSuppression; }
- public boolean hasAllowSuppression() { return (0x400 & __hazzerBits) != 0; }
-
- public Builder toBuilder() {
- Builder builder = new Builder(version, protocolHandlerConfig);
- if (hasNetworkTimeoutDelayMs()) {
- builder.networkTimeoutDelayMs = networkTimeoutDelayMs;
- }
- if (hasWriteRetryDelayMs()) {
- builder.writeRetryDelayMs = writeRetryDelayMs;
- }
- if (hasHeartbeatIntervalMs()) {
- builder.heartbeatIntervalMs = heartbeatIntervalMs;
- }
- if (hasPerfCounterDelayMs()) {
- builder.perfCounterDelayMs = perfCounterDelayMs;
- }
- if (hasMaxExponentialBackoffFactor()) {
- builder.maxExponentialBackoffFactor = maxExponentialBackoffFactor;
- }
- if (hasSmearPercent()) {
- builder.smearPercent = smearPercent;
- }
- if (hasIsTransient()) {
- builder.isTransient = isTransient;
- }
- if (hasInitialPersistentHeartbeatDelayMs()) {
- builder.initialPersistentHeartbeatDelayMs = initialPersistentHeartbeatDelayMs;
- }
- if (hasChannelSupportsOfflineDelivery()) {
- builder.channelSupportsOfflineDelivery = channelSupportsOfflineDelivery;
- }
- if (hasOfflineHeartbeatThresholdMs()) {
- builder.offlineHeartbeatThresholdMs = offlineHeartbeatThresholdMs;
- }
- if (hasAllowSuppression()) {
- builder.allowSuppression = allowSuppression;
- }
- return builder;
- }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof ClientConfigP)) { return false; }
- ClientConfigP other = (ClientConfigP) obj;
- return __hazzerBits == other.__hazzerBits
- && equals(version, other.version)
- && (!hasNetworkTimeoutDelayMs() || networkTimeoutDelayMs == other.networkTimeoutDelayMs)
- && (!hasWriteRetryDelayMs() || writeRetryDelayMs == other.writeRetryDelayMs)
- && (!hasHeartbeatIntervalMs() || heartbeatIntervalMs == other.heartbeatIntervalMs)
- && (!hasPerfCounterDelayMs() || perfCounterDelayMs == other.perfCounterDelayMs)
- && (!hasMaxExponentialBackoffFactor() || maxExponentialBackoffFactor == other.maxExponentialBackoffFactor)
- && (!hasSmearPercent() || smearPercent == other.smearPercent)
- && (!hasIsTransient() || isTransient == other.isTransient)
- && (!hasInitialPersistentHeartbeatDelayMs() || initialPersistentHeartbeatDelayMs == other.initialPersistentHeartbeatDelayMs)
- && equals(protocolHandlerConfig, other.protocolHandlerConfig)
- && (!hasChannelSupportsOfflineDelivery() || channelSupportsOfflineDelivery == other.channelSupportsOfflineDelivery)
- && (!hasOfflineHeartbeatThresholdMs() || offlineHeartbeatThresholdMs == other.offlineHeartbeatThresholdMs)
- && (!hasAllowSuppression() || allowSuppression == other.allowSuppression);
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- result = result * 31 + version.hashCode();
- if (hasNetworkTimeoutDelayMs()) {
- result = result * 31 + hash(networkTimeoutDelayMs);
- }
- if (hasWriteRetryDelayMs()) {
- result = result * 31 + hash(writeRetryDelayMs);
- }
- if (hasHeartbeatIntervalMs()) {
- result = result * 31 + hash(heartbeatIntervalMs);
- }
- if (hasPerfCounterDelayMs()) {
- result = result * 31 + hash(perfCounterDelayMs);
- }
- if (hasMaxExponentialBackoffFactor()) {
- result = result * 31 + hash(maxExponentialBackoffFactor);
- }
- if (hasSmearPercent()) {
- result = result * 31 + hash(smearPercent);
- }
- if (hasIsTransient()) {
- result = result * 31 + hash(isTransient);
- }
- if (hasInitialPersistentHeartbeatDelayMs()) {
- result = result * 31 + hash(initialPersistentHeartbeatDelayMs);
- }
- result = result * 31 + protocolHandlerConfig.hashCode();
- if (hasChannelSupportsOfflineDelivery()) {
- result = result * 31 + hash(channelSupportsOfflineDelivery);
- }
- if (hasOfflineHeartbeatThresholdMs()) {
- result = result * 31 + hash(offlineHeartbeatThresholdMs);
- }
- if (hasAllowSuppression()) {
- result = result * 31 + hash(allowSuppression);
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<ClientConfigP:");
- builder.append(" version=").append(version);
- if (hasNetworkTimeoutDelayMs()) {
- builder.append(" network_timeout_delay_ms=").append(networkTimeoutDelayMs);
- }
- if (hasWriteRetryDelayMs()) {
- builder.append(" write_retry_delay_ms=").append(writeRetryDelayMs);
- }
- if (hasHeartbeatIntervalMs()) {
- builder.append(" heartbeat_interval_ms=").append(heartbeatIntervalMs);
- }
- if (hasPerfCounterDelayMs()) {
- builder.append(" perf_counter_delay_ms=").append(perfCounterDelayMs);
- }
- if (hasMaxExponentialBackoffFactor()) {
- builder.append(" max_exponential_backoff_factor=").append(maxExponentialBackoffFactor);
- }
- if (hasSmearPercent()) {
- builder.append(" smear_percent=").append(smearPercent);
- }
- if (hasIsTransient()) {
- builder.append(" is_transient=").append(isTransient);
- }
- if (hasInitialPersistentHeartbeatDelayMs()) {
- builder.append(" initial_persistent_heartbeat_delay_ms=").append(initialPersistentHeartbeatDelayMs);
- }
- builder.append(" protocol_handler_config=").append(protocolHandlerConfig);
- if (hasChannelSupportsOfflineDelivery()) {
- builder.append(" channel_supports_offline_delivery=").append(channelSupportsOfflineDelivery);
- }
- if (hasOfflineHeartbeatThresholdMs()) {
- builder.append(" offline_heartbeat_threshold_ms=").append(offlineHeartbeatThresholdMs);
- }
- if (hasAllowSuppression()) {
- builder.append(" allow_suppression=").append(allowSuppression);
- }
- builder.append('>');
- }
-
- public static ClientConfigP parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.ClientConfigP(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static ClientConfigP fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.ClientConfigP message) {
- if (message == null) { return null; }
- return new ClientConfigP(com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version.fromMessageNano(message.version),
- message.networkTimeoutDelayMs,
- message.writeRetryDelayMs,
- message.heartbeatIntervalMs,
- message.perfCounterDelayMs,
- message.maxExponentialBackoffFactor,
- message.smearPercent,
- message.isTransient,
- message.initialPersistentHeartbeatDelayMs,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.ProtocolHandlerConfigP.fromMessageNano(message.protocolHandlerConfig),
- message.channelSupportsOfflineDelivery,
- message.offlineHeartbeatThresholdMs,
- message.allowSuppression);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.ClientConfigP toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.ClientConfigP msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.ClientConfigP();
- msg.version = version.toMessageNano();
- msg.networkTimeoutDelayMs = hasNetworkTimeoutDelayMs() ? networkTimeoutDelayMs : null;
- msg.writeRetryDelayMs = hasWriteRetryDelayMs() ? writeRetryDelayMs : null;
- msg.heartbeatIntervalMs = hasHeartbeatIntervalMs() ? heartbeatIntervalMs : null;
- msg.perfCounterDelayMs = hasPerfCounterDelayMs() ? perfCounterDelayMs : null;
- msg.maxExponentialBackoffFactor = hasMaxExponentialBackoffFactor() ? maxExponentialBackoffFactor : null;
- msg.smearPercent = hasSmearPercent() ? smearPercent : null;
- msg.isTransient = hasIsTransient() ? isTransient : null;
- msg.initialPersistentHeartbeatDelayMs = hasInitialPersistentHeartbeatDelayMs() ? initialPersistentHeartbeatDelayMs : null;
- msg.protocolHandlerConfig = protocolHandlerConfig.toMessageNano();
- msg.channelSupportsOfflineDelivery = hasChannelSupportsOfflineDelivery() ? channelSupportsOfflineDelivery : null;
- msg.offlineHeartbeatThresholdMs = hasOfflineHeartbeatThresholdMs() ? offlineHeartbeatThresholdMs : null;
- msg.allowSuppression = hasAllowSuppression() ? allowSuppression : null;
- return msg;
- }
- }
-
- public static final class ConfigChangeMessage extends ProtoWrapper {
- public static ConfigChangeMessage create(Long nextMessageDelayMs) {
- return new ConfigChangeMessage(nextMessageDelayMs);
- }
-
- public static final ConfigChangeMessage DEFAULT_INSTANCE = new ConfigChangeMessage(null);
-
- private final long __hazzerBits;
- private final long nextMessageDelayMs;
-
- private ConfigChangeMessage(Long nextMessageDelayMs) throws ValidationArgumentException {
- int hazzerBits = 0;
- if (nextMessageDelayMs != null) {
- hazzerBits |= 0x1;
- positive("next_message_delay_ms", nextMessageDelayMs);
- this.nextMessageDelayMs = nextMessageDelayMs;
- } else {
- this.nextMessageDelayMs = 0;
- }
- this.__hazzerBits = hazzerBits;
- }
-
- public long getNextMessageDelayMs() { return nextMessageDelayMs; }
- public boolean hasNextMessageDelayMs() { return (0x1 & __hazzerBits) != 0; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof ConfigChangeMessage)) { return false; }
- ConfigChangeMessage other = (ConfigChangeMessage) obj;
- return __hazzerBits == other.__hazzerBits
- && (!hasNextMessageDelayMs() || nextMessageDelayMs == other.nextMessageDelayMs);
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- if (hasNextMessageDelayMs()) {
- result = result * 31 + hash(nextMessageDelayMs);
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<ConfigChangeMessage:");
- if (hasNextMessageDelayMs()) {
- builder.append(" next_message_delay_ms=").append(nextMessageDelayMs);
- }
- builder.append('>');
- }
-
- public static ConfigChangeMessage parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.ConfigChangeMessage(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static ConfigChangeMessage fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.ConfigChangeMessage message) {
- if (message == null) { return null; }
- return new ConfigChangeMessage(message.nextMessageDelayMs);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.ConfigChangeMessage toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.ConfigChangeMessage msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.ConfigChangeMessage();
- msg.nextMessageDelayMs = hasNextMessageDelayMs() ? nextMessageDelayMs : null;
- return msg;
- }
- }
-
- public static final class ErrorMessage extends ProtoWrapper {
- public interface Code {
- public static final int AUTH_FAILURE = 1;
- public static final int UNKNOWN_FAILURE = 10000;
- }
-
- public static ErrorMessage create(int code,
- String description) {
- return new ErrorMessage(code, description);
- }
-
- private final int code;
- private final String description;
-
- private ErrorMessage(Integer code,
- String description) throws ValidationArgumentException {
- required("code", code);
- this.code = code;
- required("description", description);
- this.description = description;
- }
-
- public int getCode() { return code; }
-
- public String getDescription() { return description; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof ErrorMessage)) { return false; }
- ErrorMessage other = (ErrorMessage) obj;
- return code == other.code
- && equals(description, other.description);
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + hash(code);
- result = result * 31 + description.hashCode();
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<ErrorMessage:");
- builder.append(" code=").append(code);
- builder.append(" description=").append(description);
- builder.append('>');
- }
-
- public static ErrorMessage parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoClientProtocol.ErrorMessage(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static ErrorMessage fromMessageNano(com.google.protos.ipc.invalidation.NanoClientProtocol.ErrorMessage message) {
- if (message == null) { return null; }
- return new ErrorMessage(message.code,
- message.description);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoClientProtocol.ErrorMessage toMessageNano() {
- com.google.protos.ipc.invalidation.NanoClientProtocol.ErrorMessage msg = new com.google.protos.ipc.invalidation.NanoClientProtocol.ErrorMessage();
- msg.code = code;
- msg.description = description;
- return msg;
- }
- }
-}
diff --git a/java/com/google/ipc/invalidation/ticl/proto/CommonProtos.java b/java/com/google/ipc/invalidation/ticl/proto/CommonProtos.java
deleted file mode 100644
index 456aa6e..0000000
--- a/java/com/google/ipc/invalidation/ticl/proto/CommonProtos.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.ipc.invalidation.ticl.proto;
-
-import com.google.ipc.invalidation.ticl.proto.AndroidChannel.AndroidEndpointId;
-import com.google.ipc.invalidation.ticl.proto.ChannelCommon.NetworkEndpointId;
-import com.google.ipc.invalidation.ticl.proto.ChannelCommon.NetworkEndpointId.NetworkAddress;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ClientVersion;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationStatus;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSummary;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.ServerHeader;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.StatusP;
-import com.google.ipc.invalidation.ticl.proto.ClientProtocol.Version;
-import com.google.ipc.invalidation.util.Bytes;
-import com.google.ipc.invalidation.util.Preconditions;
-
-
-/** Utilities for creating protocol buffer wrappers. */
-public class CommonProtos {
-
- public static boolean isAllObjectId(ObjectIdP objectId) {
- return ClientConstants.ALL_OBJECT_ID.equals(objectId);
- }
-
- /** Returns true iff status corresponds to permanent failure. */
- public static boolean isPermanentFailure(StatusP status) {
- return status.getCode() == StatusP.Code.PERMANENT_FAILURE;
- }
-
- /** Returns true iff status corresponds to success. */
- public static boolean isSuccess(StatusP status) {
- return status.getCode() == StatusP.Code.SUCCESS;
- }
-
- /** Returns true iff status corresponds to transient failure. */
- public static boolean isTransientFailure(StatusP status) {
- return status.getCode() == StatusP.Code.TRANSIENT_FAILURE;
- }
-
- /**
- * Constructs a network endpoint id for an Android client with the given {@code registrationId},
- * {@code clientKey}, and {@code packageName}.
- */
- public static NetworkEndpointId newAndroidEndpointId(String registrationId, String clientKey,
- String packageName, Version channelVersion) {
- Preconditions.checkNotNull(registrationId, "Null registration id");
- Preconditions.checkNotNull(clientKey, "Null client key");
- Preconditions.checkNotNull(packageName, "Null package name");
- Preconditions.checkNotNull(channelVersion, "Null channel version");
-
- AndroidEndpointId endpoint = AndroidEndpointId.create(registrationId, clientKey,
- /* senderId */ null, channelVersion, packageName);
- return NetworkEndpointId.create(NetworkAddress.ANDROID, new Bytes(endpoint.toByteArray()),
- null);
- }
-
- public static ClientVersion newClientVersion(String platform, String language,
- String applicationInfo) {
- return ClientVersion.create(ClientConstants.CLIENT_VERSION_VALUE, platform, language,
- applicationInfo);
- }
-
- public static StatusP newFailureStatus(boolean isTransient, String description) {
- return StatusP.create(
- isTransient ? StatusP.Code.TRANSIENT_FAILURE : StatusP.Code.PERMANENT_FAILURE, description);
- }
-
-
- public static InvalidationP newInvalidationP(ObjectIdP objectId, long version,
- boolean isTrickleRestart, byte[] payload) {
- return InvalidationP.create(objectId, /* isKnownVersion */ true,
- version, Bytes.fromByteArray(payload), /* bridgeArrivalTimeMsDeprecated */ null,
- isTrickleRestart);
- }
-
- public static InvalidationP newInvalidationPForUnknownVersion(ObjectIdP oid,
- long sequenceNumber) {
- return InvalidationP.create(oid, /* isKnownVersion */ false, sequenceNumber, /* payload */ null,
- /* bridgeArrivalTimeMsDeprecated */ null, /* isTrickleRestart */ true);
- }
-
- public static RegistrationP newRegistrationP(ObjectIdP oid, boolean isReg) {
- return RegistrationP.create(oid,
- isReg ? RegistrationP.OpType.REGISTER : RegistrationP.OpType.UNREGISTER);
- }
-
- public static ServerHeader newServerHeader(byte[] clientToken, long currentTimeMs,
- RegistrationSummary registrationSummary, String messageId) {
- return ServerHeader.create(ClientConstants.PROTOCOL_VERSION, new Bytes(clientToken),
- registrationSummary, currentTimeMs, messageId);
- }
-
- public static StatusP newSuccessStatus() {
- return StatusP.create(StatusP.Code.SUCCESS, null);
- }
-
- public static RegistrationStatus newTransientFailureRegistrationStatus(RegistrationP registration,
- String description) {
- return RegistrationStatus.create(registration, newFailureStatus(true, description));
- }
-
- // Prevent instantiation.
- private CommonProtos() {}
-}
diff --git a/java/com/google/ipc/invalidation/ticl/proto/JavaClient.java b/java/com/google/ipc/invalidation/ticl/proto/JavaClient.java
deleted file mode 100644
index fd99c90..0000000
--- a/java/com/google/ipc/invalidation/ticl/proto/JavaClient.java
+++ /dev/null
@@ -1,1076 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-// Generated by j/c/g/ipc/invalidation/common/proto_wrapper_generator
-package com.google.ipc.invalidation.ticl.proto;
-
-import com.google.ipc.invalidation.util.Bytes;
-import com.google.ipc.invalidation.util.ProtoWrapper;
-import com.google.ipc.invalidation.util.ProtoWrapper.ValidationException;
-import com.google.ipc.invalidation.util.TextBuilder;
-import com.google.protobuf.nano.MessageNano;
-import com.google.protobuf.nano.InvalidProtocolBufferNanoException;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-
-public interface JavaClient {
-
- public static final class BatcherState extends ProtoWrapper {
- public static BatcherState create(Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> registration,
- Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> unregistration,
- Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP> acknowledgement,
- Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSubtree> registrationSubtree,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.InitializeMessage initializeMessage,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.InfoMessage infoMessage) {
- return new BatcherState(registration, unregistration, acknowledgement, registrationSubtree, initializeMessage, infoMessage);
- }
-
- public static final BatcherState DEFAULT_INSTANCE = new BatcherState(null, null, null, null, null, null);
-
- private final long __hazzerBits;
- private final List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> registration;
- private final List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> unregistration;
- private final List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP> acknowledgement;
- private final List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSubtree> registrationSubtree;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.InitializeMessage initializeMessage;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.InfoMessage infoMessage;
-
- private BatcherState(Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> registration,
- Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> unregistration,
- Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP> acknowledgement,
- Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSubtree> registrationSubtree,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.InitializeMessage initializeMessage,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.InfoMessage infoMessage) {
- int hazzerBits = 0;
- this.registration = optional("registration", registration);
- this.unregistration = optional("unregistration", unregistration);
- this.acknowledgement = optional("acknowledgement", acknowledgement);
- this.registrationSubtree = optional("registration_subtree", registrationSubtree);
- this.initializeMessage = initializeMessage;
- if (infoMessage != null) {
- hazzerBits |= 0x1;
- this.infoMessage = infoMessage;
- } else {
- this.infoMessage = com.google.ipc.invalidation.ticl.proto.ClientProtocol.InfoMessage.DEFAULT_INSTANCE;
- }
- this.__hazzerBits = hazzerBits;
- }
-
- public List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> getRegistration() { return registration; }
-
- public List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> getUnregistration() { return unregistration; }
-
- public List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP> getAcknowledgement() { return acknowledgement; }
-
- public List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSubtree> getRegistrationSubtree() { return registrationSubtree; }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.InitializeMessage getNullableInitializeMessage() { return initializeMessage; }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.InfoMessage getInfoMessage() { return infoMessage; }
- public boolean hasInfoMessage() { return (0x1 & __hazzerBits) != 0; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof BatcherState)) { return false; }
- BatcherState other = (BatcherState) obj;
- return __hazzerBits == other.__hazzerBits
- && equals(registration, other.registration)
- && equals(unregistration, other.unregistration)
- && equals(acknowledgement, other.acknowledgement)
- && equals(registrationSubtree, other.registrationSubtree)
- && equals(initializeMessage, other.initializeMessage)
- && (!hasInfoMessage() || equals(infoMessage, other.infoMessage));
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- result = result * 31 + registration.hashCode();
- result = result * 31 + unregistration.hashCode();
- result = result * 31 + acknowledgement.hashCode();
- result = result * 31 + registrationSubtree.hashCode();
- if (initializeMessage != null) {
- result = result * 31 + initializeMessage.hashCode();
- }
- if (hasInfoMessage()) {
- result = result * 31 + infoMessage.hashCode();
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<BatcherState:");
- builder.append(" registration=[").append(registration).append(']');
- builder.append(" unregistration=[").append(unregistration).append(']');
- builder.append(" acknowledgement=[").append(acknowledgement).append(']');
- builder.append(" registration_subtree=[").append(registrationSubtree).append(']');
- if (initializeMessage != null) {
- builder.append(" initialize_message=").append(initializeMessage);
- }
- if (hasInfoMessage()) {
- builder.append(" info_message=").append(infoMessage);
- }
- builder.append('>');
- }
-
- public static BatcherState parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoJavaClient.BatcherState(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static BatcherState fromMessageNano(com.google.protos.ipc.invalidation.NanoJavaClient.BatcherState message) {
- if (message == null) { return null; }
- List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> registration = new ArrayList<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP>(message.registration.length);
- for (int i = 0; i < message.registration.length; i++) {
- registration.add(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP.fromMessageNano(message.registration[i]));
- }
- List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> unregistration = new ArrayList<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP>(message.unregistration.length);
- for (int i = 0; i < message.unregistration.length; i++) {
- unregistration.add(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP.fromMessageNano(message.unregistration[i]));
- }
- List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP> acknowledgement = new ArrayList<com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP>(message.acknowledgement.length);
- for (int i = 0; i < message.acknowledgement.length; i++) {
- acknowledgement.add(com.google.ipc.invalidation.ticl.proto.ClientProtocol.InvalidationP.fromMessageNano(message.acknowledgement[i]));
- }
- List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSubtree> registrationSubtree = new ArrayList<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSubtree>(message.registrationSubtree.length);
- for (int i = 0; i < message.registrationSubtree.length; i++) {
- registrationSubtree.add(com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSubtree.fromMessageNano(message.registrationSubtree[i]));
- }
- return new BatcherState(registration,
- unregistration,
- acknowledgement,
- registrationSubtree,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.InitializeMessage.fromMessageNano(message.initializeMessage),
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.InfoMessage.fromMessageNano(message.infoMessage));
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoJavaClient.BatcherState toMessageNano() {
- com.google.protos.ipc.invalidation.NanoJavaClient.BatcherState msg = new com.google.protos.ipc.invalidation.NanoJavaClient.BatcherState();
- msg.registration = new com.google.protos.ipc.invalidation.NanoClientProtocol.ObjectIdP[registration.size()];
- for (int i = 0; i < msg.registration.length; i++) {
- msg.registration[i] = registration.get(i).toMessageNano();
- }
- msg.unregistration = new com.google.protos.ipc.invalidation.NanoClientProtocol.ObjectIdP[unregistration.size()];
- for (int i = 0; i < msg.unregistration.length; i++) {
- msg.unregistration[i] = unregistration.get(i).toMessageNano();
- }
- msg.acknowledgement = new com.google.protos.ipc.invalidation.NanoClientProtocol.InvalidationP[acknowledgement.size()];
- for (int i = 0; i < msg.acknowledgement.length; i++) {
- msg.acknowledgement[i] = acknowledgement.get(i).toMessageNano();
- }
- msg.registrationSubtree = new com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationSubtree[registrationSubtree.size()];
- for (int i = 0; i < msg.registrationSubtree.length; i++) {
- msg.registrationSubtree[i] = registrationSubtree.get(i).toMessageNano();
- }
- msg.initializeMessage = this.initializeMessage != null ? initializeMessage.toMessageNano() : null;
- msg.infoMessage = hasInfoMessage() ? infoMessage.toMessageNano() : null;
- return msg;
- }
- }
-
- public static final class ProtocolHandlerState extends ProtoWrapper {
- public static ProtocolHandlerState create(Integer messageId,
- Long lastKnownServerTimeMs,
- Long nextMessageSendTimeMs,
- com.google.ipc.invalidation.ticl.proto.JavaClient.BatcherState batcherState) {
- return new ProtocolHandlerState(messageId, lastKnownServerTimeMs, nextMessageSendTimeMs, batcherState);
- }
-
- public static final ProtocolHandlerState DEFAULT_INSTANCE = new ProtocolHandlerState(null, null, null, null);
-
- private final long __hazzerBits;
- private final int messageId;
- private final long lastKnownServerTimeMs;
- private final long nextMessageSendTimeMs;
- private final com.google.ipc.invalidation.ticl.proto.JavaClient.BatcherState batcherState;
-
- private ProtocolHandlerState(Integer messageId,
- Long lastKnownServerTimeMs,
- Long nextMessageSendTimeMs,
- com.google.ipc.invalidation.ticl.proto.JavaClient.BatcherState batcherState) {
- int hazzerBits = 0;
- if (messageId != null) {
- hazzerBits |= 0x1;
- this.messageId = messageId;
- } else {
- this.messageId = 0;
- }
- if (lastKnownServerTimeMs != null) {
- hazzerBits |= 0x2;
- this.lastKnownServerTimeMs = lastKnownServerTimeMs;
- } else {
- this.lastKnownServerTimeMs = 0;
- }
- if (nextMessageSendTimeMs != null) {
- hazzerBits |= 0x4;
- this.nextMessageSendTimeMs = nextMessageSendTimeMs;
- } else {
- this.nextMessageSendTimeMs = 0;
- }
- if (batcherState != null) {
- hazzerBits |= 0x8;
- this.batcherState = batcherState;
- } else {
- this.batcherState = com.google.ipc.invalidation.ticl.proto.JavaClient.BatcherState.DEFAULT_INSTANCE;
- }
- this.__hazzerBits = hazzerBits;
- }
-
- public int getMessageId() { return messageId; }
- public boolean hasMessageId() { return (0x1 & __hazzerBits) != 0; }
-
- public long getLastKnownServerTimeMs() { return lastKnownServerTimeMs; }
- public boolean hasLastKnownServerTimeMs() { return (0x2 & __hazzerBits) != 0; }
-
- public long getNextMessageSendTimeMs() { return nextMessageSendTimeMs; }
- public boolean hasNextMessageSendTimeMs() { return (0x4 & __hazzerBits) != 0; }
-
- public com.google.ipc.invalidation.ticl.proto.JavaClient.BatcherState getBatcherState() { return batcherState; }
- public boolean hasBatcherState() { return (0x8 & __hazzerBits) != 0; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof ProtocolHandlerState)) { return false; }
- ProtocolHandlerState other = (ProtocolHandlerState) obj;
- return __hazzerBits == other.__hazzerBits
- && (!hasMessageId() || messageId == other.messageId)
- && (!hasLastKnownServerTimeMs() || lastKnownServerTimeMs == other.lastKnownServerTimeMs)
- && (!hasNextMessageSendTimeMs() || nextMessageSendTimeMs == other.nextMessageSendTimeMs)
- && (!hasBatcherState() || equals(batcherState, other.batcherState));
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- if (hasMessageId()) {
- result = result * 31 + hash(messageId);
- }
- if (hasLastKnownServerTimeMs()) {
- result = result * 31 + hash(lastKnownServerTimeMs);
- }
- if (hasNextMessageSendTimeMs()) {
- result = result * 31 + hash(nextMessageSendTimeMs);
- }
- if (hasBatcherState()) {
- result = result * 31 + batcherState.hashCode();
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<ProtocolHandlerState:");
- if (hasMessageId()) {
- builder.append(" message_id=").append(messageId);
- }
- if (hasLastKnownServerTimeMs()) {
- builder.append(" last_known_server_time_ms=").append(lastKnownServerTimeMs);
- }
- if (hasNextMessageSendTimeMs()) {
- builder.append(" next_message_send_time_ms=").append(nextMessageSendTimeMs);
- }
- if (hasBatcherState()) {
- builder.append(" batcher_state=").append(batcherState);
- }
- builder.append('>');
- }
-
- public static ProtocolHandlerState parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoJavaClient.ProtocolHandlerState(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static ProtocolHandlerState fromMessageNano(com.google.protos.ipc.invalidation.NanoJavaClient.ProtocolHandlerState message) {
- if (message == null) { return null; }
- return new ProtocolHandlerState(message.messageId,
- message.lastKnownServerTimeMs,
- message.nextMessageSendTimeMs,
- com.google.ipc.invalidation.ticl.proto.JavaClient.BatcherState.fromMessageNano(message.batcherState));
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoJavaClient.ProtocolHandlerState toMessageNano() {
- com.google.protos.ipc.invalidation.NanoJavaClient.ProtocolHandlerState msg = new com.google.protos.ipc.invalidation.NanoJavaClient.ProtocolHandlerState();
- msg.messageId = hasMessageId() ? messageId : null;
- msg.lastKnownServerTimeMs = hasLastKnownServerTimeMs() ? lastKnownServerTimeMs : null;
- msg.nextMessageSendTimeMs = hasNextMessageSendTimeMs() ? nextMessageSendTimeMs : null;
- msg.batcherState = hasBatcherState() ? batcherState.toMessageNano() : null;
- return msg;
- }
- }
-
- public static final class RegistrationManagerStateP extends ProtoWrapper {
- public static RegistrationManagerStateP create(Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> registrations,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSummary lastKnownServerSummary,
- Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationP> pendingOperations) {
- return new RegistrationManagerStateP(registrations, lastKnownServerSummary, pendingOperations);
- }
-
- public static final RegistrationManagerStateP DEFAULT_INSTANCE = new RegistrationManagerStateP(null, null, null);
-
- private final List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> registrations;
- private final com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSummary lastKnownServerSummary;
- private final List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationP> pendingOperations;
-
- private RegistrationManagerStateP(Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> registrations,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSummary lastKnownServerSummary,
- Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationP> pendingOperations) {
- this.registrations = optional("registrations", registrations);
- this.lastKnownServerSummary = lastKnownServerSummary;
- this.pendingOperations = optional("pending_operations", pendingOperations);
- }
-
- public List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> getRegistrations() { return registrations; }
-
- public com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSummary getNullableLastKnownServerSummary() { return lastKnownServerSummary; }
-
- public List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationP> getPendingOperations() { return pendingOperations; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof RegistrationManagerStateP)) { return false; }
- RegistrationManagerStateP other = (RegistrationManagerStateP) obj;
- return equals(registrations, other.registrations)
- && equals(lastKnownServerSummary, other.lastKnownServerSummary)
- && equals(pendingOperations, other.pendingOperations);
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + registrations.hashCode();
- if (lastKnownServerSummary != null) {
- result = result * 31 + lastKnownServerSummary.hashCode();
- }
- result = result * 31 + pendingOperations.hashCode();
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<RegistrationManagerStateP:");
- builder.append(" registrations=[").append(registrations).append(']');
- if (lastKnownServerSummary != null) {
- builder.append(" last_known_server_summary=").append(lastKnownServerSummary);
- }
- builder.append(" pending_operations=[").append(pendingOperations).append(']');
- builder.append('>');
- }
-
- public static RegistrationManagerStateP parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoJavaClient.RegistrationManagerStateP(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static RegistrationManagerStateP fromMessageNano(com.google.protos.ipc.invalidation.NanoJavaClient.RegistrationManagerStateP message) {
- if (message == null) { return null; }
- List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP> registrations = new ArrayList<com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP>(message.registrations.length);
- for (int i = 0; i < message.registrations.length; i++) {
- registrations.add(com.google.ipc.invalidation.ticl.proto.ClientProtocol.ObjectIdP.fromMessageNano(message.registrations[i]));
- }
- List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationP> pendingOperations = new ArrayList<com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationP>(message.pendingOperations.length);
- for (int i = 0; i < message.pendingOperations.length; i++) {
- pendingOperations.add(com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationP.fromMessageNano(message.pendingOperations[i]));
- }
- return new RegistrationManagerStateP(registrations,
- com.google.ipc.invalidation.ticl.proto.ClientProtocol.RegistrationSummary.fromMessageNano(message.lastKnownServerSummary),
- pendingOperations);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoJavaClient.RegistrationManagerStateP toMessageNano() {
- com.google.protos.ipc.invalidation.NanoJavaClient.RegistrationManagerStateP msg = new com.google.protos.ipc.invalidation.NanoJavaClient.RegistrationManagerStateP();
- msg.registrations = new com.google.protos.ipc.invalidation.NanoClientProtocol.ObjectIdP[registrations.size()];
- for (int i = 0; i < msg.registrations.length; i++) {
- msg.registrations[i] = registrations.get(i).toMessageNano();
- }
- msg.lastKnownServerSummary = this.lastKnownServerSummary != null ? lastKnownServerSummary.toMessageNano() : null;
- msg.pendingOperations = new com.google.protos.ipc.invalidation.NanoClientProtocol.RegistrationP[pendingOperations.size()];
- for (int i = 0; i < msg.pendingOperations.length; i++) {
- msg.pendingOperations[i] = pendingOperations.get(i).toMessageNano();
- }
- return msg;
- }
- }
-
- public static final class RecurringTaskState extends ProtoWrapper {
- public static RecurringTaskState create(Integer initialDelayMs,
- Integer timeoutDelayMs,
- Boolean scheduled,
- com.google.ipc.invalidation.ticl.proto.Client.ExponentialBackoffState backoffState) {
- return new RecurringTaskState(initialDelayMs, timeoutDelayMs, scheduled, backoffState);
- }
-
- public static final RecurringTaskState DEFAULT_INSTANCE = new RecurringTaskState(null, null, null, null);
-
- private final long __hazzerBits;
- private final int initialDelayMs;
- private final int timeoutDelayMs;
- private final boolean scheduled;
- private final com.google.ipc.invalidation.ticl.proto.Client.ExponentialBackoffState backoffState;
-
- private RecurringTaskState(Integer initialDelayMs,
- Integer timeoutDelayMs,
- Boolean scheduled,
- com.google.ipc.invalidation.ticl.proto.Client.ExponentialBackoffState backoffState) {
- int hazzerBits = 0;
- if (initialDelayMs != null) {
- hazzerBits |= 0x1;
- this.initialDelayMs = initialDelayMs;
- } else {
- this.initialDelayMs = 0;
- }
- if (timeoutDelayMs != null) {
- hazzerBits |= 0x2;
- this.timeoutDelayMs = timeoutDelayMs;
- } else {
- this.timeoutDelayMs = 0;
- }
- if (scheduled != null) {
- hazzerBits |= 0x4;
- this.scheduled = scheduled;
- } else {
- this.scheduled = false;
- }
- if (backoffState != null) {
- hazzerBits |= 0x8;
- this.backoffState = backoffState;
- } else {
- this.backoffState = com.google.ipc.invalidation.ticl.proto.Client.ExponentialBackoffState.DEFAULT_INSTANCE;
- }
- this.__hazzerBits = hazzerBits;
- }
-
- public int getInitialDelayMs() { return initialDelayMs; }
- public boolean hasInitialDelayMs() { return (0x1 & __hazzerBits) != 0; }
-
- public int getTimeoutDelayMs() { return timeoutDelayMs; }
- public boolean hasTimeoutDelayMs() { return (0x2 & __hazzerBits) != 0; }
-
- public boolean getScheduled() { return scheduled; }
- public boolean hasScheduled() { return (0x4 & __hazzerBits) != 0; }
-
- public com.google.ipc.invalidation.ticl.proto.Client.ExponentialBackoffState getBackoffState() { return backoffState; }
- public boolean hasBackoffState() { return (0x8 & __hazzerBits) != 0; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof RecurringTaskState)) { return false; }
- RecurringTaskState other = (RecurringTaskState) obj;
- return __hazzerBits == other.__hazzerBits
- && (!hasInitialDelayMs() || initialDelayMs == other.initialDelayMs)
- && (!hasTimeoutDelayMs() || timeoutDelayMs == other.timeoutDelayMs)
- && (!hasScheduled() || scheduled == other.scheduled)
- && (!hasBackoffState() || equals(backoffState, other.backoffState));
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- if (hasInitialDelayMs()) {
- result = result * 31 + hash(initialDelayMs);
- }
- if (hasTimeoutDelayMs()) {
- result = result * 31 + hash(timeoutDelayMs);
- }
- if (hasScheduled()) {
- result = result * 31 + hash(scheduled);
- }
- if (hasBackoffState()) {
- result = result * 31 + backoffState.hashCode();
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<RecurringTaskState:");
- if (hasInitialDelayMs()) {
- builder.append(" initial_delay_ms=").append(initialDelayMs);
- }
- if (hasTimeoutDelayMs()) {
- builder.append(" timeout_delay_ms=").append(timeoutDelayMs);
- }
- if (hasScheduled()) {
- builder.append(" scheduled=").append(scheduled);
- }
- if (hasBackoffState()) {
- builder.append(" backoff_state=").append(backoffState);
- }
- builder.append('>');
- }
-
- public static RecurringTaskState parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoJavaClient.RecurringTaskState(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static RecurringTaskState fromMessageNano(com.google.protos.ipc.invalidation.NanoJavaClient.RecurringTaskState message) {
- if (message == null) { return null; }
- return new RecurringTaskState(message.initialDelayMs,
- message.timeoutDelayMs,
- message.scheduled,
- com.google.ipc.invalidation.ticl.proto.Client.ExponentialBackoffState.fromMessageNano(message.backoffState));
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoJavaClient.RecurringTaskState toMessageNano() {
- com.google.protos.ipc.invalidation.NanoJavaClient.RecurringTaskState msg = new com.google.protos.ipc.invalidation.NanoJavaClient.RecurringTaskState();
- msg.initialDelayMs = hasInitialDelayMs() ? initialDelayMs : null;
- msg.timeoutDelayMs = hasTimeoutDelayMs() ? timeoutDelayMs : null;
- msg.scheduled = hasScheduled() ? scheduled : null;
- msg.backoffState = hasBackoffState() ? backoffState.toMessageNano() : null;
- return msg;
- }
- }
-
- public static final class StatisticsState extends ProtoWrapper {
- public static StatisticsState create(Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.PropertyRecord> counter) {
- return new StatisticsState(counter);
- }
-
- public static final StatisticsState DEFAULT_INSTANCE = new StatisticsState(null);
-
- private final List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.PropertyRecord> counter;
-
- private StatisticsState(Collection<com.google.ipc.invalidation.ticl.proto.ClientProtocol.PropertyRecord> counter) {
- this.counter = optional("counter", counter);
- }
-
- public List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.PropertyRecord> getCounter() { return counter; }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof StatisticsState)) { return false; }
- StatisticsState other = (StatisticsState) obj;
- return equals(counter, other.counter);
- }
-
- @Override protected int computeHashCode() {
- int result = 1;
- result = result * 31 + counter.hashCode();
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<StatisticsState:");
- builder.append(" counter=[").append(counter).append(']');
- builder.append('>');
- }
-
- public static StatisticsState parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoJavaClient.StatisticsState(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static StatisticsState fromMessageNano(com.google.protos.ipc.invalidation.NanoJavaClient.StatisticsState message) {
- if (message == null) { return null; }
- List<com.google.ipc.invalidation.ticl.proto.ClientProtocol.PropertyRecord> counter = new ArrayList<com.google.ipc.invalidation.ticl.proto.ClientProtocol.PropertyRecord>(message.counter.length);
- for (int i = 0; i < message.counter.length; i++) {
- counter.add(com.google.ipc.invalidation.ticl.proto.ClientProtocol.PropertyRecord.fromMessageNano(message.counter[i]));
- }
- return new StatisticsState(counter);
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoJavaClient.StatisticsState toMessageNano() {
- com.google.protos.ipc.invalidation.NanoJavaClient.StatisticsState msg = new com.google.protos.ipc.invalidation.NanoJavaClient.StatisticsState();
- msg.counter = new com.google.protos.ipc.invalidation.NanoClientProtocol.PropertyRecord[counter.size()];
- for (int i = 0; i < msg.counter.length; i++) {
- msg.counter[i] = counter.get(i).toMessageNano();
- }
- return msg;
- }
- }
-
- public static final class InvalidationClientState extends ProtoWrapper {
- public static final class Builder {
- public com.google.ipc.invalidation.ticl.proto.Client.RunStateP runState;
- public Bytes clientToken;
- public Bytes nonce;
- public Boolean shouldSendRegistrations;
- public Long lastMessageSendTimeMs;
- public Boolean isOnline;
- public com.google.ipc.invalidation.ticl.proto.JavaClient.ProtocolHandlerState protocolHandlerState;
- public com.google.ipc.invalidation.ticl.proto.JavaClient.RegistrationManagerStateP registrationManagerState;
- public com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState acquireTokenTaskState;
- public com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState regSyncHeartbeatTaskState;
- public com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState persistentWriteTaskState;
- public com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState heartbeatTaskState;
- public com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState batchingTaskState;
- public com.google.ipc.invalidation.ticl.proto.Client.PersistentTiclState lastWrittenState;
- public com.google.ipc.invalidation.ticl.proto.JavaClient.StatisticsState statisticsState;
- public Builder() {
- }
-
- public InvalidationClientState build() {
- return new InvalidationClientState(runState, clientToken, nonce, shouldSendRegistrations, lastMessageSendTimeMs, isOnline, protocolHandlerState, registrationManagerState, acquireTokenTaskState, regSyncHeartbeatTaskState, persistentWriteTaskState, heartbeatTaskState, batchingTaskState, lastWrittenState, statisticsState);
- }
- }
-
- public static InvalidationClientState create(com.google.ipc.invalidation.ticl.proto.Client.RunStateP runState,
- Bytes clientToken,
- Bytes nonce,
- Boolean shouldSendRegistrations,
- Long lastMessageSendTimeMs,
- Boolean isOnline,
- com.google.ipc.invalidation.ticl.proto.JavaClient.ProtocolHandlerState protocolHandlerState,
- com.google.ipc.invalidation.ticl.proto.JavaClient.RegistrationManagerStateP registrationManagerState,
- com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState acquireTokenTaskState,
- com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState regSyncHeartbeatTaskState,
- com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState persistentWriteTaskState,
- com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState heartbeatTaskState,
- com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState batchingTaskState,
- com.google.ipc.invalidation.ticl.proto.Client.PersistentTiclState lastWrittenState,
- com.google.ipc.invalidation.ticl.proto.JavaClient.StatisticsState statisticsState) {
- return new InvalidationClientState(runState, clientToken, nonce, shouldSendRegistrations, lastMessageSendTimeMs, isOnline, protocolHandlerState, registrationManagerState, acquireTokenTaskState, regSyncHeartbeatTaskState, persistentWriteTaskState, heartbeatTaskState, batchingTaskState, lastWrittenState, statisticsState);
- }
-
- public static final InvalidationClientState DEFAULT_INSTANCE = new InvalidationClientState(null, null, null, null, null, null, null, null, null, null, null, null, null, null, null);
-
- private final long __hazzerBits;
- private final com.google.ipc.invalidation.ticl.proto.Client.RunStateP runState;
- private final Bytes clientToken;
- private final Bytes nonce;
- private final boolean shouldSendRegistrations;
- private final long lastMessageSendTimeMs;
- private final boolean isOnline;
- private final com.google.ipc.invalidation.ticl.proto.JavaClient.ProtocolHandlerState protocolHandlerState;
- private final com.google.ipc.invalidation.ticl.proto.JavaClient.RegistrationManagerStateP registrationManagerState;
- private final com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState acquireTokenTaskState;
- private final com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState regSyncHeartbeatTaskState;
- private final com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState persistentWriteTaskState;
- private final com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState heartbeatTaskState;
- private final com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState batchingTaskState;
- private final com.google.ipc.invalidation.ticl.proto.Client.PersistentTiclState lastWrittenState;
- private final com.google.ipc.invalidation.ticl.proto.JavaClient.StatisticsState statisticsState;
-
- private InvalidationClientState(com.google.ipc.invalidation.ticl.proto.Client.RunStateP runState,
- Bytes clientToken,
- Bytes nonce,
- Boolean shouldSendRegistrations,
- Long lastMessageSendTimeMs,
- Boolean isOnline,
- com.google.ipc.invalidation.ticl.proto.JavaClient.ProtocolHandlerState protocolHandlerState,
- com.google.ipc.invalidation.ticl.proto.JavaClient.RegistrationManagerStateP registrationManagerState,
- com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState acquireTokenTaskState,
- com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState regSyncHeartbeatTaskState,
- com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState persistentWriteTaskState,
- com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState heartbeatTaskState,
- com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState batchingTaskState,
- com.google.ipc.invalidation.ticl.proto.Client.PersistentTiclState lastWrittenState,
- com.google.ipc.invalidation.ticl.proto.JavaClient.StatisticsState statisticsState) {
- int hazzerBits = 0;
- if (runState != null) {
- hazzerBits |= 0x1;
- this.runState = runState;
- } else {
- this.runState = com.google.ipc.invalidation.ticl.proto.Client.RunStateP.DEFAULT_INSTANCE;
- }
- if (clientToken != null) {
- hazzerBits |= 0x2;
- this.clientToken = clientToken;
- } else {
- this.clientToken = Bytes.EMPTY_BYTES;
- }
- if (nonce != null) {
- hazzerBits |= 0x4;
- this.nonce = nonce;
- } else {
- this.nonce = Bytes.EMPTY_BYTES;
- }
- if (shouldSendRegistrations != null) {
- hazzerBits |= 0x8;
- this.shouldSendRegistrations = shouldSendRegistrations;
- } else {
- this.shouldSendRegistrations = false;
- }
- if (lastMessageSendTimeMs != null) {
- hazzerBits |= 0x10;
- this.lastMessageSendTimeMs = lastMessageSendTimeMs;
- } else {
- this.lastMessageSendTimeMs = 0;
- }
- if (isOnline != null) {
- hazzerBits |= 0x20;
- this.isOnline = isOnline;
- } else {
- this.isOnline = false;
- }
- if (protocolHandlerState != null) {
- hazzerBits |= 0x40;
- this.protocolHandlerState = protocolHandlerState;
- } else {
- this.protocolHandlerState = com.google.ipc.invalidation.ticl.proto.JavaClient.ProtocolHandlerState.DEFAULT_INSTANCE;
- }
- if (registrationManagerState != null) {
- hazzerBits |= 0x80;
- this.registrationManagerState = registrationManagerState;
- } else {
- this.registrationManagerState = com.google.ipc.invalidation.ticl.proto.JavaClient.RegistrationManagerStateP.DEFAULT_INSTANCE;
- }
- if (acquireTokenTaskState != null) {
- hazzerBits |= 0x100;
- this.acquireTokenTaskState = acquireTokenTaskState;
- } else {
- this.acquireTokenTaskState = com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState.DEFAULT_INSTANCE;
- }
- if (regSyncHeartbeatTaskState != null) {
- hazzerBits |= 0x200;
- this.regSyncHeartbeatTaskState = regSyncHeartbeatTaskState;
- } else {
- this.regSyncHeartbeatTaskState = com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState.DEFAULT_INSTANCE;
- }
- if (persistentWriteTaskState != null) {
- hazzerBits |= 0x400;
- this.persistentWriteTaskState = persistentWriteTaskState;
- } else {
- this.persistentWriteTaskState = com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState.DEFAULT_INSTANCE;
- }
- if (heartbeatTaskState != null) {
- hazzerBits |= 0x800;
- this.heartbeatTaskState = heartbeatTaskState;
- } else {
- this.heartbeatTaskState = com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState.DEFAULT_INSTANCE;
- }
- if (batchingTaskState != null) {
- hazzerBits |= 0x1000;
- this.batchingTaskState = batchingTaskState;
- } else {
- this.batchingTaskState = com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState.DEFAULT_INSTANCE;
- }
- if (lastWrittenState != null) {
- hazzerBits |= 0x2000;
- this.lastWrittenState = lastWrittenState;
- } else {
- this.lastWrittenState = com.google.ipc.invalidation.ticl.proto.Client.PersistentTiclState.DEFAULT_INSTANCE;
- }
- if (statisticsState != null) {
- hazzerBits |= 0x4000;
- this.statisticsState = statisticsState;
- } else {
- this.statisticsState = com.google.ipc.invalidation.ticl.proto.JavaClient.StatisticsState.DEFAULT_INSTANCE;
- }
- this.__hazzerBits = hazzerBits;
- }
-
- public com.google.ipc.invalidation.ticl.proto.Client.RunStateP getRunState() { return runState; }
- public boolean hasRunState() { return (0x1 & __hazzerBits) != 0; }
-
- public Bytes getClientToken() { return clientToken; }
- public boolean hasClientToken() { return (0x2 & __hazzerBits) != 0; }
-
- public Bytes getNonce() { return nonce; }
- public boolean hasNonce() { return (0x4 & __hazzerBits) != 0; }
-
- public boolean getShouldSendRegistrations() { return shouldSendRegistrations; }
- public boolean hasShouldSendRegistrations() { return (0x8 & __hazzerBits) != 0; }
-
- public long getLastMessageSendTimeMs() { return lastMessageSendTimeMs; }
- public boolean hasLastMessageSendTimeMs() { return (0x10 & __hazzerBits) != 0; }
-
- public boolean getIsOnline() { return isOnline; }
- public boolean hasIsOnline() { return (0x20 & __hazzerBits) != 0; }
-
- public com.google.ipc.invalidation.ticl.proto.JavaClient.ProtocolHandlerState getProtocolHandlerState() { return protocolHandlerState; }
- public boolean hasProtocolHandlerState() { return (0x40 & __hazzerBits) != 0; }
-
- public com.google.ipc.invalidation.ticl.proto.JavaClient.RegistrationManagerStateP getRegistrationManagerState() { return registrationManagerState; }
- public boolean hasRegistrationManagerState() { return (0x80 & __hazzerBits) != 0; }
-
- public com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState getAcquireTokenTaskState() { return acquireTokenTaskState; }
- public boolean hasAcquireTokenTaskState() { return (0x100 & __hazzerBits) != 0; }
-
- public com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState getRegSyncHeartbeatTaskState() { return regSyncHeartbeatTaskState; }
- public boolean hasRegSyncHeartbeatTaskState() { return (0x200 & __hazzerBits) != 0; }
-
- public com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState getPersistentWriteTaskState() { return persistentWriteTaskState; }
- public boolean hasPersistentWriteTaskState() { return (0x400 & __hazzerBits) != 0; }
-
- public com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState getHeartbeatTaskState() { return heartbeatTaskState; }
- public boolean hasHeartbeatTaskState() { return (0x800 & __hazzerBits) != 0; }
-
- public com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState getBatchingTaskState() { return batchingTaskState; }
- public boolean hasBatchingTaskState() { return (0x1000 & __hazzerBits) != 0; }
-
- public com.google.ipc.invalidation.ticl.proto.Client.PersistentTiclState getLastWrittenState() { return lastWrittenState; }
- public boolean hasLastWrittenState() { return (0x2000 & __hazzerBits) != 0; }
-
- public com.google.ipc.invalidation.ticl.proto.JavaClient.StatisticsState getStatisticsState() { return statisticsState; }
- public boolean hasStatisticsState() { return (0x4000 & __hazzerBits) != 0; }
-
- public Builder toBuilder() {
- Builder builder = new Builder();
- if (hasRunState()) {
- builder.runState = runState;
- }
- if (hasClientToken()) {
- builder.clientToken = clientToken;
- }
- if (hasNonce()) {
- builder.nonce = nonce;
- }
- if (hasShouldSendRegistrations()) {
- builder.shouldSendRegistrations = shouldSendRegistrations;
- }
- if (hasLastMessageSendTimeMs()) {
- builder.lastMessageSendTimeMs = lastMessageSendTimeMs;
- }
- if (hasIsOnline()) {
- builder.isOnline = isOnline;
- }
- if (hasProtocolHandlerState()) {
- builder.protocolHandlerState = protocolHandlerState;
- }
- if (hasRegistrationManagerState()) {
- builder.registrationManagerState = registrationManagerState;
- }
- if (hasAcquireTokenTaskState()) {
- builder.acquireTokenTaskState = acquireTokenTaskState;
- }
- if (hasRegSyncHeartbeatTaskState()) {
- builder.regSyncHeartbeatTaskState = regSyncHeartbeatTaskState;
- }
- if (hasPersistentWriteTaskState()) {
- builder.persistentWriteTaskState = persistentWriteTaskState;
- }
- if (hasHeartbeatTaskState()) {
- builder.heartbeatTaskState = heartbeatTaskState;
- }
- if (hasBatchingTaskState()) {
- builder.batchingTaskState = batchingTaskState;
- }
- if (hasLastWrittenState()) {
- builder.lastWrittenState = lastWrittenState;
- }
- if (hasStatisticsState()) {
- builder.statisticsState = statisticsState;
- }
- return builder;
- }
-
- @Override public final boolean equals(Object obj) {
- if (this == obj) { return true; }
- if (!(obj instanceof InvalidationClientState)) { return false; }
- InvalidationClientState other = (InvalidationClientState) obj;
- return __hazzerBits == other.__hazzerBits
- && (!hasRunState() || equals(runState, other.runState))
- && (!hasClientToken() || equals(clientToken, other.clientToken))
- && (!hasNonce() || equals(nonce, other.nonce))
- && (!hasShouldSendRegistrations() || shouldSendRegistrations == other.shouldSendRegistrations)
- && (!hasLastMessageSendTimeMs() || lastMessageSendTimeMs == other.lastMessageSendTimeMs)
- && (!hasIsOnline() || isOnline == other.isOnline)
- && (!hasProtocolHandlerState() || equals(protocolHandlerState, other.protocolHandlerState))
- && (!hasRegistrationManagerState() || equals(registrationManagerState, other.registrationManagerState))
- && (!hasAcquireTokenTaskState() || equals(acquireTokenTaskState, other.acquireTokenTaskState))
- && (!hasRegSyncHeartbeatTaskState() || equals(regSyncHeartbeatTaskState, other.regSyncHeartbeatTaskState))
- && (!hasPersistentWriteTaskState() || equals(persistentWriteTaskState, other.persistentWriteTaskState))
- && (!hasHeartbeatTaskState() || equals(heartbeatTaskState, other.heartbeatTaskState))
- && (!hasBatchingTaskState() || equals(batchingTaskState, other.batchingTaskState))
- && (!hasLastWrittenState() || equals(lastWrittenState, other.lastWrittenState))
- && (!hasStatisticsState() || equals(statisticsState, other.statisticsState));
- }
-
- @Override protected int computeHashCode() {
- int result = hash(__hazzerBits);
- if (hasRunState()) {
- result = result * 31 + runState.hashCode();
- }
- if (hasClientToken()) {
- result = result * 31 + clientToken.hashCode();
- }
- if (hasNonce()) {
- result = result * 31 + nonce.hashCode();
- }
- if (hasShouldSendRegistrations()) {
- result = result * 31 + hash(shouldSendRegistrations);
- }
- if (hasLastMessageSendTimeMs()) {
- result = result * 31 + hash(lastMessageSendTimeMs);
- }
- if (hasIsOnline()) {
- result = result * 31 + hash(isOnline);
- }
- if (hasProtocolHandlerState()) {
- result = result * 31 + protocolHandlerState.hashCode();
- }
- if (hasRegistrationManagerState()) {
- result = result * 31 + registrationManagerState.hashCode();
- }
- if (hasAcquireTokenTaskState()) {
- result = result * 31 + acquireTokenTaskState.hashCode();
- }
- if (hasRegSyncHeartbeatTaskState()) {
- result = result * 31 + regSyncHeartbeatTaskState.hashCode();
- }
- if (hasPersistentWriteTaskState()) {
- result = result * 31 + persistentWriteTaskState.hashCode();
- }
- if (hasHeartbeatTaskState()) {
- result = result * 31 + heartbeatTaskState.hashCode();
- }
- if (hasBatchingTaskState()) {
- result = result * 31 + batchingTaskState.hashCode();
- }
- if (hasLastWrittenState()) {
- result = result * 31 + lastWrittenState.hashCode();
- }
- if (hasStatisticsState()) {
- result = result * 31 + statisticsState.hashCode();
- }
- return result;
- }
-
- @Override public void toCompactString(TextBuilder builder) {
- builder.append("<InvalidationClientState:");
- if (hasRunState()) {
- builder.append(" run_state=").append(runState);
- }
- if (hasClientToken()) {
- builder.append(" client_token=").append(clientToken);
- }
- if (hasNonce()) {
- builder.append(" nonce=").append(nonce);
- }
- if (hasShouldSendRegistrations()) {
- builder.append(" should_send_registrations=").append(shouldSendRegistrations);
- }
- if (hasLastMessageSendTimeMs()) {
- builder.append(" last_message_send_time_ms=").append(lastMessageSendTimeMs);
- }
- if (hasIsOnline()) {
- builder.append(" is_online=").append(isOnline);
- }
- if (hasProtocolHandlerState()) {
- builder.append(" protocol_handler_state=").append(protocolHandlerState);
- }
- if (hasRegistrationManagerState()) {
- builder.append(" registration_manager_state=").append(registrationManagerState);
- }
- if (hasAcquireTokenTaskState()) {
- builder.append(" acquire_token_task_state=").append(acquireTokenTaskState);
- }
- if (hasRegSyncHeartbeatTaskState()) {
- builder.append(" reg_sync_heartbeat_task_state=").append(regSyncHeartbeatTaskState);
- }
- if (hasPersistentWriteTaskState()) {
- builder.append(" persistent_write_task_state=").append(persistentWriteTaskState);
- }
- if (hasHeartbeatTaskState()) {
- builder.append(" heartbeat_task_state=").append(heartbeatTaskState);
- }
- if (hasBatchingTaskState()) {
- builder.append(" batching_task_state=").append(batchingTaskState);
- }
- if (hasLastWrittenState()) {
- builder.append(" last_written_state=").append(lastWrittenState);
- }
- if (hasStatisticsState()) {
- builder.append(" statistics_state=").append(statisticsState);
- }
- builder.append('>');
- }
-
- public static InvalidationClientState parseFrom(byte[] data) throws ValidationException {
- try {
- return fromMessageNano(MessageNano.mergeFrom(new com.google.protos.ipc.invalidation.NanoJavaClient.InvalidationClientState(), data));
- } catch (InvalidProtocolBufferNanoException exception) {
- throw new ValidationException(exception);
- } catch (ValidationArgumentException exception) {
- throw new ValidationException(exception.getMessage());
- }
- }
-
- static InvalidationClientState fromMessageNano(com.google.protos.ipc.invalidation.NanoJavaClient.InvalidationClientState message) {
- if (message == null) { return null; }
- return new InvalidationClientState(com.google.ipc.invalidation.ticl.proto.Client.RunStateP.fromMessageNano(message.runState),
- Bytes.fromByteArray(message.clientToken),
- Bytes.fromByteArray(message.nonce),
- message.shouldSendRegistrations,
- message.lastMessageSendTimeMs,
- message.isOnline,
- com.google.ipc.invalidation.ticl.proto.JavaClient.ProtocolHandlerState.fromMessageNano(message.protocolHandlerState),
- com.google.ipc.invalidation.ticl.proto.JavaClient.RegistrationManagerStateP.fromMessageNano(message.registrationManagerState),
- com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState.fromMessageNano(message.acquireTokenTaskState),
- com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState.fromMessageNano(message.regSyncHeartbeatTaskState),
- com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState.fromMessageNano(message.persistentWriteTaskState),
- com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState.fromMessageNano(message.heartbeatTaskState),
- com.google.ipc.invalidation.ticl.proto.JavaClient.RecurringTaskState.fromMessageNano(message.batchingTaskState),
- com.google.ipc.invalidation.ticl.proto.Client.PersistentTiclState.fromMessageNano(message.lastWrittenState),
- com.google.ipc.invalidation.ticl.proto.JavaClient.StatisticsState.fromMessageNano(message.statisticsState));
- }
-
- public byte[] toByteArray() {
- return MessageNano.toByteArray(toMessageNano());
- }
-
- com.google.protos.ipc.invalidation.NanoJavaClient.InvalidationClientState toMessageNano() {
- com.google.protos.ipc.invalidation.NanoJavaClient.InvalidationClientState msg = new com.google.protos.ipc.invalidation.NanoJavaClient.InvalidationClientState();
- msg.runState = hasRunState() ? runState.toMessageNano() : null;
- msg.clientToken = hasClientToken() ? clientToken.getByteArray() : null;
- msg.nonce = hasNonce() ? nonce.getByteArray() : null;
- msg.shouldSendRegistrations = hasShouldSendRegistrations() ? shouldSendRegistrations : null;
- msg.lastMessageSendTimeMs = hasLastMessageSendTimeMs() ? lastMessageSendTimeMs : null;
- msg.isOnline = hasIsOnline() ? isOnline : null;
- msg.protocolHandlerState = hasProtocolHandlerState() ? protocolHandlerState.toMessageNano() : null;
- msg.registrationManagerState = hasRegistrationManagerState() ? registrationManagerState.toMessageNano() : null;
- msg.acquireTokenTaskState = hasAcquireTokenTaskState() ? acquireTokenTaskState.toMessageNano() : null;
- msg.regSyncHeartbeatTaskState = hasRegSyncHeartbeatTaskState() ? regSyncHeartbeatTaskState.toMessageNano() : null;
- msg.persistentWriteTaskState = hasPersistentWriteTaskState() ? persistentWriteTaskState.toMessageNano() : null;
- msg.heartbeatTaskState = hasHeartbeatTaskState() ? heartbeatTaskState.toMessageNano() : null;
- msg.batchingTaskState = hasBatchingTaskState() ? batchingTaskState.toMessageNano() : null;
- msg.lastWrittenState = hasLastWrittenState() ? lastWrittenState.toMessageNano() : null;
- msg.statisticsState = hasStatisticsState() ? statisticsState.toMessageNano() : null;
- return msg;
- }
- }
-}
diff --git a/java/com/google/ipc/invalidation/util/BaseLogger.java b/java/com/google/ipc/invalidation/util/BaseLogger.java
deleted file mode 100644
index 8d5fa50..0000000
--- a/java/com/google/ipc/invalidation/util/BaseLogger.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.util;
-
-import java.util.logging.Level;
-
-/**
- * A basic formatting logger interface.
- *
- */
-public interface BaseLogger {
- /**
- * Logs a message.
- *
- * @param level the level at which the message should be logged (e.g., {@code INFO})
- * @param template the string to log, optionally containing %s sequences
- * @param args variables to substitute for %s sequences in {@code template}
- */
- void log(Level level, String template, Object... args);
-
- /**
- * Returns true iff statements at {@code level} are not being suppressed.
- */
- boolean isLoggable(Level level);
-
- /**
- * Logs a message at the SEVERE level.
- * See specs of {@code #log} for the parameters.
- */
- void severe(String template, Object...args);
-
- /**
- * Logs a message at the WARNING level.
- * See specs of {@code #log} for the parameters.
- */
- void warning(String template, Object...args);
-
- /**
- * Logs a message at the INFO level.
- * See specs of {@code #log} for the parameters.
- */
- void info(String template, Object...args);
-
- /**
- * Logs a message at the FINE level.
- * See specs of {@code #log} for the parameters.
- */
- void fine(String template, Object...args);
-}
diff --git a/java/com/google/ipc/invalidation/util/Box.java b/java/com/google/ipc/invalidation/util/Box.java
deleted file mode 100644
index 0430344..0000000
--- a/java/com/google/ipc/invalidation/util/Box.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.util;
-
-/**
- * Container for a single arbitrary value. Useful when a nested callback needs
- * to modify a primitive type, which is ordinarily not possible as variables
- * available to nested callbacks need to be declared final.
- *
- * @param <T> Type of the value being boxed.
- *
- */
-public class Box<T> {
-
- /** Contents of the box. */
- private T value;
-
- /** Constructs a box with the given initial {@code value}. */
- public Box(T value) {
- this.value = value;
- }
-
- /** Constructs a Box with {@code null} as the value. */
- public Box() {
- this.value = null;
- }
-
- /** Constructs and returns a {@code Box} that wraps {@code objectValue}. */
- public static <T> Box<T> of(T objectValue) {
- return new Box<T>(objectValue);
- }
-
- public void set(T objectValue) {
- this.value = objectValue;
- }
-
- public T get() {
- return value;
- }
-
- @Override
- public String toString() {
- return (value == null) ? null : value.toString();
- }
-}
diff --git a/java/com/google/ipc/invalidation/util/Bytes.java b/java/com/google/ipc/invalidation/util/Bytes.java
deleted file mode 100644
index 53c0bec..0000000
--- a/java/com/google/ipc/invalidation/util/Bytes.java
+++ /dev/null
@@ -1,348 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.ipc.invalidation.util;
-
-import com.google.ipc.invalidation.util.LazyString.LazyStringReceiver;
-
-import java.nio.ByteBuffer;
-import java.nio.charset.Charset;
-import java.util.Arrays;
-import java.util.Locale;
-
-
-/**
- * A class that encapsulates a (fixed size) sequence of bytes and provides a
- * equality (along with hashcode) method that considers two sequences to be
- * equal if they have the same contents. Borrowed from protobuf's ByteString
- *
- */
-public class Bytes extends InternalBase implements Comparable<Bytes> {
-
- public static final Bytes EMPTY_BYTES = new Bytes(new byte[0]);
- private static final Charset UTF_8 = Charset.forName("UTF-8");
-
- /**
- * Interface accessing byte elements from {@code T}, which may be (for instance)
- * {@link com.google.protobuf.ByteString ByteString} or {@code byte[]}.
- */
- interface BytesAccessor<T> {
- int size(T bytes);
- byte get(T bytes, int index);
- }
-
- private static final BytesAccessor<byte[]> BYTE_ARRAY_ACCESSOR = new BytesAccessor<byte[]>() {
- @Override public int size(byte[] bytes) {
- return bytes == null ? 0 : bytes.length;
- }
-
- @Override public byte get(byte[] bytes, int index) {
- return bytes[index];
- }
- };
-
- private static final LazyStringReceiver<byte[]> BYTE_ARRAY_RECEIVER =
- new LazyStringReceiver<byte[]>() {
- @Override public void appendToBuilder(TextBuilder builder, byte[] element) {
- toCompactString(builder, element);
- }
- };
-
- /**
- * Three arrays that store the representation of each character from 0 to 255.
- * The ith number's octal representation is: CHAR_OCTAL_STRINGS1[i],
- * CHAR_OCTAL_STRINGS2[i], CHAR_OCTAL_STRINGS3[i]
- * <p>
- * E.g., if the number 128, these arrays contain 2, 0, 0 at index 128. We use
- * 3 char arrays instead of an array of strings since the code path for a
- * character append operation is quite a bit shorter than the append operation
- * for strings.
- */
- private static final char[] CHAR_OCTAL_STRINGS1 = new char[256];
- private static final char[] CHAR_OCTAL_STRINGS2 = new char[256];
- private static final char[] CHAR_OCTAL_STRINGS3 = new char[256];
-
- /** The actual sequence. */
- private final byte[] bytes;
-
- /** Cached hash */
- private volatile int hash = 0;
-
- static {
- // Initialize the array with the Octal string values so that we do not have
- // to do String.format for every byte during runtime.
- for (int i = 0; i < CHAR_OCTAL_STRINGS1.length; i++) {
- String value = String.format(Locale.ROOT, "\\%03o", i);
- CHAR_OCTAL_STRINGS1[i] = value.charAt(1);
- CHAR_OCTAL_STRINGS2[i] = value.charAt(2);
- CHAR_OCTAL_STRINGS3[i] = value.charAt(3);
- }
- }
-
- public Bytes(byte[] bytes) {
- this.bytes = bytes;
- }
-
- /**
- * Creates a Bytes object with the contents of {@code array1} followed by the
- * contents of {@code array2}.
- */
- public Bytes(byte[] array1, byte[] array2) {
- Preconditions.checkNotNull(array1);
- Preconditions.checkNotNull(array2);
- ByteBuffer buffer = ByteBuffer.allocate(array1.length + array2.length);
- buffer.put(array1);
- buffer.put(array2);
- this.bytes = buffer.array();
- }
-
- /**
- * Creates a Bytes object with the contents of {@code b1} followed by the
- * contents of {@code b2}.
- */
- public Bytes(Bytes b1, Bytes b2) {
- this(b1.bytes, b2.bytes);
- }
-
- public Bytes(byte b) {
- this.bytes = new byte[1];
- bytes[0] = b;
- }
-
- /** Creates a Bytes object from the given string encoded as a UTF-8 byte array. */
- public static Bytes fromUtf8Encoding(String s) {
- return new Bytes(s.getBytes(UTF_8));
- }
-
- /**
- * Gets the byte at the given index.
- *
- * @throws ArrayIndexOutOfBoundsException {@code index} is < 0 or >= size
- */
- public byte byteAt(final int index) {
- return bytes[index];
- }
-
- /**
- * Gets the number of bytes.
- */
- public int size() {
- return bytes.length;
- }
-
- /**
- * Returns the internal byte array.
- */
- public byte[] getByteArray() {
- return bytes;
- }
-
- /**
- * Returns a new {@code Bytes} containing the given subrange of bytes [{@code from}, {@code to}).
- */
- public Bytes subsequence(int from, int to) {
- // Identical semantics to Arrays.copyOfRange() but implemented manually so runs on
- // Froyo (JDK 1.5).
- int newLength = to - from;
- if (newLength < 0) {
- throw new IllegalArgumentException(from + " > " + to);
- }
- byte[] copy = new byte[newLength];
- System.arraycopy(bytes, from, copy, 0, Math.min(bytes.length - from, newLength));
- return new Bytes(copy);
- }
-
- @Override public boolean equals(final Object o) {
- if (o == this) {
- return true;
- }
-
- if (!(o instanceof Bytes)) {
- return false;
- }
-
- final Bytes other = (Bytes) o;
- return Arrays.equals(bytes, other.bytes);
- }
-
- @Override public int hashCode() {
- int h = hash;
-
- // If the hash has been not computed, go through each byte and compute it.
- if (h == 0) {
- final byte[] thisBytes = bytes;
- final int size = bytes.length;
-
- h = size;
- for (int i = 0; i < size; i++) {
- h = h * 31 + thisBytes[i];
- }
- if (h == 0) {
- h = 1;
- }
-
- hash = h;
- }
-
- return h;
- }
-
- /**
- * Returns whether these bytes are a prefix (either proper or improper) of
- * {@code other}.
- */
- public boolean isPrefixOf(Bytes other) {
- Preconditions.checkNotNull(other);
- if (size() > other.size()) {
- return false;
- }
- for (int i = 0; i < size(); ++i) {
- if (bytes[i] != other.bytes[i]) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Returns whether these bytes are a suffix (either proper or improper) of
- * {@code other}.
- */
- public boolean isSuffixOf(Bytes other) {
- Preconditions.checkNotNull(other);
- int diff = other.size() - size();
- if (diff < 0) {
- return false;
- }
- for (int i = 0; i < size(); ++i) {
- if (bytes[i] != other.bytes[i + diff]) {
- return false;
- }
- }
- return true;
- }
-
- @Override public int compareTo(Bytes other) {
- return compare(bytes, other.bytes);
- }
-
- public static Bytes fromByteArray(byte[] bytes) {
- return (bytes == null) ? null : new Bytes(bytes);
- }
-
- /**
- * Same specs as {@link #compareTo} except for the byte[] type. Null arrays are ordered before
- * non-null arrays.
- */
- public static int compare(byte[] first, byte[] second) {
- return compare(BYTE_ARRAY_ACCESSOR, first, second);
- }
-
- /**
- * Performs lexicographic comparison of two byte sequences. Null sequences are ordered before
- * non-null sequences.
- */
- static <T> int compare(BytesAccessor<T> accessor, T first, T second) {
- // Order null arrays before non-null arrays.
- if (first == null) {
- return (second == null) ? 0 : -1;
- }
- if (second == null) {
- return 1;
- }
-
- int minLength = Math.min(accessor.size(first), accessor.size(second));
- for (int i = 0; i < minLength; i++) {
-
- if (accessor.get(first, i) != accessor.get(second, i)) {
- int firstByte = accessor.get(first, i) & 0xff;
- int secondByte = accessor.get(second, i) & 0xff;
- return firstByte - secondByte;
- }
- }
- // At this point, either both arrays are equal length or one of the arrays has ended.
- // * If the arrays are of equal length, they must be identical (else we would have
- // returned the correct value above
- // * If they are not of equal length, the one with the longer length is greater.
- return accessor.size(first) - accessor.size(second);
- }
-
- /**
- * Renders the bytes as a string in standard bigtable ascii / octal mix compatible with bt and
- * returns it.
- */
- public static String toString(byte[] bytes) {
- return toCompactString(new TextBuilder(), bytes).toString();
- }
-
- /**
- * Renders the bytes as a string in standard bigtable ascii / octal mix compatible with bt and
- * adds it to builder.
- */
- @Override public void toCompactString(TextBuilder builder) {
- toCompactString(builder, bytes);
- }
-
- /**
- * Renders the bytes as a string in standard bigtable ascii / octal mix compatible with bt and
- * adds it to builder. Returns {@code builder}.
- */
- public static TextBuilder toCompactString(TextBuilder builder, byte[] bytes) {
- return toCompactString(BYTE_ARRAY_ACCESSOR, builder, bytes);
- }
-
- /**
- * Returns an object that lazily formats {@code bytes} when {@link Object#toString()} is called.
- */
- public static Object toLazyCompactString(byte[] bytes) {
- if (bytes == null || bytes.length == 0) {
- return "";
- }
- return LazyString.toLazyCompactString(bytes, BYTE_ARRAY_RECEIVER);
- }
-
- /**
- * Renders the bytes as a string in standard bigtable ascii / octal mix compatible with bt and
- * adds it to builder. Borrowed from Bigtable's {@code Util$keyToString()}.
- * Returns {@code builder}.
- */
- static <T> TextBuilder toCompactString(BytesAccessor<T> accessor, TextBuilder builder,
- T bytes) {
- for (int i = 0; i < accessor.size(bytes); i++) {
- byte c = accessor.get(bytes, i);
- switch(c) {
- case '\n': builder.append('\\'); builder.append('n'); break;
- case '\r': builder.append('\\'); builder.append('r'); break;
- case '\t': builder.append('\\'); builder.append('t'); break;
- case '\"': builder.append('\\'); builder.append('"'); break;
- case '\\': builder.append('\\'); builder.append('\\'); break;
- default:
- if ((c >= 32) && (c < 127) && c != '\'') {
- builder.append((char) c);
- } else {
- int byteValue = c;
- if (c < 0) {
- byteValue = c + 256;
- }
- builder.append('\\');
- builder.append(CHAR_OCTAL_STRINGS1[byteValue]);
- builder.append(CHAR_OCTAL_STRINGS2[byteValue]);
- builder.append(CHAR_OCTAL_STRINGS3[byteValue]);
- }
- }
- }
- return builder;
- }
-}
diff --git a/java/com/google/ipc/invalidation/util/ExponentialBackoffDelayGenerator.java b/java/com/google/ipc/invalidation/util/ExponentialBackoffDelayGenerator.java
deleted file mode 100644
index a2fee7e..0000000
--- a/java/com/google/ipc/invalidation/util/ExponentialBackoffDelayGenerator.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.util;
-
-import java.util.Random;
-
-/**
- * Class that generates successive intervals for random exponential backoff. Class tracks a
- * "high water mark" which is doubled each time {@code getNextDelay} is called; each call to
- * {@code getNextDelay} returns a value uniformly randomly distributed between 0 (inclusive) and the
- * high water mark (exclusive). Note that this class does not dictate the time units for which the
- * delay is computed.
- *
- */
-public class ExponentialBackoffDelayGenerator {
-
- /** Initial allowed delay time. */
- private final int initialMaxDelay;
-
- /** Maximum allowed delay time. */
- private final int maxDelay;
-
- /** Next delay time to use. */
- private int currentMaxDelay;
-
- /** If the first call to {@code getNextDelay} has been made after reset. */
- private boolean inRetryMode;
-
- private final Random random;
-
- /**
- * Creates a generator with the given initial delay and the maximum delay (in terms of a factor of
- * the initial delay).
- */
- public ExponentialBackoffDelayGenerator(Random random, int initialMaxDelay,
- int maxExponentialFactor) {
- Preconditions.checkArgument(maxExponentialFactor > 0, "max factor must be positive");
- this.random = Preconditions.checkNotNull(random);
- Preconditions.checkArgument(initialMaxDelay > 0, "initial delay must be positive");
- this.initialMaxDelay = initialMaxDelay;
- this.maxDelay = initialMaxDelay * maxExponentialFactor;
- Preconditions.checkState(maxDelay > 0, "max delay must be positive");
- reset();
- }
-
- /**
- * A constructor to restore a generator from saved state. Creates a generator with the given
- * initial delay and the maximum delay (in terms of a factor of the initial delay).
- *
- * @param currentMaxDelay saved current max delay
- * @param inRetryMode saved in-retry-mode value
- */
- protected ExponentialBackoffDelayGenerator(Random random, int initialMaxDelay,
- int maxExponentialFactor, int currentMaxDelay, boolean inRetryMode) {
- this(random, initialMaxDelay, maxExponentialFactor);
- this.currentMaxDelay = currentMaxDelay;
- this.inRetryMode = inRetryMode;
- }
-
- /** Resets the exponential backoff generator to start delays at the initial delay. */
- public void reset() {
- this.currentMaxDelay = initialMaxDelay;
- this.inRetryMode = false;
- }
-
- /**
- * Resets the exponential backoff generator to start delays such that the specified number of
- * retries have already been made. */
- public void resetWithNumRetries(int numRetries) {
- Preconditions.checkArgument(numRetries >= 0);
- reset();
- if (numRetries > 0) {
- inRetryMode = true;
- if (numRetries > Integer.SIZE) {
- // Cap, otherwise Java will use the lower order 5 bits causing incorrect power of 2.
- numRetries = Integer.SIZE;
- }
- currentMaxDelay = currentMaxDelay << (numRetries - 1);
- if (currentMaxDelay <= 0 || currentMaxDelay > maxDelay) {
- currentMaxDelay = maxDelay;
- }
- }
- }
-
- /** Gets the next delay interval to use. */
- public int getNextDelay() {
- int delay = 0; // After a reset, the delay is 0.
- if (inRetryMode) {
-
- // Generate the delay in the range [1, currentMaxDelay].
- delay = random.nextInt(currentMaxDelay) + 1;
-
- // Adjust the max for the next run.
- if (currentMaxDelay <= maxDelay) { // Guard against overflow.
- currentMaxDelay *= 2;
- if (currentMaxDelay > maxDelay) {
- currentMaxDelay = maxDelay;
- }
- }
- }
- inRetryMode = true;
- return delay;
- }
-
- protected int getCurrentMaxDelay() {
- return currentMaxDelay;
- }
-
- protected boolean getInRetryMode() {
- return inRetryMode;
- }
-}
diff --git a/java/com/google/ipc/invalidation/util/Formatter.java b/java/com/google/ipc/invalidation/util/Formatter.java
deleted file mode 100644
index 147853d..0000000
--- a/java/com/google/ipc/invalidation/util/Formatter.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.util;
-
-/**
- * A set of utilities needed to format strings by the external class implementations.
- *
- */
-public class Formatter {
-
- /**
- * (Borrowed from the Preconditions code).
- * Substitutes each {@code %s} in {@code template} with an argument. These
- * are matched by position - the first {@code %s} gets {@code args[0]}, etc.
- * If there are more arguments than placeholders, the unmatched arguments will
- * be appended to the end of the formatted message in square braces.
- *
- * @param template a non-null string containing 0 or more {@code %s}
- * placeholders.
- * @param args the arguments to be substituted into the message
- * template. Arguments are converted to strings using
- * {@link String#valueOf(Object)}. Arguments can be null.
- */
- public static String format(String template, Object... args) {
- template = String.valueOf(template); // null -> "null"
-
- // start substituting the arguments into the '%s' placeholders
- StringBuilder builder = new StringBuilder(
- template.length() + 16 * args.length);
- int templateStart = 0;
- int i = 0;
- while (i < args.length) {
- int placeholderStart = template.indexOf("%s", templateStart);
- if (placeholderStart == -1) {
- break;
- }
- builder.append(template.substring(templateStart, placeholderStart));
- builder.append(args[i++]);
- templateStart = placeholderStart + 2;
- }
- builder.append(template.substring(templateStart));
-
- // if we run out of placeholders, append the extra args in square braces
- if (i < args.length) {
- builder.append(" [");
- builder.append(args[i++]);
- while (i < args.length) {
- builder.append(", ");
- builder.append(args[i++]);
- }
- builder.append(']');
- }
- return builder.toString();
- }
-
- private Formatter() { // To prevent instantiation.
- }
-}
diff --git a/java/com/google/ipc/invalidation/util/InternalBase.java b/java/com/google/ipc/invalidation/util/InternalBase.java
deleted file mode 100644
index 74c9cca..0000000
--- a/java/com/google/ipc/invalidation/util/InternalBase.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.util;
-
-/**
- * {@code InternalBase} is a class from which other classes can derive that allows an efficient
- * toString implementation for logging/debugging purposes for those classes. The class is abstract
- * so that it is never instantiated explicitly.
- *
- */
-public abstract class InternalBase {
-
- /**
- * Adds a compact representation of this object to {@code builder}.
- *
- * @param builder the builder in which the string representation is added
- */
- public abstract void toCompactString(TextBuilder builder);
-
- /**
- * Adds a verbose representation of this object to {@code builder}. The
- * default implementation for toVerboseString is to simply call
- * toCompactString.
- *
- * @param builder the builder in which the string representation is added
- */
- public void toVerboseString(TextBuilder builder) {
- toCompactString(builder);
- }
-
- @Override
- public String toString() {
- TextBuilder builder = new TextBuilder();
- toCompactString(builder);
- return builder.toString();
- }
-
- /**
- * Creates a TextBuilder internally and returns a string based on the {@code
- * toVerboseString} method described above.
- */
- public String toVerboseString() {
- TextBuilder builder = new TextBuilder();
- toVerboseString(builder);
- return builder.toString();
- }
-
- /**
- * Given a set of {@code objects}, calls {@code toCompactString} on each of
- * them with the {@code builder} and separates each object's output in the
- * {@code builder} with a comma.
- */
- public static void toCompactStrings(TextBuilder builder,
- Iterable<? extends InternalBase> objects) {
- boolean first = true;
- for (InternalBase object : objects) {
- if (!first) {
- builder.append(", ");
- }
- object.toCompactString(builder);
- first = false;
- }
- }
-
- /**
- * Given a set of {@code objects}, calls {@code toString} on each of
- * them with the {@code builder} and separates each object's output in the
- * {@code builder} with a comma.
- */
- public static void toStrings(TextBuilder builder, Iterable<?> objects) {
- boolean first = true;
- for (Object object : objects) {
- if (!first) {
- builder.append(", ");
- }
- builder.append(object.toString());
- first = false;
- }
- }
-}
diff --git a/java/com/google/ipc/invalidation/util/LazyString.java b/java/com/google/ipc/invalidation/util/LazyString.java
deleted file mode 100644
index bc85c60..0000000
--- a/java/com/google/ipc/invalidation/util/LazyString.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.ipc.invalidation.util;
-
-import java.util.Collection;
-
-
-/**
- * Utilities to enable creation of lazy strings, where the instantiation of the string is delayed
- * so that, e.g., log messages that aren't printed have reduced overhead.
- */
-public class LazyString {
-
- /** Receiver formatting objects using {@link Object#toString()}. */
- public static final LazyStringReceiver<Object> OBJECT_RECEIVER =
- new LazyStringReceiver<Object>() {
- @Override
- public void appendToBuilder(TextBuilder builder, Object element) {
- builder.append(element);
- }
- };
-
- /**
- * Receiver appending an {@code element} to the given {@code builder}. Implementations may assume
- * the builder and element are not {@code null}.
- */
- public interface LazyStringReceiver<T> {
- void appendToBuilder(TextBuilder builder, T element);
- }
-
- /**
- * Given an {@code element} to be logged lazily, returns null if the object is null. Otherwise,
- * return an object that would convert it to a string using {@code builderFunction}. I.e., this
- * method will call {@code builderFunction} with a new {@link TextBuilder} and provided
- * {@code element} and return the string created with it.
- */
- public static <T> Object toLazyCompactString(final T element,
- final LazyStringReceiver<T> builderFunction) {
- if (element == null) {
- return null;
- }
- return new Object() {
- @Override public String toString() {
- TextBuilder builder = new TextBuilder();
- builderFunction.appendToBuilder(builder, element);
- return builder.toString();
- }
- };
- }
-
- /**
- * Returns an object that converts the given {@code elements} array into a debug string when
- * {@link Object#toString} is called using
- * {@link #appendElementsToBuilder(TextBuilder, Object[], LazyStringReceiver)}.
- */
- public static <T> Object toLazyCompactString(final T[] elements,
- final LazyStringReceiver<? super T> elementReceiver) {
- if ((elements == null) || (elements.length == 0)) {
- return null;
- }
- return new Object() {
- @Override public String toString() {
- return appendElementsToBuilder(new TextBuilder(), elements, elementReceiver).toString();
- }
- };
- }
-
- /**
- * Returns an object that converts the given {@code elements} collection into a debug string when
- * {@link Object#toString} is called using
- * {@link #appendElementsToBuilder(TextBuilder, Object[], LazyStringReceiver)}.
- */
- public static <T> Object toLazyCompactString(final Collection<T> elements,
- final LazyStringReceiver<? super T> elementReceiver) {
- if ((elements == null) || elements.isEmpty()) {
- return null;
- }
- return new Object() {
- @Override public String toString() {
- return appendElementsToBuilder(new TextBuilder(), elements, elementReceiver).toString();
- }
- };
- }
-
- /**
- * Appends {@code elements} formatted using {@code elementReceiver} to {@code builder}. Elements
- * are comma-separated.
- */
- public static <T> TextBuilder appendElementsToBuilder(TextBuilder builder, T[] elements,
- LazyStringReceiver<? super T> elementReceiver) {
- if (elements == null) {
- return builder;
- }
- for (int i = 0; i < elements.length; i++) {
- if (i != 0) {
- builder.append(", ");
- }
- T element = elements[i];
- if (element != null) {
- elementReceiver.appendToBuilder(builder, element);
- }
- }
- return builder;
- }
-
- /**
- * Appends {@code elements} formatted using {@code elementReceiver} to {@code builder}. Elements
- * are comma-separated.
- */
- public static <T> TextBuilder appendElementsToBuilder(TextBuilder builder,
- Iterable<T> elements, LazyStringReceiver<? super T> elementReceiver) {
- if (elements == null) {
- return builder;
- }
- boolean first = true;
- for (T element : elements) {
- if (first) {
- first = false;
- } else {
- builder.append(", ");
- }
- if (element != null) {
- elementReceiver.appendToBuilder(builder, element);
- }
- }
- return builder;
- }
-
- private LazyString() { // To prevent instantiation.
- }
-}
diff --git a/java/com/google/ipc/invalidation/util/Marshallable.java b/java/com/google/ipc/invalidation/util/Marshallable.java
deleted file mode 100644
index 5b6a3ca..0000000
--- a/java/com/google/ipc/invalidation/util/Marshallable.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.util;
-
-/**
- * Interface for classes that can marshall their state to a protocol buffer.
- *
- * @param <T> the type of protocol buffer returned by {@link #marshal}
- */
-public interface Marshallable<T> {
- /** Returns a protocol buffer containing the class state. */
- T marshal();
-}
diff --git a/java/com/google/ipc/invalidation/util/NamedRunnable.java b/java/com/google/ipc/invalidation/util/NamedRunnable.java
deleted file mode 100644
index 7a29fe0..0000000
--- a/java/com/google/ipc/invalidation/util/NamedRunnable.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.util;
-
-/**
- * A wrapper around the {@link Runnable} interface that provides extra information (e.g., a name)
- * for logging, monitoring, debugging, etc.
- *
- */
-public abstract class NamedRunnable implements Runnable {
-
- /** The name of this runnable. */
- private final String name;
-
- /** Constructs a named runnable with the given name. */
- public NamedRunnable(String name) {
- Preconditions.checkNotNull(name, "name is null");
- this.name = name;
- }
-
- @Override
- public String toString() {
- return name + ':' + super.toString();
- }
-
- public String getName() {
- return name;
- }
-}
diff --git a/java/com/google/ipc/invalidation/util/Preconditions.java b/java/com/google/ipc/invalidation/util/Preconditions.java
deleted file mode 100644
index 324930e..0000000
--- a/java/com/google/ipc/invalidation/util/Preconditions.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.ipc.invalidation.util;
-
-
-/**
- * Precondition checkers modeled after {@link com.google.common.base.Preconditions}. Duplicated here
- * to avoid the dependency on guava in Java client code.
- */
-public class Preconditions {
-
- /**
- * Throws {@link NullPointerException} if the {@code reference} argument is
- * {@code null}. Otherwise, returns {@code reference}.
- */
- public static <T> T checkNotNull(T reference) {
- if (reference == null) {
- throw new NullPointerException();
- }
- return reference;
- }
-
- /**
- * Throws {@link NullPointerException} if the {@code reference} argument is
- * {@code null}. Otherwise, returns {@code reference}.
- */
- public static <T> T checkNotNull(T reference, Object errorMessage) {
- if (reference == null) {
- throw new NullPointerException(String.valueOf(errorMessage));
- }
- return reference;
- }
-
- /** Throws {@link IllegalStateException} if the given {@code expression} is {@code false}. */
- public static void checkState(boolean expression) {
- if (!expression) {
- throw new IllegalStateException();
- }
- }
-
- /** Throws {@link IllegalStateException} if the given {@code expression} is {@code false}. */
- public static void checkState(boolean expression, Object errorMessage) {
- if (!expression) {
- throw new IllegalStateException(String.valueOf(errorMessage));
- }
- }
-
- /** Throws {@link IllegalArgumentException} if the given {@code expression} is {@code false}. */
- public static void checkArgument(boolean expression) {
- if (!expression) {
- throw new IllegalArgumentException();
- }
- }
-
- /** Throws {@link IllegalArgumentException} if the given {@code expression} is {@code false}. */
- public static void checkArgument(boolean expression, Object errorMessage) {
- if (!expression) {
- throw new IllegalArgumentException(String.valueOf(errorMessage));
- }
- }
-
- // Do not instantiate.
- private Preconditions() {
- }
-}
diff --git a/java/com/google/ipc/invalidation/util/ProtoWrapper.java b/java/com/google/ipc/invalidation/util/ProtoWrapper.java
deleted file mode 100644
index 680b82a..0000000
--- a/java/com/google/ipc/invalidation/util/ProtoWrapper.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.ipc.invalidation.util;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Locale;
-
-
-/**
- * Base class for generated protobuf wrapper classes. Includes utilities for validation of proto
- * fields and implements hash code memoization.
- */
-public abstract class ProtoWrapper extends InternalBase {
-
- /** Unchecked validation exception indicating a code issue. */
- public static final class ValidationArgumentException extends IllegalArgumentException {
- public ValidationArgumentException(String message) {
- super(message);
- }
- }
-
- /** Checked validation exception indicating an bogus protocol buffer instance. */
- public static final class ValidationException extends Exception {
- public ValidationException(String message) {
- super(message);
- }
-
- public ValidationException(Throwable cause) {
- super(cause);
- }
- }
-
- /** Immutable, empty list. */
- private static final List<?> EMPTY_LIST = Collections.unmodifiableList(new ArrayList<Object>(0));
- private static final int UNINITIALIZED_HASH_CODE = -1;
- private static final int NOT_UNITIALIZED_HASH_CODE = UNINITIALIZED_HASH_CODE + 1;
- private int hashCode;
-
- @Override
- public final int hashCode() {
- if (hashCode == UNINITIALIZED_HASH_CODE) {
- int computedHashCode = computeHashCode();
-
- // If computeHashCode() happens to return UNITIALIZED_HASH_CODE, replace it with a
- // different (constant but arbitrary) value so that the hash code doesn't need to be
- // recomputed.
- hashCode = (computedHashCode == UNINITIALIZED_HASH_CODE) ? NOT_UNITIALIZED_HASH_CODE
- : computedHashCode;
- }
- return hashCode;
- }
-
- /** Returns a hash code for this wrapper. */
- protected abstract int computeHashCode();
-
- /** Returns an immutable, empty list with elements of type {@code T}. */
- @SuppressWarnings("unchecked")
- protected static <T> List<T> emptyList() {
- return (List<T>) EMPTY_LIST;
- }
-
- /** Checks that the given field is non null. */
- protected static void required(String fieldName, Object fieldValue) {
- if (fieldValue == null) {
- throw new ValidationArgumentException(
- String.format(Locale.ROOT, "Required field '%s' was not set", fieldName));
- }
- }
-
- /**
- * Checks that the given collection contains non-null elements. Treats {@code null} as empty.
- * Returns an immutable copy of the given collection.
- */
- protected static <T> List<T> optional(String fieldName, Collection<T> fieldValues) {
- if ((fieldValues == null) || (fieldValues.size() == 0)) {
- return emptyList();
- }
- ArrayList<T> copy = new ArrayList<T>(fieldValues);
- for (int i = 0; i < copy.size(); i++) {
- if (copy.get(i) == null) {
- throw new ValidationArgumentException(String.format(Locale.ROOT,
- "Element %d of repeated field '%s' must not be null.", i, fieldName));
- }
- }
- return Collections.unmodifiableList(copy);
- }
-
- /**
- * Checks that the given field is non-empty. Returns an immutable copy of the given
- * collection.
- */
- protected static <T> List<T> required(String fieldName, Collection<T> fieldValues) {
- List<T> copy = optional(fieldName, fieldValues);
- if (fieldValues.isEmpty()) {
- throw new ValidationArgumentException(String.format(Locale.ROOT,
- "Repeated field '%s' must have at least one element", fieldName));
- }
- return copy;
- }
-
- /** Checks that the given field is non-negative. */
- protected static void nonNegative(String fieldName, int value) {
- if (value < 0) {
- throw new ValidationArgumentException(
- String.format(Locale.ROOT, "Field '%s' must be non-negative: %d", fieldName, value));
- }
- }
-
- /** Checks that the given field is non-negative. */
- protected static void nonNegative(String fieldName, long value) {
- if (value < 0) {
- throw new ValidationArgumentException(
- String.format(Locale.ROOT, "Field '%s' must be non-negative: %d", fieldName, value));
- }
- }
-
- /** Checks that the given field is positive. */
- protected static void positive(String fieldName, int value) {
- if (value <= 0) {
- throw new ValidationArgumentException(
- String.format(Locale.ROOT, "Field '%s' must be positive: %d", fieldName, value));
- }
- }
-
- /** Checks that the given field is positive. */
- protected static void positive(String fieldName, long value) {
- if (value <= 0) {
- throw new ValidationArgumentException(
- String.format(Locale.ROOT, "Field '%s' must be positive: %d", fieldName, value));
- }
- }
-
- /**
- * Checks that the given field is not empty. Only call when the field has a value:
- * {@link #required} can be called first, or the check can be conditionally performed.
- */
- protected static void nonEmpty(String fieldName, String value) {
- if (Preconditions.checkNotNull(value).length() == 0) {
- throw new ValidationArgumentException(
- String.format(Locale.ROOT, "Field '%s' must be non-empty", fieldName));
- }
- }
-
- /**
- * Checks that the given field is not empty. Only call when the field has a value:
- * {@link #required} can be called first, or the check can be conditionally performed.
- */
- protected static void nonEmpty(String fieldName, Bytes value) {
- if (Preconditions.checkNotNull(value).size() == 0) {
- throw new ValidationArgumentException(
- String.format(Locale.ROOT, "Field '%s' must be non-empty", fieldName));
- }
- }
-
- /** Checks that the given condition holds. */
- protected void check(boolean condition, String message) {
- if (!condition) {
- throw new ValidationArgumentException(String.format(Locale.ROOT, "%s: %s", message, this));
- }
- }
-
- /** Throws exception indicating a one-of violation due to multiple defined choices. */
- protected static void oneOfViolation(String field1, String field2) {
- throw new ValidationArgumentException(String.format(Locale.ROOT,
- "Multiple one-of fields defined, including: %s, %s", field1, field2));
- }
-
- /** Throws exception indicating that no one-of choices are defined. */
- protected static void oneOfViolation() {
- throw new ValidationArgumentException("No one-of fields defined");
- }
-
- //
- // Equals helpers.
- //
-
- /**
- * Returns {@code true} if the provided objects are both null or are non-null and equal. Returns
- * {@code false} otherwise.
- */
- protected static boolean equals(Object x, Object y) {
- if (x == null) {
- return y == null;
- }
- if (y == null) {
- return false;
- }
- return x.equals(y);
- }
-
- //
- // Hash code helpers for primitive types (taken from com.google.common.primitives package).
- //
-
- /** Returns hash code for the provided {@code long} value. */
- protected static int hash(long value) {
- // See Longs#hashCode
- return (int) (value ^ (value >>> 32));
- }
-
- /** Returns hash code for the provided {@code int} value. */
- protected static int hash(int value) {
- return value;
- }
-
- /** Returns hash code for the provided {@code boolean} value. */
- protected static int hash(boolean value) {
- // See Booleans#hashCode
- return value ? 1231 : 1237;
- }
-
- /** Returns hash code for the provided {@code float} value. */
- protected static int hash(float value) {
- return Float.valueOf(value).hashCode();
- }
-
- /** Returns hash code for the provided {@code double} value. */
- protected static int hash(double value) {
- return Double.valueOf(value).hashCode();
- }
-}
diff --git a/java/com/google/ipc/invalidation/util/Smearer.java b/java/com/google/ipc/invalidation/util/Smearer.java
deleted file mode 100644
index f95f365..0000000
--- a/java/com/google/ipc/invalidation/util/Smearer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.util;
-
-import java.util.Random;
-
-/**
- * An abstraction to "smear" values by a given percent. Useful for randomizing delays a little bit
- * so that (say) processes do not get synchronized on time inadvertently, e.g., a heartbeat task
- * that sends a message every few minutes is smeared so that all clients do not end up sending a
- * message at the same time. In particular, given a {@code delay}, returns a value that is randomly
- * distributed between [delay - smearPercent * delay, delay + smearPercent * delay]
- *
- */
-public class Smearer {
-
- private final Random random;
-
- /** The percentage (0, 1.0] for smearing the delay. */
- private double smearFraction;
-
- /**
- * Creates a smearer with the given random number generator. If {@code smearPercent} is 0, uses an
- * internal default for smearing.
- * <p>
- * REQUIRES: 0 < smearPercent <= 100
- */
- public Smearer(Random random, final int smearPercent) {
- Preconditions.checkState((smearPercent >= 0) && (smearPercent <= 100));
- this.random = random;
- this.smearFraction = smearPercent / 100.0;
- }
-
- /**
- * Given a {@code delay}, returns a value that is randomly distributed between
- * [delay - smearPercent * delay, delay + smearPercent * delay]
- */
- public int getSmearedDelay(int delay) {
- // Get a random number between -1 and 1 and then multiply that by the smear
- // fraction.
- double smearFactor = (2 * random.nextDouble() - 1.0) * smearFraction;
- return (int) Math.ceil(delay + delay * smearFactor);
- }
-}
diff --git a/java/com/google/ipc/invalidation/util/TextBuilder.java b/java/com/google/ipc/invalidation/util/TextBuilder.java
deleted file mode 100644
index 6d55d52..0000000
--- a/java/com/google/ipc/invalidation/util/TextBuilder.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.util;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-
-/**
- * A {@link TextBuilder} is an abstraction that allows classes to efficiently append their string
- * representations and then use them later for human consumption, e.g., for debugging or logging. It
- * is currently a wrapper around {@link StringBuilder} and {@link Formatter} to give us format and
- * append capabilities together. All append methods return this TextBuilder so that the method calls
- * can be chained.
- *
- */
-public class TextBuilder {
-
- private final StringBuilder builder;
- private final UtilFormatter formatter;
-
- /**
- * Given an {@code object} that is an instance of {@code clazz}, outputs names and values of all
- * member fields declared on {@code clazz}. This method should be used carefully:
- * <ol>
- * <li>This method is expensive. For frequently logged types, an ad hoc
- * {@link InternalBase#toCompactString} implementation is preferred.</li>
- * <li>May overflow the stack if there is a cycle in an object graph.</li>
- * <li>Custom formatters have been implemented for many protos. They will not be used by this
- * method.</li>
- * </ol>
- */
- public static void outputFieldsToBuilder(TextBuilder builder, Object object, Class<?> clazz) {
- Preconditions.checkArgument(clazz.isAssignableFrom(object.getClass()));
-
- // Get all the fields and print them using toCompactString if possible;
- // otherwise, via toString
- Field[] fields = clazz.getDeclaredFields();
- for (Field field : fields) {
- try {
- // Ignore static final fields, as they're uninteresting.
- int modifiers = field.getModifiers();
- if (Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers)) {
- continue;
- }
-
- field.setAccessible(true);
- builder.append(field.getName() + " = ");
- Object fieldValue = field.get(object);
- if (fieldValue instanceof InternalBase) {
- ((InternalBase) fieldValue).toCompactString(builder);
- } else {
- builder.append(fieldValue);
- }
- builder.append(", ");
- } catch (IllegalArgumentException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- }
- }
-
- /**
- * Returns an empty TextBuilder to which various objects' string
- * representations can be added later.
- */
- public TextBuilder() {
- builder = new StringBuilder();
- formatter = new UtilFormatter(builder);
- }
-
- /**
- * Appends the string representation of {@code c} to this builder.
- *
- * @param c the character being appended
- */
- public TextBuilder append(char c) {
- builder.append(c);
- return this;
- }
-
- /**
- * Appends the string representation of {@code i} to this builder.
- *
- * @param i the integer being appended
- */
- public TextBuilder append(int i) {
- builder.append(i);
- return this;
- }
-
- /**
- * Appends the toString representation of {@code object} to this builder.
- */
- public TextBuilder append(Object object) {
- builder.append(object);
- return this;
- }
-
- /**
- * Appends the {@code InternalBase#toCompactString} representation of {@code object} to this
- * builder.
- */
- public TextBuilder append(InternalBase object) {
- if (object == null) {
- return append("null");
- }
- object.toCompactString(this);
- return this;
- }
-
- /**
- * Appends the comma-separated {@code InternalBase#toCompactString} representations of
- * {@code objects} to this builder.
- */
- public TextBuilder append(Iterable<? extends InternalBase> objects) {
- if (objects == null) {
- return this;
- }
- boolean first = true;
- for (InternalBase object : objects) {
- if (first) {
- first = false;
- } else {
- builder.append(", ");
- }
- append(object);
- }
- return this;
- }
-
- /** Appends the {@link Bytes#toString} representation of {@code bytes} to this builder. */
- public TextBuilder append(byte[] bytes) {
- if (bytes == null) {
- return append("null");
- }
- Bytes.toCompactString(this, bytes);
- return this;
- }
-
- /**
- * Appends the string representation of {@code l} to this builder.
- *
- * @param l the long being appended
- */
- public TextBuilder append(long l) {
- builder.append(l);
- return this;
- }
-
- /**
- * Appends the string representation of {@code b} to this builder.
- *
- * @param b the boolean being appended
- */
- public TextBuilder append(boolean b) {
- builder.append(b);
- return this;
- }
-
- /**
- * Appends {@code s} to this builder.
- *
- * @param s the string being appended
- */
- public TextBuilder append(String s) {
- builder.append(s);
- return this;
- }
-
- /**
- * Writes a formatted string to this using the specified format string and
- * arguments.
- *
- * @param format the format as used in {@link java.util.Formatter}
- * @param args the arguments that are converted to their string form using
- * {@code format}
- */
- public TextBuilder appendFormat(String format, Object... args) {
- formatter.format(format, args);
- return this;
- }
-
- @Override
- public String toString() {
- return builder.toString();
- }
-}
diff --git a/java/com/google/ipc/invalidation/util/TypedUtil.java b/java/com/google/ipc/invalidation/util/TypedUtil.java
deleted file mode 100644
index bb70a80..0000000
--- a/java/com/google/ipc/invalidation/util/TypedUtil.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.util;
-
-import java.util.Collection;
-import java.util.Map;
-import java.util.Set;
-
-
-/**
- * Utilities for using various data structures such as {@link Map}s and {@link
- * Set}s in a type-safe manner.
- *
- */
-public class TypedUtil {
-
- private TypedUtil() { // prevent instantiation
- }
-
- /** A statically type-safe version of {@link Map#containsKey}. */
- public static <Key> boolean containsKey(Map<Key, ?> map, Key key) {
- return map.containsKey(key);
- }
-
- /** A statically type-safe version of {@link Map#get}. */
- public static <Key, Value> Value mapGet(Map<Key, Value> map, Key key) {
- return map.get(key);
- }
-
- /** A statically type-safe version of {@link Map#remove}. */
- public static <Key, Value> Value remove(Map<Key, Value> map, Key key) {
- return map.remove(key);
- }
-
- /** A statically type-safe version of {@link Set#contains}. */
- public static <ElementType> boolean contains(Set<ElementType> set, ElementType element) {
- return set.contains(element);
- }
-
- /** A statically type-safe version of {@link Set#contains}. */
- public static <ElementType> boolean contains(
- Collection<ElementType> collection, ElementType element) {
- return collection.contains(element);
- }
-
- /** A statically type-safe version of {@link Set#remove}. */
- public static <ElementType> boolean remove(Set<ElementType> set, ElementType element) {
- return set.remove(element);
- }
-
- /**
- * Typed equals operator (useful to ensure at compile time that the expected types are being
- * compared). Returns {@code true} if both arguments are {@code null}, if they reference the same
- * object, or if {@code o1.equals(o2)}.
- */
- public static <T> boolean equals(T o1, T o2) {
- // Not using java.util.Objects, which is not supported by earlier version of Android, and not
- // using com.google.common.base.Objects since we're avoiding a Guava dependency for client code.
- return (o1 == o2) || ((o1 != null) && o1.equals(o2));
- }
-}
diff --git a/java/com/google/ipc/invalidation/util/UtilFormatter.java b/java/com/google/ipc/invalidation/util/UtilFormatter.java
deleted file mode 100644
index 3b5a903..0000000
--- a/java/com/google/ipc/invalidation/util/UtilFormatter.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.util;
-
-import java.util.Formatter;
-
-/**
- * A formatter with a level of indirection so that GWT magic
- * can be used.
- *
- */
-public class UtilFormatter {
-
- private final Formatter formatter;
-
- UtilFormatter(StringBuilder builder) {
- formatter = new Formatter(builder);
- }
-
- public void format(String format, Object[] args) {
- formatter.format(format, args);
- }
-}
diff --git a/javaexample/com/google/ipc/invalidation/examples/android2/AndroidManifest.xml b/javaexample/com/google/ipc/invalidation/examples/android2/AndroidManifest.xml
deleted file mode 100644
index 9a2a4db..0000000
--- a/javaexample/com/google/ipc/invalidation/examples/android2/AndroidManifest.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" ?>
-<!-- Copyright 2011 Google Inc. All Rights Reserved. -->
-<!-- Manifest for AndroidListener sample application. Must be merged with
- j/c/g/ipc/invalidation/external/client/contrib:android_listener_manifest. -->
-<manifest android:versionCode="1" android:versionName="0.1" package="com.google.ipc.invalidation.examples.android2" xmlns:android="http://schemas.android.com/apk/res/android">
- <!-- *** WARNING *** DO NOT EDIT! THIS IS GENERATED MANIFEST BY MERGE_MANIFEST TOOL.
- Merger manifest:
- java/com/google/ipc/invalidation/examples/android2/AndroidManifest.xml
- Mergee manifests:
- blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-opt/bin/java/com/google/ipc/invalidation/external/client/contrib/android_listener_manifest/AndroidManifest.xml
- -->
- <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="14"/>
- <!-- Declare and use permission allowing this application to receive GCM
- messages. -->
- <permission android:name="com.google.ipc.invalidation.examples.android2.permission.C2D_MESSAGE" android:protectionLevel="signature"/>
- <uses-permission android:name="com.google.ipc.invalidation.examples.android2.permission.C2D_MESSAGE"/>
- <application>
- <!-- Configure the listener class for the application -->
- <meta-data android:name="ipc.invalidation.ticl.listener_service_class" android:value="com.google.ipc.invalidation.examples.android2.ExampleListener"/>
- <!-- To enable background invalidations uncomment the following element:
- -->
- <!--<meta-data
- android:name=
- "ipc.invalidation.ticl.background_invalidation_listener_service_class"
- android:value=
- "com.google.ipc.invalidation.examples.android2.ExampleListener"/>-->
- <!-- Example activity -->
- <activity android:name="com.google.ipc.invalidation.examples.android2.MainActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
- <!-- Ticl listener. -->
- <service android:exported="false" android:name="com.google.ipc.invalidation.examples.android2.ExampleListener">
- <intent-filter>
- <action android:name="com.google.ipc.invalidation.AUTH_TOKEN_REQUEST"/>
- </intent-filter>
- </service>
- <!-- Merged from file: blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-opt/bin/java/com/google/ipc/invalidation/external/client/contrib/android_listener_manifest/AndroidManifest.xml -->
- <!-- Receiver for scheduler alarms. -->
- <receiver android:exported="false" android:name="com.google.ipc.invalidation.external.client.contrib.AndroidListener$AlarmReceiver"/>
- <!-- Merged from file: blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-opt/bin/java/com/google/ipc/invalidation/external/client/contrib/android_listener_manifest/AndroidManifest.xml -->
- <!-- Receiver for scheduler alarms. -->
- <receiver android:exported="false" android:name="com.google.ipc.invalidation.ticl.android2.AndroidInternalScheduler$AlarmReceiver"/>
- <!-- Merged from file: blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-opt/bin/java/com/google/ipc/invalidation/external/client/contrib/android_listener_manifest/AndroidManifest.xml -->
- <!-- GCM Broadcast Receiver -->
- <receiver android:exported="true" android:name="com.google.ipc.invalidation.external.client.contrib.MultiplexingGcmListener$GCMReceiver" android:permission="com.google.android.c2dm.permission.SEND">
- <intent-filter>
- <action android:name="com.google.android.c2dm.intent.RECEIVE"/>
- <action android:name="com.google.android.c2dm.intent.REGISTRATION"/>
- <category android:name="com.google.ipc.invalidation.ticl.android2"/>
- </intent-filter>
- </receiver>
- <!-- Merged from file: blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-opt/bin/java/com/google/ipc/invalidation/external/client/contrib/android_listener_manifest/AndroidManifest.xml -->
- <!-- Merged from file: java/com/google/ipc/invalidation/external/client/android2/AndroidManifest.xml -->
- <receiver android:exported="false" android:name="com.google.ipc.invalidation.ticl.android2.channel.AndroidMessageReceiverService$Receiver">
- <intent-filter>
- <action android:name="com.google.ipc.invalidation.gcmmplex.EVENT"/>
- </intent-filter>
- </receiver>
- <!-- Merged from file: blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-opt/bin/java/com/google/ipc/invalidation/external/client/contrib/android_listener_manifest/AndroidManifest.xml -->
- <!-- Ticl service. -->
- <service android:exported="false" android:name="com.google.ipc.invalidation.ticl.android2.TiclService"/>
- <!-- Merged from file: blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-opt/bin/java/com/google/ipc/invalidation/external/client/contrib/android_listener_manifest/AndroidManifest.xml -->
- <!-- Ticl sender. -->
- <service android:exported="false" android:name="com.google.ipc.invalidation.ticl.android2.channel.AndroidMessageSenderService"/>
- <!-- Merged from file: blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-opt/bin/java/com/google/ipc/invalidation/external/client/contrib/android_listener_manifest/AndroidManifest.xml -->
- <!-- GCM multiplexer -->
- <service android:exported="false" android:name="com.google.ipc.invalidation.external.client.contrib.MultiplexingGcmListener">
- <meta-data android:name="sender_ids" android:value="[email protected]"/>
- </service>
- <!-- Merged from file: blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-opt/bin/java/com/google/ipc/invalidation/external/client/contrib/android_listener_manifest/AndroidManifest.xml -->
- <!-- Invalidation service multiplexed GCM receiver -->
- <service android:enabled="true" android:exported="false" android:name="com.google.ipc.invalidation.ticl.android2.channel.AndroidMessageReceiverService"/>
- </application>
- <!-- Merged from file: blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-opt/bin/java/com/google/ipc/invalidation/external/client/contrib/android_listener_manifest/AndroidManifest.xml -->
- <!-- App receives GCM messages. -->
- <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
- <!-- Merged from file: blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-opt/bin/java/com/google/ipc/invalidation/external/client/contrib/android_listener_manifest/AndroidManifest.xml -->
- <!-- GCM connects to Google Services. -->
- <uses-permission android:name="android.permission.INTERNET"/>
- <!-- Merged from file: blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-opt/bin/java/com/google/ipc/invalidation/external/client/contrib/android_listener_manifest/AndroidManifest.xml -->
- <!-- GCM requires a Google account. -->
- <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
- <!-- Merged from file: blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-opt/bin/java/com/google/ipc/invalidation/external/client/contrib/android_listener_manifest/AndroidManifest.xml -->
- <!-- Merged from file: java/com/google/ipc/invalidation/external/client/android2/AndroidManifest.xml -->
- <uses-permission android:name="android.permission.USE_CREDENTIALS"/>
- <!-- Merged from file: blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-opt/bin/java/com/google/ipc/invalidation/external/client/contrib/android_listener_manifest/AndroidManifest.xml -->
- <!-- Keeps the processor from sleeping when a message is received. -->
- <uses-permission android:name="android.permission.WAKE_LOCK"/>
-</manifest>
diff --git a/javaexample/com/google/ipc/invalidation/examples/android2/ExampleListener.java b/javaexample/com/google/ipc/invalidation/examples/android2/ExampleListener.java
deleted file mode 100644
index 3510c13..0000000
--- a/javaexample/com/google/ipc/invalidation/examples/android2/ExampleListener.java
+++ /dev/null
@@ -1,477 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.ipc.invalidation.examples.android2;
-
-import com.google.ipc.invalidation.examples.android2.ExampleListenerProto.ExampleListenerStateProto.ObjectIdProto;
-import com.google.ipc.invalidation.external.client.InvalidationClientConfig;
-import com.google.ipc.invalidation.external.client.InvalidationListener.RegistrationState;
-import com.google.ipc.invalidation.external.client.contrib.AndroidListener;
-import com.google.ipc.invalidation.external.client.types.ErrorInfo;
-import com.google.ipc.invalidation.external.client.types.Invalidation;
-import com.google.ipc.invalidation.external.client.types.ObjectId;
-import com.google.protobuf.nano.InvalidProtocolBufferNanoException;
-import com.google.protobuf.nano.MessageNano;
-
-import android.accounts.Account;
-import android.accounts.AccountManager;
-import android.accounts.AccountManagerFuture;
-import android.accounts.AuthenticatorException;
-import android.accounts.OperationCanceledException;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.Editor;
-import android.os.Bundle;
-import android.util.Base64;
-import android.util.Log;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-
-
-/**
- * Implements the service that handles invalidation client events for this application. It maintains
- * state for all objects tracked by the listener (see {@link ExampleListenerState}). By default, the
- * listener registers an interest in a small number of objects when started, but it responds to
- * registration intents from the main activity (see {@link #createRegisterIntent} and
- * {@link #createUnregisterIntent}) so that registrations can be dynamically managed.
- * <p>
- * Many errors cases in this example implementation are handled by logging errors, which is not the
- * appropriate response in a real application where retries or user notification may be needed.
- *
- */
-public final class ExampleListener extends AndroidListener {
-
- /** The account type value for Google accounts */
- private static final String GOOGLE_ACCOUNT_TYPE = "com.google";
-
- /**
- * This is the authentication token type that's used for invalidation client communication to the
- * server. For real applications, it would generally match the authorization type used by the
- * application.
- */
- private static final String AUTH_TYPE = "android";
-
- /** Name used for shared preferences. */
- private static final String PREFERENCES_NAME = "example_listener";
-
- /** Key used for {@link AndroidListener} state in shared preferences. */
- private static final String ANDROID_LISTENER_STATE_KEY = "android_listener_state";
-
- /** Key used for {@link ExampleListener} state in shared preferences. */
- private static final String EXAMPLE_LISTENER_STATE_KEY = "example_listener_state";
-
- /** The tag used for logging in the listener. */
- private static final String TAG = "TEA2:EL";
-
- /** Ticl client configuration. */
- private static final int CLIENT_TYPE = 4; // Demo client ID.
- private static final byte[] CLIENT_NAME = "TEA2:eetrofoot".getBytes();
-
- // Intent constants.
- private static final String START_INTENT_ACTION = TAG + ":START";
- private static final String STOP_INTENT_ACTION = TAG + ":STOP";
- private static final String REGISTER_INTENT_ACTION = TAG + ":REGISTER";
- private static final String UNREGISTER_INTENT_ACTION = TAG + ":UNREGISTER";
- private static final String OBJECT_ID_EXTRA = "oid";
-
- /** Persistent state for the example listener. */
- private ExampleListenerState exampleListenerState;
-
- public ExampleListener() {
- super();
- }
-
- @Override
- public void onCreate() {
- super.onCreate();
-
- // Deserialize persistent state.
- String data = getSharedPreferences().getString(EXAMPLE_LISTENER_STATE_KEY, null);
- exampleListenerState = ExampleListenerState.deserialize(data);
- }
-
- @Override
- public void onHandleIntent(Intent intent) {
- if (intent == null) {
- return;
- }
-
- boolean handled = tryHandleRegistrationIntent(intent);
- handled = handled || tryHandleStartIntent(intent);
- handled = handled || tryHandleStopIntent(intent);
- if (!handled) {
- super.onHandleIntent(intent);
- }
- }
-
- @Override
- public void informError(ErrorInfo errorInfo) {
- Log.e(TAG, "informError: " + errorInfo);
-
- /***********************************************************************************************
- * YOUR CODE HERE
- *
- * Handling of permanent failures is application-specific.
- **********************************************************************************************/
- }
-
- @Override
- public void ready(byte[] clientId) {
- Log.i(TAG, "ready()");
- exampleListenerState.setClientId(clientId);
- writeExampleListenerState();
- }
-
- @Override
- public void reissueRegistrations(byte[] clientId) {
- Log.i(TAG, "reissueRegistrations()");
- register(clientId, exampleListenerState.getInterestingObjects());
- }
-
- @Override
- public void invalidate(Invalidation invalidation, byte[] ackHandle) {
- Log.i(TAG, "invalidate: " + invalidation);
-
- exampleListenerState.informInvalidation(invalidation.getObjectId(), invalidation.getVersion(),
- invalidation.getPayload(), /* isBackground */ false);
- writeExampleListenerState();
-
- // Do real work here based upon the invalidation
-
- acknowledge(ackHandle);
- }
-
- @Override
- public void invalidateUnknownVersion(ObjectId objectId, byte[] ackHandle) {
- Log.i(TAG, "invalidateUnknownVersion: " + objectId);
-
- exampleListenerState.informUnknownVersionInvalidation(objectId);
- writeExampleListenerState();
-
- // In a real app, the application backend would need to be consulted for object state.
-
- acknowledge(ackHandle);
- }
-
- @Override
- public void invalidateAll(byte[] ackHandle) {
- Log.i(TAG, "invalidateAll");
-
- // Do real work here based upon the invalidation.
- exampleListenerState.informInvalidateAll();
- writeExampleListenerState();
-
- acknowledge(ackHandle);
- }
-
-
- @Override
- public byte[] readState() {
- Log.i(TAG, "readState");
- SharedPreferences sharedPreferences = getSharedPreferences();
- String data = sharedPreferences.getString(ANDROID_LISTENER_STATE_KEY, null);
- return (data != null) ? Base64.decode(data, Base64.DEFAULT) : null;
- }
-
- @Override
- public void writeState(byte[] data) {
- Log.i(TAG, "writeState");
- Editor editor = getSharedPreferences().edit();
- editor.putString(ANDROID_LISTENER_STATE_KEY, Base64.encodeToString(data, Base64.DEFAULT));
- if (!editor.commit()) {
- Log.e(TAG, "failed to write state"); // In a real app, this case would need to handled.
- }
- }
-
- @Override
- public void requestAuthToken(PendingIntent pendingIntent,
- String invalidAuthToken) {
- Log.i(TAG, "requestAuthToken");
-
- // In response to requestAuthToken, we need to get an auth token and inform the invalidation
- // client of the result through a call to setAuthToken. In this example, we block until a
- // result is available. It is also possible to invoke setAuthToken in a callback or when
- // handling an intent.
- AccountManager accountManager = AccountManager.get(getApplicationContext());
-
- // Invalidate the old token if necessary.
- if (invalidAuthToken != null) {
- accountManager.invalidateAuthToken(GOOGLE_ACCOUNT_TYPE, invalidAuthToken);
- }
-
- // Choose an (arbitrary in this example) account for which to retrieve an authentication token.
- Account account = getAccount(accountManager);
-
- try {
- // There are three possible outcomes of the call to getAuthToken:
- //
- // 1. Authentication failure (null result).
- // 2. The user needs to sign in or give permission for the account. In such cases, the result
- // includes an intent that can be started to retrieve credentials from the user.
- // 3. The response includes the auth token, in which case we can inform the invalidation
- // client.
- //
- // In the first case, we simply log and return. The response to such errors is application-
- // specific. For instance, the application may prompt the user to choose another account.
- //
- // In the second case, we start an intent to ask for user credentials so that they are
- // available to the application if there is a future request. An application should listen for
- // the LOGIN_ACCOUNTS_CHANGED_ACTION broadcast intent to trigger a response to the
- // invalidation client after the user has responded. Otherwise, it may take several minutes
- // for the invalidation client to start.
- //
- // In the third case, success!, we pass the authorization token and type to the invalidation
- // client using the setAuthToken method.
- AccountManagerFuture<Bundle> future = accountManager.getAuthToken(account, AUTH_TYPE,
- new Bundle(), false, null, null);
- Bundle result = future.getResult();
- if (result == null) {
- // If the result is null, it means that authentication was not possible.
- Log.w(TAG, "Auth token - getAuthToken returned null");
- return;
- }
- if (result.containsKey(AccountManager.KEY_INTENT)) {
- Log.i(TAG, "Starting intent to get auth credentials");
-
- // Need to start intent to get credentials.
- Intent intent = result.getParcelable(AccountManager.KEY_INTENT);
- int flags = intent.getFlags();
- flags |= Intent.FLAG_ACTIVITY_NEW_TASK;
- intent.setFlags(flags);
- getApplicationContext().startActivity(intent);
- return;
- }
-
- Log.i(TAG, "Passing auth token to invalidation client");
- String authToken = result.getString(AccountManager.KEY_AUTHTOKEN);
- setAuthToken(getApplicationContext(), pendingIntent, authToken, AUTH_TYPE);
- } catch (OperationCanceledException e) {
- Log.w(TAG, "Auth token - operation cancelled", e);
- } catch (AuthenticatorException e) {
- Log.w(TAG, "Auth token - authenticator exception", e);
- } catch (IOException e) {
- Log.w(TAG, "Auth token - IO exception", e);
- }
- }
-
- /** Returns any Google account enabled on the device. */
- private static Account getAccount(AccountManager accountManager) {
- if (accountManager == null) {
- throw new NullPointerException();
- }
- for (Account acct : accountManager.getAccounts()) {
- if (GOOGLE_ACCOUNT_TYPE.equals(acct.type)) {
- return acct;
- }
- }
- throw new RuntimeException("No google account enabled.");
- }
-
- @Override
- public void informRegistrationFailure(byte[] clientId, ObjectId objectId, boolean isTransient,
- String errorMessage) {
- Log.e(TAG, "Registration failure!");
- if (isTransient) {
- // Retry immediately on transient failures. The base AndroidListener will handle exponential
- // backoff if there are repeated failures.
- List<ObjectId> objectIds = new ArrayList<ObjectId>();
- objectIds.add(objectId);
- if (exampleListenerState.isInterestedInObject(objectId)) {
- Log.i(TAG, "Retrying registration of " + objectId);
- register(clientId, objectIds);
- } else {
- Log.i(TAG, "Retrying unregistration of " + objectId);
- unregister(clientId, objectIds);
- }
- }
- }
-
- @Override
- public void informRegistrationStatus(byte[] clientId, ObjectId objectId,
- RegistrationState regState) {
- Log.i(TAG, "informRegistrationStatus");
-
- List<ObjectId> objectIds = new ArrayList<ObjectId>();
- objectIds.add(objectId);
- if (regState == RegistrationState.REGISTERED) {
- if (!exampleListenerState.isInterestedInObject(objectId)) {
- Log.i(TAG, "Unregistering for object we're no longer interested in");
- unregister(clientId, objectIds);
- writeExampleListenerState();
- }
- } else {
- if (exampleListenerState.isInterestedInObject(objectId)) {
- Log.i(TAG, "Registering for an object");
- register(clientId, objectIds);
- writeExampleListenerState();
- }
- }
- }
-
- @Override
- protected void backgroundInvalidateForInternalUse(Iterable<Invalidation> invalidations) {
- for (Invalidation invalidation : invalidations) {
- Log.i(TAG, "background invalidate: " + invalidation);
- exampleListenerState.informInvalidation(invalidation.getObjectId(), invalidation.getVersion(),
- invalidation.getPayload(), /* isBackground */ true);
- writeExampleListenerState();
- }
- }
-
- /** Creates an intent that registers an interest in object invalidations for {@code objectId}. */
- public static Intent createRegisterIntent(Context context, ObjectId objectId) {
- return createRegistrationIntent(context, objectId, /* isRegister */ true);
- }
-
- /** Creates an intent that unregisters for invalidations for {@code objectId}. */
- public static Intent createUnregisterIntent(Context context, ObjectId objectId) {
- return createRegistrationIntent(context, objectId, /* isRegister */ false);
- }
-
- private static Intent createRegistrationIntent(Context context, ObjectId objectId,
- boolean isRegister) {
- Intent intent = new Intent();
- intent.setAction(isRegister ? REGISTER_INTENT_ACTION : UNREGISTER_INTENT_ACTION);
- intent.putExtra(OBJECT_ID_EXTRA, serializeObjectId(objectId));
- intent.setClass(context, ExampleListener.class);
- return intent;
- }
-
- /** Creates an intent that starts the invalidation client. */
- public static Intent createStartIntent(Context context) {
- Intent intent = new Intent();
- intent.setAction(START_INTENT_ACTION);
- intent.setClass(context, ExampleListener.class);
- return intent;
- }
-
- /** Creates an intent that stops the invalidation client. */
- public static Intent createStopIntent(Context context) {
- Intent intent = new Intent();
- intent.setAction(STOP_INTENT_ACTION);
- intent.setClass(context, ExampleListener.class);
- return intent;
- }
-
- private boolean tryHandleRegistrationIntent(Intent intent) {
- final boolean isRegister;
- if (REGISTER_INTENT_ACTION.equals(intent.getAction())) {
- isRegister = true;
- } else if (UNREGISTER_INTENT_ACTION.equals(intent.getAction())) {
- isRegister = false;
- } else {
- // Not a registration intent.
- return false;
- }
-
- // Try to parse object id extra.
- ObjectId objectId = parseObjectIdExtra(intent);
- if (objectId == null) {
- Log.e(TAG, "Registration intent without valid object id extra");
- return false;
- }
-
- // Update example listener state.
- if (isRegister) {
- exampleListenerState.addObjectOfInterest(objectId);
- } else {
- exampleListenerState.removeObjectOfInterest(objectId);
- }
- writeExampleListenerState();
-
- // If the client is ready, perform registration now.
- byte[] clientId = exampleListenerState.getClientId();
- if (clientId == null) {
- Log.i(TAG, "Deferring registration until client is ready");
- } else {
- // Perform registration immediately if we have been assigned a client id.
- List<ObjectId> objectIds = new ArrayList<ObjectId>(1);
- objectIds.add(objectId);
- if (isRegister) {
- register(clientId, objectIds);
- } else {
- unregister(clientId, objectIds);
- }
- }
- return true;
- }
-
- private boolean tryHandleStartIntent(Intent intent) {
- if (START_INTENT_ACTION.equals(intent.getAction())) {
- // Clear the client id since a new one will be provided after the client has started.
- exampleListenerState.setClientId(null);
- writeExampleListenerState();
-
- // Setting this to true allows us to see invalidations that may suppress older invalidations.
- // When this flag is 'false', AndroidListener#invalidateUnknownVersion is called instead of
- // AndroidListener#invalidate when suppression has potentially occurred.
- final boolean allowSuppression = true;
- InvalidationClientConfig config = new InvalidationClientConfig(CLIENT_TYPE, CLIENT_NAME,
- "ExampleListener", allowSuppression);
- startService(AndroidListener.createStartIntent(this, config));
- return true;
- }
- return false;
- }
-
- private boolean tryHandleStopIntent(Intent intent) {
- if (STOP_INTENT_ACTION.equals(intent.getAction())) {
- // Clear the client id since the client is no longer available.
- exampleListenerState.setClientId(null);
- writeExampleListenerState();
- startService(AndroidListener.createStopIntent(this));
- return true;
- }
- return false;
- }
-
- private void writeExampleListenerState() {
- Editor editor = getSharedPreferences().edit();
- editor.putString(EXAMPLE_LISTENER_STATE_KEY, exampleListenerState.serialize());
- if (!editor.commit()) {
- // In a real app, this case would need to handled.
- Log.e(TAG, "failed to write example listener state");
- }
- MainActivity.State.setInfo(exampleListenerState.toString());
- }
-
- private static byte[] serializeObjectId(ObjectId objectId) {
- return MessageNano.toByteArray(ExampleListenerState.serializeObjectId(objectId));
- }
-
- private static ObjectId parseObjectIdExtra(Intent intent) {
- byte[] bytes = intent.getByteArrayExtra(OBJECT_ID_EXTRA);
- if (bytes == null) {
- return null;
- }
- try {
- ObjectIdProto proto = MessageNano.mergeFrom(new ObjectIdProto(), bytes);
- return ExampleListenerState.deserializeObjectId(proto);
- } catch (InvalidProtocolBufferNanoException exception) {
- Log.e(TAG, String.format(Locale.ROOT, "Error parsing object id. error='%s'",
- exception.getMessage()));
- return null;
- }
- }
-
- private SharedPreferences getSharedPreferences() {
- return getApplicationContext().getSharedPreferences(PREFERENCES_NAME, MODE_PRIVATE);
- }
-}
diff --git a/javaexample/com/google/ipc/invalidation/examples/android2/ExampleListenerState.java b/javaexample/com/google/ipc/invalidation/examples/android2/ExampleListenerState.java
deleted file mode 100644
index 12ce9be..0000000
--- a/javaexample/com/google/ipc/invalidation/examples/android2/ExampleListenerState.java
+++ /dev/null
@@ -1,333 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.ipc.invalidation.examples.android2;
-
-import com.google.ipc.invalidation.examples.android2.ExampleListenerProto.ExampleListenerStateProto;
-import com.google.ipc.invalidation.examples.android2.ExampleListenerProto.ExampleListenerStateProto.ObjectIdProto;
-import com.google.ipc.invalidation.examples.android2.ExampleListenerProto.ExampleListenerStateProto.ObjectStateProto;
-import com.google.ipc.invalidation.external.client.types.ObjectId;
-import com.google.protobuf.nano.InvalidProtocolBufferNanoException;
-import com.google.protobuf.nano.MessageNano;
-
-import android.util.Base64;
-import android.util.Log;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-
-/**
- * Wrapper around persistent state for {@link ExampleListener}.
- *
- */
-public class ExampleListenerState {
-
- /** Wrapper around persistent state for an object tracked by the {@link ExampleListener}. */
- private static class ObjectState {
- /** Object id for the object being tracked. */
- final ObjectId objectId;
-
- /** Indicates whether the example listener wants to be registered for this object. */
- boolean isRegistered;
-
- /**
- * Payload of the invalidation with the highest version received so far. {@code null} before
- * any invalidations have been received or after an unknown-version invalidation is received.
- */
- byte[] payload;
-
- /**
- * Highest version invalidation received so far. {@code null} before any invalidations have
- * been received or after an unknown-version invalidation is received.
- */
- Long highestVersion;
-
- /** Wall time in milliseconds at which most recent invalidation was received. */
- Long invalidationTimeMillis;
-
- /** Indicates whether the last invalidation received was a background invalidation. */
- boolean isBackground;
-
- ObjectState(ObjectStateProto objectStateProto) {
- objectId = deserializeObjectId(objectStateProto.objectId);
- isRegistered = objectStateProto.isRegistered;
- payload = objectStateProto.payload;
- highestVersion = objectStateProto.highestVersion;
- invalidationTimeMillis = objectStateProto.invalidationTimeMillis;
- isBackground = objectStateProto.isBackground;
- }
-
- ObjectState(ObjectId objectId, boolean isRegistered) {
- this.objectId = objectId;
- this.isRegistered = isRegistered;
- }
-
- ObjectStateProto serialize() {
- ObjectStateProto proto = new ObjectStateProto();
- proto.objectId = serializeObjectId(objectId);
- proto.isRegistered = isRegistered;
- proto.isBackground = isBackground;
- proto.payload = payload;
- proto.highestVersion = highestVersion;
- proto.invalidationTimeMillis = invalidationTimeMillis;
- return proto;
- }
-
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder();
- toString(builder);
- return builder.toString();
- }
-
- void toString(StringBuilder builder) {
- builder.append(isRegistered ? "REG " : "UNREG ").append(objectId);
- if (payload != null) {
- builder.append(", |payload|=").append(payload.length);
- }
- if (highestVersion != null) {
- builder.append(", highestVersion=").append(highestVersion.longValue());
- }
- if (isBackground) {
- builder.append(", isBackground");
- }
- if (invalidationTimeMillis != null) {
- builder.append(", invalidationTime=").append(new Date(invalidationTimeMillis.longValue()));
- }
- }
- }
-
- /** The tag used for logging in the listener state class. */
- private static final String TAG = "TEA2:ELS";
-
- /** Number of objects we're interested in tracking by default. */
-
- static final int NUM_INTERESTING_OBJECTS = 4;
-
- /** Object source for objects the client is initially tracking. */
- private static final int DEMO_SOURCE = 4;
-
- /** Prefix for object names the client is initially tracking. */
- private static final String OBJECT_ID_PREFIX = "Obj";
-
- /** State for all tracked objects. */
- private final Map<ObjectId, ObjectState> trackedObjects;
-
- /** Client id reported by {@code AndroidListener#ready} call. */
- private byte[] clientId;
-
- private ExampleListenerState(Map<ObjectId, ObjectState> trackedObjects,
- byte[] clientId) {
- if (trackedObjects == null) {
- throw new NullPointerException();
- }
- this.trackedObjects = trackedObjects;
- this.clientId = clientId;
- }
-
- public static ExampleListenerState deserialize(String data) {
- HashMap<ObjectId, ObjectState> trackedObjects = new HashMap<ObjectId, ObjectState>();
- byte[] clientId;
- ExampleListenerStateProto stateProto = tryParseStateProto(data);
- if (stateProto == null) {
- // By default, we're interested in objects with ids Obj1, Obj2, ...
- for (int i = 1; i <= NUM_INTERESTING_OBJECTS; ++i) {
- ObjectId objectId = ObjectId.newInstance(DEMO_SOURCE, (OBJECT_ID_PREFIX + i).getBytes());
- trackedObjects.put(objectId, new ObjectState(objectId, true));
- }
- clientId = null;
- } else {
- // Load interesting objects from state proto.
- for (ObjectStateProto objectStateProto : stateProto.objectState) {
- ObjectState objectState = new ObjectState(objectStateProto);
- trackedObjects.put(objectState.objectId, objectState);
- }
- clientId = stateProto.clientId;
- }
- return new ExampleListenerState(trackedObjects, clientId);
- }
-
- /** Returns proto serialized in data or null if it cannot be decoded. */
- private static ExampleListenerStateProto tryParseStateProto(String data) {
- if (data == null) {
- return null;
- }
- final byte[] bytes;
- try {
- bytes = Base64.decode(data, Base64.DEFAULT);
- } catch (IllegalArgumentException exception) {
- Log.e(TAG, String.format(Locale.ROOT, "Illegal base 64 encoding. data='%s', error='%s'", data,
- exception.getMessage()));
- return null;
- }
- try {
- ExampleListenerStateProto proto =
- MessageNano.mergeFrom(new ExampleListenerStateProto(), bytes);
- return proto;
- } catch (InvalidProtocolBufferNanoException exception) {
- Log.e(TAG, String.format(Locale.ROOT, "Error parsing state bytes. data='%s', error='%s'",
- data, exception.getMessage()));
- return null;
- }
- }
-
- /** Serializes example listener state to string. */
- public String serialize() {
- ExampleListenerStateProto proto = new ExampleListenerStateProto();
- proto.objectState = new ObjectStateProto[trackedObjects.size()];
- int index = 0;
- for (ObjectState objectState : trackedObjects.values()) {
- ObjectStateProto objectStateProto = objectState.serialize();
- proto.objectState[index++] = objectStateProto;
- }
- proto.clientId = clientId;
- return Base64.encodeToString(MessageNano.toByteArray(proto), Base64.DEFAULT);
- }
-
- Iterable<ObjectId> getInterestingObjects() {
- List<ObjectId> interestingObjects = new ArrayList<ObjectId>(trackedObjects.size());
- for (ObjectState objectState : trackedObjects.values()) {
- if (objectState.isRegistered) {
- interestingObjects.add(objectState.objectId);
- }
- }
- return interestingObjects;
- }
-
- byte[] getClientId() {
- return clientId;
- }
-
- /** Sets the client id passed to the example listener via the {@code ready()} call. */
- void setClientId(byte[] value) {
- clientId = value;
- }
-
- /**
- * Returns {@code true} if the state indicates a registration should exist for the given object.
- */
- boolean isInterestedInObject(ObjectId objectId) {
- ObjectState objectState = trackedObjects.get(objectId);
- return (objectState != null) && objectState.isRegistered;
- }
-
- /** Updates state for the given object to indicate it should be registered. */
- boolean addObjectOfInterest(ObjectId objectId) {
- ObjectState objectState = trackedObjects.get(objectId);
- if (objectState == null) {
- objectState = new ObjectState(objectId, true);
- trackedObjects.put(objectId, objectState);
- return true;
- }
-
- if (objectState.isRegistered) {
- return false;
- }
- objectState.isRegistered = true;
- return true;
- }
-
- /** Updates state for the given object to indicate it should not be registered. */
- boolean removeObjectOfInterest(ObjectId objectId) {
- ObjectState objectState = trackedObjects.get(objectId);
- if (objectState == null) {
- return false;
- }
-
- if (objectState.isRegistered) {
- objectState.isRegistered = false;
- return true;
- }
- return false;
- }
-
- /** Updates state for an object after an unknown-version invalidation is received. */
- void informUnknownVersionInvalidation(ObjectId objectId) {
- ObjectState objectState = getObjectStateForInvalidation(objectId);
- objectState.invalidationTimeMillis = System.currentTimeMillis();
- objectState.highestVersion = null;
- objectState.payload = null;
- }
-
- /** Updates state for an object after an invalidation is received. */
- void informInvalidation(ObjectId objectId, long version, byte[] payload,
- boolean isBackground) {
- ObjectState objectState = getObjectStateForInvalidation(objectId);
- if (objectState.highestVersion == null || objectState.highestVersion.longValue() < version) {
- objectState.highestVersion = version;
- objectState.payload = payload;
- objectState.invalidationTimeMillis = System.currentTimeMillis();
- objectState.isBackground = isBackground;
- }
- }
-
- /**
- * Updates state when an invalidate all request is received (unknown version is marked for all
- * objects).
- */
- public void informInvalidateAll() {
- for (ObjectState objectState : trackedObjects.values()) {
- informUnknownVersionInvalidation(objectState.objectId);
- }
- }
-
- /** Returns existing object state for an object or updates state. */
- private ObjectState getObjectStateForInvalidation(ObjectId objectId) {
- ObjectState objectState = trackedObjects.get(objectId);
- if (objectState == null) {
- // Invalidation for unregistered object.
- objectState = new ObjectState(objectId, false);
- trackedObjects.put(objectId, objectState);
- }
- return objectState;
- }
-
- /** Returns an object given its serialized form. */
- static ObjectId deserializeObjectId(ObjectIdProto objectIdProto) {
- return ObjectId.newInstance(objectIdProto.source, objectIdProto.name);
- }
-
- /** Serializes the given object id. */
- static ObjectIdProto serializeObjectId(ObjectId objectId) {
- ObjectIdProto proto = new ObjectIdProto();
- proto.source = objectId.getSource();
- proto.name = objectId.getName();
- return proto;
- }
-
- /** Clears all state for the example listener. */
- void clear() {
- trackedObjects.clear();
- clientId = null;
- }
-
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder();
- if (clientId != null) {
- builder.append("ready!\n");
- }
- for (ObjectState objectState : trackedObjects.values()) {
- objectState.toString(builder);
- builder.append("\n");
- }
- return builder.toString();
- }
-}
diff --git a/javaexample/com/google/ipc/invalidation/examples/android2/MainActivity.java b/javaexample/com/google/ipc/invalidation/examples/android2/MainActivity.java
deleted file mode 100644
index e748ff6..0000000
--- a/javaexample/com/google/ipc/invalidation/examples/android2/MainActivity.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.ipc.invalidation.examples.android2;
-
-import com.google.ipc.invalidation.external.client.contrib.MultiplexingGcmListener;
-import com.google.ipc.invalidation.external.client.types.ObjectId;
-
-import android.app.Activity;
-import android.content.Context;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup.LayoutParams;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import java.nio.charset.Charset;
-
-/**
- * A simple sample application that displays information about object registrations and
- * versions.
- *
- * <p>To submit invalidations, you can run the ExampleServlet:
- *
- * <p><code>
- * blaze run java/com/google/ipc/invalidation/examples:ExampleServlet -- \
- --publisher_spec="" \
- --port=8888 \
- --channel_uri="talkgadget.google.com"
- * </code>
- *
- * <p>and open http://localhost:8888/publisher.
- *
- * <p>Just publish invalidations with ids similar to 'Obj1', 'Obj2', ... 'Obj3'
- *
- */
-public final class MainActivity extends Activity {
-
- /** Tag used in logging. */
- private static final String TAG = "TEA2:MainActivity";
-
- /**
- * Keep track of current registration and object status. This should probably be implemented
- * using intents rather than static state but I don't want to distract from the invalidation
- * client essentials in this example.
- */
- public static final class State {
- private static volatile String info;
- private static volatile MainActivity currentActivity;
-
- public static void setInfo(String info) {
- State.info = info;
- refreshInfo();
- }
- }
-
- /** Text view showing current {@link ExampleListenerState}. */
- private TextView info;
-
- /** Text view used to display error messages. */
- private TextView error;
-
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- Log.i(TAG, "[onCreate] Creating main activity");
- super.onCreate(savedInstanceState);
-
- MultiplexingGcmListener.initializeGcm(this);
-
- // Setup UI.
- LinearLayout layout = new LinearLayout(this);
- layout.setOrientation(LinearLayout.VERTICAL);
- layout.addView(createClientLifetimeButtons(), LayoutParams.WRAP_CONTENT);
- layout.addView(createRegistrationControls(), LayoutParams.WRAP_CONTENT);
- error = new TextView(this);
- layout.addView(error, LayoutParams.WRAP_CONTENT);
- info = new TextView(this);
- layout.addView(info, LayoutParams.WRAP_CONTENT);
- setContentView(layout);
-
- // Remember the current activity since the TICL service in this example communicates via
- // static state.
- State.currentActivity = this;
- Log.i(TAG, "[onCreate] Calling refresh data from main activity");
- refreshInfo();
- }
-
- /** Creates start and stop buttons. */
- private View createClientLifetimeButtons() {
- LinearLayout layout = new LinearLayout(this);
- layout.setOrientation(LinearLayout.HORIZONTAL);
-
- // Start button.
- Button startButton = new Button(this);
- startButton.setText("Start");
- startButton.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- v.getContext().startService(ExampleListener.createStartIntent(v.getContext()));
- }
- });
- layout.addView(startButton, LayoutParams.WRAP_CONTENT);
-
- // Stop button.
- Button stopButton = new Button(this);
- stopButton.setText("Stop");
- stopButton.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- v.getContext().startService(ExampleListener.createStopIntent(v.getContext()));
- }
- });
- layout.addView(stopButton, LayoutParams.WRAP_CONTENT);
-
- return layout;
- }
-
- private View createRegistrationControls() {
- LinearLayout layout = new LinearLayout(this);
- layout.setOrientation(LinearLayout.VERTICAL);
-
- // Create the source text field
- LinearLayout fieldsLayout = new LinearLayout(this);
- fieldsLayout.setOrientation(LinearLayout.HORIZONTAL);
- TextView sourceText = new TextView(this);
- sourceText.setText("source:");
- fieldsLayout.addView(sourceText, LayoutParams.WRAP_CONTENT);
- final EditText sourceField = new EditText(this);
- sourceField.setText("DEMO");
- fieldsLayout.addView(sourceField, LayoutParams.WRAP_CONTENT);
-
- // Create the name text field
- TextView nameText = new TextView(this);
- nameText.setText("name:");
- fieldsLayout.addView(nameText, LayoutParams.WRAP_CONTENT);
- final EditText nameField = new EditText(this);
- nameField.setText("Obj1");
- fieldsLayout.addView(nameField, LayoutParams.WRAP_CONTENT);
- layout.addView(fieldsLayout, LayoutParams.WRAP_CONTENT);
-
- // Shared click listener class for registration (register and unregister).
- abstract class RegistrationClickListener implements OnClickListener {
- @Override
- public void onClick(View v) {
- String sourceText = sourceField.getText().toString();
- // Build object id from relevant fields. Can't use reflection because this is Android.
- final int source;
- if ("DEMO".equals(sourceText)) {
- source = 4;
- } else if ("TEST".equals(sourceText)) {
- source = 2;
- } else {
- error.setText("Unrecognized source: " + sourceText);
- return;
- }
-
- String name = nameField.getText().toString();
- ObjectId objectId =
- ObjectId.newInstance(source, name.getBytes(Charset.forName("UTF-8")));
- performRegistration(v.getContext(), objectId);
- }
-
- abstract void performRegistration(Context context, ObjectId objectId);
- }
-
- // Create the reg/unreg buttons
- LinearLayout buttonsLayout = new LinearLayout(this);
- buttonsLayout.setOrientation(LinearLayout.HORIZONTAL);
- Button regButton = new Button(this);
- regButton.setText("Register");
- regButton.setOnClickListener(new RegistrationClickListener() {
- @Override
- void performRegistration(Context context, ObjectId objectId) {
- context.startService(ExampleListener.createRegisterIntent(context, objectId));
- }
- });
- Button unregButton = new Button(this);
- unregButton.setText("Unregister");
- unregButton.setOnClickListener(new RegistrationClickListener() {
- @Override
- void performRegistration(Context context, ObjectId objectId) {
- context.startService(ExampleListener.createUnregisterIntent(context, objectId));
- }
- });
- buttonsLayout.addView(regButton, LayoutParams.WRAP_CONTENT);
- buttonsLayout.addView(unregButton, LayoutParams.WRAP_CONTENT);
- layout.addView(buttonsLayout, LayoutParams.WRAP_CONTENT);
- return layout;
- }
-
- /** Updates UI with current registration status and object versions. */
- private static void refreshInfo() {
- final MainActivity activity = State.currentActivity;
- if (null != activity) {
- activity.info.post(new Runnable() {
- @Override
- public void run() {
- activity.info.setText(State.info);
- }
- });
- }
- }
-}
diff --git a/javaexample/com/google/ipc/invalidation/examples/android2/example_listener.proto b/javaexample/com/google/ipc/invalidation/examples/android2/example_listener.proto
deleted file mode 100644
index bb6d91e..0000000
--- a/javaexample/com/google/ipc/invalidation/examples/android2/example_listener.proto
+++ /dev/null
@@ -1,30 +0,0 @@
-syntax = "proto2";
-package ipc.invalidation.examples.android2;
-option java_package = "com.google.ipc.invalidation.examples.android2";
-option java_outer_classname = "ExampleListenerProto";
-
-// Persistent state for the example listener.
-message ExampleListenerStateProto {
-
- message ObjectIdProto {
- optional int32 source = 1;
- optional bytes name = 2;
- }
-
- // State related to a particular object being tracked by the listener. See
- // ExampleListenerState#ObjectState for information on fields.
- message ObjectStateProto {
- optional ObjectIdProto object_id = 1;
- optional bool is_registered = 2;
- optional bytes payload = 3;
- optional int64 highest_version = 4;
- optional int64 invalidation_time_millis = 5;
- optional bool is_background = 6;
- }
-
- // List of objects for which state is being tracked.
- repeated ObjectStateProto object_state = 1;
-
- // (Optional) client id passed to the listener in ready() call.
- optional bytes client_id = 2;
-}
diff --git a/javaexample/com/google/ipc/invalidation/examples/android2/proguard.cfg b/javaexample/com/google/ipc/invalidation/examples/android2/proguard.cfg
deleted file mode 100644
index 9533f06..0000000
--- a/javaexample/com/google/ipc/invalidation/examples/android2/proguard.cfg
+++ /dev/null
@@ -1,76 +0,0 @@
-#
-# This file was derived from the Android SDK default configuration in tools/lib/proguard.cfg,
-# with changes/additions explicitly commented where made
-#
--optimizationpasses 5
--dontusemixedcaseclassnames
--dontskipnonpubliclibraryclasses
--dontpreverify
-# Change: SDK defaults + code/allocation/variable required to disable proguard optimization bug
--verbose
--optimizations !code/simplification/arithmetic,!field/*,!class/merging/*,!code/allocation/variable
-
--keep public class * extends android.app.Activity
--keep public class * extends android.app.Application
--keep public class * extends android.app.Service
--keep public class * extends android.content.BroadcastReceiver
--keep public class * extends android.content.ContentProvider
--keep public class * extends android.app.backup.BackupAgentHelper
--keep public class * extends android.preference.Preference
-# Change: not needed
-#-keep public class com.android.vending.licensing.ILicensingService
-
--keepclasseswithmembernames class * {
- native <methods>;
-}
-
--keepclasseswithmembers class * {
- public <init>(android.content.Context, android.util.AttributeSet);
-}
-
--keepclasseswithmembers class * {
- public <init>(android.content.Context, android.util.AttributeSet, int);
-}
-
--keepclassmembers class * extends android.app.Activity {
- public void *(android.view.View);
-}
-
--keepclassmembers enum * {
- public static **[] values();
- public static ** valueOf(java.lang.String);
-}
-
--keep class * implements android.os.Parcelable {
- public static final android.os.Parcelable$Creator *;
-}
-
-#
-# All changes below are additions to the Android SDK defaults, generally for the purposes of
-# suppressing spurious or inconsequential warnings.
-#
-
-# Suppress duplicate warning for system classes; Blaze is passing android.jar
-# to proguard multiple times.
--dontnote android.**
--dontnote java.**
--dontnote javax.**
--dontnote junit.**
--dontnote org.**
--dontnote dalvik.**
--dontnote com.android.internal.**
-
-# Stop warnings about missing unused classes
--dontwarn com.google.common.annotations.**
--dontwarn com.google.common.base.**
--dontwarn com.google.common.collect.**
--dontnote com.google.common.flags.**
--dontwarn com.google.common.flags.**
--dontwarn com.google.common.util.concurrent.**
-
-# Ignore missing JDK6 classes
--dontwarn java.**
-
-# Inverting these produces significant size gains but loses significant debug info
--dontobfuscate
-#-flattenpackagehierarchy
diff --git a/proto/android_channel.proto b/proto/android_channel.proto
deleted file mode 100644
index e4a92f5..0000000
--- a/proto/android_channel.proto
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-//
-// The Android delivery service's network endpoint id descriptor.
-// This proto is internal to the Android channel.
-
-syntax = "proto2";
-
-package com.google.protos.ipc.invalidation;
-
-option optimize_for = LITE_RUNTIME;
-
-
-
-option java_outer_classname = "NanoAndroidChannel";
-option java_package = "com.google.protos.ipc.invalidation";
-
-
-import "client_protocol.proto";
-
-// Defines the valid major versions of the android channel protocol. The
-// channel version controls the expected envelope syntax and semantics of
-// http and c2dm messages sent between the client and server.
-enum MajorVersion {
-
- // The initial version of the android channel protocol. Inbound and
- // outbound channel packets contained a single binary protocol message only.
- INITIAL = 0;
-
- // Adds batching (multiple protocol messages in a single channel message)
- BATCH = 1;
-
- // The default channel version used by Android clients. Lower major numbers
- // will represent earlier versions and higher numbers will represent
- // experimental versions that are not yet released.
- DEFAULT = 0;
-
- // The minimum and maximum supported channel major versions. Used to validate
- // incoming requests, so update as new versions are added or old versions are
- // no longer supported.
- MIN_SUPPORTED = 0;
- MAX_SUPPORTED = 1;
-}
-
-// An id that specifies how to route a message to a Ticl on an Android device
-// via C2DM.
-message AndroidEndpointId {
- // Field 1 was once the ProtocolVersion of this message.
-
- // The "registration_id" returned when the client registers with c2dm. This
- // id is required by c2dm in order to send a message to the device.
- optional string c2dm_registration_id = 2;
-
- // A key identifying a specific client on a device.
- optional string client_key = 3;
-
- // The C2DM sender ID to use to deliver messages to the endpoint.
- optional string sender_id = 4 [deprecated = true];
-
- // Defines the expected channel version generated by the network endpoint or
- // expected in messages sent from the server.
- optional Version channel_version = 5;
-
- // The package name of the Android application that will receive the messages.
- // Replaces sender_id. Must be set (unless sender_id is set; in which case it
- // must not be set).
- optional string package_name = 6;
-}
-
-// A message addressed to a particular Ticl on an Android device.
-message AddressedAndroidMessage {
- // Client on the device to which the message is destined.
- optional string client_key = 1;
-
- // Message contents (serialized ServerToClientMessage).
- optional bytes message = 2;
-}
-
-// A batch of messages addressed to potentially-different Ticls on the same
-// Android device.
-message AddressedAndroidMessageBatch {
- repeated AddressedAndroidMessage addressed_message = 1;
-}
diff --git a/proto/android_listener.proto b/proto/android_listener.proto
deleted file mode 100644
index dd16a83..0000000
--- a/proto/android_listener.proto
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-//
-// Specification of protocols used by the AndroidListener abstraction.
-//
-// Note: unless otherwise specified in a comment, all fields in all messages
-// are required, even though they are listed as optional.
-
-syntax = "proto2";
-
-package com.google.protos.ipc.invalidation;
-
-option optimize_for = LITE_RUNTIME;
-
-
-option java_outer_classname = "NanoAndroidListenerProtocol";
-option java_package = "com.google.protos.ipc.invalidation";
-
-
-import "client.proto";
-import "client_protocol.proto";
-
-// Used to persist internal state between instantiations of Android listener
-// objects.
-message AndroidListenerState {
- // When a registration request has failed, we track state for that object that
- // allows retries to be delayed using exponential backoff.
- message RetryRegistrationState {
- // Identifier of the object for which there has been a failure.
- optional ObjectIdP object_id = 1;
-
- // State of exponential backoff delay generator that is used to delay any
- // registration retries for the object.
- optional ExponentialBackoffState exponential_backoff_state = 2;
- }
-
- // Set of object ids tracking the application's desired registrations.
- repeated ObjectIdP registration = 1;
-
- // Set of states for registrations retries. When there is a transient
- // registration failure relative to an object, an entry is added. If
- // registration is successful or the user gives up on the request, the entry
- // is removed.
- repeated RetryRegistrationState retry_registration_state = 2;
-
- // Identifier of client with which this listener is associated. This client ID
- // is randomly generated by the Android listener whenever a new client is
- // started and has no relationship to 's application client ID.
- optional bytes client_id = 3;
-
- // Sequence number for alarm manager request codes. Sequence numbers are
- // assigned serially for each distinct client_id. This value indicates
- // the request code used for the last request.
- optional int32 request_code_seq_num = 4;
-}
-
-// Represents a command that registers or unregisters a set of objects. The
-// command may be initiated by the application or by the Android listener when
-// there is a registration failure.
-message RegistrationCommand {
- // Indicates whether this is a register command (when true) or unregister
- // (when false) request.
- optional bool is_register = 1;
-
- // Identifies the objects to register or unregister.
- repeated ObjectIdP object_id = 2;
-
- // Identifier of client with which this listener is associated.
- optional bytes client_id = 3;
-
- // Indicates whether this is a delayed registration command. When a
- // registration command intent is handled by the Android listener, this field
- // is used to determine whether the command has been delayed yet or not. If it
- // has not already been delayed, the listener may choose to defer the command
- // until later.
- optional bool is_delayed = 4;
-}
-
-// Represents a command that starts an Android invalidation client.
-message StartCommand {
- // Type of client to start.
- optional int32 client_type = 1;
-
- // Name of client to start.
- optional bytes client_name = 2;
-
- // Whether suppression is permitted for this client.
- optional bool allow_suppression = 3;
-}
-
diff --git a/proto/android_service.proto b/proto/android_service.proto
deleted file mode 100644
index e52b7d3..0000000
--- a/proto/android_service.proto
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-//
-// Specification of protocol buffers that are used with the Android
-// service.
-//
-// Note: unless otherwise specified in a comment, all fields in all messages
-// are required, even though they are listed as optional.
-
-syntax = "proto2";
-
-package com.google.protos.ipc.invalidation;
-
-option optimize_for = LITE_RUNTIME;
-
-
-
-option java_outer_classname = "NanoAndroidService";
-option java_package = "com.google.protos.ipc.invalidation";
-
-
-
-import "client_protocol.proto";
-import "java_client.proto";
-
-// Call from application to Ticl.
-//
-// Android service messages are typically validated. Validation rules may be
-// declared in ClientProtoWrapperGenerator.java.
-
-message ClientDowncall {
- message StartDowncall {}
- message StopDowncall {}
- message AckDowncall {
- optional bytes ack_handle = 1;
- }
- message RegistrationDowncall {
- repeated ObjectIdP registrations = 1;
- repeated ObjectIdP unregistrations = 2;
- }
-
- // Serial number to prevent intent reordering.
- // TODO: use.
- optional int64 serial = 1;
- optional Version version = 2;
-
- // Exactly one of the following fields must be set.
- optional StartDowncall start = 3;
- optional StopDowncall stop = 4;
- optional AckDowncall ack = 5;
- optional RegistrationDowncall registrations = 6;
-}
-
-// Internal (non-public) call from application to Ticl.
-message InternalDowncall {
- message ServerMessage {
- optional bytes data = 1;
- }
- message NetworkStatus {
- optional bool is_online = 1;
- }
- message CreateClient {
- optional int32 client_type = 1; // client type code.
- optional bytes client_name = 2; // application client id.
- optional ClientConfigP client_config = 3; // Client config.
-
- // Whether the client should not be started on creation. Must always be
- // false for production use.
- optional bool skip_start_for_test = 4;
- }
- optional Version version = 1;
-
- // Exactly one must be set.
- optional ServerMessage server_message = 2;
- optional NetworkStatus network_status = 3;
- optional bool network_addr_change = 4;
- optional CreateClient create_client = 5;
-}
-
-// Upcall from Ticl to application listener.
-
-message ListenerUpcall {
- message ReadyUpcall {}
-
- message InvalidateUpcall {
- // Required.
- optional bytes ack_handle = 1;
-
- // Exactly one must be set.
- optional InvalidationP invalidation = 2;
- optional ObjectIdP invalidate_unknown = 3;
- optional bool invalidate_all = 4;
- }
-
- message RegistrationStatusUpcall {
- optional ObjectIdP object_id = 1;
- optional bool is_registered = 2;
- }
-
- message RegistrationFailureUpcall {
- optional ObjectIdP object_id = 1;
- optional bool transient = 2;
- optional string message = 3;
- }
-
- message ReissueRegistrationsUpcall {
- optional bytes prefix = 1;
- optional int32 length = 2;
- }
-
- message ErrorUpcall {
- optional int32 error_code = 1;
- optional string error_message = 2;
- optional bool is_transient = 3;
- }
-
- // Serial number to prevent intent reordering. Not currently used.
- // TODO: use
- optional int64 serial = 1;
- optional Version version = 2;
-
- // Exactly one must be sent.
- optional ReadyUpcall ready = 3;
- optional InvalidateUpcall invalidate = 4;
- optional RegistrationStatusUpcall registration_status = 5;
- optional RegistrationFailureUpcall registration_failure = 6;
- optional ReissueRegistrationsUpcall reissue_registrations = 7;
- optional ErrorUpcall error = 8;
-}
-
-// Internal proto used by the Android scheduler to represent an event to run.
-message AndroidSchedulerEvent {
- optional Version version = 1;
-
- // Name of the recurring task to execute.
- optional string event_name = 2;
-
- // Generation number of the Ticl with which this event is associated. Used to
- // prevent old events from accidentally firing on new Ticls.
- optional int64 ticl_id = 3;
-}
-
-// Internal proto used by the Android network to represent a message to send
-// to the data center from the client.
-message AndroidNetworkSendRequest {
- optional Version version = 1; // Required
- optional bytes message = 2; // Required
-}
-
-// Protocol buffer used to store state for a persisted Ticl.
-message AndroidTiclState {
- message Metadata {
- // All fields are required.
- optional int32 client_type = 1; // client type code.
- optional bytes client_name = 2; // application client id.
- optional int64 ticl_id = 3; // Ticl uniquifier.
- optional ClientConfigP client_config = 4; // client config.
- }
- optional Version version = 1;
- optional InvalidationClientState ticl_state = 2; // Marshalled Ticl.
- optional Metadata metadata = 3; // Extra state needed to construct a Ticl.
-}
-
-// An AndroidTiclState state plus a digest; this is the protocol buffer actually
-// stored persistently by the service.
-message AndroidTiclStateWithDigest {
- optional AndroidTiclState state = 1;
- optional bytes digest = 2; // Digest of "state."
-}
diff --git a/proto/channel_common.proto b/proto/channel_common.proto
deleted file mode 100644
index c68ac74..0000000
--- a/proto/channel_common.proto
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-//
-// Common utilities used by all channel related protos.
-// This is also publicly visible to all channel implementors.
-
-syntax = "proto2";
-
-package com.google.protos.ipc.invalidation;
-
-option optimize_for = LITE_RUNTIME;
-
-
-
-option java_outer_classname = "NanoChannelCommon";
-option java_package = "com.google.protos.ipc.invalidation";
-
-
-
-message ChannelMessageEncoding {
- // What kind of encoding is used for network_message
- enum MessageEncoding {
- // Raw proto encoding
- PROTOBUF_BINARY_FORMAT = 1;
-
- }
-}
-
-message NetworkEndpointId {
- enum NetworkAddress {
- TEST = 1; // A delivery service for testing
-
- // Low numbers reserved.
- ANDROID = 113; // Android delivery service using c2dm / http.
- LCS = 114; // Lightweight connection service () channel.
- }
- optional NetworkAddress network_address = 1;
- optional bytes client_address = 2;
-
- // Optional. When true, the client is considered offline but the
- // client_address is maintained so that the client can potentially be reached.
- // When false or undefined, the client is considered online.
- optional bool is_offline = 3;
-}
diff --git a/proto/client.proto b/proto/client.proto
deleted file mode 100644
index b81c7f0..0000000
--- a/proto/client.proto
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-//
-// Specification of protocol buffers that are used only on the client
-// side.
-//
-// Note: unless otherwise specified in a comment, all fields in all messages
-// are required, even though they are listed as optional.
-
-syntax = "proto2";
-
-package com.google.protos.ipc.invalidation;
-
-option optimize_for = LITE_RUNTIME;
-
-
-
-option java_outer_classname = "NanoClient";
-option java_package = "com.google.protos.ipc.invalidation";
-
-
-
-import "client_protocol.proto";
-
-// An object that is serialized and given to clients for acknowledgement
-// purposes.
-message AckHandleP {
- optional InvalidationP invalidation = 1;
-}
-
-// The state persisted at a client so that it can be used after a reboot.
-message PersistentTiclState {
- // Last token received from the server (required).
- optional bytes client_token = 1;
-
- // Last time a message was sent to the server (optional). Must be a value
- // returned by the clock in the Ticl system resources.
- optional int64 last_message_send_time_ms = 2 [default = 0];
-}
-
-// An envelope containing a Ticl's internal state, along with a digest of the
-// serialized representation of this state, to ensure its integrity across
-// reads and writes to persistent storage.
-message PersistentStateBlob {
- // The (important parts of the) Ticl's internal state.
- optional PersistentTiclState ticl_state = 1;
-
- // Implementation-specific message authentication code for the Ticl state.
- optional bytes authentication_code = 2;
-}
-
-// State of a Ticl RunState.
-message RunStateP {
- enum State {
- NOT_STARTED = 1;
- STARTED = 2;
- STOPPED = 3;
- }
- optional State state = 1;
-}
-
-// Fields in this message correspond directly to fields in
-// ExponentialBackoffDelayGenerator.
-message ExponentialBackoffState {
- optional int32 current_max_delay = 1;
- optional bool in_retry_mode = 2;
-}
diff --git a/proto/client_protocol.proto b/proto/client_protocol.proto
deleted file mode 100644
index dabbc05..0000000
--- a/proto/client_protocol.proto
+++ /dev/null
@@ -1,619 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-//
-// Specification of protocol buffers and the client-server protocol that
-// are used by the clients of the system.
-//
-// Note: unless otherwise specified in a comment, all fields in all messages
-// are required, even though they are listed as optional.
-
-syntax = "proto2";
-
-package com.google.protos.ipc.invalidation;
-
-option optimize_for = LITE_RUNTIME;
-
-
-
-option java_outer_classname = "NanoClientProtocol";
-option java_package = "com.google.protos.ipc.invalidation";
-
-
-
-// Here is a high-level overview of the protocol. The protocol is designed in a
-// "message-passing" style, i.e., the client (C) or the server (S) can send any
-// message SPONTANEOUSLY at any time and both sides have to be prepared for any
-// message from the other side. However, even with this style, there are some
-// "flows" which are somewhat like requests and replies.
-
-// 1. Initialization: When a client starts up, it needs a token to alow it to
-// perform any other operation with the server.
-// C -> S: InitializeMessage
-// S -> C: TokenControlMessage
-//
-// 2. Registration: When a client has to register or unregister for a set of
-// objects, the following flow occurs:
-// C -> S: RegistrationMessage
-// S -> C: RegistrationStatusMessage
-//
-// 3. Invalidation: The server sends an invalidation and the client sends back
-// an ack.
-// S -> C InvalidationMessage
-// C -> S InvalidationMessage
-//
-// 4. Registration sync: Once in a while the server may detect that the client
-// and server's registration state is out of sync (the server can detect this
-// since it gets the client's registration summary in the client's message
-// header). In that case, it asks the client some registration information
-// and the client sends it to the server.
-// S -> C: RegistrationSyncRequestMessage
-// C -> S: RegistrationSyncMessage
-//
-// 5. Information messages: The server can occasionally for client-side
-// information such as statistics, etc. The client responds with the
-// requested information
-// S -> C: InfoRequestMessage
-// C -> S: InfoMessage
-//
-// Client protocol messages are typically validated. Validation rules may be
-// declared in the following locations when making changes to this file:
-//
-// 1. TiclMessageValidator2.java: validation logic that is run on the
-// server.
-//
-// 2. ClientProtoWrapperGenerator.java: validation logic that is run
-// on the client.
-// ------------------------------------------------------------------------
-
-// A basic message type used for versioning public proto messages and/or
-// types. The two fields are supposed to be used as follows:
-//
-// * The major version number is changed whenever an incompatible protocol
-// change or type has been made. When a message/object with a particular
-// major version is received, the receiver needs to either know how to handle
-// this version or it needs to drop the message
-//
-// * The minor version can be changed (say) to document some internal change
-// for debugging purposes. When a message is received by a receiver, it MUST
-// ignore the minor version number for making any protocol/type
-// decisions. I.e., the minor version number is for debugging purposes only.
-//
-// Versioning is used in various places - for entities that are part of a
-// protocol (e.g., message requests), for various client implementations, and
-// for other data types that change independently of the protocol (e.g.,
-// session tokens). For each versioned entity, we define a specific message
-// type to encapsulate the version of that entity (e.g., ProtocolVersion,
-// ClientVersion, etc.).
-message Version {
- optional int32 major_version = 1;
- optional int32 minor_version = 2;
-}
-
-// Message included in all client <-> server messages to indicate the version
-// of the protocol in use by the sender.
-message ProtocolVersion {
- optional Version version = 1;
-}
-
-// Defines a specific version of the client library (for information purposes
-// only) May not be used to make decisions at the server (use ProtocolVersion
-// instead).
-message ClientVersion {
-
- // A client-specific version number.
- optional Version version = 1;
-
- // All fields below are for informational/debugging/monitoring purposes only.
- // No critical code decision is supposed to be made using them.
-
- // Optional: information about the client operating system/platform, e.g.,
- // Windows, ChromeOS.
- optional string platform = 2;
-
- // Optional: language used for the library.
- optional string language = 3;
-
- // Optional: extra information about the client (e.g., application name).
- optional string application_info = 4;
-}
-
-// Message indicating the result of an operation.
-message StatusP {
-
- // Whether operation is successful or not
- enum Code {
- SUCCESS = 1;
- TRANSIENT_FAILURE = 2;
- PERMANENT_FAILURE = 3;
- }
-
- optional Code code = 1;
-
- // Textual description of the status or additional context about any
- // error. (Optional - Can be set for success also.)
- optional string description = 2;
-}
-
-// Identifies an object that a client can register for.
-message ObjectIdP {
-
- // The source of the data.
- optional int32 source = 1;
-
- // The id of the object relative to the source. Must be <= 64 bytes.
- optional bytes name = 2;
-}
-
-// A message containing the part of the client's id that the application
-// controls. This id is used for squelching invalidations on the server side.
-// For example, if a client C1 modifies object x and informs the backend about
-// C1's application client id as part of the invalidation. The backend can then
-// avoid sending the invalidation unnecessarily to that client.
-//
-// If the application wishes to use this squelching feature, it must assign a
-// globally unique client_name for a given client_type so that the particular
-// instantation of the application can be identified.
-message ApplicationClientIdP {
- // The type of the client.
- optional int32 client_type = 1;
-
- // A client name or unique id assigned by the application. Application should
- // choose a unique name for different client instances if it wants to squelch
- // invalidations by name (as discussed above).
- optional bytes client_name = 2;
-}
-
-// Invalidation for a given object/version.
-message InvalidationP {
- // The id of the object being invalidated.
- optional ObjectIdP object_id = 1;
-
- // Whether the invalidation is for a known version of the object as assigned
- // by an application backend (is_known_version == true) or an unknown system
- // version synthesized by the invalidation service. (Note that if
- // is_known_version is false then is_trickle_restart be true or missing
- // because an unknown version implies that invalidation versions prior to the
- // current backend version may have been dropped.)
- optional bool is_known_version = 2;
-
- // Version being invalidated (see comment on is_known_version). If the
- // is_known_version is false, the version corresponds to an internal "system
- // version" for *that* object. An object's system version has no meaning to
- // the application other than the fact that these system versions are also
- // monotonically increasing and the client must ack such an invalidation with
- // this system version (and an ack for a later system version acknowledges an
- // invalidation for all earlier system version for *that* object.
- optional int64 version = 3;
-
- // Whether the object's Trickle is restarting at this version.
- // sets this value to true to inform Trickle API clients that it may
- // have dropped invalidations prior to "version", or, if is_known_version is
- // false, prior to the current backend version. This field is logically
- // required and is always set by current code. The default is true because
- // old Android invalidation clients strip this field when acking
- // invalidations due to ProtoLite limitations; true is the correct default
- // because invalidation clients logically ack all current versions and
- // because old persisted invalidations are all restarted.
- optional bool is_trickle_restart = 6 [default = true];
-
- // Optional payload associated with this invalidation.
- optional bytes payload = 4;
-
- // DEPRECATED: bridge arrival time is now maintained by
- // InvalidationMetadataP in the SourcedInvalidation, InvalidationContents and
- // ClientInvalidation containers.
- optional int64 bridge_arrival_time_ms_deprecated = 5 [deprecated=true];
-}
-
-// Specifies the intention to change a registration on a specific object. To
-// update registrations, a client sends a message containing repeated
-// RegistrationP messages.
-message RegistrationP {
- enum OpType {
- REGISTER = 1;
- UNREGISTER = 2;
- }
-
- // The object for which to (un)register.
- optional ObjectIdP object_id = 1;
-
- // Whether to register or unregister.
- optional OpType op_type = 2;
-}
-
-// Summary of the registration state associated with a particular client, sent
-// in the header of client<->server messages. This summary has two different
-// (but related) meanings depending on where it is used:
-//
-// 1) In a client->server message, it describes the DESIRED client state.
-// 2) In a server->client message, it describes the ACTUAL state at the server
-// for that client.
-message RegistrationSummary {
- // Number of registrations desired (client) or held (server).
- optional int32 num_registrations = 1;
-
- // Top-level digest over the registrations.
- //
- // The digest for an object id is computed as following (the digest chosen for
- // this method is SHA-1):
- //
- // digest = new Digest();
- // digest.update(Little endian encoding of object source type)
- // digest.update(object name)
- // digest.getDigestSummary()
- //
- // For a set of objects, digest is computing by sorting lexicographically
- // based on their digests and then performing the update process given above
- // (i.e., calling digest.update on each object's digest and then calling
- // getDigestSummary at the end).
- optional bytes registration_digest = 2;
-}
-
-// Header included on every client -> server message.
-message ClientHeader {
-
- // Protocol version of this message.
- optional ProtocolVersion protocol_version = 1;
-
- // Token identifying the client. Tokens are issued by the server in response
- // to client requests (see InitializeMessage, below). In order to perform any
- // operation other than initialization, the client must supply a token. When
- // performing initialization, this field must be left unset.
- optional bytes client_token = 2;
-
- // Optional summary of the client's desired registration state. The client is
- // encouraged to provide this summary in every message once a "steady" state
- // of registrations/unregistrations has been reached. For example, it may not
- // want to send this summary during initialization (but after the initial set
- // has been registered, it should try to send it).
- optional RegistrationSummary registration_summary = 3;
-
- // Timestamp from the client's clock, expressed as ms since 00:00:00 UTC, 1
- // January 1970 (i.e., the UNIX epoch) - for debugging/monitoring purposes.
- optional int64 client_time_ms = 4;
-
- // Highest server timestamp observed by the client (the server includes its
- // time on every message to the client). Note: this time is NOT necessarily
- // expressed as relative to the UNIX epoch - for debugging/monitoring
- // purposes.
- optional int64 max_known_server_time_ms = 5;
-
- // Message id to identify the message -for debugging/monitoring purposes.
- optional string message_id = 6;
-
- // Client typecode (as in the InitializeMessage, below). This field may or
- // may not be set.
- optional int32 client_type = 7;
-}
-
-// A message from the client to the server.
-message ClientToServerMessage {
- // Header.
- optional ClientHeader header = 1;
-
- // Any or all of the follow messages may be present.
-
- // Optional initialization message, used to obtain a new token. Note that, if
- // present, this message is always processed before the messages below, and
- // those messages will be interpreted relative to the new token assigned here.
- optional InitializeMessage initialize_message = 2;
-
- // Optional request to perform registrations.
- optional RegistrationMessage registration_message = 3;
-
- // Optional data for registration sync.
- optional RegistrationSyncMessage registration_sync_message = 4;
-
- // Optional invalidation acks.
- optional InvalidationMessage invalidation_ack_message = 5;
-
- // Optional information about the client.
- optional InfoMessage info_message = 6;
-}
-
-// Used to obtain a new token when the client does not have one.
-message InitializeMessage {
-
- // Defines how clients serialize object ids when computing digests for
- // registrations.
- enum DigestSerializationType {
-
- // The digest for an object id is computed by serializing the object id into
- // bytes.
- BYTE_BASED = 1;
-
- // The digest for an object id is computed by serializing the object id into
- // an array of numbers. TODO: Determine and specify this
- // more precisely.
- NUMBER_BASED = 2;
- }
-
- // Type of the client. This value is assigned by the backend notification
- // system (out-of-band) and the client must use the correct value.
- optional int32 client_type = 1;
-
- // Nonce. This value will be echoed as the existing token in the header of
- // the server message that supplies the new token (the new token itself will
- // be provided in a TokenControlMessage; see below).
- optional bytes nonce = 2;
-
- // Id of the client as assigned by the application.
- optional ApplicationClientIdP application_client_id = 3;
-
- // Type of registration digest used by this client.
- optional DigestSerializationType digest_serialization_type = 4;
-}
-
-// Registration operations to perform.
-message RegistrationMessage {
- repeated RegistrationP registration = 1;
-}
-
-// Message from the client to the server.
-message RegistrationSyncMessage {
-
- // Objects for which the client is registered.
- repeated RegistrationSubtree subtree = 1;
-}
-
-// Message sent from the client to the server about registered objects
-// (typically) in response to a registration sync request.
-//
-// The name of the message implies a "tree" for future expansion where the
-// intention is to not necessarily send the complete set of objects but to
-// partition the object space into multiple ranges and then exchange Merkle-tree
-// like data structures to determine which ranges are out-of-sync.
-message RegistrationSubtree {
- // Registered objects
- repeated ObjectIdP registered_object = 1;
-}
-
-// A message from the client to the server with info such as performance
-// counters, client os info, etc.
-message InfoMessage {
- optional ClientVersion client_version = 1;
-
- // Config parameters used by the client.
- // Deprecated and removed - the client_config parameter is what is used now.
- repeated PropertyRecord config_parameter = 2;
-
- // Performance counters from the client.
- repeated PropertyRecord performance_counter = 3;
-
- // If 'true', indicates that the client does not know the server's
- // registration summary, so the server should respond with it even if the
- // client's summary matches the server's.
- optional bool server_registration_summary_requested = 4;
-
- // Configuration parameters for this client.
- optional ClientConfigP client_config = 5;
-}
-
-// Information about a single config/performance counter value in the
-// InfoMessage.
-message PropertyRecord {
-
- // Name of the performance counter/config parameter.
- optional string name = 1;
-
- // Value of the performance counter/config parameter.
- optional int32 value = 2;
-}
-
-message ServerHeader {
- // Protocol version of this message.
- optional ProtocolVersion protocol_version = 1;
-
- // Current token that the server expects the client to have. Clients must
- // ignore messages where this token field does not match their current token.
- // During initialization, the client's "token" is the nonce that it generates
- // and sends in the InitializeMessage.
- optional bytes client_token = 2;
-
- // Summary of registration state held by the server for the client.
- optional RegistrationSummary registration_summary = 3;
-
- // Timestamp from the server's clock. No guarantee on when this time is
- // relative to.
- optional int64 server_time_ms = 4;
-
- // Message id to identify the message (for debug purposes only).
- optional string message_id = 5;
-}
-
-// If ServerToClientMessage is modified, you need to change the type
-// TestServerToClientMessageWithExtraFields in the same way to match.
-message ServerToClientMessage {
- optional ServerHeader header = 1;
-
- // Message to assign a new client token or invalidate an existing one. Note
- // that, if present, this message is always processed before the messages
- // below, and those messages will be interpreted relative to the new token
- // assigned here.
- optional TokenControlMessage token_control_message = 2;
-
- // Invalidations.
- optional InvalidationMessage invalidation_message = 3;
-
- // Registration operation replies.
- optional RegistrationStatusMessage registration_status_message = 4;
-
- // Request for client registration state.
- optional RegistrationSyncRequestMessage registration_sync_request_message = 5;
-
- // Request to change config from the server.
- optional ConfigChangeMessage config_change_message = 6;
-
- // Request for client information.
- optional InfoRequestMessage info_request_message = 7;
-
- // Asynchronous error information that the server sends to the client.
- optional ErrorMessage error_message = 8;
-}
-
-// Message used to supply a new client token or invalidate an existing one.
-message TokenControlMessage {
- // If status is failure, new_token cannot be set.
- optional bytes new_token = 1; // If missing, means destroy_token
-}
-
-// Status of a particular registration (could be sent spontaneously by the
-// server or in response to a registration request).
-message RegistrationStatus {
- optional RegistrationP registration = 1;
- optional StatusP status = 2;
-}
-
-// Registration status of several messages from the server to the client.
-message RegistrationStatusMessage {
- repeated RegistrationStatus registration_status = 1;
-}
-
-// Request from the server to get the registration info from the client for
-// sync purposes.
-message RegistrationSyncRequestMessage {
-}
-
-// A set of invalidations from the client to the server or vice-versa
-message InvalidationMessage {
- repeated InvalidationP invalidation = 1;
-}
-
-// A request from the server to the client for information such as
-// performance counters, client os, etc
-message InfoRequestMessage {
- enum InfoType {
- GET_PERFORMANCE_COUNTERS = 1;
- }
- repeated InfoType info_type = 1;
-}
-
-// A rate limit: a count of events and a window duration in which the events
-// may occur.
-message RateLimitP {
-
- // The size of the window over which the rate limit applies.
- optional int32 window_ms = 1;
-
- // The number of events allowed within a given window.
- optional int32 count = 2;
-}
-
-// Configuration parameters for the protocol handler in the Ticl.
-message ProtocolHandlerConfigP {
- // Batching delay - certain messages (e.g., registrations, invalidation acks)
- // are sent to the server after this delay.
- optional int32 batching_delay_ms = 1 [default = 500];
-
- // Rate limits for sending messages. Only two levels allowed currently.
- repeated RateLimitP rate_limit = 2;
-}
-
-// Configuration parameters for the Ticl.
-message ClientConfigP {
-
- optional Version version = 1;
-
- // The delay after which a network message sent to the server is considered
- // timed out.
- optional int32 network_timeout_delay_ms = 2 [default = 60000];
-
- // Retry delay for a persistent write if it fails
- optional int32 write_retry_delay_ms = 3 [default = 10000];
-
- // Delay for sending heartbeats to the server.
- optional int32 heartbeat_interval_ms = 4 [default = 1200000];
-
- // Delay after which performance counters are sent to the server.
- optional int32 perf_counter_delay_ms = 5 [default = 21600000]; // 6 hours.
-
- // The maximum exponential backoff factor used for network and persistence
- /// timeouts.
- optional int32 max_exponential_backoff_factor = 6 [default = 500];
-
- // Smearing percent for randomizing delays.
- optional int32 smear_percent = 7 [default = 20];
-
- // Whether the client is transient, that is, does not write its session
- // token to durable storage.
- // TODO: need to expose to the clients.
- optional bool is_transient = 8 [default = false];
-
- // Initial delay for a heartbeat after restarting from persistent state. We
- // use this so that the application has a chance to respond to the
- // reissueRegistrations call.
- optional int32 initial_persistent_heartbeat_delay_ms = 9 [default = 2000];
-
- // Configuration for the protocol client to control batching etc.
- optional ProtocolHandlerConfigP protocol_handler_config = 10;
-
- // Whether the channel supports delivery while the client is offline. If
- // true, then the servers' use of the channel is such that the
- // following holds: if any number of messages are sent to the client while
- // the client is unreachable, then the channel will eventually deliver at
- // least one message to the client such that, on receiving the message, the
- // client will send a message to the server. E.g., the channel could deliver
- // a single invalidation or a single registration sync request. C2DM is
- // an example of a suitable channel.
- //
- // When this is true, the Ticl will record in persistent storage the last
- // time it sent a message to the server. On persistent restart, it will not
- // send a message to the server unless the last one was sent more than a
- // heartbeat-interval ago. This is designed to support efficient Android
- // clients, which will destroy and recreate the Ticl when transitioning
- // between foreground and background states.
- optional bool channel_supports_offline_delivery = 11 [default = false];
-
- // If the client loses network connectivity, it will send a heartbeat after it
- // comes online, unless it had already sent a message more recently than this
- // threshold.
- optional int32 offline_heartbeat_threshold_ms = 12 [default = 60000];
-
- // Whether the client allows suppression. If true (the default), then
- // both continuous and restarted invalidations result in an invalidate()
- // upcall, which is appropriate for invalidation clients. If false,
- // then restarted invalidations result in an invalidateUnknownVersion()
- // upcall, which provides correct semantics for Trickles clients.
- optional bool allow_suppression = 13 [default = true];
-}
-
-// A message asking the client to change its configuration parameters
-message ConfigChangeMessage {
-
- // On receipt of this value, do not send any new message to the server
- // for the specified delay (this message needs to be accepted without
- // any token check). A zero value is ignored by the client. So the lowest
- // value for this field is 1. This concept exists to allow the server
- // to tell the clients that they should not come back to the server
- // for some period of time.
- optional int64 next_message_delay_ms = 1;
-}
-
-// An error message that contains an enum for different types of failures with a
-// textual description of the failure (as the need arises new error codes will
-// be added to this message).
-message ErrorMessage {
-
- enum Code {
- AUTH_FAILURE = 1; // Authorization or authentication failure.
- UNKNOWN_FAILURE = 10000; // Some failure which is not described above.
- };
-
- optional Code code = 1;
-
- // Textual description of the error
- optional string description = 2;
-}
diff --git a/proto/java_client.proto b/proto/java_client.proto
deleted file mode 100644
index 5c1cbd4..0000000
--- a/proto/java_client.proto
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-//
-// Specification of protocol buffers that are used to marshall the
-// in-memory state of an invalidation client.
-//
-// Note: unless otherwise specified in a comment, all fields in all messages
-// are required, even though they are listed as optional.
-
-syntax = "proto2";
-
-package com.google.protos.ipc.invalidation;
-
-option optimize_for = LITE_RUNTIME;
-
-
-
-option java_outer_classname = "NanoJavaClient";
-option java_package = "com.google.protos.ipc.invalidation";
-
-
-
-import 'client.proto';
-import 'client_protocol.proto';
-
-// State of the batched messages in the ProtocolHandler. Corresponds to
-// ProtocolHandler.Batcher.
-message BatcherState {
- repeated ObjectIdP registration = 1;
- repeated ObjectIdP unregistration = 2;
- repeated InvalidationP acknowledgement = 3;
- repeated RegistrationSubtree registration_subtree = 4;
- optional InitializeMessage initialize_message = 5;
- optional InfoMessage info_message = 6;
-}
-
-// State of the protocol handler. Fields correspond directly to fields in
-// ProtocolHandler.java.
-message ProtocolHandlerState {
- optional int32 message_id = 1;
- optional int64 last_known_server_time_ms = 2;
- optional int64 next_message_send_time_ms = 3;
- optional BatcherState batcher_state = 4;
-}
-
-// State of the registration manager.
-message RegistrationManagerStateP {
- repeated ObjectIdP registrations = 1;
- optional RegistrationSummary last_known_server_summary = 2;
- repeated RegistrationP pending_operations = 3;
-}
-
-// State of a recurring task. Fields correspond directly to fields in
-// RecurringTask.java.
-message RecurringTaskState {
- optional int32 initial_delay_ms = 1;
- optional int32 timeout_delay_ms = 2;
- optional bool scheduled = 3;
- optional ExponentialBackoffState backoff_state = 4;
-}
-
-// State of the statistics object. Marshalling is done by marshalling the
-// SimplePairs returned by Statistics.fillWithNonZeroStatistics into
-// PropertyRecords.
-message StatisticsState {
- repeated PropertyRecord counter = 1;
-}
-
-// State of the invalidation client. Fields correspond directly to fields in
-// InvalidationClientImpl.java.
-message InvalidationClientState {
- optional RunStateP run_state = 1;
- optional bytes client_token = 2;
- optional bytes nonce = 3;
- optional bool should_send_registrations = 4;
- optional int64 last_message_send_time_ms = 5;
- optional bool is_online = 6;
- optional ProtocolHandlerState protocol_handler_state = 7;
- optional RegistrationManagerStateP registration_manager_state = 8;
- optional RecurringTaskState acquire_token_task_state = 9;
- optional RecurringTaskState reg_sync_heartbeat_task_state = 10;
- optional RecurringTaskState persistent_write_task_state = 11;
- optional RecurringTaskState heartbeat_task_state = 12;
- optional RecurringTaskState batching_task_state = 13;
- optional PersistentTiclState last_written_state = 14;
- optional StatisticsState statistics_state = 15;
-}
diff --git a/proto/types.proto b/proto/types.proto
deleted file mode 100644
index e1bba02..0000000
--- a/proto/types.proto
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2011 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Enums definitions for main types in the cache invalidation system.
-
-syntax = "proto2";
-
-
-package com.google.protos.ipc.invalidation;
-
-option optimize_for = LITE_RUNTIME;
-
-// The type of client / application.
-message ClientType {
- enum Type {
- INTERNAL = 1;
- TEST = 2; // Uncontrolled client space for use by anyone for testing.
- DEMO = 4; // A demo client type that can be used for testing.
-
- // Numbers below 1000 are reserved for internal use.
- CHROME_SYNC = 1004;
- CHROME_SYNC_ANDROID = 1018;
- CHROME_SYNC_IOS = 1038;
- CHROME_SYNC_GCM_DESKTOP = 1055;
- CHROME_SYNC_GCM_IOS = 1056;
- }
- optional Type type = 1;
-}
-
-// The property that hosts the object.
-message ObjectSource {
- //
- // NOTE: This enum MUST be kept in sync with ObjectIdP.Source in
- // internal.proto.
- //
- enum Type {
- INTERNAL = 1;
- TEST = 2; // Uncontrolled object space for use by anyone for testing.
- DEMO = 4; // A demo object source that can be used for testing.
-
- // Numbers below 1000 are reserved for internal use.
- CHROME_SYNC = 1004;
- COSMO_CHANGELOG = 1014;
- CHROME_COMPONENTS = 1025;
- CHROME_PUSH_MESSAGING = 1030;
- }
- optional Type type = 1;
-}
-
-// A dummy message to enclose various enum constant declarations.
-message Constants {
- // Constants related to object versions.
- enum ObjectVersion {
- // Version number used to indicate that an object's version is unknown.
- UNKNOWN = 0;
- }
-}