├── .clang-format ├── .github └── workflows │ └── build.yml ├── .gitignore ├── CHANGELOG.md ├── COPYING.md ├── README.md ├── art ├── about_banner.svg ├── back.svg ├── banner_install.svg ├── banner_uninstall.svg ├── blot.svg ├── error.svg ├── forward.svg ├── icon.svg ├── icon_install.svg ├── icon_uninstall.svg ├── info.svg ├── install_header.svg ├── refresh.svg ├── remove_history.svg ├── send_directory.svg ├── send_file.svg ├── spinner.png ├── spinner.sifz ├── spinner.svg ├── spinner20.png ├── spinner24.png ├── spinner256.png ├── spinner32.png ├── spinner40.png ├── transfer_badge_down.svg ├── transfer_badge_up.svg ├── transfer_dir_dir.svg ├── transfer_dir_file.svg ├── transfer_dir_x.svg ├── transfer_failed.svg ├── transfer_file_file.svg ├── transfer_file_x.svg ├── transfer_status_cancelled.svg ├── transfer_status_error.svg ├── transfer_status_success.svg ├── transfer_succeeded.svg ├── tray_icon.svg ├── uninstall_header.svg ├── unk_profile.svg └── warning.svg ├── build ├── extract_strings_for_translation.bat └── post_compile.bat ├── nsis ├── .gitignore ├── gpl-3.0.rtf ├── icons │ ├── install.ico │ ├── install128.png │ ├── install16.png │ ├── install24.png │ ├── install256.png │ ├── install32.png │ ├── install48.png │ ├── install64.png │ ├── uninstall.ico │ ├── uninstall128.png │ ├── uninstall16.png │ ├── uninstall24.png │ ├── uninstall256.png │ ├── uninstall32.png │ ├── uninstall48.png │ └── uninstall64.png ├── inst-banner.bmp ├── inst-banner.png ├── inst-welcome.bmp ├── inst-welcome.png ├── plugins │ └── inetc │ │ ├── Contrib │ │ └── Inetc │ │ │ ├── afxres.h │ │ │ ├── api.h │ │ │ ├── crt.cpp │ │ │ ├── inetc.cpp │ │ │ ├── inetc.rc │ │ │ ├── inetc.sln │ │ │ ├── inetc.vcxproj │ │ │ ├── inetc.vcxproj.filters │ │ │ ├── nsis_tchar.h │ │ │ ├── pluginapi.c │ │ │ ├── pluginapi.h │ │ │ └── resource.h │ │ ├── Docs │ │ └── Inetc │ │ │ ├── Readme.htm │ │ │ └── wiki.txt │ │ ├── Examples │ │ └── Inetc │ │ │ ├── Example.nsi │ │ │ ├── auth_dlg.nsi │ │ │ ├── ftp_auth.nsi │ │ │ ├── head.nsi │ │ │ ├── headers.nsi │ │ │ ├── headers.php │ │ │ ├── https.nsi │ │ │ ├── inetc_local.nsi │ │ │ ├── post.nsi │ │ │ ├── post.php │ │ │ ├── post_file.nsi │ │ │ ├── post_file.php │ │ │ ├── post_form.html │ │ │ ├── put.nsi │ │ │ ├── put.php │ │ │ ├── recursive.nsi │ │ │ ├── redirect.nsi │ │ │ ├── redirect.php │ │ │ ├── timeout.nsi │ │ │ ├── tostack.nsi │ │ │ └── translate.nsi │ │ ├── Plugins │ │ ├── amd64-unicode │ │ │ └── INetC.dll │ │ ├── x86-ansi │ │ │ └── INetC.dll │ │ └── x86-unicode │ │ │ └── INetC.dll │ │ └── build_msvc.cmd ├── uninst-banner.bmp ├── uninst-banner.png ├── uninst-welcome.bmp ├── uninst-welcome.png ├── winpinator.nsh ├── x64.nsi └── x86.nsi ├── po ├── .gitignore ├── en_US.po ├── pl_PL.po └── winpinator.pot ├── proto ├── generate-protobuf.bat └── warp.proto ├── readme ├── screen1.png ├── screen2.png ├── screen3.png └── screen4.png ├── res ├── about_banner.png ├── back.png ├── blot.png ├── error.png ├── forward.png ├── icon.ico ├── icon128.png ├── icon16.png ├── icon256.png ├── icon32.png ├── icon48.png ├── icon64.png ├── info.png ├── refresh.png ├── remove_history.png ├── send_directory.png ├── send_file.png ├── spinner16.png ├── spinner48.png ├── to_copy │ ├── LICENSE.html │ ├── LICENSE.rtf │ ├── Languages.xml │ ├── RELEASE NOTES.txt │ ├── flags │ │ ├── ac.png │ │ ├── ad.png │ │ ├── ae.png │ │ ├── af.png │ │ ├── ag.png │ │ ├── ai.png │ │ ├── al.png │ │ ├── am.png │ │ ├── ao.png │ │ ├── aq.png │ │ ├── ar.png │ │ ├── as.png │ │ ├── at.png │ │ ├── au.png │ │ ├── aw.png │ │ ├── ax.png │ │ ├── az.png │ │ ├── ba.png │ │ ├── bb.png │ │ ├── bd.png │ │ ├── be.png │ │ ├── bf.png │ │ ├── bg.png │ │ ├── bh.png │ │ ├── bi.png │ │ ├── bj.png │ │ ├── bl.png │ │ ├── bm.png │ │ ├── bn.png │ │ ├── bo.png │ │ ├── bq.png │ │ ├── br.png │ │ ├── bs.png │ │ ├── bt.png │ │ ├── bv.png │ │ ├── bw.png │ │ ├── by.png │ │ ├── bz.png │ │ ├── ca.png │ │ ├── cc.png │ │ ├── cd.png │ │ ├── cf.png │ │ ├── cg.png │ │ ├── ch.png │ │ ├── ci.png │ │ ├── ck.png │ │ ├── cl.png │ │ ├── cm.png │ │ ├── cn.png │ │ ├── co.png │ │ ├── cp.png │ │ ├── cr.png │ │ ├── cu.png │ │ ├── cv.png │ │ ├── cw.png │ │ ├── cx.png │ │ ├── cy.png │ │ ├── cz.png │ │ ├── de.png │ │ ├── dg.png │ │ ├── dj.png │ │ ├── dk.png │ │ ├── dm.png │ │ ├── do.png │ │ ├── dz.png │ │ ├── ea.png │ │ ├── ec.png │ │ ├── ee.png │ │ ├── eg.png │ │ ├── eh.png │ │ ├── er.png │ │ ├── es-ct.png │ │ ├── es-ga.png │ │ ├── es.png │ │ ├── et.png │ │ ├── eu.png │ │ ├── fi.png │ │ ├── fj.png │ │ ├── fk.png │ │ ├── fm.png │ │ ├── fo.png │ │ ├── fr.png │ │ ├── ga.png │ │ ├── gb-eng.png │ │ ├── gb-nir.png │ │ ├── gb-sct.png │ │ ├── gb-wls.png │ │ ├── gb.png │ │ ├── gd.png │ │ ├── ge.png │ │ ├── gf.png │ │ ├── gg.png │ │ ├── gh.png │ │ ├── gi.png │ │ ├── gl.png │ │ ├── gm.png │ │ ├── gn.png │ │ ├── gp.png │ │ ├── gq.png │ │ ├── gr.png │ │ ├── gs.png │ │ ├── gt.png │ │ ├── gu.png │ │ ├── gw.png │ │ ├── gy.png │ │ ├── hk.png │ │ ├── hm.png │ │ ├── hn.png │ │ ├── hr.png │ │ ├── ht.png │ │ ├── hu.png │ │ ├── ic.png │ │ ├── id.png │ │ ├── ie.png │ │ ├── il.png │ │ ├── im.png │ │ ├── in.png │ │ ├── io.png │ │ ├── iq.png │ │ ├── ir.png │ │ ├── is.png │ │ ├── it.png │ │ ├── je.png │ │ ├── jm.png │ │ ├── jo.png │ │ ├── jp.png │ │ ├── ke.png │ │ ├── kg.png │ │ ├── kh.png │ │ ├── ki.png │ │ ├── km.png │ │ ├── kn.png │ │ ├── kp.png │ │ ├── kr.png │ │ ├── kw.png │ │ ├── ky.png │ │ ├── kz.png │ │ ├── la.png │ │ ├── lb.png │ │ ├── lc.png │ │ ├── li.png │ │ ├── lk.png │ │ ├── lr.png │ │ ├── ls.png │ │ ├── lt.png │ │ ├── lu.png │ │ ├── lv.png │ │ ├── ly.png │ │ ├── ma.png │ │ ├── mc.png │ │ ├── md.png │ │ ├── me.png │ │ ├── mf.png │ │ ├── mg.png │ │ ├── mh.png │ │ ├── mk.png │ │ ├── ml.png │ │ ├── mm.png │ │ ├── mn.png │ │ ├── mo.png │ │ ├── mp.png │ │ ├── mq.png │ │ ├── mr.png │ │ ├── ms.png │ │ ├── mt.png │ │ ├── mu.png │ │ ├── mv.png │ │ ├── mw.png │ │ ├── mx.png │ │ ├── my.png │ │ ├── mz.png │ │ ├── na.png │ │ ├── nc.png │ │ ├── ne.png │ │ ├── nf.png │ │ ├── ng.png │ │ ├── ni.png │ │ ├── nl.png │ │ ├── no.png │ │ ├── np.png │ │ ├── nr.png │ │ ├── nu.png │ │ ├── nz.png │ │ ├── om.png │ │ ├── pa.png │ │ ├── pe.png │ │ ├── pf.png │ │ ├── pg.png │ │ ├── ph.png │ │ ├── pk.png │ │ ├── pl.png │ │ ├── pm.png │ │ ├── pn.png │ │ ├── pr.png │ │ ├── ps.png │ │ ├── pt.png │ │ ├── pw.png │ │ ├── py.png │ │ ├── qa.png │ │ ├── re.png │ │ ├── ro.png │ │ ├── rs.png │ │ ├── ru.png │ │ ├── rw.png │ │ ├── sa.png │ │ ├── sb.png │ │ ├── sc.png │ │ ├── sd.png │ │ ├── se.png │ │ ├── sg.png │ │ ├── sh.png │ │ ├── si.png │ │ ├── sj.png │ │ ├── sk.png │ │ ├── sl.png │ │ ├── sm.png │ │ ├── sn.png │ │ ├── so.png │ │ ├── sr.png │ │ ├── ss.png │ │ ├── st.png │ │ ├── sv.png │ │ ├── sx.png │ │ ├── sy.png │ │ ├── sz.png │ │ ├── ta.png │ │ ├── tc.png │ │ ├── td.png │ │ ├── tf.png │ │ ├── tg.png │ │ ├── th.png │ │ ├── tj.png │ │ ├── tk.png │ │ ├── tl.png │ │ ├── tm.png │ │ ├── tn.png │ │ ├── to.png │ │ ├── tr.png │ │ ├── tt.png │ │ ├── tv.png │ │ ├── tw.png │ │ ├── tz.png │ │ ├── ua.png │ │ ├── ug.png │ │ ├── um.png │ │ ├── un.png │ │ ├── us.png │ │ ├── uy.png │ │ ├── uz.png │ │ ├── va.png │ │ ├── vc.png │ │ ├── ve.png │ │ ├── vg.png │ │ ├── vi.png │ │ ├── vn.png │ │ ├── vu.png │ │ ├── wf.png │ │ ├── ws.png │ │ ├── xk.png │ │ ├── ye.png │ │ ├── yt.png │ │ ├── za.png │ │ ├── zm.png │ │ ├── zw.png │ │ └── zz.png │ └── locales │ │ ├── en_US │ │ └── winpinator.mo │ │ └── pl_PL │ │ └── winpinator.mo ├── transfer_badge_down.png ├── transfer_badge_up.png ├── transfer_dir_dir.png ├── transfer_dir_file.png ├── transfer_dir_x.png ├── transfer_failed.png ├── transfer_file_file.png ├── transfer_file_x.png ├── transfer_status_cancelled.png ├── transfer_status_error.png ├── transfer_status_success.png ├── transfer_succeeded.png ├── tray_err.ico ├── tray_err16.png ├── tray_err32.png ├── tray_ok.ico ├── tray_ok16.png ├── tray_ok32.png ├── tray_wait.ico ├── tray_wait16.png ├── tray_wait32.png ├── unk_profile.png └── warning.png ├── src ├── globals.cpp ├── globals.hpp ├── gui │ ├── about_dialog.cpp │ ├── about_dialog.hpp │ ├── array_event.cpp │ ├── array_event.hpp │ ├── autorun_setter.cpp │ ├── autorun_setter.hpp │ ├── file_list_dialog.cpp │ ├── file_list_dialog.hpp │ ├── history_element_finished.cpp │ ├── history_element_finished.hpp │ ├── history_element_pending.cpp │ ├── history_element_pending.hpp │ ├── history_group_header.cpp │ ├── history_group_header.hpp │ ├── history_item.cpp │ ├── history_item.hpp │ ├── history_item_icon.cpp │ ├── history_item_icon.hpp │ ├── history_std_bitmaps.hpp │ ├── host_listbox.cpp │ ├── host_listbox.hpp │ ├── language_adapter.cpp │ ├── language_adapter.hpp │ ├── network_interface_adapter.cpp │ ├── network_interface_adapter.hpp │ ├── page_error.cpp │ ├── page_error.hpp │ ├── page_hostlist.cpp │ ├── page_hostlist.hpp │ ├── page_nohosts.cpp │ ├── page_nohosts.hpp │ ├── page_offline.cpp │ ├── page_offline.hpp │ ├── page_starting.cpp │ ├── page_starting.hpp │ ├── page_transferlist.cpp │ ├── page_transferlist.hpp │ ├── permission_picker.cpp │ ├── permission_picker.hpp │ ├── pointer_event.cpp │ ├── pointer_event.hpp │ ├── progress_label.cpp │ ├── progress_label.hpp │ ├── screen_selector.cpp │ ├── screen_selector.hpp │ ├── scrollable_restorable.hpp │ ├── settings_dialog.cpp │ ├── settings_dialog.hpp │ ├── spritesheet_animator.cpp │ ├── spritesheet_animator.hpp │ ├── status_text.cpp │ ├── status_text.hpp │ ├── tool_button.cpp │ ├── tool_button.hpp │ ├── transfer_history.cpp │ ├── transfer_history.hpp │ ├── transfer_speed_calculator.cpp │ ├── transfer_speed_calculator.hpp │ ├── utils.cpp │ ├── utils.hpp │ ├── winpinator_banner.cpp │ ├── winpinator_banner.hpp │ ├── winpinator_frame.cpp │ └── winpinator_frame.hpp ├── main.cpp ├── main.hpp ├── main_base.hpp ├── proto-gen │ ├── warp.grpc.pb.cc │ ├── warp.grpc.pb.h │ ├── warp.pb.cc │ └── warp.pb.h ├── running_instance_detector.cpp ├── running_instance_detector.hpp ├── service │ ├── account_picture_extractor.cpp │ ├── account_picture_extractor.hpp │ ├── auth_manager.cpp │ ├── auth_manager.hpp │ ├── database_manager.cpp │ ├── database_manager.hpp │ ├── database_types.hpp │ ├── database_utils.cpp │ ├── database_utils.hpp │ ├── event.hpp │ ├── file_crawler.cpp │ ├── file_crawler.hpp │ ├── file_sender.cpp │ ├── file_sender.hpp │ ├── icon_extractor.cpp │ ├── icon_extractor.hpp │ ├── memory_manager.cpp │ ├── memory_manager.hpp │ ├── notification.cpp │ ├── notification.hpp │ ├── notification_accept_files.cpp │ ├── notification_accept_files.hpp │ ├── notification_transfer_failed.cpp │ ├── notification_transfer_failed.hpp │ ├── notification_transfer_succeeded.cpp │ ├── notification_transfer_succeeded.hpp │ ├── observable_service.cpp │ ├── observable_service.hpp │ ├── registration_v1_impl.cpp │ ├── registration_v1_impl.hpp │ ├── registration_v2_impl.cpp │ ├── registration_v2_impl.hpp │ ├── remote_handler.cpp │ ├── remote_handler.hpp │ ├── remote_info.hpp │ ├── remote_manager.cpp │ ├── remote_manager.hpp │ ├── service_base64.cpp │ ├── service_errors.hpp │ ├── service_observer.cpp │ ├── service_observer.hpp │ ├── service_utils.cpp │ ├── service_utils.hpp │ ├── transfer_manager.cpp │ ├── transfer_manager.hpp │ ├── transfer_manager_reactor.cpp │ ├── transfer_types.hpp │ ├── unix_permissions.cpp │ ├── unix_permissions.hpp │ ├── warp_service_impl.cpp │ ├── warp_service_impl.hpp │ ├── winpinator_service.cpp │ ├── winpinator_service.hpp │ ├── zlib_deflate.cpp │ └── zlib_deflate.hpp ├── settings_model.cpp ├── settings_model.hpp ├── thread_name.hpp ├── tray_icon.cpp ├── tray_icon.hpp ├── winpinator_dde_client.cpp ├── winpinator_dde_client.hpp ├── winpinator_dde_consts.cpp ├── winpinator_dde_consts.hpp ├── winpinator_dde_server.cpp ├── winpinator_dde_server.hpp └── zeroconf │ ├── interface_utils.cpp │ ├── interface_utils.hpp │ ├── mdns.h │ ├── mdns_client.cpp │ ├── mdns_client.hpp │ ├── mdns_service.cpp │ ├── mdns_service.hpp │ └── mdns_types.hpp ├── test ├── unix_permissions.test.cpp └── zlib_deflate.test.cpp ├── vcpkg.json ├── vs16 ├── .gitattributes ├── .gitignore ├── Winpinator.sln ├── Winpinator.vcxproj ├── Winpinator.vcxproj.filters └── test │ ├── .gitignore │ ├── packages.config │ └── test.vcxproj └── win32 ├── manifest.manifest ├── resource.h ├── winpinator.aps └── winpinator.rc /.clang-format: -------------------------------------------------------------------------------- 1 | BasedOnStyle: WebKit 2 | 3 | BreakBeforeBraces: Allman 4 | SpacesInParentheses: true 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | vcpkg_installed 2 | .vs 3 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # CHANGELOG 2 | 3 | ## Release 0.1.1 4 | 5 | This release is just a small fix of full names not appearing under some circumstances on some Windows machines. 6 | 7 | **Fixes**: 8 | - A bug that prevents user's full name from being properly read on some machines 9 | 10 | ## Release 0.1.0 11 | 12 | This is the first version of Winpinator. It already supports 13 | most of the planned features, however, it might be a little 14 | buggy and unstable. 15 | 16 | **Features**: 17 | - Show up in mDNS as capable of handling the Warpinator protocol 18 | - Discover other computers running Warpinator/Winpinator on local network 19 | - Support both v1 and v2 registration protocols 20 | - Send and receive files, directories and any combination of those 21 | - Compress and decompress transfer chunks with deflate algorithm using zlib 22 | - Save zone information to received files (can be turned off in preferences) 23 | - Store transfer history containing all transferred paths 24 | - Accept files to send as command line parameters and handle usage of "Send to..." command in Windows Explorer 25 | - Allow starting on system startup (can be turned off in preferences) 26 | 27 | -------------------------------------------------------------------------------- /art/spinner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/art/spinner.png -------------------------------------------------------------------------------- /art/spinner.sifz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/art/spinner.sifz -------------------------------------------------------------------------------- /art/spinner20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/art/spinner20.png -------------------------------------------------------------------------------- /art/spinner24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/art/spinner24.png -------------------------------------------------------------------------------- /art/spinner256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/art/spinner256.png -------------------------------------------------------------------------------- /art/spinner32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/art/spinner32.png -------------------------------------------------------------------------------- /art/spinner40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/art/spinner40.png -------------------------------------------------------------------------------- /art/transfer_status_success.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 39 | 41 | 45 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /build/extract_strings_for_translation.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | REM xgettext extraction script 3 | 4 | echo Run xgettext... 5 | cd "../src" 6 | powershell "Get-ChildItem -Recurse *.?pp | Resolve-Path -Relative" > "../po/filelist.txt" 7 | xgettext -C -k_ -kwxTRANSLATE -kwxPLURAL:1,2 -f "../po/filelist.txt" --add-comments=TRANSLATORS --no-wrap -o "../po/winpinator.pot" 8 | del "../po/filelist.txt" -------------------------------------------------------------------------------- /build/post_compile.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | REM 4 | REM Command line arguments: 5 | REM 1. Directory of files required to exist in the executable dir 6 | REM 2. Directory where the executable is located 7 | REM 3. Directory of source code 8 | REM 9 | 10 | REM -------- compile translations -------- 11 | echo Compiling translations... 12 | cd "%3/../po" 13 | setlocal enabledelayedexpansion 14 | for /f %%f in ('dir /b *.po') do ( 15 | set output=%%f 16 | set output=!output:.po=.mo! 17 | msgfmt %%f -o !output! 18 | ) 19 | 20 | echo Copying translations to appropriate directories... 21 | cd "%3/../po" 22 | if not exist "../res/to_copy/locales/NUL" mkdir "../res/to_copy/locales" 23 | for /f %%f in ('dir /b *.mo') do ( 24 | set output=%%f 25 | set output=!output:.mo=! 26 | if not exist "../res/to_copy/locales/!output!/NUL" mkdir "../res/to_copy/locales/!!output!!" 27 | echo Processing !output!... 28 | copy /Y %%f "../res/to_copy/locales/!output!/winpinator.mo" 29 | ) 30 | 31 | REM -------- copy files -------- 32 | echo Copying files from %1 to %2 33 | xcopy "%1" "%2" /f /s /e /y /I -------------------------------------------------------------------------------- /nsis/.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | -------------------------------------------------------------------------------- /nsis/icons/install.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/icons/install.ico -------------------------------------------------------------------------------- /nsis/icons/install128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/icons/install128.png -------------------------------------------------------------------------------- /nsis/icons/install16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/icons/install16.png -------------------------------------------------------------------------------- /nsis/icons/install24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/icons/install24.png -------------------------------------------------------------------------------- /nsis/icons/install256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/icons/install256.png -------------------------------------------------------------------------------- /nsis/icons/install32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/icons/install32.png -------------------------------------------------------------------------------- /nsis/icons/install48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/icons/install48.png -------------------------------------------------------------------------------- /nsis/icons/install64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/icons/install64.png -------------------------------------------------------------------------------- /nsis/icons/uninstall.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/icons/uninstall.ico -------------------------------------------------------------------------------- /nsis/icons/uninstall128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/icons/uninstall128.png -------------------------------------------------------------------------------- /nsis/icons/uninstall16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/icons/uninstall16.png -------------------------------------------------------------------------------- /nsis/icons/uninstall24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/icons/uninstall24.png -------------------------------------------------------------------------------- /nsis/icons/uninstall256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/icons/uninstall256.png -------------------------------------------------------------------------------- /nsis/icons/uninstall32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/icons/uninstall32.png -------------------------------------------------------------------------------- /nsis/icons/uninstall48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/icons/uninstall48.png -------------------------------------------------------------------------------- /nsis/icons/uninstall64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/icons/uninstall64.png -------------------------------------------------------------------------------- /nsis/inst-banner.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/inst-banner.bmp -------------------------------------------------------------------------------- /nsis/inst-banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/inst-banner.png -------------------------------------------------------------------------------- /nsis/inst-welcome.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/inst-welcome.bmp -------------------------------------------------------------------------------- /nsis/inst-welcome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/inst-welcome.png -------------------------------------------------------------------------------- /nsis/plugins/inetc/Contrib/Inetc/afxres.h: -------------------------------------------------------------------------------- 1 | #include 2 | #define IDC_STATIC (-1) 3 | -------------------------------------------------------------------------------- /nsis/plugins/inetc/Contrib/Inetc/inetc.rc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/plugins/inetc/Contrib/Inetc/inetc.rc -------------------------------------------------------------------------------- /nsis/plugins/inetc/Contrib/Inetc/inetc.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {7803dcf0-655c-4f71-89dd-7fd695066a28} 6 | cpp;c;cxx;rc;def;r;odl;idl;hpj;bat 7 | 8 | 9 | {8edac42d-b9b9-469f-9864-3dbc65bf4365} 10 | ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe 11 | 12 | 13 | {67a938b1-f16b-478b-81df-d0fd26de6d8a} 14 | h;hpp;hxx;hm;inl 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | Source Files 23 | 24 | 25 | Source Files 26 | 27 | 28 | 29 | 30 | Resource Files 31 | 32 | 33 | 34 | 35 | Resource Files 36 | 37 | 38 | 39 | 40 | Header Files 41 | 42 | 43 | Header Files 44 | 45 | 46 | Header Files 47 | 48 | 49 | Header Files 50 | 51 | 52 | -------------------------------------------------------------------------------- /nsis/plugins/inetc/Contrib/Inetc/resource.h: -------------------------------------------------------------------------------- 1 | //{{NO_DEPENDENCIES}} 2 | // Microsoft Developer Studio generated include file. 3 | // Used by inetc.rc 4 | // 5 | #define IDC_SLOGIN 8 6 | #define IDC_PROGRESS 10 7 | #define IDC_SUBTEXT 11 8 | #define IDC_SPWD 11 9 | #define IDC_ICON1 12 10 | #define IDD_DIALOG1 101 11 | #define IDI_ICON1 102 12 | #define IDI_ICON2 103 13 | #define IDD_AUTH 104 14 | #define IDI_ICON3 105 15 | #define IDI_ICON4 106 16 | #define IDI_ICON5 107 17 | #define IDD_DIALOG2 108 18 | #define IDI_ICON6 109 19 | #define IDD_DIALOG3 110 20 | #define IDC_STATIC1 1001 21 | #define IDC_STATIC2 1002 22 | #define IDC_STATIC3 1003 23 | #define IDC_STATIC4 1004 24 | #define IDC_PROGRESS1 1005 25 | #define IDC_STATIC5 1006 26 | #define IDC_STATIC6 1007 27 | #define IDC_STATIC12 1008 28 | #define IDC_STATIC13 1009 29 | #define IDC_STATIC20 1009 30 | #define IDC_STATIC21 1010 31 | #define IDC_STATIC22 1011 32 | #define IDC_STATIC23 1012 33 | #define IDC_STATIC24 1013 34 | #define IDC_STATIC25 1014 35 | #define IDC_ELOGIN 1015 36 | #define IDC_EPWD 1016 37 | 38 | // Next default values for new objects 39 | // 40 | #ifdef APSTUDIO_INVOKED 41 | #ifndef APSTUDIO_READONLY_SYMBOLS 42 | #define _APS_NEXT_RESOURCE_VALUE 111 43 | #define _APS_NEXT_COMMAND_VALUE 40001 44 | #define _APS_NEXT_CONTROL_VALUE 1018 45 | #define _APS_NEXT_SYMED_VALUE 101 46 | #endif 47 | #endif 48 | -------------------------------------------------------------------------------- /nsis/plugins/inetc/Examples/Inetc/Example.nsi: -------------------------------------------------------------------------------- 1 | 2 | ;-------------------------------- 3 | ; General Attributes 4 | 5 | Name "Inetc plug-in Test" 6 | OutFile "inetc.exe" 7 | ;SilentInstall silent 8 | RequestExecutionLevel user 9 | 10 | 11 | ;-------------------------------- 12 | ;Interface Settings 13 | 14 | !include "MUI2.nsh" 15 | !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-colorful.ico" 16 | !insertmacro MUI_PAGE_WELCOME 17 | !insertmacro MUI_PAGE_INSTFILES 18 | !insertmacro MUI_LANGUAGE "English" 19 | 20 | ;SetFont 14 21 | 22 | ;-------------------------------- 23 | ;Installer Sections 24 | 25 | Section "Dummy Section" SecDummy 26 | 27 | SetDetailsView hide 28 | 29 | ; two files download, popup mode 30 | inetc::get /caption "2003-2004 reports" /popup "" "http://ineum.narod.ru/spr_2003.htm" "$EXEDIR\spr3.htm" "http://ineum.narod.ru/spr_2004.htm" "$EXEDIR\spr4.htm" /end 31 | Pop $0 # return value = exit code, "OK" means OK 32 | 33 | ; single file, NSISdl-style embedded progress bar with specific cancel button text 34 | inetc::get /caption "2005 report" /canceltext "interrupt!" "http://ineum.narod.ru/spr_2005.htm" "$EXEDIR\spr5.htm" /end 35 | Pop $1 # return value = exit code, "OK" means OK 36 | 37 | ; banner with 2 text lines and disabled Cancel button 38 | inetc::get /caption "2006 report" /banner "Banner mode with /nocancel option setten$\nSecond Line" /nocancel "http://ineum.narod.ru/spr_2006.htm" "$EXEDIR\spr6.htm" /end 39 | Pop $2 # return value = exit code, "OK" means OK 40 | 41 | MessageBox MB_OK "Download Status: $0, $1, $2" 42 | SectionEnd 43 | 44 | 45 | ;-------------------------------- 46 | ;Installer Functions 47 | 48 | Function .onInit 49 | 50 | ; plug-in auto-recognizes 'no parent dlg' in onInit and works accordingly 51 | ; inetc::head /RESUME "Network error. Retry?" "http://ineum.narod.ru/spr_2003.htm" "$EXEDIR\spr3.txt" 52 | ; Pop $4 53 | 54 | FunctionEnd -------------------------------------------------------------------------------- /nsis/plugins/inetc/Examples/Inetc/auth_dlg.nsi: -------------------------------------------------------------------------------- 1 | 2 | ;-------------------------------- 3 | ; General Attributes 4 | 5 | Name "Inetc http auth Test" 6 | OutFile "auth_dlg.exe" 7 | RequestExecutionLevel user 8 | 9 | 10 | ;-------------------------------- 11 | ;Interface Settings 12 | 13 | !include "MUI2.nsh" 14 | !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-colorful.ico" 15 | !insertmacro MUI_PAGE_INSTFILES 16 | !insertmacro MUI_LANGUAGE "English" 17 | 18 | 19 | ;-------------------------------- 20 | ;Installer Sections 21 | 22 | Section "Dummy Section" SecDummy 23 | 24 | ; Displays IE auth dialog. 25 | ; Both server and proxy auth. 26 | ; Please test this with your own link. 27 | 28 | inetc::get "http://www.cnt.ru/personal" "$EXEDIR\auth.html" 29 | Pop $0 # return value = exit code, "OK" if OK 30 | MessageBox MB_OK "Download Status: $0" 31 | 32 | SectionEnd 33 | -------------------------------------------------------------------------------- /nsis/plugins/inetc/Examples/Inetc/ftp_auth.nsi: -------------------------------------------------------------------------------- 1 | 2 | ;-------------------------------- 3 | ; General Attributes 4 | 5 | Name "Inetc ftp authentication Test" 6 | OutFile "ftp_auth.exe" 7 | RequestExecutionLevel user 8 | 9 | 10 | ;-------------------------------- 11 | ;Interface Settings 12 | 13 | !include "MUI2.nsh" 14 | !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-colorful.ico" 15 | !insertmacro MUI_PAGE_INSTFILES 16 | !insertmacro MUI_LANGUAGE "English" 17 | 18 | 19 | ;-------------------------------- 20 | ;Installer Sections 21 | 22 | Section "Dummy Section" SecDummy 23 | 24 | ; use your own URL and login@pwd. Password hidden from user with /popup "ALIAS" 25 | 26 | inetc::get /caption "service pack download" /popup "ftp://localhost/" "ftp://login:pwd@localhost/W2Ksp3.exe" "$EXEDIR\sp3.exe" 27 | ; inetc::put /caption "service pack upload" /popup "" "ftp://login:pwd@localhost/W2Ksp3.bu.exe" "$EXEDIR\sp3.exe" 28 | Pop $0 # return value = exit code, "OK" if OK 29 | MessageBox MB_OK "Download Status: $0" 30 | 31 | SectionEnd 32 | 33 | -------------------------------------------------------------------------------- /nsis/plugins/inetc/Examples/Inetc/head.nsi: -------------------------------------------------------------------------------- 1 | 2 | ;-------------------------------- 3 | ; General Attributes 4 | 5 | Name "Inetc Head Test" 6 | OutFile "head.exe" 7 | RequestExecutionLevel user 8 | 9 | 10 | ;-------------------------------- 11 | ;Interface Settings 12 | 13 | !include "MUI2.nsh" 14 | !insertmacro MUI_PAGE_INSTFILES 15 | !insertmacro MUI_LANGUAGE "English" 16 | 17 | 18 | ;-------------------------------- 19 | ;Installer Sections 20 | 21 | Section "Dummy Section" SecDummy 22 | 23 | DetailPrint "New version check out (internet connection)" 24 | inetc::head /silent "http://ineum.narod.ru/spr_2006.htm" "$EXEDIR\head.txt" 25 | Pop $0 # return value = exit code, "OK" if OK 26 | MessageBox MB_OK "Download Status: $0" 27 | 28 | SectionEnd 29 | 30 | 31 | -------------------------------------------------------------------------------- /nsis/plugins/inetc/Examples/Inetc/headers.nsi: -------------------------------------------------------------------------------- 1 | 2 | ;-------------------------------- 3 | ; General Attributes 4 | 5 | Name "Headers Test" 6 | OutFile "headers.exe" 7 | RequestExecutionLevel user 8 | 9 | 10 | ;-------------------------------- 11 | ;Interface Settings 12 | 13 | !include "MUI2.nsh" 14 | !insertmacro MUI_PAGE_INSTFILES 15 | !insertmacro MUI_LANGUAGE "English" 16 | 17 | 18 | 19 | ;-------------------------------- 20 | ;Installer Sections 21 | 22 | Section "Dummy Section" SecDummy 23 | 24 | ; additional headers. Sample php returns raw headers 25 | inetc::get /useragent "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1)" /header "SOAPAction: urn:anonOutInOpe" "http://localhost/headers.php" "$EXEDIR\headers.html" 26 | Pop $0 27 | 28 | MessageBox MB_OK "Download Status: $0" 29 | 30 | SectionEnd 31 | 32 | 33 | -------------------------------------------------------------------------------- /nsis/plugins/inetc/Examples/Inetc/headers.php: -------------------------------------------------------------------------------- 1 | $value) { 5 | echo "$header: $value
\n"; 6 | } 7 | ?> -------------------------------------------------------------------------------- /nsis/plugins/inetc/Examples/Inetc/https.nsi: -------------------------------------------------------------------------------- 1 | 2 | ;-------------------------------- 3 | ; General Attributes 4 | 5 | Name "Inetc https Test" 6 | OutFile "https.exe" 7 | RequestExecutionLevel user 8 | 9 | 10 | ;-------------------------------- 11 | ;Interface Settings 12 | 13 | !include "MUI2.nsh" 14 | !insertmacro MUI_PAGE_INSTFILES 15 | !insertmacro MUI_LANGUAGE "English" 16 | 17 | 18 | ;-------------------------------- 19 | ;Installer Sections 20 | 21 | Section "Dummy Section" SecDummy 22 | 23 | inetc::get /POPUP "" /CAPTION "bending_property_demo.zip" "https://secure.codeproject.com/cs/miscctrl/bending_property/bending_property_src.zip" "$EXEDIR\bending_property_src.zip" 24 | Pop $0 # return value = exit code, "OK" if OK 25 | MessageBox MB_OK "Download Status: $0" 26 | 27 | SectionEnd 28 | -------------------------------------------------------------------------------- /nsis/plugins/inetc/Examples/Inetc/post.nsi: -------------------------------------------------------------------------------- 1 | 2 | ;-------------------------------- 3 | ; General Attributes 4 | 5 | Name "Inetc Post Test" 6 | OutFile "post.exe" 7 | RequestExecutionLevel user 8 | 9 | 10 | ;-------------------------------- 11 | ;Interface Settings 12 | 13 | !include "MUI2.nsh" 14 | !insertmacro MUI_PAGE_INSTFILES 15 | !insertmacro MUI_LANGUAGE "English" 16 | 17 | 18 | ;-------------------------------- 19 | ;Installer Sections 20 | 21 | Section "Dummy Section" SecDummy 22 | 23 | ; this is my LAN sample, use your own URL for tests. Sample post.php included 24 | 25 | inetc::post "login=ami&passwd=333" "http://localhost/post.php?lg=iam&pw=44" "$EXEDIR\post_reply.htm" 26 | Pop $0 # return value = exit code, "OK" if OK 27 | MessageBox MB_OK "Download Status: $0" 28 | 29 | SectionEnd 30 | 31 | 32 | -------------------------------------------------------------------------------- /nsis/plugins/inetc/Examples/Inetc/post.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | "; 7 | echo "post.passwd=".$_POST['passwd']."
"; 8 | echo "get.lg=".$_GET['lg']."
"; 9 | echo "get.pw=".$_GET['pw']."
"; 10 | ?> 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /nsis/plugins/inetc/Examples/Inetc/post_file.nsi: -------------------------------------------------------------------------------- 1 | 2 | ;-------------------------------- 3 | ; General Attributes 4 | 5 | Name "Inetc Post Test" 6 | OutFile "post_file.exe" 7 | RequestExecutionLevel user 8 | 9 | 10 | ;-------------------------------- 11 | ;Interface Settings 12 | 13 | !include "MUI2.nsh" 14 | !insertmacro MUI_PAGE_INSTFILES 15 | !insertmacro MUI_LANGUAGE "English" 16 | 17 | 18 | ;-------------------------------- 19 | ;Installer Sections 20 | 21 | Section "Dummy Section" SecDummy 22 | 23 | ; this is my LAN sample, use your own URL for tests. Sample post.php included 24 | 25 | inetc::post "$EXEDIR\inetc.cpp" /file "http://localhost/post_file.php" "$EXEDIR\post_file.htm" 26 | Pop $0 # return value = exit code, "OK" if OK 27 | MessageBox MB_OK "Download Status: $0" 28 | 29 | SectionEnd 30 | 31 | 32 | -------------------------------------------------------------------------------- /nsis/plugins/inetc/Examples/Inetc/post_file.php: -------------------------------------------------------------------------------- 1 | $value) { 5 | echo "$header: $value
\n"; 6 | } 7 | echo "new
"; 8 | foreach ($_FILES as $key => $value) echo $key . "<>" . $value . "
\n"; 9 | echo file_get_contents('php://input'); 10 | ?> -------------------------------------------------------------------------------- /nsis/plugins/inetc/Examples/Inetc/post_form.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Registration form for post.php test 4 | 5 | 6 | This form sends POST request to server. It was interesting to compare server echo
7 | reply (by included post.php) for this form and InetLoad plug-in - in my
8 | tests server did not see any difference between them :)
9 |
10 | 11 |
12 |
13 | 14 | 15 |
16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /nsis/plugins/inetc/Examples/Inetc/put.nsi: -------------------------------------------------------------------------------- 1 | 2 | ;-------------------------------- 3 | ; General Attributes 4 | 5 | Name "Inetc Test" 6 | OutFile "put.exe" 7 | RequestExecutionLevel user 8 | 9 | 10 | ;-------------------------------- 11 | ;Interface Settings 12 | 13 | !include "MUI2.nsh" 14 | !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-colorful.ico" 15 | !insertmacro MUI_PAGE_INSTFILES 16 | !insertmacro MUI_LANGUAGE "English" 17 | 18 | 19 | ;-------------------------------- 20 | ;Installer Sections 21 | 22 | Section "Dummy Section" SecDummy 23 | 24 | ; this is my LAN sample, use your own URL for tests. Login/pwd hidden from user. Sample put.php (for http request) included 25 | 26 | inetc::put "http://localhost/put.php" "$EXEDIR\test.jpg" 27 | ; inetc::put /POPUP "ftp://localhost/" /CAPTION "my local ftp upload" "ftp://localhost/test.jpg" "$EXEDIR\test.jpg" 28 | Pop $0 29 | MessageBox MB_OK "Upload Status: $0" 30 | 31 | SectionEnd 32 | -------------------------------------------------------------------------------- /nsis/plugins/inetc/Examples/Inetc/put.php: -------------------------------------------------------------------------------- 1 | 20 | -------------------------------------------------------------------------------- /nsis/plugins/inetc/Examples/Inetc/recursive.nsi: -------------------------------------------------------------------------------- 1 | Name "Inetc Recursive Dir Upload Test" 2 | OutFile "recursive.exe" 3 | RequestExecutionLevel user 4 | 5 | !include "MUI2.nsh" 6 | !insertmacro MUI_PAGE_INSTFILES 7 | !insertmacro MUI_LANGUAGE "English" 8 | !include "FileFunc.nsh" 9 | !insertmacro GetFileAttributes 10 | 11 | var url 12 | var path 13 | 14 | Function dirul 15 | 16 | Push $0 ; search handle 17 | Push $1 ; file name 18 | Push $2 ; attributes 19 | 20 | FindFirst $0 $1 "$path\*" 21 | loop: 22 | StrCmp $1 "" done 23 | ${GetFileAttributes} "$path\$1" DIRECTORY $2 24 | IntCmp $2 1 isdir 25 | retry: 26 | Inetc::put $url/$1 "$path\$1" /end 27 | Pop $2 28 | DetailPrint "$2 $path\$1" 29 | StrCmp $2 "OK" cont 30 | MessageBox MB_YESNO "$path\$1 file upload failed. Retry?" IDYES retry 31 | Abort "terminated by user" 32 | Goto cont 33 | isdir: 34 | StrCmp $1 . cont 35 | StrCmp $1 .. cont 36 | Push $path 37 | Push $url 38 | StrCpy $path "$path\$1" 39 | StrCpy $url "$url/$1" 40 | Call dirul 41 | Pop $url 42 | Pop $path 43 | cont: 44 | FindNext $0 $1 45 | Goto loop 46 | done: 47 | FindClose $0 48 | 49 | Pop $2 50 | Pop $1 51 | Pop $0 52 | 53 | FunctionEnd 54 | 55 | 56 | Section "Dummy Section" SecDummy 57 | 58 | SetDetailsView hide 59 | StrCpy $path "$EXEDIR" 60 | ; put is dir in the user's ftp home, use //put for root-relative path 61 | StrCpy $url ftp://takhir:pwd@localhost/put 62 | Call dirul 63 | SetDetailsView show 64 | 65 | SectionEnd 66 | -------------------------------------------------------------------------------- /nsis/plugins/inetc/Examples/Inetc/redirect.nsi: -------------------------------------------------------------------------------- 1 | 2 | ;-------------------------------- 3 | ; General Attributes 4 | 5 | Name "Redirect Test" 6 | OutFile "redirect.exe" 7 | RequestExecutionLevel user 8 | 9 | 10 | ;-------------------------------- 11 | ;Interface Settings 12 | 13 | !include "MUI2.nsh" 14 | !insertmacro MUI_PAGE_INSTFILES 15 | !insertmacro MUI_LANGUAGE "English" 16 | 17 | 18 | ;-------------------------------- 19 | ;Installer Sections 20 | 21 | Section "Dummy Section" SecDummy 22 | 23 | SetDetailsView hide 24 | 25 | inetc::get "http://localhost/redirect.php" "$EXEDIR\redirect.htm" /end 26 | Pop $1 27 | 28 | MessageBox MB_OK "Download Status: $1" 29 | 30 | SectionEnd 31 | 32 | -------------------------------------------------------------------------------- /nsis/plugins/inetc/Examples/Inetc/redirect.php: -------------------------------------------------------------------------------- 1 | 7 | -------------------------------------------------------------------------------- /nsis/plugins/inetc/Examples/Inetc/timeout.nsi: -------------------------------------------------------------------------------- 1 | 2 | ;-------------------------------- 3 | ; General Attributes 4 | 5 | Name "Timeout Test" 6 | OutFile "to.exe" 7 | RequestExecutionLevel user 8 | 9 | 10 | ;-------------------------------- 11 | ;Interface Settings 12 | 13 | !include "MUI2.nsh" 14 | !insertmacro MUI_PAGE_INSTFILES 15 | !insertmacro MUI_LANGUAGE "English" 16 | 17 | 18 | 19 | ;-------------------------------- 20 | ;Installer Sections 21 | 22 | Section "Dummy Section" SecDummy 23 | 24 | ; additional headers. Sample php returns raw headers 25 | inetc::get /receivetimeout 12 "http://localhost/to.php" "$EXEDIR\to.html" 26 | Pop $0 27 | 28 | MessageBox MB_OK "Download Status: $0" 29 | 30 | SectionEnd 31 | 32 | 33 | -------------------------------------------------------------------------------- /nsis/plugins/inetc/Examples/Inetc/tostack.nsi: -------------------------------------------------------------------------------- 1 | 2 | ;-------------------------------- 3 | ; General Attributes 4 | 5 | Name "Inetc To Stack Test" 6 | OutFile "ToStack.exe" 7 | RequestExecutionLevel user 8 | 9 | 10 | ;-------------------------------- 11 | ;Interface Settings 12 | 13 | !include "MUI2.nsh" 14 | !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-colorful.ico" 15 | !insertmacro MUI_PAGE_INSTFILES 16 | !insertmacro MUI_LANGUAGE "English" 17 | 18 | 19 | ;-------------------------------- 20 | ;Installer Sections 21 | 22 | Section "Dummy Section" SecDummy 23 | 24 | inetc::get /TOSTACK "http://www.google.com" "" /END 25 | Pop $0 # return value = exit code, "OK" if OK 26 | MessageBox MB_OK "Download Status: $0" 27 | Pop $0 # return text 28 | StrLen $1 $0 29 | MessageBox MB_OK "Download Length: $1" 30 | MessageBox MB_OK "$0" 31 | 32 | SectionEnd 33 | -------------------------------------------------------------------------------- /nsis/plugins/inetc/Examples/Inetc/translate.nsi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/plugins/inetc/Examples/Inetc/translate.nsi -------------------------------------------------------------------------------- /nsis/plugins/inetc/Plugins/amd64-unicode/INetC.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/plugins/inetc/Plugins/amd64-unicode/INetC.dll -------------------------------------------------------------------------------- /nsis/plugins/inetc/Plugins/x86-ansi/INetC.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/plugins/inetc/Plugins/x86-ansi/INetC.dll -------------------------------------------------------------------------------- /nsis/plugins/inetc/Plugins/x86-unicode/INetC.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/plugins/inetc/Plugins/x86-unicode/INetC.dll -------------------------------------------------------------------------------- /nsis/plugins/inetc/build_msvc.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | setlocal 3 | set Name=INetC 4 | set DistRoot=. 5 | set SrcRoot=%DistRoot%\Contrib\%Name% 6 | set BaseCL=/GL /LD /W3 /O1 /Osy /GF /Gz /GS- /GR- /Zl /D_VC_NODEFAULTLIB 7 | set BaseLINK=/LTCG /DLL /OPT:REF /OPT:ICF,99 /MERGE:.rdata=.text /OPT:NOWIN98 /NODEFAULTLIB kernel32.lib user32.lib advapi32.lib comctl32.lib wininet.lib 8 | set Targets=x86-ansi x86-unicode 9 | (>nul (( 2>&1 call cl "/?" )|find /I "AMD64"))&&(set Targets=amd64-unicode) 10 | for %%A in (%Targets%) do (call :B %%A) 11 | @goto :EOF 12 | 13 | 14 | :B targ 15 | set DEF=/D___NSISPLUGIN 16 | ((echo %1|find /I "unicode")>nul)&&set DEF=%DEF% /DUNICODE /D_UNICODE 17 | set CL=%BaseCL% %DEF% /Gy 18 | set LINK=%BaseLINK% 19 | for %%B in (%SrcRoot%\*.rc) do call RC /R /FO"%DistRoot%\%%~nB.res" "%%B" 20 | for %%A in (c cpp cxx) do for %%B in (%SrcRoot%\*.%%A) do ( 21 | if exist "%DistRoot%\%%~nB.obj" del "%DistRoot%\%%~nB.obj" 22 | call CL /c %%B /Fe"%DistRoot%\%Name%" 23 | ) 24 | md "%DistRoot%\Plugins\%1" 2>nul 25 | call LINK /NOLOGO /OUT:"%DistRoot%\Plugins\%1\%Name%.dll" /PDB:"%DistRoot%\%Name%-%1" "%DistRoot%\*.obj" "%DistRoot%\*.res" 26 | @goto :EOF 27 | -------------------------------------------------------------------------------- /nsis/uninst-banner.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/uninst-banner.bmp -------------------------------------------------------------------------------- /nsis/uninst-banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/uninst-banner.png -------------------------------------------------------------------------------- /nsis/uninst-welcome.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/uninst-welcome.bmp -------------------------------------------------------------------------------- /nsis/uninst-welcome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/nsis/uninst-welcome.png -------------------------------------------------------------------------------- /nsis/x64.nsi: -------------------------------------------------------------------------------- 1 | # x64 version of Winpinator 2 | 3 | !define RELEASE_FOLDER "..\vs16\x64\Deploy" 4 | !define ARCH "x64" 5 | 6 | !include "winpinator.nsh" 7 | -------------------------------------------------------------------------------- /nsis/x86.nsi: -------------------------------------------------------------------------------- 1 | # x86 version of Winpinator 2 | 3 | !define RELEASE_FOLDER "..\vs16\Deploy" 4 | !define ARCH "x86" 5 | 6 | !include "winpinator.nsh" 7 | -------------------------------------------------------------------------------- /po/.gitignore: -------------------------------------------------------------------------------- 1 | *.mo 2 | -------------------------------------------------------------------------------- /proto/generate-protobuf.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | REM 4 | REM generate-protobuf.bat 5 | REM 6 | REM This script regenerates all protobuf c++ sources 7 | REM and headers based on contents of warp.proto file 8 | REM 9 | REM This batch file outputs to src/proto-gen directory 10 | REM 11 | 12 | rmdir /s /q "../src/proto-gen" 13 | mkdir "../src/proto-gen" 14 | ..\vcpkg_installed\x64-windows\x64-windows\tools\protobuf\protoc.exe -I . --grpc_out ../src/proto-gen --plugin=protoc-gen-grpc=../vcpkg_installed/x64-windows/x64-windows/tools/grpc/grpc_cpp_plugin.exe warp.proto 15 | ..\vcpkg_installed\x64-windows\x64-windows\tools\protobuf\protoc.exe -I . --cpp_out ../src/proto-gen warp.proto 16 | echo All done... 17 | 18 | -------------------------------------------------------------------------------- /readme/screen1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/readme/screen1.png -------------------------------------------------------------------------------- /readme/screen2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/readme/screen2.png -------------------------------------------------------------------------------- /readme/screen3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/readme/screen3.png -------------------------------------------------------------------------------- /readme/screen4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/readme/screen4.png -------------------------------------------------------------------------------- /res/about_banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/about_banner.png -------------------------------------------------------------------------------- /res/back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/back.png -------------------------------------------------------------------------------- /res/blot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/blot.png -------------------------------------------------------------------------------- /res/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/error.png -------------------------------------------------------------------------------- /res/forward.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/forward.png -------------------------------------------------------------------------------- /res/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/icon.ico -------------------------------------------------------------------------------- /res/icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/icon128.png -------------------------------------------------------------------------------- /res/icon16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/icon16.png -------------------------------------------------------------------------------- /res/icon256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/icon256.png -------------------------------------------------------------------------------- /res/icon32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/icon32.png -------------------------------------------------------------------------------- /res/icon48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/icon48.png -------------------------------------------------------------------------------- /res/icon64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/icon64.png -------------------------------------------------------------------------------- /res/info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/info.png -------------------------------------------------------------------------------- /res/refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/refresh.png -------------------------------------------------------------------------------- /res/remove_history.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/remove_history.png -------------------------------------------------------------------------------- /res/send_directory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/send_directory.png -------------------------------------------------------------------------------- /res/send_file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/send_file.png -------------------------------------------------------------------------------- /res/spinner16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/spinner16.png -------------------------------------------------------------------------------- /res/spinner48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/spinner48.png -------------------------------------------------------------------------------- /res/to_copy/Languages.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /res/to_copy/RELEASE NOTES.txt: -------------------------------------------------------------------------------- 1 | Release 0.1.2 2 | =============== 3 | This release fixes some Winpinator bugs: 4 | - Installer now checks for Microsoft Visual C++ Redistributable 5 | version and forces an update if it's too old 6 | - No more error boxes show up when Winpinator fails to find 7 | the account picture 8 | - Settings are now saved immediately after clicking OK in the 9 | "Preferences" dialog box 10 | 11 | Release 0.1.1 12 | =============== 13 | This release is just a small fix of full names not appearing 14 | under some circumstances on some Windows machines. 15 | 16 | Fixes: 17 | - A bug that prevents user's full name from being properly 18 | read on some machines 19 | 20 | 21 | Release 0.1.0 22 | =============== 23 | This is the first version of Winpinator. It already supports 24 | most of the planned features, however, it might be a little 25 | buggy and unstable. 26 | 27 | Features: 28 | - Show up in mDNS as capable of handling the Warpinator 29 | protocol 30 | - Discover other computers running Warpinator/Winpinator 31 | on local network 32 | - Support both v1 and v2 registration protocols 33 | - Send and receive files, directories and any combination 34 | of those 35 | - Compress and decompress transfer chunks with deflate 36 | algorithm using zlib 37 | - Save zone information to received files (can be turned off 38 | in preferences) 39 | - Store transfer history containing all transferred paths 40 | - Accept files to send as command line parameters and handle 41 | usage of "Send to..." command in Windows Explorer 42 | - Allow starting on system startup (can be turned off in 43 | preferences) 44 | -------------------------------------------------------------------------------- /res/to_copy/flags/ac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ac.png -------------------------------------------------------------------------------- /res/to_copy/flags/ad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ad.png -------------------------------------------------------------------------------- /res/to_copy/flags/ae.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ae.png -------------------------------------------------------------------------------- /res/to_copy/flags/af.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/af.png -------------------------------------------------------------------------------- /res/to_copy/flags/ag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ag.png -------------------------------------------------------------------------------- /res/to_copy/flags/ai.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ai.png -------------------------------------------------------------------------------- /res/to_copy/flags/al.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/al.png -------------------------------------------------------------------------------- /res/to_copy/flags/am.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/am.png -------------------------------------------------------------------------------- /res/to_copy/flags/ao.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ao.png -------------------------------------------------------------------------------- /res/to_copy/flags/aq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/aq.png -------------------------------------------------------------------------------- /res/to_copy/flags/ar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ar.png -------------------------------------------------------------------------------- /res/to_copy/flags/as.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/as.png -------------------------------------------------------------------------------- /res/to_copy/flags/at.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/at.png -------------------------------------------------------------------------------- /res/to_copy/flags/au.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/au.png -------------------------------------------------------------------------------- /res/to_copy/flags/aw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/aw.png -------------------------------------------------------------------------------- /res/to_copy/flags/ax.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ax.png -------------------------------------------------------------------------------- /res/to_copy/flags/az.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/az.png -------------------------------------------------------------------------------- /res/to_copy/flags/ba.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ba.png -------------------------------------------------------------------------------- /res/to_copy/flags/bb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/bb.png -------------------------------------------------------------------------------- /res/to_copy/flags/bd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/bd.png -------------------------------------------------------------------------------- /res/to_copy/flags/be.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/be.png -------------------------------------------------------------------------------- /res/to_copy/flags/bf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/bf.png -------------------------------------------------------------------------------- /res/to_copy/flags/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/bg.png -------------------------------------------------------------------------------- /res/to_copy/flags/bh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/bh.png -------------------------------------------------------------------------------- /res/to_copy/flags/bi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/bi.png -------------------------------------------------------------------------------- /res/to_copy/flags/bj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/bj.png -------------------------------------------------------------------------------- /res/to_copy/flags/bl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/bl.png -------------------------------------------------------------------------------- /res/to_copy/flags/bm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/bm.png -------------------------------------------------------------------------------- /res/to_copy/flags/bn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/bn.png -------------------------------------------------------------------------------- /res/to_copy/flags/bo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/bo.png -------------------------------------------------------------------------------- /res/to_copy/flags/bq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/bq.png -------------------------------------------------------------------------------- /res/to_copy/flags/br.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/br.png -------------------------------------------------------------------------------- /res/to_copy/flags/bs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/bs.png -------------------------------------------------------------------------------- /res/to_copy/flags/bt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/bt.png -------------------------------------------------------------------------------- /res/to_copy/flags/bv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/bv.png -------------------------------------------------------------------------------- /res/to_copy/flags/bw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/bw.png -------------------------------------------------------------------------------- /res/to_copy/flags/by.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/by.png -------------------------------------------------------------------------------- /res/to_copy/flags/bz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/bz.png -------------------------------------------------------------------------------- /res/to_copy/flags/ca.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ca.png -------------------------------------------------------------------------------- /res/to_copy/flags/cc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/cc.png -------------------------------------------------------------------------------- /res/to_copy/flags/cd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/cd.png -------------------------------------------------------------------------------- /res/to_copy/flags/cf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/cf.png -------------------------------------------------------------------------------- /res/to_copy/flags/cg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/cg.png -------------------------------------------------------------------------------- /res/to_copy/flags/ch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ch.png -------------------------------------------------------------------------------- /res/to_copy/flags/ci.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ci.png -------------------------------------------------------------------------------- /res/to_copy/flags/ck.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ck.png -------------------------------------------------------------------------------- /res/to_copy/flags/cl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/cl.png -------------------------------------------------------------------------------- /res/to_copy/flags/cm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/cm.png -------------------------------------------------------------------------------- /res/to_copy/flags/cn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/cn.png -------------------------------------------------------------------------------- /res/to_copy/flags/co.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/co.png -------------------------------------------------------------------------------- /res/to_copy/flags/cp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/cp.png -------------------------------------------------------------------------------- /res/to_copy/flags/cr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/cr.png -------------------------------------------------------------------------------- /res/to_copy/flags/cu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/cu.png -------------------------------------------------------------------------------- /res/to_copy/flags/cv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/cv.png -------------------------------------------------------------------------------- /res/to_copy/flags/cw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/cw.png -------------------------------------------------------------------------------- /res/to_copy/flags/cx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/cx.png -------------------------------------------------------------------------------- /res/to_copy/flags/cy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/cy.png -------------------------------------------------------------------------------- /res/to_copy/flags/cz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/cz.png -------------------------------------------------------------------------------- /res/to_copy/flags/de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/de.png -------------------------------------------------------------------------------- /res/to_copy/flags/dg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/dg.png -------------------------------------------------------------------------------- /res/to_copy/flags/dj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/dj.png -------------------------------------------------------------------------------- /res/to_copy/flags/dk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/dk.png -------------------------------------------------------------------------------- /res/to_copy/flags/dm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/dm.png -------------------------------------------------------------------------------- /res/to_copy/flags/do.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/do.png -------------------------------------------------------------------------------- /res/to_copy/flags/dz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/dz.png -------------------------------------------------------------------------------- /res/to_copy/flags/ea.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ea.png -------------------------------------------------------------------------------- /res/to_copy/flags/ec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ec.png -------------------------------------------------------------------------------- /res/to_copy/flags/ee.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ee.png -------------------------------------------------------------------------------- /res/to_copy/flags/eg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/eg.png -------------------------------------------------------------------------------- /res/to_copy/flags/eh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/eh.png -------------------------------------------------------------------------------- /res/to_copy/flags/er.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/er.png -------------------------------------------------------------------------------- /res/to_copy/flags/es-ct.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/es-ct.png -------------------------------------------------------------------------------- /res/to_copy/flags/es-ga.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/es-ga.png -------------------------------------------------------------------------------- /res/to_copy/flags/es.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/es.png -------------------------------------------------------------------------------- /res/to_copy/flags/et.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/et.png -------------------------------------------------------------------------------- /res/to_copy/flags/eu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/eu.png -------------------------------------------------------------------------------- /res/to_copy/flags/fi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/fi.png -------------------------------------------------------------------------------- /res/to_copy/flags/fj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/fj.png -------------------------------------------------------------------------------- /res/to_copy/flags/fk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/fk.png -------------------------------------------------------------------------------- /res/to_copy/flags/fm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/fm.png -------------------------------------------------------------------------------- /res/to_copy/flags/fo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/fo.png -------------------------------------------------------------------------------- /res/to_copy/flags/fr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/fr.png -------------------------------------------------------------------------------- /res/to_copy/flags/ga.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ga.png -------------------------------------------------------------------------------- /res/to_copy/flags/gb-eng.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/gb-eng.png -------------------------------------------------------------------------------- /res/to_copy/flags/gb-nir.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/gb-nir.png -------------------------------------------------------------------------------- /res/to_copy/flags/gb-sct.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/gb-sct.png -------------------------------------------------------------------------------- /res/to_copy/flags/gb-wls.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/gb-wls.png -------------------------------------------------------------------------------- /res/to_copy/flags/gb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/gb.png -------------------------------------------------------------------------------- /res/to_copy/flags/gd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/gd.png -------------------------------------------------------------------------------- /res/to_copy/flags/ge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ge.png -------------------------------------------------------------------------------- /res/to_copy/flags/gf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/gf.png -------------------------------------------------------------------------------- /res/to_copy/flags/gg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/gg.png -------------------------------------------------------------------------------- /res/to_copy/flags/gh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/gh.png -------------------------------------------------------------------------------- /res/to_copy/flags/gi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/gi.png -------------------------------------------------------------------------------- /res/to_copy/flags/gl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/gl.png -------------------------------------------------------------------------------- /res/to_copy/flags/gm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/gm.png -------------------------------------------------------------------------------- /res/to_copy/flags/gn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/gn.png -------------------------------------------------------------------------------- /res/to_copy/flags/gp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/gp.png -------------------------------------------------------------------------------- /res/to_copy/flags/gq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/gq.png -------------------------------------------------------------------------------- /res/to_copy/flags/gr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/gr.png -------------------------------------------------------------------------------- /res/to_copy/flags/gs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/gs.png -------------------------------------------------------------------------------- /res/to_copy/flags/gt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/gt.png -------------------------------------------------------------------------------- /res/to_copy/flags/gu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/gu.png -------------------------------------------------------------------------------- /res/to_copy/flags/gw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/gw.png -------------------------------------------------------------------------------- /res/to_copy/flags/gy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/gy.png -------------------------------------------------------------------------------- /res/to_copy/flags/hk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/hk.png -------------------------------------------------------------------------------- /res/to_copy/flags/hm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/hm.png -------------------------------------------------------------------------------- /res/to_copy/flags/hn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/hn.png -------------------------------------------------------------------------------- /res/to_copy/flags/hr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/hr.png -------------------------------------------------------------------------------- /res/to_copy/flags/ht.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ht.png -------------------------------------------------------------------------------- /res/to_copy/flags/hu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/hu.png -------------------------------------------------------------------------------- /res/to_copy/flags/ic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ic.png -------------------------------------------------------------------------------- /res/to_copy/flags/id.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/id.png -------------------------------------------------------------------------------- /res/to_copy/flags/ie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ie.png -------------------------------------------------------------------------------- /res/to_copy/flags/il.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/il.png -------------------------------------------------------------------------------- /res/to_copy/flags/im.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/im.png -------------------------------------------------------------------------------- /res/to_copy/flags/in.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/in.png -------------------------------------------------------------------------------- /res/to_copy/flags/io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/io.png -------------------------------------------------------------------------------- /res/to_copy/flags/iq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/iq.png -------------------------------------------------------------------------------- /res/to_copy/flags/ir.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ir.png -------------------------------------------------------------------------------- /res/to_copy/flags/is.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/is.png -------------------------------------------------------------------------------- /res/to_copy/flags/it.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/it.png -------------------------------------------------------------------------------- /res/to_copy/flags/je.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/je.png -------------------------------------------------------------------------------- /res/to_copy/flags/jm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/jm.png -------------------------------------------------------------------------------- /res/to_copy/flags/jo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/jo.png -------------------------------------------------------------------------------- /res/to_copy/flags/jp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/jp.png -------------------------------------------------------------------------------- /res/to_copy/flags/ke.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ke.png -------------------------------------------------------------------------------- /res/to_copy/flags/kg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/kg.png -------------------------------------------------------------------------------- /res/to_copy/flags/kh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/kh.png -------------------------------------------------------------------------------- /res/to_copy/flags/ki.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ki.png -------------------------------------------------------------------------------- /res/to_copy/flags/km.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/km.png -------------------------------------------------------------------------------- /res/to_copy/flags/kn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/kn.png -------------------------------------------------------------------------------- /res/to_copy/flags/kp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/kp.png -------------------------------------------------------------------------------- /res/to_copy/flags/kr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/kr.png -------------------------------------------------------------------------------- /res/to_copy/flags/kw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/kw.png -------------------------------------------------------------------------------- /res/to_copy/flags/ky.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ky.png -------------------------------------------------------------------------------- /res/to_copy/flags/kz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/kz.png -------------------------------------------------------------------------------- /res/to_copy/flags/la.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/la.png -------------------------------------------------------------------------------- /res/to_copy/flags/lb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/lb.png -------------------------------------------------------------------------------- /res/to_copy/flags/lc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/lc.png -------------------------------------------------------------------------------- /res/to_copy/flags/li.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/li.png -------------------------------------------------------------------------------- /res/to_copy/flags/lk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/lk.png -------------------------------------------------------------------------------- /res/to_copy/flags/lr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/lr.png -------------------------------------------------------------------------------- /res/to_copy/flags/ls.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ls.png -------------------------------------------------------------------------------- /res/to_copy/flags/lt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/lt.png -------------------------------------------------------------------------------- /res/to_copy/flags/lu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/lu.png -------------------------------------------------------------------------------- /res/to_copy/flags/lv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/lv.png -------------------------------------------------------------------------------- /res/to_copy/flags/ly.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ly.png -------------------------------------------------------------------------------- /res/to_copy/flags/ma.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ma.png -------------------------------------------------------------------------------- /res/to_copy/flags/mc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/mc.png -------------------------------------------------------------------------------- /res/to_copy/flags/md.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/md.png -------------------------------------------------------------------------------- /res/to_copy/flags/me.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/me.png -------------------------------------------------------------------------------- /res/to_copy/flags/mf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/mf.png -------------------------------------------------------------------------------- /res/to_copy/flags/mg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/mg.png -------------------------------------------------------------------------------- /res/to_copy/flags/mh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/mh.png -------------------------------------------------------------------------------- /res/to_copy/flags/mk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/mk.png -------------------------------------------------------------------------------- /res/to_copy/flags/ml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ml.png -------------------------------------------------------------------------------- /res/to_copy/flags/mm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/mm.png -------------------------------------------------------------------------------- /res/to_copy/flags/mn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/mn.png -------------------------------------------------------------------------------- /res/to_copy/flags/mo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/mo.png -------------------------------------------------------------------------------- /res/to_copy/flags/mp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/mp.png -------------------------------------------------------------------------------- /res/to_copy/flags/mq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/mq.png -------------------------------------------------------------------------------- /res/to_copy/flags/mr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/mr.png -------------------------------------------------------------------------------- /res/to_copy/flags/ms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ms.png -------------------------------------------------------------------------------- /res/to_copy/flags/mt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/mt.png -------------------------------------------------------------------------------- /res/to_copy/flags/mu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/mu.png -------------------------------------------------------------------------------- /res/to_copy/flags/mv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/mv.png -------------------------------------------------------------------------------- /res/to_copy/flags/mw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/mw.png -------------------------------------------------------------------------------- /res/to_copy/flags/mx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/mx.png -------------------------------------------------------------------------------- /res/to_copy/flags/my.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/my.png -------------------------------------------------------------------------------- /res/to_copy/flags/mz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/mz.png -------------------------------------------------------------------------------- /res/to_copy/flags/na.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/na.png -------------------------------------------------------------------------------- /res/to_copy/flags/nc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/nc.png -------------------------------------------------------------------------------- /res/to_copy/flags/ne.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ne.png -------------------------------------------------------------------------------- /res/to_copy/flags/nf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/nf.png -------------------------------------------------------------------------------- /res/to_copy/flags/ng.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ng.png -------------------------------------------------------------------------------- /res/to_copy/flags/ni.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ni.png -------------------------------------------------------------------------------- /res/to_copy/flags/nl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/nl.png -------------------------------------------------------------------------------- /res/to_copy/flags/no.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/no.png -------------------------------------------------------------------------------- /res/to_copy/flags/np.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/np.png -------------------------------------------------------------------------------- /res/to_copy/flags/nr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/nr.png -------------------------------------------------------------------------------- /res/to_copy/flags/nu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/nu.png -------------------------------------------------------------------------------- /res/to_copy/flags/nz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/nz.png -------------------------------------------------------------------------------- /res/to_copy/flags/om.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/om.png -------------------------------------------------------------------------------- /res/to_copy/flags/pa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/pa.png -------------------------------------------------------------------------------- /res/to_copy/flags/pe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/pe.png -------------------------------------------------------------------------------- /res/to_copy/flags/pf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/pf.png -------------------------------------------------------------------------------- /res/to_copy/flags/pg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/pg.png -------------------------------------------------------------------------------- /res/to_copy/flags/ph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ph.png -------------------------------------------------------------------------------- /res/to_copy/flags/pk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/pk.png -------------------------------------------------------------------------------- /res/to_copy/flags/pl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/pl.png -------------------------------------------------------------------------------- /res/to_copy/flags/pm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/pm.png -------------------------------------------------------------------------------- /res/to_copy/flags/pn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/pn.png -------------------------------------------------------------------------------- /res/to_copy/flags/pr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/pr.png -------------------------------------------------------------------------------- /res/to_copy/flags/ps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ps.png -------------------------------------------------------------------------------- /res/to_copy/flags/pt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/pt.png -------------------------------------------------------------------------------- /res/to_copy/flags/pw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/pw.png -------------------------------------------------------------------------------- /res/to_copy/flags/py.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/py.png -------------------------------------------------------------------------------- /res/to_copy/flags/qa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/qa.png -------------------------------------------------------------------------------- /res/to_copy/flags/re.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/re.png -------------------------------------------------------------------------------- /res/to_copy/flags/ro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ro.png -------------------------------------------------------------------------------- /res/to_copy/flags/rs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/rs.png -------------------------------------------------------------------------------- /res/to_copy/flags/ru.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ru.png -------------------------------------------------------------------------------- /res/to_copy/flags/rw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/rw.png -------------------------------------------------------------------------------- /res/to_copy/flags/sa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/sa.png -------------------------------------------------------------------------------- /res/to_copy/flags/sb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/sb.png -------------------------------------------------------------------------------- /res/to_copy/flags/sc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/sc.png -------------------------------------------------------------------------------- /res/to_copy/flags/sd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/sd.png -------------------------------------------------------------------------------- /res/to_copy/flags/se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/se.png -------------------------------------------------------------------------------- /res/to_copy/flags/sg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/sg.png -------------------------------------------------------------------------------- /res/to_copy/flags/sh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/sh.png -------------------------------------------------------------------------------- /res/to_copy/flags/si.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/si.png -------------------------------------------------------------------------------- /res/to_copy/flags/sj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/sj.png -------------------------------------------------------------------------------- /res/to_copy/flags/sk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/sk.png -------------------------------------------------------------------------------- /res/to_copy/flags/sl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/sl.png -------------------------------------------------------------------------------- /res/to_copy/flags/sm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/sm.png -------------------------------------------------------------------------------- /res/to_copy/flags/sn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/sn.png -------------------------------------------------------------------------------- /res/to_copy/flags/so.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/so.png -------------------------------------------------------------------------------- /res/to_copy/flags/sr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/sr.png -------------------------------------------------------------------------------- /res/to_copy/flags/ss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ss.png -------------------------------------------------------------------------------- /res/to_copy/flags/st.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/st.png -------------------------------------------------------------------------------- /res/to_copy/flags/sv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/sv.png -------------------------------------------------------------------------------- /res/to_copy/flags/sx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/sx.png -------------------------------------------------------------------------------- /res/to_copy/flags/sy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/sy.png -------------------------------------------------------------------------------- /res/to_copy/flags/sz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/sz.png -------------------------------------------------------------------------------- /res/to_copy/flags/ta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ta.png -------------------------------------------------------------------------------- /res/to_copy/flags/tc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/tc.png -------------------------------------------------------------------------------- /res/to_copy/flags/td.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/td.png -------------------------------------------------------------------------------- /res/to_copy/flags/tf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/tf.png -------------------------------------------------------------------------------- /res/to_copy/flags/tg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/tg.png -------------------------------------------------------------------------------- /res/to_copy/flags/th.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/th.png -------------------------------------------------------------------------------- /res/to_copy/flags/tj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/tj.png -------------------------------------------------------------------------------- /res/to_copy/flags/tk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/tk.png -------------------------------------------------------------------------------- /res/to_copy/flags/tl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/tl.png -------------------------------------------------------------------------------- /res/to_copy/flags/tm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/tm.png -------------------------------------------------------------------------------- /res/to_copy/flags/tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/tn.png -------------------------------------------------------------------------------- /res/to_copy/flags/to.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/to.png -------------------------------------------------------------------------------- /res/to_copy/flags/tr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/tr.png -------------------------------------------------------------------------------- /res/to_copy/flags/tt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/tt.png -------------------------------------------------------------------------------- /res/to_copy/flags/tv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/tv.png -------------------------------------------------------------------------------- /res/to_copy/flags/tw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/tw.png -------------------------------------------------------------------------------- /res/to_copy/flags/tz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/tz.png -------------------------------------------------------------------------------- /res/to_copy/flags/ua.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ua.png -------------------------------------------------------------------------------- /res/to_copy/flags/ug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ug.png -------------------------------------------------------------------------------- /res/to_copy/flags/um.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/um.png -------------------------------------------------------------------------------- /res/to_copy/flags/un.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/un.png -------------------------------------------------------------------------------- /res/to_copy/flags/us.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/us.png -------------------------------------------------------------------------------- /res/to_copy/flags/uy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/uy.png -------------------------------------------------------------------------------- /res/to_copy/flags/uz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/uz.png -------------------------------------------------------------------------------- /res/to_copy/flags/va.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/va.png -------------------------------------------------------------------------------- /res/to_copy/flags/vc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/vc.png -------------------------------------------------------------------------------- /res/to_copy/flags/ve.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ve.png -------------------------------------------------------------------------------- /res/to_copy/flags/vg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/vg.png -------------------------------------------------------------------------------- /res/to_copy/flags/vi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/vi.png -------------------------------------------------------------------------------- /res/to_copy/flags/vn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/vn.png -------------------------------------------------------------------------------- /res/to_copy/flags/vu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/vu.png -------------------------------------------------------------------------------- /res/to_copy/flags/wf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/wf.png -------------------------------------------------------------------------------- /res/to_copy/flags/ws.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ws.png -------------------------------------------------------------------------------- /res/to_copy/flags/xk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/xk.png -------------------------------------------------------------------------------- /res/to_copy/flags/ye.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/ye.png -------------------------------------------------------------------------------- /res/to_copy/flags/yt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/yt.png -------------------------------------------------------------------------------- /res/to_copy/flags/za.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/za.png -------------------------------------------------------------------------------- /res/to_copy/flags/zm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/zm.png -------------------------------------------------------------------------------- /res/to_copy/flags/zw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/zw.png -------------------------------------------------------------------------------- /res/to_copy/flags/zz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/flags/zz.png -------------------------------------------------------------------------------- /res/to_copy/locales/en_US/winpinator.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/locales/en_US/winpinator.mo -------------------------------------------------------------------------------- /res/to_copy/locales/pl_PL/winpinator.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/to_copy/locales/pl_PL/winpinator.mo -------------------------------------------------------------------------------- /res/transfer_badge_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/transfer_badge_down.png -------------------------------------------------------------------------------- /res/transfer_badge_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/transfer_badge_up.png -------------------------------------------------------------------------------- /res/transfer_dir_dir.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/transfer_dir_dir.png -------------------------------------------------------------------------------- /res/transfer_dir_file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/transfer_dir_file.png -------------------------------------------------------------------------------- /res/transfer_dir_x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/transfer_dir_x.png -------------------------------------------------------------------------------- /res/transfer_failed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/transfer_failed.png -------------------------------------------------------------------------------- /res/transfer_file_file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/transfer_file_file.png -------------------------------------------------------------------------------- /res/transfer_file_x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/transfer_file_x.png -------------------------------------------------------------------------------- /res/transfer_status_cancelled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/transfer_status_cancelled.png -------------------------------------------------------------------------------- /res/transfer_status_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/transfer_status_error.png -------------------------------------------------------------------------------- /res/transfer_status_success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/transfer_status_success.png -------------------------------------------------------------------------------- /res/transfer_succeeded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/transfer_succeeded.png -------------------------------------------------------------------------------- /res/tray_err.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/tray_err.ico -------------------------------------------------------------------------------- /res/tray_err16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/tray_err16.png -------------------------------------------------------------------------------- /res/tray_err32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/tray_err32.png -------------------------------------------------------------------------------- /res/tray_ok.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/tray_ok.ico -------------------------------------------------------------------------------- /res/tray_ok16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/tray_ok16.png -------------------------------------------------------------------------------- /res/tray_ok32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/tray_ok32.png -------------------------------------------------------------------------------- /res/tray_wait.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/tray_wait.ico -------------------------------------------------------------------------------- /res/tray_wait16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/tray_wait16.png -------------------------------------------------------------------------------- /res/tray_wait32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/tray_wait32.png -------------------------------------------------------------------------------- /res/unk_profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/unk_profile.png -------------------------------------------------------------------------------- /res/warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/res/warning.png -------------------------------------------------------------------------------- /src/globals.cpp: -------------------------------------------------------------------------------- 1 | #include "globals.hpp" 2 | 3 | std::unique_ptr Globals::s_inst = nullptr; 4 | 5 | Globals::Globals() 6 | { 7 | } 8 | 9 | Globals* Globals::get() 10 | { 11 | if ( !Globals::s_inst ) 12 | { 13 | Globals::s_inst = std::make_unique(); 14 | } 15 | 16 | return Globals::s_inst.get(); 17 | } 18 | 19 | void Globals::setWinpinatorServiceInstance( srv::WinpinatorService* inst ) 20 | { 21 | m_service = inst; 22 | } 23 | 24 | srv::WinpinatorService* Globals::getWinpinatorServiceInstance() const 25 | { 26 | return m_service; 27 | } 28 | -------------------------------------------------------------------------------- /src/globals.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "service/winpinator_service.hpp" 3 | 4 | #include 5 | 6 | /* 7 | This singleton holds references to globally available objects 8 | */ 9 | class Globals 10 | { 11 | friend std::unique_ptr std::make_unique(); 12 | 13 | private: 14 | static std::unique_ptr s_inst; 15 | 16 | srv::WinpinatorService* m_service; 17 | 18 | Globals(); 19 | 20 | public: 21 | static Globals* get(); 22 | 23 | void setWinpinatorServiceInstance( srv::WinpinatorService* srv ); 24 | srv::WinpinatorService* getWinpinatorServiceInstance() const; 25 | }; 26 | -------------------------------------------------------------------------------- /src/gui/about_dialog.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/src/gui/about_dialog.cpp -------------------------------------------------------------------------------- /src/gui/about_dialog.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | 5 | #include 6 | #include 7 | 8 | namespace gui 9 | { 10 | 11 | class AboutDialog : public wxDialog 12 | { 13 | public: 14 | explicit AboutDialog( wxWindow* parent ); 15 | 16 | private: 17 | static const wxString ABOUT_XML; 18 | 19 | wxPanel* m_banner; 20 | wxBitmap m_bannerBmp; 21 | wxFont m_versionFont; 22 | 23 | void loadBitmap(); 24 | void loadAboutText( wxRichTextCtrl* rt ); 25 | void createAboutPage( wxNotebook* nb ); 26 | void createLicensePage( wxNotebook* nb ); 27 | 28 | void onDpiChanged( wxDPIChangedEvent& event ); 29 | void onPaintBitmap( wxPaintEvent& event ); 30 | void onLinkClicked( wxHtmlLinkEvent& event ); 31 | }; 32 | 33 | }; 34 | -------------------------------------------------------------------------------- /src/gui/array_event.cpp: -------------------------------------------------------------------------------- 1 | #include "array_event.hpp" 2 | 3 | namespace gui 4 | { 5 | 6 | wxDEFINE_EVENT( EVT_ARRAY, ArrayEvent ); 7 | 8 | ArrayEvent::ArrayEvent( 9 | wxEventType commandType, int id ) 10 | : wxCommandEvent( commandType, id ) 11 | { 12 | } 13 | 14 | ArrayEvent::ArrayEvent( const ArrayEvent& other ) 15 | : wxCommandEvent( other ) 16 | { 17 | m_vector = other.m_vector; 18 | } 19 | 20 | wxEvent* ArrayEvent::Clone() const 21 | { 22 | return new ArrayEvent( *this ); 23 | } 24 | 25 | }; 26 | -------------------------------------------------------------------------------- /src/gui/array_event.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | #include 5 | #include 6 | 7 | namespace gui 8 | { 9 | 10 | class ArrayEvent; 11 | wxDECLARE_EVENT( EVT_ARRAY, ArrayEvent ); 12 | 13 | typedef void ( wxEvtHandler::*ArrayEventFunction )( ArrayEvent& ); 14 | #define ArrayHandler( func ) wxEVENT_HANDLER_CAST( ArrayEventFunction, func ) 15 | 16 | class ArrayEvent : public wxCommandEvent 17 | { 18 | public: 19 | explicit ArrayEvent( wxEventType commandType, int id = 0 ); 20 | ArrayEvent( const ArrayEvent& other ); 21 | 22 | virtual wxEvent* Clone() const override; 23 | 24 | template 25 | inline void setArray( const std::vector& vector ) 26 | { 27 | std::shared_ptr> clone 28 | = std::make_shared>( vector ); 29 | 30 | m_vector = std::static_pointer_cast( clone ); 31 | } 32 | 33 | template 34 | inline const std::vector& getArray() 35 | { 36 | const std::shared_ptr>& casted 37 | = std::static_pointer_cast>( m_vector ); 38 | 39 | return *casted; 40 | } 41 | 42 | private: 43 | std::shared_ptr m_vector; 44 | }; 45 | 46 | }; 47 | -------------------------------------------------------------------------------- /src/gui/autorun_setter.cpp: -------------------------------------------------------------------------------- 1 | #include "autorun_setter.hpp" 2 | 3 | #include 4 | 5 | namespace gui 6 | { 7 | 8 | const wxString AutorunSetter::KEY_NAME = "SOFTWARE\\Microsoft\\Windows" 9 | "\\CurrentVersion\\Run"; 10 | 11 | AutorunSetter::AutorunSetter( const wxString& appName, const wxString& command ) 12 | : m_appName( appName ) 13 | , m_command( command ) 14 | { 15 | m_runKey.SetName( wxRegKey::HKCU, KEY_NAME ); 16 | if ( !m_runKey.Open() ) 17 | { 18 | wxLogDebug( "Can't open Run registry key" ); 19 | } 20 | } 21 | 22 | bool AutorunSetter::isAutorunEnabled() const 23 | { 24 | if ( !m_runKey.IsOpened() ) 25 | { 26 | return false; 27 | } 28 | 29 | if ( !m_runKey.HasValue( m_appName ) ) 30 | { 31 | return false; 32 | } 33 | 34 | wxString value; 35 | m_runKey.QueryValue( m_appName, value ); 36 | 37 | return value == m_command; 38 | } 39 | 40 | void AutorunSetter::enableAutorun() 41 | { 42 | if ( !m_runKey.IsOpened() ) 43 | { 44 | return; 45 | } 46 | 47 | m_runKey.SetValue( m_appName, m_command ); 48 | } 49 | 50 | void AutorunSetter::disableAutorun() 51 | { 52 | if ( !m_runKey.IsOpened() ) 53 | { 54 | return; 55 | } 56 | 57 | m_runKey.DeleteValue( m_appName ); 58 | } 59 | 60 | }; 61 | -------------------------------------------------------------------------------- /src/gui/autorun_setter.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | #include 5 | 6 | namespace gui 7 | { 8 | 9 | class AutorunSetter 10 | { 11 | public: 12 | explicit AutorunSetter( const wxString& appName, const wxString& command ); 13 | bool isAutorunEnabled() const; 14 | void disableAutorun(); 15 | void enableAutorun(); 16 | 17 | private: 18 | static const wxString KEY_NAME; 19 | 20 | wxRegKey m_runKey; 21 | wxString m_appName; 22 | wxString m_command; 23 | }; 24 | 25 | }; 26 | -------------------------------------------------------------------------------- /src/gui/file_list_dialog.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "../service/database_types.hpp" 3 | 4 | #include 5 | #include 6 | 7 | namespace gui 8 | { 9 | 10 | class FileListDialog : public wxDialog 11 | { 12 | public: 13 | explicit FileListDialog( wxWindow* parent ); 14 | 15 | void setTransferData( int transferId, std::wstring targetId ); 16 | 17 | private: 18 | enum class MenuID 19 | { 20 | COPY_NAME = 1, 21 | COPY_TYPE, 22 | COPY_RELATIVE, 23 | COPY_ABSOLUTE 24 | }; 25 | 26 | static const wxString LABEL_TEXT; 27 | 28 | int m_transferId; 29 | std::wstring m_targetId; 30 | 31 | wxStaticText* m_label; 32 | wxTreeListCtrl* m_fileList; 33 | 34 | wxTreeListItem m_selectedItem; 35 | 36 | void updateLabelWrapping(); 37 | void setupColumns(); 38 | void loadPaths(); 39 | static wxString getElementType( const srv::db::TransferElement& element ); 40 | static void copyStringToClipboard( const wxString& string ); 41 | 42 | void onDialogInit( wxInitDialogEvent& event ); 43 | void onDialogResized( wxSizeEvent& event ); 44 | void onListRightClicked( wxTreeListEvent& event ); 45 | 46 | void onCopyNameClicked( wxCommandEvent& event ); 47 | void onCopyTypeClicked( wxCommandEvent& event ); 48 | void onCopyRelativeClicked( wxCommandEvent& event ); 49 | void onCopyAbsoluteClicked( wxCommandEvent& event ); 50 | }; 51 | 52 | }; 53 | -------------------------------------------------------------------------------- /src/gui/history_element_finished.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "history_item_icon.hpp" 3 | #include "history_std_bitmaps.hpp" 4 | #include "pointer_event.hpp" 5 | 6 | #include "../service/database_types.hpp" 7 | 8 | #include 9 | 10 | namespace gui 11 | { 12 | 13 | typedef srv::db::Transfer TransferData; 14 | 15 | wxDECLARE_EVENT( EVT_REMOVE, wxCommandEvent ); 16 | wxDECLARE_EVENT( EVT_OPEN_DIALOG, PointerEvent ); 17 | wxDECLARE_EVENT( EVT_CLOSE_DIALOG, PointerEvent ); 18 | 19 | class HistoryFinishedElement : public HistoryIconItem 20 | { 21 | public: 22 | explicit HistoryFinishedElement( wxWindow* parent, HistoryStdBitmaps* bitmaps ); 23 | 24 | void setData( const TransferData& newData ); 25 | const TransferData& getData() const; 26 | 27 | 28 | 29 | private: 30 | static const int ICON_SIZE; 31 | 32 | enum class MenuID 33 | { 34 | ID_OPEN = 1, 35 | ID_EXPLORER, 36 | ID_PATHS, 37 | ID_REMOVE 38 | }; 39 | 40 | HistoryStdBitmaps* m_bitmaps; 41 | TransferData m_data; 42 | wxFont m_bold; 43 | wxBrush m_brush; 44 | 45 | void onPaint( wxPaintEvent& event ); 46 | void onDoubleClicked( wxMouseEvent& event ); 47 | void onContextMenu( wxContextMenuEvent& event ); 48 | 49 | void onOpenClicked( wxCommandEvent& event ); 50 | void onShowInExplorerClicked( wxCommandEvent& event ); 51 | void onShowListClicked( wxCommandEvent& event ); 52 | void onRemoveClicked( wxCommandEvent& event ); 53 | 54 | wxString determineStatusString(); 55 | const wxBitmap& setupStatusDrawing( wxDC* dc ); 56 | 57 | void openElement(); 58 | }; 59 | 60 | }; 61 | -------------------------------------------------------------------------------- /src/gui/history_group_header.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "history_item.hpp" 3 | 4 | #include 5 | 6 | namespace gui 7 | { 8 | 9 | class HistoryGroupHeader : public HistoryItem 10 | { 11 | public: 12 | explicit HistoryGroupHeader( wxWindow* parent, const wxString& label ); 13 | 14 | void SetLabel( const wxString& label ) override; 15 | wxString GetLabel() const override; 16 | 17 | private: 18 | wxString m_label; 19 | wxPen m_pen; 20 | 21 | void updateSize(); 22 | 23 | void onPaint( wxPaintEvent& event ); 24 | void onSize( wxSizeEvent& event ); 25 | void onDpiChanged( wxDPIChangedEvent& event ); 26 | }; 27 | 28 | }; 29 | -------------------------------------------------------------------------------- /src/gui/history_item.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | namespace gui 5 | { 6 | 7 | /* 8 | This is the base class for all entries that show up in the 9 | transfer history box. It provides implementation for common 10 | behaviors, like drawing list item background on mouse hover. 11 | */ 12 | class HistoryItem : public wxPanel 13 | { 14 | public: 15 | HistoryItem( wxWindow* parent ); 16 | void updateHoverState( bool insideParent ); 17 | 18 | protected: 19 | void eraseNullSink( wxEraseEvent& event ); 20 | 21 | private: 22 | bool m_hovering; 23 | 24 | void refreshHoverState(); 25 | void onErase( wxEraseEvent& event ); 26 | }; 27 | 28 | }; 29 | -------------------------------------------------------------------------------- /src/gui/history_item_icon.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "history_item.hpp" 3 | #include "history_std_bitmaps.hpp" 4 | 5 | namespace gui 6 | { 7 | 8 | class HistoryIconItem : public HistoryItem 9 | { 10 | public: 11 | explicit HistoryIconItem( wxWindow* parent, HistoryStdBitmaps* bmps ); 12 | 13 | void setIsLast( bool isLast ); 14 | bool isLast() const; 15 | 16 | protected: 17 | void setIcons( int folderCount, int fileCount, const wxString& fileExt ); 18 | void setOutcoming( bool outcoming ); 19 | void setFinished( bool finished ); 20 | 21 | const wxBitmap& determineBitmapToDraw() const; 22 | wxString determineHeaderString() const; 23 | 24 | wxString getElementType() const; 25 | 26 | wxCoord drawIcon( wxPaintDC& dc ); // Returns content offset in pixels 27 | 28 | private: 29 | static const int ICON_SIZE; 30 | 31 | HistoryStdBitmaps* m_bitmaps; 32 | wxString m_singleElementName; 33 | int m_folderCount; 34 | int m_fileCount; 35 | bool m_outcoming; 36 | bool m_last; 37 | bool m_finished; 38 | 39 | wxIcon m_fileIcon; 40 | wxIconLocation m_fileIconLoc; 41 | 42 | wxString m_elementType; 43 | 44 | void onDpiChanged( wxDPIChangedEvent& event ); 45 | void setupElementType(); 46 | }; 47 | 48 | }; 49 | -------------------------------------------------------------------------------- /src/gui/history_std_bitmaps.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | namespace gui 5 | { 6 | 7 | struct HistoryStdBitmaps 8 | { 9 | wxBitmap transferFileX; 10 | wxBitmap transferFileFile; 11 | wxBitmap transferDirX; 12 | wxBitmap transferDirDir; 13 | wxBitmap transferDirFile; 14 | 15 | wxBitmap badgeUp; 16 | wxBitmap badgeDown; 17 | 18 | wxBitmap statusSuccess; 19 | wxBitmap statusCancelled; 20 | wxBitmap statusError; 21 | 22 | wxPen separatorPen; 23 | }; 24 | 25 | }; 26 | -------------------------------------------------------------------------------- /src/gui/host_listbox.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "../service/remote_info.hpp" 3 | 4 | #include 5 | #include 6 | 7 | #include 8 | #include 9 | 10 | 11 | namespace gui 12 | { 13 | 14 | struct HostItem 15 | { 16 | std::string id; 17 | 18 | std::shared_ptr profilePic; 19 | std::shared_ptr profileBmp; 20 | wxString username; 21 | wxString hostname; 22 | wxString ipAddress; 23 | wxString os; 24 | srv::RemoteStatus state; 25 | }; 26 | 27 | class HostListbox : public wxVListBox 28 | { 29 | public: 30 | explicit HostListbox( wxWindow* parent ); 31 | 32 | void addItem( const HostItem& item ); 33 | void updateItem( size_t position, const HostItem& item ); 34 | bool updateItemById( const HostItem& newData ); 35 | void removeItem( size_t position ); 36 | void clear(); 37 | 38 | wxString getSelectedIdent() const; 39 | 40 | protected: 41 | virtual void OnDrawItem( wxDC& dc, const wxRect& rect, size_t n ) const; 42 | virtual void OnDrawBackground( wxDC& dc, 43 | const wxRect& rect, size_t n ) const; 44 | virtual wxCoord OnMeasureItem( size_t n ) const; 45 | 46 | private: 47 | std::vector m_items; 48 | wxBitmap m_defaultPic; 49 | wxCoord m_rowHeight; 50 | int m_hotItem; 51 | 52 | void onDpiChanged( wxDPIChangedEvent& event ); 53 | void onMouseMotion( wxMouseEvent& event ); 54 | void onRightClick( wxMouseEvent& event ); 55 | 56 | void loadIcons(); 57 | void calcRowHeight(); 58 | bool scaleProfilePic( HostItem& item ) const; 59 | }; 60 | 61 | }; 62 | -------------------------------------------------------------------------------- /src/gui/language_adapter.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | #include 5 | 6 | #include 7 | 8 | namespace gui 9 | { 10 | 11 | class LanguageAdapter 12 | { 13 | public: 14 | struct LanguageInfo 15 | { 16 | wxString flagPath; 17 | wxString localName; 18 | wxString icuCode; 19 | }; 20 | 21 | LanguageAdapter(); 22 | std::vector getAllLanguages(); 23 | const LanguageInfo& getLanguageInfoByIndex( size_t index ); 24 | 25 | private: 26 | wxXmlDocument m_langListDoc; 27 | wxString m_executableFolder; 28 | bool m_dataReady; 29 | std::vector m_data; 30 | 31 | void openLanguageFile(); 32 | void loadData(); 33 | LanguageInfo parseLanguage( wxXmlNode* node ); 34 | }; 35 | 36 | }; 37 | -------------------------------------------------------------------------------- /src/gui/network_interface_adapter.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | 5 | namespace gui 6 | { 7 | 8 | class NetworkInterfaceAdapter 9 | { 10 | public: 11 | struct InetInfo 12 | { 13 | int id; 14 | std::string name; 15 | std::wstring displayName; 16 | bool defaultInterface; 17 | 18 | int metricV4; 19 | int metricV6; 20 | }; 21 | 22 | NetworkInterfaceAdapter(); 23 | std::vector getAllInterfaces(); 24 | std::string getDefaultInterfaceName(); 25 | 26 | private: 27 | bool m_dataReady; 28 | std::vector m_data; 29 | 30 | void loadData(); 31 | }; 32 | 33 | }; 34 | -------------------------------------------------------------------------------- /src/gui/page_error.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "../service/service_errors.hpp" 3 | 4 | #include 5 | 6 | namespace gui 7 | { 8 | 9 | wxDECLARE_EVENT( EVT_OPEN_SETTINGS, wxCommandEvent ); 10 | 11 | class ErrorPage : public wxPanel 12 | { 13 | public: 14 | explicit ErrorPage( wxWindow* parent ); 15 | 16 | void setServiceError( srv::ServiceError err ); 17 | srv::ServiceError getServiceError() const; 18 | 19 | private: 20 | static const wxString TEXT; 21 | 22 | srv::ServiceError m_srvError; 23 | 24 | wxStaticBitmap* m_icon; 25 | wxStaticText* m_label; 26 | wxTextCtrl* m_description; 27 | wxButton* m_retryBtn; 28 | wxButton* m_settingsBtn; 29 | wxBitmap m_iconBmp; 30 | 31 | void onDpiChanged( wxDPIChangedEvent& event ); 32 | void onRetryClicked( wxCommandEvent& event ); 33 | void onSettingsClicked( wxCommandEvent& event ); 34 | 35 | void loadIcon(); 36 | void updateLabel(); 37 | }; 38 | 39 | }; 40 | -------------------------------------------------------------------------------- /src/gui/page_nohosts.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | 5 | namespace gui 6 | { 7 | 8 | class NoHostsPage : public wxPanel 9 | { 10 | public: 11 | explicit NoHostsPage( wxWindow* parent ); 12 | 13 | private: 14 | static const wxString TEXT; 15 | 16 | wxStaticBitmap* m_icon; 17 | wxStaticText* m_label; 18 | wxButton* m_retryBtn; 19 | wxBitmap m_iconBmp; 20 | 21 | void onDpiChanged( wxDPIChangedEvent& event ); 22 | void onRetryClicked( wxCommandEvent& event ); 23 | 24 | void loadIcon(); 25 | }; 26 | 27 | }; 28 | -------------------------------------------------------------------------------- /src/gui/page_offline.cpp: -------------------------------------------------------------------------------- 1 | #include "page_offline.hpp" 2 | 3 | #include "../../win32/resource.h" 4 | #include "utils.hpp" 5 | 6 | 7 | namespace gui 8 | { 9 | 10 | wxString OfflinePage::TEXT = wxTRANSLATE( "It seems you're offline! Check your" 11 | " LAN connection..." ); 12 | 13 | OfflinePage::OfflinePage( wxWindow* parent ) 14 | : wxPanel( parent, wxID_ANY ) 15 | , m_icon( nullptr ) 16 | , m_label( nullptr ) 17 | , m_iconBmp( wxNullBitmap ) 18 | { 19 | wxBoxSizer* mainSizer = new wxBoxSizer( wxVERTICAL ); 20 | 21 | mainSizer->AddStretchSpacer(); 22 | 23 | m_icon = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap ); 24 | loadIcon(); 25 | mainSizer->Add( m_icon, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 8 ); 26 | 27 | m_label = new wxStaticText( this, wxID_ANY, wxGetTranslation( TEXT ), 28 | wxDefaultPosition, wxDefaultSize, wxELLIPSIZE_END ); 29 | wxFont labelFont = m_label->GetFont(); 30 | labelFont.MakeLarger(); 31 | labelFont.MakeLarger(); 32 | m_label->SetFont( labelFont ); 33 | mainSizer->Add( m_label, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 8 ); 34 | 35 | mainSizer->AddStretchSpacer(); 36 | 37 | SetSizer( mainSizer ); 38 | 39 | // Events 40 | 41 | Bind( wxEVT_DPI_CHANGED, &OfflinePage::onDpiChanged, this ); 42 | } 43 | 44 | void OfflinePage::onDpiChanged( wxDPIChangedEvent& event ) 45 | { 46 | loadIcon(); 47 | } 48 | 49 | void OfflinePage::loadIcon() 50 | { 51 | wxBitmap original; 52 | original.LoadFile( Utils::makeIntResource( IDB_WARNING ), 53 | wxBITMAP_TYPE_PNG_RESOURCE ); 54 | 55 | wxImage iconImg = original.ConvertToImage(); 56 | 57 | int targetSize = FromDIP( 80 ); 58 | 59 | m_iconBmp = iconImg.Scale( targetSize, targetSize, 60 | wxIMAGE_QUALITY_BICUBIC ); 61 | m_icon->SetBitmap( m_iconBmp ); 62 | } 63 | 64 | }; 65 | -------------------------------------------------------------------------------- /src/gui/page_offline.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | 5 | namespace gui 6 | { 7 | 8 | class OfflinePage : public wxPanel 9 | { 10 | public: 11 | explicit OfflinePage( wxWindow* parent ); 12 | 13 | private: 14 | static wxString TEXT; 15 | 16 | wxStaticBitmap* m_icon; 17 | wxStaticText* m_label; 18 | wxBitmap m_iconBmp; 19 | 20 | void onDpiChanged( wxDPIChangedEvent& event ); 21 | 22 | void loadIcon(); 23 | }; 24 | 25 | }; 26 | -------------------------------------------------------------------------------- /src/gui/page_starting.cpp: -------------------------------------------------------------------------------- 1 | #include "page_starting.hpp" 2 | 3 | #include "utils.hpp" 4 | 5 | namespace gui 6 | { 7 | 8 | StartingPage::StartingPage( wxWindow* parent ) 9 | : wxPanel( parent, wxID_ANY ) 10 | , m_indicator( nullptr ) 11 | , m_label( nullptr ) 12 | { 13 | wxBoxSizer* mainSizer = new wxBoxSizer( wxVERTICAL ); 14 | 15 | mainSizer->AddStretchSpacer(); 16 | 17 | m_indicator = new wxActivityIndicator( this, wxID_ANY, wxDefaultPosition, 18 | FromDIP( wxSize( 64, 64 ) ) ); 19 | m_indicator->Start(); 20 | mainSizer->Add( m_indicator, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 8 ); 21 | 22 | m_label = new wxStaticText( this, wxID_ANY, _( "Starting Winpinator..." )); 23 | wxFont labelFont = m_label->GetFont(); 24 | labelFont.MakeLarger(); 25 | labelFont.MakeLarger(); 26 | m_label->SetFont( labelFont ); 27 | mainSizer->Add( m_label, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 8 ); 28 | 29 | mainSizer->AddStretchSpacer(); 30 | 31 | SetSizer( mainSizer ); 32 | } 33 | 34 | }; 35 | -------------------------------------------------------------------------------- /src/gui/page_starting.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | 5 | namespace gui 6 | { 7 | 8 | class StartingPage : public wxPanel 9 | { 10 | public: 11 | explicit StartingPage( wxWindow* parent ); 12 | 13 | private: 14 | wxActivityIndicator* m_indicator; 15 | wxStaticText* m_label; 16 | }; 17 | 18 | }; 19 | -------------------------------------------------------------------------------- /src/gui/page_transferlist.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | #include "../service/service_observer.hpp" 5 | #include "status_text.hpp" 6 | #include "tool_button.hpp" 7 | #include "transfer_history.hpp" 8 | 9 | #include 10 | 11 | namespace gui 12 | { 13 | 14 | wxDECLARE_EVENT( EVT_GO_BACK, wxCommandEvent ); 15 | 16 | class TransferListPage : public wxPanel, srv::IServiceObserver 17 | { 18 | public: 19 | explicit TransferListPage( wxWindow* parent, const wxString& targetId ); 20 | 21 | wxString getTargetId() const; 22 | void scrollToTop(); 23 | 24 | void requestFileTransfer( const std::vector& list ); 25 | 26 | private: 27 | wxString m_target; 28 | 29 | wxStaticText* m_header; 30 | wxStaticText* m_details; 31 | ToolButton* m_backBtn; 32 | ToolButton* m_fileBtn; 33 | ToolButton* m_directoryBtn; 34 | ToolButton* m_historyBtn; 35 | wxPanel* m_opPanel; 36 | ScrolledTransferHistory* m_opList; 37 | StatusText* m_statusLabel; 38 | 39 | wxBitmap m_backBmp; 40 | wxBitmap m_fileBmp; 41 | wxBitmap m_dirBmp; 42 | wxBitmap m_historyBmp; 43 | 44 | void loadIcons(); 45 | void loadSingleIcon( const wxString& res, wxBitmap* loc, ToolButton* btn ); 46 | 47 | void onDpiChanged( wxDPIChangedEvent& event ); 48 | void onBackClicked( wxCommandEvent& event ); 49 | void onUpdateStatus( wxThreadEvent& event ); 50 | void onSendFileClicked( wxCommandEvent& event ); 51 | void onSendFolderClicked( wxCommandEvent& event ); 52 | void onClearHistoryClicked( wxCommandEvent& event ); 53 | void onUpdateEmptyState( wxCommandEvent& event ); 54 | 55 | void onStateChanged() override; 56 | void onEditHost( srv::RemoteInfoPtr newInfo ) override; 57 | 58 | void updateForStatus( srv::RemoteStatus status ); 59 | }; 60 | 61 | }; 62 | -------------------------------------------------------------------------------- /src/gui/permission_picker.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | namespace gui 5 | { 6 | 7 | class PermissionPicker : public wxPanel 8 | { 9 | public: 10 | explicit PermissionPicker( wxWindow* parent, bool directory ); 11 | 12 | void setLabel( const wxString& label ); 13 | wxString getLabel() const; 14 | 15 | void setLabelWidth( int width ); 16 | int getLabelWidth() const; 17 | 18 | void setPermissionMask( int mask ); 19 | int getPermissionMask() const; 20 | 21 | private: 22 | wxCheckBox* m_checkboxes[9]; 23 | wxSizerItem* m_offset; 24 | wxString m_label; 25 | wxStaticText* m_labelCtrl; 26 | int m_labelWidth; 27 | }; 28 | 29 | }; 30 | -------------------------------------------------------------------------------- /src/gui/pointer_event.cpp: -------------------------------------------------------------------------------- 1 | #include "pointer_event.hpp" 2 | 3 | namespace gui 4 | { 5 | 6 | wxDEFINE_EVENT( EVT_POINTER, PointerEvent ); 7 | 8 | PointerEvent::PointerEvent( 9 | wxEventType commandType, int id ) 10 | : wxCommandEvent( commandType, id ) 11 | { 12 | } 13 | 14 | PointerEvent::PointerEvent( const PointerEvent& other ) 15 | : wxCommandEvent( other ) 16 | { 17 | m_pointer = other.m_pointer; 18 | } 19 | 20 | wxEvent* PointerEvent::Clone() const 21 | { 22 | return new PointerEvent( *this ); 23 | } 24 | 25 | }; 26 | -------------------------------------------------------------------------------- /src/gui/pointer_event.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | #include 5 | 6 | namespace gui 7 | { 8 | 9 | class PointerEvent; 10 | wxDECLARE_EVENT( EVT_POINTER, PointerEvent ); 11 | 12 | typedef void ( wxEvtHandler::*PointerEventFunction )( PointerEvent& ); 13 | #define PointerHandler( func ) wxEVENT_HANDLER_CAST( PointerEventFunction, func ) 14 | 15 | class PointerEvent : public wxCommandEvent 16 | { 17 | public: 18 | explicit PointerEvent( wxEventType commandType = EVT_POINTER, int id = 0 ); 19 | PointerEvent( const PointerEvent& other ); 20 | 21 | virtual wxEvent* Clone() const override; 22 | 23 | template 24 | inline void setSharedPointer( std::shared_ptr ptr ) 25 | { 26 | m_pointer = std::static_pointer_cast( ptr ); 27 | } 28 | 29 | template 30 | inline std::shared_ptr getSharedPointer() const 31 | { 32 | return std::static_pointer_cast( m_pointer ); 33 | } 34 | 35 | private: 36 | std::shared_ptr m_pointer; 37 | }; 38 | 39 | }; 40 | -------------------------------------------------------------------------------- /src/gui/progress_label.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | #include "spritesheet_animator.hpp" 5 | 6 | 7 | namespace gui 8 | { 9 | 10 | class ProgressLabel : public wxPanel 11 | { 12 | public: 13 | ProgressLabel( wxWindow* parent, const wxString& label ); 14 | 15 | void setLabel( const wxString& newLabel ); 16 | wxString getLabel() const; 17 | 18 | private: 19 | wxBitmap m_bitmap; 20 | wxStaticText* m_stText; 21 | SpritesheetAnimator* m_anim; 22 | 23 | void loadImages(); 24 | void onDpiChanged( wxDPIChangedEvent& event ); 25 | }; 26 | 27 | }; 28 | -------------------------------------------------------------------------------- /src/gui/screen_selector.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "../service/service_observer.hpp" 3 | #include "page_error.hpp" 4 | #include "page_hostlist.hpp" 5 | #include "page_nohosts.hpp" 6 | #include "page_offline.hpp" 7 | #include "page_starting.hpp" 8 | #include "page_transferlist.hpp" 9 | #include "pointer_event.hpp" 10 | 11 | #include 12 | #include 13 | 14 | #include 15 | 16 | namespace gui 17 | { 18 | 19 | wxDECLARE_EVENT( EVT_UPDATE_BANNER_TARGET, PointerEvent ); 20 | wxDECLARE_EVENT( EVT_UPDATE_BANNER_QSIZE, wxCommandEvent ); 21 | 22 | class ScreenSelector : public wxPanel, srv::IServiceObserver 23 | { 24 | public: 25 | explicit ScreenSelector( wxWindow* parent ); 26 | 27 | bool showTransferScreen( const wxString& remoteId ); 28 | void setTransferList( const std::vector& paths ); 29 | 30 | // Service listeners 31 | 32 | virtual void onStateChanged(); 33 | 34 | private: 35 | enum class SelectorPage 36 | { 37 | STARTING, 38 | OFFLINE, 39 | HOST_LIST, 40 | NO_HOSTS, 41 | ERROR_PAGE, 42 | TRANSFER_LIST 43 | }; 44 | 45 | wxSimplebook* m_book; 46 | SelectorPage m_currentPage; 47 | 48 | StartingPage* m_page0; 49 | OfflinePage* m_page1; 50 | HostListPage* m_page2; 51 | NoHostsPage* m_page3; 52 | ErrorPage* m_page4; 53 | TransferListPage* m_page5; 54 | 55 | std::vector m_transferBuffer; 56 | 57 | void onChangePage( wxThreadEvent& event ); 58 | void onNoHostsInTime( wxCommandEvent& event ); 59 | void onTargetSelected( wxCommandEvent& event ); 60 | void onRetryClicked( wxCommandEvent& event ); 61 | 62 | virtual void onHostCountChanged( size_t newCount ) override; 63 | 64 | void onTransferBackClicked( wxCommandEvent& event ); 65 | 66 | void changePage( SelectorPage newPage ); 67 | void removeTransferListPage(); 68 | void setupTransferListPage( const wxString& targetId, bool useBuffer = false ); 69 | 70 | void setupTransferScreenEvents(); 71 | }; 72 | 73 | }; 74 | -------------------------------------------------------------------------------- /src/gui/scrollable_restorable.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | namespace gui 5 | { 6 | 7 | class ScrollableRestorable 8 | { 9 | public: 10 | virtual void saveScrollPosition() = 0; 11 | virtual void restoreScrollPosition() = 0; 12 | 13 | protected: 14 | wxPoint m_scrollPos; 15 | }; 16 | 17 | }; 18 | -------------------------------------------------------------------------------- /src/gui/spritesheet_animator.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | namespace gui 5 | { 6 | 7 | class SpritesheetAnimator : public wxWindow 8 | { 9 | public: 10 | explicit SpritesheetAnimator( wxWindow* parent ); 11 | 12 | void setBitmap( const wxBitmap& bmp ); 13 | const wxBitmap& getBitmap() const; 14 | 15 | void setIntervalMs( int millis ); 16 | int getIntervalMs() const; 17 | 18 | void startAnimation(); 19 | void stopAnimation(); 20 | bool isPlaying() const; 21 | 22 | void DoEnable( bool enable ) override; 23 | 24 | private: 25 | wxBitmap m_bitmap; 26 | wxMemoryDC m_memDc; 27 | wxTimer m_timer; 28 | int m_interval; 29 | int m_currentFrame; 30 | bool m_playing; 31 | 32 | void onPaint( wxPaintEvent& event ); 33 | void onSize( wxSizeEvent& event ); 34 | void onTimerTick( wxTimerEvent& event ); 35 | }; 36 | 37 | }; 38 | -------------------------------------------------------------------------------- /src/gui/status_text.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | #include "../service/remote_info.hpp" 5 | 6 | namespace gui 7 | { 8 | 9 | class StatusText : public wxPanel 10 | { 11 | public: 12 | explicit StatusText( wxWindow* panel ); 13 | 14 | void setStatus( srv::RemoteStatus status ); 15 | srv::RemoteStatus getStatus() const; 16 | 17 | wxColour getBarColor() const; 18 | 19 | private: 20 | srv::RemoteStatus m_status; 21 | 22 | wxStaticText* m_label; 23 | 24 | wxColour m_accentColor; 25 | wxColour m_bgColor; 26 | 27 | wxBrush m_rectBrush; 28 | wxPen m_linePen; 29 | 30 | void setColors( wxColour accentColor, wxColour bgColor ); 31 | 32 | void onPaint( wxPaintEvent& event ); 33 | void onSize( wxSizeEvent& event ); 34 | void onDpiChanged( wxDPIChangedEvent& event ); 35 | }; 36 | 37 | }; 38 | -------------------------------------------------------------------------------- /src/gui/tool_button.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | 5 | namespace gui 6 | { 7 | 8 | class ToolButton : public wxButton 9 | { 10 | public: 11 | ToolButton( wxWindow* parent, wxWindowID id, 12 | const wxString& label = wxEmptyString, 13 | const wxPoint& pos = wxDefaultPosition, 14 | const wxSize& size = wxDefaultSize, 15 | long style = 0, 16 | const wxValidator& validator = wxDefaultValidator, 17 | const wxString& name = wxASCII_STR( wxButtonNameStr ) ); 18 | 19 | private: 20 | bool m_hovering; 21 | bool m_pressed; 22 | bool m_focus; 23 | 24 | void onPaint( wxPaintEvent& event ); 25 | bool MSWOnDraw( WXDRAWITEMSTRUCT* wxdis ); 26 | }; 27 | 28 | }; 29 | -------------------------------------------------------------------------------- /src/gui/transfer_speed_calculator.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | 5 | namespace gui 6 | { 7 | 8 | class TransferSpeedCalculator 9 | { 10 | public: 11 | explicit TransferSpeedCalculator(); 12 | 13 | void reset( long long currentBytes, long long totalBytes ); 14 | void update( long long currentBytes ); 15 | 16 | long long getTransferSpeedInBps() const; 17 | int getRemainingTimeInSeconds() const; 18 | 19 | private: 20 | struct DataPoint 21 | { 22 | long long bytes; 23 | std::chrono::steady_clock::time_point time; 24 | }; 25 | 26 | static const int WEIGHT_RAMP_MILLIS; 27 | static const int MIN_DATA_POINTS; 28 | 29 | std::list m_points; 30 | std::list m_timePoints; 31 | 32 | long long m_totalBytes; 33 | long long m_bytesPerSec; 34 | int m_remainingSeconds; 35 | 36 | void removeOldestPoints( std::chrono::steady_clock::time_point time ); 37 | void recalculateSpeedAndTime(); 38 | void calculateTime( long long current ); 39 | }; 40 | 41 | }; 42 | -------------------------------------------------------------------------------- /src/gui/utils.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "../service/remote_info.hpp" 3 | 4 | #include 5 | 6 | #include 7 | #include 8 | 9 | 10 | namespace gui 11 | { 12 | 13 | class Utils 14 | { 15 | public: 16 | static const wxColour GREEN_ACCENT; 17 | static const wxColour GREEN_BACKGROUND; 18 | static const wxColour ORANGE_ACCENT; 19 | static const wxColour ORANGE_BACKGROUND; 20 | static const wxColour RED_ACCENT; 21 | static const wxColour RED_BACKGROUND; 22 | 23 | static const wxString VERSION; 24 | 25 | static Utils* get(); 26 | static wxString makeIntResource( int resource ); 27 | 28 | const wxFont& getHeaderFont() const; 29 | wxColour getHeaderColor() const; 30 | 31 | static void drawTextEllipse( wxDC& dc, const wxString& text, 32 | const wxPoint& pnt, const wxCoord maxWidth ); 33 | 34 | static wxString getStatusString( srv::RemoteStatus status ); 35 | 36 | static wxIcon extractIconWithSize( const wxIconLocation& loc, wxCoord dim ); 37 | static bool getIconDimensions( HICON hico, SIZE* psiz ); 38 | 39 | static wxString fileSizeToString( long long bytes ); 40 | static wxString formatDate( uint64_t timestamp, std::string format ); 41 | 42 | static void openDirectoryInExplorer( const wxString& directory ); 43 | static bool openExplorerWithSelectedFiles( 44 | const wxString& parentDirectory, const std::vector& children ); 45 | 46 | private: 47 | // We need a friend to create a unique_ptr 48 | friend std::unique_ptr std::make_unique(); 49 | 50 | Utils(); 51 | 52 | static std::unique_ptr s_inst; 53 | 54 | wxFont m_headerFont; 55 | wxColour m_headerColor; 56 | }; 57 | 58 | }; -------------------------------------------------------------------------------- /src/gui/winpinator_banner.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | #include "../service/remote_info.hpp" 5 | 6 | #include 7 | 8 | namespace gui 9 | { 10 | 11 | class WinpinatorBanner : public wxPanel 12 | { 13 | public: 14 | WinpinatorBanner( wxWindow* parent, int height ); 15 | 16 | void setTargetInfo( srv::RemoteInfoPtr targetPtr ); 17 | void setSendQueueSize( int size ); 18 | int getSendQueueSize() const; 19 | 20 | private: 21 | static wxColour s_gradient1; 22 | static wxColour s_gradient2; 23 | 24 | int m_height; 25 | std::unique_ptr m_headerFont; 26 | std::unique_ptr m_detailsFont; 27 | wxBitmap m_logo; 28 | 29 | bool m_targetMode; 30 | wxString m_targetName; 31 | wxString m_targetDetails; 32 | wxImage m_targetAvatarImg; 33 | wxBitmap m_targetAvatarBmp; 34 | 35 | int m_queueSize; 36 | 37 | void onDpiChanged( wxDPIChangedEvent& event ); 38 | void onDraw( wxPaintEvent& event ); 39 | void onSize( wxSizeEvent& event ); 40 | void loadResources(); 41 | void rescaleTargetAvatar(); 42 | 43 | void drawBasic( wxDC& dc ); 44 | void drawTargetInfo( wxDC& dc ); 45 | }; 46 | 47 | }; 48 | -------------------------------------------------------------------------------- /src/gui/winpinator_frame.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "../service/service_observer.hpp" 3 | #include "about_dialog.hpp" 4 | #include "file_list_dialog.hpp" 5 | #include "screen_selector.hpp" 6 | #include "settings_dialog.hpp" 7 | #include "winpinator_banner.hpp" 8 | 9 | #include 10 | 11 | #include 12 | 13 | namespace gui 14 | { 15 | 16 | wxDECLARE_EVENT( EVT_EXIT_APP_FROM_FRAME, wxCommandEvent ); 17 | 18 | class WinpinatorFrame : public wxFrame, srv::IServiceObserver 19 | { 20 | public: 21 | explicit WinpinatorFrame( wxWindow* parent ); 22 | 23 | bool showTransferScreen( const wxString& remoteId ); 24 | void killAllDialogs(); 25 | void putOnTop(); 26 | 27 | void setTransferList( const std::vector& paths ); 28 | 29 | private: 30 | static const wxString RELEASE_NOTES_FILENAME; 31 | 32 | wxMenuBar* m_menuBar; 33 | wxMenu* m_fileMenu; 34 | wxMenu* m_helpMenu; 35 | wxStatusBar* m_statusBar; 36 | 37 | WinpinatorBanner* m_banner; 38 | ScreenSelector* m_selector; 39 | 40 | AboutDialog* m_aboutDlg; 41 | SettingsDialog* m_settingsDlg; 42 | std::shared_ptr m_fileListDlg; 43 | 44 | void setupMenuBar(); 45 | void setupAccelTable(); 46 | 47 | void onMenuItemSelected( wxCommandEvent& event ); 48 | void onChangeStatusBarText( wxThreadEvent& event ); 49 | void onDpiChanged( wxDPIChangedEvent& event ); 50 | void onSettingsClicked( wxCommandEvent& event ); 51 | 52 | void onOpenFolderSelected(); 53 | void onPrefsSelected(); 54 | void onCloseSelected(); 55 | void onExitSelected(); 56 | void onHelpSelected(); 57 | void onShowReleaseNotesSelected(); 58 | void onAboutSelected(); 59 | 60 | void onUpdateBannerTarget( PointerEvent& event ); 61 | void onUpdateBannerQueueSize( wxCommandEvent& event ); 62 | 63 | void onDialogOpened( PointerEvent& event ); 64 | void onDialogClosed( PointerEvent& event ); 65 | 66 | virtual void onStateChanged(); 67 | virtual void onIpAddressChanged( std::string newIp ); 68 | }; 69 | 70 | }; 71 | -------------------------------------------------------------------------------- /src/main.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "gui/winpinator_frame.hpp" 3 | #include "running_instance_detector.hpp" 4 | #include "tray_icon.hpp" 5 | #include "winpinator_dde_server.hpp" 6 | 7 | #include 8 | #include 9 | 10 | #include 11 | #include 12 | #include 13 | 14 | #define NO_DECLARE_APP 15 | #include "main_base.hpp" 16 | 17 | class WinpinatorApp : public WinpinatorAppBase, srv::IServiceObserver 18 | { 19 | public: 20 | WinpinatorApp(); 21 | virtual bool OnInit() override; 22 | virtual int OnExit() override; 23 | 24 | private: 25 | enum class EventType 26 | { 27 | STATE_CHANGED, 28 | OPEN_TRANSFER_UI 29 | }; 30 | 31 | gui::WinpinatorFrame* m_topLvl; 32 | TrayIcon* m_trayIcon; 33 | std::thread m_srvThread; 34 | 35 | std::shared_ptr m_detector; 36 | std::unique_ptr m_ddeServer; 37 | 38 | void showMainFrame(); 39 | void onMainFrameDestroyed( wxWindowDestroyEvent& event ); 40 | void onDDEOpenCalled( wxCommandEvent& event ); 41 | void onRestore( wxCommandEvent& event ); 42 | void onServiceEvent( wxThreadEvent& event ); 43 | void onExitApp( wxCommandEvent& event ); 44 | void onOpenSaveFolder( wxCommandEvent& event ); 45 | void onSendFiles( gui::ArrayEvent& event ); 46 | 47 | void processSendFiles( const std::vector& list ); 48 | 49 | // Service observer methods: 50 | virtual void onStateChanged(); 51 | virtual void onOpenTransferUI( wxString remoteId ); 52 | }; 53 | 54 | wxDECLARE_APP( WinpinatorApp ); 55 | -------------------------------------------------------------------------------- /src/main_base.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "settings_model.hpp" 3 | 4 | #include 5 | 6 | #include 7 | 8 | class WinpinatorAppBase : public wxApp 9 | { 10 | public: 11 | SettingsModel m_settings; 12 | std::unique_ptr m_config; 13 | wxLocale m_locale; 14 | }; 15 | 16 | #ifndef NO_DECLARE_APP 17 | inline WinpinatorAppBase& GetApp() 18 | { 19 | return *static_cast( wxApp::GetInstance() ); 20 | } 21 | #endif 22 | -------------------------------------------------------------------------------- /src/running_instance_detector.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | 5 | #include 6 | #include 7 | 8 | class RunningInstanceDetector 9 | { 10 | public: 11 | RunningInstanceDetector( const std::string& lockFileName ); 12 | ~RunningInstanceDetector(); 13 | 14 | bool isAnotherInstanceRunning(); 15 | void free(); 16 | 17 | private: 18 | typedef uint32_t pid_type; 19 | 20 | std::shared_ptr m_handle; 21 | wxString m_path; 22 | bool m_anotherRunning; 23 | 24 | bool checkPidHasOurImageName( pid_type pid ); 25 | bool writeCurrentPidToFile(); 26 | }; 27 | -------------------------------------------------------------------------------- /src/service/account_picture_extractor.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | 5 | enum class ExtractorError 6 | { 7 | OK, 8 | REG_KEY_NOT_FOUND, 9 | AVATAR_NOT_FOUND, 10 | AVATAR_FILE_UNREADABLE 11 | }; 12 | 13 | class AccountPictureExtractor 14 | { 15 | public: 16 | AccountPictureExtractor(); 17 | bool process(); 18 | const wxImage& getLowResImage() const; 19 | const wxImage& getHighResImage() const; 20 | 21 | ExtractorError getProcessingError() const; 22 | 23 | private: 24 | static const wxString USER_KEY_NAME; 25 | static const wxString SYSTEM_KEY_NAME; 26 | 27 | ExtractorError m_error; 28 | wxImage m_loRes; 29 | wxImage m_hiRes; 30 | 31 | bool tryExtractingFromUserRegistry(); 32 | bool tryExtractingFromSystemRegistry(); 33 | 34 | wxString getCurrentUserSID(); 35 | }; 36 | -------------------------------------------------------------------------------- /src/service/database_manager.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "database_types.hpp" 3 | 4 | #include 5 | 6 | #include 7 | 8 | #include 9 | #include 10 | 11 | namespace srv 12 | { 13 | 14 | class DatabaseManager 15 | { 16 | public: 17 | explicit DatabaseManager( const wxString& dbFile ); 18 | ~DatabaseManager(); 19 | 20 | bool isDatabaseAvailable(); 21 | 22 | // Data query and modification functions 23 | 24 | bool addTransfer( const db::Transfer& record ); 25 | bool clearAllTransfers(); 26 | bool clearAllTransfersForRemote( std::string remoteId ); 27 | bool deleteTransfer( int id ); 28 | std::vector queryTransfers( bool queryPaths, 29 | const std::wstring targetId, const std::string conditions = "" ); 30 | db::Transfer getTransfer( int id, 31 | const std::wstring targetId, bool queryPaths ); 32 | 33 | bool updateTarget( const db::TargetInfo& target ); 34 | std::vector queryTargets(); 35 | bool removeTarget( const std::wstring& targetId ); 36 | bool removeAllTargets(); 37 | 38 | private: 39 | static const int TARGET_DB_VER; 40 | 41 | std::vector> m_updFunctions; 42 | std::mutex m_mutex; 43 | 44 | sqlite3* m_db; 45 | bool m_dbOpen; 46 | 47 | void setupUpdateFunctionVector(); 48 | bool enforceIntegrity(); 49 | 50 | void beginTransaction(); 51 | bool endTransaction( int result ); 52 | 53 | void queryTransferPaths( db::Transfer& record ); 54 | static inline void fixEnum( int& val, const int unkVal ); 55 | 56 | // Update functions 57 | void performUpdate( int currentLevel ); 58 | 59 | bool updateFromVer0ToVer1(); 60 | bool updateFromVer1ToVer2(); 61 | bool updateFromVer2ToVer3(); 62 | }; 63 | 64 | }; 65 | -------------------------------------------------------------------------------- /src/service/database_types.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | 5 | namespace srv 6 | { 7 | 8 | namespace db 9 | { 10 | 11 | enum class TransferElementType 12 | { 13 | FILE, 14 | FOLDER, 15 | UNKNOWN 16 | }; 17 | 18 | struct TransferElement 19 | { 20 | int id; 21 | 22 | TransferElementType elementType; 23 | std::wstring elementName; // File or folder name 24 | std::wstring relativePath; // Path relative to root of the transfer 25 | std::wstring absolutePath; // Absolute path of the element or empty 26 | }; 27 | 28 | enum class TransferStatus 29 | { 30 | SUCCEEDED, 31 | CANCELLED, 32 | FAILED, 33 | UNKNOWN 34 | }; 35 | 36 | enum class TransferType 37 | { 38 | SINGLE_FILE, 39 | MULTIPLE_FILES, 40 | SINGLE_DIRECTORY, 41 | MULTIPLE_DIRECTORIES, 42 | MIXED, 43 | UNFINISHED_INCOMING, 44 | UNKNOWN 45 | }; 46 | 47 | struct Transfer 48 | { 49 | int id; 50 | 51 | std::wstring targetId; 52 | std::wstring singleElementName; 53 | TransferType transferType; 54 | long long transferTimestamp; 55 | int fileCount; 56 | int folderCount; 57 | long long totalSizeBytes; 58 | bool outgoing; 59 | TransferStatus status; 60 | 61 | std::vector elements; 62 | }; 63 | 64 | struct TargetInfo 65 | { 66 | std::wstring targetId; 67 | std::wstring fullName; 68 | std::wstring hostname; 69 | std::wstring ip; 70 | std::wstring os; 71 | }; 72 | 73 | struct TargetInfoData : public TargetInfo 74 | { 75 | long long transferCount; 76 | }; 77 | 78 | }; 79 | 80 | }; 81 | -------------------------------------------------------------------------------- /src/service/database_utils.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | 5 | namespace srv 6 | { 7 | 8 | enum class TimeSpec 9 | { 10 | IN_THE_FUTURE, 11 | TODAY, 12 | YESTERDAY, 13 | THIS_WEEK, 14 | LAST_WEEK, 15 | THIS_MONTH, 16 | LAST_MONTH, 17 | THIS_YEAR, 18 | LAST_YEAR, 19 | BEFORE_LAST_YEAR 20 | }; 21 | 22 | class DatabaseUtils 23 | { 24 | public: 25 | DatabaseUtils() = delete; // Remove default constructor 26 | static std::string getSpecSQLCondition( 27 | const std::string fieldName, TimeSpec spec, std::time_t current = 0 ); 28 | 29 | private: 30 | static const std::time_t DAY; 31 | static void setMidnight( std::tm& tim ); 32 | static std::tm getWeekStart( const std::tm& tim ); 33 | static std::tm getMonthStart( const std::tm& tim ); 34 | static std::tm getYearStart( const std::tm& tim ); 35 | }; 36 | 37 | }; 38 | -------------------------------------------------------------------------------- /src/service/event.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "../settings_model.hpp" 3 | #include "../zeroconf/mdns_types.hpp" 4 | 5 | #include 6 | 7 | #include 8 | 9 | namespace zc 10 | { 11 | struct MdnsServiceData; 12 | } 13 | 14 | namespace srv 15 | { 16 | 17 | enum class EventType 18 | { 19 | STOP_SERVICE = 1, 20 | RESTART_SERVICE, 21 | REPEAT_MDNS_QUERY, 22 | HOST_ADDED, 23 | HOST_REMOVED, 24 | SHOW_TOAST_NOTIFICATION, 25 | ACCEPT_TRANSFER_CLICKED, 26 | DECLINE_TRANSFER_CLICKED, 27 | STOP_TRANSFER, 28 | REQUEST_OUTCOMING_TRANSFER, 29 | OUTCOMING_CRAWLER_SUCCEEDED, 30 | OUTCOMING_CRAWLER_FAILED 31 | }; 32 | 33 | struct TransferData 34 | { 35 | std::string remoteId; 36 | int transferId; 37 | }; 38 | 39 | struct OutcomingTransferData 40 | { 41 | std::string remoteId; 42 | std::vector droppedPaths; 43 | }; 44 | 45 | struct CrawlerOutputData 46 | { 47 | int jobId; 48 | std::wstring rootDir; 49 | std::shared_ptr> paths; 50 | std::vector topDirBasenamesUtf8; 51 | long long totalSize; 52 | int folderCount; 53 | int fileCount; 54 | }; 55 | 56 | class ToastNotification; 57 | 58 | struct Event 59 | { 60 | EventType type; 61 | struct 62 | { 63 | std::shared_ptr restartData; 64 | std::shared_ptr addedData; 65 | std::shared_ptr removedData; 66 | std::shared_ptr toastData; 67 | std::shared_ptr transferData; 68 | std::shared_ptr outcomingTransferData; 69 | int crawlerFailJobId; 70 | std::shared_ptr crawlerOutputData; 71 | } eventData; 72 | }; 73 | 74 | }; 75 | -------------------------------------------------------------------------------- /src/service/file_crawler.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | namespace srv 12 | { 13 | 14 | class FileCrawler 15 | { 16 | public: 17 | FileCrawler(); 18 | ~FileCrawler(); 19 | 20 | void setSendHiddenFiles( bool sendHidden ); 21 | bool isSendingHiddenFiles(); 22 | 23 | int startCrawlJob( const std::vector& paths ); 24 | void releaseCrawlJob( int jobId ); 25 | 26 | private: 27 | static const int MAX_RECURSION_DEPTH; 28 | static const long long BLOCK_SIZE; 29 | 30 | std::map m_jobs; 31 | std::mutex m_mtx; 32 | int m_lastJobId; 33 | bool m_sendHidden; 34 | 35 | void crawlJobMain( std::vector paths, int jobId ); 36 | 37 | std::wstring findRoot( const std::vector& paths ); 38 | wxFileName pathToFileName( const wxString& path ); 39 | void findAndUnwindElement( wxFileName elementLoc, 40 | wxFileName& currentLocation, wxFileName& relativeLoc, 41 | std::set* paths, bool sendHidden, 42 | long long& totalSize ); 43 | void performFilesystemDFS( wxFileName location, wxFileName relativeLoc, 44 | std::set* paths, bool sendHidden, 45 | long long& totalSize, int recursionLevel = 0 ); 46 | }; 47 | 48 | }; 49 | -------------------------------------------------------------------------------- /src/service/file_sender.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "transfer_types.hpp" 3 | #include "unix_permissions.hpp" 4 | #include "zlib_deflate.hpp" 5 | 6 | #include "../proto-gen/warp.grpc.pb.h" 7 | #include "../proto-gen/warp.pb.h" 8 | 9 | #include 10 | #include 11 | 12 | namespace srv 13 | { 14 | 15 | class FileSender 16 | { 17 | public: 18 | explicit FileSender( std::shared_ptr transfer, 19 | grpc::ServerWriter* writer ); 20 | void setCompressionLevel( int level ); 21 | int getCompressionLevel() const; 22 | 23 | void setUnixPermissionMasks( int file, int executable, int directory ); 24 | int getUnixFilePermissionMask(); 25 | int getUnixExecutablePermissionMask(); 26 | int getUnixDirectoryPermissionMask(); 27 | 28 | bool transferFiles( std::function onUpdate ); 29 | 30 | private: 31 | static const long long PROGRESS_FREQ_MILLIS; 32 | static const long long FILE_CHUNK_SIZE; 33 | static const std::vector EXECUTABLE_EXTENSIONS; 34 | 35 | std::shared_ptr m_transfer; 36 | grpc::ServerWriter* m_writer; 37 | int m_compressLvl; 38 | 39 | UnixPermissions m_filePerms; 40 | UnixPermissions m_execPerms; 41 | UnixPermissions m_dirPerms; 42 | 43 | ZlibDeflate m_compressor; 44 | 45 | bool sendSingleEntity( const std::wstring& root, 46 | const std::wstring& relativePath, std::function& onUpdate ); 47 | bool sendSingleFile( const std::wstring& root, 48 | const std::wstring& relativePath, std::function& onUpdate ); 49 | bool sendSingleDirectory( const std::wstring& root, 50 | const std::wstring& relativePath, std::function& onUpdate ); 51 | 52 | bool checkOpFailed(); 53 | void updateProgress( long long chunkBytes, std::function& onUpdate ); 54 | bool isFileExecutable( const std::string& chunk, 55 | const std::wstring& relativePath ); 56 | void waitIfPaused(); 57 | }; 58 | 59 | }; 60 | -------------------------------------------------------------------------------- /src/service/icon_extractor.cpp: -------------------------------------------------------------------------------- 1 | #include "icon_extractor.hpp" 2 | 3 | #include "../../win32/resource.h" 4 | #include "service_utils.hpp" 5 | 6 | #include 7 | #include 8 | 9 | namespace srv 10 | { 11 | 12 | void IconExtractor::extractIcons() 13 | { 14 | wxFileName fname( wxStandardPaths::Get().GetUserDataDir(), "icons" ); 15 | const wxString iconDir = fname.GetFullPath(); 16 | 17 | if ( !fname.Exists() ) 18 | { 19 | wxMkDir( iconDir ); 20 | } 21 | 22 | extractSingleIcon( iconDir, "transfer_dd.png", IDB_TRANSFER_DIR_DIR ); 23 | extractSingleIcon( iconDir, "transfer_df.png", IDB_TRANSFER_DIR_FILE ); 24 | extractSingleIcon( iconDir, "transfer_dx.png", IDB_TRANSFER_DIR_X ); 25 | extractSingleIcon( iconDir, "transfer_ff.png", IDB_TRANSFER_FILE_FILE ); 26 | extractSingleIcon( iconDir, "transfer_fx.png", IDB_TRANSFER_FILE_X ); 27 | extractSingleIcon( iconDir, "transfer_fail.png", IDB_TRANSFER_FAILED ); 28 | extractSingleIcon( iconDir, "transfer_ok.png", IDB_TRANSFER_SUCCEEDED ); 29 | } 30 | 31 | void IconExtractor::extractSingleIcon( const wxString& iconDir, 32 | const wxString& filename, int resourceId ) 33 | { 34 | wxFileName fname( iconDir, filename ); 35 | 36 | if ( fname.FileExists() ) 37 | { 38 | return; 39 | } 40 | 41 | wxBitmap bmp; 42 | bmp.LoadFile( Utils::makeIntResource( resourceId ), 43 | wxBITMAP_TYPE_PNG_RESOURCE ); 44 | 45 | wxImage img = bmp.ConvertToImage(); 46 | img.SaveFile( fname.GetFullPath(), wxBITMAP_TYPE_PNG ); 47 | } 48 | 49 | }; 50 | -------------------------------------------------------------------------------- /src/service/icon_extractor.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | namespace srv 5 | { 6 | 7 | class IconExtractor 8 | { 9 | public: 10 | static void extractIcons(); 11 | 12 | private: 13 | static void extractSingleIcon( const wxString& iconDir, 14 | const wxString& filename, int resourceId ); 15 | }; 16 | 17 | }; 18 | -------------------------------------------------------------------------------- /src/service/memory_manager.cpp: -------------------------------------------------------------------------------- 1 | #include "memory_manager.hpp" 2 | 3 | #include "../thread_name.hpp" 4 | 5 | namespace srv 6 | { 7 | 8 | std::unique_ptr MemoryManager::s_instance = nullptr; 9 | 10 | MemoryManager::MemoryManager() 11 | { 12 | m_thread = std::thread( std::bind( &MemoryManager::threadMain, this ) ); 13 | } 14 | 15 | MemoryManager* MemoryManager::getInstance() 16 | { 17 | if ( !s_instance ) 18 | { 19 | s_instance = std::make_unique(); 20 | } 21 | 22 | return s_instance.get(); 23 | } 24 | 25 | void MemoryManager::scheduleFreePointer( void* ptr ) 26 | { 27 | Event evnt; 28 | evnt.pointerToFree = ptr; 29 | evnt.shutdown = false; 30 | 31 | m_queue.Post( evnt ); 32 | } 33 | 34 | void MemoryManager::shutdownAndFreeAll() 35 | { 36 | Event evnt; 37 | evnt.shutdown = true; 38 | evnt.pointerToFree = nullptr; 39 | 40 | m_queue.Post( evnt ); 41 | 42 | m_thread.join(); 43 | } 44 | 45 | void MemoryManager::threadMain() 46 | { 47 | setThreadName( "MemoryManager loop" ); 48 | 49 | while ( true ) 50 | { 51 | Event evnt; 52 | m_queue.Receive( evnt ); 53 | 54 | if ( evnt.shutdown ) 55 | { 56 | break; 57 | } 58 | 59 | std::lock_guard lock( m_mtx ); 60 | m_pointers.erase( evnt.pointerToFree ); 61 | } 62 | 63 | std::lock_guard lock( m_mtx ); 64 | m_pointers.clear(); 65 | } 66 | 67 | }; 68 | 69 | -------------------------------------------------------------------------------- /src/service/memory_manager.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | namespace srv 9 | { 10 | 11 | class MemoryManager 12 | { 13 | friend std::unique_ptr std::make_unique(); 14 | 15 | private: 16 | struct Event 17 | { 18 | bool shutdown; 19 | void* pointerToFree; 20 | }; 21 | 22 | explicit MemoryManager(); 23 | 24 | static std::unique_ptr s_instance; 25 | 26 | std::mutex m_mtx; 27 | std::map> m_pointers; 28 | std::thread m_thread; 29 | 30 | wxMessageQueue m_queue; 31 | 32 | void threadMain(); 33 | 34 | public: 35 | static MemoryManager* getInstance(); 36 | 37 | template 38 | inline void registerPointer( std::shared_ptr ptr ) 39 | { 40 | std::lock_guard lock( m_mtx ); 41 | m_pointers[ptr.get()] = std::static_pointer_cast( ptr ); 42 | } 43 | 44 | void scheduleFreePointer( void* ptr ); 45 | 46 | void shutdownAndFreeAll(); 47 | }; 48 | 49 | }; 50 | -------------------------------------------------------------------------------- /src/service/notification.cpp: -------------------------------------------------------------------------------- 1 | #include "notification.hpp" 2 | 3 | namespace srv 4 | { 5 | 6 | ToastNotification::ToastNotification() 7 | : m_service( nullptr ) 8 | { 9 | } 10 | 11 | void ToastNotification::setService( WinpinatorService* service ) 12 | { 13 | m_service = service; 14 | } 15 | 16 | WinpinatorService* ToastNotification::getService() const 17 | { 18 | return m_service; 19 | } 20 | 21 | }; 22 | -------------------------------------------------------------------------------- /src/service/notification.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "winpinator_service.hpp" 3 | 4 | #include 5 | 6 | namespace srv 7 | { 8 | 9 | class WinpinatorService; 10 | 11 | class ToastNotification 12 | { 13 | public: 14 | explicit ToastNotification(); 15 | 16 | void setService( WinpinatorService* service ); 17 | WinpinatorService* getService() const; 18 | 19 | virtual WinToastLib::WinToastTemplate buildTemplate() = 0; 20 | virtual WinToastLib::IWinToastHandler* instantiateListener() = 0; 21 | 22 | 23 | protected: 24 | WinpinatorService* m_service; 25 | }; 26 | 27 | }; 28 | -------------------------------------------------------------------------------- /src/service/notification_accept_files.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "notification.hpp" 3 | 4 | #include 5 | 6 | namespace srv 7 | { 8 | 9 | class AcceptFilesNotification : public ToastNotification 10 | { 11 | public: 12 | explicit AcceptFilesNotification( std::string remoteId, int transferId ); 13 | 14 | void setSenderFullName( std::wstring name ); 15 | std::wstring getSenderFullName() const; 16 | 17 | void setSingleElementName( std::wstring name ); 18 | std::wstring getSingleElementName() const; 19 | 20 | void setIsSingleFolder( bool single ); 21 | bool isSingleFolder() const; 22 | 23 | void setElementCount( int elementCount ); 24 | int getElementCount() const; 25 | 26 | void setOverwriteNeeded( bool required ); 27 | bool isOverwriteNeeded() const; 28 | 29 | void setShowActions( bool showActions ); 30 | bool isShowingActions() const; 31 | 32 | virtual WinToastLib::WinToastTemplate buildTemplate() override; 33 | virtual WinToastLib::IWinToastHandler* instantiateListener() override; 34 | 35 | private: 36 | class Handler : public WinToastLib::IWinToastHandler 37 | { 38 | public: 39 | explicit Handler( AcceptFilesNotification* notification ); 40 | 41 | private: 42 | enum class Actions 43 | { 44 | ACCEPT = 0, 45 | DECLINE 46 | }; 47 | 48 | std::string m_remoteId; 49 | int m_transferId; 50 | WinpinatorService* m_service; 51 | 52 | virtual void toastActivated() const override; 53 | virtual void toastActivated( int actionIndex ) const override; 54 | virtual void toastDismissed( WinToastDismissalReason state ) const override; 55 | virtual void toastFailed() const override; 56 | }; 57 | 58 | std::string m_remoteId; 59 | int m_transferId; 60 | 61 | std::wstring m_senderFullName; 62 | std::wstring m_singleElementName; 63 | bool m_isSingleFolder; 64 | int m_elementCount; 65 | bool m_overwriteNeeded; 66 | bool m_showActions; 67 | }; 68 | 69 | }; 70 | -------------------------------------------------------------------------------- /src/service/notification_transfer_failed.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "notification.hpp" 3 | 4 | #include 5 | 6 | namespace srv 7 | { 8 | 9 | class TransferFailedNotification : public ToastNotification 10 | { 11 | public: 12 | explicit TransferFailedNotification( const std::string& remoteId ); 13 | 14 | void setSenderFullName( std::wstring name ); 15 | std::wstring getSenderFullName() const; 16 | 17 | virtual WinToastLib::WinToastTemplate buildTemplate() override; 18 | virtual WinToastLib::IWinToastHandler* instantiateListener() override; 19 | 20 | protected: 21 | std::string m_remoteId; 22 | std::wstring m_senderFullName; 23 | 24 | private: 25 | class Handler : public WinToastLib::IWinToastHandler 26 | { 27 | public: 28 | explicit Handler( TransferFailedNotification* notification ); 29 | 30 | private: 31 | std::string m_remoteId; 32 | WinpinatorService* m_service; 33 | 34 | virtual void toastActivated() const override; 35 | virtual void toastActivated( int actionIndex ) const override; 36 | virtual void toastDismissed( WinToastDismissalReason state ) const override; 37 | virtual void toastFailed() const override; 38 | }; 39 | }; 40 | 41 | }; 42 | -------------------------------------------------------------------------------- /src/service/notification_transfer_succeeded.cpp: -------------------------------------------------------------------------------- 1 | #include "notification_transfer_succeeded.hpp" 2 | 3 | #include 4 | 5 | namespace srv 6 | { 7 | 8 | TransferSucceededNotification::TransferSucceededNotification( const std::string& remoteId ) 9 | : TransferFailedNotification( remoteId ) 10 | { 11 | } 12 | 13 | WinToastLib::WinToastTemplate TransferSucceededNotification::buildTemplate() 14 | { 15 | using namespace WinToastLib; 16 | 17 | WinToastTemplate templ( WinToastTemplate::ImageAndText02 ); 18 | templ.setTextField( 19 | _( "Transfer success" ).ToStdWstring(), WinToastTemplate::FirstLine ); 20 | 21 | wxString secondLine; 22 | secondLine.Printf( 23 | _( "Transfer between you and %s has finished successfully!" ), 24 | m_senderFullName ); 25 | 26 | templ.setTextField( 27 | secondLine.ToStdWstring(), WinToastTemplate::SecondLine ); 28 | 29 | wxFileName iconName( wxStandardPaths::Get().GetUserDataDir(), 30 | "transfer_ok.png" ); 31 | iconName.AppendDir( "icons" ); 32 | 33 | templ.setImagePath( iconName.GetFullPath().ToStdWstring() ); 34 | 35 | return templ; 36 | } 37 | 38 | }; 39 | -------------------------------------------------------------------------------- /src/service/notification_transfer_succeeded.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "notification_transfer_failed.hpp" 3 | 4 | namespace srv 5 | { 6 | 7 | class TransferSucceededNotification : public TransferFailedNotification 8 | { 9 | public: 10 | explicit TransferSucceededNotification( const std::string& remoteId ); 11 | 12 | virtual WinToastLib::WinToastTemplate buildTemplate() override; 13 | }; 14 | 15 | }; 16 | -------------------------------------------------------------------------------- /src/service/observable_service.cpp: -------------------------------------------------------------------------------- 1 | #include "observable_service.hpp" 2 | 3 | namespace srv 4 | { 5 | 6 | ObservableService::ObservableService() 7 | : m_observersMtx() 8 | , m_observers( {} ) 9 | { 10 | } 11 | 12 | ObservableService::~ObservableService() 13 | { 14 | std::lock_guard guard( m_observersMtx ); 15 | 16 | // Unregister all observers 17 | 18 | for ( IServiceObserver* observer : m_observers ) 19 | { 20 | observer->stopObserving( this ); 21 | } 22 | } 23 | 24 | void ObservableService::notifyObservers( 25 | std::function func ) 26 | { 27 | std::lock_guard guard( m_observersMtx ); 28 | 29 | for ( IServiceObserver* observer : m_observers ) 30 | { 31 | func( observer ); 32 | } 33 | } 34 | 35 | void ObservableService::addObserver( IServiceObserver* ref ) 36 | { 37 | std::lock_guard guard( m_observersMtx ); 38 | 39 | m_observers.insert( ref ); 40 | } 41 | 42 | void ObservableService::removeObserver( IServiceObserver* ref ) 43 | { 44 | std::lock_guard guard( m_observersMtx ); 45 | 46 | m_observers.erase( ref ); 47 | } 48 | 49 | }; 50 | -------------------------------------------------------------------------------- /src/service/observable_service.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "service_observer.hpp" 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | namespace srv 9 | { 10 | 11 | class IServiceObserver; 12 | 13 | class ObservableService 14 | { 15 | friend class IServiceObserver; 16 | 17 | public: 18 | ObservableService(); 19 | ~ObservableService(); 20 | 21 | void notifyObservers( std::function func ); 22 | 23 | protected: 24 | std::set m_observers; 25 | 26 | // Remember to protect all usages of m_observers with a lock 27 | // to prevent removing their refs during execution of callbacks 28 | std::recursive_mutex m_observersMtx; 29 | 30 | void addObserver( IServiceObserver* ptr ); 31 | void removeObserver( IServiceObserver* ptr ); 32 | }; 33 | 34 | }; 35 | -------------------------------------------------------------------------------- /src/service/registration_v1_impl.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | 5 | #include 6 | #include 7 | #include 8 | 9 | namespace srv 10 | { 11 | 12 | class RegistrationV1Server 13 | { 14 | public: 15 | RegistrationV1Server( std::string address, uint16_t port ); 16 | ~RegistrationV1Server(); 17 | 18 | bool startServer(); 19 | bool stopServer(); 20 | 21 | private: 22 | static const std::string REQUEST; 23 | 24 | std::thread m_thread; 25 | std::unique_ptr m_sock; 26 | std::string m_ipAddr; 27 | uint16_t m_port; 28 | bool m_exiting; 29 | 30 | int threadMain(); 31 | }; 32 | 33 | }; 34 | -------------------------------------------------------------------------------- /src/service/registration_v2_impl.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "../proto-gen/warp.grpc.pb.h" 3 | 4 | #include 5 | #include 6 | 7 | namespace srv 8 | { 9 | 10 | using grpc::Status; 11 | using grpc::ServerContext; 12 | 13 | class RegistrationV2Impl : public WarpRegistration::Service 14 | { 15 | Status RequestCertificate( ServerContext* context, 16 | const RegRequest* request, RegResponse* response ) override; 17 | }; 18 | 19 | class RegistrationV2Server 20 | { 21 | public: 22 | RegistrationV2Server(); 23 | ~RegistrationV2Server(); 24 | 25 | void setPort( uint16_t port ); 26 | uint16_t getPort() const; 27 | 28 | bool startServer(); 29 | bool stopServer(); 30 | 31 | private: 32 | uint16_t m_port; 33 | std::unique_ptr m_server; 34 | std::thread m_thread; 35 | 36 | int threadMain( uint16_t port, std::promise& startProm ); 37 | }; 38 | 39 | }; -------------------------------------------------------------------------------- /src/service/remote_handler.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "remote_info.hpp" 3 | 4 | #include 5 | #include 6 | 7 | namespace srv 8 | { 9 | 10 | class RemoteHandler 11 | { 12 | public: 13 | explicit RemoteHandler( RemoteInfoPtr info ); 14 | void setEditListener( std::function listener ); 15 | void process(); 16 | 17 | private: 18 | static const int CHANNEL_RETRY_WAIT_TIME; 19 | static const int DUPLEX_MAX_FAILURES; 20 | static const int DUPLEX_WAIT_PING_TIME; 21 | static const int CONNECTED_PING_TIME; 22 | static const int CONNECT_TIMEOUT; 23 | static const int V2_CHANNEL_RETRY_WAIT_TIME; 24 | static const int V2_DUPLEX_TIMEOUT; 25 | 26 | RemoteInfoPtr m_info; 27 | int m_api; 28 | std::string m_ident; 29 | std::function m_editHandler; 30 | 31 | bool secureLoopV1(); 32 | bool secureLoopV2(); 33 | 34 | bool checkDuplexConnection(); 35 | void updateRemoteMachineInfo(); 36 | void updateRemoteMachineAvatar(); 37 | std::future waitForDuplex( int timeout ); 38 | 39 | void setTimeout( grpc::ClientContext& context, int seconds ); 40 | void setRemoteStatus( std::unique_lock& lck, 41 | RemoteStatus newStatus ); 42 | }; 43 | 44 | }; 45 | -------------------------------------------------------------------------------- /src/service/remote_info.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "../zeroconf/mdns_types.hpp" 3 | 4 | #include "../proto-gen/warp.grpc.pb.h" 5 | 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | 13 | namespace srv 14 | { 15 | 16 | enum class RemoteStatus 17 | { 18 | OFFLINE, 19 | REGISTRATION, 20 | INIT_CONNECTING, 21 | UNREACHABLE, 22 | AWAITING_DUPLEX, 23 | ONLINE 24 | }; 25 | 26 | struct RemoteInfo 27 | { 28 | std::atomic state; 29 | 30 | std::string id; 31 | 32 | // mDNS metadata 33 | zc::MdnsIpPair ips; 34 | int port; 35 | int authPort; 36 | int apiVersion; 37 | std::string os; 38 | std::string hostname; 39 | 40 | std::string shortName; 41 | std::wstring fullName; 42 | std::string avatarBuffer; 43 | 44 | // Synchronization stuff 45 | std::thread thread; 46 | std::mutex mutex; 47 | std::condition_variable stopVar; 48 | std::atomic_bool stopping; 49 | 50 | // Flags 51 | bool busy; 52 | bool hasZcPresence; 53 | 54 | // Host should be visible after its public key has been successfully 55 | // decoded using group key 56 | bool visible; 57 | 58 | // gRPC stuff 59 | std::shared_ptr stub; 60 | }; 61 | 62 | typedef std::shared_ptr RemoteInfoPtr; 63 | 64 | }; -------------------------------------------------------------------------------- /src/service/remote_manager.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "observable_service.hpp" 3 | #include "remote_info.hpp" 4 | #include "transfer_manager.hpp" 5 | 6 | #include 7 | 8 | namespace srv 9 | { 10 | 11 | class TransferManager; 12 | 13 | class RemoteManager 14 | { 15 | public: 16 | RemoteManager( ObservableService* service ); 17 | ~RemoteManager(); 18 | 19 | void setTransferManager( TransferManager* mgr ); 20 | 21 | void stop(); 22 | 23 | size_t getTotalHostsCount(); 24 | size_t getVisibleHostsCount(); 25 | 26 | std::vector generateCurrentHostList(); 27 | 28 | void setServiceType( const std::string& serviceType ); 29 | const std::string& getServiceType(); 30 | 31 | void processAddHost( const zc::MdnsServiceData& data ); 32 | void processRemoveHost( const std::string& id ); 33 | 34 | bool isHostAvailable( const std::string& id, bool strip = false ); 35 | std::shared_ptr getRemoteInfo( const std::string& id, 36 | bool strip = false ); 37 | 38 | private: 39 | static const std::string FALLBACK_OS; 40 | static const std::string REQUEST; 41 | 42 | std::shared_mutex m_mutex; 43 | std::vector> m_hosts; 44 | std::set> m_hostSet; 45 | std::string m_srvType; 46 | 47 | ObservableService* m_srv; 48 | TransferManager* m_transferMgr; 49 | 50 | std::string stripServiceFromIdent( const std::string& identStr ) const; 51 | int remoteThreadEntry( std::shared_ptr serviceInfo ); 52 | 53 | bool doRegistrationV1( RemoteInfo* serviceInfo ); 54 | bool doRegistrationV2( RemoteInfo* serviceInfo ); 55 | 56 | size_t _getVisibleHostsCount(); 57 | }; 58 | 59 | }; 60 | -------------------------------------------------------------------------------- /src/service/service_base64.cpp: -------------------------------------------------------------------------------- 1 | // For some unknown reasons, vs16 does not want to compile base64.cpp 2 | // so we force to do it here 3 | 4 | #include 5 | -------------------------------------------------------------------------------- /src/service/service_errors.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | namespace srv 4 | { 5 | 6 | enum class ServiceError 7 | { 8 | KEIN_ERROR, // Can't be NO_ERROR because windows.h has stolen it... 9 | UNKNOWN_ERROR, 10 | ZEROCONF_SERVER_FAILED, 11 | REGISTRATION_V1_SERVER_FAILED, 12 | REGISTRATION_V2_SERVER_FAILED, 13 | WARP_SERVER_FAILED, 14 | CANT_CREATE_OUTPUT_DIR 15 | }; 16 | 17 | }; 18 | -------------------------------------------------------------------------------- /src/service/service_observer.cpp: -------------------------------------------------------------------------------- 1 | #include "service_observer.hpp" 2 | 3 | namespace srv 4 | { 5 | 6 | IServiceObserver::IServiceObserver() 7 | : m_observedServices( {} ) 8 | { 9 | } 10 | 11 | IServiceObserver::~IServiceObserver() 12 | { 13 | // Ensure to unregister from all currently observed services 14 | 15 | for ( ObservableService* serv : m_observedServices ) 16 | { 17 | serv->removeObserver( this ); 18 | } 19 | } 20 | 21 | void IServiceObserver::observeService( ObservableService* service ) 22 | { 23 | service->addObserver( this ); 24 | 25 | m_observedServices.push_back( service ); 26 | } 27 | 28 | void IServiceObserver::stopObserving( ObservableService* service ) 29 | { 30 | size_t count = m_observedServices.size(); 31 | 32 | for ( size_t i = 0; i < count; i++ ) 33 | { 34 | if ( m_observedServices[i] == service ) 35 | { 36 | m_observedServices.erase( m_observedServices.begin() + i ); 37 | 38 | i--; 39 | count--; 40 | } 41 | } 42 | } 43 | 44 | // 45 | // All the methods below are default stub implementations 46 | // They should be selectively overriden by interested observers 47 | 48 | void IServiceObserver::onIpAddressChanged( std::string newIp ) 49 | { 50 | } 51 | 52 | void IServiceObserver::onAddHost( srv::RemoteInfoPtr info ) 53 | { 54 | } 55 | 56 | void IServiceObserver::onEditHost( srv::RemoteInfoPtr info ) 57 | { 58 | } 59 | 60 | void IServiceObserver::onDeleteHost( const std::string& id ) 61 | { 62 | } 63 | 64 | void IServiceObserver::onHostCountChanged( size_t newCount ) 65 | { 66 | } 67 | 68 | void IServiceObserver::onAddTransfer( std::string remoteId, 69 | srv::TransferOpPub transfer ) 70 | { 71 | } 72 | 73 | void IServiceObserver::onUpdateTransfer( std::string remoteId, 74 | srv::TransferOpPub transfer ) 75 | { 76 | } 77 | 78 | void IServiceObserver::onRemoveTransfer( std::string remoteId, int transferId ) 79 | { 80 | } 81 | 82 | void IServiceObserver::onOpenTransferUI( wxString remoteId ) 83 | { 84 | } 85 | 86 | 87 | }; 88 | -------------------------------------------------------------------------------- /src/service/service_observer.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "observable_service.hpp" 3 | #include "remote_info.hpp" 4 | #include "transfer_types.hpp" 5 | 6 | #include 7 | 8 | #include 9 | #include 10 | 11 | namespace srv 12 | { 13 | 14 | class ObservableService; 15 | 16 | class IServiceObserver 17 | { 18 | friend class ObservableService; 19 | 20 | public: 21 | IServiceObserver(); 22 | ~IServiceObserver(); 23 | 24 | // Listeners to be overriden (must be virtual) 25 | virtual void onStateChanged() = 0; 26 | virtual void onIpAddressChanged( std::string newIp ); 27 | 28 | virtual void onAddHost( srv::RemoteInfoPtr info ); 29 | virtual void onEditHost( srv::RemoteInfoPtr newInfo ); 30 | virtual void onDeleteHost( const std::string& id ); 31 | 32 | virtual void onHostCountChanged( size_t newCount ); 33 | 34 | virtual void onAddTransfer( std::string remoteId, 35 | srv::TransferOpPub transfer ); 36 | virtual void onUpdateTransfer( std::string remoteId, 37 | srv::TransferOpPub transfer ); 38 | virtual void onRemoveTransfer( std::string remoteId, int transferId ); 39 | 40 | virtual void onOpenTransferUI( wxString remoteId ); 41 | 42 | protected: 43 | void observeService( ObservableService* service ); 44 | 45 | private: 46 | std::vector m_observedServices; 47 | 48 | void stopObserving( ObservableService* service ); 49 | }; 50 | 51 | }; 52 | -------------------------------------------------------------------------------- /src/service/service_utils.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | #include 5 | 6 | namespace srv 7 | { 8 | 9 | class Utils 10 | { 11 | public: 12 | // This is a utility class and not a singleton, so we remove the 13 | // default constructor 14 | Utils() = delete; 15 | 16 | static std::string getHostname(); 17 | static std::wstring getUserFullName(); 18 | static std::wstring getUserShortName(); 19 | static std::string generateUUID(); 20 | static std::string getOSVersionString(); 21 | static int64_t getMonotonicTime(); 22 | 23 | static wxString makeIntResource( int resource ); 24 | 25 | private: 26 | static std::wstring getFullNameFromGetUserNameEx(); 27 | static std::wstring getFullNameFromNetUserGetInfo(); 28 | }; 29 | 30 | }; 31 | -------------------------------------------------------------------------------- /src/service/unix_permissions.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | namespace srv 4 | { 5 | 6 | class UnixPermissions 7 | { 8 | public: 9 | struct PermGroup 10 | { 11 | bool read, write; 12 | union 13 | { 14 | bool execute; 15 | bool queryFiles; 16 | }; 17 | }; 18 | 19 | PermGroup owner; 20 | PermGroup group; 21 | PermGroup others; 22 | 23 | explicit UnixPermissions(); 24 | 25 | void setToFileSafe(); 26 | void setToFolderSafe(); 27 | 28 | void loadFromDecimal( short decMode ); 29 | void loadFromChmod( short specifier ); 30 | short convertToDecimal(); 31 | short convertToChmod(); 32 | 33 | static bool checkElfHeader( const void* data, int length ); 34 | 35 | private: 36 | static void setPermGroupToDigit( PermGroup& group, unsigned char digit ); 37 | static unsigned char getDigitFromPermGroup( const PermGroup& group ); 38 | }; 39 | 40 | }; 41 | -------------------------------------------------------------------------------- /src/service/zlib_deflate.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | #include 5 | 6 | namespace srv 7 | { 8 | 9 | class ZlibDeflate 10 | { 11 | public: 12 | explicit ZlibDeflate( int maxChunkSize = 8 * 1024 * 1024 ); 13 | 14 | std::string compress( const std::string& input, int compressionLevel ); 15 | std::string decompress( const std::string& input ); 16 | 17 | private: 18 | static const int ZLIB_MAX_COMPRESSION_FACTOR; 19 | int m_maxChunk; 20 | 21 | void setupZlibStream( z_stream& stream ); 22 | }; 23 | 24 | }; 25 | -------------------------------------------------------------------------------- /src/settings_model.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | 5 | #include 6 | 7 | class SettingsModel 8 | { 9 | public: 10 | SettingsModel(); 11 | 12 | void loadFrom( wxConfigBase* config ); 13 | void saveTo( wxConfigBase* config ); 14 | 15 | // Settings fields 16 | 17 | wxString localeName; 18 | bool openWindowOnStart; 19 | bool autorun; 20 | bool autorunHidden; 21 | 22 | bool useCompression; 23 | int zlibCompressionLevel; 24 | wxString outputPath; 25 | bool askReceiveFiles; 26 | bool askOverwriteFiles; 27 | bool preserveZoneInfo; 28 | 29 | int filesDefaultPermissions; 30 | int executablesDefaultPermissions; 31 | int foldersDefaultPermissions; 32 | 33 | wxString groupCode; 34 | wxString networkInterface; 35 | int transferPort; 36 | int registrationPort; 37 | 38 | private: 39 | static std::unique_ptr s_defaultInstance; 40 | inline static SettingsModel* getDefaults(); 41 | }; 42 | 43 | -------------------------------------------------------------------------------- /src/thread_name.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | #include 5 | 6 | #include 7 | 8 | inline void setThreadName( const std::string& name ) 9 | { 10 | #ifdef _DEBUG 11 | HANDLE threadHandle = GetCurrentThread(); 12 | SetThreadDescription( threadHandle, wxString( name ).wc_str() ); 13 | #endif 14 | } 15 | -------------------------------------------------------------------------------- /src/tray_icon.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | 6 | wxDECLARE_EVENT( EVT_RESTORE_WINDOW, wxCommandEvent ); 7 | wxDECLARE_EVENT( EVT_OPEN_SAVE_FOLDER, wxCommandEvent ); 8 | wxDECLARE_EVENT( EVT_EXIT_APP, wxCommandEvent ); 9 | 10 | class TrayIcon : public wxTaskBarIcon 11 | { 12 | public: 13 | TrayIcon(); 14 | 15 | void setErrorState(); 16 | void setWaitState(); 17 | void setOkState(); 18 | bool isInErrorState() const; 19 | bool isInWaitState() const; 20 | bool isInOkState() const; 21 | 22 | void setEventHandler( wxEvtHandler* handler ); 23 | 24 | protected: 25 | virtual wxMenu* CreatePopupMenu(); 26 | 27 | private: 28 | enum 29 | { 30 | ID_RESTORE = 5000, 31 | ID_OPEN_SAVE_FOLDER, 32 | ID_EXIT_APP 33 | }; 34 | 35 | enum class State 36 | { 37 | ERR, 38 | WAIT, 39 | OK 40 | }; 41 | 42 | wxIcon m_icon; 43 | wxEvtHandler* m_handler; 44 | State m_state; 45 | 46 | void onClick( wxTaskBarIconEvent& event ); 47 | void onRestoreClicked( wxCommandEvent& event ); 48 | void onOpenSaveFolderClicked( wxCommandEvent& event ); 49 | void onExitAppClicked( wxCommandEvent& event ); 50 | }; 51 | -------------------------------------------------------------------------------- /src/winpinator_dde_client.cpp: -------------------------------------------------------------------------------- 1 | #include "winpinator_dde_client.hpp" 2 | #include "winpinator_dde_consts.hpp" 3 | 4 | WinpinatorDDEClient::WinpinatorDDEClient() 5 | : m_client( nullptr ) 6 | { 7 | m_client = std::make_unique(); 8 | m_connection = static_cast( m_client->MakeConnection( 9 | wxEmptyString, DDEConsts::SERVICE_NAME, DDEConsts::TOPIC_NAME ) ); 10 | } 11 | 12 | bool WinpinatorDDEClient::isConnected() const 13 | { 14 | return m_connection != nullptr; 15 | } 16 | 17 | void WinpinatorDDEClient::execOpen() 18 | { 19 | if ( !m_connection ) 20 | { 21 | return; 22 | } 23 | 24 | std::wstring data = DDEConsts::COMMAND_OPEN.ToStdWstring(); 25 | m_connection->Execute( data.data(), 26 | data.size() * sizeof( wchar_t ), wxIPC_UNICODETEXT ); 27 | } 28 | 29 | void WinpinatorDDEClient::execSend( const std::vector& paths ) 30 | { 31 | if ( !m_connection ) 32 | { 33 | return; 34 | } 35 | 36 | std::wstring data = DDEConsts::COMMAND_SEND.ToStdWstring(); 37 | data += ' '; 38 | 39 | for ( const wxString& path : paths ) 40 | { 41 | data += path.ToStdWstring(); 42 | data += L'\0'; 43 | } 44 | 45 | // Decrease the length by 1 character to ignore the last NUL 46 | m_connection->Execute( data.data(), 47 | ( data.size() - 1 ) * sizeof( wchar_t ), wxIPC_UNICODETEXT ); 48 | } 49 | -------------------------------------------------------------------------------- /src/winpinator_dde_client.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | 6 | #include 7 | 8 | class WinpinatorDDEClient 9 | { 10 | public: 11 | WinpinatorDDEClient(); 12 | 13 | bool isConnected() const; 14 | 15 | void execOpen(); 16 | void execSend( const std::vector& paths ); 17 | 18 | private: 19 | std::unique_ptr m_client; 20 | wxDDEConnection* m_connection; 21 | }; 22 | -------------------------------------------------------------------------------- /src/winpinator_dde_consts.cpp: -------------------------------------------------------------------------------- 1 | #include "winpinator_dde_consts.hpp" 2 | 3 | namespace DDEConsts 4 | { 5 | 6 | const wxString TOPIC_NAME = "WINPINATOR_IPC"; 7 | const wxString SERVICE_NAME = "WINPINATOR"; 8 | 9 | // Commands 10 | const wxString COMMAND_OPEN = "OPEN"; 11 | const wxString COMMAND_SEND = "SEND"; 12 | 13 | }; 14 | -------------------------------------------------------------------------------- /src/winpinator_dde_consts.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | namespace DDEConsts 6 | { 7 | 8 | extern const wxString TOPIC_NAME; 9 | extern const wxString SERVICE_NAME; 10 | 11 | // Commands 12 | extern const wxString COMMAND_OPEN; 13 | extern const wxString COMMAND_SEND; 14 | 15 | }; 16 | -------------------------------------------------------------------------------- /src/winpinator_dde_server.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "gui/array_event.hpp" 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | #include 9 | 10 | wxDECLARE_EVENT( EVT_OPEN_APP_WINDOW, wxCommandEvent ); 11 | wxDECLARE_EVENT( EVT_SEND_FILES, gui::ArrayEvent ); 12 | 13 | class WinpinatorDDEServer; 14 | 15 | class DDEHandler 16 | { 17 | public: 18 | virtual void processExecute( const void* data, size_t size ) = 0; 19 | }; 20 | 21 | class DDEImpl : public wxDDEServer 22 | { 23 | friend class WinpinatorDDEServer; 24 | 25 | public: 26 | virtual wxConnectionBase* OnAcceptConnection( 27 | const wxString& topic ) override; 28 | 29 | private: 30 | DDEHandler* m_handler; 31 | 32 | DDEImpl( DDEHandler* handler ); 33 | }; 34 | 35 | class DDEConnectionImpl : public wxDDEConnection 36 | { 37 | friend class DDEImpl; 38 | 39 | private: 40 | DDEHandler* m_handler; 41 | 42 | DDEConnectionImpl( DDEHandler* handler ); 43 | virtual bool OnExecute( const wxString& topic, 44 | const void* data, size_t size, wxIPCFormat format ); 45 | }; 46 | 47 | class WinpinatorDDEServer : DDEHandler 48 | { 49 | public: 50 | WinpinatorDDEServer( wxEvtHandler* evtHandler ); 51 | 52 | private: 53 | wxEvtHandler* m_handler; 54 | std::shared_ptr m_server; 55 | 56 | virtual void processExecute( const void* data, size_t size ); 57 | void processOpen( const wxString& data ); 58 | void processSend( const wxString& data ); 59 | }; 60 | -------------------------------------------------------------------------------- /src/zeroconf/interface_utils.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | #include 5 | 6 | #include 7 | 8 | #include 9 | 10 | namespace zc 11 | { 12 | 13 | class InterfaceUtils 14 | { 15 | public: 16 | static IN_ADDR getInterfaceAddressV4( const std::string& interf ); 17 | static IN6_ADDR getInterfaceAddressV6( const std::string& interf ); 18 | 19 | private: 20 | InterfaceUtils() = delete; 21 | 22 | // Memory block returned by this function must be explicitly freed!!! 23 | static std::pair 24 | findAdapterByName( const std::string& interf ); 25 | }; 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/zeroconf/mdns_types.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | #include 5 | 6 | namespace zc 7 | { 8 | 9 | struct MdnsIpPair 10 | { 11 | bool valid; 12 | std::string ipv4; 13 | std::string ipv6; 14 | 15 | inline bool operator<( const MdnsIpPair& other ) const 16 | { 17 | if ( valid < other.valid ) 18 | { 19 | return true; 20 | } 21 | if ( valid > other.valid ) 22 | { 23 | return false; 24 | } 25 | if ( ipv4 < other.ipv4 ) 26 | { 27 | return true; 28 | } 29 | if ( ipv4 > other.ipv4 ) 30 | { 31 | return false; 32 | } 33 | if ( ipv6 < other.ipv6 ) 34 | { 35 | return true; 36 | } 37 | 38 | return false; 39 | } 40 | 41 | inline bool operator==( const MdnsIpPair& other ) const 42 | { 43 | return valid == other.valid && ipv4 == other.ipv4 44 | && ipv6 == other.ipv6; 45 | } 46 | }; 47 | 48 | struct MdnsServiceData 49 | { 50 | // A full service name, consisting of hostname and protocol. Should be 51 | // uniquely identifying a particular host. 52 | std::string name; 53 | 54 | // A name of the server in .local. domain 55 | std::string srvName; 56 | 57 | // Port on which the service is running 58 | uint16_t port; 59 | 60 | // An IPv4 address of the service. If unavailable, this string is empty. 61 | std::string ipv4; 62 | 63 | // An IPv6 address of the service. If unavailable, this string is empty. 64 | std::string ipv6; 65 | 66 | // A map of TXT records 67 | std::map txtRecords; 68 | }; 69 | 70 | }; 71 | -------------------------------------------------------------------------------- /test/zlib_deflate.test.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/test/zlib_deflate.test.cpp -------------------------------------------------------------------------------- /vcpkg.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "winpinator", 3 | "version-string": "0.1.2", 4 | "description": "An unofficial port of Warpinator from Linux Mint for Windows", 5 | "dependencies": [ 6 | "cpp-base64", 7 | "grpc", 8 | "libsodium", 9 | "openssl", 10 | "sqlite3", 11 | "wintoast", 12 | "wxwidgets", 13 | "zlib" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /vs16/test/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /win32/manifest.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | An unofficial port of Warpinator from Linux Mint for Windows 10 | 11 | 12 | 20 | 21 | 22 | 23 | 24 | true 25 | PerMonitorV2,PerMonitor 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /win32/resource.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/win32/resource.h -------------------------------------------------------------------------------- /win32/winpinator.aps: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/win32/winpinator.aps -------------------------------------------------------------------------------- /win32/winpinator.rc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swiszczoo/winpinator/b3b1822ee4e1a57d35576852a7f5fd7a2ce77501/win32/winpinator.rc --------------------------------------------------------------------------------