From d6a60490a2cd2700f0e46e2435de3a348222fb56 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Tue, 1 Dec 2020 18:10:56 +0100 Subject: [PATCH] Change networking feature from using wcf to rest wcf is obsolete - and this should make SE ready for .NET 5 --- .gitignore | 1 + src/libse/Common/Settings.cs | 12 +- src/ui/Forms/Networking/NetworkJoin.cs | 4 +- src/ui/Forms/Networking/NetworkLogAndInfo.cs | 9 +- src/ui/Forms/Networking/NetworkStart.cs | 14 +- .../Networking/NikseWebServiceSession.cs | 194 ++-- src/ui/Logic/Networking/SeNetworkService.cs | 300 ++++++ src/ui/Properties/Settings.Designer.cs | 12 +- src/ui/Properties/Settings.settings | 8 +- src/ui/SubtitleEdit.csproj | 53 +- .../SeNetworkService/Reference.cs | 965 ------------------ .../SeNetworkService/Reference.map | 7 - .../SeNetworkService/SeSequence.datasource | 10 - .../SeNetworkService/SeService.disco | 6 - .../SeNetworkService/SeService.wsdl | 512 ---------- .../SeNetworkService/SeUpdate.datasource | 10 - .../SeNetworkService/SeUser.datasource | 10 - src/ui/app.config | 10 - src/ui/packages.config | 4 + 19 files changed, 471 insertions(+), 1670 deletions(-) create mode 100644 src/ui/Logic/Networking/SeNetworkService.cs delete mode 100644 src/ui/Web References/SeNetworkService/Reference.cs delete mode 100644 src/ui/Web References/SeNetworkService/Reference.map delete mode 100644 src/ui/Web References/SeNetworkService/SeSequence.datasource delete mode 100644 src/ui/Web References/SeNetworkService/SeService.disco delete mode 100644 src/ui/Web References/SeNetworkService/SeService.wsdl delete mode 100644 src/ui/Web References/SeNetworkService/SeUpdate.datasource delete mode 100644 src/ui/Web References/SeNetworkService/SeUser.datasource diff --git a/.gitignore b/.gitignore index 8b5ccd640..3883f0948 100644 --- a/.gitignore +++ b/.gitignore @@ -45,3 +45,4 @@ SubtitleEditBeta /src/ui/NHunspell* /build_beta.bat /TestResults +/packages diff --git a/src/libse/Common/Settings.cs b/src/libse/Common/Settings.cs index af4d864ec..c25a69724 100644 --- a/src/libse/Common/Settings.cs +++ b/src/libse/Common/Settings.cs @@ -1743,7 +1743,7 @@ $HorzAlign = Center public class NetworkSettings { public string UserName { get; set; } - public string WebServiceUrl { get; set; } + public string WebApiUrl { get; set; } public string SessionKey { get; set; } public int PollIntervalSeconds { get; set; } public string NewMessageSound { get; set; } @@ -1751,8 +1751,8 @@ $HorzAlign = Center public NetworkSettings() { UserName = string.Empty; - SessionKey = "DemoSession"; // TODO: Leave blank or use guid - WebServiceUrl = "https://www.nikse.dk/se/SeService.asmx"; + SessionKey = "DemoSession"; + WebApiUrl = "https://www.nikse.dk/api/SeNet"; PollIntervalSeconds = 5; } } @@ -5635,10 +5635,10 @@ $HorzAlign = Center settings.NetworkSettings.UserName = subNode.InnerText; } - subNode = node.SelectSingleNode("WebServiceUrl"); + subNode = node.SelectSingleNode("WebApiUrl"); if (subNode != null) { - settings.NetworkSettings.WebServiceUrl = subNode.InnerText; + settings.NetworkSettings.WebApiUrl = subNode.InnerText; } subNode = node.SelectSingleNode("PollIntervalSeconds"); @@ -8274,7 +8274,7 @@ $HorzAlign = Center textWriter.WriteStartElement("NetworkSettings", string.Empty); textWriter.WriteElementString("SessionKey", settings.NetworkSettings.SessionKey); textWriter.WriteElementString("UserName", settings.NetworkSettings.UserName); - textWriter.WriteElementString("WebServiceUrl", settings.NetworkSettings.WebServiceUrl); + textWriter.WriteElementString("WebApiUrl", settings.NetworkSettings.WebApiUrl); textWriter.WriteElementString("PollIntervalSeconds", settings.NetworkSettings.PollIntervalSeconds.ToString(CultureInfo.InvariantCulture)); textWriter.WriteElementString("NewMessageSound", settings.NetworkSettings.NewMessageSound); textWriter.WriteEndElement(); diff --git a/src/ui/Forms/Networking/NetworkJoin.cs b/src/ui/Forms/Networking/NetworkJoin.cs index 24adb389b..79be0f1ae 100644 --- a/src/ui/Forms/Networking/NetworkJoin.cs +++ b/src/ui/Forms/Networking/NetworkJoin.cs @@ -40,7 +40,7 @@ namespace Nikse.SubtitleEdit.Forms.Networking textBoxSessionKey.Text = Guid.NewGuid().ToString().RemoveChar('-'); } - comboBoxWebServiceUrl.Text = Configuration.Settings.NetworkSettings.WebServiceUrl; + comboBoxWebServiceUrl.Text = Configuration.Settings.NetworkSettings.WebApiUrl; textBoxUserName.Text = Configuration.Settings.NetworkSettings.UserName; if (textBoxUserName.Text.Trim().Length < 2) { @@ -51,7 +51,7 @@ namespace Nikse.SubtitleEdit.Forms.Networking private void buttonJoin_Click(object sender, EventArgs e) { Configuration.Settings.NetworkSettings.SessionKey = textBoxSessionKey.Text; - Configuration.Settings.NetworkSettings.WebServiceUrl = comboBoxWebServiceUrl.Text; + Configuration.Settings.NetworkSettings.WebApiUrl = comboBoxWebServiceUrl.Text; Configuration.Settings.NetworkSettings.UserName = textBoxUserName.Text; buttonJoin.Enabled = false; diff --git a/src/ui/Forms/Networking/NetworkLogAndInfo.cs b/src/ui/Forms/Networking/NetworkLogAndInfo.cs index 831a77fd7..fae1f5274 100644 --- a/src/ui/Forms/Networking/NetworkLogAndInfo.cs +++ b/src/ui/Forms/Networking/NetworkLogAndInfo.cs @@ -1,8 +1,7 @@ -using System; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common; using Nikse.SubtitleEdit.Logic; +using System; +using System.Windows.Forms; namespace Nikse.SubtitleEdit.Forms.Networking { @@ -26,7 +25,7 @@ namespace Nikse.SubtitleEdit.Forms.Networking { textBoxSessionKey.Text = networkSession.SessionId; textBoxUserName.Text = networkSession.CurrentUser.UserName; - textBoxWebServiceUrl.Text = networkSession.WebServiceUrl; + textBoxWebServiceUrl.Text = networkSession.BaseUrl; textBoxLog.Text = networkSession.GetLog(); } diff --git a/src/ui/Forms/Networking/NetworkStart.cs b/src/ui/Forms/Networking/NetworkStart.cs index 3a8b10523..41c009ad1 100644 --- a/src/ui/Forms/Networking/NetworkStart.cs +++ b/src/ui/Forms/Networking/NetworkStart.cs @@ -1,9 +1,8 @@ -using System; +using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Logic; +using System; using System.Net; using System.Windows.Forms; -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.Common; -using Nikse.SubtitleEdit.Logic; namespace Nikse.SubtitleEdit.Forms.Networking { @@ -41,7 +40,7 @@ namespace Nikse.SubtitleEdit.Forms.Networking textBoxSessionKey.Text = Guid.NewGuid().ToString().RemoveChar('-'); } - comboBoxWebServiceUrl.Text = Configuration.Settings.NetworkSettings.WebServiceUrl; + comboBoxWebServiceUrl.Text = Configuration.Settings.NetworkSettings.WebApiUrl; textBoxUserName.Text = Configuration.Settings.NetworkSettings.UserName; if (textBoxUserName.Text.Trim().Length < 2) { @@ -52,7 +51,7 @@ namespace Nikse.SubtitleEdit.Forms.Networking private void buttonStart_Click(object sender, EventArgs e) { Configuration.Settings.NetworkSettings.SessionKey = textBoxSessionKey.Text; - Configuration.Settings.NetworkSettings.WebServiceUrl = comboBoxWebServiceUrl.Text; + Configuration.Settings.NetworkSettings.WebApiUrl = comboBoxWebServiceUrl.Text; Configuration.Settings.NetworkSettings.UserName = textBoxUserName.Text; buttonStart.Enabled = false; @@ -65,8 +64,7 @@ namespace Nikse.SubtitleEdit.Forms.Networking try { - string message; - _networkSession.StartServer(comboBoxWebServiceUrl.Text, textBoxSessionKey.Text, textBoxUserName.Text, _fileName, out message); + _networkSession.StartServer(comboBoxWebServiceUrl.Text, textBoxSessionKey.Text, textBoxUserName.Text, _fileName, out var message); if (message != "OK") { MessageBox.Show(message); diff --git a/src/ui/Logic/Networking/NikseWebServiceSession.cs b/src/ui/Logic/Networking/NikseWebServiceSession.cs index 24b9cb30e..49f676d31 100644 --- a/src/ui/Logic/Networking/NikseWebServiceSession.cs +++ b/src/ui/Logic/Networking/NikseWebServiceSession.cs @@ -1,9 +1,10 @@ using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; +using System.Linq; using System.Net; using System.Text; -using Nikse.SubtitleEdit.Core.Common; namespace Nikse.SubtitleEdit.Logic.Networking { @@ -21,20 +22,19 @@ namespace Nikse.SubtitleEdit.Logic.Networking private System.Windows.Forms.Timer _timerWebService; public List UpdateLog { get; } = new List(); public List ChatLog { get; } = new List(); - private SeNetworkService.SeService _seWs; + private SeNetworkService _seWs; private DateTime _seWsLastUpdate = DateTime.Now.AddYears(-1); public SeNetworkService.SeUser CurrentUser { get; set; } public Subtitle LastSubtitle { get; set; } public Subtitle Subtitle { get; private set; } public Subtitle OriginalSubtitle { get; private set; } public string SessionId { get; private set; } + public string BaseUrl => _seWs != null ? _seWs.BaseUrl : string.Empty; private string _userName; private string _fileName; public List Users { get; private set; } public StringBuilder Log { get; } - public string WebServiceUrl => _seWs.Url; - public NikseWebServiceSession(Subtitle subtitle, Subtitle originalSubtitle, EventHandler onUpdateTimerTick, EventHandler onUpdateUserLogEntries) { Subtitle = subtitle; @@ -52,13 +52,13 @@ namespace Nikse.SubtitleEdit.Logic.Networking OnUpdateUserLogEntries = onUpdateUserLogEntries; } - public void StartServer(string webServiceUrl, string sessionKey, string userName, string fileName, out string message) + public void StartServer(string baseUrl, string sessionKey, string userName, string fileName, out string message) { SessionId = sessionKey; _userName = userName; _fileName = fileName; var list = new List(); - foreach (Paragraph p in Subtitle.Paragraphs) + foreach (var p in Subtitle.Paragraphs) { list.Add(new SeNetworkService.SeSequence { @@ -71,7 +71,7 @@ namespace Nikse.SubtitleEdit.Logic.Networking var originalSubtitle = new List(); if (OriginalSubtitle != null) { - foreach (Paragraph p in OriginalSubtitle.Paragraphs) + foreach (var p in OriginalSubtitle.Paragraphs) { originalSubtitle.Add(new SeNetworkService.SeSequence { @@ -82,15 +82,21 @@ namespace Nikse.SubtitleEdit.Logic.Networking } } - _seWs = new SeNetworkService.SeService + _seWs = new SeNetworkService(baseUrl); + var request = new SeNetworkService.StartRequest() { - Url = webServiceUrl, - Proxy = Utilities.GetProxy() + SessionId = sessionKey, + FileName = fileName, + OriginalSubtitle = originalSubtitle, + Subtitle = list, + UserName = userName }; - var user = _seWs.Start(sessionKey, userName, list.ToArray(), originalSubtitle.ToArray(), fileName, out message); - CurrentUser = user; - Users = new List { user }; - if (message == "OK") + + var response = _seWs.Start(request); + CurrentUser = response.User; + message = response.Message; + Users = new List { response.User }; + if (response.Message == "OK") { _timerWebService.Start(); } @@ -99,40 +105,50 @@ namespace Nikse.SubtitleEdit.Logic.Networking public bool Join(string webServiceUrl, string userName, string sessionKey, out string message) { SessionId = sessionKey; - _seWs = new SeNetworkService.SeService - { - Url = webServiceUrl, - Proxy = Utilities.GetProxy() - }; + _seWs = new SeNetworkService(webServiceUrl); Users = new List(); - var users = _seWs.Join(sessionKey, userName, out message); - if (message != "OK") + var joinRequest = new SeNetworkService.JoinRequest() + { + SessionId = sessionKey, + UserName = userName + }; + var joinResponse = _seWs.Join(joinRequest); + message = joinResponse.Message; + if (joinResponse.Message != "OK") { return false; } - string tempFileName; Subtitle = new Subtitle(); - foreach (var sequence in _seWs.GetSubtitle(sessionKey, out tempFileName, out _)) + var getSubtitleRequest = new SeNetworkService.GetSubtitleRequest + { + SessionId = sessionKey + }; + var getSubtitleResponse = _seWs.GetSubtitle(getSubtitleRequest); + foreach (var sequence in getSubtitleResponse.Subtitle) { Subtitle.Paragraphs.Add(new Paragraph(WebUtility.HtmlDecode(sequence.Text).Replace("
", Environment.NewLine), sequence.StartMilliseconds, sequence.EndMilliseconds)); } - _fileName = tempFileName; + _fileName = getSubtitleResponse.FileName; OriginalSubtitle = new Subtitle(); - var sequences = _seWs.GetOriginalSubtitle(sessionKey); - if (sequences != null) + var getOriginalSubtitleRequest = new SeNetworkService.GetOriginalSubtitleRequest { - foreach (var sequence in sequences) + SessionId = sessionKey + }; + var getOriginalSubtitleResponse = _seWs.GetOriginalSubtitle(getOriginalSubtitleRequest); + if (getOriginalSubtitleResponse.Subtitle != null) + { + foreach (var sequence in getOriginalSubtitleResponse.Subtitle) { OriginalSubtitle.Paragraphs.Add(new Paragraph(WebUtility.HtmlDecode(sequence.Text).Replace("
", Environment.NewLine), sequence.StartMilliseconds, sequence.EndMilliseconds)); } } SessionId = sessionKey; - CurrentUser = users[users.Length - 1]; // me - foreach (var user in users) + CurrentUser = joinResponse.Users.Last(); + foreach (var user in joinResponse.Users) { Users.Add(user); } @@ -159,28 +175,40 @@ namespace Nikse.SubtitleEdit.Logic.Networking public List GetUpdates(out string message, out int numberOfLines) { - List list = new List(); - var updates = _seWs.GetUpdates(SessionId, CurrentUser.UserName, _seWsLastUpdate, out message, out var newUpdateTime, out numberOfLines); - if (updates != null) + var list = new List(); + var request = new SeNetworkService.GetUpdatesRequest { - foreach (var update in updates) + SessionId = SessionId, + UserName = CurrentUser.UserName, + LastUpdateTime = _seWsLastUpdate + }; + var response = _seWs.GetUpdates(request); + if (response.Updates != null) + { + foreach (var update in response.Updates) { list.Add(update); } } - _seWsLastUpdate = newUpdateTime; + _seWsLastUpdate = response.NewUpdateTime; + message = response.Message; + numberOfLines = response.NumberOfLines; return list; } public Subtitle ReloadSubtitle() { Subtitle.Paragraphs.Clear(); - var sequences = _seWs.GetSubtitle(SessionId, out var tempFileName, out var updateTime); - _fileName = tempFileName; - _seWsLastUpdate = updateTime; - if (sequences != null) + var request = new SeNetworkService.GetSubtitleRequest { - foreach (var sequence in sequences) + SessionId = SessionId, + }; + var response = _seWs.GetSubtitle(request); + _fileName = response.FileName; + _seWsLastUpdate = response.UpdateTime; + if (response.Subtitle != null) + { + foreach (var sequence in response.Subtitle) { Subtitle.Paragraphs.Add(new Paragraph(WebUtility.HtmlDecode(sequence.Text).Replace("
", Environment.NewLine), sequence.StartMilliseconds, sequence.EndMilliseconds)); } @@ -190,23 +218,31 @@ namespace Nikse.SubtitleEdit.Logic.Networking private void ReloadFromWs() { - if (_seWs != null) + if (_seWs == null) { - Subtitle = new Subtitle(); - var sequences = _seWs.GetSubtitle(SessionId, out _fileName, out _seWsLastUpdate); - foreach (var sequence in sequences) - { - var p = new Paragraph(WebUtility.HtmlDecode(sequence.Text).Replace("
", Environment.NewLine), sequence.StartMilliseconds, sequence.EndMilliseconds); - Subtitle.Paragraphs.Add(p); - } - Subtitle.Renumber(); - LastSubtitle = new Subtitle(Subtitle); + return; } + + Subtitle = new Subtitle(); + var request = new SeNetworkService.GetSubtitleRequest + { + SessionId = SessionId, + }; + var response = _seWs.GetSubtitle(request); + _fileName = response.FileName; + _seWsLastUpdate = response.UpdateTime; + foreach (var sequence in response.Subtitle) + { + var p = new Paragraph(WebUtility.HtmlDecode(sequence.Text).Replace("
", Environment.NewLine), sequence.StartMilliseconds, sequence.EndMilliseconds); + Subtitle.Paragraphs.Add(p); + } + Subtitle.Renumber(); + LastSubtitle = new Subtitle(Subtitle); } public void AppendToLog(string text) { - string timestamp = DateTime.Now.ToLongTimeString(); + var timestamp = DateTime.Now.ToLongTimeString(); Log.AppendLine(timestamp + ": " + UiUtil.GetListViewTextFromString(text.TrimEnd())); } @@ -217,17 +253,31 @@ namespace Nikse.SubtitleEdit.Logic.Networking public void SendChatMessage(string message) { - _seWs.SendMessage(SessionId, WebUtility.HtmlEncode(message.Replace(Environment.NewLine, "
")), CurrentUser); + var request = new SeNetworkService.SendMessageRequest + { + SessionId = SessionId, + User = CurrentUser, + Text = WebUtility.HtmlEncode(message.Replace(Environment.NewLine, "
")) + }; + _seWs.SendMessage(request); } internal void UpdateLine(int index, Paragraph paragraph) { - _seWs.UpdateLine(SessionId, index, new SeNetworkService.SeSequence + var request = new SeNetworkService.UpdateLineRequest { - StartMilliseconds = (int)paragraph.StartTime.TotalMilliseconds, - EndMilliseconds = (int)paragraph.EndTime.TotalMilliseconds, - Text = WebUtility.HtmlEncode(paragraph.Text.Replace(Environment.NewLine, "
")) - }, CurrentUser); + SessionId = SessionId, + User = CurrentUser, + Index = index, + Sequence = new SeNetworkService.SeSequence + { + StartMilliseconds = (int)paragraph.StartTime.TotalMilliseconds, + EndMilliseconds = (int)paragraph.EndTime.TotalMilliseconds, + Text = WebUtility.HtmlEncode(paragraph.Text.Replace(Environment.NewLine, "
")) + } + }; + + _seWs.UpdateLine(request); AddToWsUserLog(CurrentUser, index, "UPD", true); } @@ -275,7 +325,8 @@ namespace Nikse.SubtitleEdit.Logic.Networking { try { - _seWs.Leave(SessionId, CurrentUser.UserName); + var request = new SeNetworkService.LeaveRequest { SessionId = SessionId, UserName = CurrentUser.UserName }; + _seWs.Leave(request); } catch { @@ -285,7 +336,13 @@ namespace Nikse.SubtitleEdit.Logic.Networking internal void DeleteLines(List indices) { - _seWs.DeleteLines(SessionId, indices.ToArray(), CurrentUser); + var request = new SeNetworkService.DeleteLinesRequest + { + SessionId = SessionId, + User = CurrentUser, + Indices = indices + }; + _seWs.DeleteLines(request); foreach (int index in indices) { AdjustUpdateLogToDelete(index); @@ -295,7 +352,16 @@ namespace Nikse.SubtitleEdit.Logic.Networking internal void InsertLine(int index, Paragraph newParagraph) { - _seWs.InsertLine(SessionId, index, (int)newParagraph.StartTime.TotalMilliseconds, (int)newParagraph.EndTime.TotalMilliseconds, newParagraph.Text, CurrentUser); + var request = new SeNetworkService.InsertLineRequest + { + SessionId = SessionId, + User = CurrentUser, + Index = index, + Text = newParagraph.Text, + StartMilliseconds = (int)newParagraph.StartTime.TotalMilliseconds, + EndMilliseconds = (int)newParagraph.EndTime.TotalMilliseconds + }; + _seWs.InsertLine(request); AppendToLog(string.Format(Configuration.Settings.Language.Main.NetworkInsert, CurrentUser.UserName, CurrentUser.Ip, index, UiUtil.GetListViewTextFromString(newParagraph.Text))); } @@ -340,7 +406,7 @@ namespace Nikse.SubtitleEdit.Logic.Networking try { System.Threading.Thread.Sleep(200); - StartServer(_seWs.Url, SessionId, _userName, _fileName, out message); + StartServer(_seWs.BaseUrl, SessionId, _userName, _fileName, out message); retries = maxRetries; } catch @@ -367,7 +433,7 @@ namespace Nikse.SubtitleEdit.Logic.Networking try { System.Threading.Thread.Sleep(200); - if (Join(_seWs.Url, _userName, SessionId, out message)) + if (Join(_seWs.BaseUrl, _userName, SessionId, out message)) { message = "Reload"; } @@ -399,11 +465,7 @@ namespace Nikse.SubtitleEdit.Logic.Networking _timerWebService.Dispose(); _timerWebService = null; } - if (_seWs != null) - { - _seWs.Dispose(); - _seWs = null; - } + _seWs = null; } } diff --git a/src/ui/Logic/Networking/SeNetworkService.cs b/src/ui/Logic/Networking/SeNetworkService.cs new file mode 100644 index 000000000..feb331aad --- /dev/null +++ b/src/ui/Logic/Networking/SeNetworkService.cs @@ -0,0 +1,300 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text; +using System.Threading.Tasks; + +namespace Nikse.SubtitleEdit.Logic.Networking +{ + public class SeNetworkService + { + private static HttpClient _httpClient; + public string BaseUrl { get; private set; } + + public SeNetworkService(string baseUrl) + { + if (string.IsNullOrEmpty(baseUrl)) + { + throw new ArgumentException("Url cannot be empty"); + } + + BaseUrl = baseUrl.Trim().TrimEnd('/') + "/"; + _httpClient = CreateDefaultHttpClient(BaseUrl); + } + + private static HttpClient CreateDefaultHttpClient(string baseUrl) + { + if (!Uri.IsWellFormedUriString(baseUrl, UriKind.Absolute)) + { + throw new ArgumentException($"{baseUrl} is not a valid base URL."); + } + + var client = new HttpClient { BaseAddress = new Uri(baseUrl) }; + client.DefaultRequestHeaders.Accept.Clear(); + client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + return client; + } + + public T Post(string path, object content = null) + { + var response = SendRequest(HttpMethod.Post, path, content); + return ReadResponse(response); + } + + private HttpResponseMessage SendRequest(HttpMethod method, string uri, object content = null) + { + return SendRequestAsync(method, uri, content).Result; + } + + public Task SendRequestAsync(HttpMethod method, string uri, object content = null) + { + var request = new HttpRequestMessage(method, uri); + + if (content != null) + { + request.Content = new StringContent(JsonConvert.SerializeObject(content), + Encoding.UTF8, + "application/json"); + } + + return _httpClient.SendAsync(request); + } + + private static T ReadResponse(HttpResponseMessage response) + { + var settings = new JsonSerializerSettings + { + MaxDepth = 20 + }; + var jsonResponse = response.Content.ReadAsStringAsync().Result; + return JsonConvert.DeserializeObject(jsonResponse, settings); + } + + public class SeSequence + { + public int Index { get; set; } + public int StartMilliseconds { get; set; } + public int EndMilliseconds { get; set; } + public string Text { get; set; } + } + + [Serializable] + public class SeUser + { + public string UserName { get; set; } + public string Ip { get; set; } + public DateTime LastActivity { get; set; } + } + + public class SeUpdate + { + public DateTime Time { get; set; } + public SeUser User { get; set; } + public int Index { get; set; } + public int StartMilliseconds { get; set; } + public int EndMilliseconds { get; set; } + public string Text { get; set; } + public string Action { get; set; } + + public SeUpdate() + { + } + + public SeUpdate(SeUser user, int index, int startMilliseconds, int endMilliseconds, string text, string action) + { + User = user; + Index = index; + StartMilliseconds = startMilliseconds; + EndMilliseconds = endMilliseconds; + Text = text; + Action = action; + Time = DateTime.Now; + } + } + + public class SeSession + { + public DateTime Started { get; private set; } + public string Id { get; private set; } + public string FileName { get; private set; } + public List Subtitle { get; private set; } + public List OriginalSubtitle { get; private set; } + public List Users { get; private set; } + public List Updates { get; private set; } + + public SeSession(string sessionId, List subtitle, string fileName, List originalsubtitle) + { + Started = DateTime.Now; + Id = sessionId; + FileName = fileName; + Subtitle = subtitle; + OriginalSubtitle = originalsubtitle; + Renumber(); + Users = new List(); + Updates = new List(); + } + + public void Renumber() + { + for (int i = 0; i < Subtitle.Count; i++) + { + Subtitle[0].Index = i; + } + } + } + + public class StartRequest + { + public string SessionId { get; set; } + public string UserName { get; set; } + public string FileName { get; set; } + public List Subtitle { get; set; } + public List OriginalSubtitle { get; set; } + } + + public class StartResponse + { + public SeUser User { get; set; } + public string Message { get; set; } + } + + public StartResponse Start(StartRequest request) + { + return Post("Start", request); + } + + public class JoinRequest + { + public string SessionId { get; set; } + public string UserName { get; set; } + } + + public class JoinResponse + { + public List Users { get; set; } + public string Message { get; set; } + } + + public JoinResponse Join(JoinRequest request) + { + return Post("Join", request); + } + + public class LeaveRequest + { + public string SessionId { get; set; } + public string UserName { get; set; } + } + + public void Leave(LeaveRequest request) + { + Post("Leave", request); + } + + public class DeleteLinesRequest + { + public string SessionId { get; set; } + public List Indices { get; set; } + public SeUser User { get; set; } + } + + public bool DeleteLines(DeleteLinesRequest request) + { + return Post("DeleteLines", request); + } + + public class InsertLineRequest + { + public string SessionId { get; set; } + public int Index { get; set; } + public int StartMilliseconds { get; set; } + public int EndMilliseconds { get; set; } + public string Text { get; set; } + public SeUser User { get; set; } + } + + public bool InsertLine(InsertLineRequest request) + { + return Post("InsertLine", request); + } + + public class UpdateLineRequest + { + public string SessionId { get; set; } + public int Index { get; set; } + public SeSequence Sequence { get; set; } + public SeUser User { get; set; } + } + + public bool UpdateLine(UpdateLineRequest request) + { + return Post("UpdateLine", request); + } + + public class SendMessageRequest + { + public string SessionId { get; set; } + public string Text { get; set; } + public SeUser User { get; set; } + } + + public bool SendMessage(SendMessageRequest request) + { + return Post("SendMessage", request); + } + + public class GetUpdatesRequest + { + public string SessionId { get; set; } + public string UserName { get; set; } + public DateTime LastUpdateTime { get; set; } + } + + public class GetUpdatesResponse + { + public List Updates { get; set; } + public string Message { get; set; } + public DateTime NewUpdateTime { get; set; } + public int NumberOfLines { get; set; } + } + + public GetUpdatesResponse GetUpdates(GetUpdatesRequest request) + { + return Post("GetUpdates", request); + } + + public class GetSubtitleRequest + { + public string SessionId { get; set; } + } + + public class GetSubtitleResponse + { + public List Subtitle { get; set; } + public string FileName { get; set; } + public DateTime UpdateTime { get; set; } + } + + public GetSubtitleResponse GetSubtitle(GetSubtitleRequest request) + { + return Post("GetSubtitle", request); + } + + public class GetOriginalSubtitleRequest + { + public string SessionId { get; set; } + } + + public class GetOriginalSubtitleResponse + { + public List Subtitle { get; set; } + } + + public GetOriginalSubtitleResponse GetOriginalSubtitle(GetOriginalSubtitleRequest request) + { + return Post("GetOriginalSubtitle", request); + } + } +} \ No newline at end of file diff --git a/src/ui/Properties/Settings.Designer.cs b/src/ui/Properties/Settings.Designer.cs index 9b8fa81d0..3520a5f43 100644 --- a/src/ui/Properties/Settings.Designer.cs +++ b/src/ui/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace Nikse.SubtitleEdit.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.7.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.8.1.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); @@ -22,15 +22,5 @@ namespace Nikse.SubtitleEdit.Properties { return defaultInstance; } } - - [global::System.Configuration.ApplicationScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.WebServiceUrl)] - [global::System.Configuration.DefaultSettingValueAttribute("http://localhost:2782/se/SeService.asmx")] - public string SubtitleEdit_SeNetworkService_SeService { - get { - return ((string)(this["SubtitleEdit_SeNetworkService_SeService"])); - } - } } } diff --git a/src/ui/Properties/Settings.settings b/src/ui/Properties/Settings.settings index a415e6e6f..8e615f25f 100644 --- a/src/ui/Properties/Settings.settings +++ b/src/ui/Properties/Settings.settings @@ -1,9 +1,5 @@  - + - - - http://localhost:2782/se/SeService.asmx - - + \ No newline at end of file diff --git a/src/ui/SubtitleEdit.csproj b/src/ui/SubtitleEdit.csproj index 56bdf716d..fa7d77411 100644 --- a/src/ui/SubtitleEdit.csproj +++ b/src/ui/SubtitleEdit.csproj @@ -57,6 +57,9 @@ DLLs\Interop.QuartzTypeLib.dll False + + ..\..\packages\Newtonsoft.Json.8.0.3\lib\net45\Newtonsoft.Json.dll + False packages\NHunspell.1.2.5554.16953\lib\net\NHunspell.dll @@ -65,6 +68,14 @@ + + + ..\..\packages\Microsoft.Net.Http.2.2.29\lib\net45\System.Net.Http.Extensions.dll + + + ..\..\packages\Microsoft.Net.Http.2.2.29\lib\net45\System.Net.Http.Primitives.dll + + @@ -1054,6 +1065,7 @@ + @@ -1125,11 +1137,6 @@ True Resources.resx - - True - True - Reference.map - TimeUpDown.cs Designer @@ -1648,20 +1655,6 @@ Designer - - MSDiscoCodeGenerator - Reference.cs - - - Reference.map - - - - Reference.map - - - Reference.map - @@ -1784,7 +1777,6 @@ Always - VideoPlayerContainer.cs @@ -1904,22 +1896,6 @@ true - - - - - - Dynamic - Web References\SeNetworkService\ - http://localhost:2782/se/SeService.asmx - - - - - Settings - SubtitleEdit_SeNetworkService_SeService - - {3e3cb28f-3a7b-430f-9eb3-0d6c1e53b753} @@ -1950,6 +1926,11 @@ + + + + + - - Nikse.SubtitleEdit.SeNetworkService.SeSequence, Web References.SeNetworkService.Reference.cs.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - \ No newline at end of file diff --git a/src/ui/Web References/SeNetworkService/SeService.disco b/src/ui/Web References/SeNetworkService/SeService.disco deleted file mode 100644 index 22d263bf1..000000000 --- a/src/ui/Web References/SeNetworkService/SeService.disco +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/ui/Web References/SeNetworkService/SeService.wsdl b/src/ui/Web References/SeNetworkService/SeService.wsdl deleted file mode 100644 index 67e94424b..000000000 --- a/src/ui/Web References/SeNetworkService/SeService.wsdl +++ /dev/null @@ -1,512 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/ui/Web References/SeNetworkService/SeUpdate.datasource b/src/ui/Web References/SeNetworkService/SeUpdate.datasource deleted file mode 100644 index 951b13dd5..000000000 --- a/src/ui/Web References/SeNetworkService/SeUpdate.datasource +++ /dev/null @@ -1,10 +0,0 @@ - - - - Nikse.SubtitleEdit.SeNetworkService.SeUpdate, Web References.SeNetworkService.Reference.cs.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - \ No newline at end of file diff --git a/src/ui/Web References/SeNetworkService/SeUser.datasource b/src/ui/Web References/SeNetworkService/SeUser.datasource deleted file mode 100644 index f86454535..000000000 --- a/src/ui/Web References/SeNetworkService/SeUser.datasource +++ /dev/null @@ -1,10 +0,0 @@ - - - - Nikse.SubtitleEdit.SeNetworkService.SeUser, Web References.SeNetworkService.Reference.cs.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - \ No newline at end of file diff --git a/src/ui/app.config b/src/ui/app.config index c3f5c8a30..5a2cb5b3d 100644 --- a/src/ui/app.config +++ b/src/ui/app.config @@ -1,17 +1,7 @@ - -
- - - - - http://localhost:2782/se/SeService.asmx - - - diff --git a/src/ui/packages.config b/src/ui/packages.config index d2b7a3e2c..080ebe863 100644 --- a/src/ui/packages.config +++ b/src/ui/packages.config @@ -1,5 +1,9 @@  + + + + \ No newline at end of file