|
|
- define(["sugar-web/bus", "sugar-web/env"], function (bus, env) {
-
- 'use strict';
-
- var datastore = {};
-
- function DatastoreObject(objectId) {
- this.objectId = objectId;
- this.newMetadata = {};
-
- this.ensureObjectId = function (callback) {
- var that = this;
-
- env.getObjectId(function (objectId) {
- if (objectId !== null && that.objectId === undefined) {
- that.objectId = objectId;
- }
- callback();
- });
- };
-
- this.blobToText = function (blob, callback) {
- var reader = new FileReader();
- reader.onload = function (e) {
- callback(e.target.result);
- };
- reader.readAsText(blob);
- };
-
- this.blobToArrayBuffer = function (blob, callback) {
- var reader = new FileReader();
- reader.onload = function (e) {
- callback(e.target.result);
- };
- reader.readAsArrayBuffer(blob);
- };
-
- this.saveText = function (metadata, callback) {
- var that = this;
-
- function onSaved(error, outputStream) {
- var blob = new Blob([that.newDataAsText]);
-
- that.blobToArrayBuffer(blob, function (buffer) {
- outputStream.write(buffer);
- outputStream.close(callback);
- });
- }
-
- datastore.save(this.objectId, metadata, onSaved);
- };
-
- this.applyChanges = function (metadata, callback) {
- for (var key in this.newMetadata) {
- metadata[key] = this.newMetadata[key];
- }
-
- if (this.newDataAsText !== undefined) {
- this.saveText(metadata, callback);
- } else {
- datastore.setMetadata(this.objectId, metadata, callback);
- }
- };
- }
-
- DatastoreObject.prototype.getMetadata = function (callback) {
- var that = this;
-
- this.ensureObjectId(function () {
- datastore.getMetadata(that.objectId, callback);
- });
- };
-
- DatastoreObject.prototype.loadAsText = function (callback) {
- var that = this;
- var inputStream = null;
- var arrayBuffers = [];
- var metadata = null;
-
- function onRead(error, data) {
- if (data.byteLength === 0) {
- var blob = new Blob(arrayBuffers);
-
- that.blobToText(blob, function (text) {
- callback(null, metadata, text);
- });
-
- inputStream.close();
-
- return;
- }
-
- arrayBuffers.push(data);
-
- inputStream.read(8192, onRead);
- }
-
- function onLoad(error, loadedMetadata, loadedInputStream) {
- metadata = loadedMetadata;
- inputStream = loadedInputStream;
-
- inputStream.read(8192, onRead);
- }
-
- this.ensureObjectId(function () {
- datastore.load(that.objectId, onLoad);
- });
- };
-
- DatastoreObject.prototype.setMetadata = function (metadata) {
- for (var key in metadata) {
- this.newMetadata[key] = metadata[key];
- }
- };
-
- DatastoreObject.prototype.setDataAsText = function (text) {
- this.newDataAsText = text;
- };
-
- DatastoreObject.prototype.save = function (callback) {
- if (callback === undefined) {
- callback = function () {};
- }
-
- var that = this;
-
- function onCreated(error, objectId) {
- that.objectId = objectId;
- that.applyChanges({}, callback);
- }
-
- function onGotMetadata(error, metadata) {
- that.applyChanges(metadata, callback);
- }
-
- this.ensureObjectId(function () {
- if (that.objectId === undefined) {
- datastore.create(that.newMetadata, onCreated);
- } else {
- datastore.getMetadata(that.objectId, onGotMetadata);
- }
- });
- };
-
- datastore.DatastoreObject = DatastoreObject;
-
-
- datastore.setMetadata = function (objectId, metadata, callback) {
- function onResponseReceived(error, result) {
- if (callback) {
- if (error === null) {
- callback(null);
- } else {
- callback(error);
- }
- }
- }
-
- var params = [objectId, metadata];
- bus.sendMessage("datastore.set_metadata", params, onResponseReceived);
- };
-
- datastore.getMetadata = function (objectId, callback) {
- function onResponseReceived(error, result) {
- if (error === null) {
- callback(null, result[0]);
- } else {
- callback(error, null);
- }
- }
-
- var params = [objectId];
- bus.sendMessage("datastore.get_metadata", params, onResponseReceived);
- };
-
- datastore.load = function (objectId, callback) {
- var inputStream = bus.createInputStream();
-
- inputStream.open(function (error) {
- function onResponseReceived(responseError, result) {
- if (responseError === null) {
- callback(null, result[0], inputStream);
- } else {
- callback(responseError, null, null);
- }
- }
-
- var params = [objectId, inputStream.streamId];
- bus.sendMessage("datastore.load", params, onResponseReceived);
- });
- };
-
- datastore.create = function (metadata, callback) {
- function onResponseReceived(responseError, result) {
- if (responseError === null) {
- callback(null, result[0]);
- } else {
- callback(responseError, null);
- }
- }
-
- var params = [metadata];
- bus.sendMessage("datastore.create", params, onResponseReceived);
- };
-
- datastore.save = function (objectId, metadata, callback) {
- var outputStream = bus.createOutputStream();
-
- outputStream.open(function (error) {
- function onResponseReceived(responseError, result) {
- if (responseError === null) {
- callback(null, outputStream);
- } else {
- callback(responseError, null);
- }
- }
-
- var params = [objectId, metadata, outputStream.streamId];
- bus.sendMessage("datastore.save", params, onResponseReceived);
- });
- };
-
- return datastore;
- });
|