diff --git a/chrome/content/zotero/xpcom/collectionTreeView.js b/chrome/content/zotero/xpcom/collectionTreeView.js
index 66977ff85..6a5a09c9b 100644
--- a/chrome/content/zotero/xpcom/collectionTreeView.js
+++ b/chrome/content/zotero/xpcom/collectionTreeView.js
@@ -182,13 +182,13 @@ Zotero.CollectionTreeView.prototype.refresh = function()
}
}
- var shares = Zotero.Zeroconf.instances;
+ /*var shares = Zotero.Zeroconf.instances;
if (shares.length) {
this._showRow(new Zotero.ItemGroup('separator', false));
for each(var share in shares) {
this._showRow(new Zotero.ItemGroup('share', share));
}
- }
+ }*/
if (this.hideSources.indexOf('commons') == -1 && Zotero.Commons.enabled) {
this._showRow(new Zotero.ItemGroup('separator', false));
diff --git a/chrome/content/zotero/xpcom/dataServer.js b/chrome/content/zotero/xpcom/dataServer.js
deleted file mode 100644
index 6f8e1033f..000000000
--- a/chrome/content/zotero/xpcom/dataServer.js
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- ***** BEGIN LICENSE BLOCK *****
-
- Copyright © 2009 Center for History and New Media
- George Mason University, Fairfax, Virginia, USA
- http://zotero.org
-
- This file is part of Zotero.
-
- Zotero is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Zotero is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with Zotero. If not, see .
-
- ***** END LICENSE BLOCK *****
-*/
-
-
-Zotero.DataServer = new function () {
- this.init = init;
- this.handleHeader = handleHeader;
-
- // TODO: assign dynamically
- this.__defineGetter__('port', function () {
- return 22030;
- });
-
- var _onlineObserverRegistered;
-
-
- /*
- * initializes a very rudimentary web server used for SOAP RPC
- */
- function init() {
- // Use Zeroconf pref for now
- if (!Zotero.Prefs.get("zeroconf.server.enabled")) {
- Zotero.debug("Not initializing data HTTP server");
- return;
- }
-
- if (Zotero.HTTP.browserIsOffline()) {
- Zotero.debug('Browser is offline -- not initializing data HTTP server');
- _registerOnlineObserver()
- return;
- }
-
- // start listening on socket
- var serv = Components.classes["@mozilla.org/network/server-socket;1"]
- .createInstance(Components.interfaces.nsIServerSocket);
- try {
- serv.init(this.port, false, -1);
- serv.asyncListen(Zotero.DataServer.SocketListener);
-
- Zotero.debug("Data HTTP server listening on 127.0.0.1:" + serv.port);
- }
- catch(e) {
- Zotero.debug("Not initializing data HTTP server");
- }
-
- _registerOnlineObserver()
- }
-
- /*
- * handles an HTTP request
- */
- function handleHeader(header) {
- // get first line of request (all we care about for now)
- var method = header.substr(0, header.indexOf(" "));
-
- if (!method) {
- return _generateResponse("400 Bad Request");
- }
-
- if (method != "POST") {
- return _generateResponse("501 Method Not Implemented");
- }
-
- // Parse request URI
- var matches = header.match("^[A-Z]+ (\/.*) HTTP/1.[01]");
- if (!matches) {
- return _generateResponse("400 Bad Request");
- }
-
- var response = _handleRequest(matches[1]);
-
- // return OK
- return _generateResponse("200 OK", 'text/xml; charset="UTF-8"', response);
- }
-
-
- function _handleRequest(uri) {
- var s = new Zotero.Search();
- s.addCondition('noChildren', 'true');
- var ids = s.search();
-
- if (!ids) {
- ids = [];
- }
-
- var uploadIDs = {
- updated: {
- items: ids
- },
- /* TODO: fix buildUploadXML to ignore missing */
- deleted: {}
- };
- return Zotero.Sync.Server.Data.buildUploadXML(uploadIDs);
- }
-
-
- /*
- * generates the response to an HTTP request
- */
- function _generateResponse(status, contentType, body) {
- var response = "HTTP/1.0 "+status+"\r\n";
-
- if(body) {
- if(contentType) {
- response += "Content-Type: "+contentType+"\r\n";
- }
- response += "\r\n"+body;
- } else {
- response += "Content-Length: 0\r\n\r\n"
- }
-
- return response;
- }
-
-
- function _registerOnlineObserver() {
- if (_onlineObserverRegistered) {
- return;
- }
-
- // Observer to enable the integration when we go online
- var observer = {
- observe: function(subject, topic, data) {
- if (data == 'online') {
- Zotero.Integration.init();
- }
- }
- };
-
- var observerService =
- Components.classes["@mozilla.org/observer-service;1"]
- .getService(Components.interfaces.nsIObserverService);
- observerService.addObserver(observer, "network:offline-status-changed", false);
-
- _onlineObserverRegistered = true;
- }
-}
-
-
-Zotero.DataServer.SocketListener = new function() {
- this.onSocketAccepted = onSocketAccepted;
-
- /*
- * called when a socket is opened
- */
- function onSocketAccepted(socket, transport) {
- // get an input stream
- var iStream = transport.openInputStream(0, 0, 0);
- var oStream = transport.openOutputStream(0, 0, 0);
-
- var dataListener = new Zotero.DataServer.DataListener(iStream, oStream);
- var pump = Components.classes["@mozilla.org/network/input-stream-pump;1"]
- .createInstance(Components.interfaces.nsIInputStreamPump);
- pump.init(iStream, -1, -1, 0, 0, false);
- pump.asyncRead(dataListener, null);
- }
-}
-
-/*
- * handles the actual acquisition of data
- */
-Zotero.DataServer.DataListener = function(iStream, oStream) {
- this.header = "";
- this.headerFinished = false;
-
- this.body = "";
- this.bodyLength = 0;
-
- this.iStream = iStream;
- this.oStream = oStream;
- this.sStream = Components.classes["@mozilla.org/scriptableinputstream;1"]
- .createInstance(Components.interfaces.nsIScriptableInputStream);
- this.sStream.init(iStream);
-
- this.foundReturn = false;
-}
-
-/*
- * called when a request begins (although the request should have begun before
- * the DataListener was generated)
- */
-Zotero.DataServer.DataListener.prototype.onStartRequest = function(request, context) {}
-
-/*
- * called when a request stops
- */
-Zotero.DataServer.DataListener.prototype.onStopRequest = function(request, context, status) {
- this.iStream.close();
- this.oStream.close();
-}
-
-/*
- * called when new data is available
- */
-Zotero.DataServer.DataListener.prototype.onDataAvailable = function(request, context,
- inputStream, offset, count) {
- var readData = this.sStream.read(count);
-
- // Read header
- if (!this.headerFinished) {
- // see if there's a magic double return
- var lineBreakIndex = readData.indexOf("\r\n\r\n");
- if (lineBreakIndex != -1) {
- if (lineBreakIndex != 0) {
- this.header += readData.substr(0, lineBreakIndex+4);
- }
-
- this._headerFinished();
- return;
- }
-
- var lineBreakIndex = readData.indexOf("\n\n");
- if (lineBreakIndex != -1) {
- if (lineBreakIndex != 0) {
- this.header += readData.substr(0, lineBreakIndex+2);
- }
-
- this._headerFinished();
- return;
- }
-
- if (this.header && this.header[this.header.length-1] == "\n" &&
- (readData[0] == "\n" || readData[0] == "\r")) {
- if (readData.length > 1 && readData[1] == "\n") {
- this.header += readData.substr(0, 2);
- }
- else {
- this.header += readData[0];
- }
-
- this._headerFinished();
- return;
- }
-
- this.header += readData;
- }
-}
-
-/*
- * processes an HTTP header and decides what to do
- */
-Zotero.DataServer.DataListener.prototype._headerFinished = function() {
- this.headerFinished = true;
- var output = Zotero.DataServer.handleHeader(this.header);
- this._requestFinished(output);
-}
-
-/*
- * returns HTTP data from a request
- */
-Zotero.DataServer.DataListener.prototype._requestFinished = function(response) {
- // close input stream
- this.iStream.close();
-
- // open UTF-8 converter for output stream
- var intlStream = Components.classes["@mozilla.org/intl/converter-output-stream;1"]
- .createInstance(Components.interfaces.nsIConverterOutputStream);
-
- // write
- try {
- intlStream.init(this.oStream, "UTF-8", 1024, "?".charCodeAt(0));
-
- Zotero.debug('Writing response to stream:\n\n' + response);
-
- // write response
- intlStream.writeString(response);
- } catch(e) {
- Zotero.debug("An error occurred.");
- Zotero.debug(e);
- } finally {
- Zotero.debug('Closing stream');
- intlStream.close();
- }
-}
-
diff --git a/chrome/content/zotero/xpcom/zeroconf.js b/chrome/content/zotero/xpcom/zeroconf.js
deleted file mode 100644
index 9f837c911..000000000
--- a/chrome/content/zotero/xpcom/zeroconf.js
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- ***** BEGIN LICENSE BLOCK *****
-
- Copyright © 2009 Center for History and New Media
- George Mason University, Fairfax, Virginia, USA
- http://zotero.org
-
- This file is part of Zotero.
-
- Zotero is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Zotero is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with Zotero. If not, see .
-
- ***** END LICENSE BLOCK *****
-*/
-
-
-Zotero.Zeroconf = new function () {
- this.init = init;
- this.registerService = registerService;
- this.findInstances = findInstances;
- this.findInstancesCallback = findInstancesCallback;
- this.unregisterService = unregisterService;
- this.getScript = getScript;
-
- this.clientEnabled = true;
- this.serverEnabled = true;
-
- this.__defineGetter__('clientPath', function () {
- return '/usr/bin/dns-sd';
- });
-
- this.__defineGetter__('displayName', function () {
- var dnsService = Components.classes["@mozilla.org/network/dns-service;1"].
- getService(Components.interfaces.nsIDNSService);
- var hostname = dnsService.myHostName;
-
- return hostname;
- });
-
- this.__defineGetter__('port', function () {
- return Zotero.DataServer.port;
- });
-
- this.__defineGetter__('instances', function () {
- var instances = {};
- for (var instance in _instances) {
- instances[instance] = new Zotero.Zeroconf.RemoteLibrary(instance);
- }
- return instances;
- });
-
- var _instances = [];
- var _browseCacheFile = '/tmp/zoteroconf_instances';
- var scriptsLoaded = false;
-
- function init() {
- if (!Zotero.Prefs.get("zeroconf.server.enabled")) {
- this.clientEnabled = false;
- this.serverEnabled = false;
- }
-
- // OS X only, for now
- if (!Zotero.isMac) {
- this.clientEnabled = false;
- this.serverEnabled = false;
-
- // TODO: Why is Windows breaking without this?
- return;
- }
-
- // Make sure we have the client executable
- var file = Components.classes["@mozilla.org/file/local;1"].
- createInstance(Components.interfaces.nsILocalFile);
- file.initWithPath(this.clientPath);
-
- if (!file.exists()) {
- Zotero.debug('Not enabling Z(ot)eroconf -- executable not found');
- this.clientEnabled = false;
- this.serverEnabled = false;
- return;
- }
-
- if (!this.serverEnabled) {
- Zotero.debug('Not enabling Z(ot)eroconf');
- return;
- }
-
- var registered = this.registerService();
- if (!registered) {
- return;
- }
-
- var observerService = Components.classes["@mozilla.org/observer-service;1"]
- .getService(Components.interfaces.nsIObserverService);
- observerService.addObserver({
- observe: function(subject, topic, data) {
- Zotero.Zeroconf.unregisterService();
- }
- }, "quit-application", false);
- }
-
-
- function registerService() {
- var file = Components.classes["@mozilla.org/file/local;1"].
- createInstance(Components.interfaces.nsILocalFile);
- file.initWithPath(this.clientPath);
-
- var process = Components.classes["@mozilla.org/process/util;1"].
- createInstance(Components.interfaces.nsIProcess);
- process.init(file);
-
- var args = ["-R", this.displayName, "_zotero._tcp", "local.", this.port];
-
- Zotero.debug("Registering Z(ot)eroconf on port " + this.port);
- process.run(false, args, args.length);
-
- return true;
- }
-
-
- function findInstances(callback) {
- if (!this.clientEnabled) {
- return;
- }
-
- Zotero.debug("Browsing for Z(ot)eroconf instances");
- var file = this.getScript('find_instances');
-
- var process = Components.classes["@mozilla.org/process/util;1"].
- createInstance(Components.interfaces.nsIProcess);
- process.init(file);
- var args = ['find_instances'];
- process.run(false, args, args.length);
-
- // Wait half a second for browse before proceeding
- setTimeout(function () {
- Zotero.Zeroconf.findInstancesCallback(callback);
- }, 500);
- }
-
-
- function findInstancesCallback(callback) {
- var file = Zotero.Zeroconf.getScript('kill_find_instances');
-
- var process = Components.classes["@mozilla.org/process/util;1"].
- createInstance(Components.interfaces.nsIProcess);
- process.init(file);
- var args = ['kill_find_instances'];
- process.run(false, args, args.length);
-
- var file = Components.classes["@mozilla.org/file/local;1"].
- createInstance(Components.interfaces.nsILocalFile);
- file.initWithPath(_browseCacheFile);
-
- if (!file.exists()) {
- Zotero.debug(_browseCacheFile + " doesn't exist", 2);
- _instances = {};
- return;
- }
-
- var browseCache = Zotero.File.getContents(file);
- Zotero.debug(browseCache);
- file.remove(null);
-
- // Parse browse output
- var lines = browseCache.split(/\n/);
- var newInstances = {};
- for each(var line in lines) {
- var matches = line.match(/([a-zA-Z\.]+) +_zotero\._tcp\. +(.+)/);
- if (matches) {
- var domain = matches[1];
- var name = matches[2];
- // Skip local host
- if (name == this.displayName) {
- continue;
- }
- newInstances[name] = true;
- }
- }
-
- // Remove expired instances
- for (var instance in _instances) {
- if (!newInstances[instance]) {
- delete _instances[instance];
- }
- }
-
- // Add new instances
- for (var instance in newInstances) {
- _instances[instance] = true;
- }
-
- Zotero.Notifier.trigger('refresh', 'share', 'all');
-
- if (callback) {
- callback();
- }
- }
-
-
- function unregisterService() {
- Zotero.debug("Unregistering Zeroconf service");
- var file = Zotero.Zeroconf.getScript('kill_service');
-
- var process = Components.classes["@mozilla.org/process/util;1"].
- createInstance(Components.interfaces.nsIProcess);
- process.init(file);
- var args = ['kill_service'];
- var ret = process.run(false, args, args.length);
-
- if (ret != 0) {
- Zotero.debug("Zeroconf client not stopped!", 2);
- }
-
- // Remove any zoteroconf files remaining in tmp directory
- var file = Components.classes["@mozilla.org/file/local;1"].
- createInstance(Components.interfaces.nsILocalFile);
- file.initWithPath('/tmp');
- if (!file.exists() || !file.isDirectory()) {
- return;
- }
- try {
- var files = file.directoryEntries;
- while (files.hasMoreElements()) {
- var tmpFile = files.getNext();
- tmpFile.QueryInterface(Components.interfaces.nsILocalFile);
- if (tmpFile.leafName.indexOf('zoteroconf') != -1) {
- tmpFile.remove(null);
- }
- }
- }
- catch (e) {
- Zotero.debug(e);
- }
- }
-
-
- function getScript() {
- var file = Components.classes["@mozilla.org/extensions/manager;1"]
- .getService(Components.interfaces.nsIExtensionManager)
- .getInstallLocation(ZOTERO_CONFIG['GUID'])
- .getItemLocation(ZOTERO_CONFIG['GUID']);
- file.append('scripts');
- file.append('zoteroconf.sh');
-
- // The first time we load the script, do some checks
- if (!scriptsLoaded) {
- if (!file.exists()) {
- throw ('zoteroconf.sh not found in Zotero.Zeroconf.getScript()');
- }
-
- // Make sure the file is executable
- if (file.permissions != 33261) {
- try {
- file.permissions = 33261;
- }
- catch (e) {
- throw ('Cannot make zoteroconf.sh executable in Zotero.Zeroconf.getScript()');
- }
- }
- }
-
- return file;
- }
-}
-
-
-
-Zotero.Zeroconf.RemoteLibrary = function (name) {
- default xml namespace = '';
-
- this.name = name;
-
- this._host;
- this._port;
- this._items = [];
- this._tmpFile = '/tmp/zoteroconf_info_' + Zotero.randomString(6);
- //this.search = new Zotero.Zeroconf.RemoteLibrary.Search(this);
-}
-
-Zotero.Zeroconf.RemoteLibrary.prototype.load = function () {
- Zotero.debug("Getting service info for " + this.name);
-
- var file = Zotero.Zeroconf.getScript('get_info');
-
- var process = Components.classes["@mozilla.org/process/util;1"].
- createInstance(Components.interfaces.nsIProcess);
- process.init(file);
- var args = ['get_info', this.name, this._tmpFile];
- process.run(false, args, args.length);
-
- var self = this;
-
- setTimeout(function () {
- var file = Zotero.Zeroconf.getScript('kill_get_info');
-
- var process = Components.classes["@mozilla.org/process/util;1"].
- createInstance(Components.interfaces.nsIProcess);
- process.init(file);
- var args = ['kill_get_info'];
- process.run(false, args, args.length);
-
- var file = Components.classes["@mozilla.org/file/local;1"].
- createInstance(Components.interfaces.nsILocalFile);
- file.initWithPath(self._tmpFile);
-
- var infoCache = Zotero.File.getContents(file);
- Zotero.debug(infoCache);
- file.remove(null);
-
- var lines = infoCache.split(/\n/);
- for each(var line in lines) {
- var matches = line.match(/can be reached at +([^ ]+) *:([0-9]+)/);
- if (matches) {
- self._host = matches[1];
- self._port = matches[2];
- break;
- }
- }
-
- if (self._host) {
- self.loadItems(self);
- }
- }, 250);
-}
-
-Zotero.Zeroconf.RemoteLibrary.prototype.loadItems = function (self, noNotify) {
- var url = "http://" + this._host + ':' + this._port;
- Zotero.HTTP.doPost(url, '', function (xmlhttp) {
- Zotero.debug(xmlhttp.responseText);
-
- self._items = [];
- var xml = new XML(xmlhttp.responseText);
- for each(var xmlNode in xml.items.item) {
- var obj = Zotero.Sync.Server.Data.xmlToItem(xmlNode, false, true);
- self._items.push(obj);
- }
-
- Zotero.debug("Retrieved " + self._items.length +
- " item" + (self._items.length == 1 ? '' : 's'));
-
- if (!noNotify) {
- Zotero.Notifier.trigger('refresh', 'share-items', 'all');
- }
- });
-}
-
-Zotero.Zeroconf.RemoteLibrary.prototype.getAll = function () {
- if (!this._host) {
- this.load();
- return [];
- }
-
- this.loadItems(this, true);
-
- return this._items;
-}
-
-/*
-Zotero.Zeroconf.RemoteLibrary.Search = function (library) {
- this.library = library;
-}
-
-Zotero.Zeroconf.RemoteLibrary.Search.prototype = function () {
-
-}
-*/
diff --git a/chrome/content/zotero/xpcom/zotero.js b/chrome/content/zotero/xpcom/zotero.js
index 9c59539e5..1fb41da75 100644
--- a/chrome/content/zotero/xpcom/zotero.js
+++ b/chrome/content/zotero/xpcom/zotero.js
@@ -639,8 +639,6 @@ const ZOTERO_CONFIG = {
Zotero.Server.init();
}
- Zotero.Zeroconf.init();
-
Zotero.Sync.init();
Zotero.Sync.Runner.init();
diff --git a/components/zotero-service.js b/components/zotero-service.js
index 47a085d9f..63d3534bc 100644
--- a/components/zotero-service.js
+++ b/components/zotero-service.js
@@ -105,7 +105,6 @@ const xpcomFilesLocal = [
'storage/webdav',
'timeline',
'uri',
- 'zeroconf',
'translation/translate_item',
'translation/translator',
'server_connector'
diff --git a/scripts/zoteroconf.sh b/scripts/zoteroconf.sh
deleted file mode 100755
index 3d87d6bc1..000000000
--- a/scripts/zoteroconf.sh
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/sh
-if [ ! "$1" ]; then
- echo "Action not specified"
- exit 1
-fi
-
-if [ $1 = "find_instances" ]; then
- dns-sd -B _zotero._tcp local. > /tmp/zoteroconf_instances &
-
-elif [ $1 = "kill_find_instances" ]; then
- PIDs=`ps x | grep "dns-sd -B" | grep _zotero._tcp | sed -E 's/ *([0-9]+).*/\1/' | xargs`
- if [ "$PIDs" ]; then
- kill $PIDs
- fi
-
-elif [ $1 = "get_info" ]; then
- if [ ! "$2" ]; then
- echo "Service name not specified"
- exit 1
- fi
-
- if [ ! "$3" ]; then
- echo "Temp file path not specified"
- exit 1
- fi
-
- #dns-sd -L "$2" _zotero._tcp local. > $3 &
- mDNS -L "$2" _zotero._tcp local. > $3 &
-
-elif [ $1 = "kill_get_info" ]; then
- #PIDs=`ps x | grep "dns-sd -L" | grep _zotero._tcp | sed -E 's/ *([0-9]+).*/\1/' | xargs`
- PIDs=`ps x | grep "mDNS -L" | grep _zotero._tcp | sed -E 's/ *([0-9]+).*/\1/' | xargs`
- if [ "$PIDs" ]; then
- kill $PIDs
- fi
-
-elif [ $1 = "kill_service" ]; then
- PIDs=`ps x | grep dns-sd | grep '_zotero._tcp' | sed -E 's/ *([0-9]+).*/\1/' | xargs`
- if [ "$PIDs" ]; then
- kill $PIDs
- fi
-fi