/* * 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.ComponentModel; using System.Net.Http; 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 = string.Empty; #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 Constructors 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) => 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)}"; switch (_method) { case RequestMethod.GET: { using var response = await NetworkExtensions.HttpClient.GetAsync(url, progress.Token); return response; } case RequestMethod.POST: { using var response = await NetworkExtensions.HttpClient.PostAsync(url, content, progress.Token); return response; } case RequestMethod.PUT: { using var response = await NetworkExtensions.HttpClient.PutAsync(url, content, progress.Token); return response; } default: throw new ArgumentOutOfRangeException(nameof(Method)); } } 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 }