├── .clang-format ├── .gitignore ├── .gitmodules ├── LICENSE ├── Makefile ├── README.md ├── images ├── Mario.jpg └── Zelda.jpg └── source ├── gui_error.cpp ├── gui_error.hpp ├── gui_main.cpp ├── gui_main.hpp ├── image_item.hpp ├── main.cpp ├── upload.cpp └── upload.hpp /.clang-format: -------------------------------------------------------------------------------- 1 | --- 2 | AccessModifierOffset: -2 3 | BasedOnStyle: LLVM 4 | BreakBeforeBraces: Attach 5 | NamespaceIndentation: All 6 | FixNamespaceComments: false 7 | IndentWidth: 4 8 | TabWidth: 4 9 | AllowShortIfStatementsOnASingleLine: false 10 | IncludeBlocks: Regroup 11 | IncludeCategories: 12 | - Regex: '^' 13 | Priority: 2 14 | - Regex: '^<.*\.h>' 15 | Priority: 1 16 | - Regex: '^<.*' 17 | Priority: 2 18 | - Regex: '.*' 19 | Priority: 3 20 | ColumnLimit: 0 21 | IndentCaseLabels: 'true' 22 | PointerAlignment: Right 23 | SortIncludes: 'true' 24 | Standard: Cpp11 25 | UseTab: Never 26 | 27 | ... 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | build/ 2 | *.ovl 3 | *.elf 4 | *.nacp 5 | *.nro 6 | .vscode 7 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "libs/libtesla"] 2 | path = libs/libtesla 3 | url = https://github.com/WerWolv/libtesla.git 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | 294 | Copyright (C) 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | , 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | #--------------------------------------------------------------------------------- 2 | .SUFFIXES: 3 | #--------------------------------------------------------------------------------- 4 | 5 | ifeq ($(strip $(DEVKITPRO)),) 6 | $(error "Please set DEVKITPRO in your environment. export DEVKITPRO=/devkitpro") 7 | endif 8 | 9 | TOPDIR ?= $(CURDIR) 10 | include $(DEVKITPRO)/libnx/switch_rules 11 | 12 | #--------------------------------------------------------------------------------- 13 | # TARGET is the name of the output 14 | # BUILD is the directory where object files & intermediate files will be placed 15 | # SOURCES is a list of directories containing source code 16 | # DATA is a list of directories containing data files 17 | # INCLUDES is a list of directories containing header files 18 | # ROMFS is the directory containing data to be added to RomFS, relative to the Makefile (Optional) 19 | # 20 | # NO_ICON: if set to anything, do not use icon. 21 | # NO_NACP: if set to anything, no .nacp file is generated. 22 | # APP_TITLE is the name of the app stored in the .nacp file (Optional) 23 | # APP_AUTHOR is the author of the app stored in the .nacp file (Optional) 24 | # APP_VERSION is the version of the app stored in the .nacp file (Optional) 25 | # APP_TITLEID is the titleID of the app stored in the .nacp file (Optional) 26 | # ICON is the filename of the icon (.jpg), relative to the project folder. 27 | # If not set, it attempts to use one of the following (in this order): 28 | # - .jpg 29 | # - icon.jpg 30 | # - /default_icon.jpg 31 | # 32 | # CONFIG_JSON is the filename of the NPDM config file (.json), relative to the project folder. 33 | # If not set, it attempts to use one of the following (in this order): 34 | # - .json 35 | # - config.json 36 | # If a JSON file is provided or autodetected, an ExeFS PFS0 (.nsp) is built instead 37 | # of a homebrew executable (.nro). This is intended to be used for sysmodules. 38 | # NACP building is skipped as well. 39 | #--------------------------------------------------------------------------------- 40 | APP_TITLE := ShareNX  41 | APP_VERSION := 1.1.4 42 | 43 | TARGET := ovlShareNX 44 | BUILD := build 45 | SOURCES := source 46 | DATA := data 47 | INCLUDES := libs/libtesla/include 48 | 49 | ifeq ($(RELEASE),) 50 | APP_VERSION := $(APP_VERSION)-$(shell git describe --dirty --always) 51 | endif 52 | 53 | NO_ICON := 1 54 | 55 | #--------------------------------------------------------------------------------- 56 | # options for code generation 57 | #--------------------------------------------------------------------------------- 58 | ARCH := -march=armv8-a+crc+crypto -mtune=cortex-a57 -mtp=soft -fPIE 59 | 60 | CFLAGS := -g -Wall -O3 -ffunction-sections \ 61 | $(ARCH) $(DEFINES) 62 | 63 | CFLAGS += $(INCLUDE) -D__SWITCH__ -DVERSION=\"v$(APP_VERSION)\" 64 | 65 | CXXFLAGS := $(CFLAGS) -fno-exceptions -std=c++20 66 | 67 | ASFLAGS := -g $(ARCH) 68 | LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) 69 | 70 | LIBS := -lcurl -lz -lnx 71 | 72 | #--------------------------------------------------------------------------------- 73 | # list of directories containing libraries, this must be the top level containing 74 | # include and lib 75 | #--------------------------------------------------------------------------------- 76 | LIBDIRS := $(PORTLIBS) $(LIBNX) 77 | 78 | 79 | #--------------------------------------------------------------------------------- 80 | # no real need to edit anything past this point unless you need to add additional 81 | # rules for different file extensions 82 | #--------------------------------------------------------------------------------- 83 | ifneq ($(BUILD),$(notdir $(CURDIR))) 84 | #--------------------------------------------------------------------------------- 85 | 86 | export OUTPUT := $(CURDIR)/$(TARGET) 87 | export TOPDIR := $(CURDIR) 88 | 89 | export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ 90 | $(foreach dir,$(DATA),$(CURDIR)/$(dir)) 91 | 92 | export DEPSDIR := $(CURDIR)/$(BUILD) 93 | 94 | CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) 95 | CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) 96 | SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) 97 | BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) 98 | 99 | #--------------------------------------------------------------------------------- 100 | # use CXX for linking C++ projects, CC for standard C 101 | #--------------------------------------------------------------------------------- 102 | ifeq ($(strip $(CPPFILES)),) 103 | #--------------------------------------------------------------------------------- 104 | export LD := $(CC) 105 | #--------------------------------------------------------------------------------- 106 | else 107 | #--------------------------------------------------------------------------------- 108 | export LD := $(CXX) 109 | #--------------------------------------------------------------------------------- 110 | endif 111 | #--------------------------------------------------------------------------------- 112 | 113 | export OFILES_BIN := $(addsuffix .o,$(BINFILES)) 114 | export OFILES_SRC := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) 115 | export OFILES := $(OFILES_BIN) $(OFILES_SRC) 116 | export HFILES_BIN := $(addsuffix .h,$(subst .,_,$(BINFILES))) 117 | 118 | export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ 119 | $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ 120 | -I$(CURDIR)/$(BUILD) 121 | 122 | export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) 123 | 124 | ifeq ($(strip $(CONFIG_JSON)),) 125 | jsons := $(wildcard *.json) 126 | ifneq (,$(findstring $(TARGET).json,$(jsons))) 127 | export APP_JSON := $(TOPDIR)/$(TARGET).json 128 | else 129 | ifneq (,$(findstring config.json,$(jsons))) 130 | export APP_JSON := $(TOPDIR)/config.json 131 | endif 132 | endif 133 | else 134 | export APP_JSON := $(TOPDIR)/$(CONFIG_JSON) 135 | endif 136 | 137 | ifeq ($(strip $(ICON)),) 138 | icons := $(wildcard *.jpg) 139 | ifneq (,$(findstring $(TARGET).jpg,$(icons))) 140 | export APP_ICON := $(TOPDIR)/$(TARGET).jpg 141 | else 142 | ifneq (,$(findstring icon.jpg,$(icons))) 143 | export APP_ICON := $(TOPDIR)/icon.jpg 144 | endif 145 | endif 146 | else 147 | export APP_ICON := $(TOPDIR)/$(ICON) 148 | endif 149 | 150 | ifeq ($(strip $(NO_ICON)),) 151 | export NROFLAGS += --icon=$(APP_ICON) 152 | endif 153 | 154 | ifeq ($(strip $(NO_NACP)),) 155 | export NROFLAGS += --nacp=$(CURDIR)/$(TARGET).nacp 156 | endif 157 | 158 | ifneq ($(APP_TITLEID),) 159 | export NACPFLAGS += --titleid=$(APP_TITLEID) 160 | endif 161 | 162 | ifneq ($(ROMFS),) 163 | export NROFLAGS += --romfsdir=$(CURDIR)/$(ROMFS) 164 | endif 165 | 166 | .PHONY: $(BUILD) clean all 167 | 168 | #--------------------------------------------------------------------------------- 169 | all: $(BUILD) 170 | 171 | 172 | $(BUILD): 173 | @[ -d $@ ] || mkdir -p $@ 174 | @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile 175 | 176 | #--------------------------------------------------------------------------------- 177 | clean: 178 | @rm -fr $(BUILD) $(TARGET).ovl $(TARGET).nro $(TARGET).nacp $(TARGET).elf 179 | 180 | 181 | #--------------------------------------------------------------------------------- 182 | else 183 | .PHONY: all 184 | 185 | DEPENDS := $(OFILES:.o=.d) 186 | 187 | #--------------------------------------------------------------------------------- 188 | # main targets 189 | #--------------------------------------------------------------------------------- 190 | all : $(OUTPUT).ovl 191 | 192 | $(OUTPUT).ovl : $(OUTPUT).elf $(OUTPUT).nacp 193 | @elf2nro $< $@ $(NROFLAGS) 194 | @echo "built ... $(notdir $(OUTPUT).ovl)" 195 | 196 | $(OUTPUT).elf : $(OFILES) 197 | 198 | $(OFILES_SRC) : $(HFILES_BIN) 199 | 200 | #--------------------------------------------------------------------------------- 201 | # you need a rule like this for each extension you use as binary data 202 | #--------------------------------------------------------------------------------- 203 | %.bin.o %_bin.h : %.bin 204 | #--------------------------------------------------------------------------------- 205 | @echo $(notdir $<) 206 | @$(bin2o) 207 | 208 | -include $(DEPENDS) 209 | 210 | #--------------------------------------------------------------------------------------- 211 | endif 212 | #--------------------------------------------------------------------------------------- 213 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ShareNX Overlay 2 | ShareNX as an overlay for the Nintendo Switch.

