diff --git a/lsp/functions.js b/lsp/functions.js index 9b607f83..81993f1d 100644 --- a/lsp/functions.js +++ b/lsp/functions.js @@ -112,7 +112,8 @@ { 'username': settings.credentials.username, 'password': (settings.credentials.authstring != "" ? MD5(MD5(settings.credentials.password) + settings.credentials.authstring) : "" ) - } + }, + 'capabilities': {} }; $.ajax( @@ -131,6 +132,7 @@ var ret = $.extend(true, { "streams": {}, + "capabilities": {}, "statistics": {} }, d); @@ -356,11 +358,11 @@ "version": "" }, "streams": {}, + "capabilities": {}, "log": {}, "statistics": {} }, d); } - if(callback) { callback(errorstr); diff --git a/lsp/main.js b/lsp/main.js index 8d36de59..2c56d083 100644 --- a/lsp/main.js +++ b/lsp/main.js @@ -259,7 +259,7 @@ case 'protocols': $table = $('<table>'); - $table.html("<thead><th>Protocol</th><th>Port</th><th>Interface</th><th></th></thead>"); + $table.html("<thead><th>Protocol</th><th>Settings</th><th></th></thead>"); $tbody = $('<tbody>'); var tr, i, protocol, @@ -274,11 +274,22 @@ tr = $('<tr>').attr('id', 'protocol-' + i); tr.append( $('<td>').text( protocol.connector ) ); - tr.append( $('<td>').text( protocol.port ) ); + + s = ""; + for (option in protocol) { + if ((option != 'connector') && (option != 'online')) { + s += option+': '+protocol[option]+', '; + } + } + s = s.slice(0,-2); + + tr.append( $('<td>').text( s ) ); - tr.append( $('<td>').text( protocol['interface'] ) ); // interface is a reserved JS keyword - - tr.append( $('<td>').attr('class', 'center').append( $('<button>').click(function() + tr.append( $('<td>').attr('class', 'center').append( $('<button>').text('edit').click(function() + { + id = $(this).parent().parent().attr('id').replace('protocol-', ''); + showTab('editprotocol', id); + }) ).append( $('<button>').click(function() { if(confirmDelete('Are you sure you want to delete this protocol?') == true) { @@ -292,61 +303,15 @@ $tbody.append(tr); } - - // add new protocol! - $nprot = $('<tr>').attr('class', 'outsidetable'); - // protocol select - $pname = $('<select>').attr('id', 'new-protocol-name'); - $pname.append( $('<option>').attr('value', 'HTTP').text('HTTP') ); - $pname.append( $('<option>').attr('value', 'HTTPDynamic').text('HTTPDynamic') ); - $pname.append( $('<option>').attr('value', 'HTTPProgressive').text('HTTPProgressive') ); - $pname.append( $('<option>').attr('value', 'HTTPSmooth').text('HTTPSmooth') ); - $pname.append( $('<option>').attr('value', 'RTMP').text('RTMP') ); - - $nprot.append( $('<td>').append($pname) ); - // the port value - $nprot.append( $('<td>').append( $('<input>').attr('type', 'number').attr('id', 'new-protocol-val') ) ); - - // interface - $nprot.append( $('<td>').append( $('<input>').attr('type', 'text').attr('id', 'new-protocol-interface') ) ); - - $nprot.append( - $('<td>').attr('class', 'center').append( - $('<button>').click(function() - { - if($('#new-protocol-val').val() == '') - { - $('#new-protocol-val').focus(); - return; - } - - if(!settings.settings.config.protocols) - { - settings.settings.config.protocols = []; - } - - var nobj = - { - connector: $('#new-protocol-name :selected').val(), - port: Math.abs($('#new-protocol-val').val()) - }; - - nobj['interface'] = $('#new-protocol-interface').val(); - - settings.settings.config.protocols.push(nobj); - - loadSettings(function() - { - showTab('protocols'); - }); - - }).text('add new') - ) - ); - - $tbody.append($nprot); $table.append($tbody); $('#page').append($table); + + $('#page').append( + $('<button>').attr('class', 'floatright').click(function() + { + showTab('editprotocol', 'new'); + }).text('add new') + ); break; @@ -356,7 +321,209 @@ - case 'streams': + case 'editprotocol': + if (streamname != 'new') { currentdata = settings.settings.config.protocols[streamname]; } + + currentconnectors = []; + for (var index in settings.settings.config.protocols) { //build a list of the current connectors to see if the dependencies are already configured + currentconnectors.push(settings.settings.config.protocols[index].connector); + } + + function buildProtocolFields(selectedProtocol) + { + data = settings.settings.capabilities.connectors[selectedProtocol]; + + $t = $('<p>').text(data.desc); + if ((typeof data.deps != 'undefined') && (data.deps)) + { + $t.append($('<p>').text('Dependencies:')); + $s = $('<ul>'); + deps = data.deps.split(','); + for (var index in deps) + { + t = deps[index]; + if ($.inArray(deps[index],currentconnectors) < 0) { + $u = $('<span>').text(' (Not yet configured!)').addClass('red'); + } + else { + $u = $('<span>').text(' (Configured)').addClass('green'); + } + $s.append($('<li>').text(t).append($u)); + } + $t.append($s); + } + $('#protocoldesc').html( $t ); + + $protocolfields = $('<div>'); + if (typeof data.required != 'undefined') + { + $protocolfields.append( $('<p>').text('Required parameters') ); + for(fieldname in data.required) + { + switch (data.required[fieldname].type) + { + case 'str': + var inputType = 'text' + break; + case 'uint': + var inputType = 'number' + var func = 'uint' + break; + case 'int': + var inputType = 'number' + break; + default: + + break; + } + $i = $('<input>').attr('type',inputType).attr('id','protocol-parameter-'+fieldname).addClass('required'); + if (func == 'uint') { + $i.addClass('uint'); + } + $protocolfields.append( + $('<label>').text(data.required[fieldname].name).attr('title',data.required[fieldname].help).append($i) + ); + } + } + if (typeof data.optional != 'undefined') + { + $protocolfields.append( $('<p>').text('Optional parameters') ); + for(fieldname in data.optional) + { + switch (data.optional[fieldname].type) + { + case 'str': + var inputType = 'text' + break; + case 'uint': + var inputType = 'number' + var func = 'uint' + break; + case 'int': + var inputType = 'number' + break; + default: + + break; + } + $i = $('<input>').attr('type',inputType).attr('id','protocol-parameter-'+fieldname); + if (func == 'uint') { + $i.addClass('uint'); + } + $protocolfields.append( + $('<label>').text(data.optional[fieldname].name).attr('title',data.optional[fieldname].help).append($i) + ); + } + } + $('#protocolfields').html($protocolfields); + if (streamname != 'new') { + for (fieldname in currentdata) { + if ((fieldname != 'connector') && (fieldname != 'online')) { + $('#protocol-parameter-'+fieldname).val(currentdata[fieldname]); + } + } + } + } + + loadSettings(function() + { + if (streamname == 'new') { t = 'add new protocol'; } + else { t = 'edit protocol'; } + + $('#page').append( $('<p>').text(t) ); + + $selectprotocol = $('<select>').attr('id', 'edit-protocol').change(function() + { + buildProtocolFields($(this).children(':selected').val()); + }); + for(protocol in settings.settings.capabilities.connectors) + { + if ((streamname != 'new') && (currentdata.connector == protocol)) { + $selectprotocol.append( + $('<option>').attr('value', protocol).attr('selected','selected').text(protocol) + ); + } + else { + $selectprotocol.append( + $('<option>').attr('value', protocol).text(protocol) + ); + } + } + + $div = $('<div>').attr('id', 'editprotocol'); + $div.append( + $('<label>').attr('for', 'protocol-edit-protocol').text('protocol').append( + $selectprotocol + ) + ); + + + $('#page').append( $div ); + $('#editprotocol').append( $('<div>').attr('id','protocoldesc') ); + $('#editprotocol').append( $('<div>').attr('id', 'protocolfields') ); + $('#editprotocol').append( + $('<button>').text('cancel').addClass('floatright').click(function() + { + showTab('protocols'); + }) + ); + $('#editprotocol').append( + $('<button>').text('save').addClass('floatright').click(function() + { + error = false; + $('input.required').each(function(){ //check if all required fields have contents + if ($(this).val() == '') { + $(this).focus(); + $(this).parent().addClass('red'); + error = true; + } + }); + $('input.uint').each(function(){ //check if all uints are actually uints + if ($(this).val() < 0) { + $(this).focus(); + $(this).parent().addClass('red'); + error = true; + } + }); + if (error) { return; } + if(!settings.settings.config.protocols) + { + settings.settings.config.protocols = []; + } + + connectorval = $('#edit-protocol').val() + var newprotocol = + { + connector: connectorval + }; + $('input').each(function(){ + newprotocol[$(this).attr('id').split('-')[2]] = $(this).val();; + }); + settings.settings.config.protocols.push(newprotocol); + + loadSettings(function() + { + showTab('protocols'); + }); + }) + ); + + buildProtocolFields($('select#edit-protocol :selected').val()); + + }); + + + + + break; + + + + + + + + case 'streams': // the filter element containr $div = $('<div>').attr('id', 'streams-filter'); diff --git a/lsp/style.css b/lsp/style.css index c065ccfa..32c4d1e7 100644 --- a/lsp/style.css +++ b/lsp/style.css @@ -247,7 +247,8 @@ label width: 400px; } -label input +label input, +label select { float: right; margin: -8px 0 0 0; @@ -288,8 +289,11 @@ th, p, label, #page label input, +#page label select, #page > button, -#editserver > button, #forcesave > button +#editserver > button, +#forcesave > button, +#editprotocol > button { font: normal bold 11pt Arial, sans-serif; text-transform: uppercase; @@ -341,8 +345,15 @@ td width: auto; padding: 0; } - - +#protocoldesc p +{ + font-weight: normal; + text-transform: none; +} +#protocolfields +{ + margin-top: 10px; +} #forcesave {