diff --git a/ServerLib/CWebservice.cs b/ServerLib/CWebservice.cs index 97a8962c..0844c7fa 100644 --- a/ServerLib/CWebservice.cs +++ b/ServerLib/CWebservice.cs @@ -295,12 +295,12 @@ namespace ServerLib #endregion #region playlist - public SPlaylistInfo[] GetPlaylists() + public SPlaylistData[] GetPlaylists() { return CServer.GetPlaylists(); } - public SPlaylistInfo GetPlaylist(int playlistId) + public SPlaylistData GetPlaylist(int playlistId) { return CServer.GetPlaylist(playlistId); } diff --git a/ServerLib/DataStructs.cs b/ServerLib/DataStructs.cs index 4d4bbed7..24b01219 100644 --- a/ServerLib/DataStructs.cs +++ b/ServerLib/DataStructs.cs @@ -128,9 +128,9 @@ namespace ServerLib #endregion #region playlists - public delegate SPlaylistInfo[] GetPlaylistsDelegate(); + public delegate SPlaylistData[] GetPlaylistsDelegate(); - public delegate SPlaylistInfo GetPlaylistDelegate(int playlistId); + public delegate SPlaylistData GetPlaylistDelegate(int playlistId); public delegate void AddSongToPlaylistDelegate(int songId, int playlistId, bool allowDuplicates); @@ -156,7 +156,7 @@ namespace ServerLib } [DataContract] - public struct SPlaylistInfo + public struct SPlaylistData { [DataMember] public int PlaylistId; [DataMember] public string PlaylistName; diff --git a/ServerLib/ICWebservice.cs b/ServerLib/ICWebservice.cs index 0305e418..86fbb091 100644 --- a/ServerLib/ICWebservice.cs +++ b/ServerLib/ICWebservice.cs @@ -128,12 +128,12 @@ namespace ServerLib [OperationContract, WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "/getPlaylists")] - SPlaylistInfo[] GetPlaylists(); + SPlaylistData[] GetPlaylists(); [OperationContract, WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "/getPlaylist?id={playlistId}")] - SPlaylistInfo GetPlaylist(int playlistId); + SPlaylistData GetPlaylist(int playlistId); [OperationContract, WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, diff --git a/Vocaluxe/Base/CPlaylists.cs b/Vocaluxe/Base/CPlaylists.cs index 2189fee2..fac2f20c 100644 --- a/Vocaluxe/Base/CPlaylists.cs +++ b/Vocaluxe/Base/CPlaylists.cs @@ -31,7 +31,6 @@ namespace Vocaluxe.Base static class CPlaylists { private static List _Playlists; - private static int _NextID; public static IEnumerable Playlists { @@ -78,7 +77,8 @@ namespace Vocaluxe.Base foreach (string file in files) { - CPlaylistFile playlist = new CPlaylistFile(files.IndexOf(file), file); + CPlaylistFile playlist = new CPlaylistFile(); + if(playlist._Load(file)) _Playlists.Add(playlist); } } @@ -130,7 +130,7 @@ namespace Vocaluxe.Base public static int NewPlaylist(string name = "New Playlist") { - CPlaylistFile pl = new CPlaylistFile(_NextID++) {Name = name}; + CPlaylistFile pl = new CPlaylistFile {Name = name}; _Playlists.Add(pl); return pl.Id; } @@ -212,7 +212,7 @@ namespace Vocaluxe.Base private static CPlaylistFile _ConvertUSDXPlaylist(string file) { - var pl = new CPlaylistFile(_NextID++); + var pl = new CPlaylistFile(); ReadOnlyCollection allSongs = CSongs.AllSongs; if (!File.Exists(file)) diff --git a/Vocaluxe/Base/Server/CVocaluxeServer.cs b/Vocaluxe/Base/Server/CVocaluxeServer.cs index 7031771e..32f87b2e 100644 --- a/Vocaluxe/Base/Server/CVocaluxeServer.cs +++ b/Vocaluxe/Base/Server/CVocaluxeServer.cs @@ -453,13 +453,13 @@ namespace Vocaluxe.Base.Server #endregion #region playlist - private static SPlaylistInfo[] _GetPlaylists() + private static SPlaylistData[] _GetPlaylists() { return (from p in CPlaylists.Playlists select _GetPlaylistInfo(p)).ToArray(); } - private static SPlaylistInfo _GetPlaylist(int playlistId) + private static SPlaylistData _GetPlaylist(int playlistId) { if (CPlaylists.Get(playlistId) == null) throw new ArgumentException("invalid playlistId"); @@ -548,9 +548,9 @@ namespace Vocaluxe.Base.Server return result; } - private static SPlaylistInfo _GetPlaylistInfo(CPlaylistFile playlist) + private static SPlaylistData _GetPlaylistInfo(CPlaylistFile playlist) { - return new SPlaylistInfo + return new SPlaylistData { PlaylistId = playlist.Id, PlaylistName = playlist.Name, diff --git a/Vocaluxe/Base/XmlStructs.cs b/Vocaluxe/Base/XmlStructs.cs index 366aa695..e3bcd3b8 100644 --- a/Vocaluxe/Base/XmlStructs.cs +++ b/Vocaluxe/Base/XmlStructs.cs @@ -97,4 +97,15 @@ namespace Vocaluxe.Base public Dictionary Skins; public Dictionary Videos; } + + struct SPlaylistInfo + { + [XmlElement("PlaylistName")] public string Name; + } + + struct SPlaylist + { + public SPlaylistInfo Info; + [XmlArray] public SPlaylistSong[] Songs; + } } \ No newline at end of file diff --git a/Vocaluxe/Lib/Playlist/CPlaylistFile.cs b/Vocaluxe/Lib/Playlist/CPlaylistFile.cs index d09c9b95..941aec2d 100644 --- a/Vocaluxe/Lib/Playlist/CPlaylistFile.cs +++ b/Vocaluxe/Lib/Playlist/CPlaylistFile.cs @@ -19,7 +19,6 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Xml; using Vocaluxe.Base; using VocaluxeLib; using VocaluxeLib.Menu; @@ -32,15 +31,14 @@ namespace Vocaluxe.Lib.Playlist { public string Name = ""; public string File; - public readonly int Id = -1; + public readonly int Id; public List Songs = new List(); - public CPlaylistFile(int id, string file = "") + private static int _NextID; + + public CPlaylistFile() { - Id = id; - File = file; - if (File != "") - _Load(); + Id = _NextID++; } public void Save() @@ -62,90 +60,40 @@ namespace Vocaluxe.Lib.Playlist File = CHelper.GetUniqueFileName(Path.Combine(CSettings.DataFolder, CConfig.FolderPlaylists), filename + ".xml"); } - XmlWriter writer; + SPlaylist data=new SPlaylist {Info = {Name = Name}, Songs = Songs.Select(plSong => plSong.ToStruct()).ToArray()}; + + var xml = new CXmlSerializer(); + xml.Serialize(File,data); + } + + public bool _Load(string file) + { + File = file; + SPlaylist data; try { - writer = XmlWriter.Create(File, CConfig.XMLSettings); + var xml = new CXmlSerializer(); + data = xml.Deserialize(File); } catch (Exception e) { - CLog.LogError("Error creating/opening Playlist File " + File + ": " + e.Message); - return; + CLog.LogError("Cannot load playlist from "+file+": "+e.Message); + return false; } - - try + Name = data.Info.Name; + Songs = new List(); + foreach (var songEntry in data.Songs) { - writer.WriteStartDocument(); - writer.WriteStartElement("root"); - - writer.WriteStartElement("Info"); - writer.WriteElementString("PlaylistName", Name); - writer.WriteEndElement(); - - writer.WriteStartElement("Songs"); - for (int i = 0; i < Songs.Count; i++) + CSong plSong = CSongs.AllSongs.FirstOrDefault(song => song.Artist == songEntry.Artist && song.Title == songEntry.Title); + if (plSong == null) + CLog.LogError("Can't find song '" + songEntry.Title + "' from '" + songEntry.Artist + "' in playlist file: " + File); + else { - CSong song = CSongs.GetSong(Songs[i].SongID); - if (song != null) - { - writer.WriteStartElement("Song" + (i + 1)); - writer.WriteElementString("Artist", song.Artist); - writer.WriteElementString("Title", song.Title); - writer.WriteElementString("GameMode", Enum.GetName(typeof(EGameMode), Songs[i].GameMode)); - writer.WriteEndElement(); - } - else - CLog.LogError("Playlist.SavePlaylist(): Can't find Song. This should never happen!"); - } - writer.WriteEndElement(); - - writer.WriteEndElement(); //end of root - writer.WriteEndDocument(); - - writer.Flush(); - } - finally - { - writer.Close(); - } - } - - private void _Load() - { - CXMLReader xmlReader = CXMLReader.OpenFile(File); - if (xmlReader == null) - return; - - string value; - if (xmlReader.GetValue("//root/Info/PlaylistName", out value, "")) - { - Name = value; - - Songs = new List(); - - List songs = xmlReader.GetNames("//root/Songs/*"); - - foreach (string songEntry in songs) - { - string artist; - string title; - xmlReader.GetValue("//root/Songs/" + songEntry + "/Artist", out artist, String.Empty); - xmlReader.GetValue("//root/Songs/" + songEntry + "/Title", out title, String.Empty); - EGameMode gm = EGameMode.TR_GAMEMODE_NORMAL; - xmlReader.TryGetEnumValue("//root/Songs/" + songEntry + "/GameMode", ref gm); - - CSong plSong = CSongs.AllSongs.FirstOrDefault(song => song.Artist == artist && song.Title == title); - if (plSong != null) - { - var playlistSong = new CPlaylistSong(plSong.ID, gm); - Songs.Add(playlistSong); - } - else - CLog.LogError("Can't find song '" + title + "' from '" + artist + "' in playlist file: " + File); + var playlistSong = new CPlaylistSong(plSong.ID, songEntry.GameMode); + Songs.Add(playlistSong); } } - else - CLog.LogError("Can't find PlaylistName in Playlist File: " + File); + return true; } public void AddSong(int songID) diff --git a/VocaluxeLib/Menu/CPlaylist.cs b/VocaluxeLib/Menu/CPlaylist.cs index 4a599919..11e0c052 100644 --- a/VocaluxeLib/Menu/CPlaylist.cs +++ b/VocaluxeLib/Menu/CPlaylist.cs @@ -46,6 +46,14 @@ namespace VocaluxeLib.Menu { GameMode = EGameMode.TR_GAMEMODE_NORMAL; } + + public SPlaylistSong ToStruct() + { + CSong song = CBase.Songs.GetSongByID(SongID); + if (song == null) + throw new Exception("Can't find Song. This should never happen!"); + return new SPlaylistSong{Artist = song.Artist, Title = song.Title, GameMode = GameMode}; + } } [XmlType("Playlist")] diff --git a/VocaluxeLib/VocaluxeLib.csproj b/VocaluxeLib/VocaluxeLib.csproj index 71579edd..1dcf7041 100644 --- a/VocaluxeLib/VocaluxeLib.csproj +++ b/VocaluxeLib/VocaluxeLib.csproj @@ -108,6 +108,7 @@ + diff --git a/VocaluxeLib/XmlStructs.cs b/VocaluxeLib/XmlStructs.cs new file mode 100644 index 00000000..234ceda1 --- /dev/null +++ b/VocaluxeLib/XmlStructs.cs @@ -0,0 +1,12 @@ +using System.ComponentModel; +using System.Xml.Serialization; + +namespace VocaluxeLib +{ + [XmlType("Song")] + public struct SPlaylistSong + { + public string Artist, Title; + [DefaultValue(EGameMode.TR_GAMEMODE_NORMAL)] public EGameMode GameMode; + } +} \ No newline at end of file