--- a +++ b/functions/adminfunc/plugin_install.m @@ -0,0 +1,134 @@ +% PLUGIN_INSTALL - install EEGLAB plugin. Called by PLUGIN_ASKINSTALL. +% +% Usage: +% plugin_install(zipfilelink, name, version, force, size); +% +% Inputs: +% zipfilelink - [string] web link to zip file +% name - [string] name of the plugin +% version - [string] version of the plugin +% size - [real] size of the plugin in Kb +% force - [boolean] force install (even if already installed) +% +% Note: To install plugins from the command line, type in +% +% plugin_askinstall('xxxxxx', [], true); % with xxxx being the name of the plugin +% +% See also: PLUGIN_ASKINSTALL + +% Copyright (C) 2012- Arnaud Delorme +% +% This file is part of EEGLAB, see http://www.eeglab.org +% for the documentation and details. +% +% Redistribution and use in source and binary forms, with or without +% modification, are permitted provided that the following conditions are met: +% +% 1. Redistributions of source code must retain the above copyright notice, +% this list of conditions and the following disclaimer. +% +% 2. Redistributions in binary form must reproduce the above copyright notice, +% this list of conditions and the following disclaimer in the documentation +% and/or other materials provided with the distribution. +% +% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +% THE POSSIBILITY OF SUCH DAMAGE. + +function result = plugin_install(zipfilelink, name, version, pluginsize, forceInstall) + + if nargin < 5, forceInstall = false; end + if nargin == 4 && (pluginsize == 0 || pluginsize == 1) + forceInstall = pluginsize; % previous calling format where size was not present + end + result = 1; + + % get plugin path + % --------------- + %version(find(version == '.')) = '_'; + generalPluginPath = fullfile(fileparts(which('eeglab.m')), 'plugins'); + newPluginPath = fullfile(generalPluginPath, [ name version ]); + + % check plugin size + % ----------------- + zipfile = 'tmp.zip'; + if pluginsize > 500000 && ~forceInstall + res = questdlg2( [ 'Extension ' name ' size is ' num2str(ceil(pluginsize/100)/10) 'MB. Are you sure' 10 ... + 'you want to download this extension?' ], 'Warning', 'No', 'Yes', 'Yes'); + if strcmpi(res, 'no'), fprintf([ 'Skipping ' name ' extension installation\n' ]); + result = -1; + return; + end + end + + try + if exist('OCTAVE_VERSION', 'builtin') == 0 + plugin_urlread(['http://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_increment.php?plugin=' name '&version=' version ]); + plugin_urlwrite( zipfilelink, fullfile(generalPluginPath, zipfile)); + else + urlread(['http://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_increment.php?plugin=' name '&version=' version ]); + urlwrite( zipfilelink, fullfile(generalPluginPath, zipfile)); + end + catch + msg = [ 'Could not download extension. Host site might be' 10 ... + 'unavailable, too slow or you do not have permission' 10 ... + 'to write in the EEGLAB plugin folder. Try again' 10 ... + 'just in case or use a faster connection.' 10 10 ... + 'Alternatively install the plugin manually by downloading' 10 ... + 'it at http://sccn.ucsd.edu/wiki/EEGLAB_Extensions_and_plug-ins' 10 ... + 'unziping it in the eeglab/plugin folder and restarting eeglab']; + if ~forceInstall + warndlg2(msg); + else + disp(msg); + end + result = -1; + return; + end + + % unzip plugin + % ------------ + if ~exist(newPluginPath) + mkdir(newPluginPath); + else + msg = [ 'Extension folder already exist ' newPluginPath 10 'Remove it manually before installing extension' ]; + if ~forceInstall + warndlg2(msg); + else + disp(msg); + end + result = -1; + return; + end + disp([ 'Unzipping extension file... ']); + unzip(fullfile(generalPluginPath, zipfile), newPluginPath); + + disp('Cleaning up zip file...'); + delete(fullfile(generalPluginPath, zipfile)); + + % seeing what is in the plugin and moving files if necessary + % ---------------------------------------------------------- + pluginContent = dir(newPluginPath); + if length(pluginContent) > 3 + return; + end + for index = 1:length(pluginContent) + if ~strcmpi(pluginContent(index).name, '.') && ~strcmpi(pluginContent(index).name, '..') + fullFolder = fullfile(newPluginPath, pluginContent(index).name); + if exist(fullFolder) == 7 % folder detected + % move files from folder + movefile(fullfile(fullFolder, '*'), newPluginPath); + rmdir(fullFolder, 's'); + end + end + end + fprintf('Extension %s version %s now installed\n', name, version); +