3 | Share your last screenshot while ingame. 4 | 5 | ![Zelda](/images/Zelda.jpg) 6 | ![Mario](/images/Mario.jpg) 7 | 8 | ## How-to 9 | This Homebrew runs under [nx-ovlloader](https://github.com/WerWolv/nx-ovlloader/releases).
10 | Put the .ovl from the release inside /switch/.overlays and start it from "Tesla Menu".
11 | 12 | ## Credits 13 | [WerWolv](https://github.com/WerWolv) for nx-ovlloader, libtesla and the template
14 | [averne](https://github.com/averne) for his work on libtesla
15 | [natinusala](https://github.com/natinusala) for his work on libtesla
-------------------------------------------------------------------------------- /images/Mario.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HookedBehemoth/ShareNX-Overlay/dd6f0593b069abb30e2c5617a04c5ce4f9c6a031/images/Mario.jpg -------------------------------------------------------------------------------- /images/Zelda.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HookedBehemoth/ShareNX-Overlay/dd6f0593b069abb30e2c5617a04c5ce4f9c6a031/images/Zelda.jpg -------------------------------------------------------------------------------- /source/gui_error.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2020 Behemoth 3 | * 4 | * This file is part of ShareNX. 5 | * 6 | * This program is free software; you can redistribute it and/or modify it 7 | * under the terms and conditions of the GNU General Public License, 8 | * version 2, as published by the Free Software Foundation. 9 | * 10 | * This program is distributed in the hope it will be useful, but WITHOUT 11 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13 | * more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see . 17 | */ 18 | #include "gui_error.hpp" 19 | 20 | static char result_buffer[10]; 21 | 22 | ErrorGui::ErrorGui(const char *msg) 23 | : m_msg(msg), m_result() {} 24 | 25 | ErrorGui::ErrorGui(Result rc) { 26 | this->m_result = nullptr; 27 | if (R_MODULE(rc) == 206) { 28 | if ( R_DESCRIPTION(rc) == 23) { 29 | this->m_msg = "File not found."; 30 | this->m_result = "Was it deleted?"; 31 | } else { 32 | this->m_msg = "Unknown Album error."; 33 | } 34 | } else { 35 | this->m_msg = "Unknown error occured."; 36 | } 37 | if (this->m_result == nullptr) { 38 | std::snprintf(result_buffer, 10, "2%03d-%04d", R_MODULE(rc), R_DESCRIPTION(rc)); 39 | this->m_result = result_buffer; 40 | } 41 | } 42 | 43 | tsl::elm::Element *ErrorGui::createUI() { 44 | auto rootFrame = new tsl::elm::OverlayFrame("ShareNX \uE134", VERSION); 45 | 46 | auto *custom = new tsl::elm::CustomDrawer([&](tsl::gfx::Renderer *drawer, u16 x, u16 y, u16 w, u16 h) { 47 | static s32 msg_width = 0; 48 | static s32 result_width = 0; 49 | if (msg_width == 0) { 50 | auto [width, height] = drawer->drawString(this->m_msg, false, 0, 0, 25, tsl::style::color::ColorTransparent); 51 | msg_width = width; 52 | 53 | if (this->m_result) { 54 | auto [width, height] = drawer->drawString(this->m_msg, false, 0, 0, 25, tsl::style::color::ColorTransparent); 55 | result_width = width; 56 | } 57 | } 58 | drawer->drawString("\uE150", false, x + ((w - 90) / 2), 300, 90, 0xffff); 59 | drawer->drawString(this->m_msg, false, x + ((w - msg_width) / 2), 380, 25, 0xffff); 60 | if (this->m_result) { 61 | drawer->drawString(this->m_result, false, x + ((w - result_width) / 2), 430, 25, 0xffff); 62 | } 63 | }); 64 | 65 | rootFrame->setContent(custom); 66 | 67 | return rootFrame; 68 | } 69 | -------------------------------------------------------------------------------- /source/gui_error.hpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2020 Behemoth 3 | * 4 | * This file is part of ShareNX. 5 | * 6 | * This program is free software; you can redistribute it and/or modify it 7 | * under the terms and conditions of the GNU General Public License, 8 | * version 2, as published by the Free Software Foundation. 9 | * 10 | * This program is distributed in the hope it will be useful, but WITHOUT 11 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13 | * more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see . 17 | */ 18 | #pragma once 19 | 20 | #include 21 | 22 | class ErrorGui : public tsl::Gui { 23 | private: 24 | const char *m_msg; 25 | const char *m_result; 26 | 27 | public: 28 | ErrorGui(const char *msg); 29 | ErrorGui(Result rc); 30 | 31 | virtual tsl::elm::Element *createUI() override; 32 | }; 33 | -------------------------------------------------------------------------------- /source/gui_main.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2020 Behemoth 3 | * 4 | * This file is part of ShareNX. 5 | * 6 | * This program is free software; you can redistribute it and/or modify it 7 | * under the terms and conditions of the GNU General Public License, 8 | * version 2, as published by the Free Software Foundation. 9 | * 10 | * This program is distributed in the hope it will be useful, but WITHOUT 11 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13 | * more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see . 17 | */ 18 | #include "gui_main.hpp" 19 | 20 | #include 21 | 22 | #include "gui_error.hpp" 23 | #include "upload.hpp" 24 | 25 | MainGui::MainGui(const CapsAlbumFileId &file_id, const u8 *rgba_buffer) 26 | : fileId(file_id) { 27 | img = new ImageItem(file_id, rgba_buffer); 28 | } 29 | 30 | MainGui::~MainGui() {} 31 | 32 | tsl::elm::Element *MainGui::createUI() { 33 | auto rootFrame = new tsl::elm::OverlayFrame("ShareNX \uE134", VERSION); 34 | 35 | auto *list = new tsl::elm::List(); 36 | 37 | list->addItem(this->img); 38 | 39 | auto *button = new tsl::elm::ListItem("Upload"); 40 | button->setClickListener([&](u64 keys) { 41 | if (keys & HidNpadButton_A && !this->uploaded) { 42 | std::string url = web::UploadImage(this->fileId); 43 | this->uploaded = true; 44 | this->img->setUrl(url); 45 | return true; 46 | } 47 | return false; 48 | }); 49 | list->addItem(button); 50 | 51 | rootFrame->setContent(list); 52 | 53 | return rootFrame; 54 | } 55 | -------------------------------------------------------------------------------- /source/gui_main.hpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2020 Behemoth 3 | * 4 | * This file is part of ShareNX. 5 | * 6 | * This program is free software; you can redistribute it and/or modify it 7 | * under the terms and conditions of the GNU General Public License, 8 | * version 2, as published by the Free Software Foundation. 9 | * 10 | * This program is distributed in the hope it will be useful, but WITHOUT 11 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13 | * more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see . 17 | */ 18 | #pragma once 19 | #include 20 | 21 | #include "image_item.hpp" 22 | 23 | class MainGui : public tsl::Gui { 24 | private: 25 | ImageItem *img; 26 | bool uploaded = false; 27 | CapsAlbumFileId fileId; 28 | 29 | public: 30 | MainGui(const CapsAlbumFileId &fileId, const u8 *rgba_buffer); 31 | ~MainGui(); 32 | 33 | virtual tsl::elm::Element *createUI() override; 34 | 35 | virtual void update() override {} 36 | }; 37 | -------------------------------------------------------------------------------- /source/image_item.hpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2020 Behemoth 3 | * 4 | * This file is part of ShareNX. 5 | * 6 | * This program is free software; you can redistribute it and/or modify it 7 | * under the terms and conditions of the GNU General Public License, 8 | * version 2, as published by the Free Software Foundation. 9 | * 10 | * This program is distributed in the hope it will be useful, but WITHOUT 11 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13 | * more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see . 17 | */ 18 | #pragma once 19 | 20 | #include 21 | 22 | constexpr size_t THUMB_WIDTH = 320, THUMB_HEIGHT = 180; 23 | constexpr size_t THUMB_SIZE = THUMB_WIDTH * THUMB_HEIGHT * 4; 24 | constexpr size_t WORK_SIZE = 0x10000; 25 | 26 | class ImageItem : public tsl::elm::ListItem { 27 | private: 28 | CapsAlbumFileId fileId; 29 | const u8 *buffer; 30 | s32 img_x, img_y; 31 | char appId[0x11]; 32 | char date[0x20]; 33 | std::string url; 34 | 35 | public: 36 | ImageItem(const CapsAlbumFileId &file_id, const u8 *image) 37 | : ListItem(""), fileId(file_id), buffer(image), img_x(), img_y(), url() { 38 | 39 | std::snprintf(this->appId, 0x11, "%016lX", this->fileId.application_id); 40 | 41 | std::snprintf(this->date, 0x20, "%4d:%02d:%02d %02d:%02d:%02d", 42 | this->fileId.datetime.year, 43 | this->fileId.datetime.month, 44 | this->fileId.datetime.day, 45 | this->fileId.datetime.hour, 46 | this->fileId.datetime.minute, 47 | this->fileId.datetime.second); 48 | } 49 | 50 | virtual void draw(tsl::gfx::Renderer *renderer) override { 51 | u32 img_x = this->getX() + ((this->getWidth() - THUMB_WIDTH) / 2); 52 | renderer->drawRect(img_x, this->getY(), THUMB_WIDTH, THUMB_HEIGHT, 0xf000); 53 | renderer->drawBitmap(img_x, this->getY(), THUMB_WIDTH, THUMB_HEIGHT, this->buffer); 54 | 55 | renderer->drawString(this->appId, false, this->getX() + 15, this->getY() + THUMB_HEIGHT + 25, 20, tsl::style::color::ColorText); 56 | renderer->drawString(this->date, false, this->getX() + 15, this->getY() + THUMB_HEIGHT + 55, 20, tsl::style::color::ColorText); 57 | 58 | if (!url.empty()) 59 | renderer->drawString(this->url.c_str(), false, this->getX() + 15, this->getY() + THUMB_HEIGHT + 85, 20, tsl::style::color::ColorText); 60 | } 61 | 62 | virtual void layout(u16 parentX, u16 parentY, u16 parentWidth, u16 parentHeight) override { 63 | this->setBoundaries(this->getX(), this->getY(), this->getWidth(), THUMB_HEIGHT + 100); 64 | } 65 | 66 | virtual tsl::elm::Element *requestFocus(tsl::elm::Element *, tsl::FocusDirection) { 67 | return nullptr; 68 | } 69 | 70 | public: 71 | void setUrl(const std::string &url) { 72 | this->url = url; 73 | } 74 | }; 75 | -------------------------------------------------------------------------------- /source/main.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2020 Behemoth 3 | * 4 | * This file is part of ShareNX. 5 | * 6 | * This program is free software; you can redistribute it and/or modify it 7 | * under the terms and conditions of the GNU General Public License, 8 | * version 2, as published by the Free Software Foundation. 9 | * 10 | * This program is distributed in the hope it will be useful, but WITHOUT 11 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13 | * more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see . 17 | */ 18 | #define TESLA_INIT_IMPL 19 | #include "gui_error.hpp" 20 | #include "gui_main.hpp" 21 | #include "image_item.hpp" 22 | 23 | #define R_INIT(cmd, message) \ 24 | rc = cmd; \ 25 | if (R_FAILED(rc)) { \ 26 | msg = message; \ 27 | return; \ 28 | } 29 | 30 | constexpr const SocketInitConfig sockConf = { 31 | .bsdsockets_version = 1, 32 | 33 | .tcp_tx_buf_size = 0x800, 34 | .tcp_rx_buf_size = 0x800, 35 | .tcp_tx_buf_max_size = 0x25000, 36 | .tcp_rx_buf_max_size = 0x25000, 37 | 38 | .udp_tx_buf_size = 0, 39 | .udp_rx_buf_size = 0, 40 | 41 | .sb_efficiency = 1, 42 | 43 | .num_bsd_sessions = 0, 44 | .bsd_service_type = BsdServiceType_Auto, 45 | }; 46 | 47 | static u8 img[THUMB_SIZE]; 48 | 49 | class ShareOverlay : public tsl::Overlay { 50 | private: 51 | Result rc = 0; 52 | const char *msg = nullptr; 53 | CapsAlbumFileId fileId; 54 | 55 | public: 56 | virtual void initServices() override { 57 | R_INIT(socketInitialize(&sockConf), "Failed to init socket!") 58 | R_INIT(capsaInitialize(), "Failed to init capture service!"); 59 | 60 | u64 size; 61 | rc = capsaGetLastOverlayScreenShotThumbnail(&this->fileId, &size, img, THUMB_SIZE); 62 | if (R_FAILED(rc) || size == 0 || this->fileId.application_id == 0) { 63 | msg = "No screenshot taken!"; 64 | return; 65 | } 66 | 67 | u8 *work = new (std::nothrow) u8[WORK_SIZE]; 68 | if (work == nullptr) { 69 | msg = "Out of memory!"; 70 | return; 71 | } 72 | tsl::hlp::ScopeGuard work_guard([work] { delete[] work; }); 73 | 74 | u64 w, h; 75 | rc = capsaLoadAlbumScreenShotThumbnailImage(&w, &h, &this->fileId, img, THUMB_SIZE, work, WORK_SIZE); 76 | if (R_FAILED(rc) || w != THUMB_WIDTH || h != THUMB_HEIGHT) { 77 | msg = "CapSrv error!"; 78 | return; 79 | } 80 | } 81 | virtual void exitServices() override { 82 | capsaExit(); 83 | socketExit(); 84 | } 85 | 86 | virtual void onShow() override {} 87 | virtual void onHide() override {} 88 | 89 | virtual std::unique_ptr loadInitialGui() override { 90 | if (R_FAILED(rc)) { 91 | return std::make_unique(rc); 92 | } else if (msg != nullptr) { 93 | return std::make_unique(msg); 94 | } else { 95 | return std::make_unique(this->fileId, img); 96 | } 97 | } 98 | }; 99 | 100 | int main(int argc, char **argv) { 101 | return tsl::loop(argc, argv); 102 | } 103 | -------------------------------------------------------------------------------- /source/upload.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2020 Behemoth 3 | * 4 | * This file is part of ShareNX. 5 | * 6 | * This program is free software; you can redistribute it and/or modify it 7 | * under the terms and conditions of the GNU General Public License, 8 | * version 2, as published by the Free Software Foundation. 9 | * 10 | * This program is distributed in the hope it will be useful, but WITHOUT 11 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13 | * more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see . 17 | */ 18 | #include "upload.hpp" 19 | 20 | #include 21 | #include 22 | 23 | #include 24 | 25 | namespace web { 26 | 27 | size_t StringWrite(const char *contents, size_t size, size_t nmemb, std::string *userp) { 28 | userp->append(contents, size * nmemb); 29 | return size * nmemb; 30 | } 31 | 32 | std::string UploadImage(const CapsAlbumFileId &fileId) { 33 | u64 size = 0; 34 | Result rc = capsaGetAlbumFileSize(&fileId, &size); 35 | if (R_FAILED(rc)) 36 | return "Can't get Filesize"; 37 | 38 | char *imgBuffer = new (std::nothrow) char[size]; 39 | if (imgBuffer == nullptr) 40 | return "Memory allocation failed"; 41 | 42 | tsl::hlp::ScopeGuard buffer_guard([imgBuffer] { delete[] imgBuffer; }); 43 | 44 | u64 actualSize = 0; 45 | rc = capsaLoadAlbumFile(&fileId, &actualSize, imgBuffer, size); 46 | if (R_FAILED(rc)) { 47 | return "Failed to load Image"; 48 | } 49 | 50 | CURL *curl = curl_easy_init(); 51 | if (curl == nullptr) 52 | return "Failed to init curl"; 53 | 54 | curl_mime *mime = curl_mime_init(curl); 55 | curl_mimepart *file_part = curl_mime_addpart(mime); 56 | 57 | curl_mime_filename(file_part, "switch.jpg"); 58 | curl_mime_name(file_part, "fileToUpload"); 59 | curl_mime_data(file_part, imgBuffer, actualSize); 60 | 61 | curl_mimepart *part = curl_mime_addpart(mime); 62 | curl_mime_name(part, "curl"); 63 | curl_mime_data(part, "1", CURL_ZERO_TERMINATED); 64 | 65 | std::string urlresponse = std::string(); 66 | 67 | curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, StringWrite); 68 | curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&urlresponse); 69 | curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST"); 70 | curl_easy_setopt(curl, CURLOPT_MIMEPOST, mime); 71 | curl_easy_setopt(curl, CURLOPT_URL, "https://lewd.pics/p/index.php"); 72 | curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); 73 | 74 | CURLcode res = CURLE_OK; 75 | tsl::hlp::doWithSmSession([&] { 76 | res = curl_easy_perform(curl); 77 | }); 78 | 79 | long http_code = 0; 80 | curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); 81 | 82 | if (res != CURLE_OK) { 83 | urlresponse = "Curl failed " + std::to_string(res); 84 | } else if (http_code != 200) { 85 | urlresponse = "Failed with " + std::to_string(http_code); 86 | } else if (urlresponse.size() > 0x30) { 87 | urlresponse = "Result too long"; 88 | } 89 | 90 | curl_mime_free(mime); 91 | curl_easy_cleanup(curl); 92 | 93 | return urlresponse; 94 | } 95 | 96 | } 97 | -------------------------------------------------------------------------------- /source/upload.hpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2020 Behemoth 3 | * 4 | * This file is part of ShareNX. 5 | * 6 | * This program is free software; you can redistribute it and/or modify it 7 | * under the terms and conditions of the GNU General Public License, 8 | * version 2, as published by the Free Software Foundation. 9 | * 10 | * This program is distributed in the hope it will be useful, but WITHOUT 11 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13 | * more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see . 17 | */ 18 | #pragma once 19 | 20 | #include 21 | 22 | #include 23 | 24 | namespace web { 25 | 26 | std::string UploadImage(const CapsAlbumFileId &fileId); 27 | 28 | } 29 | --------------------------------------------------------------------------------