- Integration of the server into the main project
- Made the webserver calls threadsafe (with Tasks) - Removed some old and unused server classes
This commit is contained in:
1 parent
2b9a38ff0d
commit
86a98e7bf8
21 files changed
+417
-1030
No files matched your search
@@ -1,138 +0,0 @@
|
||||
#region license
|
||||
// This file is part of Vocaluxe.
|
||||
//
|
||||
// Vocaluxe is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Vocaluxe is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Vocaluxe. If not, see <http://www.gnu.org/licenses/>.
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Timers;
|
||||
|
||||
namespace ServerLib
|
||||
{
|
||||
public delegate void OnServerDiscovered(string ipAddress, string hostname);
|
||||
|
||||
public class CDiscover
|
||||
{
|
||||
public const string Timeout = "Timeout";
|
||||
public const string Finished = "Finished";
|
||||
|
||||
private readonly string _Keyword;
|
||||
private readonly string _BroadcastAddress;
|
||||
private readonly int _Port;
|
||||
|
||||
private Thread _DiscoverThread;
|
||||
private bool _DiscoverRunning;
|
||||
private OnServerDiscovered _OnDiscovered;
|
||||
|
||||
private readonly System.Timers.Timer _BroadcastTimer;
|
||||
|
||||
public CDiscover(int port, string keyword, string broadcastAddress = "255.255.255.255")
|
||||
{
|
||||
_BroadcastAddress = broadcastAddress;
|
||||
_Port = port;
|
||||
_Keyword = keyword;
|
||||
|
||||
_DiscoverRunning = false;
|
||||
_BroadcastTimer = new System.Timers.Timer();
|
||||
_BroadcastTimer.Elapsed += _OnBroadcastEvent;
|
||||
_BroadcastTimer.Interval = 2500;
|
||||
}
|
||||
|
||||
public void StartBroadcasting()
|
||||
{
|
||||
_BroadcastTimer.Start();
|
||||
}
|
||||
|
||||
public void Stop()
|
||||
{
|
||||
_BroadcastTimer.Stop();
|
||||
_DiscoverRunning = false;
|
||||
}
|
||||
|
||||
public void Discover(OnServerDiscovered onDiscovered, int timeout = 5000)
|
||||
{
|
||||
if (_DiscoverRunning)
|
||||
return;
|
||||
|
||||
_DiscoverRunning = true;
|
||||
_DiscoverThread = new Thread(() => _Discover(timeout)) {Name = "Client discover"};
|
||||
_OnDiscovered = onDiscovered;
|
||||
_DiscoverThread.Start();
|
||||
}
|
||||
|
||||
private void _OnBroadcastEvent(object source, ElapsedEventArgs e)
|
||||
{
|
||||
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) {EnableBroadcast = true};
|
||||
IPAddress broadcast = IPAddress.Parse(_BroadcastAddress);
|
||||
byte[] sendbuf = Encoding.UTF8.GetBytes(_Keyword);
|
||||
IPEndPoint ep = new IPEndPoint(broadcast, _Port);
|
||||
|
||||
s.SendTo(sendbuf, ep);
|
||||
s.Close();
|
||||
}
|
||||
|
||||
private void _Discover(int timeout)
|
||||
{
|
||||
UdpClient listener = null;
|
||||
Stopwatch timer = new Stopwatch();
|
||||
|
||||
List<string> knownServer = new List<string>();
|
||||
bool foundSomething = false;
|
||||
timer.Start();
|
||||
while (_DiscoverRunning && timer.ElapsedMilliseconds < timeout * 2)
|
||||
{
|
||||
try
|
||||
{
|
||||
listener = new UdpClient(_Port);
|
||||
IPEndPoint groupEp = new IPEndPoint(IPAddress.Any, _Port);
|
||||
listener.Client.ReceiveTimeout = timeout;
|
||||
|
||||
//byte[] bytes =
|
||||
listener.Receive(ref groupEp);
|
||||
//string message = Encoding.UTF8.GetString(bytes, 0, bytes.Length);
|
||||
|
||||
foundSomething = true;
|
||||
if (!knownServer.Contains(groupEp.Address.ToString()))
|
||||
{
|
||||
knownServer.Add(groupEp.Address.ToString());
|
||||
if (_OnDiscovered != null)
|
||||
{
|
||||
IPHostEntry e = Dns.GetHostEntry(groupEp.Address);
|
||||
string hostname = e.HostName;
|
||||
|
||||
_OnDiscovered(groupEp.Address.ToString(), hostname);
|
||||
}
|
||||
}
|
||||
|
||||
listener.Close();
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
if (listener != null)
|
||||
listener.Close();
|
||||
}
|
||||
}
|
||||
_DiscoverRunning = false;
|
||||
|
||||
if (_OnDiscovered != null)
|
||||
_OnDiscovered(!foundSomething ? Timeout : Finished, String.Empty);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,225 +0,0 @@
|
||||
#region license
|
||||
// This file is part of Vocaluxe.
|
||||
//
|
||||
// Vocaluxe is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Vocaluxe is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Vocaluxe. If not, see <http://www.gnu.org/licenses/>.
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
#if WIN
|
||||
using System.Diagnostics;
|
||||
#endif
|
||||
using System.ServiceModel;
|
||||
using System.ServiceModel.Web;
|
||||
using System.Net;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace ServerLib
|
||||
{
|
||||
public class CServer
|
||||
{
|
||||
private ServiceHost _Host;
|
||||
private Uri _BaseAddress;
|
||||
private bool _Encrypted;
|
||||
|
||||
public static SendKeyEventDelegate SendKeyEvent { internal get; set; }
|
||||
public static SendKeyStringEventDelegate SendKeyStringEvent { internal get; set; }
|
||||
|
||||
#region profile
|
||||
public static GetProfileDataDelegate GetProfileData { internal get; set; }
|
||||
|
||||
public static SendProfileDataDelegate SendProfileData { internal get; set; }
|
||||
|
||||
public static GetProfileListDelegate GetProfileList { internal get; set; }
|
||||
#endregion
|
||||
|
||||
#region photo
|
||||
public static SendPhotoDelegate SendPhoto { get; set; }
|
||||
#endregion
|
||||
|
||||
#region website
|
||||
public static GetSiteFileDelegate GetSiteFile { internal get; set; }
|
||||
|
||||
public static GetDelayedImageDelegate GetDelayedImage { internal get; set; }
|
||||
|
||||
public static GetServerVersionDelegate GetServerVersion { internal get; set; }
|
||||
#endregion
|
||||
|
||||
#region songs
|
||||
public static GetSongDelegate GetSong { internal get; set; }
|
||||
|
||||
public static GetAllSongsDelegate GetAllSongs { internal get; set; }
|
||||
|
||||
public static GetCurrentSongIdDelegate GetCurrentSongId { internal get; set; }
|
||||
|
||||
public static GetMp3PathDelegate GetMp3Path { internal get; set; }
|
||||
#endregion
|
||||
|
||||
#region playlist
|
||||
public static GetPlaylistsDelegate GetPlaylists { internal get; set; }
|
||||
|
||||
public static GetPlaylistDelegate GetPlaylist { internal get; set; }
|
||||
|
||||
public static AddSongToPlaylistDelegate AddSongToPlaylist { internal get; set; }
|
||||
|
||||
public static RemoveSongFromPlaylistDelegate RemoveSongFromPlaylist { internal get; set; }
|
||||
|
||||
public static MoveSongInPlaylistDelegate MoveSongInPlaylist { internal get; set; }
|
||||
|
||||
public static PlaylistContainsSongDelegate PlaylistContainsSong { internal get; set; }
|
||||
|
||||
public static GetPlaylistSongsDelegate GetPlaylistSongs { internal get; set; }
|
||||
|
||||
public static RemovePlaylistDelegate RemovePlaylist { internal get; set; }
|
||||
|
||||
public static AddPlaylistDelegate AddPlaylist { internal get; set; }
|
||||
#endregion
|
||||
|
||||
#region user management
|
||||
public static ValidatePasswordDelegate ValidatePassword { internal get; set; }
|
||||
|
||||
public static GetUserRoleDelegate GetUserRole { internal get; set; }
|
||||
|
||||
public static SetUserRoleDelegate SetUserRole { internal get; set; }
|
||||
|
||||
public static GetUserIdFromUsernameDelegate GetUserIdFromUsername { internal get; set; }
|
||||
#endregion
|
||||
|
||||
public CServer(int port, bool encrypted)
|
||||
{
|
||||
_Init(port, encrypted);
|
||||
}
|
||||
|
||||
public string GetBaseAddress()
|
||||
{
|
||||
return _BaseAddress.AbsoluteUri;
|
||||
|
||||
/*IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName());
|
||||
foreach (IPAddress ip in ips)
|
||||
{
|
||||
if (ip.AddressFamily == AddressFamily.InterNetwork)
|
||||
return ip.ToString();
|
||||
}
|
||||
return "";*/
|
||||
}
|
||||
|
||||
public bool IsRunning()
|
||||
{
|
||||
return _Host.State == CommunicationState.Opened;
|
||||
}
|
||||
|
||||
#region server control
|
||||
private void _Init(int port, bool encrypted)
|
||||
{
|
||||
string hostname = Dns.GetHostName();
|
||||
string protocol = (encrypted) ? "https" : "http";
|
||||
_BaseAddress = new Uri(protocol + "://" + hostname + ":" + port + "/");
|
||||
_Encrypted = encrypted;
|
||||
_Host = new WebServiceHost(typeof(CWebservice), _BaseAddress);
|
||||
|
||||
WebHttpBinding wb = new WebHttpBinding
|
||||
{
|
||||
MaxReceivedMessageSize = 10485760,
|
||||
MaxBufferSize = 10485760,
|
||||
MaxBufferPoolSize = 10485760,
|
||||
ReaderQuotas = {MaxStringContentLength = 10485760, MaxArrayLength = 10485760, MaxBytesPerRead = 10485760}
|
||||
};
|
||||
if (encrypted)
|
||||
{
|
||||
wb.Security.Mode = WebHttpSecurityMode.Transport;
|
||||
wb.Security.Transport = new HttpTransportSecurity {ClientCredentialType = HttpClientCredentialType.None};
|
||||
}
|
||||
_Host.AddServiceEndpoint(typeof(ICWebservice), wb, "");
|
||||
}
|
||||
|
||||
public void Start()
|
||||
{
|
||||
try
|
||||
{
|
||||
/*ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
|
||||
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
|
||||
smb.HttpGetEnabled = true;
|
||||
host.Description.Behaviors.Add(smb);*/
|
||||
_RegisterUrlAndCert(_BaseAddress.Port, false);
|
||||
_Host.Open();
|
||||
}
|
||||
catch (CommunicationException e)
|
||||
{
|
||||
if (e is AddressAccessDeniedException || e is AddressAlreadyInUseException)
|
||||
{
|
||||
_RegisterUrlAndCert(_BaseAddress.Port, true);
|
||||
try
|
||||
{
|
||||
_Host.Abort();
|
||||
_Init(_BaseAddress.Port, _Encrypted);
|
||||
_Host.Open();
|
||||
}
|
||||
catch (CommunicationException)
|
||||
{
|
||||
_Host.Abort();
|
||||
MessageBox.Show("Problem while initialization of webserver. You may try a different port (Change it in config.xml)");
|
||||
}
|
||||
}
|
||||
else
|
||||
_Host.Abort();
|
||||
}
|
||||
}
|
||||
|
||||
public void Stop()
|
||||
{
|
||||
try
|
||||
{
|
||||
_Host.Close();
|
||||
}
|
||||
catch (CommunicationException)
|
||||
{
|
||||
_Host.Abort();
|
||||
}
|
||||
}
|
||||
|
||||
private void _RegisterUrlAndCert(int port, bool reserve)
|
||||
{
|
||||
#if WIN
|
||||
|
||||
ProcessStartInfo info = new ProcessStartInfo
|
||||
{
|
||||
FileName = "VocaluxeServerConfig.exe",
|
||||
WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory,
|
||||
Arguments = AppDomain.CurrentDomain.FriendlyName + " " + port + " " + (_Encrypted ? "true" : "false") + (reserve ? " true" : ""),
|
||||
UseShellExecute = true,
|
||||
CreateNoWindow = true,
|
||||
WindowStyle = ProcessWindowStyle.Hidden,
|
||||
};
|
||||
try
|
||||
{
|
||||
using (Process p = Process.Start(info))
|
||||
{
|
||||
p.WaitForExit();
|
||||
if (p.ExitCode != 0)
|
||||
MessageBox.Show("Registering the Server failed (Code " + p.ExitCode + ")!\r\nThe Server might not work correctly.");
|
||||
p.Close();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
MessageBox.Show("Registering the Server failed (" + e + ")!\r\nThe Server might not work correctly.");
|
||||
}
|
||||
#else
|
||||
|
||||
//Required?
|
||||
|
||||
#endif
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -1,186 +0,0 @@
|
||||
#region license
|
||||
// This file is part of Vocaluxe.
|
||||
//
|
||||
// Vocaluxe is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Vocaluxe is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Vocaluxe. If not, see <http://www.gnu.org/licenses/>.
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Runtime.Serialization;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace ServerLib
|
||||
{
|
||||
public delegate bool SendKeyEventDelegate(string key);
|
||||
|
||||
public delegate bool SendKeyStringEventDelegate(string keyString, bool isShiftPressed, bool isAltPressed, bool isCtrlPressed);
|
||||
|
||||
#region profile
|
||||
public delegate SProfileData GetProfileDataDelegate(int profileId, bool isReadonly);
|
||||
|
||||
public delegate bool SendProfileDataDelegate(SProfileData profile);
|
||||
|
||||
public delegate SProfileData[] GetProfileListDelegate();
|
||||
|
||||
[DataContract]
|
||||
public struct SProfileData
|
||||
{
|
||||
[DataMember] public CBase64Image Avatar;
|
||||
[DataMember] public string PlayerName;
|
||||
[DataMember] public int Type;
|
||||
[DataMember] public int Difficulty;
|
||||
[DataMember] public int ProfileId;
|
||||
[DataMember] public bool IsEditable;
|
||||
[DataMember] public string Password;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region photo
|
||||
public delegate bool SendPhotoDelegate(SPhotoData photo);
|
||||
|
||||
[DataContract]
|
||||
public struct SPhotoData
|
||||
{
|
||||
[DataMember] public CBase64Image Photo;
|
||||
//Add infomation about the user who took this image??
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region website
|
||||
public delegate byte[] GetSiteFileDelegate(string filename);
|
||||
|
||||
public delegate CBase64Image GetDelayedImageDelegate(string hashedFilename);
|
||||
|
||||
public delegate String GetServerVersionDelegate();
|
||||
#endregion
|
||||
|
||||
[DataContract]
|
||||
public class CBase64Image
|
||||
{
|
||||
// ReSharper disable InconsistentNaming
|
||||
[DataMember] private string base64Data = "";
|
||||
[DataMember] private string imageId = "";
|
||||
// ReSharper restore InconsistentNaming
|
||||
|
||||
public CBase64Image(Image img, ImageFormat format)
|
||||
{
|
||||
MemoryStream ms = new MemoryStream();
|
||||
img.Save(ms, format);
|
||||
string formatString = ImageCodecInfo.GetImageEncoders().FirstOrDefault(x => x.FormatID == format.Guid).FilenameExtension.Replace("*.", "").ToLower();
|
||||
base64Data = "data:image/" + formatString + ";base64," + Convert.ToBase64String(ms.ToArray());
|
||||
}
|
||||
|
||||
public CBase64Image(string imageId)
|
||||
{
|
||||
this.imageId = imageId;
|
||||
}
|
||||
|
||||
public Image GetImage()
|
||||
{
|
||||
string onlyBase64Data = base64Data.Substring(base64Data.IndexOf(";base64,") + (";base64,").Length);
|
||||
byte[] imageData = Convert.FromBase64String(onlyBase64Data);
|
||||
MemoryStream ms = new MemoryStream(imageData, 0, imageData.Length);
|
||||
ms.Write(imageData, 0, imageData.Length);
|
||||
Image image = Image.FromStream(ms, true);
|
||||
return image;
|
||||
}
|
||||
|
||||
public string GetImageType()
|
||||
{
|
||||
Match match = Regex.Match(base64Data, "(?<=data:image/)[a-zA-Z]+(?=;base64)");
|
||||
return match.Success ? match.Groups[0].Value : "";
|
||||
}
|
||||
}
|
||||
|
||||
#region songs
|
||||
public delegate SSongInfo GetSongDelegate(int songId);
|
||||
|
||||
public delegate SSongInfo[] GetAllSongsDelegate();
|
||||
|
||||
public delegate int GetCurrentSongIdDelegate();
|
||||
|
||||
public delegate string GetMp3PathDelegate(int songId);
|
||||
|
||||
[DataContract]
|
||||
public struct SSongInfo
|
||||
{
|
||||
[DataMember] public string Title;
|
||||
[DataMember] public string Artist;
|
||||
[DataMember] public CBase64Image Cover;
|
||||
[DataMember]
|
||||
public string Genre { get; set; }
|
||||
[DataMember]
|
||||
public string Language { get; set; }
|
||||
[DataMember]
|
||||
public string Year { get; set; }
|
||||
[DataMember]
|
||||
public bool IsDuet { get; set; }
|
||||
[DataMember]
|
||||
public int SongId { get; set; }
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region playlists
|
||||
public delegate SPlaylistData[] GetPlaylistsDelegate();
|
||||
|
||||
public delegate SPlaylistData GetPlaylistDelegate(int playlistId);
|
||||
|
||||
public delegate void AddSongToPlaylistDelegate(int songId, int playlistId, bool allowDuplicates);
|
||||
|
||||
public delegate void RemoveSongFromPlaylistDelegate(int position, int playlistId, int songId);
|
||||
|
||||
public delegate void MoveSongInPlaylistDelegate(int newPosition, int playlistId, int songId);
|
||||
|
||||
public delegate bool PlaylistContainsSongDelegate(int songId, int playlistId);
|
||||
|
||||
public delegate SPlaylistSongInfo[] GetPlaylistSongsDelegate(int playlistId);
|
||||
|
||||
public delegate void RemovePlaylistDelegate(int playlistId);
|
||||
|
||||
public delegate int AddPlaylistDelegate(string playlistName);
|
||||
|
||||
[DataContract]
|
||||
public struct SPlaylistSongInfo
|
||||
{
|
||||
[DataMember] public SSongInfo Song;
|
||||
[DataMember] public int PlaylistId;
|
||||
[DataMember] public int PlaylistPosition;
|
||||
[DataMember] public int GameMode;
|
||||
}
|
||||
|
||||
[DataContract]
|
||||
public struct SPlaylistData
|
||||
{
|
||||
[DataMember] public int PlaylistId;
|
||||
[DataMember] public string PlaylistName;
|
||||
[DataMember] public int SongCount;
|
||||
[DataMember] public string LastChanged;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region user management
|
||||
public delegate void SetPasswordDelegate(int profileId, string newPassword);
|
||||
|
||||
public delegate bool ValidatePasswordDelegate(int profileId, string password);
|
||||
|
||||
public delegate int GetUserRoleDelegate(int profileId);
|
||||
|
||||
public delegate void SetUserRoleDelegate(int profileId, int userRole);
|
||||
|
||||
public delegate int GetUserIdFromUsernameDelegate(string username);
|
||||
#endregion
|
||||
}
|
||||
@@ -1,56 +0,0 @@
|
||||
#region license
|
||||
// This file is part of Vocaluxe.
|
||||
//
|
||||
// Vocaluxe is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Vocaluxe is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Vocaluxe. If not, see <http://www.gnu.org/licenses/>.
|
||||
#endregion
|
||||
|
||||
using System.Reflection;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// Allgemeine Informationen über eine Assembly werden über die folgenden
|
||||
// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
|
||||
// die mit einer Assembly verknüpft sind.
|
||||
|
||||
[assembly: AssemblyTitle("ClientServerLib")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("ClientServerLib")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2013")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar
|
||||
// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von
|
||||
// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest.
|
||||
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
|
||||
|
||||
[assembly: Guid("53f89645-1948-420f-b64a-7dc705ca8820")]
|
||||
|
||||
// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
|
||||
//
|
||||
// Hauptversion
|
||||
// Nebenversion
|
||||
// Buildnummer
|
||||
// Revision
|
||||
//
|
||||
// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
|
||||
// übernehmen, indem Sie "*" eingeben:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
@@ -1,89 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>8.0.30703</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>ServerLib</RootNamespace>
|
||||
<AssemblyName>ServerLib</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<TargetFrameworkProfile>
|
||||
</TargetFrameworkProfile>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugWin|AnyCPU'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<OutputPath>..\Output\</OutputPath>
|
||||
<DefineConstants>TRACE;DEBUG;WIN;</DefineConstants>
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugLinux|AnyCPU'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<OutputPath>..\Output\</OutputPath>
|
||||
<DefineConstants>TRACE;DEBUG;LINUX;</DefineConstants>
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseWin|AnyCPU'">
|
||||
<OutputPath>..\Output\</OutputPath>
|
||||
<DefineConstants>TRACE;WIN;</DefineConstants>
|
||||
<Optimize>true</Optimize>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseLinux|AnyCPU'">
|
||||
<OutputPath>..\Output\</OutputPath>
|
||||
<DefineConstants>TRACE;LINUX;</DefineConstants>
|
||||
<Optimize>true</Optimize>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Runtime.Serialization" />
|
||||
<Reference Include="System.ServiceModel" />
|
||||
<Reference Include="System.ServiceModel.Web" />
|
||||
<Reference Include="System.Web.Services" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="CDiscover.cs" />
|
||||
<Compile Include="CServer.cs" />
|
||||
<Compile Include="CWebservice.cs" />
|
||||
<Compile Include="DataStructs.cs" />
|
||||
<Compile Include="ICWebservice.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Session.cs" />
|
||||
<Compile Include="SessionControl.cs" />
|
||||
<Compile Include="UserRights.cs" />
|
||||
<Compile Include="UserRoleControl.cs" />
|
||||
<Compile Include="UserRoles.cs" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
Binary file not shown.
+3
-24
@@ -1,11 +1,12 @@
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 2012
|
||||
# Visual Studio 2013
|
||||
VisualStudioVersion = 12.0.31101.0
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Vocaluxe", "Vocaluxe\Vocaluxe.csproj", "{2A1E0F2D-5392-4BB7-B0A1-A9DFA13E79FF}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{55F89808-4E79-4FFE-BC13-48258913F5C9} = {55F89808-4E79-4FFE-BC13-48258913F5C9}
|
||||
{6F3E1874-F28A-40E9-AFBD-31934D593678} = {6F3E1874-F28A-40E9-AFBD-31934D593678}
|
||||
{6F3E1874-F28A-40E9-AFBD-31934D593679} = {6F3E1874-F28A-40E9-AFBD-31934D593679}
|
||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3} = {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}
|
||||
{D2B6DDEF-E0E1-4DDF-A73A-E6ACEF5C95EC} = {D2B6DDEF-E0E1-4DDF-A73A-E6ACEF5C95EC}
|
||||
{5A4053F1-5AD5-441F-B254-D97A088127B6} = {5A4053F1-5AD5-441F-B254-D97A088127B6}
|
||||
{54A48AF7-515C-4EDD-B395-2BFFA096050A} = {54A48AF7-515C-4EDD-B395-2BFFA096050A}
|
||||
@@ -19,8 +20,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PartyModeChallenge", "Party
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PartyModeChallengeMedley", "PartyModes\PartyModeChallengeMedley\PartyModeChallengeMedley.csproj", "{6F3E1874-F28A-40E9-AFBD-31934D593678}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServerLib", "ServerLib\ServerLib.csproj", "{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebserverInitalConfig", "WebserverInitalConfig\WebserverInitalConfig.csproj", "{55F89808-4E79-4FFE-BC13-48258913F5C9}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PitchTracker", "PitchTracker\PitchTracker.vcxproj", "{54A48AF7-515C-4EDD-B395-2BFFA096050A}"
|
||||
@@ -146,26 +145,6 @@ Global
|
||||
{6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseWin|x64.Build.0 = ReleaseWin|Any CPU
|
||||
{6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseWin|x86.ActiveCfg = ReleaseWin|Any CPU
|
||||
{6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseWin|x86.Build.0 = ReleaseWin|Any CPU
|
||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugLinux|x64.ActiveCfg = DebugLinux|Any CPU
|
||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugLinux|x64.Build.0 = DebugLinux|Any CPU
|
||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugLinux|x86.ActiveCfg = DebugLinux|Any CPU
|
||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugLinux|x86.Build.0 = DebugLinux|Any CPU
|
||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugWin|x64.ActiveCfg = DebugWin|Any CPU
|
||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugWin|x64.Build.0 = DebugWin|Any CPU
|
||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugWin|x86.ActiveCfg = DebugWin|Any CPU
|
||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugWin|x86.Build.0 = DebugWin|Any CPU
|
||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.InstallerWin|x64.ActiveCfg = ReleaseWin|Any CPU
|
||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.InstallerWin|x64.Build.0 = ReleaseWin|Any CPU
|
||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.InstallerWin|x86.ActiveCfg = ReleaseWin|Any CPU
|
||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.InstallerWin|x86.Build.0 = ReleaseWin|Any CPU
|
||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseLinux|x64.ActiveCfg = ReleaseLinux|Any CPU
|
||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseLinux|x64.Build.0 = ReleaseLinux|Any CPU
|
||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseLinux|x86.ActiveCfg = ReleaseLinux|Any CPU
|
||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseLinux|x86.Build.0 = ReleaseLinux|Any CPU
|
||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseWin|x64.ActiveCfg = ReleaseWin|Any CPU
|
||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseWin|x64.Build.0 = ReleaseWin|Any CPU
|
||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseWin|x86.ActiveCfg = ReleaseWin|Any CPU
|
||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseWin|x86.Build.0 = ReleaseWin|Any CPU
|
||||
{55F89808-4E79-4FFE-BC13-48258913F5C9}.DebugLinux|x64.ActiveCfg = Debug|Any CPU
|
||||
{55F89808-4E79-4FFE-BC13-48258913F5C9}.DebugLinux|x86.ActiveCfg = Debug|Any CPU
|
||||
{55F89808-4E79-4FFE-BC13-48258913F5C9}.DebugWin|x64.ActiveCfg = Debug|Any CPU
|
||||
|
||||
@@ -14,7 +14,9 @@
|
||||
<s:String x:Key="/Default/CodeStyle/CodeCleanup/Profiles/=Simple_0020Reformat/@EntryIndexedValue"><?xml version="1.0" encoding="utf-16"?><Profile name="Simple Reformat"><CSOptimizeUsings><OptimizeUsings>False</OptimizeUsings><EmbraceInRegion>False</EmbraceInRegion><RegionName></RegionName></CSOptimizeUsings><CSReformatCode>True</CSReformatCode><StyleCop.Documentation><SA1600ElementsMustBeDocumented>False</SA1600ElementsMustBeDocumented><SA1604ElementDocumentationMustHaveSummary>False</SA1604ElementDocumentationMustHaveSummary><SA1609PropertyDocumentationMustHaveValueDocumented>False</SA1609PropertyDocumentationMustHaveValueDocumented><SA1611ElementParametersMustBeDocumented>False</SA1611ElementParametersMustBeDocumented><SA1615ElementReturnValueMustBeDocumented>False</SA1615ElementReturnValueMustBeDocumented><SA1617VoidReturnValueMustNotBeDocumented>False</SA1617VoidReturnValueMustNotBeDocumented><SA1618GenericTypeParametersMustBeDocumented>False</SA1618GenericTypeParametersMustBeDocumented><SA1626SingleLineCommentsMustNotUseDocumentationStyleSlashes>False</SA1626SingleLineCommentsMustNotUseDocumentationStyleSlashes><SA1628DocumentationTextMustBeginWithACapitalLetter>False</SA1628DocumentationTextMustBeginWithACapitalLetter><SA1629DocumentationTextMustEndWithAPeriod>False</SA1629DocumentationTextMustEndWithAPeriod><SA1633SA1641UpdateFileHeader>Ignore</SA1633SA1641UpdateFileHeader><SA1639FileHeaderMustHaveSummary>False</SA1639FileHeaderMustHaveSummary><SA1642ConstructorSummaryDocumentationMustBeginWithStandardText>False</SA1642ConstructorSummaryDocumentationMustBeginWithStandardText><SA1643DestructorSummaryDocumentationMustBeginWithStandardText>False</SA1643DestructorSummaryDocumentationMustBeginWithStandardText><SA1644DocumentationHeadersMustNotContainBlankLines>False</SA1644DocumentationHeadersMustNotContainBlankLines></StyleCop.Documentation><StyleCop.Spacing><SA1001CommasMustBeSpacedCorrectly>False</SA1001CommasMustBeSpacedCorrectly><SA1005SingleLineCommentsMustBeginWithSingleSpace>False</SA1005SingleLineCommentsMustBeginWithSingleSpace><SA1006PreprocessorKeywordsMustNotBePrecededBySpace>True</SA1006PreprocessorKeywordsMustNotBePrecededBySpace><SA1021NegativeSignsMustBeSpacedCorrectly>True</SA1021NegativeSignsMustBeSpacedCorrectly><SA1022PositiveSignsMustBeSpacedCorrectly>True</SA1022PositiveSignsMustBeSpacedCorrectly><SA1025CodeMustNotContainMultipleWhitespaceInARow>True</SA1025CodeMustNotContainMultipleWhitespaceInARow></StyleCop.Spacing><StyleCop.Readability><SA1100DoNotPrefixCallsWithBaseUnlessLocalImplementationExists>True</SA1100DoNotPrefixCallsWithBaseUnlessLocalImplementationExists><SA1106CodeMustNotContainEmptyStatements>True</SA1106CodeMustNotContainEmptyStatements><SA1108BlockStatementsMustNotContainEmbeddedComments>True</SA1108BlockStatementsMustNotContainEmbeddedComments><SA1109BlockStatementsMustNotContainEmbeddedRegions>True</SA1109BlockStatementsMustNotContainEmbeddedRegions><SA1120CommentsMustContainText>False</SA1120CommentsMustContainText><SA1121UseBuiltInTypeAlias>False</SA1121UseBuiltInTypeAlias><SA1122UseStringEmptyForEmptyStrings>False</SA1122UseStringEmptyForEmptyStrings><SA1123DoNotPlaceRegionsWithinElements>False</SA1123DoNotPlaceRegionsWithinElements><SA1124CodeMustNotContainEmptyRegions>True</SA1124CodeMustNotContainEmptyRegions></StyleCop.Readability><StyleCop.Layout><SA1500CurlyBracketsForMultiLineStatementsMustNotShareLine>False</SA1500CurlyBracketsForMultiLineStatementsMustNotShareLine><SA1509OpeningCurlyBracketsMustNotBePrecededByBlankLine>True</SA1509OpeningCurlyBracketsMustNotBePrecededByBlankLine><SA1510ChainedStatementBlocksMustNotBePrecededByBlankLine>True</SA1510ChainedStatementBlocksMustNotBePrecededByBlankLine><SA1511WhileDoFooterMustNotBePrecededByBlankLine>True</SA1511WhileDoFooterMustNotBePrecededByBlankLine><SA1512SingleLineCommentsMustNotBeFollowedByBlankLine>True</SA1512SingleLineCommentsMustNotBeFollowedByBlankLine><SA1513ClosingCurlyBracketMustBeFollowedByBlankLine>False</SA1513ClosingCurlyBracketMustBeFollowedByBlankLine><SA1514ElementDocumentationHeaderMustBePrecededByBlankLine>False</SA1514ElementDocumentationHeaderMustBePrecededByBlankLine><SA1515SingleLineCommentMustBeProceededByBlankLine>False</SA1515SingleLineCommentMustBeProceededByBlankLine></StyleCop.Layout><StyleCop.Ordering><AlphabeticalUsingDirectives>Ignore</AlphabeticalUsingDirectives><ExpandUsingDirectiLine truncated
|
||||
<s:String x:Key="/Default/CodeStyle/CodeCleanup/RecentlyUsedProfile/@EntryValue">Cleanup</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/CodeCleanup/SilentCleanupProfile/@EntryValue">Simple Reformat</s:String>
|
||||
<s:Int64 x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/BLANK_LINES_AROUND_AUTO_PROPERTY/@EntryValue">0</s:Int64>
|
||||
<s:Int64 x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/BLANK_LINES_AROUND_FIELD/@EntryValue">0</s:Int64>
|
||||
<s:Int64 x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/BLANK_LINES_AROUND_PROPERTY/@EntryValue">0</s:Int64>
|
||||
<s:Int64 x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/BLANK_LINES_INSIDE_REGION/@EntryValue">0</s:Int64>
|
||||
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/EMPTY_BLOCK_STYLE/@EntryValue">TOGETHER_SAME_LINE</s:String>
|
||||
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/EXPLICIT_INTERNAL_MODIFIER/@EntryValue">False</s:Boolean>
|
||||
@@ -115,6 +117,8 @@ along with $SOLUTION$. If not, see <http://www.gnu.org/licenses/>.</s:Stri
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=8cff90ce_002Def0d_002D436d_002Db8f2_002D5b5bdb923d3b/@EntryIndexedValue"><Policy><Descriptor Staticness="Static, Instance" AccessRightKinds="Private, Protected, ProtectedInternal, Internal, Public" Description="Classes"><ElementKinds><Kind Name="CLASS" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="C" Suffix="" Style="AaBb" /></Policy></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=9aa707ae_002Dd4fb_002D4760_002Da649_002Dffcedfabd5dc/@EntryIndexedValue"><Policy><Descriptor Staticness="Static, Instance" AccessRightKinds="Private, Protected" Description="Fields (not public)"><ElementKinds><Kind Name="FIELD" /><Kind Name="READONLY_FIELD" /><Kind Name="METHOD" /><Kind Name="PROPERTY" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="_" Suffix="" Style="AaBb" /></Policy></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=da335a8d_002D4b6e_002D4df6_002D8434_002D29ffe5e2547b/@EntryIndexedValue"><Policy><Descriptor Staticness="Static, Instance" AccessRightKinds="Private, Protected, ProtectedInternal, Internal, Public" Description="Structs"><ElementKinds><Kind Name="STRUCT" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="S" Suffix="" Style="AaBb" /></Policy></s:String>
|
||||
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateBlankLinesAroundFieldToBlankLinesAroundProperty/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateThisQualifierSettings/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/Environment/UnitTesting/DisabledProviders/=MSTest/@EntryIndexedValue">False</s:Boolean>
|
||||
<s:String x:Key="/Default/Environment/UnitTesting/MsTestProvider/RunConfigurationFilename/@EntryValue">Vocaluxe.testsettings</s:String>
|
||||
<s:Boolean x:Key="/Default/Environment/UnitTesting/MsTestProvider/UseLegacyRunner/@EntryValue">True</s:Boolean>
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
#region license
|
||||
// This file is part of Vocaluxe.
|
||||
//
|
||||
// Vocaluxe is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Vocaluxe is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Vocaluxe. If not, see <http://www.gnu.org/licenses/>.
|
||||
#endregion
|
||||
|
||||
namespace Vocaluxe.Base.Server
|
||||
{
|
||||
class CClientHandler
|
||||
{
|
||||
private int _ConnectionID;
|
||||
public bool LoggedIn;
|
||||
|
||||
public CClientHandler(int connectionID)
|
||||
{
|
||||
_ConnectionID = connectionID;
|
||||
LoggedIn = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,129 +0,0 @@
|
||||
#region license
|
||||
// This file is part of Vocaluxe.
|
||||
//
|
||||
// Vocaluxe is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Vocaluxe is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Vocaluxe. If not, see <http://www.gnu.org/licenses/>.
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Security.Cryptography;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Vocaluxe.Base.Server
|
||||
{
|
||||
public static class CCommands
|
||||
{
|
||||
private static readonly UTF8Encoding _Encoder = new UTF8Encoding();
|
||||
private static readonly SHA256Managed _Sha256 = new SHA256Managed();
|
||||
|
||||
public const string BroadcastKeyword = "I am a Vocaluxe Server";
|
||||
|
||||
#region Commands
|
||||
// ReSharper disable UnusedMember.Global
|
||||
public const int ResponseOK = 1;
|
||||
public const int ResponseNOK = 2;
|
||||
|
||||
public const int CommandLogin = 20;
|
||||
public const int ResponseLoginWrongPassword = 21;
|
||||
public const int ResponseLoginFailed = 22;
|
||||
public const int ResponseLoginOK = 23;
|
||||
|
||||
public const int CommandSendKeyStroke = 100;
|
||||
public const int CommandSendKeyUp = 110;
|
||||
public const int CommandSendKeyDown = 111;
|
||||
public const int CommandSendKeyLeft = 112;
|
||||
public const int CommandSendKeyRight = 113;
|
||||
|
||||
public const int CommandSendMouseMoveEvent = 200;
|
||||
public const int CommandSendMouseLBDownEvent = 220;
|
||||
public const int CommandSendMouseLBUpEvent = 221;
|
||||
public const int CommandSendMouseRBDownEvent = 230;
|
||||
public const int CommandSendMouseRBUpEvent = 231;
|
||||
public const int ComamndSendMouseMBDownEvent = 240;
|
||||
public const int ComamndSendMouseMBUpEvent = 241;
|
||||
public const int CommandSendMouseWheelEvent = 250;
|
||||
|
||||
public const int CommandSendAvatarPicture = 500;
|
||||
public const int CommandSendAvatarPictureJpg = 501;
|
||||
|
||||
public const int CommandSendProfile = 510;
|
||||
// ReSharper restore UnusedMember.Global
|
||||
#endregion Commands
|
||||
|
||||
#region General
|
||||
public static byte[] CreateCommandWithoutParams(int command)
|
||||
{
|
||||
return BitConverter.GetBytes(command);
|
||||
}
|
||||
#endregion General
|
||||
|
||||
#region Login
|
||||
public static byte[] CreateCommandLogin(string password)
|
||||
{
|
||||
var data = new SLoginData {Sha256 = _Sha256.ComputeHash(Encoding.UTF8.GetBytes(password))};
|
||||
|
||||
return _Serialize(CommandLogin, data);
|
||||
}
|
||||
|
||||
public static bool DecodeCommandLogin(byte[] message, out SLoginData loginData)
|
||||
{
|
||||
return _TryDeserialize(message, out loginData);
|
||||
}
|
||||
#endregion Login
|
||||
|
||||
#region Serializing
|
||||
private static byte[] _Serialize<T>(T obj)
|
||||
{
|
||||
return _Serialize(0, obj);
|
||||
}
|
||||
|
||||
private static byte[] _Serialize<T>(int command, T obj)
|
||||
{
|
||||
byte[] cmd = BitConverter.GetBytes(command);
|
||||
|
||||
var stream = new MemoryStream();
|
||||
stream.Write(cmd, 0, cmd.Length);
|
||||
|
||||
string json = JsonConvert.SerializeObject(obj);
|
||||
byte[] data = _Encoder.GetBytes(json);
|
||||
stream.Write(data, 0, data.Length);
|
||||
return stream.ToArray();
|
||||
}
|
||||
|
||||
private static bool _TryDeserialize<T>(byte[] message, out T obj)
|
||||
{
|
||||
obj = default(T);
|
||||
|
||||
if (message == null)
|
||||
return false;
|
||||
|
||||
if (message.Length < 5)
|
||||
return false;
|
||||
|
||||
var data = new byte[message.Length - 4];
|
||||
Array.Copy(message, 4, data, 0, data.Length);
|
||||
try
|
||||
{
|
||||
obj = JsonConvert.DeserializeObject<T>(_Encoder.GetString(data));
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
#endregion Serializing
|
||||
}
|
||||
}
|
||||
@@ -17,14 +17,18 @@
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Reflection;
|
||||
using System.Security.Cryptography;
|
||||
using System.ServiceModel;
|
||||
using System.ServiceModel.Web;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using ServerLib;
|
||||
using Vocaluxe.Lib.Input;
|
||||
using Vocaluxe.Lib.Playlist;
|
||||
using VocaluxeLib;
|
||||
@@ -36,6 +40,11 @@ namespace Vocaluxe.Base.Server
|
||||
{
|
||||
static class CVocaluxeServer
|
||||
{
|
||||
private static ServiceHost _Host;
|
||||
private static Uri _BaseAddress;
|
||||
private static bool _Encrypted;
|
||||
private static readonly Queue<Task> _ServerTaskQueue = new Queue<Task>();
|
||||
|
||||
private class CServerController : CControllerFramework
|
||||
{
|
||||
public override string GetName()
|
||||
@@ -55,81 +64,232 @@ namespace Vocaluxe.Base.Server
|
||||
public override void SetRumble(float duration) {}
|
||||
}
|
||||
|
||||
private static CServer _Server;
|
||||
//private static CDiscover _Discover;
|
||||
|
||||
public static readonly CControllerFramework Controller = new CServerController();
|
||||
|
||||
|
||||
#region server control
|
||||
|
||||
public static void Init()
|
||||
{
|
||||
_Server = new CServer(CConfig.Config.Server.ServerPort, CConfig.Config.Server.ServerEncryption == EOffOn.TR_CONFIG_ON);
|
||||
int port = CConfig.Config.Server.ServerPort;
|
||||
bool encrypted = CConfig.Config.Server.ServerEncryption == EOffOn.TR_CONFIG_ON;
|
||||
string hostname = Dns.GetHostName();
|
||||
string protocol = (encrypted) ? "https" : "http";
|
||||
_BaseAddress = new Uri(protocol + "://" + hostname + ":" + port + "/");
|
||||
_Encrypted = encrypted;
|
||||
_Host = new WebServiceHost(typeof(CWebservice), _BaseAddress);
|
||||
|
||||
CServer.SendKeyEvent = _SendKeyEvent;
|
||||
CServer.SendKeyStringEvent = _sendKeyStringEvent;
|
||||
CServer.GetProfileData = _GetProfileData;
|
||||
CServer.SendProfileData = _SendProfileData;
|
||||
CServer.GetProfileList = _GetProfileList;
|
||||
CServer.SendPhoto = _SendPhoto;
|
||||
CServer.GetSiteFile = _GetSiteFile;
|
||||
CServer.GetServerVersion = _GetServerVersion;
|
||||
CServer.GetSong = _GetSong;
|
||||
CServer.GetAllSongs = _GetAllSongs;
|
||||
CServer.GetCurrentSongId = _GetCurrentSongId;
|
||||
CServer.GetMp3Path = _GetMp3Path;
|
||||
CServer.ValidatePassword = _ValidatePassword;
|
||||
CServer.GetUserRole = _GetUserRole;
|
||||
CServer.SetUserRole = _SetUserRole;
|
||||
CServer.GetUserIdFromUsername = _GetUserIdFromUsername;
|
||||
CServer.GetDelayedImage = _GetDelayedImage;
|
||||
CServer.GetPlaylists = _GetPlaylists;
|
||||
CServer.GetPlaylist = _GetPlaylist;
|
||||
CServer.AddSongToPlaylist = _AddSongToPlaylist;
|
||||
CServer.RemoveSongFromPlaylist = _RemoveSongFromPlaylist;
|
||||
CServer.MoveSongInPlaylist = _MoveSongInPlaylist;
|
||||
CServer.PlaylistContainsSong = _PlaylistContainsSong;
|
||||
CServer.GetPlaylistSongs = _GetPlaylistSongs;
|
||||
CServer.RemovePlaylist = _RemovePlaylist;
|
||||
CServer.AddPlaylist = _AddPlaylist;
|
||||
WebHttpBinding wb = new WebHttpBinding
|
||||
{
|
||||
MaxReceivedMessageSize = 10485760,
|
||||
MaxBufferSize = 10485760,
|
||||
MaxBufferPoolSize = 10485760,
|
||||
ReaderQuotas = { MaxStringContentLength = 10485760, MaxArrayLength = 10485760, MaxBytesPerRead = 10485760 }
|
||||
};
|
||||
if (encrypted)
|
||||
{
|
||||
wb.Security.Mode = WebHttpSecurityMode.Transport;
|
||||
wb.Security.Transport = new HttpTransportSecurity { ClientCredentialType = HttpClientCredentialType.None };
|
||||
}
|
||||
_Host.AddServiceEndpoint(typeof(ICWebservice), wb, "");
|
||||
|
||||
Start();
|
||||
|
||||
//_Discover = new CDiscover(CConfig.ServerPort, CCommands.BroadcastKeyword);
|
||||
}
|
||||
|
||||
|
||||
public static void Start()
|
||||
{
|
||||
if (CConfig.Config.Server.ServerActive == EOffOn.TR_CONFIG_ON)
|
||||
{
|
||||
_Server.Start();
|
||||
//_Discover.StartBroadcasting();
|
||||
try
|
||||
{
|
||||
_RegisterUrlAndCert(_BaseAddress.Port, false);
|
||||
_Host.Open();
|
||||
}
|
||||
catch (CommunicationException e)
|
||||
{
|
||||
if (e is AddressAccessDeniedException || e is AddressAlreadyInUseException)
|
||||
{
|
||||
_RegisterUrlAndCert(_BaseAddress.Port, true);
|
||||
try
|
||||
{
|
||||
_Host.Abort();
|
||||
Init();
|
||||
_Host.Open();
|
||||
}
|
||||
catch (CommunicationException)
|
||||
{
|
||||
_Host.Abort();
|
||||
MessageBox.Show("Problem while initialization of webserver. You may try a different port (Change it in config.xml)");
|
||||
}
|
||||
}
|
||||
else
|
||||
_Host.Abort();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void Close()
|
||||
{
|
||||
if (_Server != null)
|
||||
if (_Host != null)
|
||||
{
|
||||
_Server.Stop();
|
||||
_Server = null;
|
||||
//_Discover.Stop();
|
||||
try
|
||||
{
|
||||
_Host.Close();
|
||||
}
|
||||
catch (CommunicationException)
|
||||
{
|
||||
_Host.Abort();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void _RegisterUrlAndCert(int port, bool reserve)
|
||||
{
|
||||
#if WIN
|
||||
|
||||
ProcessStartInfo info = new ProcessStartInfo
|
||||
{
|
||||
FileName = "VocaluxeServerConfig.exe",
|
||||
WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory,
|
||||
Arguments = AppDomain.CurrentDomain.FriendlyName + " " + port + " " + (_Encrypted ? "true" : "false") + (reserve ? " true" : ""),
|
||||
UseShellExecute = true,
|
||||
CreateNoWindow = true,
|
||||
WindowStyle = ProcessWindowStyle.Hidden,
|
||||
};
|
||||
try
|
||||
{
|
||||
using (Process p = Process.Start(info))
|
||||
{
|
||||
p.WaitForExit();
|
||||
if (p.ExitCode != 0)
|
||||
MessageBox.Show("Registering the Server failed (Code " + p.ExitCode + ")!\r\nThe Server might not work correctly.");
|
||||
p.Close();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
MessageBox.Show("Registering the Server failed (" + e + ")!\r\nThe Server might not work correctly.");
|
||||
}
|
||||
#else
|
||||
|
||||
//Required?
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
public static string GetServerAddress()
|
||||
{
|
||||
return _Server == null ? "" : _Server.GetBaseAddress();
|
||||
return _BaseAddress == null ? "" : _BaseAddress.AbsoluteUri;
|
||||
}
|
||||
|
||||
public static bool IsServerRunning()
|
||||
{
|
||||
if (_Server == null)
|
||||
if (_Host == null)
|
||||
return false;
|
||||
|
||||
return _Server.IsRunning();
|
||||
return _Host.State == CommunicationState.Opened;
|
||||
}
|
||||
|
||||
private static bool _SendKeyEvent(string key)
|
||||
#endregion
|
||||
|
||||
#region task control
|
||||
|
||||
public static void ProcessServerTasks()
|
||||
{
|
||||
//Serial processing - one by one
|
||||
while (_ServerTaskQueue.Count > 0)
|
||||
{
|
||||
//Get a task from the queue
|
||||
Task task = _ServerTaskQueue.Dequeue();
|
||||
//Start the task
|
||||
task.RunSynchronously(TaskScheduler.FromCurrentSynchronizationContext());
|
||||
|
||||
task.Wait();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static TReturnType DoTask<TReturnType>(Func<TReturnType> action)
|
||||
{
|
||||
var task = new Task<TReturnType>(action);
|
||||
_ServerTaskQueue.Enqueue(task);
|
||||
task.Wait(); //wait until the task is completed
|
||||
return task.Result;
|
||||
}
|
||||
|
||||
public static TReturnType DoTask<TReturnType, TParameterType>(Func<TParameterType, TReturnType> action, TParameterType parameter)
|
||||
{
|
||||
var task = new Task<TReturnType>(() => action(parameter));
|
||||
_ServerTaskQueue.Enqueue(task);
|
||||
task.Wait(); //wait until the task is completed
|
||||
return task.Result;
|
||||
}
|
||||
|
||||
public static TReturnType DoTask<TReturnType, TParameterType1, TParameterType2>(Func<TParameterType1, TParameterType2, TReturnType> action, TParameterType1 parameter1, TParameterType2 parmaeter2)
|
||||
{
|
||||
var task = new Task<TReturnType>(() => action(parameter1, parmaeter2));
|
||||
_ServerTaskQueue.Enqueue(task);
|
||||
task.Wait(); //wait until the task is completed
|
||||
return task.Result;
|
||||
}
|
||||
|
||||
public static TReturnType DoTask<TReturnType, TParameterType1, TParameterType2, TParameterType3>(Func<TParameterType1, TParameterType2, TParameterType3, TReturnType> action, TParameterType1 parameter1, TParameterType2 parmaeter2, TParameterType3 parmaeter3)
|
||||
{
|
||||
var task = new Task<TReturnType>(() => action(parameter1, parmaeter2, parmaeter3));
|
||||
_ServerTaskQueue.Enqueue(task);
|
||||
task.Wait(); //wait until the task is completed
|
||||
return task.Result;
|
||||
}
|
||||
|
||||
public static TReturnType DoTask<TReturnType, TParameterType1, TParameterType2, TParameterType3, TParameterType4>(Func<TParameterType1, TParameterType2, TParameterType3, TParameterType4, TReturnType> action, TParameterType1 parameter1, TParameterType2 parmaeter2, TParameterType3 parmaeter3, TParameterType4 parmaeter4)
|
||||
{
|
||||
var task = new Task<TReturnType>(() => action(parameter1, parmaeter2, parmaeter3, parmaeter4));
|
||||
_ServerTaskQueue.Enqueue(task);
|
||||
task.Wait(); //wait until the task is completed
|
||||
return task.Result;
|
||||
}
|
||||
|
||||
|
||||
public static void DoTaskWithoutReturn(Action action)
|
||||
{
|
||||
var task = new Task(action);
|
||||
_ServerTaskQueue.Enqueue(task);
|
||||
task.Wait(); //wait until the task is completed
|
||||
}
|
||||
|
||||
public static void DoTaskWithoutReturn<TParameterType>(Action<TParameterType> action, TParameterType parameter)
|
||||
{
|
||||
var task = new Task(() => action(parameter));
|
||||
_ServerTaskQueue.Enqueue(task);
|
||||
task.Wait(); //wait until the task is completed
|
||||
}
|
||||
|
||||
public static void DoTaskWithoutReturn<TParameterType1, TParameterType2>(Action<TParameterType1, TParameterType2> action, TParameterType1 parameter1, TParameterType2 parmaeter2)
|
||||
{
|
||||
var task = new Task(() => action(parameter1, parmaeter2));
|
||||
_ServerTaskQueue.Enqueue(task);
|
||||
task.Wait(); //wait until the task is completed
|
||||
}
|
||||
|
||||
public static void DoTaskWithoutReturn<TParameterType1, TParameterType2, TParameterType3>(Action<TParameterType1, TParameterType2, TParameterType3> action, TParameterType1 parameter1, TParameterType2 parmaeter2, TParameterType3 parmaeter3)
|
||||
{
|
||||
var task = new Task(() => action(parameter1, parmaeter2, parmaeter3));
|
||||
_ServerTaskQueue.Enqueue(task);
|
||||
task.Wait(); //wait until the task is completed
|
||||
}
|
||||
|
||||
public static void DoTaskWithoutReturn<TParameterType1, TParameterType2, TParameterType3, TParameterType4>(Action<TParameterType1, TParameterType2, TParameterType3, TParameterType4> action, TParameterType1 parameter1, TParameterType2 parmaeter2, TParameterType3 parmaeter3, TParameterType4 parmaeter4)
|
||||
{
|
||||
var task = new Task(() => action(parameter1, parmaeter2, parmaeter3, parmaeter4));
|
||||
_ServerTaskQueue.Enqueue(task);
|
||||
task.Wait(); //wait until the task is completed
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public static bool SendKeyEvent(string key)
|
||||
{
|
||||
bool result = false;
|
||||
string lowerKey = key.ToLower();
|
||||
@@ -192,7 +352,7 @@ namespace Vocaluxe.Base.Server
|
||||
return result;
|
||||
}
|
||||
|
||||
private static bool _sendKeyStringEvent(string keyString, bool isShiftPressed, bool isAltPressed, bool isCtrlPressed)
|
||||
public static bool SendKeyStringEvent(string keyString, bool isShiftPressed, bool isAltPressed, bool isCtrlPressed)
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
@@ -230,7 +390,7 @@ namespace Vocaluxe.Base.Server
|
||||
}
|
||||
|
||||
#region profile
|
||||
private static SProfileData _GetProfileData(int profileId, bool isReadonly)
|
||||
public static SProfileData GetProfileData(int profileId, bool isReadonly)
|
||||
{
|
||||
CProfile profile = CProfiles.GetProfile(profileId);
|
||||
if (profile == null)
|
||||
@@ -238,7 +398,7 @@ namespace Vocaluxe.Base.Server
|
||||
return _CreateProfileData(profile, isReadonly);
|
||||
}
|
||||
|
||||
private static bool _SendProfileData(SProfileData profile)
|
||||
public static bool SendProfileData(SProfileData profile)
|
||||
{
|
||||
CProfile newProfile;
|
||||
CProfile existingProfile = CProfiles.GetProfile(profile.ProfileId);
|
||||
@@ -325,7 +485,7 @@ namespace Vocaluxe.Base.Server
|
||||
return true;
|
||||
}
|
||||
|
||||
private static SProfileData[] _GetProfileList()
|
||||
public static SProfileData[] GetProfileList()
|
||||
{
|
||||
List<SProfileData> result = new List<SProfileData>(CProfiles.NumProfiles);
|
||||
|
||||
@@ -379,7 +539,7 @@ namespace Vocaluxe.Base.Server
|
||||
#region photo
|
||||
private static readonly List<string> _PhotosOfThisRound = new List<string>();
|
||||
|
||||
private static bool _SendPhoto(SPhotoData photoData)
|
||||
public static bool SendPhoto(SPhotoData photoData)
|
||||
{
|
||||
if (photoData.Photo == null)
|
||||
return false;
|
||||
@@ -406,7 +566,7 @@ namespace Vocaluxe.Base.Server
|
||||
#region website
|
||||
private static readonly Dictionary<string, string> _DelayedImagePath = new Dictionary<string, string>();
|
||||
|
||||
private static byte[] _GetSiteFile(string filename)
|
||||
public static byte[] GetSiteFile(string filename)
|
||||
{
|
||||
string path = "Website/" + filename;
|
||||
path = path.Replace("..", "");
|
||||
@@ -438,7 +598,7 @@ namespace Vocaluxe.Base.Server
|
||||
return hashedFilename;
|
||||
}
|
||||
|
||||
private static string _GetServerVersion()
|
||||
public static string GetServerVersion()
|
||||
{
|
||||
var informationalVersion = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false).FirstOrDefault();
|
||||
if (informationalVersion != null)
|
||||
@@ -448,7 +608,7 @@ namespace Vocaluxe.Base.Server
|
||||
return Assembly.GetExecutingAssembly().GetName().Version.ToString() + " (" + informationalVersion + ")";
|
||||
}
|
||||
|
||||
private static CBase64Image _GetDelayedImage(string hashedFilename)
|
||||
public static CBase64Image GetDelayedImage(string hashedFilename)
|
||||
{
|
||||
if (!_DelayedImagePath.ContainsKey(hashedFilename))
|
||||
throw new FileNotFoundException("Image not found");
|
||||
@@ -465,25 +625,26 @@ namespace Vocaluxe.Base.Server
|
||||
#endregion
|
||||
|
||||
#region songs
|
||||
private static SSongInfo _GetSong(int songId)
|
||||
public static SSongInfo GetSong(int songId)
|
||||
{
|
||||
CSong song = CSongs.GetSong(songId);
|
||||
return _GetSongInfo(song, true);
|
||||
}
|
||||
|
||||
private static SSongInfo[] _GetAllSongs()
|
||||
public static SSongInfo[] GetAllSongs()
|
||||
{
|
||||
List<CSong> songs = CSongs.Songs;
|
||||
return (from s in songs
|
||||
select _GetSongInfo(s, false)).ToArray<SSongInfo>();
|
||||
}
|
||||
private static string _GetMp3Path(int songId)
|
||||
|
||||
public static string GetMp3Path(int songId)
|
||||
{
|
||||
CSong song = CSongs.GetSong(songId);
|
||||
return song.GetMP3();
|
||||
}
|
||||
|
||||
private static int _GetCurrentSongId()
|
||||
public static int GetCurrentSongId()
|
||||
{
|
||||
CSong song = CGame.GetSong();
|
||||
if (song == null)
|
||||
@@ -511,25 +672,25 @@ namespace Vocaluxe.Base.Server
|
||||
#endregion
|
||||
|
||||
#region playlist
|
||||
private static SPlaylistData[] _GetPlaylists()
|
||||
public static SPlaylistData[] GetPlaylists()
|
||||
{
|
||||
return (from p in CPlaylists.Playlists
|
||||
select _GetPlaylistInfo(p)).ToArray();
|
||||
}
|
||||
|
||||
private static SPlaylistData _GetPlaylist(int playlistId)
|
||||
public static SPlaylistData GetPlaylist(int playlistId)
|
||||
{
|
||||
if (CPlaylists.Get(playlistId) == null)
|
||||
throw new ArgumentException("invalid playlistId");
|
||||
return _GetPlaylistInfo(CPlaylists.Get(playlistId));
|
||||
}
|
||||
|
||||
private static void _AddSongToPlaylist(int songId, int playlistId, bool allowDuplicates)
|
||||
public static void AddSongToPlaylist(int songId, int playlistId, bool allowDuplicates)
|
||||
{
|
||||
if (CPlaylists.Get(playlistId) == null)
|
||||
throw new ArgumentException("invalid playlistId");
|
||||
|
||||
if (allowDuplicates || !_PlaylistContainsSong(songId, playlistId))
|
||||
if (allowDuplicates || !PlaylistContainsSong(songId, playlistId))
|
||||
{
|
||||
CPlaylists.AddSong(playlistId, songId);
|
||||
CPlaylists.Save(playlistId);
|
||||
@@ -538,12 +699,12 @@ namespace Vocaluxe.Base.Server
|
||||
throw new ArgumentException("song exists in this playlist");
|
||||
}
|
||||
|
||||
private static void _RemoveSongFromPlaylist(int position, int playlistId, int songId)
|
||||
public static void RemoveSongFromPlaylist(int position, int playlistId, int songId)
|
||||
{
|
||||
CPlaylistFile pl = CPlaylists.Get(playlistId);
|
||||
if (pl == null)
|
||||
throw new ArgumentException("invalid playlistId");
|
||||
if (!_PlaylistContainsSong(songId, playlistId))
|
||||
if (!PlaylistContainsSong(songId, playlistId))
|
||||
throw new ArgumentException("invalid songId");
|
||||
if (position < 0 || pl.Songs.Count <= position
|
||||
|| pl.Songs[position].SongID != songId)
|
||||
@@ -552,12 +713,12 @@ namespace Vocaluxe.Base.Server
|
||||
pl.Save();
|
||||
}
|
||||
|
||||
private static void _MoveSongInPlaylist(int newPosition, int playlistId, int songId)
|
||||
public static void MoveSongInPlaylist(int newPosition, int playlistId, int songId)
|
||||
{
|
||||
CPlaylistFile pl = CPlaylists.Get(playlistId);
|
||||
if (pl == null)
|
||||
throw new ArgumentException("invalid playlistId");
|
||||
if (!_PlaylistContainsSong(songId, playlistId))
|
||||
if (!PlaylistContainsSong(songId, playlistId))
|
||||
throw new ArgumentException("invalid songId");
|
||||
|
||||
if (pl.Songs.Count < newPosition)
|
||||
@@ -568,7 +729,7 @@ namespace Vocaluxe.Base.Server
|
||||
pl.Save();
|
||||
}
|
||||
|
||||
private static bool _PlaylistContainsSong(int songId, int playlistId)
|
||||
public static bool PlaylistContainsSong(int songId, int playlistId)
|
||||
{
|
||||
CPlaylistFile pl = CPlaylists.Get(playlistId);
|
||||
if (pl == null)
|
||||
@@ -576,7 +737,7 @@ namespace Vocaluxe.Base.Server
|
||||
return pl.Songs.Any(s => s.SongID == songId);
|
||||
}
|
||||
|
||||
private static SPlaylistSongInfo[] _GetPlaylistSongs(int playlistId)
|
||||
public static SPlaylistSongInfo[] GetPlaylistSongs(int playlistId)
|
||||
{
|
||||
CPlaylistFile pl = CPlaylists.Get(playlistId);
|
||||
if (pl == null)
|
||||
@@ -617,14 +778,14 @@ namespace Vocaluxe.Base.Server
|
||||
};
|
||||
}
|
||||
|
||||
private static void _RemovePlaylist(int playlistId)
|
||||
public static void RemovePlaylist(int playlistId)
|
||||
{
|
||||
if (CPlaylists.Get(playlistId) == null)
|
||||
throw new ArgumentException("invalid playlistId");
|
||||
CPlaylists.Delete(playlistId);
|
||||
}
|
||||
|
||||
private static int _AddPlaylist(string playlistName)
|
||||
public static int AddPlaylist(string playlistName)
|
||||
{
|
||||
int newPlaylistId = CPlaylists.NewPlaylist(playlistName);
|
||||
CPlaylists.Save(newPlaylistId);
|
||||
@@ -634,7 +795,7 @@ namespace Vocaluxe.Base.Server
|
||||
#endregion
|
||||
|
||||
#region user management
|
||||
private static bool _ValidatePassword(int profileId, string password)
|
||||
public static bool ValidatePassword(int profileId, string password)
|
||||
{
|
||||
CProfile profile = CProfiles.GetProfile(profileId);
|
||||
if (profile == null)
|
||||
@@ -651,7 +812,7 @@ namespace Vocaluxe.Base.Server
|
||||
return _Hash((new UTF8Encoding()).GetBytes(password), salt).SequenceEqual(profile.PasswordHash);
|
||||
}
|
||||
|
||||
private static bool _ValidatePassword(int profileId, byte[] hashedPassword)
|
||||
public static bool ValidatePassword(int profileId, byte[] hashedPassword)
|
||||
{
|
||||
CProfile profile = CProfiles.GetProfile(profileId);
|
||||
if (profile == null)
|
||||
@@ -680,7 +841,7 @@ namespace Vocaluxe.Base.Server
|
||||
return profile.PasswordSalt;
|
||||
}
|
||||
|
||||
private static int _GetUserRole(int profileId)
|
||||
public static int GetUserRole(int profileId)
|
||||
{
|
||||
CProfile profile = CProfiles.GetProfile(profileId);
|
||||
if (profile == null)
|
||||
@@ -692,7 +853,7 @@ namespace Vocaluxe.Base.Server
|
||||
return (int)(profile.UserRole);
|
||||
}
|
||||
|
||||
private static void _SetUserRole(int profileId, int userRole)
|
||||
public static void SetUserRole(int profileId, int userRole)
|
||||
{
|
||||
CProfile profile = CProfiles.GetProfile(profileId);
|
||||
if (profile == null)
|
||||
@@ -711,7 +872,7 @@ namespace Vocaluxe.Base.Server
|
||||
CProfiles.SaveProfiles();
|
||||
}
|
||||
|
||||
private static int _GetUserIdFromUsername(string username)
|
||||
public static int GetUserIdFromUsername(string username)
|
||||
{
|
||||
IEnumerable<int> playerIds = (from p in CProfiles.GetProfiles()
|
||||
where String.Equals(p.PlayerName, username, StringComparison.OrdinalIgnoreCase)
|
||||
|
||||
@@ -16,13 +16,13 @@
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.ServiceModel;
|
||||
using System.ServiceModel.Web;
|
||||
using System.IO;
|
||||
using System.ServiceModel.Channels;
|
||||
using System.ServiceModel.Web;
|
||||
|
||||
namespace ServerLib
|
||||
namespace Vocaluxe.Base.Server
|
||||
{
|
||||
class CWebservice : ICWebservice
|
||||
{
|
||||
@@ -48,33 +48,16 @@ namespace ServerLib
|
||||
if (!_CheckRight(EUserRights.UseKeyboard))
|
||||
return;
|
||||
|
||||
if (CServer.SendKeyEvent == null)
|
||||
{
|
||||
if (WebOperationContext.Current != null)
|
||||
{
|
||||
WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.NotFound;
|
||||
WebOperationContext.Current.OutgoingResponse.StatusDescription = "Not found";
|
||||
}
|
||||
}
|
||||
else
|
||||
CServer.SendKeyEvent(key);
|
||||
|
||||
CVocaluxeServer.DoTask(CVocaluxeServer.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);
|
||||
|
||||
CVocaluxeServer.DoTask(CVocaluxeServer.SendKeyStringEvent, keyString, isShiftPressed, isAltPressed, isCtrlPressed);
|
||||
}
|
||||
|
||||
#region profile
|
||||
@@ -114,17 +97,7 @@ namespace ServerLib
|
||||
return;
|
||||
}
|
||||
|
||||
if (CServer.SendProfileData == null)
|
||||
{
|
||||
if (WebOperationContext.Current != null)
|
||||
{
|
||||
WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.NotFound;
|
||||
WebOperationContext.Current.OutgoingResponse.StatusDescription = "Not found";
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
CServer.SendProfileData(profile);
|
||||
CVocaluxeServer.DoTask(CVocaluxeServer.SendProfileData, profile);
|
||||
}
|
||||
|
||||
public SProfileData GetProfile(int profileId)
|
||||
@@ -132,22 +105,18 @@ namespace ServerLib
|
||||
Guid sessionKey = _GetSession();
|
||||
if (CSessionControl.GetUserIdFromSession(sessionKey) == profileId || _CheckRight(EUserRights.ViewOtherProfiles))
|
||||
{
|
||||
if (CServer.GetProfileData == null)
|
||||
return new SProfileData();
|
||||
|
||||
bool isReadonly = (!CSessionControl.RequestRight(sessionKey, EUserRights.EditAllProfiles) &&
|
||||
CSessionControl.GetUserIdFromSession(sessionKey) != profileId);
|
||||
|
||||
return CServer.GetProfileData(profileId, isReadonly);
|
||||
|
||||
return CVocaluxeServer.DoTask(CVocaluxeServer.GetProfileData,profileId, isReadonly);
|
||||
}
|
||||
return new SProfileData();
|
||||
}
|
||||
|
||||
public SProfileData[] GetProfileList()
|
||||
{
|
||||
if (CServer.GetProfileList == null)
|
||||
return new SProfileData[] { };
|
||||
return CServer.GetProfileList();
|
||||
return CVocaluxeServer.DoTask(CVocaluxeServer.GetProfileList);
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -155,7 +124,7 @@ namespace ServerLib
|
||||
public void SendPhoto(SPhotoData photo)
|
||||
{
|
||||
if (_CheckRight(EUserRights.UploadPhotos))
|
||||
CServer.SendPhoto(photo);
|
||||
CVocaluxeServer.DoTask(CVocaluxeServer.SendPhoto, photo);
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -185,7 +154,7 @@ namespace ServerLib
|
||||
if (WebOperationContext.Current != null)
|
||||
WebOperationContext.Current.OutgoingResponse.ContentType = "text/html";
|
||||
|
||||
return new MemoryStream(CServer.GetSiteFile("index.html"));
|
||||
return new MemoryStream(CVocaluxeServer.DoTask(CVocaluxeServer.GetSiteFile,"index.html"));
|
||||
}
|
||||
|
||||
public Stream GetJsFile(string filename)
|
||||
@@ -199,7 +168,7 @@ namespace ServerLib
|
||||
DateTime.UtcNow.AddHours(4).ToString("r"));
|
||||
}
|
||||
|
||||
byte[] data = CServer.GetSiteFile("js/" + filename);
|
||||
byte[] data = CVocaluxeServer.DoTask(CVocaluxeServer.GetSiteFile, "js/" + filename);
|
||||
|
||||
if (data != null)
|
||||
return new MemoryStream(data);
|
||||
@@ -220,7 +189,7 @@ namespace ServerLib
|
||||
DateTime.UtcNow.AddHours(4).ToString("r"));
|
||||
}
|
||||
|
||||
byte[] data = CServer.GetSiteFile("css/" + filename);
|
||||
byte[] data = CVocaluxeServer.DoTask(CVocaluxeServer.GetSiteFile, "css/" + filename);
|
||||
|
||||
if (data != null)
|
||||
return new MemoryStream(data);
|
||||
@@ -240,7 +209,7 @@ namespace ServerLib
|
||||
DateTime.UtcNow.AddYears(1).ToString("r"));
|
||||
}
|
||||
|
||||
byte[] data = CServer.GetSiteFile("css\\images\\" + filename);
|
||||
byte[] data = CVocaluxeServer.DoTask(CVocaluxeServer.GetSiteFile, "css\\images\\" + filename);
|
||||
|
||||
if (data != null)
|
||||
return new MemoryStream(data);
|
||||
@@ -260,7 +229,7 @@ namespace ServerLib
|
||||
DateTime.UtcNow.AddYears(1).ToString("r"));
|
||||
}
|
||||
|
||||
byte[] data = CServer.GetSiteFile("img/" + filename);
|
||||
byte[] data = CVocaluxeServer.DoTask(CVocaluxeServer.GetSiteFile, "img/" + filename);
|
||||
|
||||
if (data != null)
|
||||
return new MemoryStream(data);
|
||||
@@ -280,7 +249,7 @@ namespace ServerLib
|
||||
DateTime.UtcNow.AddHours(4).ToString("r"));
|
||||
}
|
||||
|
||||
byte[] data = CServer.GetSiteFile("locales/" + filename);
|
||||
byte[] data = CVocaluxeServer.DoTask(CVocaluxeServer.GetSiteFile, "locales/" + filename);
|
||||
|
||||
if (data != null)
|
||||
return new MemoryStream(data);
|
||||
@@ -292,7 +261,7 @@ namespace ServerLib
|
||||
|
||||
public CBase64Image GetDelayedImage(string id)
|
||||
{
|
||||
return CServer.GetDelayedImage(id);
|
||||
return CVocaluxeServer.DoTask(CVocaluxeServer.GetDelayedImage, id);
|
||||
}
|
||||
|
||||
public bool IsServerOnline()
|
||||
@@ -303,24 +272,24 @@ namespace ServerLib
|
||||
|
||||
public string GetServerVersion()
|
||||
{
|
||||
return CServer.GetServerVersion();
|
||||
return CVocaluxeServer.DoTask(CVocaluxeServer.GetServerVersion);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region songs
|
||||
public SSongInfo GetSong(int songId)
|
||||
{
|
||||
return CServer.GetSong(songId);
|
||||
return CVocaluxeServer.DoTask(CVocaluxeServer.GetSong, songId);
|
||||
}
|
||||
|
||||
public int GetCurrentSongId()
|
||||
{
|
||||
return CServer.GetCurrentSongId();
|
||||
return CVocaluxeServer.DoTask(CVocaluxeServer.GetCurrentSongId);
|
||||
}
|
||||
|
||||
public SSongInfo[] GetAllSongs()
|
||||
{
|
||||
return CServer.GetAllSongs();
|
||||
return CVocaluxeServer.DoTask(CVocaluxeServer.GetAllSongs);
|
||||
}
|
||||
|
||||
public Stream GetMp3File(int songId)
|
||||
@@ -334,7 +303,7 @@ namespace ServerLib
|
||||
}
|
||||
|
||||
|
||||
String path = CServer.GetMp3Path(songId);
|
||||
String path = CVocaluxeServer.DoTask(CVocaluxeServer.GetMp3Path,songId);
|
||||
path = path.Replace("..", "");
|
||||
|
||||
|
||||
@@ -376,14 +345,14 @@ namespace ServerLib
|
||||
#region playlist
|
||||
public SPlaylistData[] GetPlaylists()
|
||||
{
|
||||
return CServer.GetPlaylists();
|
||||
return CVocaluxeServer.DoTask(CVocaluxeServer.GetPlaylists);
|
||||
}
|
||||
|
||||
public SPlaylistData GetPlaylist(int playlistId)
|
||||
{
|
||||
try
|
||||
{
|
||||
return CServer.GetPlaylist(playlistId);
|
||||
return CVocaluxeServer.DoTask(CVocaluxeServer.GetPlaylist, playlistId);
|
||||
}
|
||||
catch (ArgumentException e)
|
||||
{
|
||||
@@ -405,7 +374,7 @@ namespace ServerLib
|
||||
|
||||
try
|
||||
{
|
||||
CServer.AddSongToPlaylist(songId, playlistId, allowDuplicates);
|
||||
CVocaluxeServer.DoTaskWithoutReturn(CVocaluxeServer.AddSongToPlaylist, songId, playlistId, allowDuplicates);
|
||||
}
|
||||
catch (ArgumentException e)
|
||||
{
|
||||
@@ -424,7 +393,7 @@ namespace ServerLib
|
||||
|
||||
try
|
||||
{
|
||||
CServer.RemoveSongFromPlaylist(position, playlistId, songId);
|
||||
CVocaluxeServer.DoTaskWithoutReturn(CVocaluxeServer.RemoveSongFromPlaylist, position, playlistId, songId);
|
||||
}
|
||||
catch (ArgumentException e)
|
||||
{
|
||||
@@ -443,7 +412,7 @@ namespace ServerLib
|
||||
|
||||
try
|
||||
{
|
||||
CServer.MoveSongInPlaylist(newPosition, playlistId, songId);
|
||||
CVocaluxeServer.DoTaskWithoutReturn(CVocaluxeServer.MoveSongInPlaylist, newPosition, playlistId, songId);
|
||||
}
|
||||
catch (ArgumentException e)
|
||||
{
|
||||
@@ -459,7 +428,7 @@ namespace ServerLib
|
||||
{
|
||||
try
|
||||
{
|
||||
return CServer.PlaylistContainsSong(songId, playlistId);
|
||||
return CVocaluxeServer.DoTask(CVocaluxeServer.PlaylistContainsSong, songId, playlistId);
|
||||
}
|
||||
catch (ArgumentException e)
|
||||
{
|
||||
@@ -477,7 +446,7 @@ namespace ServerLib
|
||||
{
|
||||
try
|
||||
{
|
||||
return CServer.GetPlaylistSongs(playlistId);
|
||||
return CVocaluxeServer.DoTask(CVocaluxeServer.GetPlaylistSongs, playlistId);
|
||||
}
|
||||
catch (ArgumentException e)
|
||||
{
|
||||
@@ -497,7 +466,7 @@ namespace ServerLib
|
||||
|
||||
try
|
||||
{
|
||||
CServer.RemovePlaylist(playlistId);
|
||||
CVocaluxeServer.DoTaskWithoutReturn(CVocaluxeServer.RemovePlaylist, playlistId);
|
||||
}
|
||||
catch (ArgumentException e)
|
||||
{
|
||||
@@ -516,7 +485,7 @@ namespace ServerLib
|
||||
|
||||
try
|
||||
{
|
||||
return CServer.AddPlaylist(playlistName);
|
||||
return CVocaluxeServer.DoTask(CVocaluxeServer.AddPlaylist, playlistName);
|
||||
}
|
||||
catch (ArgumentException e)
|
||||
{
|
||||
@@ -534,13 +503,13 @@ namespace ServerLib
|
||||
#region user management
|
||||
public int GetUserRole(int profileId)
|
||||
{
|
||||
return CServer.GetUserRole(profileId);
|
||||
return CVocaluxeServer.DoTask(CVocaluxeServer.GetUserRole, profileId);
|
||||
}
|
||||
|
||||
public void SetUserRole(int profileId, int userRole)
|
||||
{
|
||||
if (_CheckRight(EUserRights.EditAllProfiles))
|
||||
CServer.SetUserRole(profileId, userRole);
|
||||
CVocaluxeServer.DoTaskWithoutReturn(CVocaluxeServer.SetUserRole, profileId, userRole);
|
||||
}
|
||||
|
||||
public bool HasUserRight(int right)
|
||||
@@ -20,7 +20,7 @@ using System.IO;
|
||||
using System.ServiceModel;
|
||||
using System.ServiceModel.Web;
|
||||
|
||||
namespace ServerLib
|
||||
namespace Vocaluxe.Base.Server
|
||||
{
|
||||
[ServiceContract]
|
||||
public interface ICWebservice
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
using System;
|
||||
|
||||
namespace ServerLib
|
||||
namespace Vocaluxe.Base.Server
|
||||
{
|
||||
class CSession
|
||||
{
|
||||
@@ -20,7 +20,7 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Timers;
|
||||
|
||||
namespace ServerLib
|
||||
namespace Vocaluxe.Base.Server
|
||||
{
|
||||
static class CSessionControl
|
||||
{
|
||||
@@ -65,17 +65,17 @@ namespace ServerLib
|
||||
|
||||
private static bool _ValidateUserAndPassword(string userName, string password)
|
||||
{
|
||||
return CServer.ValidatePassword(_GetProfileIdFormUsername(userName), password);
|
||||
return CVocaluxeServer.ValidatePassword(_GetProfileIdFormUsername(userName), password);
|
||||
}
|
||||
|
||||
private static int _GetProfileIdFormUsername(string username)
|
||||
{
|
||||
return CServer.GetUserIdFromUsername(username);
|
||||
return CVocaluxeServer.GetUserIdFromUsername(username);
|
||||
}
|
||||
|
||||
private static EUserRoles _GetUserRoles(int profileId)
|
||||
{
|
||||
return (EUserRoles)CServer.GetUserRole(profileId);
|
||||
return (EUserRoles)CVocaluxeServer.GetUserRole(profileId);
|
||||
}
|
||||
|
||||
internal static void InvalidateSessions(int profileId)
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
using System;
|
||||
|
||||
namespace ServerLib
|
||||
namespace Vocaluxe.Base.Server
|
||||
{
|
||||
[Flags]
|
||||
enum EUserRights
|
||||
@@ -18,7 +18,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace ServerLib
|
||||
namespace Vocaluxe.Base.Server
|
||||
{
|
||||
static class CUserRoleControl
|
||||
{
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
using System;
|
||||
|
||||
namespace ServerLib
|
||||
namespace Vocaluxe.Base.Server
|
||||
{
|
||||
[Flags]
|
||||
enum EUserRoles
|
||||
@@ -15,6 +15,14 @@
|
||||
// along with Vocaluxe. If not, see <http://www.gnu.org/licenses/>.
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Runtime.Serialization;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace Vocaluxe.Base.Server
|
||||
{
|
||||
public struct SLoginData
|
||||
@@ -35,4 +43,118 @@ namespace Vocaluxe.Base.Server
|
||||
public string PlayerName;
|
||||
public int Difficulty;
|
||||
}
|
||||
|
||||
[DataContract]
|
||||
public struct SProfileData
|
||||
{
|
||||
[DataMember]
|
||||
public CBase64Image Avatar;
|
||||
[DataMember]
|
||||
public string PlayerName;
|
||||
[DataMember]
|
||||
public int Type;
|
||||
[DataMember]
|
||||
public int Difficulty;
|
||||
[DataMember]
|
||||
public int ProfileId;
|
||||
[DataMember]
|
||||
public bool IsEditable;
|
||||
[DataMember]
|
||||
public string Password;
|
||||
}
|
||||
|
||||
[DataContract]
|
||||
public struct SPhotoData
|
||||
{
|
||||
[DataMember]
|
||||
public CBase64Image Photo;
|
||||
//Add infomation about the user who took this image??
|
||||
}
|
||||
|
||||
[DataContract]
|
||||
public class CBase64Image
|
||||
{
|
||||
// ReSharper disable InconsistentNaming
|
||||
[DataMember]
|
||||
private string base64Data = "";
|
||||
[DataMember]
|
||||
private string imageId = "";
|
||||
// ReSharper restore InconsistentNaming
|
||||
|
||||
public CBase64Image(Image img, ImageFormat format)
|
||||
{
|
||||
MemoryStream ms = new MemoryStream();
|
||||
img.Save(ms, format);
|
||||
string formatString = ImageCodecInfo.GetImageEncoders().FirstOrDefault(x => x.FormatID == format.Guid).FilenameExtension.Replace("*.", "").ToLower();
|
||||
base64Data = "data:image/" + formatString + ";base64," + Convert.ToBase64String(ms.ToArray());
|
||||
}
|
||||
|
||||
public CBase64Image(string imageId)
|
||||
{
|
||||
this.imageId = imageId;
|
||||
}
|
||||
|
||||
public Image GetImage()
|
||||
{
|
||||
string onlyBase64Data = base64Data.Substring(base64Data.IndexOf(";base64,") + (";base64,").Length);
|
||||
byte[] imageData = Convert.FromBase64String(onlyBase64Data);
|
||||
MemoryStream ms = new MemoryStream(imageData, 0, imageData.Length);
|
||||
ms.Write(imageData, 0, imageData.Length);
|
||||
Image image = Image.FromStream(ms, true);
|
||||
return image;
|
||||
}
|
||||
|
||||
public string GetImageType()
|
||||
{
|
||||
Match match = Regex.Match(base64Data, "(?<=data:image/)[a-zA-Z]+(?=;base64)");
|
||||
return match.Success ? match.Groups[0].Value : "";
|
||||
}
|
||||
}
|
||||
|
||||
[DataContract]
|
||||
public struct SSongInfo
|
||||
{
|
||||
[DataMember]
|
||||
public string Title;
|
||||
[DataMember]
|
||||
public string Artist;
|
||||
[DataMember]
|
||||
public CBase64Image Cover;
|
||||
[DataMember]
|
||||
public string Genre { get; set; }
|
||||
[DataMember]
|
||||
public string Language { get; set; }
|
||||
[DataMember]
|
||||
public string Year { get; set; }
|
||||
[DataMember]
|
||||
public bool IsDuet { get; set; }
|
||||
[DataMember]
|
||||
public int SongId { get; set; }
|
||||
}
|
||||
|
||||
[DataContract]
|
||||
public struct SPlaylistSongInfo
|
||||
{
|
||||
[DataMember]
|
||||
public SSongInfo Song;
|
||||
[DataMember]
|
||||
public int PlaylistId;
|
||||
[DataMember]
|
||||
public int PlaylistPosition;
|
||||
[DataMember]
|
||||
public int GameMode;
|
||||
}
|
||||
|
||||
[DataContract]
|
||||
public struct SPlaylistData
|
||||
{
|
||||
[DataMember]
|
||||
public int PlaylistId;
|
||||
[DataMember]
|
||||
public string PlaylistName;
|
||||
[DataMember]
|
||||
public int SongCount;
|
||||
[DataMember]
|
||||
public string LastChanged;
|
||||
}
|
||||
}
|
||||
@@ -21,6 +21,7 @@ using Vocaluxe.Base;
|
||||
using VocaluxeLib;
|
||||
using VocaluxeLib.Draw;
|
||||
using System.Diagnostics;
|
||||
using Vocaluxe.Base.Server;
|
||||
|
||||
namespace Vocaluxe.Lib.Draw
|
||||
{
|
||||
@@ -329,6 +330,7 @@ namespace Vocaluxe.Lib.Draw
|
||||
while (_Run)
|
||||
{
|
||||
_CheckQueue();
|
||||
CVocaluxeServer.ProcessServerTasks();
|
||||
|
||||
//We want to begin drawing
|
||||
_OnBeforeDraw();
|
||||
|
||||
@@ -210,6 +210,9 @@
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Runtime.Serialization" />
|
||||
<Reference Include="System.ServiceModel" />
|
||||
<Reference Include="System.ServiceModel.Web" />
|
||||
<Reference Include="System.Web.Services" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.XML" />
|
||||
@@ -219,6 +222,13 @@
|
||||
<Compile Include="Base\CCoverGenerator.cs" />
|
||||
<Compile Include="Base\CPlaylistElement.cs" />
|
||||
<Compile Include="Base\CRecord.cs" />
|
||||
<Compile Include="Base\Server\CWebservice.cs" />
|
||||
<Compile Include="Base\Server\ICWebservice.cs" />
|
||||
<Compile Include="Base\Server\Session.cs" />
|
||||
<Compile Include="Base\Server\SessionControl.cs" />
|
||||
<Compile Include="Base\Server\UserRights.cs" />
|
||||
<Compile Include="Base\Server\UserRoleControl.cs" />
|
||||
<Compile Include="Base\Server\UserRoles.cs" />
|
||||
<Compile Include="Base\ThemeSystem\CBaseTheme.cs" />
|
||||
<Compile Include="Base\ThemeSystem\CPartySkin.cs" />
|
||||
<Compile Include="Base\ThemeSystem\CBaseSkin.cs" />
|
||||
@@ -274,8 +284,6 @@
|
||||
<Compile Include="Base\CWebcam.cs" />
|
||||
<Compile Include="Base\Fonts\CFonts.cs" />
|
||||
<Compile Include="Base\Fonts\CGlyph.cs" />
|
||||
<Compile Include="Base\Server\CClientHandler.cs" />
|
||||
<Compile Include="Base\Server\CCommands.cs" />
|
||||
<Compile Include="Base\Server\CVocaluxeServer.cs" />
|
||||
<Compile Include="Base\Server\VocaluxeStructs.cs" />
|
||||
<Compile Include="CProgrammHelper.cs" />
|
||||
@@ -513,10 +521,6 @@
|
||||
</BootstrapperPackage>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\ServerLib\ServerLib.csproj">
|
||||
<Project>{ec5167e4-ccfb-4cee-987c-cf816f1062a3}</Project>
|
||||
<Name>ServerLib</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\VocaluxeLib\VocaluxeLib.csproj">
|
||||
<Project>{D2B6DDEF-E0E1-4DDF-A73A-E6ACEF5C95EC}</Project>
|
||||
<Name>VocaluxeLib</Name>
|
||||
|
||||
Reference in new issue
Block a user