diff --git a/Makefile.3ds b/Makefile.3ds index d8b1971..01013bd 100644 --- a/Makefile.3ds +++ b/Makefile.3ds @@ -52,7 +52,7 @@ RSF_FILE := meta/ftpd-classic-cia.rsf endif APP_DESCRIPTION := v$(VERSION) -APP_AUTHOR := mtheall +APP_AUTHOR := (c) 2014-2020 Michael Theall, Dave Murphy, TuxSH ICON := meta/icon.png BNR_IMAGE := meta/banner.png diff --git a/Makefile.nds b/Makefile.nds index 6a31484..a45f3f7 100644 --- a/Makefile.nds +++ b/Makefile.nds @@ -35,7 +35,7 @@ NITRO := # These set the information text in the nds file GAME_TITLE := ftpd classic GAME_SUBTITLE1 := v$(VERSION) -GAME_SUBTITLE2 := (c) mtheall +GAME_SUBTITLE2 := (c) 2014-2020 mtheall #--------------------------------------------------------------------------------- # options for code generation diff --git a/Makefile.switch b/Makefile.switch index b49eb66..c5fc3b6 100644 --- a/Makefile.switch +++ b/Makefile.switch @@ -37,7 +37,7 @@ include $(DEVKITPRO)/libnx/switch_rules # of a homebrew executable (.nro). This is intended to be used for sysmodules. # NACP building is skipped as well. #--------------------------------------------------------------------------------- -APP_AUTHOR := mtheall, TuxSH, WinterMute +APP_AUTHOR := (c) 2014-2020 Michael Theall, Dave Murphy, TuxSH ICON := meta/ftpd.jpg APP_VERSION := $(VERSION) diff --git a/include/ftpServer.h b/include/ftpServer.h index c2ea971..c455c12 100644 --- a/include/ftpServer.h +++ b/include/ftpServer.h @@ -70,6 +70,12 @@ private: /// \brief Show menu in the current window void showMenu (); + /// \brief Show settings menu + void showSettings (); + + /// \brief Show about window + void showAbout (); + /// \brief Server loop void loop (); @@ -102,6 +108,8 @@ private: #ifndef CLASSIC /// \brief Whether to show settings menu bool m_showSettings = false; + /// \brief Whether to show about window + bool m_showAbout = false; /// \brief User name setting std::string m_userSetting; diff --git a/include/licenses.h b/include/licenses.h new file mode 100644 index 0000000..80deb9d --- /dev/null +++ b/include/licenses.h @@ -0,0 +1,53 @@ +// ftpd is a server implementation based on the following: +// - RFC 959 (https://tools.ietf.org/html/rfc959) +// - RFC 3659 (https://tools.ietf.org/html/rfc3659) +// - suggested implementation details from https://cr.yp.to/ftp/filesystem.html +// +// Copyright (C) 2020 Michael Theall +// +// This program 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. +// +// This program 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 this program. If not, see . + +#pragma once + +#include "platform.h" + +extern char const *const g_dearImGuiVersion; +extern char const *const g_dearImGuiCopyright; +extern char const *const g_mitLicense; + +#ifdef _3DS +extern char const *const g_libctruVersion; +extern char const *const g_citro3dVersion; +extern char const *const g_citro3dCopyright; +#endif + +#ifdef __SWITCH__ +extern char const *const g_libnxVersion; +extern char const *const g_deko3dVersion; +extern char const *const g_zstdVersion; +extern char const *const g_libnxCopyright; +extern char const *const g_deko3dCopyright; +extern char const *const g_zstdCopyright; +extern char const *const g_libnxLicense; +extern char const *const g_bsdLicense; +#endif + +#if !defined(NDS) +extern char const *const g_zlibLicense; +#endif + +#if !defined(NDS) && !defined(_3DS) && !defined(__SWITCH__) +extern char const *const g_glfwVersion; +extern char const *const g_glfwCopyright; +#endif diff --git a/source/ftpServer.cpp b/source/ftpServer.cpp index 307ff4c..e0418da 100644 --- a/source/ftpServer.cpp +++ b/source/ftpServer.cpp @@ -21,6 +21,7 @@ #include "ftpServer.h" #include "fs.h" +#include "licenses.h" #include "log.h" #include "platform.h" #include "socket.h" @@ -317,6 +318,7 @@ void FtpServer::showMenu () { #ifndef CLASSIC auto const prevShowSettings = m_showSettings; + auto const prevShowAbout = m_showAbout; if (ImGui::BeginMenuBar ()) { @@ -329,28 +331,48 @@ void FtpServer::showMenu () if (ImGui::MenuItem ("Settings")) m_showSettings = true; + if (ImGui::MenuItem ("About")) + m_showAbout = true; + ImGui::EndMenu (); } ImGui::EndMenuBar (); } - if (!prevShowSettings && m_showSettings) + if (m_showSettings) { - m_userSetting = m_config->user (); - m_userSetting.resize (32); + if (!prevShowSettings) + { + m_userSetting = m_config->user (); + m_userSetting.resize (32); - m_passSetting = m_config->pass (); - m_passSetting.resize (32); + m_passSetting = m_config->pass (); + m_passSetting.resize (32); - m_portSetting = m_config->port (); + m_portSetting = m_config->port (); #ifdef _3DS - m_getMTimeSetting = m_config->getMTime (); + m_getMTimeSetting = m_config->getMTime (); #endif - ImGui::OpenPopup ("Settings"); + ImGui::OpenPopup ("Settings"); + } + + showSettings (); } + if (m_showAbout) + { + if (!prevShowAbout) + ImGui::OpenPopup ("About"); + + showAbout (); + } +} + +void FtpServer::showSettings () +{ +#ifndef CLASSIC #ifdef _3DS auto const &io = ImGui::GetIO (); auto const width = io.DisplaySize.x; @@ -420,6 +442,103 @@ void FtpServer::showMenu () ImGui::EndPopup (); } #endif +#endif +} + +void FtpServer::showAbout () +{ +#ifndef CLASSIC + auto const &io = ImGui::GetIO (); + auto const width = io.DisplaySize.x; + auto const height = io.DisplaySize.y; + +#ifdef _3DS + ImGui::SetNextWindowSize (ImVec2 (width * 0.8f, height * 0.5f)); + ImGui::SetNextWindowPos (ImVec2 (width * 0.1f, height * 0.5f)); +#else + ImGui::SetNextWindowSize (ImVec2 (width * 0.8f, height * 0.8f)); + ImGui::SetNextWindowPos (ImVec2 (width * 0.1f, height * 0.1f)); +#endif + if (ImGui::BeginPopupModal ("About", + nullptr, + ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize)) + { + ImGui::TextUnformatted (STATUS_STRING); + ImGui::TextWrapped ("Copyright © 2014-2020 Michael Theall, Dave Murphy, TuxSH"); + ImGui::Separator (); + ImGui::Text ("Platform: %s", io.BackendPlatformName); + ImGui::Text ("Renderer: %s", io.BackendRendererName); + + if (ImGui::Button ("OK", ImVec2 (100, 0))) + { + m_showAbout = false; + ImGui::CloseCurrentPopup (); + } + + ImGui::Separator (); + if (ImGui::TreeNode (g_dearImGuiVersion)) + { + ImGui::TextWrapped (g_dearImGuiCopyright); + ImGui::Separator (); + ImGui::TextWrapped (g_mitLicense); + ImGui::TreePop (); + } + +#if defined(NDS) +#elif defined(_3DS) + if (ImGui::TreeNode (g_libctruVersion)) + { + ImGui::TextWrapped (g_zlibLicense); + ImGui::Separator (); + ImGui::TextWrapped (g_zlibLicense); + ImGui::TreePop (); + } + + if (ImGui::TreeNode (g_citro3dVersion)) + { + ImGui::TextWrapped (g_citro3dCopyright); + ImGui::Separator (); + ImGui::TextWrapped (g_zlibLicense); + ImGui::TreePop (); + } + +#elif defined(__SWITCH__) + if (ImGui::TreeNode (g_libnxVersion)) + { + ImGui::TextWrapped (g_libnxCopyright); + ImGui::Separator (); + ImGui::TextWrapped (g_libnxLicense); + ImGui::TreePop (); + } + + if (ImGui::TreeNode (g_deko3dVersion)) + { + ImGui::TextWrapped (g_deko3dCopyright); + ImGui::Separator (); + ImGui::TextWrapped (g_zlibLicense); + ImGui::TreePop (); + } + + if (ImGui::TreeNode (g_zstdVersion)) + { + ImGui::TextWrapped (g_zstdCopyright); + ImGui::Separator (); + ImGui::TextWrapped (g_bsdLicense); + ImGui::TreePop (); + } +#else + if (ImGui::TreeNode (g_glfwVersion)) + { + ImGui::TextWrapped (g_glfwCopyright); + ImGui::Separator (); + ImGui::TextWrapped (g_zlibLicense); + ImGui::TreePop (); + } +#endif + + ImGui::EndPopup (); + } +#endif } void FtpServer::loop () diff --git a/source/licenses.cpp b/source/licenses.cpp new file mode 100644 index 0000000..b639ca4 --- /dev/null +++ b/source/licenses.cpp @@ -0,0 +1,137 @@ +// ftpd is a server implementation based on the following: +// - RFC 959 (https://tools.ietf.org/html/rfc959) +// - RFC 3659 (https://tools.ietf.org/html/rfc3659) +// - suggested implementation details from https://cr.yp.to/ftp/filesystem.html +// +// Copyright (C) 2020 Michael Theall +// +// This program 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. +// +// This program 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 this program. If not, see . + +#include "licenses.h" + +#include "imgui.h" + +#ifdef __SWITCH__ +#include +#endif + +#if !defined(NDS) && !defined(_3DS) && !defined(__SWITCH__) +#include +#endif + +char const *const g_dearImGuiVersion = "Dear ImGui " IMGUI_VERSION; +char const *const g_dearImGuiCopyright = "Copyright (c) 2014-2020 Omar Cornut"; + +char const *const g_mitLicense = + "The MIT License (MIT)\n" + "\n" + "Permission is hereby granted, free of charge, to any person obtaining a copy of this software " + "and associated documentation files (the \"Software\"), to deal in the Software without " + "restriction, including without limitation the rights to use, copy, modify, merge, publish, " + "distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the " + "Software is furnished to do so, subject to the following conditions:\n" + "\n" + "The above copyright notice and this permission notice shall be included in all copies or " + "substantial portions of the Software.\n" + "\n" + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, " + "INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR " + "PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR " + "ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, " + "ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE " + "SOFTWARE."; + +#ifdef _3DS +char const *const g_libctruVersion = "libctru"; +char const *const g_citro3dVersion = "citro3d"; + +char const *const g_citro3dCopyright = "Copyright (C) 2014-2018 fincs"; +#endif + +#ifdef __SWITCH__ +char const *const g_libnxVersion = "libnx"; +char const *const g_deko3dVersion = "deko3d"; +char const *const g_zstdVersion = "zStandard " ZSTD_VERSION_STRING; + +char const *const g_libnxCopyright = "Copyright 2017-2018 libnx Authors"; +char const *const g_deko3dCopyright = "Copyright (C) 2018-2020 fincs\n"; +char const *const g_zstdCopyright = + "Copyright (c) 2016-present, Facebook, Inc. All rights reserved."; + +char const *const g_libnxLicense = + "Permission to use, copy, modify, and/or distribute this software for any purpose with or " + "without fee is hereby granted, provided that the above copyright notice and this permission " + "notice appear in all copies.\n" + "\n" + "THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO " + "THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT " + "SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY " + "DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF " + "CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE " + "OR PERFORMANCE OF THIS SOFTWARE."; + +char const *const g_bsdLicense = + "BSD License\n" + "\n" + "Redistribution and use in source and binary forms, with or without modification, are " + "permitted provided that the following conditions are met:\n" + "\n" + "* Redistributions of source code must retain the above copyright notice, this list of " + "conditions and the following disclaimer.\n" + "\n" + "* Redistributions in binary form must reproduce the above copyright notice, this list of " + "conditions and the following disclaimer in the documentation and/or other materials provided " + "with the distribution.\n" + "\n" + "* Neither the name Facebook nor the names of its contributors may be used to endorse or " + "promote products derived from this software without specific prior written permission.\n" + "\n" + "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS " + "OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF " + "MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE " + "COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, " + "EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE " + "GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED " + "AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING " + "NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED " + "OF THE POSSIBILITY OF SUCH DAMAGE."; +#endif + +#if !defined(NDS) +char const *const g_zlibLicense = + "This software is provided 'as-is', without any express or implied warranty. In no event will " + "the authors be held liable for any damages arising from the use of this software.\n" + "\n" + "Permission is granted to anyone to use this software for any purpose, including commercial " + "applications, and to alter it and redistribute it freely, subject to the following " + "restrictions:\n" + "\n" + "1. The origin of this software must not be misrepresented; you must not claim that you wrote " + "the original software. If you use this software in a product, an acknowledgment in the " + "product documentation would be appreciated but is not required.\n" + "2. Altered source versions must be plainly marked as such, and must not be misrepresented as " + "being the original software.\n" + "3. This notice may not be removed or altered from any source distribution."; +#endif + +#if !defined(NDS) && !defined(_3DS) && !defined(__SWITCH__) +#define STR(x) #x +#define XSTR(x) STR (x) +#define GLFW_VERSION_STRING \ + XSTR (GLFW_VERSION_MAJOR) "." XSTR (GLFW_VERSION_MINOR) "." XSTR (GLFW_VERSION_REVISION) + +char const *const g_glfwVersion = "glfw " GLFW_VERSION_STRING; +char const *const g_glfwCopyright = "Copyright (c) 2002-2006 Marcus Geelnard\n" + "Copyright (c) 2006-2019 Camilla Löwy"; +#endif