Merge pull request #110 from lukeIam/develop

New features for the remote keyboard and some JS fixes
This commit is contained in:
Stephan Sundermann committed 2014-11-13 00:24:55 +01:00
commit 5f037e6cf3
9 files changed
+194 -57

No files matched your search

+1
View File
@@ -33,6 +33,7 @@ namespace ServerLib
private bool _Encrypted; private bool _Encrypted;
public static SendKeyEventDelegate SendKeyEvent { internal get; set; } public static SendKeyEventDelegate SendKeyEvent { internal get; set; }
public static SendKeyStringEventDelegate SendKeyStringEvent { internal get; set; }
#region profile #region profile
public static GetProfileDataDelegate GetProfileData { internal get; set; } public static GetProfileDataDelegate GetProfileData { internal get; set; }
+17
View File
@@ -58,6 +58,23 @@ namespace ServerLib
CServer.SendKeyEvent(key); CServer.SendKeyEvent(key);
} }
public void SendKeyStringEvent(string keyString, bool isShiftPressed = false, bool isAltPressed = false, bool isCtrlPressed = false)
{
if (!_CheckRight(EUserRights.UseKeyboard))
return;
if (CServer.SendKeyStringEvent == null)
{
if (WebOperationContext.Current != null)
{
WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.NotFound;
WebOperationContext.Current.OutgoingResponse.StatusDescription = "Not found";
}
}
else
CServer.SendKeyStringEvent(keyString, isShiftPressed, isAltPressed, isCtrlPressed);
}
#region profile #region profile
public int GetOwnProfileId() public int GetOwnProfileId()
{ {
+1
View File
@@ -26,6 +26,7 @@ using System.Text.RegularExpressions;
namespace ServerLib namespace ServerLib
{ {
public delegate bool SendKeyEventDelegate(string key); public delegate bool SendKeyEventDelegate(string key);
public delegate bool SendKeyStringEventDelegate(string keyString, bool isShiftPressed , bool isAltPressed , bool isCtrlPressed);
#region profile #region profile
public delegate SProfileData GetProfileDataDelegate(int profileId, bool isReadonly); public delegate SProfileData GetProfileDataDelegate(int profileId, bool isReadonly);
+5
View File
@@ -30,6 +30,11 @@ namespace ServerLib
UriTemplate = "/sendKeyEvent?key={key}")] UriTemplate = "/sendKeyEvent?key={key}")]
void SendKeyEvent(string key); void SendKeyEvent(string key);
[OperationContract, WebInvoke(Method = "GET",
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "/sendKeyStringEvent?keyString={keyString}&shift={isShiftPressed}&alt={isAltPressed}&ctrl={isCtrlPressed}")]
void SendKeyStringEvent(string keyString, bool isShiftPressed = false, bool isAltPressed = false, bool isCtrlPressed = false);
#region profile #region profile
[OperationContract, WebInvoke(Method = "GET", [OperationContract, WebInvoke(Method = "GET",
ResponseFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json,
+54 -17
View File
@@ -64,6 +64,7 @@ namespace Vocaluxe.Base.Server
_Server = new CServer(CConfig.ServerPort, CConfig.ServerEncryption == EOffOn.TR_CONFIG_ON); _Server = new CServer(CConfig.ServerPort, CConfig.ServerEncryption == EOffOn.TR_CONFIG_ON);
CServer.SendKeyEvent = _SendKeyEvent; CServer.SendKeyEvent = _SendKeyEvent;
CServer.SendKeyStringEvent = _sendKeyStringEvent;
CServer.GetProfileData = _GetProfileData; CServer.GetProfileData = _GetProfileData;
CServer.SendProfileData = _SendProfileData; CServer.SendProfileData = _SendProfileData;
CServer.GetProfileList = _GetProfileList; CServer.GetProfileList = _GetProfileList;
@@ -125,9 +126,11 @@ namespace Vocaluxe.Base.Server
private static bool _SendKeyEvent(string key) private static bool _SendKeyEvent(string key)
{ {
bool result = false; bool result = false;
if (!string.IsNullOrEmpty(key)) var lowerKey = key.ToLower();
if (!string.IsNullOrEmpty(lowerKey))
{ {
switch (key.ToLower()) switch (lowerKey)
{ {
case "up": case "up":
Controller.AddKeyEvent(new SKeyEvent(ESender.Keyboard, false, false, false, false, Char.MinValue, Keys.Up)); Controller.AddKeyEvent(new SKeyEvent(ESender.Keyboard, false, false, false, false, Char.MinValue, Keys.Up));
@@ -157,25 +160,22 @@ namespace Vocaluxe.Base.Server
Controller.AddKeyEvent(new SKeyEvent(ESender.Keyboard, false, false, false, false, Char.MinValue, Keys.Tab)); Controller.AddKeyEvent(new SKeyEvent(ESender.Keyboard, false, false, false, false, Char.MinValue, Keys.Tab));
result = true; result = true;
break; break;
case "backspace":
Controller.AddKeyEvent(new SKeyEvent(ESender.Keyboard, false, false, false, false, Char.MinValue, Keys.Back));
result = true;
break;
default: default:
foreach (char c in key) if (lowerKey.StartsWith("f"))
{ {
bool shift = true; var numberString = lowerKey.Substring(1);
char keyChar; int number;
if (char.ToUpper(c) != c) Keys fKey;
{
keyChar = char.ToUpper(c);
shift = false;
}
else
keyChar = c;
if ((keyChar >= '0' && keyChar <= '9') || (keyChar >= 'A' && keyChar <= 'Z')) if (Int32.TryParse(numberString, out number) && number >= 1
&& number <= 12
&& Enum.TryParse("F" + number, true, out fKey))
{ {
Keys keys = (Keys)keyChar; Controller.AddKeyEvent(new SKeyEvent(ESender.Keyboard, false, false, false, false, Char.MinValue, fKey));
if (shift)
keys |= Keys.Shift;
Controller.AddKeyEvent(new SKeyEvent(ESender.Keyboard, false, false, false, false, Char.MinValue, keys));
result = true; result = true;
} }
} }
@@ -186,6 +186,43 @@ namespace Vocaluxe.Base.Server
return result; return result;
} }
private static bool _sendKeyStringEvent(string keyString, bool isShiftPressed , bool isAltPressed , bool isCtrlPressed )
{
bool result = false;
foreach (var key in keyString.ToCharArray())
{
Controller.AddKeyEvent(new SKeyEvent(ESender.Keyboard, isAltPressed,
Char.IsUpper(key) || isShiftPressed,
isCtrlPressed, true,
isShiftPressed?Char.ToUpper(key) :key,
_ParseKeys(key)));
result = true;
}
return result;
}
private static Keys _ParseKeys(char keyText)
{
Keys key;
if (!Enum.TryParse(keyText.ToString(), true, out key))
{
switch (keyText)
{
case ' ':
key = Keys.Space;
break;
default:
key = Keys.None;
break;
}
}
return key;
}
#region profile #region profile
private static SProfileData _GetProfileData(int profileId, bool isReadonly) private static SProfileData _GetProfileData(int profileId, bool isReadonly)
{ {
+25 -3
View File
@@ -297,14 +297,36 @@
<div class="ui-block-c"> <div class="ui-block-c">
<a data-role="button" id="keyboardButtonReturn" data-i18n="keyboardButtonReturn"></a> <a data-role="button" id="keyboardButtonReturn" data-i18n="keyboardButtonReturn"></a>
</div> </div>
<div class="ui-block-a">
<!--
<fieldset data-role="controlgroup" data-type="horizontal">
<input type="checkbox" name="keyboardButtonFunct" id="keyboardButtonFunct" />
<label data-i18n="keyboardButtonFunct" for="keyboardButtonFunct"></label>
</fieldset>-->
</div>
<div class="ui-block-b">
<fieldset data-role="controlgroup" data-type="horizontal">
<input type="checkbox" name="keyboardButtonShift" id="keyboardButtonShift" />
<label data-i18n="keyboardButtonShift" for="keyboardButtonShift"></label>
<input type="checkbox" name="keyboardButtonAlt" id="keyboardButtonAlt" />
<label data-i18n="keyboardButtonAlt" for="keyboardButtonAlt"></label>
<input type="checkbox" name="keyboardButtonCtrl" id="keyboardButtonCtrl" />
<label data-i18n="keyboardButtonCtrl" for="keyboardButtonCtrl"></label>
</fieldset>
</div>
<div class="ui-block-c"> <div class="ui-block-c">
<a data-role="button" id="keyboardButtonP">P</a> <a data-role="button" id="keyboardButtonBackspace" data-i18n="keyboardButtonBackspace"></a>
</div> </div>
</div> </div>
<!-- <div style> <div>
<fieldset data-role="controlgroup" data-type="horizontal">
<input type="checkbox" name="keyboardAutoSend" id="keyboardAutoSend" />
<label data-i18n="keyboardAutoSend" for="keyboardAutoSend"></label>
</fieldset>
<label for="keyboardButtonKeys" data-i18n="keyboardButtonKeys"></label> <label for="keyboardButtonKeys" data-i18n="keyboardButtonKeys"></label>
<input type="text" id="keyboardButtonKeys" data-mini="true"> <input type="text" id="keyboardButtonKeys" data-mini="true">
</div> --> <a data-role="button" id="keyboardButtonSend" data-i18n="keyboardButtonSend"></a>
</div>
</div> </div>
<!-- /content --> <!-- /content -->
</div> </div>
+77 -35
View File
@@ -300,6 +300,8 @@
var songPageHandler; var songPageHandler;
var playlistPageHandler; var playlistPageHandler;
var t = this;
this.customSelectPlaylistSongCallback = null; this.customSelectPlaylistSongCallback = null;
this.profileIdRequest = -1; this.profileIdRequest = -1;
this.songIdRequest = -1; this.songIdRequest = -1;
@@ -316,9 +318,9 @@
}; };
this.reset = function () { this.reset = function () {
this.customSelectPlaylistSongCallback = null; t.customSelectPlaylistSongCallback = null;
this.profileIdRequest = -1; t.profileIdRequest = -1;
this.songIdRequest = -1; t.songIdRequest = -1;
}; };
var replaceTransitionHandler = function () { var replaceTransitionHandler = function () {
@@ -639,7 +641,6 @@
var KeyboardPageHandler = function () { var KeyboardPageHandler = function () {
var init = function () { var init = function () {
initKeyboardPageHandler(); initKeyboardPageHandler();
}; };
@@ -686,25 +687,64 @@
}); });
}); });
$('#keyboardButtonP').click(function () { $('#keyboardButtonBackspace').click(function () {
request({ request({
url: "sendKeyEvent?key=p" url: "sendKeyEvent?key=backspace"
}); });
}); });
$('#keyboardButtonKeys').keyup(function (e) { $("#keyboardAutoSend").change(function () {
var c = String.fromCharCode(e.keyCode); if ($('#keyboardAutoSend').is(':checked')) {
if (c.match(/\w/)) { $('#keyboardButtonSend').hide();
c = e.keyCode >= 65 ? c.toLowerCase() : c; } else {
request({ $('#keyboardButtonSend').show();
url: "sendKeyEvent?key=" + c
});
}
var oldText = $('#keyboardButtonKeys')[0].value;
if (oldText.length > 0) {
$('#keyboardButtonKeys')[0].value = oldText.slice(1);
} }
}); });
$('#keyboardButtonSend').click(function () {
sendKeyboardText();
});
$('#keyboardButtonKeys').keyup(function (e) {
if (!$('#keyboardAutoSend').is(':checked') && e.keyCode != 13) {
return;
}
sendKeyboardText();
});
function sendKeyboardText() {
var text = $('#keyboardButtonKeys')[0].value;
if (text.length <= 0) {
return;
}
$('#keyboardButtonKeys')[0].value = "";
$('#keyboardButtonKeys').first().focus();
/* if ($('#keyboardButtonFunct').is(':checked')) {
$('#keyboardButtonKeys')[0].value = text.splice(1) + $('#keyboardButtonKeys')[0].value;
var numericElements = /^[0-9][0-9]?/.exec(text.charAt(0));
if (parseInt(numericElements)) {
request({
url: "sendKeyEvent?key=F" + numericElements
});
}
$("#keyboardButtonFunct").attr("checked", false).checkboxradio("refresh");
}*/
request({
contentType: "application/json;charset=utf-8",
type: "GET",
url: "sendKeyStringEvent?keyString=" + text
+ "&shift=" + $('#keyboardButtonShift').is(':checked')
+ "&alt=" + $('#keyboardButtonAlt').is(':checked')
+ "&ctrl=" + $('#keyboardButtonCtrl').is(':checked')
}).fail(function () {
$('#keyboardButtonKeys')[0].value = text + $('#keyboardButtonKeys')[0].value;
});
}
}; };
init(); init();
@@ -812,7 +852,7 @@
} }
}; };
var handleDisplayProfileData = function(data) { var handleDisplayProfileData = function (data) {
$('#playerName').prop("value", data.PlayerName); $('#playerName').prop("value", data.PlayerName);
imageLoader.addImage($('#playerAvatar')[0], data.Avatar, "img/profile.png"); imageLoader.addImage($('#playerAvatar')[0], data.Avatar, "img/profile.png");
@@ -829,19 +869,19 @@
$('#playerPassword').prop('disabled', false).prop("value", "***__oldPassword__***").parent().show(); $('#playerPassword').prop('disabled', false).prop("value", "***__oldPassword__***").parent().show();
$('#playerPasswordLabel').show(); $('#playerPasswordLabel').show();
$('#playerAvatar').click(function() { $('#playerAvatar').click(function () {
if ($('#captureContainer').length > 0) { if ($('#captureContainer').length > 0) {
$('#captureContainer').remove(); $('#captureContainer').remove();
} }
if (document.location.protocol == "file:" if (document.location.protocol == "file:"
&& typeof(navigator) != 'undefined' && typeof (navigator) != 'undefined'
&& typeof(navigator.camera) != 'undefined' && typeof (navigator.camera) != 'undefined'
&& typeof(navigator.camera.getPicture) != 'undefined') { && typeof (navigator.camera.getPicture) != 'undefined') {
navigator.camera.getPicture(function(imageData) { navigator.camera.getPicture(function (imageData) {
$('#playerAvatar').prop("src", "data:image/jpeg;base64," + imageData); $('#playerAvatar').prop("src", "data:image/jpeg;base64," + imageData);
$('#playerAvatar').data("changed", true); $('#playerAvatar').data("changed", true);
}, function() { }, function () {
//Fail - do nothing //Fail - do nothing
}, { }, {
destinationType: navigator.camera.DestinationType.DATA_URL, destinationType: navigator.camera.DestinationType.DATA_URL,
@@ -854,11 +894,11 @@
} else { } else {
$(document.body).append('<div id="captureContainer" style="height: 0px;width:0px; overflow:hidden;"> <input type="file" accept="image/*" id="capture" capture> </div>'); $(document.body).append('<div id="captureContainer" style="height: 0px;width:0px; overflow:hidden;"> <input type="file" accept="image/*" id="capture" capture> </div>');
$('#capture').change(function(eventData) { $('#capture').change(function (eventData) {
if (eventData && eventData.target && eventData.target.files && eventData.target.files.length == 1) { if (eventData && eventData.target && eventData.target.files && eventData.target.files.length == 1) {
var file = eventData.target.files[0]; var file = eventData.target.files[0];
var reader = new FileReader(); var reader = new FileReader();
reader.onloadend = function(e) { reader.onloadend = function (e) {
$('#playerAvatar').prop("src", e.target.result); $('#playerAvatar').prop("src", e.target.result);
$('#playerAvatar').data("changed", true); $('#playerAvatar').data("changed", true);
$('#captureContainer').remove(); $('#captureContainer').remove();
@@ -1358,14 +1398,16 @@
this.sessionId = ""; this.sessionId = "";
this.serverBaseAddress = ""; this.serverBaseAddress = "";
var init = function() { var t = this;
var init = function () {
initHeartbeat(); initHeartbeat();
}; };
this.logout = function () { this.logout = function () {
this.ownProfileId = -1; t.ownProfileId = -1;
this.sessionId = ""; t.sessionId = "";
pageHandler.reset(); pageHandler.reset();
@@ -1376,9 +1418,9 @@
}; };
var checkSession = function() { var checkSession = function () {
if (ownProfileId == -1 if (t.ownProfileId == -1
&& profileIdRequest == -1 && pageHandler.profileIdRequest == -1
&& ($.mobile.activePage.attr("id") == "displayProfile" || $.mobile.activePage.attr("id") == "login" || $.mobile.activePage.attr("id") == "discover")) { && ($.mobile.activePage.attr("id") == "displayProfile" || $.mobile.activePage.attr("id") == "login" || $.mobile.activePage.attr("id") == "discover")) {
return; return;
} }
@@ -1386,14 +1428,14 @@
url: "getOwnProfileId" url: "getOwnProfileId"
}, "noOverlay").done(function (result) { }, "noOverlay").done(function (result) {
if (result == -1) { if (result == -1) {
this.logout(); t.logout();
} }
}).fail(function (result) { }).fail(function (result) {
this.logout(); t.logout();
}); });
}; };
var initHeartbeat = function() { var initHeartbeat = function () {
setInterval(checkSession, 20000); setInterval(checkSession, 20000);
}; };
+7 -1
View File
@@ -76,5 +76,11 @@
"discoverConnectServerAddress": "Serveradresse:", "discoverConnectServerAddress": "Serveradresse:",
"discoverConnectButton": "Verbinden", "discoverConnectButton": "Verbinden",
"Checking...": "Prüfen...", "Checking...": "Prüfen...",
"timeout": "Zeitüberschreitung" "timeout": "Zeitüberschreitung",
"keyboardButtonShift": "Umschalt",
"keyboardButtonAlt": "Alt",
"keyboardButtonCtrl": "Steuerung",
"keyboardButtonBackspace": "Rücktaste",
"keyboardAutoSend": "Tasten autom. senden",
"keyboardButtonSend": "Senden"
} }
+7 -1
View File
@@ -76,5 +76,11 @@
"discoverConnectServerAddress": "Serveraddress:", "discoverConnectServerAddress": "Serveraddress:",
"discoverConnectButton": "Connect", "discoverConnectButton": "Connect",
"Checking...": "Checking...", "Checking...": "Checking...",
"timeout": "Timeout" "timeout": "Timeout",
"keyboardButtonShift": "Shift",
"keyboardButtonAlt": "Alt",
"keyboardButtonCtrl": "Control",
"keyboardButtonBackspace": "Backspace",
"keyboardAutoSend": "Auto send keys",
"keyboardButtonSend": "Send"
} }