diff --git a/.gitignore b/.gitignore index bf413e1..26a0422 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,7 @@ npm-debug.log roadmap *.orig *.*~ + +.brackets.json + +apps/app-defaults/settings/app-defaults.json diff --git a/apps/app-defaults/index.js b/apps/app-defaults/index.js index 1f4ac16..e22607d 100644 --- a/apps/app-defaults/index.js +++ b/apps/app-defaults/index.js @@ -1,15 +1,12 @@ +var methods = Silk.methods; var defaults = {}; var djson = __dirname + "/settings/app-defaults.json"; var windows; -var Silk = { - defaults: {} -}; methods.add({ "windows": function (windows) { initialize(windows); - console.log("Silk.defaults " + JSON.stringify(Silk.defaults)); } }); @@ -20,7 +17,10 @@ function loadDefaults() { fs.exists(fileName, function (exists) { // TODO create file if it doesn't exist - if (!exists) return; + if (!exists) { + fs.writeFileSync(djson, '{}') + + } fs.stat(fileName, function (err, stats) { if (err) return console.log(err); @@ -58,7 +58,6 @@ function saveDefaults() { for (item in defaults) { // TODO only save items that have a default - console.log("contents: " + item); contents[item] = {}; contents[item].default = defaults[item].default; contents[item].available = []; @@ -75,9 +74,6 @@ function saveDefaults() { function initialize(windows) { - defaults = Silk.defaults; - - for (var i = 0; i < windows.length; ++i) { if (!("opens" in windows[i])) continue; var opens = windows[i].opens; @@ -85,19 +81,19 @@ function initialize(windows) { //for each mime listed in windows for (var x = 0; x < opens.length; ++x) { - if (opens[x] in Silk.defaults) { + if (opens[x] in defaults) { // don't add duplicate apps - if (Silk.defaults[opens[x]].available.indexOf(windows[i].title) < 0) { - Silk.defaults[opens[x]].available.push(windows[i].title); + if (defaults[opens[x]].available.indexOf(windows[i].title) < 0) { + defaults[opens[x]].available.push(windows[i].title); } } else { - + // create object for defaults - Silk.defaults[opens[x]] = {}; - Silk.defaults[opens[x]] = { + defaults[opens[x]] = {}; + defaults[opens[x]] = { default: "", available: [windows[i].title] }; @@ -106,23 +102,23 @@ function initialize(windows) { } loadDefaults(); - console.log(JSON.stringify(defaults, null, 4)); + //console.log(JSON.stringify(defaults, null, 4)); methods.add({ "Silk/appDefaults": function (mime) { - if (mime in Silk.defaults) { - return Silk.defaults[mime]; + if (mime in defaults) { + return defaults[mime]; } else { - var ret = Silk.defaults["*"]; + var ret = defaults["*"]; ret.mime = "*"; return ret } }, "Silk/setDefault": function (data) { - if (data.mime in Silk.defaults) { - Silk.defaults[data.mime].default = data.app; + if (data.mime in defaults) { + defaults[data.mime].default = data.app; } else { - Silk.defaults[data.mime] = {}; - Silk.defaults[data.mime] = { + defaults[data.mime] = {}; + defaults[data.mime] = { default: data.app, available: [] }; diff --git a/apps/app-defaults/settings/app-defaults.json b/apps/app-defaults/settings/app-defaults.json index 4b50749..9e26dfe 100644 --- a/apps/app-defaults/settings/app-defaults.json +++ b/apps/app-defaults/settings/app-defaults.json @@ -1 +1 @@ -{"text/plain":{"default":"","available":[]},"*":{"default":"","available":[]},"undefined":{"default":"Text Editor","available":[]},"text/html":{"default":"Text Editor","available":[]}} \ No newline at end of file +{} \ No newline at end of file diff --git a/apps/appManager/index.js b/apps/appManager/index.js new file mode 100644 index 0000000..1ba1968 --- /dev/null +++ b/apps/appManager/index.js @@ -0,0 +1,153 @@ +var request = require('request'); +var fs = require('fs'); +var path = require('path'); +var yauzl = require("yauzl"); +var mkdirp = require('mkdirp'); +var async = require('async'); + +var methods = Silk.methods; +var apps = []; +var appsFolder = __dirname.split(path.sep); +appsFolder = appsFolder.slice(0, appsFolder.length - 1); +appsFolder = appsFolder.join(path.sep); + +methods.add({ + "apps/remove": function (data, call_obj, send) { + send(void(0), "Deleting..."); + + var file = data.folder; + var folder = appsFolder + path.sep + file; + var deleteFolderRecursive = function (path) { + if (fs.existsSync(path)) { + fs.readdirSync(path).forEach(function (file, index) { + var curPath = path + "/" + file; + if (fs.lstatSync(curPath).isDirectory()) { // recurse + deleteFolderRecursive(curPath); + } else { // delete file + fs.unlinkSync(curPath); + } + }); + fs.rmdirSync(path); + console.log("Finished removing " + file); + send(void(0), " "); + } + }; + deleteFolderRecursive(folder); + }, + "apps/list": function (data, call_obj, send) { + Silk.api.call('apps/list', {}, function(err, data){ + if(err){ + send(err); + } else{ + send(void(0), data); + } + }) + }, + "apps/install": download +}); + +function download(data, call_ob, send) { + + fs.exists(appsFolder + path.sep + data.url.replace("/", "-"), function (exists) { + if (exists === true) { + send(new Error("App already exists")); + return; + } + + if (data.url === "") { + send(new Error("Url can not be empty")); + } + var repo = data.url; + + var url = "https://api.github.com/repos/" + repo + "/zipball"; + var options = { + url: url, + headers: { + 'User-Agent': 'silk-gui' + } + }; + + send(void(0), "Downloading..."); + request(options).on('response', function (response) { + }).on('error', function (err) { + send(err) + }).on("end", function () { + send(void(0), "pending"); + install(data, call_ob, send) + }).pipe(fs.createWriteStream(__dirname + path.sep + 'test.zip')); + + }); +} + +function install(data, call_ob, send) { + send(void(0), "Installing ..."); + var extractTo = appsFolder + path.sep + data.url.replace("/", "-"); + try { + yauzl.open(__dirname + path.sep + 'test.zip', function (err, zipfile) { + if (err) { + send(err); + return; + } + zipfile.once('end', function () { + Silk.api.call('apps/start', data.url.replace('/', '-'), function (err, data) { + console.log(error); + send(void(0), "Finished installing!") + + }); + send(void(0), 'Starting App'); + fs.unlink(__dirname + path.sep + 'test.zip', function (err) { + if (err) { + send(err); + + } + console.log('Installed ' + data.url); + send(void(0), " "); + }) + }); + zipfile.on("entry", function (entry) { + + if (/\/$/.test(entry.fileName)) { + // directory file names end with '/' + return; + } + + var fileName = entry.fileName; + fileName = fileName.split(path.sep); + fileName = fileName.splice(1, fileName.length) + fileName = fileName.join(path.sep); + + entry.fileName = fileName; + var dest = path.join(extractTo, entry.fileName) + var destDir = path.dirname(dest) + // dest = dest.split(path.sep); + // dest = dest.slice(0, dest.length - 1); + + zipfile.openReadStream(entry, function (err, readStream) { + if (err) { + send(err); + return; + } + + mkdirp(destDir, function (err) { + if (err) { + send(err); + } + + + //entry.fileName = data.url.replace("/", "-"); + // ensure parent directory exists, and then: + + readStream.pipe(fs.createWriteStream(dest).on("error", function (err) { + send(err) + })) + }); + + }); + + }); + }); + + } catch (e) { + send(e); + } +} \ No newline at end of file diff --git a/apps/appManager/public/icon.png b/apps/appManager/public/icon.png new file mode 100644 index 0000000..9b80c61 Binary files /dev/null and b/apps/appManager/public/icon.png differ diff --git a/apps/appManager/public/index.html b/apps/appManager/public/index.html new file mode 100644 index 0000000..05ca509 --- /dev/null +++ b/apps/appManager/public/index.html @@ -0,0 +1,224 @@ + + +
+