/* * GNU AFFERO GENERAL PUBLIC LICENSE * Version 3, 19 November 2007 * Copyright (C) 2007 Free Software Foundation, Inc. * Everyone is permitted to copy and distribute verbatim copies * of this license document, but changing it is not allowed. */ using System; using System.Collections.Specialized; using System.ComponentModel; using System.Diagnostics; using System.IO; using System.Net; using System.Net.Http; using System.Threading; using System.Threading.Tasks; using UVtools.Core.Extensions; using UVtools.Core.Objects; using UVtools.Core.Operations; namespace UVtools.Core.Network { public class RemotePrinterRequest : BindableBase { #region Enums public enum RequestMethod : byte { [Description("GET")] GET, [Description("POST")] POST, [Description("PUT")] PUT } public enum RequestType : byte { UploadFile, PrintFile, DeleteFile, PausePrint, ResumePrint, StopPrint, GetFiles, PrintStatus, PrinterInfo, } #endregion #region Members private RequestType _type; private RequestMethod _method; private string _path = ""; #endregion #region Properties /// /// Gets or sets this request type /// public RequestType Type { get => _type; set => RaiseAndSetIfChanged(ref _type, value); } /// /// Gets or sets this request method /// public RequestMethod Method { get => _method; set => RaiseAndSetIfChanged(ref _method, value); } /// /// Gets or sets the request path, eg: print/file/{0} /// public string Path { get => _path; set { if (!string.IsNullOrWhiteSpace(value)) { value = value.Trim(); if (value[0] == '/') value = value.Remove(0, 1); if(value[^1] == '/') value = value.Remove(value.Length-1, 1); } if(!RaiseAndSetIfChanged(ref _path, value)) return; RaisePropertyChanged(nameof(IsValid)); } } public bool IsValid => !string.IsNullOrWhiteSpace(_path); #endregion #region Contructors public RemotePrinterRequest() { } public RemotePrinterRequest(RequestType type, RequestMethod method, string path = "") { _type = type; _method = method; Path = path; } #endregion #region Methods /// /// Gets the path with formatted arguments /// /// /// public string GetFormattedPath(params object[] parameters) => _path is null ? null : string.Format(_path, parameters); public async Task SendRequest(string host, ushort port = 0, OperationProgress progress = null, string param1 = null, HttpContent content = null) { string url = $"http://{host}"; if (port > 0) url += $":{port}"; progress ??= new(); progress.Title = $"Sending {_method} request to: {url}"; progress.ItemName = "Megabyte(s)"; progress.CanCancel = true; if (!string.IsNullOrWhiteSpace(_path)) url += $"/{GetFormattedPath(param1)}"; if (_method == RequestMethod.GET) { using var response = await NetworkExtensions.HttpClient.GetAsync(url, progress.Token); return response; } if (_method == RequestMethod.POST) { using var response = await NetworkExtensions.HttpClient.PostAsync(url, content, progress.Token); return response; } if (_method == RequestMethod.PUT) { using var response = await NetworkExtensions.HttpClient.PutAsync(url, content, progress.Token); return response; } return null; } public async Task SendRequest(RemotePrinter remotePrinter, OperationProgress progress = null, string param1 = null, HttpContent content = null) => await SendRequest(remotePrinter.Host, remotePrinter.Port, progress, param1, content); public RemotePrinterRequest Clone() { return MemberwiseClone() as RemotePrinterRequest; } public override string ToString() { return _path; } protected bool Equals(RemotePrinterRequest other) { return _path == other._path; } public override bool Equals(object obj) { if (ReferenceEquals(null, obj)) return false; if (ReferenceEquals(this, obj)) return true; if (obj.GetType() != this.GetType()) return false; return Equals((RemotePrinterRequest)obj); } public override int GetHashCode() { return (_path != null ? _path.GetHashCode() : 0); } #endregion } }