--- a +++ b/functions/adminfunc/plugin_getweb.m @@ -0,0 +1,153 @@ +% plugin_getweb - support function to get plugin information from the web + +% 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 [plugin,eeglabVersionStatus] = plugin_getweb(type, pluginOri, varargin) +plugin = []; +eeglabVersionStatus = []; + +if nargin < 1, help plugin_getweb; return; end +if nargin < 2, pluginOri = []; end + +% convert plugin list format if necessary +if isfield(pluginOri, 'plugin'), pluginOri = plugin_convert(pluginOri); end + +[~,dateTmp] = version; +if datenum(dateTmp) < 736583 + error( [ 'The plugin manager is only available for Matlab version 2016b and later versions.' 10 ... + 'Download plugins from the internet and unzip them in the plugin folder instead.' ] ); +end + +% retrieving statistics +eeglab_options; +try + disp( 'Retrieving download statistics...' ); + if exist('OCTAVE_VERSION', 'builtin') == 0 + [plugin, status] = plugin_urlread([ 'http://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_getcountall_nowiki_json.php?type=' type '&upload=' num2str(option_showpendingplugins)]); + else + [plugin, status] = urlread([ 'http://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_getcountall_nowiki_json.php?type=' type '&upload=' num2str(option_showpendingplugins)]); + end + if isempty(plugin) || isequal(plugin, 'Couldn''t make connection to DB.') + disp('Issue with retrieving statistics for extensions'); + plugin = []; + return; + end + try + plugin = jsondecode(plugin); + catch + disp('Issue with decoding plugin information, Octave 7.x required to decode JSON strings'); + end +catch + disp('Cannot connect to the Internet to retrieve statistics for extensions'); + return +end + +if status == 0 + disp('Cannot connect to the Internet to retrieve extension list'); + return +end + +%% rename fields for backward compabitiligy +renameField = { 'plugin' 'name'; + 'count' 'downloads'; + 'curversion' 'version'; + 'link' 'zip' }; + +if ~isempty(pluginOri) + currentNames = lower({ pluginOri.name }); % this is old code that is not reached +else + currentNames = {}; +end +for iRow = 1:length(plugin) + + % rename fields + for iField = 1:size(renameField, 1) + if ~isfield(plugin, renameField{iField, 1}) + disp('Plugin list incomplete - maybe an issue with internet connection - aborting.'); + return + end + plugin(iRow).(renameField{iField, 2}) = plugin(iRow).(renameField{iField, 1}); + end + + % decode tags + plugin(iRow).rawtags = plugin(iRow).tags; + if ~isempty(plugin(iRow).rawtags) + tmpTags = textscan(plugin(iRow).rawtags, '%s', 'delimiter', ','); + plugin(iRow).tags = tmpTags{1}'; + end + + plugin(iRow).numrating = str2double(plugin(iRow).numrating); + plugin(iRow).rating = str2double(plugin(iRow).rating); + plugin(iRow).critical = str2double(plugin(iRow).critical); + plugin(iRow).removed = str2double(plugin(iRow).removed); + plugin(iRow).downloads = str2double(plugin(iRow).downloads); + plugin(iRow).size = sscanf(plugin(iRow).size, '%f'); % Only numeric part is taken, possible KB or MB additions are ignored + plugin(iRow).webrating = [ 'https://sccn.ucsd.edu/eeglab/plugin_uploader/simplestar.php?plugin=' plugin(iRow).name '&version=' plugin(iRow).version ]; + + % match with existiting plugins + indMatch = strmatch(lower(plugin(iRow).name), currentNames, 'exact'); + if isempty(indMatch) + plugin(iRow).currentversion = '-'; + plugin(iRow).installed = 0; + plugin(iRow).installorupdate = 1; + plugin(iRow).status = 'notinstalled'; + else + if length(indMatch) > 1 + disp([ 'Warning: duplicate extension ' plugin(iRow).name ' installed' ]); + end + plugin(iRow).currentversion = pluginOri(indMatch).currentversion; + plugin(iRow).foldername = pluginOri(indMatch).foldername; + plugin(iRow).status = pluginOri(indMatch).status; + plugin(iRow).installed = 1; + if strcmpi(plugin(iRow).currentversion, plugin(iRow).version) + plugin(iRow).installorupdate = 0; + else + plugin(iRow).installorupdate = 1; + end + end +end +plugin = rmfield(plugin, renameField(:,1)'); + +% handle the special case of EEGLAB version +indEEGLAB = cellfun(@(x)isequal(x, 'eeglab'), lower( { plugin.name } )); +eeglabVersionStatus = plugin(indEEGLAB); +plugin(indEEGLAB) = []; + +% remove plugins with no zip file +% ------------------------------- +plugin(cellfun(@isempty, {plugin.zip })) = []; + +function plugin = plugin_convert(pluginOri) + +for iRow = 1:length(pluginOri) + plugin(iRow).currentversion = pluginOri(iRow).version; + plugin(iRow).foldername = pluginOri(iRow).foldername; + plugin(iRow).status = pluginOri(iRow).status; + plugin(iRow).name = pluginOri(iRow).plugin; + plugin(iRow).installed = 1; +end