Export client state asynchronously (display state may not match protocol state otherwise).
@@ -133,16 +133,18 @@ Guacamole.Client = function(tunnel) {
}
/**
- * Returns an opaque representation of Guacamole.Client state which can be
+ * Produces an opaque representation of Guacamole.Client state which can be
* later imported through a call to importState(). This object is
* effectively an independent, compressed snapshot of protocol and display
- * state.
+ * state. Invoking this function implicitly flushes the display.
*
- * @returns {Object}
- * An opaque representation of Guacamole.Client state which can be
- * imported through a call to importState().
+ * @param {function} callback
+ * Callback which should be invoked once the state object is ready. The
+ * state object will be passed to the callback as the sole parameter.
+ * This callback may be invoked immediately, or later as the display
+ * finishes rendering and becomes ready.
*/
- this.exportState = function exportState() {
+ this.exportState = function exportState(callback) {
// Start with empty state
var state = {
@@ -151,11 +153,21 @@ Guacamole.Client = function(tunnel) {
'layers' : {}
};
- // Export each defined layer/buffer
+ var layersSnapshot = {};
+
+ // Make a copy of all current layers (protocol state)
for (var key in layers) {
+ layersSnapshot[key] = layers[key];
+ }
+
+ // Populate layers once data is available (display state, requires flush)
+ display.flush(function populateLayers() {
+
+ // Export each defined layer/buffer
+ for (var key in layersSnapshot) {
var index = parseInt(key);
- var layer = layers[key];
+ var layer = layersSnapshot[key];
var canvas = layer.toCanvas();
// Store layer/buffer dimensions
@@ -183,7 +195,11 @@ Guacamole.Client = function(tunnel) {
}
- return state;
+ // Invoke callback now that the state is ready
+ if (callback)
+ callback(state);
+
+ });
};
