├── .clang-format ├── .gitignore ├── .travis.yml ├── .tx └── config ├── Application.manifest ├── CMakeLists.txt ├── Doxyfile.in ├── Info.plist ├── LICENSE ├── README.md ├── appcast.example.xml ├── coding-style.md ├── data ├── com.seafile.seafile-applet.desktop └── icons │ ├── 128x128 │ └── apps │ │ └── seafile.png │ ├── 16x16 │ └── apps │ │ └── seafile.png │ ├── 22x22 │ └── apps │ │ └── seafile.png │ ├── 24x24 │ └── apps │ │ └── seafile.png │ ├── 32x32 │ └── apps │ │ └── seafile.png │ ├── 48x48 │ └── apps │ │ └── seafile.png │ └── scalable │ └── apps │ └── seafile.svg ├── debian ├── README.Debian ├── changelog ├── compat ├── control ├── copyright ├── rules ├── seafile-gui.install └── source │ └── format ├── dev-guide.md ├── extensions ├── CMakeLists.txt ├── README.md ├── README.org ├── applet-connection.cpp ├── applet-connection.h ├── build.sh ├── class-factory.cpp ├── class-factory.h ├── commands.cpp ├── commands.h ├── context-menu.cpp ├── debug-register.reg ├── debug-unregister.reg ├── dll.cpp ├── error.ico ├── ext-common.h ├── ext-utils.cpp ├── ext-utils.h ├── guids.h ├── i18n.cpp ├── i18n.h ├── icon-overlay.cpp ├── locked-by-me.ico ├── locked-by-others.ico ├── log.cpp ├── log.h ├── normal.ico ├── paused.ico ├── readonly.ico ├── seafile_shell_ext.def ├── seafile_shell_ext.rc ├── shell-ext.cpp ├── shell-ext.h └── syncing.ico ├── fsplugin ├── .clang-format ├── .tx │ └── config ├── CMakeLists.txt ├── FinderSync.h ├── FinderSync.mm ├── FinderSyncClient.h ├── FinderSyncClient.mm ├── Info.plist ├── bg_BG.lproj │ └── Localizable.strings ├── build.sh ├── ca.lproj │ └── Localizable.strings ├── cs_CZ.lproj │ └── Localizable.strings ├── de_DE.lproj │ └── Localizable.strings ├── el_GR.lproj │ └── Localizable.strings ├── en.lproj │ └── Localizable.strings ├── es.lproj │ └── Localizable.strings ├── es_AR.lproj │ └── Localizable.strings ├── es_MX.lproj │ └── Localizable.strings ├── et_EE.lproj │ └── Localizable.strings ├── fr_FR.lproj │ └── Localizable.strings ├── he_IL.lproj │ └── Localizable.strings ├── hu_HU.lproj │ └── Localizable.strings ├── is.lproj │ └── Localizable.strings ├── it.lproj │ └── Localizable.strings ├── ja.lproj │ └── Localizable.strings ├── ko_KR.lproj │ └── Localizable.strings ├── lv.lproj │ └── Localizable.strings ├── nb_NO.lproj │ └── Localizable.strings ├── nl_BE.lproj │ └── Localizable.strings ├── nl_NL.lproj │ └── Localizable.strings ├── pl_PL.lproj │ └── Localizable.strings ├── pt_BR.lproj │ └── Localizable.strings ├── pt_PT.lproj │ └── Localizable.strings ├── ru.lproj │ └── Localizable.strings ├── seafile-findersync-arch.svg ├── seafile-fsplugin.entitlements ├── sk_SK.lproj │ └── Localizable.strings ├── status-done.icns ├── status-error.icns ├── status-ignored.icns ├── status-locked-by-me.icns ├── status-locked.icns ├── status-syncing.icns ├── sv.lproj │ └── Localizable.strings ├── tr.lproj │ └── Localizable.strings ├── uk.lproj │ └── Localizable.strings ├── zh_CN.lproj │ └── Localizable.strings └── zh_TW.lproj │ └── Localizable.strings ├── i18n ├── seafile_bg_BG.ts ├── seafile_ca.ts ├── seafile_cs_CZ.ts ├── seafile_de_DE.ts ├── seafile_el_GR.ts ├── seafile_en.ts ├── seafile_es.ts ├── seafile_es_AR.ts ├── seafile_es_MX.ts ├── seafile_et_EE.ts ├── seafile_fr_FR.ts ├── seafile_he_IL.ts ├── seafile_hu_HU.ts ├── seafile_is.ts ├── seafile_it.ts ├── seafile_ja.ts ├── seafile_ko_KR.ts ├── seafile_lv.ts ├── seafile_nb_NO.ts ├── seafile_nl_BE.ts ├── seafile_nl_NL.ts ├── seafile_pl_PL.ts ├── seafile_pt_BR.ts ├── seafile_pt_PT.ts ├── seafile_ru.ts ├── seafile_sk_SK.ts ├── seafile_sv.ts ├── seafile_tr.ts ├── seafile_uk.ts ├── seafile_zh_CN.ts └── seafile_zh_TW.ts ├── images ├── account-256.png ├── account-checked.png ├── account-checked@2x.png ├── account-else.png ├── account-else@2x.png ├── account-settings.png ├── account-settings@2x.png ├── account.png ├── account@2x.png ├── add-account.png ├── add-account@2x.png ├── cancel.png ├── cancel@2x.png ├── clock.png ├── clock@2x.png ├── cloud-gray.png ├── cloud-gray@2x.png ├── daemon_down.png ├── daemon_up.png ├── delete-account.png ├── delete-account@2x.png ├── disk@2x.png ├── download-48.png ├── filebrowser │ ├── add.png │ ├── add@2x.png │ ├── backward.png │ ├── backward@2x.png │ ├── down-arrow.png │ ├── forward.png │ ├── forward@2x.png │ ├── home.png │ ├── home@2x.png │ ├── locked-by-me.png │ ├── locked-by-me@2x.png │ ├── locked.png │ ├── locked@2x.png │ ├── path-separator.png │ ├── path-separator@2x.png │ ├── refresh-gray.png │ ├── refresh-gray@2x.png │ ├── settings.png │ ├── settings@2x.png │ └── up-arrow.png ├── files │ ├── file_audio.png │ ├── file_audio@2x.png │ ├── file_folder.png │ ├── file_folder@2x.png │ ├── file_folder_readonly.png │ ├── file_folder_readonly@2x.png │ ├── file_image.png │ ├── file_image@2x.png │ ├── file_ms_excel.png │ ├── file_ms_excel@2x.png │ ├── file_ms_ppt.png │ ├── file_ms_ppt@2x.png │ ├── file_ms_word.png │ ├── file_ms_word@2x.png │ ├── file_pdf.png │ ├── file_pdf@2x.png │ ├── file_text.png │ ├── file_text@2x.png │ ├── file_unknown.png │ ├── file_unknown@2x.png │ ├── file_video.png │ ├── file_video@2x.png │ ├── file_zip.png │ └── file_zip@2x.png ├── files_v2 │ ├── file_audio.png │ ├── file_audio@2x.png │ ├── file_folder.png │ ├── file_folder@2x.png │ ├── file_folder_readonly.png │ ├── file_folder_readonly@2x.png │ ├── file_image.png │ ├── file_image@2x.png │ ├── file_ms_excel.png │ ├── file_ms_excel@2x.png │ ├── file_ms_ppt.png │ ├── file_ms_ppt@2x.png │ ├── file_ms_word.png │ ├── file_ms_word@2x.png │ ├── file_pdf.png │ ├── file_pdf@2x.png │ ├── file_text.png │ ├── file_text@2x.png │ ├── file_unknown.png │ ├── file_unknown@2x.png │ ├── file_video.png │ ├── file_video@2x.png │ ├── file_zip.png │ └── file_zip@2x.png ├── folder.png ├── info-gray.png ├── info-gray@2x.png ├── info.png ├── leave-share.png ├── leave-share@2x.png ├── library-256.png ├── loading-spinner.gif ├── logout.png ├── logout@2x.png ├── mac │ ├── daemon_down.png │ ├── daemon_down@2x.png │ ├── daemon_up.png │ ├── daemon_up@2x.png │ ├── notification.png │ ├── notification@2x.png │ ├── seafile_auto_sync_disabled.png │ ├── seafile_auto_sync_disabled@2x.png │ ├── seafile_transfer_1.png │ ├── seafile_transfer_1_white.png │ ├── seafile_transfer_2.png │ ├── seafile_transfer_2_white.png │ ├── seafile_warning.png │ └── seafile_warning@2x.png ├── main-panel │ ├── download.png │ ├── download@2x.png │ ├── folder.png │ ├── folder@2x.png │ ├── library-encrypted.png │ ├── library-encrypted@2x.png │ ├── library-normal.png │ ├── library-normal@2x.png │ ├── library-readonly.png │ ├── library-readonly@2x.png │ ├── network-error.png │ ├── network-error@2x.png │ ├── search-background.png │ ├── search-background@2x.png │ ├── sync.png │ ├── sync@2x.png │ ├── upload.png │ └── upload@2x.png ├── minus-gray.png ├── minus-gray@2x.png ├── notification.png ├── pause-gray.png ├── pause-gray@2x.png ├── play-gray.png ├── play-gray@2x.png ├── remove-gray.png ├── remove-gray@2x.png ├── remove-red.png ├── resync.png ├── resync@2x.png ├── seafile-24.png ├── seafile-32.png ├── seafile.png ├── seafile_auto_sync_disabled.png ├── seafile_transfer_1.png ├── seafile_transfer_2.png ├── seafile_warning.png ├── share.png ├── share@2x.png ├── svg │ ├── account.svg │ ├── arrow.svg │ ├── caret-down.svg │ ├── caret-right.svg │ ├── caret-up.svg │ ├── clock.svg │ ├── close.svg │ ├── cloud.svg │ ├── disk.svg │ ├── download-alt.svg │ ├── exclamation.svg │ ├── folder-open.svg │ ├── info-sign.svg │ ├── link.svg │ ├── ok.svg │ ├── pause.svg │ ├── play.svg │ ├── plus.svg │ ├── question.svg │ ├── refresh.svg │ ├── repo.svg │ ├── rotate.svg │ └── share.svg ├── sync │ ├── cloud-sync.png │ ├── cloud-sync@2x.png │ ├── cloud-synced.png │ ├── cloud-synced@2x.png │ ├── cloud-unsynced.png │ ├── cloud-unsynced@2x.png │ ├── done.png │ ├── done@2x.png │ ├── exclamation.png │ ├── minus-sign.png │ ├── pause.png │ ├── pause@2x.png │ ├── question.png │ ├── status-done.png │ ├── status-done@2x.png │ ├── status-syncing.png │ ├── status-syncing@2x.png │ ├── waiting.png │ └── waiting@2x.png ├── sync_now-gray.png ├── sync_now-gray@2x.png ├── tabs │ ├── highlighted │ │ ├── history-orange.png │ │ ├── history-orange@2x.png │ │ ├── library-orange.png │ │ ├── library-orange@2x.png │ │ ├── search-orange.png │ │ ├── search-orange@2x.png │ │ ├── star-orange.png │ │ └── star-orange@2x.png │ ├── history-normal.png │ ├── history-normal@2x.png │ ├── library-normal.png │ ├── library-normal@2x.png │ ├── search-normal.png │ ├── search-normal@2x.png │ ├── star-normal.png │ └── star-normal@2x.png ├── toolbar │ ├── add-gray.png │ ├── add-gray@2x.png │ ├── add.png │ ├── add@2x.png │ ├── download-gray.png │ ├── download-gray@2x.png │ ├── download.png │ ├── download@2x.png │ ├── file-gray.png │ ├── file-gray@2x.png │ ├── file.png │ ├── file@2x.png │ ├── refresh-gray.png │ ├── refresh-gray@2x.png │ ├── refresh-new.png │ ├── refresh-new@2x.png │ ├── refresh-orange.png │ ├── refresh-orange@2x.png │ ├── refresh.png │ ├── refresh@2x.png │ ├── settings-orange.png │ ├── settings-orange@2x.png │ ├── settings.png │ ├── settings@2x.png │ ├── sorts-orange.png │ ├── sorts-orange@2x.png │ ├── sorts.png │ └── sorts@2x.png └── win │ ├── daemon_down.ico │ ├── daemon_up.ico │ ├── notification.ico │ ├── seafile_auto_sync_disabled.ico │ ├── seafile_transfer_1.ico │ ├── seafile_transfer_2.ico │ └── seafile_warning.ico ├── qt-linux.css ├── qt-mac.css ├── qt-win.css ├── qt.css ├── resource.h ├── scripts ├── build.py ├── build_breakpad.sh ├── build_helper.py ├── ci-build.sh ├── genapp.sh ├── install-deps-linux.sh ├── install-deps-osx.sh ├── strip-png.sh └── update-i18n.sh ├── seafile-applet.rc.in ├── seafile-client.qrc ├── seafile-client.rc ├── seafile-client.sln ├── seafile-client.vcxproj ├── seafile-client.vcxproj.filters ├── seafile.icns ├── seafile.ico ├── sparkle-readme.md ├── src ├── account-info-service.cpp ├── account-info-service.h ├── account-mgr.cpp ├── account-mgr.h ├── account.cpp ├── account.h ├── api │ ├── api-client.cpp │ ├── api-client.h │ ├── api-error.cpp │ ├── api-error.h │ ├── api-request.cpp │ ├── api-request.h │ ├── commit-details.cpp │ ├── commit-details.h │ ├── contact-share-info.cpp │ ├── contact-share-info.h │ ├── event.cpp │ ├── event.h │ ├── requests.cpp │ ├── requests.h │ ├── server-info.h │ ├── server-repo.cpp │ ├── server-repo.h │ ├── sso-status.h │ ├── starred-file.cpp │ └── starred-file.h ├── application.cpp ├── application.h ├── auto-login-service.cpp ├── auto-login-service.h ├── auto-update-service.cpp ├── auto-update-service.h ├── avatar-service.cpp ├── avatar-service.h ├── certs-mgr.cpp ├── certs-mgr.h ├── configurator.cpp ├── configurator.h ├── crash-handler.cpp ├── crash-handler.h ├── customization-service.cpp ├── customization-service.h ├── daemon-mgr.cpp ├── daemon-mgr.h ├── events-service.cpp ├── events-service.h ├── ext-handler.cpp ├── ext-handler.h ├── filebrowser │ ├── auto-update-mgr.cpp │ ├── auto-update-mgr.h │ ├── data-cache.cpp │ ├── data-cache.h │ ├── data-mgr.cpp │ ├── data-mgr.h │ ├── file-browser-dialog.cpp │ ├── file-browser-dialog.h │ ├── file-browser-manager.cpp │ ├── file-browser-manager.h │ ├── file-browser-requests.cpp │ ├── file-browser-requests.h │ ├── file-browser-search-tab.cpp │ ├── file-browser-search-tab.h │ ├── file-table.cpp │ ├── file-table.h │ ├── progress-dialog.cpp │ ├── progress-dialog.h │ ├── reliable-upload.cpp │ ├── reliable-upload.h │ ├── seaf-dirent.cpp │ ├── seaf-dirent.h │ ├── seafilelink-dialog.cpp │ ├── seafilelink-dialog.h │ ├── sharedlink-dialog.cpp │ ├── sharedlink-dialog.h │ ├── tasks.cpp │ ├── tasks.h │ ├── thumbnail-service.cpp │ ├── thumbnail-service.h │ ├── transfer-mgr.cpp │ ├── transfer-mgr.h │ ├── uploadlink-dialog.cpp │ └── uploadlink-dialog.h ├── finder-sync │ ├── finder-sync-host.cpp │ ├── finder-sync-host.h │ ├── finder-sync-listener.h │ ├── finder-sync-listener.mm │ ├── finder-sync.cpp │ └── finder-sync.h ├── i18n.cpp ├── i18n.h ├── log-uploader.cpp ├── log-uploader.h ├── mac-sparkle-support.h ├── mac-sparkle-support.mm ├── main.cpp ├── message-poller.cpp ├── message-poller.h ├── network-mgr.cpp ├── network-mgr.h ├── open-local-helper.cpp ├── open-local-helper.h ├── repo-service-helper.cpp ├── repo-service-helper.h ├── repo-service.cpp ├── repo-service.h ├── rpc │ ├── clone-task.cpp │ ├── clone-task.h │ ├── local-repo.cpp │ ├── local-repo.h │ ├── rpc-client.cpp │ ├── rpc-client.h │ ├── rpc-server.cpp │ ├── rpc-server.h │ ├── rpc_table.py │ ├── searpc-marshal.h │ ├── searpc-signature.h │ ├── sync-error.cpp │ ├── sync-error.h │ └── update_rpc_sigs.sh ├── seafile-applet.cpp ├── seafile-applet.h ├── seahub-notifications-monitor.cpp ├── seahub-notifications-monitor.h ├── server-status-service.cpp ├── server-status-service.h ├── settings-mgr.cpp ├── settings-mgr.h ├── shib │ ├── shib-helper.h │ ├── shib-login-dialog.cpp │ └── shib-login-dialog.h ├── sync-error-service.cpp ├── sync-error-service.h ├── traynotificationmanager.cpp ├── traynotificationmanager.h ├── traynotificationwidget.cpp ├── traynotificationwidget.h ├── ui │ ├── about-dialog.cpp │ ├── about-dialog.h │ ├── account-settings-dialog.cpp │ ├── account-settings-dialog.h │ ├── account-view.cpp │ ├── account-view.h │ ├── activities-tab.cpp │ ├── activities-tab.h │ ├── check-repo-root-perm-dialog.cpp │ ├── check-repo-root-perm-dialog.h │ ├── clone-tasks-dialog.cpp │ ├── clone-tasks-dialog.h │ ├── clone-tasks-table-model.cpp │ ├── clone-tasks-table-model.h │ ├── clone-tasks-table-view.cpp │ ├── clone-tasks-table-view.h │ ├── cloud-view.cpp │ ├── cloud-view.h │ ├── create-repo-dialog.cpp │ ├── create-repo-dialog.h │ ├── download-repo-dialog.cpp │ ├── download-repo-dialog.h │ ├── event-details-dialog.cpp │ ├── event-details-dialog.h │ ├── event-details-tree.cpp │ ├── event-details-tree.h │ ├── events-list-view.cpp │ ├── events-list-view.h │ ├── init-seafile-dialog.cpp │ ├── init-seafile-dialog.h │ ├── init-vdrive-dialog.cpp │ ├── init-vdrive-dialog.h │ ├── loading-view.cpp │ ├── loading-view.h │ ├── login-dialog.cpp │ ├── login-dialog.h │ ├── logout-view.cpp │ ├── logout-view.h │ ├── main-window.cpp │ ├── main-window.h │ ├── private-share-dialog.cpp │ ├── private-share-dialog.h │ ├── proxy-style.cpp │ ├── proxy-style.h │ ├── repo-detail-dialog.cpp │ ├── repo-detail-dialog.h │ ├── repo-item-delegate.cpp │ ├── repo-item-delegate.h │ ├── repo-item.cpp │ ├── repo-item.h │ ├── repo-tree-model.cpp │ ├── repo-tree-model.h │ ├── repo-tree-view.cpp │ ├── repo-tree-view.h │ ├── repos-tab.cpp │ ├── repos-tab.h │ ├── seafile-tab-widget.cpp │ ├── seafile-tab-widget.h │ ├── search-bar.cpp │ ├── search-bar.h │ ├── search-tab-items.cpp │ ├── search-tab-items.h │ ├── search-tab.cpp │ ├── search-tab.h │ ├── server-status-dialog.cpp │ ├── server-status-dialog.h │ ├── set-repo-password-dialog.cpp │ ├── set-repo-password-dialog.h │ ├── settings-dialog.cpp │ ├── settings-dialog.h │ ├── ssl-confirm-dialog.cpp │ ├── ssl-confirm-dialog.h │ ├── starred-file-item-delegate.cpp │ ├── starred-file-item-delegate.h │ ├── starred-file-item.cpp │ ├── starred-file-item.h │ ├── starred-files-list-model.cpp │ ├── starred-files-list-model.h │ ├── starred-files-list-view.cpp │ ├── starred-files-list-view.h │ ├── starred-files-tab.cpp │ ├── starred-files-tab.h │ ├── sync-errors-dialog.cpp │ ├── sync-errors-dialog.h │ ├── tab-view.cpp │ ├── tab-view.h │ ├── tray-icon.cpp │ ├── tray-icon.h │ ├── two-factor-dialog.cpp │ ├── two-factor-dialog.h │ ├── uninstall-helper-dialog.cpp │ ├── uninstall-helper-dialog.h │ ├── user-name-completer.cpp │ └── user-name-completer.h └── utils │ ├── api-utils.cpp │ ├── api-utils.h │ ├── file-utils.cpp │ ├── file-utils.h │ ├── json-utils.cpp │ ├── json-utils.h │ ├── log.c │ ├── log.h │ ├── paint-utils.cpp │ ├── paint-utils.h │ ├── process-linux.cpp │ ├── process-mac.cpp │ ├── process-win.cpp │ ├── process.h │ ├── registry.cpp │ ├── registry.h │ ├── rsa.cpp │ ├── rsa.h │ ├── seafile-error.cpp │ ├── seafile-error.h │ ├── singleton.h │ ├── stl.cpp │ ├── stl.h │ ├── translate-commit-desc.cpp │ ├── translate-commit-desc.h │ ├── uninstall-helpers.cpp │ ├── uninstall-helpers.h │ ├── utils-mac.h │ ├── utils-mac.mm │ ├── utils-win.cpp │ ├── utils-win.h │ ├── utils.cpp │ └── utils.h ├── tests ├── CMakeLists.txt ├── test_file-utils.cpp ├── test_file-utils.h ├── test_server-info.cpp ├── test_server-info.h ├── test_stl.cpp ├── test_stl.h ├── test_utils.cpp └── test_utils.h ├── third_party ├── QtAwesome │ ├── QtAwesome.cpp │ ├── QtAwesome.h │ ├── QtAwesome.qrc │ └── fonts │ │ └── fontawesome.ttf ├── WinSparkle-0.5.3 │ ├── AUTHORS │ ├── COPYING │ ├── NEWS │ ├── README.md │ ├── Release │ │ ├── WinSparkle.dll │ │ ├── WinSparkle.lib │ │ └── WinSparkle.pdb │ ├── include │ │ ├── winsparkle-version.h │ │ └── winsparkle.h │ └── x64 │ │ └── Release │ │ ├── WinSparkle.dll │ │ ├── WinSparkle.lib │ │ └── WinSparkle.pdb └── quazip │ ├── JlCompress.cpp │ ├── JlCompress.h │ ├── ioapi.h │ ├── minizip_crypt.h │ ├── qioapi.cpp │ ├── quaadler32.cpp │ ├── quaadler32.h │ ├── quachecksum32.cpp │ ├── quachecksum32.h │ ├── quacrc32.cpp │ ├── quacrc32.h │ ├── quagzipfile.cpp │ ├── quagzipfile.h │ ├── quaziodevice.cpp │ ├── quaziodevice.h │ ├── quazip.cpp │ ├── quazip.h │ ├── quazip.sln │ ├── quazip.vcxproj │ ├── quazip.vcxproj.filters │ ├── quazip_global.h │ ├── quazipdir.cpp │ ├── quazipdir.h │ ├── quazipfile.cpp │ ├── quazipfile.h │ ├── quazipfileinfo.cpp │ ├── quazipfileinfo.h │ ├── quazipnewinfo.cpp │ ├── quazipnewinfo.h │ ├── unzip.c │ ├── unzip.h │ ├── vcpkg.json │ ├── zip.c │ └── zip.h ├── ui ├── about-dialog.ui ├── account-settings-dialog.ui ├── account-view.ui ├── clone-tasks-dialog.ui ├── cloud-view.ui ├── create-repo-dialog.ui ├── download-repo-dialog.ui ├── init-seafile-dialog.ui ├── init-vdrive-dialog.ui ├── login-dialog.ui ├── private-share-dialog.ui ├── repo-detail-dialog.ui ├── server-status-dialog.ui ├── set-repo-password-dialog.ui ├── settings-dialog.ui ├── ssl-confirm-dialog.ui ├── two-factor-dialog.ui └── uninstall-helper-dialog.ui └── vcpkg.json /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: required 2 | dist: trusty 3 | language: cpp 4 | matrix: 5 | include: 6 | - os: linux 7 | compiler: gcc 8 | env: BUILD_SHIBBOLETH_SUPPORT=ON 9 | - os: linux 10 | compiler: gcc 11 | env: BUILD_SHIBBOLETH_SUPPORT=OFF 12 | exclude: 13 | - os: osx 14 | compiler: gcc 15 | before_install: 16 | - ./scripts/install-deps-${TRAVIS_OS_NAME}.sh 17 | script: 18 | - ./scripts/ci-build.sh 19 | notifications: 20 | email: 21 | recipients: 22 | - linshuai2012@gmail.com 23 | - rwindz0@gmail.com 24 | slack: 25 | secure: RhwjY2BL0bR6MD+ASvFptH9GJmT0CshRN4YoZgK80D/H1kK60nVjfYIwU0apmhG8J3Sz9jqQ5xGPBUXvAgKB9VzdGQVgo23kGm9P2AY6xM43HHcPJvuXEBeX6zCx1O2HyGmENq36Z9ZnDWxW9yswnXKmeb05lE+PisBn1XvWQrs= 26 | on_success: change 27 | on_failure: always 28 | -------------------------------------------------------------------------------- /.tx/config: -------------------------------------------------------------------------------- 1 | [main] 2 | host = https://www.transifex.com 3 | 4 | [o:haiwen:p:seafile-client:r:master] 5 | file_filter = i18n/seafile_.ts 6 | source_file = i18n/seafile_en.ts 7 | source_lang = en 8 | type = TS 9 | 10 | -------------------------------------------------------------------------------- /Application.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## seafile-client [![Build Status](https://secure.travis-ci.org/haiwen/seafile-client.svg?branch=master)](http://travis-ci.org/haiwen/seafile-client) 2 | 3 | [Seafile](https://seafile.com) desktop client. 4 | 5 | ## BUILD ## 6 | 7 | ### Prerequisites ### 8 | 9 | - Qt5 10 | - cmake 11 | - [libsearpc](https://github.com/haiwen/libsearpc) 12 | - [seafile](https://github.com/haiwen/seafile) 13 | 14 | ### INSTALL ### 15 | 16 | ``` 17 | cmake . 18 | make 19 | make install 20 | ``` 21 | 22 | > Qt 5.2 or higher is required 23 | 24 | Ubuntu users can install seafile client from this [PPA](https://code.launchpad.net/~seafile/+archive/ubuntu/seafile-client) 25 | 26 | ### INSTALL with Qt5 ### 27 | 28 | ``` 29 | cmake . 30 | make 31 | make install 32 | ``` 33 | 34 | > Qt 5.5 or higher is recommanded but not required 35 | 36 | ## Internationalization 37 | 38 | You are welcome to add translation in your language. 39 | 40 | ### Contribute your translation 41 | 42 | Please submit translations via Transifex: 43 | 44 | Steps: 45 | 46 | 1. Visit the webpage of Transifex ([https://explore.transifex.com/haiwen/seafile-client/](https://explore.transifex.com/haiwen/seafile-client/)). 47 | 48 | 2. Click the "Join this project" button in the bottom right corner. 49 | 50 | 3. Use an email or GitHub account(recommended) to create an account. 51 | 52 | 4. Select a language and click 'Join project' to join the language translation. 53 | 54 | 5. After accepted by the project maintainer, then you can upload your file or translate online. 55 | -------------------------------------------------------------------------------- /appcast.example.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Seafile client updates 5 | Appcast for test Seafile client updates. 6 | en 7 | 8 | Version 6.0.4 9 | http://localhost/SeafileClientChangeLog.html 10 | Tue, 16 Sep 2016 18:11:12 +0200 11 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /coding-style.md: -------------------------------------------------------------------------------- 1 | ## C++ Coding Style 2 | 3 | Mainly borrowed from [google c++ style coding style](http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml) 4 | 5 | ### Naming Conventions 6 | 7 | #### Member Vairables 8 | 9 | Lower case words seprated by underscores, and ends with an underscore, e.g. `repos_list_`, `context_menu_` 10 | 11 | #### Variables in Qt Ui Files 12 | 13 | Camel case starts with a "m", e.g. `mUserNameText`, `mServerAddr` 14 | 15 | #### Functions 16 | 17 | Camel case, e.g. `showRepos` 18 | 19 | #### Setter and Getter 20 | 21 | - setter: `setRepoName()` 22 | - getter: `repoName()` 23 | 24 | #### Constants 25 | 26 | Camel case starts with "k", e.g. : 27 | 28 | const int kRepoRefreshInterval = 1000; 29 | const char *kDefaultName = "seafile"; 30 | 31 | Use constants variables instead of macros to define constants. 32 | 33 | ### Invoking functions 34 | 35 | - constant function parameter must be passed by object reference 36 | - No `this->` when invoking member functions. 37 | 38 | ### Others 39 | 40 | - no source file scope static variable/function, use anonymous namespace 41 | - use forward declaration when possible, instead of including unnecessary header files 42 | - Never use exceptions 43 | 44 | -------------------------------------------------------------------------------- /data/com.seafile.seafile-applet.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Name=Seafile 3 | Comment=Seafile desktop sync client 4 | TryExec=seafile-applet 5 | Exec=seafile-applet 6 | Icon=seafile 7 | Type=Application 8 | Categories=Network;FileTransfer; 9 | -------------------------------------------------------------------------------- /data/icons/128x128/apps/seafile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/data/icons/128x128/apps/seafile.png -------------------------------------------------------------------------------- /data/icons/16x16/apps/seafile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/data/icons/16x16/apps/seafile.png -------------------------------------------------------------------------------- /data/icons/22x22/apps/seafile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/data/icons/22x22/apps/seafile.png -------------------------------------------------------------------------------- /data/icons/24x24/apps/seafile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/data/icons/24x24/apps/seafile.png -------------------------------------------------------------------------------- /data/icons/32x32/apps/seafile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/data/icons/32x32/apps/seafile.png -------------------------------------------------------------------------------- /data/icons/48x48/apps/seafile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/data/icons/48x48/apps/seafile.png -------------------------------------------------------------------------------- /debian/README.Debian: -------------------------------------------------------------------------------- 1 | Seafile 2 | ------- 3 | 4 | For more information about Seafile, please visit http://seafile.com 5 | 6 | -- plt Fri, 30 March 2012 16:43:10 +0800 7 | -------------------------------------------------------------------------------- /debian/compat: -------------------------------------------------------------------------------- 1 | 7 2 | -------------------------------------------------------------------------------- /debian/control: -------------------------------------------------------------------------------- 1 | Source: seafile-gui 2 | Section: net 3 | Priority: extra 4 | Maintainer: m.eik michalke 5 | Build-Depends: 6 | debhelper (>= 7), 7 | libssl-dev, 8 | libcurl4-openssl-dev, 9 | libsqlite3-dev, 10 | intltool, 11 | libglib2.0-dev, 12 | libevent-dev, 13 | uuid-dev, 14 | qtbase5-dev, 15 | libqt5webkit5-dev, 16 | qttools5-dev, 17 | libtool, 18 | valac, 19 | libjansson-dev, 20 | cmake, 21 | qtchooser, 22 | qttools5-dev-tools, 23 | libsearpc-dev (>= 3.1.0), 24 | libseafile-dev 25 | Standards-Version: 3.9.5 26 | Homepage: http://seafile.com 27 | 28 | Package: seafile-gui 29 | Architecture: any 30 | Depends: 31 | ${shlibs:Depends}, 32 | ${misc:Depends}, 33 | seafile-daemon (>= 5.1.2) 34 | Conflicts: seafile 35 | Description: Seafile desktop client. 36 | Seafile is an open source cloud storage system with features 37 | on privacy protection and teamwork. Collections of files are 38 | called libraries, and each library can be synced separately. 39 | A library can also be encrypted with a user chosen password. 40 | Seafile also allows users to create groups and easily sharing 41 | files into groups. 42 | 43 | Package: seafile-gui-dbg 44 | Section: debug 45 | Architecture: any 46 | Depends: 47 | seafile-gui (= ${binary:Version}), 48 | ${misc:Depends}, 49 | Description: Debugging symbols for the seafile-gui package. 50 | This package contains the debugging symbols for the seafile-gui package. 51 | -------------------------------------------------------------------------------- /debian/copyright: -------------------------------------------------------------------------------- 1 | Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ 2 | Upstream-Name: seafile-client 3 | Upstream-Contact: Lingtao Pan 4 | Source: https://github.com/haiwen/seafile-client 5 | 6 | Files: * 7 | Copyright: 2012 plt 8 | License: Apache 9 | You should have received a copy of the license with your Debian system, 10 | in the file /usr/share/common-licenses/Apache-2.0, or with the 11 | source package as the file COPYING or LICENSE. 12 | 13 | Files: debian/* 14 | Copyright: 2016 m.eik michalke 15 | License: GPL-2 16 | This program is free software; you can redistribute it 17 | and/or modify it under the terms of the GNU General Public 18 | License as published by the Free Software Foundation; either 19 | version 2 of the License, or (at your option) any later 20 | version. 21 | . 22 | This software is distributed in the hope that it will be useful, but 23 | WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 24 | or FITNESS FOR A PARTICULAR PURPOSE. 25 | . 26 | You should have received a copy of the license with your Debian system, 27 | in the file /usr/share/common-licenses/GPL-2, or with the 28 | source package as the file COPYING or LICENSE. 29 | -------------------------------------------------------------------------------- /debian/rules: -------------------------------------------------------------------------------- 1 | #!/usr/bin/make -f 2 | # -*- makefile -*- 3 | 4 | %: 5 | dh $@ --builddirectory=build 6 | 7 | override_dh_auto_configure: 8 | export QT_SELECT=5 9 | dh_auto_configure -- -DCMAKE_BUILD_TYPE=Release -DBUILD_SHIBBOLETH_SUPPORT=ON 10 | 11 | override_dh_auto_build: 12 | dh_auto_build --parallel 13 | 14 | override_dh_strip: 15 | dh_strip -pseafile-gui --dbg-package=seafile-gui-dbg 16 | -------------------------------------------------------------------------------- /debian/seafile-gui.install: -------------------------------------------------------------------------------- 1 | usr/bin/seafile-applet 2 | usr/share/pixmaps/seafile.png 3 | usr/share/applications/com.seafile.seafile-applet.desktop 4 | usr/share/icons/hicolor/*/apps/seafile.png 5 | -------------------------------------------------------------------------------- /debian/source/format: -------------------------------------------------------------------------------- 1 | 3.0 (quilt) 2 | -------------------------------------------------------------------------------- /dev-guide.md: -------------------------------------------------------------------------------- 1 | ## C++ Coding Style 2 | 3 | Refer to `coding-style.md` 4 | 5 | ## I18N 6 | 7 | ### update the .ts files 8 | 9 | make update-ts 10 | 11 | 12 | ### Add a new language 13 | 14 | 1. add the language to the LANGUAGES variable in `CMakeLists.txt` 15 | 16 | SET(LANGUAGES zh_CN xx_YY) 17 | 18 | 2. make update-ts 19 | 20 | 3. add a line to `seafile-client.qrc` 21 | 22 | i18n/seafile_xx_YY.qm 23 | 24 | ### Add a New Language Contributed by Others 25 | 26 | 1. add the language to the LANGUAGES variable in `CMakeLists.txt` 27 | 28 | SET(LANGUAGES zh_CN xx_YY) 29 | 30 | 2. add a line to `seafile-client.qrc` 31 | 32 | i18n/seafile_xx_YY.qm 33 | 34 | -------------------------------------------------------------------------------- /extensions/README.md: -------------------------------------------------------------------------------- 1 | This folder contains the code for Seafile Shell extension. 2 | 3 | 4 | ## Build 64 bit DLL 5 | 6 | Download [MinGW64 toochain](http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Automated%20Builds/mingw-w64-bin_i686-mingw_20111220.zip/download) 7 | 8 | Or download the [online-installer](http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/installer/mingw-w64-install.exe/download) 9 | 10 | ## String Encoding 11 | 12 | There are three encoding involved in the extension: 13 | 14 | - windows unicode (`wchar_t *`) 15 | - utf8 16 | - windows multi bytes encoding (ANSI) 17 | 18 | The conventions are: 19 | 20 | - Strings in internal data structures must be stored as utf8. 21 | - Messages exchanged between shell extension and seafile applet should be encoded in utf8. 22 | 23 | 24 | ## Debugging tips 25 | 26 | When developing the shell extensions, one need to restart the explorer frequently to reload the extension. Here is a piece of code that can programmatically stop explorer: (From http://stackoverflow.com/a/5705965/1467959) 27 | 28 | ```c 29 | BOOL ExitExplorer() 30 | { 31 | HWND hWndTray = FindWindow(_T("Shell_TrayWnd"), NULL); 32 | return PostMessage(hWndTray, 0x5B4, 0, 0); 33 | } 34 | ``` 35 | -------------------------------------------------------------------------------- /extensions/build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | unset -v CPPFLAGS CFLAGS CXXFLAGS LDFLAGS 6 | 7 | SCRIPT=$(readlink -f "$0") 8 | SRCDIR=$(dirname "${SCRIPT}") 9 | 10 | cd $SRCDIR 11 | 12 | rm -rf CMakeCache.txt CMakeFiles 13 | export CXX=g++ 14 | cmake -DX32=ON -G "MSYS Makefiles" . 15 | make 16 | 17 | rm -rf CMakeCache.txt CMakeFiles 18 | export CXX=x86_64-w64-mingw32-g++ 19 | cmake -G "MSYS Makefiles" . 20 | make 21 | -------------------------------------------------------------------------------- /extensions/class-factory.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_EXT_SHELL_EXT_CLASS_FACTORY_H 2 | #define SEAFILE_EXT_SHELL_EXT_CLASS_FACTORY_H 3 | 4 | #include "shell-ext.h" 5 | 6 | /** 7 | * Class factory's main responsibility is implemented in its `CreateInstance` 8 | * member function, which creates instances of the required shell extension 9 | * interface, such as IContextMenu. 10 | * 11 | * Class factory object is created by `DllGetClassObject` method for this 12 | * extension. 13 | */ 14 | class ShellExtClassFactory : public IClassFactory 15 | { 16 | protected: 17 | ULONG m_cRef; 18 | 19 | seafile::RepoInfo::Status status_; 20 | 21 | public: 22 | ShellExtClassFactory(seafile::RepoInfo::Status status = seafile::RepoInfo::NoStatus); 23 | virtual ~ShellExtClassFactory(); 24 | 25 | //@{ 26 | /// IUnknown members 27 | STDMETHODIMP QueryInterface(REFIID, LPVOID FAR *); 28 | STDMETHODIMP_(ULONG) AddRef(); 29 | STDMETHODIMP_(ULONG) Release(); 30 | //@} 31 | 32 | //@{ 33 | /// IClassFactory members 34 | STDMETHODIMP CreateInstance(LPUNKNOWN, REFIID, LPVOID FAR *); 35 | STDMETHODIMP LockServer(BOOL); 36 | //@} 37 | }; 38 | 39 | #endif // SEAFILE_EXT_SHELL_EXT_CLASS_FACTORY_H 40 | -------------------------------------------------------------------------------- /extensions/error.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/extensions/error.ico -------------------------------------------------------------------------------- /extensions/ext-common.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_EXT_EXT_COMMON_H 2 | #define SEAFILE_EXT_EXT_COMMON_H 3 | 4 | // This header should be the first include of each cpp source file 5 | 6 | // A workaround for some mingw problem. 7 | // See http://stackoverflow.com/questions/3445312/swprintf-and-vswprintf-not-declared 8 | #undef __STRICT_ANSI__ 9 | 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | 18 | #include 19 | #include 20 | #include 21 | #include 22 | 23 | #include 24 | #include 25 | #include 26 | #include 27 | 28 | #endif // SEAFILE_EXT_EXT_COMMON_H 29 | -------------------------------------------------------------------------------- /extensions/guids.h: -------------------------------------------------------------------------------- 1 | // The class IDs of these Shell extension class. 2 | // 3 | // class ids: 4 | // 5 | // D14BEDD3-4E05-4F2F-B0DE-C0381E6AE606 6 | // 7 | // 8 | 9 | DEFINE_GUID(CLSID_SEAFILE_SHELLEXT,0xd14bedd3, 0x4e05, 0x4f2f, 0xb0, 0xde, 0xc0, 0x38, 0x1e, 0x6a, 0xe6, 0x06); 10 | 11 | DEFINE_GUID(CLSID_SEAFILE_ICON_NORMAL,0xd14bedd3, 0x4e05, 0x4f2f, 0xb0, 0xde, 0xc0, 0x38, 0x1e, 0x6a, 0xe6, 0x07); 12 | 13 | DEFINE_GUID(CLSID_SEAFILE_ICON_SYNCING,0xd14bedd3, 0x4e05, 0x4f2f, 0xb0, 0xde, 0xc0, 0x38, 0x1e, 0x6a, 0xe6, 0x08); 14 | 15 | DEFINE_GUID(CLSID_SEAFILE_ICON_ERROR,0xd14bedd3, 0x4e05, 0x4f2f, 0xb0, 0xde, 0xc0, 0x38, 0x1e, 0x6a, 0xe6, 0x09); 16 | 17 | DEFINE_GUID(CLSID_SEAFILE_ICON_PAUSED,0xd14bedd3, 0x4e05, 0x4f2f, 0xb0, 0xde, 0xc0, 0x38, 0x1e, 0x6a, 0xe6, 0x10); 18 | 19 | DEFINE_GUID(CLSID_SEAFILE_ICON_LOCKED_BY_ME,0xd14bedd3, 0x4e05, 0x4f2f, 0xb0, 0xde, 0xc0, 0x38, 0x1e, 0x6a, 0xe6, 0x11); 20 | 21 | DEFINE_GUID(CLSID_SEAFILE_ICON_LOCKED_BY_OTHERS,0xd14bedd3, 0x4e05, 0x4f2f, 0xb0, 0xde, 0xc0, 0x38, 0x1e, 0x6a, 0xe6, 0x12); 22 | -------------------------------------------------------------------------------- /extensions/i18n.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_EXT_I18N_H 2 | #define SEAFILE_EXT_I18N_H 3 | 4 | #include 5 | 6 | namespace seafile { 7 | 8 | std::string getString(const std::string& src); 9 | 10 | } // namespace seafile 11 | 12 | #endif // SEAFILE_EXT_I18N_H 13 | -------------------------------------------------------------------------------- /extensions/locked-by-me.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/extensions/locked-by-me.ico -------------------------------------------------------------------------------- /extensions/locked-by-others.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/extensions/locked-by-others.ico -------------------------------------------------------------------------------- /extensions/log.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_EXTENSION_LOG_H 2 | #define SEAFILE_CLIENT_EXTENSION_LOG_H 3 | 4 | void seaf_ext_log_start(); 5 | void seaf_ext_log_stop(); 6 | 7 | void seaf_ext_log_aux(const char *format, ...); 8 | 9 | #define seaf_ext_log(format, ... ) \ 10 | seaf_ext_log_aux("%s(line %d) %s: " format, \ 11 | __FILE__, __LINE__, __func__, ##__VA_ARGS__) \ 12 | 13 | 14 | #endif // SEAFILE_CLIENT_EXTENSION_LOG_H 15 | -------------------------------------------------------------------------------- /extensions/normal.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/extensions/normal.ico -------------------------------------------------------------------------------- /extensions/paused.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/extensions/paused.ico -------------------------------------------------------------------------------- /extensions/readonly.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/extensions/readonly.ico -------------------------------------------------------------------------------- /extensions/seafile_shell_ext.def: -------------------------------------------------------------------------------- 1 | LIBRARY seafile_shell_ext 2 | EXPORTS 3 | DllMain 4 | DllCanUnloadNow PRIVATE 5 | DllGetClassObject PRIVATE 6 | -------------------------------------------------------------------------------- /extensions/seafile_shell_ext.rc: -------------------------------------------------------------------------------- 1 | 1 ICON DISCARDABLE "paused.ico" 2 | 2 ICON DISCARDABLE "normal.ico" 3 | 3 ICON DISCARDABLE "syncing.ico" 4 | 4 ICON DISCARDABLE "error.ico" 5 | 5 ICON DISCARDABLE "locked-by-me.ico" 6 | 6 ICON DISCARDABLE "locked-by-others.ico" 7 | -------------------------------------------------------------------------------- /extensions/syncing.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/extensions/syncing.ico -------------------------------------------------------------------------------- /fsplugin/.clang-format: -------------------------------------------------------------------------------- 1 | BasedOnStyle: LLVM 2 | Standard: Cpp11 3 | IndentWidth: 4 4 | TabWidth: 4 5 | -------------------------------------------------------------------------------- /fsplugin/.tx/config: -------------------------------------------------------------------------------- 1 | [main] 2 | host = https://www.transifex.com 3 | 4 | [seafile-client.finder-sync] 5 | file_filter = .lproj/Localizable.strings 6 | source_file = en.lproj/Localizable.strings 7 | source_lang = en 8 | type = STRINGS 9 | 10 | -------------------------------------------------------------------------------- /fsplugin/FinderSync.h: -------------------------------------------------------------------------------- 1 | // 2 | // FinderSync.h 3 | // seafile-client-fsplugin 4 | // 5 | // Created by Chilledheart on 1/10/15. 6 | // Copyright (c) 2015 Haiwen. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface FinderSync : FIFinderSync 13 | - (void)updateWatchSet:(void *)ptr_to_new_repos; 14 | - (void)updateFileStatus:(const char *)repo_id 15 | path:(const char *)path 16 | status:(uint32_t)status; 17 | @end 18 | -------------------------------------------------------------------------------- /fsplugin/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | Seafile FinderSync 9 | CFBundleExecutable 10 | Seafile FinderSync 11 | CFBundleIconFile 12 | seafile 13 | CFBundleIdentifier 14 | com.seafile.seafile-client.findersync 15 | CFBundleInfoDictionaryVersion 16 | 6.0 17 | CFBundleName 18 | Seafile FinderSync 19 | CFBundlePackageType 20 | XPC! 21 | CFBundleShortVersionString 22 | 1.0 23 | CFBundleSignature 24 | ???? 25 | CFBundleVersion 26 | 1 27 | LSMinimumSystemVersion 28 | 10.10 29 | LSUIElement 30 | 31 | NSExtension 32 | 33 | NSExtensionAttributes 34 | 35 | NSExtensionPointIdentifier 36 | com.apple.FinderSync 37 | NSExtensionPrincipalClass 38 | FinderSync 39 | 40 | NSHumanReadableCopyright 41 | Copyright © 2015 海文互知. All rights reserved. 42 | NSPrincipalClass 43 | NSApplication 44 | 45 | 46 | -------------------------------------------------------------------------------- /fsplugin/bg_BG.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/bg_BG.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -x 4 | set -e 5 | 6 | CURRENT_PWD="$(dirname "${BASH_SOURCE[0]}")" 7 | 8 | if [ "$(uname -s)" != "Darwin" ]; then 9 | echo "don't run it if you are not using Mac OS X" 10 | exit -1 11 | fi 12 | 13 | export CC=$(xcrun -f clang) 14 | export CXX=$(xcrun -f clang) 15 | unset CFLAGS CXXFLAGS LDFLAGS 16 | 17 | pushd $CURRENT_PWD 18 | CONFIG=Debug 19 | if [ a"$1" != "adebug" ]; then 20 | rm -rf CMakeCache.txt CMakeFiles 21 | CONFIG=Release 22 | fi 23 | 24 | if [ a"$1" != "auniversal" ]; then 25 | cmake -GXcode -DCMAKE_BUILD_TYPE="$CONFIG" 26 | else 27 | cmake -GXcode -DCMAKE_BUILD_TYPE="$CONFIG" -DCMAKE_OSX_ARCHITECTURES='x86_64;arm64' 28 | fi 29 | 30 | xcodebuild clean 31 | xcodebuild -jobs "$(sysctl -n hw.ncpu)" -configuration "$CONFIG" 32 | popd 33 | 34 | -------------------------------------------------------------------------------- /fsplugin/ca.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/ca.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/cs_CZ.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/cs_CZ.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/de_DE.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/de_DE.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/el_GR.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/el_GR.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/en.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/en.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/es.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/es.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/es_AR.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/es_AR.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/es_MX.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/es_MX.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/et_EE.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/et_EE.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/fr_FR.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/fr_FR.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/he_IL.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/he_IL.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/hu_HU.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/hu_HU.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/is.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/is.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/it.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/it.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/ja.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/ja.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/ko_KR.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/ko_KR.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/lv.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/lv.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/nb_NO.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/nb_NO.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/nl_BE.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/nl_BE.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/nl_NL.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/nl_NL.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/pl_PL.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/pl_PL.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/pt_BR.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/pt_BR.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/pt_PT.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/pt_PT.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/ru.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/ru.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/seafile-fsplugin.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.files.user-selected.read-only 8 | 9 | com.apple.security.application-groups 10 | 11 | com.seafile.seafile-client.findersync 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /fsplugin/sk_SK.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/sk_SK.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/status-done.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/status-done.icns -------------------------------------------------------------------------------- /fsplugin/status-error.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/status-error.icns -------------------------------------------------------------------------------- /fsplugin/status-ignored.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/status-ignored.icns -------------------------------------------------------------------------------- /fsplugin/status-locked-by-me.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/status-locked-by-me.icns -------------------------------------------------------------------------------- /fsplugin/status-locked.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/status-locked.icns -------------------------------------------------------------------------------- /fsplugin/status-syncing.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/status-syncing.icns -------------------------------------------------------------------------------- /fsplugin/sv.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/sv.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/tr.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/tr.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/uk.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/uk.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/zh_CN.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/zh_CN.lproj/Localizable.strings -------------------------------------------------------------------------------- /fsplugin/zh_TW.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/fsplugin/zh_TW.lproj/Localizable.strings -------------------------------------------------------------------------------- /images/account-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/account-256.png -------------------------------------------------------------------------------- /images/account-checked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/account-checked.png -------------------------------------------------------------------------------- /images/account-checked@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/account-checked@2x.png -------------------------------------------------------------------------------- /images/account-else.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/account-else.png -------------------------------------------------------------------------------- /images/account-else@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/account-else@2x.png -------------------------------------------------------------------------------- /images/account-settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/account-settings.png -------------------------------------------------------------------------------- /images/account-settings@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/account-settings@2x.png -------------------------------------------------------------------------------- /images/account.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/account.png -------------------------------------------------------------------------------- /images/account@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/account@2x.png -------------------------------------------------------------------------------- /images/add-account.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/add-account.png -------------------------------------------------------------------------------- /images/add-account@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/add-account@2x.png -------------------------------------------------------------------------------- /images/cancel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/cancel.png -------------------------------------------------------------------------------- /images/cancel@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/cancel@2x.png -------------------------------------------------------------------------------- /images/clock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/clock.png -------------------------------------------------------------------------------- /images/clock@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/clock@2x.png -------------------------------------------------------------------------------- /images/cloud-gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/cloud-gray.png -------------------------------------------------------------------------------- /images/cloud-gray@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/cloud-gray@2x.png -------------------------------------------------------------------------------- /images/daemon_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/daemon_down.png -------------------------------------------------------------------------------- /images/daemon_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/daemon_up.png -------------------------------------------------------------------------------- /images/delete-account.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/delete-account.png -------------------------------------------------------------------------------- /images/delete-account@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/delete-account@2x.png -------------------------------------------------------------------------------- /images/disk@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/disk@2x.png -------------------------------------------------------------------------------- /images/download-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/download-48.png -------------------------------------------------------------------------------- /images/filebrowser/add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/filebrowser/add.png -------------------------------------------------------------------------------- /images/filebrowser/add@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/filebrowser/add@2x.png -------------------------------------------------------------------------------- /images/filebrowser/backward.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/filebrowser/backward.png -------------------------------------------------------------------------------- /images/filebrowser/backward@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/filebrowser/backward@2x.png -------------------------------------------------------------------------------- /images/filebrowser/down-arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/filebrowser/down-arrow.png -------------------------------------------------------------------------------- /images/filebrowser/forward.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/filebrowser/forward.png -------------------------------------------------------------------------------- /images/filebrowser/forward@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/filebrowser/forward@2x.png -------------------------------------------------------------------------------- /images/filebrowser/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/filebrowser/home.png -------------------------------------------------------------------------------- /images/filebrowser/home@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/filebrowser/home@2x.png -------------------------------------------------------------------------------- /images/filebrowser/locked-by-me.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/filebrowser/locked-by-me.png -------------------------------------------------------------------------------- /images/filebrowser/locked-by-me@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/filebrowser/locked-by-me@2x.png -------------------------------------------------------------------------------- /images/filebrowser/locked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/filebrowser/locked.png -------------------------------------------------------------------------------- /images/filebrowser/locked@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/filebrowser/locked@2x.png -------------------------------------------------------------------------------- /images/filebrowser/path-separator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/filebrowser/path-separator.png -------------------------------------------------------------------------------- /images/filebrowser/path-separator@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/filebrowser/path-separator@2x.png -------------------------------------------------------------------------------- /images/filebrowser/refresh-gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/filebrowser/refresh-gray.png -------------------------------------------------------------------------------- /images/filebrowser/refresh-gray@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/filebrowser/refresh-gray@2x.png -------------------------------------------------------------------------------- /images/filebrowser/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/filebrowser/settings.png -------------------------------------------------------------------------------- /images/filebrowser/settings@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/filebrowser/settings@2x.png -------------------------------------------------------------------------------- /images/filebrowser/up-arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/filebrowser/up-arrow.png -------------------------------------------------------------------------------- /images/files/file_audio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files/file_audio.png -------------------------------------------------------------------------------- /images/files/file_audio@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files/file_audio@2x.png -------------------------------------------------------------------------------- /images/files/file_folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files/file_folder.png -------------------------------------------------------------------------------- /images/files/file_folder@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files/file_folder@2x.png -------------------------------------------------------------------------------- /images/files/file_folder_readonly.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files/file_folder_readonly.png -------------------------------------------------------------------------------- /images/files/file_folder_readonly@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files/file_folder_readonly@2x.png -------------------------------------------------------------------------------- /images/files/file_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files/file_image.png -------------------------------------------------------------------------------- /images/files/file_image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files/file_image@2x.png -------------------------------------------------------------------------------- /images/files/file_ms_excel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files/file_ms_excel.png -------------------------------------------------------------------------------- /images/files/file_ms_excel@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files/file_ms_excel@2x.png -------------------------------------------------------------------------------- /images/files/file_ms_ppt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files/file_ms_ppt.png -------------------------------------------------------------------------------- /images/files/file_ms_ppt@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files/file_ms_ppt@2x.png -------------------------------------------------------------------------------- /images/files/file_ms_word.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files/file_ms_word.png -------------------------------------------------------------------------------- /images/files/file_ms_word@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files/file_ms_word@2x.png -------------------------------------------------------------------------------- /images/files/file_pdf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files/file_pdf.png -------------------------------------------------------------------------------- /images/files/file_pdf@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files/file_pdf@2x.png -------------------------------------------------------------------------------- /images/files/file_text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files/file_text.png -------------------------------------------------------------------------------- /images/files/file_text@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files/file_text@2x.png -------------------------------------------------------------------------------- /images/files/file_unknown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files/file_unknown.png -------------------------------------------------------------------------------- /images/files/file_unknown@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files/file_unknown@2x.png -------------------------------------------------------------------------------- /images/files/file_video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files/file_video.png -------------------------------------------------------------------------------- /images/files/file_video@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files/file_video@2x.png -------------------------------------------------------------------------------- /images/files/file_zip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files/file_zip.png -------------------------------------------------------------------------------- /images/files/file_zip@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files/file_zip@2x.png -------------------------------------------------------------------------------- /images/files_v2/file_audio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files_v2/file_audio.png -------------------------------------------------------------------------------- /images/files_v2/file_audio@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files_v2/file_audio@2x.png -------------------------------------------------------------------------------- /images/files_v2/file_folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files_v2/file_folder.png -------------------------------------------------------------------------------- /images/files_v2/file_folder@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files_v2/file_folder@2x.png -------------------------------------------------------------------------------- /images/files_v2/file_folder_readonly.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files_v2/file_folder_readonly.png -------------------------------------------------------------------------------- /images/files_v2/file_folder_readonly@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files_v2/file_folder_readonly@2x.png -------------------------------------------------------------------------------- /images/files_v2/file_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files_v2/file_image.png -------------------------------------------------------------------------------- /images/files_v2/file_image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files_v2/file_image@2x.png -------------------------------------------------------------------------------- /images/files_v2/file_ms_excel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files_v2/file_ms_excel.png -------------------------------------------------------------------------------- /images/files_v2/file_ms_excel@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files_v2/file_ms_excel@2x.png -------------------------------------------------------------------------------- /images/files_v2/file_ms_ppt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files_v2/file_ms_ppt.png -------------------------------------------------------------------------------- /images/files_v2/file_ms_ppt@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files_v2/file_ms_ppt@2x.png -------------------------------------------------------------------------------- /images/files_v2/file_ms_word.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files_v2/file_ms_word.png -------------------------------------------------------------------------------- /images/files_v2/file_ms_word@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files_v2/file_ms_word@2x.png -------------------------------------------------------------------------------- /images/files_v2/file_pdf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files_v2/file_pdf.png -------------------------------------------------------------------------------- /images/files_v2/file_pdf@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files_v2/file_pdf@2x.png -------------------------------------------------------------------------------- /images/files_v2/file_text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files_v2/file_text.png -------------------------------------------------------------------------------- /images/files_v2/file_text@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files_v2/file_text@2x.png -------------------------------------------------------------------------------- /images/files_v2/file_unknown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files_v2/file_unknown.png -------------------------------------------------------------------------------- /images/files_v2/file_unknown@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files_v2/file_unknown@2x.png -------------------------------------------------------------------------------- /images/files_v2/file_video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files_v2/file_video.png -------------------------------------------------------------------------------- /images/files_v2/file_video@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files_v2/file_video@2x.png -------------------------------------------------------------------------------- /images/files_v2/file_zip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files_v2/file_zip.png -------------------------------------------------------------------------------- /images/files_v2/file_zip@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/files_v2/file_zip@2x.png -------------------------------------------------------------------------------- /images/folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/folder.png -------------------------------------------------------------------------------- /images/info-gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/info-gray.png -------------------------------------------------------------------------------- /images/info-gray@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/info-gray@2x.png -------------------------------------------------------------------------------- /images/info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/info.png -------------------------------------------------------------------------------- /images/leave-share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/leave-share.png -------------------------------------------------------------------------------- /images/leave-share@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/leave-share@2x.png -------------------------------------------------------------------------------- /images/library-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/library-256.png -------------------------------------------------------------------------------- /images/loading-spinner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/loading-spinner.gif -------------------------------------------------------------------------------- /images/logout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/logout.png -------------------------------------------------------------------------------- /images/logout@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/logout@2x.png -------------------------------------------------------------------------------- /images/mac/daemon_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/mac/daemon_down.png -------------------------------------------------------------------------------- /images/mac/daemon_down@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/mac/daemon_down@2x.png -------------------------------------------------------------------------------- /images/mac/daemon_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/mac/daemon_up.png -------------------------------------------------------------------------------- /images/mac/daemon_up@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/mac/daemon_up@2x.png -------------------------------------------------------------------------------- /images/mac/notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/mac/notification.png -------------------------------------------------------------------------------- /images/mac/notification@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/mac/notification@2x.png -------------------------------------------------------------------------------- /images/mac/seafile_auto_sync_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/mac/seafile_auto_sync_disabled.png -------------------------------------------------------------------------------- /images/mac/seafile_auto_sync_disabled@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/mac/seafile_auto_sync_disabled@2x.png -------------------------------------------------------------------------------- /images/mac/seafile_transfer_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/mac/seafile_transfer_1.png -------------------------------------------------------------------------------- /images/mac/seafile_transfer_1_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/mac/seafile_transfer_1_white.png -------------------------------------------------------------------------------- /images/mac/seafile_transfer_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/mac/seafile_transfer_2.png -------------------------------------------------------------------------------- /images/mac/seafile_transfer_2_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/mac/seafile_transfer_2_white.png -------------------------------------------------------------------------------- /images/mac/seafile_warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/mac/seafile_warning.png -------------------------------------------------------------------------------- /images/mac/seafile_warning@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/mac/seafile_warning@2x.png -------------------------------------------------------------------------------- /images/main-panel/download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/main-panel/download.png -------------------------------------------------------------------------------- /images/main-panel/download@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/main-panel/download@2x.png -------------------------------------------------------------------------------- /images/main-panel/folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/main-panel/folder.png -------------------------------------------------------------------------------- /images/main-panel/folder@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/main-panel/folder@2x.png -------------------------------------------------------------------------------- /images/main-panel/library-encrypted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/main-panel/library-encrypted.png -------------------------------------------------------------------------------- /images/main-panel/library-encrypted@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/main-panel/library-encrypted@2x.png -------------------------------------------------------------------------------- /images/main-panel/library-normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/main-panel/library-normal.png -------------------------------------------------------------------------------- /images/main-panel/library-normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/main-panel/library-normal@2x.png -------------------------------------------------------------------------------- /images/main-panel/library-readonly.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/main-panel/library-readonly.png -------------------------------------------------------------------------------- /images/main-panel/library-readonly@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/main-panel/library-readonly@2x.png -------------------------------------------------------------------------------- /images/main-panel/network-error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/main-panel/network-error.png -------------------------------------------------------------------------------- /images/main-panel/network-error@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/main-panel/network-error@2x.png -------------------------------------------------------------------------------- /images/main-panel/search-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/main-panel/search-background.png -------------------------------------------------------------------------------- /images/main-panel/search-background@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/main-panel/search-background@2x.png -------------------------------------------------------------------------------- /images/main-panel/sync.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/main-panel/sync.png -------------------------------------------------------------------------------- /images/main-panel/sync@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/main-panel/sync@2x.png -------------------------------------------------------------------------------- /images/main-panel/upload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/main-panel/upload.png -------------------------------------------------------------------------------- /images/main-panel/upload@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/main-panel/upload@2x.png -------------------------------------------------------------------------------- /images/minus-gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/minus-gray.png -------------------------------------------------------------------------------- /images/minus-gray@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/minus-gray@2x.png -------------------------------------------------------------------------------- /images/notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/notification.png -------------------------------------------------------------------------------- /images/pause-gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/pause-gray.png -------------------------------------------------------------------------------- /images/pause-gray@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/pause-gray@2x.png -------------------------------------------------------------------------------- /images/play-gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/play-gray.png -------------------------------------------------------------------------------- /images/play-gray@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/play-gray@2x.png -------------------------------------------------------------------------------- /images/remove-gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/remove-gray.png -------------------------------------------------------------------------------- /images/remove-gray@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/remove-gray@2x.png -------------------------------------------------------------------------------- /images/remove-red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/remove-red.png -------------------------------------------------------------------------------- /images/resync.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/resync.png -------------------------------------------------------------------------------- /images/resync@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/resync@2x.png -------------------------------------------------------------------------------- /images/seafile-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/seafile-24.png -------------------------------------------------------------------------------- /images/seafile-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/seafile-32.png -------------------------------------------------------------------------------- /images/seafile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/seafile.png -------------------------------------------------------------------------------- /images/seafile_auto_sync_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/seafile_auto_sync_disabled.png -------------------------------------------------------------------------------- /images/seafile_transfer_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/seafile_transfer_1.png -------------------------------------------------------------------------------- /images/seafile_transfer_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/seafile_transfer_2.png -------------------------------------------------------------------------------- /images/seafile_warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/seafile_warning.png -------------------------------------------------------------------------------- /images/share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/share.png -------------------------------------------------------------------------------- /images/share@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/share@2x.png -------------------------------------------------------------------------------- /images/svg/caret-down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /images/svg/caret-up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /images/sync/cloud-sync.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/sync/cloud-sync.png -------------------------------------------------------------------------------- /images/sync/cloud-sync@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/sync/cloud-sync@2x.png -------------------------------------------------------------------------------- /images/sync/cloud-synced.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/sync/cloud-synced.png -------------------------------------------------------------------------------- /images/sync/cloud-synced@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/sync/cloud-synced@2x.png -------------------------------------------------------------------------------- /images/sync/cloud-unsynced.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/sync/cloud-unsynced.png -------------------------------------------------------------------------------- /images/sync/cloud-unsynced@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/sync/cloud-unsynced@2x.png -------------------------------------------------------------------------------- /images/sync/done.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/sync/done.png -------------------------------------------------------------------------------- /images/sync/done@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/sync/done@2x.png -------------------------------------------------------------------------------- /images/sync/exclamation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/sync/exclamation.png -------------------------------------------------------------------------------- /images/sync/minus-sign.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/sync/minus-sign.png -------------------------------------------------------------------------------- /images/sync/pause.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/sync/pause.png -------------------------------------------------------------------------------- /images/sync/pause@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/sync/pause@2x.png -------------------------------------------------------------------------------- /images/sync/question.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/sync/question.png -------------------------------------------------------------------------------- /images/sync/status-done.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/sync/status-done.png -------------------------------------------------------------------------------- /images/sync/status-done@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/sync/status-done@2x.png -------------------------------------------------------------------------------- /images/sync/status-syncing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/sync/status-syncing.png -------------------------------------------------------------------------------- /images/sync/status-syncing@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/sync/status-syncing@2x.png -------------------------------------------------------------------------------- /images/sync/waiting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/sync/waiting.png -------------------------------------------------------------------------------- /images/sync/waiting@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/sync/waiting@2x.png -------------------------------------------------------------------------------- /images/sync_now-gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/sync_now-gray.png -------------------------------------------------------------------------------- /images/sync_now-gray@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/sync_now-gray@2x.png -------------------------------------------------------------------------------- /images/tabs/highlighted/history-orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/tabs/highlighted/history-orange.png -------------------------------------------------------------------------------- /images/tabs/highlighted/history-orange@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/tabs/highlighted/history-orange@2x.png -------------------------------------------------------------------------------- /images/tabs/highlighted/library-orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/tabs/highlighted/library-orange.png -------------------------------------------------------------------------------- /images/tabs/highlighted/library-orange@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/tabs/highlighted/library-orange@2x.png -------------------------------------------------------------------------------- /images/tabs/highlighted/search-orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/tabs/highlighted/search-orange.png -------------------------------------------------------------------------------- /images/tabs/highlighted/search-orange@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/tabs/highlighted/search-orange@2x.png -------------------------------------------------------------------------------- /images/tabs/highlighted/star-orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/tabs/highlighted/star-orange.png -------------------------------------------------------------------------------- /images/tabs/highlighted/star-orange@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/tabs/highlighted/star-orange@2x.png -------------------------------------------------------------------------------- /images/tabs/history-normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/tabs/history-normal.png -------------------------------------------------------------------------------- /images/tabs/history-normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/tabs/history-normal@2x.png -------------------------------------------------------------------------------- /images/tabs/library-normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/tabs/library-normal.png -------------------------------------------------------------------------------- /images/tabs/library-normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/tabs/library-normal@2x.png -------------------------------------------------------------------------------- /images/tabs/search-normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/tabs/search-normal.png -------------------------------------------------------------------------------- /images/tabs/search-normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/tabs/search-normal@2x.png -------------------------------------------------------------------------------- /images/tabs/star-normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/tabs/star-normal.png -------------------------------------------------------------------------------- /images/tabs/star-normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/tabs/star-normal@2x.png -------------------------------------------------------------------------------- /images/toolbar/add-gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/toolbar/add-gray.png -------------------------------------------------------------------------------- /images/toolbar/add-gray@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/toolbar/add-gray@2x.png -------------------------------------------------------------------------------- /images/toolbar/add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/toolbar/add.png -------------------------------------------------------------------------------- /images/toolbar/add@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/toolbar/add@2x.png -------------------------------------------------------------------------------- /images/toolbar/download-gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/toolbar/download-gray.png -------------------------------------------------------------------------------- /images/toolbar/download-gray@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/toolbar/download-gray@2x.png -------------------------------------------------------------------------------- /images/toolbar/download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/toolbar/download.png -------------------------------------------------------------------------------- /images/toolbar/download@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/toolbar/download@2x.png -------------------------------------------------------------------------------- /images/toolbar/file-gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/toolbar/file-gray.png -------------------------------------------------------------------------------- /images/toolbar/file-gray@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/toolbar/file-gray@2x.png -------------------------------------------------------------------------------- /images/toolbar/file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/toolbar/file.png -------------------------------------------------------------------------------- /images/toolbar/file@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/toolbar/file@2x.png -------------------------------------------------------------------------------- /images/toolbar/refresh-gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/toolbar/refresh-gray.png -------------------------------------------------------------------------------- /images/toolbar/refresh-gray@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/toolbar/refresh-gray@2x.png -------------------------------------------------------------------------------- /images/toolbar/refresh-new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/toolbar/refresh-new.png -------------------------------------------------------------------------------- /images/toolbar/refresh-new@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/toolbar/refresh-new@2x.png -------------------------------------------------------------------------------- /images/toolbar/refresh-orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/toolbar/refresh-orange.png -------------------------------------------------------------------------------- /images/toolbar/refresh-orange@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/toolbar/refresh-orange@2x.png -------------------------------------------------------------------------------- /images/toolbar/refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/toolbar/refresh.png -------------------------------------------------------------------------------- /images/toolbar/refresh@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/toolbar/refresh@2x.png -------------------------------------------------------------------------------- /images/toolbar/settings-orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/toolbar/settings-orange.png -------------------------------------------------------------------------------- /images/toolbar/settings-orange@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/toolbar/settings-orange@2x.png -------------------------------------------------------------------------------- /images/toolbar/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/toolbar/settings.png -------------------------------------------------------------------------------- /images/toolbar/settings@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/toolbar/settings@2x.png -------------------------------------------------------------------------------- /images/toolbar/sorts-orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/toolbar/sorts-orange.png -------------------------------------------------------------------------------- /images/toolbar/sorts-orange@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/toolbar/sorts-orange@2x.png -------------------------------------------------------------------------------- /images/toolbar/sorts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/toolbar/sorts.png -------------------------------------------------------------------------------- /images/toolbar/sorts@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/toolbar/sorts@2x.png -------------------------------------------------------------------------------- /images/win/daemon_down.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/win/daemon_down.ico -------------------------------------------------------------------------------- /images/win/daemon_up.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/win/daemon_up.ico -------------------------------------------------------------------------------- /images/win/notification.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/win/notification.ico -------------------------------------------------------------------------------- /images/win/seafile_auto_sync_disabled.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/win/seafile_auto_sync_disabled.ico -------------------------------------------------------------------------------- /images/win/seafile_transfer_1.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/win/seafile_transfer_1.ico -------------------------------------------------------------------------------- /images/win/seafile_transfer_2.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/win/seafile_transfer_2.ico -------------------------------------------------------------------------------- /images/win/seafile_warning.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/images/win/seafile_warning.ico -------------------------------------------------------------------------------- /qt-linux.css: -------------------------------------------------------------------------------- 1 | 2 | PrivateShareDialog QFrame#mFrame { 3 | border: 0; 4 | } -------------------------------------------------------------------------------- /qt-mac.css: -------------------------------------------------------------------------------- 1 | QToolButton#mDownloadTasksBtn, 2 | QToolButton#mServerStatusBtn 3 | { 4 | border-style:flat; 5 | } 6 | 7 | /* QToolButton:hover */ 8 | /* { */ 9 | /* border: 1px solid #ccc; */ 10 | /* border-radius: 4px; */ 11 | /* background-color: rgb(255,255,255); */ 12 | /* } */ 13 | 14 | /* 15 | DownloadRepoDialog { 16 | min-height: 400px; 17 | max-height: 400px; 18 | } 19 | */ 20 | 21 | QToolButton#mAccountBtn 22 | { 23 | margin-right: 0px; 24 | } 25 | 26 | 27 | QFrame#mFrame 28 | { 29 | border: 0; 30 | } 31 | 32 | FileBrowserDialog QToolBar QToolButton#backwardButton { 33 | margin-right: 0px; 34 | } 35 | 36 | FileBrowserDialog QToolBar QToolButton#forwardButton { 37 | margin-left: 0px; 38 | } 39 | 40 | SyncErrorsDialog QWidget#mainWidget { 41 | border : 0; 42 | border-radius: 0px; 43 | } 44 | 45 | QMessageBox { 46 | messagebox-text-interaction-flags: NoTextInteraction; 47 | } 48 | -------------------------------------------------------------------------------- /qt-win.css: -------------------------------------------------------------------------------- 1 | QLabel { 2 | font-family: Microsoft YaHei; 3 | } 4 | 5 | QFrame#mFrame { 6 | background-color: white; 7 | } 8 | 9 | RepoTreeView { 10 | font-family: Microsoft YaHei; 11 | } 12 | 13 | FileTableView QHeaderView::section:first { 14 | padding-left: 36px; 15 | } 16 | 17 | SyncErrorsTableView::item { 18 | padding-left: 2px; 19 | } 20 | -------------------------------------------------------------------------------- /resource.h: -------------------------------------------------------------------------------- 1 | //{{NO_DEPENDENCIES}} 2 | // Microsoft Visual C++ generated include file. 3 | // Used by seafile-client.rc 4 | // 5 | #define IDI_ICON1 101 6 | 7 | // Next default values for new objects 8 | // 9 | #ifdef APSTUDIO_INVOKED 10 | #ifndef APSTUDIO_READONLY_SYMBOLS 11 | #define _APS_NEXT_RESOURCE_VALUE 102 12 | #define _APS_NEXT_COMMAND_VALUE 40001 13 | #define _APS_NEXT_CONTROL_VALUE 1001 14 | #define _APS_NEXT_SYMED_VALUE 101 15 | #endif 16 | #endif 17 | -------------------------------------------------------------------------------- /scripts/build_breakpad.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e 4 | 5 | PWD=$(dirname "${BASH_SOURCE[0]}") 6 | 7 | ## get a copy of breakpad if not exist 8 | if [ ! -d $PWD/../third_party/breakpad ]; then 9 | pushd $PWD/../third_party 10 | git clone https://github.com/Chilledheart/breakpad.git 11 | popd 12 | fi 13 | 14 | ## get a copy of gyp if not exist 15 | if [ ! -d $PWD/../third_party/gyp ]; then 16 | pushd $PWD/../third_party 17 | git clone https://chromium.googlesource.com/external/gyp.git 18 | popd 19 | fi 20 | 21 | ## build breakpad 22 | pushd $PWD/../third_party/breakpad 23 | 24 | GYP_GENERATORS=ninja ../gyp/gyp --depth . 25 | if [ -d out/Debug_Base ]; then 26 | ninja -C out/Debug_Base 27 | elif [ -d out/Default ]; then 28 | ninja -C out/Default 29 | else 30 | echo "unable to find build.ninja, exiting" 31 | fi 32 | 33 | echo "breakpad was built successfuly" 34 | echo "now you can set up your PATH_TO_BREAKPAD_ROOT to $(pwd)" 35 | 36 | popd 37 | 38 | 39 | -------------------------------------------------------------------------------- /scripts/ci-build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -x 3 | set -e 4 | PWD=$(dirname "${BASH_SOURCE[0]}") 5 | 6 | pushd $PWD/.. 7 | 8 | if [ "$TRAVIS_OS_NAME" = "linux" ]; then 9 | set +e 10 | . /opt/qt56/bin/qt56-env.sh 11 | set -e 12 | cmake -DBUILD_TESTING=on -DBUILD_SHIBBOLETH_SUPPORT=$BUILD_SHIBBOLETH_SUPPORT . 13 | make -j8 VERBOSE=1 14 | make test VERBOSE=1 15 | elif [ "$TRAVIS_OS_NAME" = "osx" ]; then 16 | export PATH=/usr/local/opt/openssl/bin:/usr/local/opt/curl/bin:$PATH 17 | export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/local/opt/curl/lib/pkgconfig:/usr/local/opt/libffi/lib/pkgconfig:/usr/local/opt/openssl/lib/pkgconfig:/usr/local/opt/sqlite/lib/pkgconfig 18 | export CPPFLAGS="-I/usr/local/opt/openssl/include -I/usr/local/opt/sqlite/include -I/usr/local/opt/curl/include" 19 | export CXXFLAGS="$CXXFLAGS $CPPFLAGS -I/usr/local/include" 20 | export LDFLAGS="-L/usr/local/opt/openssl/lib -L/usr/local/opt/sqlite/lib -L/usr/local/opt/curl/lib -L/usr/local/lib" 21 | export PKG_CONFIG_LIBDIR=/usr/lib/pkgconfig:/usr/local/Library/ENV/pkgconfig/10.9 22 | export ACLOCAL_PATH=/usr/local/share/aclocal 23 | cmake -G Xcode -DBUILD_TESTING=on . 24 | xcodebuild -configuration Debug -target ALL_BUILD -jobs 8 25 | xcodebuild -configuration Debug -target RUN_TESTS 26 | else 27 | printf "not supported platform" 28 | exit -1 29 | fi 30 | 31 | popd 32 | -------------------------------------------------------------------------------- /scripts/genapp.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | set -e 4 | 5 | build_file="build.py" 6 | 7 | print "WARNING: this file is deprecated." 8 | print "Please use $build_file instead" 9 | 10 | "$build_file" "$@" 11 | -------------------------------------------------------------------------------- /scripts/install-deps-osx.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -x 3 | set -e 4 | ## TODO: use the correct version of seafile for each branch 5 | 6 | brew up 7 | brew install qt4 8 | 9 | brew tap Chilledheart/seafile 10 | brew install --HEAD libsearpc ccnet seafile 11 | -------------------------------------------------------------------------------- /scripts/strip-png.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Strip profiles and comments from png files. 4 | # This can avoid libpng warnings. 5 | # See https://wiki.archlinux.org/index.php/Libpng_errors 6 | 7 | [[ -x `which convert` ]] || { 8 | echo 9 | echo "Please install ImageMagick tool first". 10 | echo 11 | echo "On ubuntu: apt-get install imagemagick" 12 | echo "On macos: port install ImageMagick" 13 | echo 14 | } 15 | 16 | TOP_DIR=$(python -c "import os; print os.path.dirname(os.path.realpath('$0'))")/.. 17 | 18 | find $TOP_DIR -type f -name \*.png -exec convert -strip {} {} \; 19 | -------------------------------------------------------------------------------- /seafile-applet.rc.in: -------------------------------------------------------------------------------- 1 | #include 2 | #define RC_VERSION ${SEAFILE_CLIENT_VERSION_MAJOR}, ${SEAFILE_CLIENT_VERSION_MINOR}, ${SEAFILE_CLIENT_VERSION_PATCH}, 0 3 | #define RC_VERSION_STR "${SEAFILE_CLIENT_VERSION_MAJOR}.${SEAFILE_CLIENT_VERSION_MINOR}.${SEAFILE_CLIENT_VERSION_PATCH}.0\0" 4 | LANGUAGE 0x09,0x01 5 | 1 24 DISCARDABLE Application.manifest 6 | 2 ICON DISCARDABLE "seafile.ico" 7 | VS_VERSION_INFO VERSIONINFO 8 | FILEVERSION RC_VERSION 9 | PRODUCTVERSION RC_VERSION 10 | FILEFLAGSMASK 0x3fL 11 | #ifdef _DEBUG 12 | FILEFLAGS 0x1L 13 | #else 14 | FILEFLAGS 0x0L 15 | #endif 16 | FILEOS VOS__WINDOWS32 17 | FILETYPE VFT_APP 18 | FILESUBTYPE 0x0L 19 | 20 | BEGIN 21 | BLOCK "StringFileInfo" 22 | BEGIN 23 | BLOCK "040904b0" 24 | BEGIN 25 | VALUE "CompanyName", "Seafile Ltd.\0" 26 | VALUE "FileDescription", "Seafile Client" 27 | VALUE "FileVersion", RC_VERSION_STR 28 | VALUE "InternalName", "seafile-applet\0" 29 | VALUE "OriginalFilename", "seafile-applet.exe\0" 30 | VALUE "LegalCopyright", "2015 Seafile Ltd.\0" 31 | VALUE "ProductName", "Seafile Client\0" 32 | VALUE "ProductVersion", RC_VERSION_STR 33 | END 34 | END 35 | 36 | BLOCK "VarFileInfo" 37 | BEGIN 38 | VALUE "Translation", 0x409, 1200 39 | END 40 | END 41 | -------------------------------------------------------------------------------- /seafile-client.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.30611.23 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "seafile-client", "seafile-client.vcxproj", "{DB8A875C-9A9D-4A4F-B6BD-40E576A726FF}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|x64 = Debug|x64 11 | Debug|x86 = Debug|x86 12 | Release|x64 = Release|x64 13 | Release|x86 = Release|x86 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {DB8A875C-9A9D-4A4F-B6BD-40E576A726FF}.Debug|x64.ActiveCfg = Debug|x64 17 | {DB8A875C-9A9D-4A4F-B6BD-40E576A726FF}.Debug|x64.Build.0 = Debug|x64 18 | {DB8A875C-9A9D-4A4F-B6BD-40E576A726FF}.Debug|x86.ActiveCfg = Debug|x64 19 | {DB8A875C-9A9D-4A4F-B6BD-40E576A726FF}.Release|x64.ActiveCfg = Release|x64 20 | {DB8A875C-9A9D-4A4F-B6BD-40E576A726FF}.Release|x64.Build.0 = Release|x64 21 | {DB8A875C-9A9D-4A4F-B6BD-40E576A726FF}.Release|x86.ActiveCfg = Release|x64 22 | EndGlobalSection 23 | GlobalSection(SolutionProperties) = preSolution 24 | HideSolutionNode = FALSE 25 | EndGlobalSection 26 | GlobalSection(ExtensibilityGlobals) = postSolution 27 | SolutionGuid = {07D0F4E8-0A2D-4C9E-86D7-48B940419795} 28 | EndGlobalSection 29 | EndGlobal 30 | -------------------------------------------------------------------------------- /seafile.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/seafile.icns -------------------------------------------------------------------------------- /seafile.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/seafile.ico -------------------------------------------------------------------------------- /sparkle-readme.md: -------------------------------------------------------------------------------- 1 | ## Setup WinSparkle environment 2 | 3 | [WinSparkle](https://github.com/vslavik/winsparkle) 是 Mac 上的 Sparkle 框架在 windows 上的实现,用于软件自动更新. 4 | 5 | * 下载 winsparkle 发布包 https://github.com/vslavik/winsparkle/releases/download/v0.5.3/WinSparkle-0.5.3.zip, 并解压 6 | * 把 include 下的文件拷贝到 /usr/local/lib 7 | * 把 Release/winsparkle.dll 拷贝到 /mingw32/bin 8 | * 把 winsparkle.lib 拷贝到 seafile-client 目录下 9 | 10 | 在编译时需要加上 `BUILD_SPARKLE_SUPPORT` flag: 11 | ```sh 12 | cmake -DBUILD_SPARKLE_SUPPORT=ON . 13 | ``` 14 | 15 | 16 | ## 更新 appcast.xml 17 | 18 | winsparkle 根据下载下来的 appcast.xml 中的数据: 19 | 20 | - 判断当前是否有更新版本 21 | - 新版本的下载地址 22 | - 新版本的 release notes (展示给用户看) 23 | 24 | 发布新的版本时,需要更新appcast中的哪些字段: 25 | 26 | - pubDate 字段 27 | - enclosure 中新版本的下载地址 url 字段 28 | - enclosure 中新版本的版本号 sparkle:version 字段 29 | 30 | ### 本地开发时如何搭建一个简单的 server 来让 seafile-client 去获取 appcast.xml 31 | 32 | - 将 appcast.example.xml 修改一下 33 | - 然后本地启动一个 nginx 服务器 34 | - 设置 `SEAFILE_CLIENT_APPCAST_URI` 环境变量, 然后启动 seafile-applet. 35 | 36 | ```sh 37 | export SEAFILE_CLIENT_APPCAST_URI=http://localhost:8888/appcast.xml 38 | ./seafile-applet.exe 39 | ``` 40 | -------------------------------------------------------------------------------- /src/account-info-service.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_ACCOUNT_INFO_SERVICE_H 2 | #define SEAFILE_CLIENT_ACCOUNT_INFO_SERVICE_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | #include "utils/singleton.h" 10 | 11 | class QTimer; 12 | 13 | class FetchAccountInfoRequest; 14 | class ApiError; 15 | class AccountInfo; 16 | 17 | 18 | class AccountInfoService : public QObject 19 | { 20 | Q_OBJECT 21 | SINGLETON_DEFINE(AccountInfoService) 22 | 23 | public: 24 | void start(); 25 | void stop(); 26 | 27 | public slots: 28 | void refresh(); 29 | 30 | private slots: 31 | void onFetchAccountInfoSuccess(const AccountInfo& info); 32 | void onFetchAccountInfoFailed(); 33 | 34 | private: 35 | Q_DISABLE_COPY(AccountInfoService) 36 | AccountInfoService(QObject *parent=0); 37 | 38 | QTimer *refresh_timer_; 39 | }; 40 | 41 | 42 | #endif // SEAFILE_CLIENT_ACCOUNT_INFO_SERVICE_H 43 | -------------------------------------------------------------------------------- /src/account.cpp: -------------------------------------------------------------------------------- 1 | #include "account.h" 2 | #include "utils/utils.h" 3 | #include "api/requests.h" 4 | 5 | QUrl Account::getAbsoluteUrl(const QString& relativeUrl) const 6 | { 7 | return ::urlJoin(serverUrl, relativeUrl); 8 | } 9 | 10 | QString Account::getSignature() const 11 | { 12 | if (!isValid()) { 13 | return ""; 14 | } 15 | 16 | return ::md5(serverUrl.host() + username).left(7); 17 | } 18 | -------------------------------------------------------------------------------- /src/api/commit-details.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_API_COMMIT_DETAILS_H 2 | #define SEAFILE_CLIENT_API_COMMIT_DETAILS_H 3 | 4 | #include 5 | 6 | #include 7 | #include 8 | 9 | #include 10 | #include 11 | 12 | struct _GList; 13 | 14 | class CommitDetails { 15 | public: 16 | std::vector added_files, deleted_files, modified_files, added_dirs, deleted_dirs; 17 | 18 | // renamed or moved files 19 | std::vector > renamed_files; 20 | 21 | static CommitDetails fromJSON(const json_t*, json_error_t *error); 22 | static CommitDetails fromObjList(const _GList *objlist); 23 | }; 24 | 25 | 26 | /** 27 | * Register with QMetaType so we can wrap it with QVariant::fromValue 28 | */ 29 | Q_DECLARE_METATYPE(CommitDetails) 30 | 31 | #endif // SEAFILE_CLIENT_API_COMMIT_DETAILS_H 32 | -------------------------------------------------------------------------------- /src/api/contact-share-info.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include "contact-share-info.h" 3 | 4 | uint qHash(const SeafileUser& user, uint seed) { 5 | return qHash(user.email, seed); 6 | } 7 | -------------------------------------------------------------------------------- /src/api/event.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_API_EVENT_H 2 | #define SEAFILE_CLIENT_API_EVENT_H 3 | 4 | #include 5 | #include 6 | 7 | #include 8 | #include 9 | #include 10 | 11 | class SeafEvent { 12 | public: 13 | QString author; 14 | QString nick; 15 | QString repo_id; 16 | QString repo_name; 17 | QString etype; 18 | QString commit_id; 19 | QString desc; 20 | QString op_desc; 21 | qint64 timestamp; 22 | bool is_use_new_activities_api; 23 | 24 | // true for events like a file upload by unregistered user from a 25 | // uploadable link 26 | bool anonymous; 27 | 28 | bool isDetailsDisplayable() const; 29 | 30 | static SeafEvent fromJSON(const json_t*, json_error_t *error); 31 | static SeafEvent fromJSONV2(const json_t*, json_error_t *error); 32 | static std::vector listFromJSON(const json_t*, json_error_t *json, bool is_use_new_json_parser = false); 33 | 34 | QString toString() const; 35 | }; 36 | 37 | /** 38 | * Register with QMetaType so we can wrap it with QVariant::fromValue 39 | */ 40 | Q_DECLARE_METATYPE(SeafEvent) 41 | 42 | #endif // SEAFILE_CLIENT_API_EVENT_H 43 | -------------------------------------------------------------------------------- /src/api/sso-status.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_API_SSO_STATUS_H 2 | #define SEAFILE_CLIENT_API_SSO_STATUS_H 3 | 4 | #include 5 | 6 | class ClientSSOStatus 7 | { 8 | public: 9 | QString status; 10 | QString username; 11 | QString api_token; 12 | }; 13 | 14 | #endif // SEAFILE_CLIENT_API_SSO_STATUS_H 15 | -------------------------------------------------------------------------------- /src/api/starred-file.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_STARRED_FILE_H 2 | #define SEAFILE_CLIENT_STARRED_FILE_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | class StarredItem { 10 | public: 11 | QString repo_id; 12 | QString repo_name; 13 | QString path; 14 | qint64 size; 15 | qint64 mtime; 16 | QString obj_name; 17 | 18 | enum StarredItemType { 19 | FILE = 0, 20 | DIR, 21 | REPO 22 | } type; 23 | 24 | bool from_new_api; 25 | 26 | static StarredItem fromJSON(const json_t*, json_error_t *error); 27 | static StarredItem fromJSONV2(const json_t*, json_error_t *error); 28 | static std::vector listFromJSON(const json_t*, json_error_t *json, bool is_use_new_json_parser = false); 29 | 30 | const QString name() const; 31 | bool isFile() const; 32 | }; 33 | 34 | /** 35 | * Register with QMetaType so we can wrap it with QVariant::fromValue 36 | */ 37 | Q_DECLARE_METATYPE(StarredItem) 38 | 39 | #endif // SEAFILE_CLIENT_STARRED_FILE_H 40 | -------------------------------------------------------------------------------- /src/application.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Show thr main window when the dock icon is clicked 3 | */ 4 | #include 5 | 6 | #include "ui/main-window.h" 7 | class Application : public QApplication { 8 | Q_OBJECT 9 | 10 | public: 11 | 12 | Application (int& argc, char **argv); 13 | bool event(QEvent * e); 14 | virtual ~Application() {}; 15 | }; 16 | -------------------------------------------------------------------------------- /src/auto-login-service.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_AUTO_LOGIN_SERVICE_H_ 2 | #define SEAFILE_CLIENT_AUTO_LOGIN_SERVICE_H_ 3 | 4 | #include 5 | #include 6 | 7 | #include "utils/singleton.h" 8 | 9 | class ApiError; 10 | 11 | class AutoLoginService : public QObject { 12 | SINGLETON_DEFINE(AutoLoginService) 13 | Q_OBJECT 14 | public: 15 | AutoLoginService(QObject *parent=0); 16 | // Get a auto login token from server, and then open the "next_url" after login 17 | 18 | public slots: 19 | void startAutoLogin(const QString& next_url); 20 | 21 | private slots: 22 | void onGetLoginTokenSuccess(const QString& token); 23 | void onGetLoginTokenFailed(const ApiError& error); 24 | }; 25 | 26 | #endif // SEAFILE_CLIENT_AUTO_LOGIN_SERVICE_H_ 27 | -------------------------------------------------------------------------------- /src/auto-update-service.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_AUTO_UPDATE_SERVICE_H 2 | #define SEAFILE_CLIENT_AUTO_UPDATE_SERVICE_H 3 | 4 | #include 5 | #include 6 | 7 | #include "utils/singleton.h" 8 | 9 | class AutoUpdateAdapter; 10 | 11 | // Auto update seafile client program. Only used on windows/mac. 12 | class AutoUpdateService : public QObject 13 | { 14 | SINGLETON_DEFINE(AutoUpdateService) 15 | Q_OBJECT 16 | 17 | public: 18 | AutoUpdateService(QObject *parent = 0); 19 | 20 | bool shouldSupportAutoUpdate() const; 21 | 22 | void setRequestParams(); 23 | bool autoUpdateEnabled() const; 24 | void setAutoUpdateEnabled(bool enabled); 25 | 26 | void start(); 27 | void stop(); 28 | 29 | void checkUpdate(); 30 | 31 | private: 32 | void enableUpdateByDefault(); 33 | QString getAppcastURI(); 34 | AutoUpdateAdapter *adapter_; 35 | }; 36 | 37 | #endif // SEAFILE_CLIENT_AUTO_UPDATE_SERVICE_H 38 | -------------------------------------------------------------------------------- /src/certs-mgr.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_CERTS_MANAGER_H 2 | #define SEAFILE_CLIENT_CERTS_MANAGER_H 3 | 4 | #include 5 | #include 6 | 7 | struct sqlite3; 8 | struct sqlite3_stmt; 9 | 10 | class QUrl; 11 | 12 | class CertsManager { 13 | public: 14 | CertsManager(); 15 | ~CertsManager(); 16 | 17 | int start(); 18 | 19 | void saveCertificate(const QUrl& url, const QSslCertificate& cert); 20 | QSslCertificate getCertificate(const QUrl& url); 21 | 22 | private: 23 | void loadCertificates(); 24 | static bool loadCertificatesCB(sqlite3_stmt *stmt, void *data); 25 | 26 | QHash certs_; 27 | 28 | struct sqlite3 *db; 29 | }; 30 | 31 | #endif // SEAFILE_CLIENT_CERTS_MANAGER_H 32 | -------------------------------------------------------------------------------- /src/configurator.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_CONFIGURATOR_H 2 | #define SEAFILE_CLIENT_CONFIGURATOR_H 3 | 4 | #include 5 | #include 6 | 7 | /** 8 | * Handles seafile configuration initialize 9 | */ 10 | class Configurator : public QObject { 11 | Q_OBJECT 12 | 13 | public: 14 | Configurator(); 15 | 16 | void checkInit(); 17 | 18 | const QString& ccnetDir() const { return ccnet_dir_; } 19 | const QString& seafileDir() const { return seafile_dir_; } 20 | const QString& worktreeDir() const { return worktree_; } 21 | const QString& defaultRepoPath() const { return default_repo_path_; } 22 | 23 | bool firstUse() const { return first_use_; } 24 | 25 | public: 26 | static void installCustomUrlHandler(); 27 | 28 | private slots: 29 | void onSeafileDirSet(const QString& path); 30 | 31 | private: 32 | Q_DISABLE_COPY(Configurator) 33 | 34 | void setSeafileDirAttributes(); 35 | 36 | bool needInitConfig(); 37 | void initConfig(); 38 | void validateExistingConfig(); 39 | int readSeafileIni(QString *content); 40 | 41 | void initCcnet(); 42 | void initSeafile(); 43 | 44 | QString ccnet_dir_; 45 | QString seafile_dir_; 46 | QString worktree_; 47 | 48 | QString default_repo_path_; 49 | 50 | bool first_use_; 51 | }; 52 | 53 | #endif // SEAFILE_CLIENT_CONFIGURATOR_H 54 | -------------------------------------------------------------------------------- /src/crash-handler.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_CRASH_HANDLER 2 | #define SEAFILE_CLIENT_CRASH_HANDLER 3 | #ifdef SEAFILE_CLIENT_HAS_CRASH_REPORTER 4 | #include 5 | 6 | namespace Breakpad { 7 | 8 | class CrashHandlerPrivate; 9 | class CrashHandler 10 | { 11 | public: 12 | static CrashHandler* instance(); 13 | void Init(const QString& reportPath); 14 | private: 15 | Q_DISABLE_COPY(CrashHandler) 16 | 17 | CrashHandler(); 18 | ~CrashHandler(); 19 | CrashHandlerPrivate* d; 20 | }; 21 | } 22 | #endif // SEAFILE_CLIENT_HAS_CRASH_REPORTER 23 | #endif // SEAFILE_CLIENT_CRASH_HANDLER 24 | 25 | -------------------------------------------------------------------------------- /src/customization-service.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_CUSTOMIAZATION_SERVICE_H 2 | #define SEAFILE_CLIENT_CUSTOMIAZATION_SERVICE_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | #include "utils/singleton.h" 10 | #include "account.h" 11 | 12 | class QNetworkDiskCache; 13 | 14 | class FetchCustomLogoRequest; 15 | class ApiError; 16 | 17 | class CustomizationService : public QObject 18 | { 19 | Q_OBJECT 20 | SINGLETON_DEFINE(CustomizationService) 21 | public: 22 | void start(); 23 | 24 | // Read the logo from the disk cache if exists, otherwise return a default 25 | // logo and send a request to fetch the logo. 26 | QPixmap getServerLogo(const Account& account); 27 | 28 | QNetworkDiskCache *diskCache() const { return disk_cache_; } 29 | 30 | signals: 31 | void serverLogoFetched(const QUrl& url); 32 | 33 | private slots: 34 | void onServerLogoFetched(const QUrl& url); 35 | void onServerLogoFetchFailed(const ApiError& error); 36 | 37 | private: 38 | Q_DISABLE_COPY(CustomizationService) 39 | CustomizationService(QObject* parent = 0); 40 | 41 | void cleanUpRequest(FetchCustomLogoRequest *req); 42 | 43 | QHash reqs_; 44 | 45 | QNetworkDiskCache* disk_cache_; 46 | }; 47 | 48 | 49 | #endif // SEAFILE_CLIENT_CUSTOMIAZATION_SERVICE_H 50 | -------------------------------------------------------------------------------- /src/daemon-mgr.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_DAEMON_MANAGER_H 2 | #define SEAFILE_CLIENT_DAEMON_MANAGER_H 3 | 4 | #include 5 | #include 6 | 7 | class QTimer; 8 | 9 | /** 10 | * Start/Monitor seafile daemon 11 | */ 12 | class DaemonManager : public QObject { 13 | Q_OBJECT 14 | 15 | public: 16 | DaemonManager(); 17 | ~DaemonManager(); 18 | void startSeafileDaemon(); 19 | 20 | signals: 21 | void daemonStarted(); 22 | 23 | void daemonDead(); 24 | void daemonRestarted(); 25 | 26 | private slots: 27 | void onDaemonStarted(); 28 | void onDaemonFinished(int exit_code, QProcess::ExitStatus exit_status); 29 | void systemShutDown(); 30 | void checkDaemonReady(); 31 | void restartSeafileDaemon(); 32 | 33 | private: 34 | Q_DISABLE_COPY(DaemonManager) 35 | 36 | void stopDaemon(); 37 | void scheduleRestartDaemon(); 38 | void transitionState(int new_state); 39 | 40 | QProcess *seaf_daemon_; 41 | QTimer *conn_daemon_timer_; 42 | 43 | int current_state_; 44 | // Used to decide whether to emit daemonStarted or daemonRestarted 45 | bool first_start_; 46 | int restart_retried_; 47 | }; 48 | 49 | #endif // SEAFILE_CLIENT_DAEMON_MANAGER_H 50 | -------------------------------------------------------------------------------- /src/filebrowser/file-browser-manager.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_FILE_BROWSER_MANAGER_H 2 | #define SEAFILE_CLIENT_FILE_BROWSER_MANAGER_H 3 | #include 4 | #include 5 | #include "api/server-repo.h" 6 | #include "account.h" 7 | 8 | class FileBrowserDialog; 9 | 10 | class FileBrowserManager : public QObject { 11 | Q_OBJECT 12 | public: 13 | static FileBrowserManager* getInstance() { 14 | if (!instance_) { 15 | static FileBrowserManager instance; 16 | instance_ = &instance; 17 | } 18 | return instance_; 19 | } 20 | 21 | FileBrowserDialog *openOrActivateDialog(const Account &account, const ServerRepo &repo, const QString &path = "/"); 22 | 23 | FileBrowserDialog *getDialog(const Account &account, const QString &repo_id); 24 | 25 | public slots: 26 | void closeAllDialogByAccount(const Account &account); 27 | 28 | private slots: 29 | void onAboutToClose(); 30 | void closeAllDialogs(); 31 | 32 | private: 33 | FileBrowserManager(const FileBrowserManager*); // DELETED 34 | FileBrowserManager& operator=(const FileBrowserManager*); // DELETED 35 | 36 | FileBrowserManager(); 37 | static FileBrowserManager *instance_; 38 | QList dialogs_; 39 | }; 40 | 41 | 42 | #endif // SEAFILE_CLIENT_FILE_BROWSER_MANAGER_H 43 | -------------------------------------------------------------------------------- /src/filebrowser/progress-dialog.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_FILE_BROWSER_PROGRESS_DIALOG_H 2 | #define SEAFILE_CLIENT_FILE_BROWSER_PROGRESS_DIALOG_H 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | #include "tasks.h" 9 | 10 | class QProgressBar; 11 | class QLabel; 12 | 13 | 14 | class FileBrowserProgressDialog : public QProgressDialog { 15 | Q_OBJECT 16 | public: 17 | FileBrowserProgressDialog(FileNetworkTask *task, QWidget *parent=0); 18 | ~FileBrowserProgressDialog(); 19 | 20 | typedef enum { 21 | ActionRetry = 0, 22 | ActionSkip, 23 | ActionAbort, 24 | } ActionOnFailure; 25 | 26 | public slots: 27 | void cancel(); 28 | 29 | private slots: 30 | void onProgressUpdate(qint64 processed_bytes, qint64 total_bytes); 31 | void onCurrentNameUpdate(QString current_name); 32 | void onTaskFinished(bool success); 33 | void initTaskInfo(); 34 | void onOneFileUploadFailed(const QString& filename, bool single_file); 35 | ActionOnFailure retryOrSkipOrAbort(const QString& msg, bool single_file); 36 | 37 | private: 38 | void initUI(); 39 | 40 | FileNetworkTask* task_; 41 | QPushButton *cancel_button_; 42 | QLabel *description_label_; 43 | QLabel *more_details_label_; 44 | QProgressBar *progress_bar_; 45 | bool task_finished_; 46 | }; 47 | 48 | #endif // SEAFILE_CLIENT_FILE_BROWSER_PROGRESS_DIALOG_H 49 | -------------------------------------------------------------------------------- /src/filebrowser/seaf-dirent.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_API_SEAF_DIRENT_H 2 | #define SEAFILE_CLIENT_API_SEAF_DIRENT_H 3 | 4 | #include 5 | 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | class SeafDirent { 12 | public: 13 | enum Type { 14 | DIR, 15 | FILE 16 | }; 17 | 18 | Type type; 19 | bool readonly; 20 | QString id; 21 | QString name; 22 | quint64 size; 23 | quint64 mtime; 24 | 25 | bool is_locked; 26 | bool locked_by_me; 27 | QString lock_owner; 28 | QString lock_owner_name; 29 | quint64 lock_time; 30 | QString modifier_name; 31 | 32 | bool isDir() const { return type == DIR; } 33 | bool isFile() const { return type == FILE; } 34 | 35 | const QString& getLockOwnerDisplayString() const; 36 | 37 | static SeafDirent fromJSON(const json_t*, json_error_t *error); 38 | static QList listFromJSON(const json_t*, json_error_t *error); 39 | 40 | static SeafDirent dir(const QString& name); 41 | static SeafDirent file(const QString& name, quint64 size); 42 | }; 43 | 44 | 45 | /** 46 | * Register with QMetaType so we can wrap it with QVariant::fromValue 47 | */ 48 | Q_DECLARE_METATYPE(SeafDirent) 49 | 50 | #endif // SEAFILE_CLIENT_API_SEAF_DIRENT_H 51 | 52 | -------------------------------------------------------------------------------- /src/filebrowser/seafilelink-dialog.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_FILE_BROWSER_SEAFILELINK_DIALOG_H 2 | #define SEAFILE_CLIENT_FILE_BROWSER_SEAFILELINK_DIALOG_H 3 | #include 4 | 5 | class QLineEdit; 6 | class Account; 7 | class SeafileLinkDialog : public QDialog 8 | { 9 | Q_OBJECT 10 | public: 11 | SeafileLinkDialog(const QString& smart_link, const QString& protocol_link, QWidget *parent); 12 | 13 | private slots: 14 | void onCopyWebText(); 15 | void onCopyProtocolText(); 16 | 17 | private: 18 | QString web_link_; 19 | const QString protocol_link_; 20 | QLineEdit *web_editor_; 21 | QLineEdit *protocol_editor_; 22 | }; 23 | 24 | #endif 25 | -------------------------------------------------------------------------------- /src/filebrowser/sharedlink-dialog.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_FILE_BROWSER_SHAREDLINK_DIALOG_H 2 | #define SEAFILE_CLIENT_FILE_BROWSER_SHAREDLINK_DIALOG_H 3 | #include 4 | 5 | class QLineEdit; 6 | class ApiError; 7 | 8 | class SharedLinkDialog : public QDialog 9 | { 10 | Q_OBJECT 11 | public: 12 | SharedLinkDialog(const QString &link, 13 | const QString &repo_id, 14 | const QString &path_in_repo, 15 | QWidget *parent); 16 | 17 | private slots: 18 | void onCopyText(); 19 | void onDownloadStateChanged(int state); 20 | void slotGenSharedLink(); 21 | void onCreateSharedLinkSuccess(const QString& link); 22 | void onCreateSharedLinkFailed(const ApiError& error); 23 | void slotShowPasswordCheckBoxClicked(int state); 24 | 25 | private: 26 | QString text_; 27 | const QString repo_id_; 28 | const QString path_in_repo_; 29 | 30 | QLineEdit *editor_; 31 | QLineEdit *password_editor_; 32 | QLineEdit *expire_days_editor_; 33 | QPushButton *generate_link_pushbutton_; 34 | }; 35 | 36 | #endif 37 | -------------------------------------------------------------------------------- /src/filebrowser/uploadlink-dialog.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_UPLOADLINK_DIALOG_H 2 | #define SEAFILE_UPLOADLINK_DIALOG_H 3 | #include 4 | 5 | class QLineEdit; 6 | class UploadLinkDialog : public QDialog 7 | { 8 | Q_OBJECT 9 | public: 10 | UploadLinkDialog(const QString &text, QWidget *parent); 11 | 12 | private slots: 13 | void onCopyText(); 14 | 15 | private: 16 | const QString text_; 17 | QLineEdit *editor_; 18 | }; 19 | 20 | #endif 21 | -------------------------------------------------------------------------------- /src/finder-sync/finder-sync-listener.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_FINDER_SYNC_LISTENER_H_ 2 | #define SEAFILE_CLIENT_FINDER_SYNC_LISTENER_H_ 3 | 4 | /// \brief start the listener 5 | /// 6 | void finderSyncListenerStart(); 7 | 8 | /// \brief stop the listener 9 | /// 10 | void finderSyncListenerStop(); 11 | 12 | #endif // SEAFILE_CLIENT_FINDER_SYNC_LISTENER_H_ 13 | -------------------------------------------------------------------------------- /src/finder-sync/finder-sync.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_FINDER_SYNC_H_ 2 | #define SEAFILE_CLIENT_FINDER_SYNC_H_ 3 | 4 | class FinderSyncExtensionHelper { 5 | public: 6 | /// \brief check if plugin is installed 7 | /// return true if installed 8 | /// 9 | static bool isInstalled(); 10 | 11 | /// \brief check if plugin is enabled 12 | /// return true if enabled 13 | /// this value can be changed via preference by user 14 | static bool isEnabled(); 15 | 16 | /// \brief check if plugin has been bundled 17 | /// return true if bundled 18 | /// 19 | static bool isBundled(); 20 | 21 | /// \brief do reinstall for the bundled plugin 22 | /// return true if success 23 | /// 24 | static bool reinstall(bool force = false); 25 | 26 | /// \brief change the plugin's status 27 | /// return ture if success 28 | /// 29 | static bool setEnable(bool enable); 30 | }; 31 | 32 | #endif // SEAFILE_CLIENT_FINDER_SYNC_H_ 33 | -------------------------------------------------------------------------------- /src/i18n.h: -------------------------------------------------------------------------------- 1 | #ifndef _SEAF_I18N_H 2 | #define _SEAF_I18N_H 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | class QTranslator; 9 | class I18NHelper { 10 | public: 11 | static I18NHelper* getInstance() { 12 | if (!instance_) { 13 | static I18NHelper i18n; 14 | instance_ = &i18n; 15 | } 16 | return instance_; 17 | } 18 | 19 | void init(); 20 | 21 | QStringList getLanguages() { 22 | QStringList languages; 23 | Q_FOREACH(const QLocale& locale, getInstalledLocales()) 24 | { 25 | QString str_location = QLocale::countryToString(locale.country()); 26 | if (str_location == "China") { 27 | str_location = "Simplified"; 28 | } else if (str_location == "Taiwan") { 29 | str_location = "Traditional"; 30 | } 31 | languages.push_back( 32 | QString("%1 - %2").arg(QLocale::languageToString(locale.language())) 33 | .arg(str_location)); 34 | } 35 | languages.front() = "-- System --"; 36 | return languages; 37 | } 38 | 39 | bool isChinese(); 40 | int preferredLanguage(); 41 | void setPreferredLanguage(int langIndex); 42 | private: 43 | I18NHelper(); 44 | ~I18NHelper(); 45 | I18NHelper(const I18NHelper&); // = delete 46 | 47 | const QList &getInstalledLocales(); 48 | bool setLanguage(int langIndex); 49 | QScopedPointer qt_translator_; 50 | QScopedPointer my_translator_; 51 | 52 | static I18NHelper *instance_; 53 | }; 54 | 55 | 56 | #endif // _SEAF_I18N_H 57 | -------------------------------------------------------------------------------- /src/mac-sparkle-support.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_SPARKLE_SUPPORT_H 2 | #define SEAFILE_CLIENT_SPARKLE_SUPPORT_H 3 | 4 | class SparkleHelper { 5 | public: 6 | static void checkForUpdate(); 7 | static void setAutoUpdateEnabled(bool enabled); 8 | static bool autoUpdateEnabled(); 9 | static void setFeedURL(const char* url); 10 | }; 11 | 12 | #endif // SEAFILE_CLIENT_SPARKLE_SUPPORT_H 13 | -------------------------------------------------------------------------------- /src/mac-sparkle-support.mm: -------------------------------------------------------------------------------- 1 | #include "mac-sparkle-support.h" 2 | 3 | #import "SUUpdater.h" 4 | 5 | void SparkleHelper::checkForUpdate() 6 | { 7 | // [[SUUpdater sharedUpdater] checkForUpdatesInBackground]; 8 | [[SUUpdater sharedUpdater] checkForUpdates:nil]; 9 | } 10 | 11 | void SparkleHelper::setAutoUpdateEnabled(bool enabled) 12 | { 13 | [[SUUpdater sharedUpdater] setAutomaticallyChecksForUpdates: enabled]; 14 | // [[SUUpdater sharedUpdater] setAutomaticallyDownloadsUpdates: enabled]; 15 | } 16 | 17 | void SparkleHelper::setFeedURL(const char* url) 18 | { 19 | NSString *nsstr = [NSString stringWithCString:url 20 | encoding:NSUTF8StringEncoding]; 21 | NSURL *feedURL = [NSURL URLWithString:nsstr]; 22 | [[SUUpdater sharedUpdater] setFeedURL: feedURL]; 23 | } 24 | 25 | bool SparkleHelper::autoUpdateEnabled() { 26 | return [[SUUpdater sharedUpdater] automaticallyChecksForUpdates]; 27 | } 28 | -------------------------------------------------------------------------------- /src/message-poller.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_MESSAGE_POLLER_H 2 | #define SEAFILE_CLIENT_MESSAGE_POLLER_H 3 | 4 | #include 5 | 6 | class QTimer; 7 | class SeafileRpcClient; 8 | 9 | struct SyncNotification; 10 | 11 | class MessagePoller : public QObject { 12 | Q_OBJECT 13 | public: 14 | MessagePoller(QObject *parent=0); 15 | ~MessagePoller(); 16 | 17 | void start(); 18 | 19 | private slots: 20 | void onDaemonDead(); 21 | void onDaemonRestarted(); 22 | void checkNotification(); 23 | 24 | private: 25 | Q_DISABLE_COPY(MessagePoller) 26 | 27 | void processNotification(const SyncNotification& notification); 28 | 29 | SeafileRpcClient *rpc_client_; 30 | 31 | QTimer *check_notification_timer_; 32 | }; 33 | 34 | #endif // SEAFILE_CLIENT_MESSAGE_POLLER_H 35 | -------------------------------------------------------------------------------- /src/open-local-helper.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_OPEN_LOCAL_FILE_HELPER_H 2 | #define SEAFILE_CLIENT_OPEN_LOCAL_FILE_HELPER_H 3 | 4 | #include 5 | #include 6 | #include 7 | class Account; 8 | 9 | /** 10 | * Helper class to handle open local file request 11 | */ 12 | class OpenLocalHelper : public QObject 13 | { 14 | Q_OBJECT 15 | public: 16 | static OpenLocalHelper* instance(); 17 | 18 | QUrl generateLocalFileSeafileUrl(const QString& repo_id, const Account& account, const QString& path); 19 | QUrl generateLocalFileWebUrl(const QString& repo_id, const Account& account, const QString& path); 20 | 21 | bool openLocalFile(const QUrl &url); 22 | 23 | void setUrl(const char *url) { url_ = url; } 24 | 25 | void handleOpenLocalFromCommandLine(const char *url); 26 | 27 | void checkPendingOpenLocalRequest(); 28 | 29 | bool activateRunningInstance(); 30 | 31 | private: 32 | static OpenLocalHelper* singleton_; 33 | 34 | OpenLocalHelper(); 35 | 36 | void messageBox(const QString& msg); 37 | 38 | QByteArray url_; 39 | }; 40 | 41 | 42 | #endif // SEAFILE_CLIENT_OPEN_LOCAL_FILE_HELPER_H 43 | -------------------------------------------------------------------------------- /src/repo-service-helper.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_REPO_SERVICE_HELPER_H_ 2 | #define SEAFILE_CLIENT_REPO_SERVICE_HELPER_H_ 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | #include "account.h" 10 | #include "api/api-error.h" 11 | #include "api/server-repo.h" 12 | #include "filebrowser/seaf-dirent.h" 13 | #include "filebrowser/data-mgr.h" 14 | 15 | class GetDirentsRequest; 16 | class QWidget; 17 | 18 | class FileDownloadHelper : public QObject { 19 | Q_OBJECT 20 | public: 21 | static void openFile(const QString& path, bool work_around_mac_auto_udpate); 22 | FileDownloadHelper(const Account &account, const ServerRepo &repo, const QString &path, QWidget *parent); 23 | ~FileDownloadHelper(); 24 | void start(); 25 | 26 | private slots: 27 | 28 | void onCancel(); 29 | void onGetDirentsSuccess(bool current_readonly, const QList &dirents); 30 | void onGetDirentsFailure(const ApiError &) 31 | { 32 | downloadFile(QString()); 33 | } 34 | 35 | private: 36 | void downloadFile(const QString &id); 37 | 38 | const Account account_; 39 | const ServerRepo repo_; 40 | const QString path_; 41 | const QString file_name_; 42 | QWidget *parent_; 43 | GetDirentsRequest *req_; 44 | }; 45 | 46 | #endif // SEAFILE_CLIENT_REPO_SERVICE_HELPER_H_ 47 | -------------------------------------------------------------------------------- /src/rpc/clone-task.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_RPC_CLONE_TASK_H 2 | #define SEAFILE_CLIENT_RPC_CLONE_TASK_H 3 | 4 | #include 5 | #include 6 | 7 | struct _GObject; 8 | 9 | class CloneTask { 10 | public: 11 | QString repo_id; 12 | QString repo_name; 13 | QString worktree; 14 | QString state; 15 | QString rt_state; 16 | QString error_str; 17 | int error_code; 18 | 19 | QString state_str; 20 | qint64 block_done; 21 | qint64 block_total; 22 | 23 | int fs_objects_done; 24 | int fs_objects_total; 25 | 26 | int checkout_done; 27 | int checkout_total; 28 | 29 | static CloneTask fromGObject(_GObject *obj); 30 | 31 | void translateStateInfo(); 32 | 33 | bool isCancelable() const; 34 | bool isRemovable() const; 35 | bool isDisplayable() const; 36 | bool isSuccessful() const { return state == "done"; } 37 | 38 | bool isValid() const { return !repo_id.isEmpty(); } 39 | 40 | bool operator==(const CloneTask& rhs) const { 41 | return repo_id == rhs.repo_id 42 | && repo_name == rhs.repo_name 43 | && worktree == rhs.worktree 44 | && state_str == rhs.state_str 45 | && error_code == rhs.error_code 46 | && error_str == rhs.error_str; 47 | } 48 | 49 | bool operator!=(const CloneTask& rhs) const { 50 | return !(*this == rhs); 51 | } 52 | 53 | private: 54 | QString calcProgress(int64_t done, int64_t total); 55 | }; 56 | 57 | #endif // SEAFILE_CLIENT_RPC_CLONE_TASK_H 58 | -------------------------------------------------------------------------------- /src/rpc/rpc_table.py: -------------------------------------------------------------------------------- 1 | """ 2 | Define RPC functions needed to generate 3 | """ 4 | 5 | # [ , [] ] 6 | func_table = [ 7 | [ "int", [] ], 8 | [ "int", ["string"] ], 9 | [ "string", [] ], 10 | ] 11 | -------------------------------------------------------------------------------- /src/rpc/searpc-signature.h: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | inline static gchar * 4 | searpc_signature_int__void() 5 | { 6 | return searpc_compute_signature ("int", 0); 7 | } 8 | 9 | 10 | inline static gchar * 11 | searpc_signature_int__string() 12 | { 13 | return searpc_compute_signature ("int", 1, "string"); 14 | } 15 | 16 | 17 | inline static gchar * 18 | searpc_signature_string__void() 19 | { 20 | return searpc_compute_signature ("string", 0); 21 | } 22 | 23 | -------------------------------------------------------------------------------- /src/rpc/sync-error.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | #include "utils/utils.h" 6 | #include "sync-error.h" 7 | #include "utils/seafile-error.h" 8 | 9 | SyncError SyncError::fromGObject(GObject *obj) 10 | { 11 | SyncError error; 12 | 13 | int id = 0; 14 | char *repo_id = NULL; 15 | char *repo_name = NULL; 16 | char *path = NULL; 17 | int error_id = 0; 18 | qint64 timestamp = 0; 19 | 20 | g_object_get (obj, 21 | "id", &id, 22 | "repo_id", &repo_id, 23 | "repo_name", &repo_name, 24 | "path", &path, 25 | "err_id", &error_id, 26 | "timestamp", ×tamp, 27 | NULL); 28 | 29 | error.id = id; 30 | error.repo_id = repo_id; 31 | error.repo_name = QString::fromUtf8(repo_name); 32 | error.path = QString::fromUtf8(path); 33 | 34 | error.error_id = error_id; 35 | error.timestamp = timestamp; 36 | 37 | g_free (repo_id); 38 | g_free (repo_name); 39 | g_free (path); 40 | 41 | error.translateErrorStr(); 42 | 43 | return error; 44 | } 45 | 46 | // SyncError only include file level and repository level 47 | void SyncError::translateErrorStr() 48 | { 49 | readable_time_stamp = translateCommitTime(timestamp); 50 | 51 | error_str = translateSyncErrorCode(error_id); 52 | } 53 | -------------------------------------------------------------------------------- /src/rpc/sync-error.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_RPC_SYNC_ERROR_H 2 | #define SEAFILE_CLIENT_RPC_SYNC_ERROR_H 3 | 4 | #include 5 | #include 6 | 7 | struct _GObject; 8 | 9 | class SyncError { 10 | public: 11 | int id; 12 | QString repo_id; 13 | QString repo_name; 14 | QString path; 15 | qint64 timestamp; 16 | int error_id; 17 | 18 | // Generated fields. 19 | QString readable_time_stamp; 20 | QString error_str; 21 | 22 | static SyncError fromGObject(_GObject *obj); 23 | 24 | void translateErrorStr(); 25 | 26 | bool operator==(const SyncError& rhs) const { 27 | return id == rhs.id 28 | && repo_id == rhs.repo_id 29 | && repo_name == rhs.repo_name 30 | && path == rhs.path 31 | && error_id == rhs.error_id 32 | && timestamp == rhs.timestamp; 33 | } 34 | 35 | bool operator!=(const SyncError& rhs) const { 36 | return !(*this == rhs); 37 | } 38 | }; 39 | 40 | #endif // SEAFILE_CLIENT_RPC_SYNC_ERROR_H 41 | -------------------------------------------------------------------------------- /src/rpc/update_rpc_sigs.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | # this seems to cover the bases on OSX, and someone will 6 | # have to tell me about the others. 7 | get_script_path () { 8 | local path="$1" 9 | [[ -L "$path" ]] || { echo "$path" ; return; } 10 | 11 | local target="$(readlink "$path")" 12 | if [[ "${target:0:1}" == "/" ]]; then 13 | echo "$target" 14 | else 15 | echo "${path%/*}/$target" 16 | fi 17 | } 18 | 19 | declare -r script_path="$(get_script_path "$BASH_SOURCE")" 20 | declare -r script_dir="${script_path%/*}" 21 | 22 | cd $script_dir 23 | searpc-codegen.py rpc_table.py 24 | -------------------------------------------------------------------------------- /src/seahub-notifications-monitor.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_SEAHUB_MESSAGES_MONITOR_ 2 | #define SEAFILE_CLIENT_SEAHUB_MESSAGES_MONITOR_ 3 | 4 | #include 5 | 6 | class QTimer; 7 | 8 | class ApiError; 9 | class GetUnseenSeahubNotificationsRequest; 10 | 11 | class SeahubNotificationsMonitor : public QObject 12 | { 13 | Q_OBJECT 14 | public: 15 | static SeahubNotificationsMonitor* instance(); 16 | 17 | void start(); 18 | void refresh(bool force); 19 | 20 | int getUnreadNotifications() const { return unread_count_; } 21 | 22 | void openNotificationsPageInBrowser(); 23 | 24 | public slots: 25 | void refresh(); 26 | 27 | signals: 28 | void notificationsChanged(); 29 | 30 | private slots: 31 | void onRequestSuccess(int count); 32 | void onRequestFailed(const ApiError& error); 33 | void onAccountChanged(); 34 | 35 | private: 36 | SeahubNotificationsMonitor(QObject *parent=0); 37 | static SeahubNotificationsMonitor *singleton_; 38 | 39 | void resetStatus(); 40 | void setUnreadNotificationsCount(int count); 41 | 42 | QTimer *refresh_timer_; 43 | GetUnseenSeahubNotificationsRequest *check_messages_req_; 44 | bool in_refresh_; 45 | 46 | int unread_count_; 47 | }; 48 | 49 | #endif // SEAFILE_CLIENT_SEAHUB_MESSAGES_MONITOR_ 50 | -------------------------------------------------------------------------------- /src/shib/shib-helper.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_SHIB_HELPER_H 2 | #define SEAFILE_CLIENT_SHIB_HELPER_H 3 | 4 | #include 5 | 6 | class QWebEngineCertificateError; 7 | class SeafileQWebEnginePage : public QWebEnginePage 8 | { 9 | Q_OBJECT 10 | public: 11 | SeafileQWebEnginePage(QObject *parent = 0); 12 | 13 | protected: 14 | bool certificateError( 15 | const QWebEngineCertificateError &certificateError); 16 | }; 17 | 18 | #endif /* SEAFILE_CLIENT_SHIB_HELPER_H */ 19 | -------------------------------------------------------------------------------- /src/sync-error-service.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_SYNC_ERROR_H 2 | #define SEAFILE_CLIENT_SYNC_ERROR_H 3 | 4 | #include 5 | #include 6 | 7 | #include "utils/singleton.h" 8 | 9 | 10 | struct sqlite3; 11 | struct sqlite3_stmt; 12 | 13 | /** 14 | * record the latest sync error id 15 | */ 16 | class LastSyncError { 17 | SINGLETON_DEFINE(LastSyncError) 18 | public: 19 | struct SyncErrorInfo { 20 | int id; 21 | }; 22 | 23 | struct RepoSyncError { 24 | QString account_sig; 25 | QString repo_id; 26 | int err_id; 27 | }; 28 | 29 | void start(); 30 | 31 | void saveLatestErrorID(const int id); 32 | int getLastSyncErrorID(); 33 | 34 | // getRepoSyncError returns the flagged error id of a repo, or -1 if not exists. 35 | int getRepoSyncError(const QString repo_id); 36 | void flagRepoSyncError(const QString repo_id, int err_id); 37 | void cleanRepoSyncErrors(const QString repo_id); 38 | void cleanAllSyncErrors(); 39 | 40 | QList getAllSyncErrorsInfo(); 41 | 42 | private: 43 | LastSyncError(); 44 | ~LastSyncError(); 45 | static bool collectSyncError(sqlite3_stmt *stmt, void *data); 46 | static bool collectRepoSyncError(sqlite3_stmt *stmt, void *data); 47 | 48 | sqlite3 *db_; 49 | }; 50 | 51 | #endif // SEAFILE_CLIENT_SYNC_ERROR_H 52 | -------------------------------------------------------------------------------- /src/traynotificationmanager.h: -------------------------------------------------------------------------------- 1 | #ifndef TRAYNOTIFICATIONMANAGER_H 2 | #define TRAYNOTIFICATIONMANAGER_H 3 | 4 | #include 5 | #include "traynotificationwidget.h" 6 | 7 | class TrayNotificationManager : public QObject 8 | { 9 | Q_OBJECT 10 | public: 11 | TrayNotificationManager(QObject *parent); 12 | ~TrayNotificationManager(); 13 | void append(TrayNotificationWidget *widget); 14 | void clear(); 15 | void setMaxTrayNotificationWidgets(int max); 16 | 17 | private slots: 18 | void removeWidget(); 19 | 20 | private: 21 | QList* notificationWidgets; 22 | int m_deltaX; 23 | int m_deltaY; 24 | int m_startX; 25 | int m_startY; 26 | int m_width; 27 | int m_height; 28 | bool m_up; 29 | int m_onScreenCount; 30 | int m_maxTrayNotificationWidgets; 31 | }; 32 | 33 | #endif // TRAYNOTIFICATIONMANAGER_H 34 | -------------------------------------------------------------------------------- /src/traynotificationwidget.h: -------------------------------------------------------------------------------- 1 | #ifndef TRAYNOTIFICATIONWIDGET_H 2 | #define TRAYNOTIFICATIONWIDGET_H 3 | 4 | #include 5 | 6 | #include 7 | 8 | #include 9 | 10 | class TrayNotificationWidget : public QWidget 11 | { 12 | Q_OBJECT 13 | public: 14 | explicit TrayNotificationWidget(QPixmap pixmapIcon, QString headerText, QString messageText); 15 | 16 | private: 17 | QTimer* timeout; 18 | signals: 19 | void deleted(); 20 | 21 | private slots: 22 | void fadeOut(); 23 | }; 24 | 25 | #endif // TRAYNOTIFICATIONWIDGET_H 26 | -------------------------------------------------------------------------------- /src/ui/about-dialog.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #include "seafile-applet.h" 4 | #include "utils/utils.h" 5 | 6 | #include "about-dialog.h" 7 | 8 | AboutDialog::AboutDialog(QWidget *parent) 9 | : QDialog(parent) 10 | { 11 | setupUi(this); 12 | setWindowTitle(tr("About %1").arg(getBrand())); 13 | setWindowIcon(QIcon(":/images/seafile.png")); 14 | setWindowFlags((windowFlags() & ~Qt::WindowContextHelpButtonHint) | 15 | Qt::WindowStaysOnTopHint); 16 | 17 | version_text_ = tr("

%1 Client %2

") 18 | .arg(getBrand()) 19 | .arg(STRINGIZE(SEAFILE_CLIENT_VERSION)) 20 | #ifdef SEAFILE_CLIENT_REVISION 21 | .append(tr("
REV %1
")) 22 | .arg(STRINGIZE(SEAFILE_CLIENT_REVISION)) 23 | #endif 24 | ; 25 | mVersionText->setText(version_text_); 26 | 27 | connect(mOKBtn, SIGNAL(clicked()), this, SLOT(close())); 28 | } 29 | -------------------------------------------------------------------------------- /src/ui/about-dialog.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_ABOUT_DIALOG_H 2 | #define SEAFILE_CLIENT_ABOUT_DIALOG_H 3 | 4 | #include 5 | #include "ui_about-dialog.h" 6 | 7 | class AutoUpdateService; 8 | 9 | class AboutDialog : public QDialog, 10 | public Ui::AboutDialog 11 | { 12 | Q_OBJECT 13 | public: 14 | AboutDialog(QWidget *parent=0); 15 | 16 | private: 17 | Q_DISABLE_COPY(AboutDialog) 18 | 19 | QString version_text_; 20 | }; 21 | 22 | #endif // SEAFILE_CLIENT_ABOUT_DIALOG_H 23 | -------------------------------------------------------------------------------- /src/ui/account-settings-dialog.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_ACCOUNT_SETTINGS_H 2 | #define SEAFILE_CLIENT_ACCOUNT_SETTINGS_H 3 | 4 | #include 5 | #include "ui_account-settings-dialog.h" 6 | 7 | #include 8 | #include 9 | 10 | #include "account.h" 11 | 12 | class AccountSettingsDialog : public QDialog, 13 | public Ui::AccountSettingsDialog 14 | { 15 | Q_OBJECT 16 | public: 17 | AccountSettingsDialog(const Account& account, QWidget *parent=0); 18 | 19 | private slots: 20 | void onSubmitBtnClicked(); 21 | 22 | private: 23 | Q_DISABLE_COPY(AccountSettingsDialog); 24 | bool validateInputs(); 25 | void showWarning(const QString& msg); 26 | 27 | Account account_; 28 | }; 29 | 30 | #endif // SEAFILE_CLIENT_ACCOUNT_SETTINGS_H 31 | -------------------------------------------------------------------------------- /src/ui/account-view.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_UI_ACCOUNT_VIEW_H 2 | #define SEAFILE_CLIENT_UI_ACCOUNT_VIEW_H 3 | 4 | #include 5 | 6 | #include "utils/singleton.h" 7 | #include "ui_account-view.h" 8 | 9 | class Account; 10 | class QAction; 11 | class QMenu; 12 | class ApiError; 13 | class QLabel; 14 | 15 | /* 16 | * The account information area, right below the header 17 | */ 18 | class AccountView : public QWidget, 19 | public Ui::AccountView 20 | { 21 | Q_OBJECT 22 | public: 23 | AccountView(QWidget *parent=0); 24 | 25 | public slots: 26 | void onAccountChanged(); 27 | void showAddAccountDialog(); 28 | void deleteAccount(); 29 | void editAccountSettings(); 30 | void onAccountItemClicked(); 31 | void updateAccountInfoDisplay(); 32 | 33 | private slots: 34 | void updateAvatar(); 35 | void toggleAccount(); 36 | void visitServerInBrowser(const QString& link); 37 | void slotShowSettingsDialog(); 38 | 39 | private: 40 | Q_DISABLE_COPY(AccountView) 41 | 42 | QAction *makeAccountAction(const Account& account); 43 | void setupSortingMenu(); 44 | bool eventFilter(QObject *obj, QEvent *event); 45 | 46 | // Account operations 47 | QAction *add_account_action_; 48 | QAction *account_settings_action_; 49 | QMenu *account_menu_; 50 | QMenu *sorting_menu_; 51 | 52 | signals: 53 | void refresh(); 54 | void sortOrderUpdated(); 55 | }; 56 | 57 | #endif // SEAFILE_CLIENT_UI_ACCOUNT_VIEW_H 58 | -------------------------------------------------------------------------------- /src/ui/clone-tasks-dialog.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_CLONE_TASKS_DIALOG_H 2 | #define SEAFILE_CLIENT_CLONE_TASKS_DIALOG_H 3 | 4 | #include 5 | #include "ui_clone-tasks-dialog.h" 6 | 7 | class QTimer; 8 | class QStackedWidget; 9 | 10 | class CloneTask; 11 | class CloneTasksTableView; 12 | class CloneTasksTableModel; 13 | 14 | class CloneTasksDialog : public QDialog, 15 | public Ui::CloneTasksDialog 16 | { 17 | Q_OBJECT 18 | 19 | public: 20 | CloneTasksDialog(QWidget *parent=0); 21 | void updateTasks(); 22 | 23 | private slots: 24 | void onModelReset(); 25 | 26 | private: 27 | void createEmptyView(); 28 | void addTaskItem(const CloneTask& task); 29 | 30 | QStackedWidget *stack_; 31 | CloneTasksTableView *table_; 32 | CloneTasksTableModel *model_; 33 | QWidget *empty_view_; 34 | }; 35 | 36 | 37 | #endif // SEAFILE_CLIENT_CLONE_TASKS_DIALOG_H 38 | -------------------------------------------------------------------------------- /src/ui/clone-tasks-table-model.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_CLONE_TASKS_TABLE_MODEL_H 2 | #define SEAFILE_CLIENT_CLONE_TASKS_TABLE_MODEL_H 3 | 4 | #include 5 | #include 6 | 7 | #include "rpc/clone-task.h" 8 | 9 | class QTimer; 10 | 11 | class CloneTasksTableModel : public QAbstractTableModel 12 | { 13 | Q_OBJECT 14 | 15 | public: 16 | CloneTasksTableModel(QObject *parent=0); 17 | 18 | int rowCount(const QModelIndex& parent=QModelIndex()) const; 19 | int columnCount(const QModelIndex& parent=QModelIndex()) const; 20 | QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const; 21 | 22 | QVariant headerData(int section, Qt::Orientation orientation, int role) const; 23 | 24 | CloneTask taskAt(size_t i) const { return (i >= tasks_.size()) ? CloneTask() : tasks_[i]; } 25 | 26 | public slots: 27 | void clearSuccessfulTasks(); 28 | 29 | public slots: 30 | void updateTasks(); 31 | 32 | private: 33 | 34 | std::vector tasks_; 35 | QTimer *update_timer_; 36 | }; 37 | 38 | 39 | #endif // SEAFILE_CLIENT_CLONE_TASKS_TABLE_MODEL_H 40 | -------------------------------------------------------------------------------- /src/ui/clone-tasks-table-view.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_CLONE_TASKS_TABLE_VIEW_H 2 | #define SEAFILE_CLIENT_CLONE_TASKS_TABLE_VIEW_H 3 | 4 | #include 5 | #include 6 | 7 | class QAction; 8 | class QMenu; 9 | class QContextMenuEvent; 10 | 11 | class CloneTask; 12 | 13 | class CloneTasksTableView : public QTableView 14 | { 15 | Q_OBJECT 16 | 17 | public: 18 | CloneTasksTableView(QWidget *parent=0); 19 | 20 | void contextMenuEvent(QContextMenuEvent *event); 21 | 22 | private slots: 23 | void cancelTask(); 24 | void removeTask(); 25 | 26 | private: 27 | void createContextMenu(); 28 | void prepareContextMenu(const CloneTask& task); 29 | 30 | QAction *cancel_task_action_; 31 | QAction *remove_task_action_; 32 | QMenu *context_menu_; 33 | }; 34 | 35 | class CloneTasksTableHeader : public QHeaderView { 36 | Q_OBJECT 37 | 38 | public: 39 | CloneTasksTableHeader(QWidget *parent=0); 40 | }; 41 | 42 | #endif // SEAFILE_CLIENT_CLONE_TASKS_TABLE_VIEW_H 43 | -------------------------------------------------------------------------------- /src/ui/create-repo-dialog.h: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | #include "ui_create-repo-dialog.h" 6 | #include "account.h" 7 | 8 | class CreateRepoRequest; 9 | class RepoDownloadInfo; 10 | class ApiError; 11 | class ReposTab; 12 | 13 | class CreateRepoDialog : public QDialog, 14 | public Ui::CreateRepoDialog 15 | { 16 | Q_OBJECT 17 | public: 18 | CreateRepoDialog(const Account& account, 19 | const QString& worktree, 20 | ReposTab *repos_tab, 21 | QWidget *parent=0); 22 | 23 | ~CreateRepoDialog(); 24 | 25 | private slots: 26 | void createAction(); 27 | void chooseDirAction(); 28 | void createSuccess(const RepoDownloadInfo& info); 29 | void createFailed(const ApiError& error); 30 | 31 | private: 32 | Q_DISABLE_COPY(CreateRepoDialog); 33 | bool validateInputs(); 34 | void setAllInputsEnabled(bool enabled); 35 | QString translateErrorMsg(const QString& error); 36 | 37 | QString path_; 38 | QString name_; 39 | QString passwd_; 40 | CreateRepoRequest *request_; 41 | Account account_; 42 | ReposTab *repos_tab_; 43 | }; 44 | -------------------------------------------------------------------------------- /src/ui/event-details-dialog.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_UI_EVENT_DETAILS_DIALOG_H 2 | #define SEAFILE_CLIENT_UI_EVENT_DETAILS_DIALOG_H 3 | 4 | #include 5 | #include "api/event.h" 6 | 7 | class GetCommitDetailsRequest; 8 | class CommitDetails; 9 | class EventDetailsListView; 10 | class EventDetailsListModel; 11 | class ApiError; 12 | 13 | // Display the commit details in a simple tree view 14 | class EventDetailsDialog : public QDialog { 15 | Q_OBJECT 16 | public: 17 | EventDetailsDialog(const SeafEvent& event, QWidget *parent=0); 18 | 19 | private slots: 20 | void updateContent(const CommitDetails& details); 21 | void getCommitDetailsFailed(const ApiError& error); 22 | 23 | private: 24 | Q_DISABLE_COPY(EventDetailsDialog) 25 | 26 | void sendRequest(); 27 | 28 | SeafEvent event_; 29 | 30 | GetCommitDetailsRequest *request_; 31 | 32 | EventDetailsListView *tree_; 33 | EventDetailsListModel *model_; 34 | QWidget *loading_view_; 35 | }; 36 | 37 | #endif // SEAFILE_CLIENT_UI_EVENT_DETAILS_DIALOG_H 38 | -------------------------------------------------------------------------------- /src/ui/init-seafile-dialog.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_INIT_SEAFILE_DIALOG_H 2 | #define SEAFILE_CLIENT_INIT_SEAFILE_DIALOG_H 3 | 4 | #include 5 | #include "ui_init-seafile-dialog.h" 6 | 7 | class QCloseEvent; 8 | 9 | class InitSeafileDialog : public QDialog, 10 | public Ui::InitSeafileDialog 11 | { 12 | Q_OBJECT 13 | 14 | public: 15 | InitSeafileDialog(QWidget *parent=0); 16 | void closeEvent(QCloseEvent *event); 17 | 18 | private slots: 19 | void onOkClicked(); 20 | void onCancelClicked(); 21 | void chooseDir(); 22 | 23 | signals: 24 | void seafileDirSet(const QString&); 25 | 26 | private: 27 | QString getInitialPath(); 28 | }; 29 | 30 | #endif // SEAFILE_CLIENT_INIT_SEAFILE_DIALOG_H 31 | -------------------------------------------------------------------------------- /src/ui/loading-view.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_LOADING_VIEW_H_ 2 | #define SEAFILE_CLIENT_LOADING_VIEW_H_ 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | class QMovie; 9 | class QShowEvent; 10 | class QHideEvent; 11 | class QHBoxLayout; 12 | 13 | class LoadingView : public QLabel { 14 | Q_OBJECT 15 | public: 16 | LoadingView(QWidget *parent=0); 17 | void setQssStyleForTab(); 18 | 19 | protected: 20 | void showEvent(QShowEvent *event); 21 | void hideEvent(QHideEvent *event); 22 | 23 | private: 24 | Q_DISABLE_COPY(LoadingView) 25 | 26 | QMovie *gif_; 27 | }; 28 | 29 | class LoadMoreButton : public QWidget { 30 | Q_OBJECT 31 | public: 32 | explicit LoadMoreButton(QWidget *parent=0); 33 | 34 | signals: 35 | void clicked(); 36 | 37 | private slots: 38 | void onBtnClicked(); 39 | 40 | private: 41 | QHBoxLayout *btn_layout_; 42 | QToolButton *load_more_btn_; 43 | LoadingView *loading_label_; 44 | }; 45 | 46 | #endif // SEAFILE_CLIENT_LOADING_VIEW_H_ 47 | -------------------------------------------------------------------------------- /src/ui/logout-view.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_LOGOUT_VIEW_H_ 2 | #define SEAFILE_CLIENT_LOGOUT_VIEW_H_ 3 | 4 | #include 5 | 6 | class QShowEvent; 7 | class QLabel; 8 | class Account; 9 | 10 | class LogoutView : public QWidget { 11 | Q_OBJECT 12 | public: 13 | LogoutView(QWidget *parent=0); 14 | void setQssStyleForTab(); 15 | 16 | private slots: 17 | void onAccountChanged(); 18 | void reloginCurrentAccount(); 19 | 20 | private: 21 | Q_DISABLE_COPY(LogoutView) 22 | QLabel *label_; 23 | }; 24 | 25 | #endif // SEAFILE_CLIENT_LOGOUT_VIEW_H_ 26 | -------------------------------------------------------------------------------- /src/ui/main-window.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_MAINWINDOW_H 2 | #define SEAFILE_MAINWINDOW_H 3 | 4 | #include 5 | 6 | class QAction; 7 | class QToolBar; 8 | class QResizeEvent; 9 | class QSize; 10 | 11 | class CloudView; 12 | 13 | class MainWindow : public QMainWindow 14 | { 15 | Q_OBJECT 16 | 17 | public: 18 | MainWindow(); 19 | 20 | void keyPressEvent(QKeyEvent *event); 21 | void showWindow(); 22 | void hide(); 23 | 24 | void readSettings(); 25 | void writeSettings(); 26 | 27 | protected: 28 | void createActions(); 29 | bool event(QEvent *event); 30 | void changeEvent(QEvent *event); 31 | 32 | private slots: 33 | void refreshQss(); 34 | void closeEvent(QCloseEvent *event); 35 | void showEvent(QShowEvent *event); 36 | void checkShowWindow(); //dummy slot if qt version is lower than 5.2.0 37 | 38 | private: 39 | Q_DISABLE_COPY(MainWindow) 40 | 41 | QPoint getDefaultPosition(const QSize& size); 42 | 43 | QAction *refresh_qss_action_; 44 | 45 | // ToolBar 46 | QToolBar *tool_bar_; 47 | 48 | QTabWidget *main_widget_; 49 | 50 | CloudView *cloud_view_; 51 | }; 52 | 53 | #endif // SEAFILE_MAINWINDOW_H 54 | -------------------------------------------------------------------------------- /src/ui/proxy-style.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #include "proxy-style.h" 5 | 6 | void SeafileProxyStyle::drawControl(ControlElement element, 7 | const QStyleOption * option, 8 | QPainter * painter, 9 | const QWidget * widget) const 10 | { 11 | 12 | if (element == CE_TabBarTabLabel) { 13 | // printf ("[draw tab label] name is %s\n", widget->objectName().toUtf8().data()); 14 | if (const QStyleOptionTab *tb = qstyleoption_cast(option)) { 15 | if (tb->state & State_HasFocus) { 16 | QStyleOptionTab t(*tb); 17 | t.state = t.state ^ State_HasFocus; 18 | QProxyStyle::drawControl(element, &t, painter, widget); 19 | return; 20 | } 21 | } 22 | } 23 | 24 | if (element == CE_TabBarTab) { 25 | // printf ("[draw tab] name is %s\n", widget->objectName().toUtf8().data()); 26 | } 27 | 28 | QProxyStyle::drawControl(element, option, painter, widget); 29 | } 30 | -------------------------------------------------------------------------------- /src/ui/proxy-style.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLEINT_PROXY_STYLE 2 | #define SEAFILE_CLEINT_PROXY_STYLE 3 | 4 | #include 5 | 6 | class QStyleOption; 7 | class QPainter; 8 | class QWidget; 9 | 10 | /** 11 | * Use a custom proxy style to remove the border of tabbar text when selected 12 | * See http://stackoverflow.com/questions/7492080/styling-the-text-outline-in-qts-tabs 13 | */ 14 | class SeafileProxyStyle: public QProxyStyle { 15 | public: 16 | virtual void drawControl (ControlElement element, const QStyleOption * option, 17 | QPainter * painter, const QWidget * widget = 0) const; 18 | }; 19 | 20 | #endif // SEAFILE_CLEINT_PROXY_STYLE 21 | -------------------------------------------------------------------------------- /src/ui/repo-detail-dialog.h: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | #include "ui_repo-detail-dialog.h" 6 | #include "api/server-repo.h" 7 | #include "rpc/local-repo.h" 8 | 9 | class QTimer; 10 | 11 | class RepoDetailDialog : public QDialog, 12 | public Ui::RepoDetailDialog 13 | { 14 | Q_OBJECT 15 | public: 16 | RepoDetailDialog(const ServerRepo &repo, QWidget *parent=0); 17 | 18 | private slots: 19 | void updateRepoStatus(); 20 | 21 | private: 22 | Q_DISABLE_COPY(RepoDetailDialog); 23 | 24 | ServerRepo repo_; 25 | QTimer *refresh_timer_; 26 | }; 27 | -------------------------------------------------------------------------------- /src/ui/repos-tab.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_UI_REPOS_TAB_H 2 | #define SEAFILE_CLIENT_UI_REPOS_TAB_H 3 | 4 | #include 5 | 6 | #include "tab-view.h" 7 | #include "api/server-repo.h" 8 | 9 | class QTimer; 10 | class QToolButton; 11 | 12 | class RepoTreeModel; 13 | class RepoFilterProxyModel; 14 | class RepoTreeView; 15 | class ListReposRequest; 16 | class ApiError; 17 | class SearchBar; 18 | 19 | /** 20 | * The repos list tab 21 | */ 22 | class ReposTab : public TabView { 23 | Q_OBJECT 24 | public: 25 | explicit ReposTab(QWidget *parent=0); 26 | 27 | std::vector getToolBarActions(); 28 | 29 | public slots: 30 | void refresh(); 31 | 32 | protected: 33 | void startRefresh(); 34 | void stopRefresh(); 35 | 36 | private slots: 37 | void refreshRepos(const std::vector& repos); 38 | void refreshReposFailed(const ApiError& error); 39 | void onFilterTextChanged(const QString& text); 40 | 41 | private: 42 | void createRepoTree(); 43 | void createLoadingView(); 44 | void createLoadingFailedView(); 45 | void showLoadingView(); 46 | 47 | RepoTreeModel *repos_model_; 48 | RepoFilterProxyModel *filter_model_; 49 | 50 | RepoTreeView *repos_tree_; 51 | QWidget *loading_view_; 52 | QWidget *loading_failed_view_; 53 | QWidget *logout_view_; 54 | 55 | SearchBar *filter_text_; 56 | 57 | ListReposRequest *list_repo_req_; 58 | }; 59 | 60 | #endif // SEAFILE_CLIENT_UI_REPOS_TAB_H 61 | -------------------------------------------------------------------------------- /src/ui/seafile-tab-widget.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_UI_SEAFILE_TAB_BAR_H 2 | #define SEAFILE_CLIENT_UI_SEAFILE_TAB_BAR_H 3 | 4 | #include 5 | #include 6 | 7 | class QPaintEvent; 8 | class QVBoxLayout; 9 | class QStackedLayout; 10 | 11 | /** 12 | * Custom tabbar used in the custom tab widget 13 | */ 14 | class SeafileTabBar : public QTabBar 15 | { 16 | Q_OBJECT 17 | public: 18 | SeafileTabBar(QWidget* parent = 0); 19 | 20 | void paintEvent(QPaintEvent* event); 21 | 22 | void addTab(const QString& text, 23 | const QString& icon_path, 24 | const QString& highlighted_icon); 25 | 26 | private: 27 | std::vector icons_; 28 | std::vector highlighted_icons_; 29 | }; 30 | 31 | /** 32 | * Custom tab widget, allow the tabbar to expand fully 33 | */ 34 | class SeafileTabWidget : public QWidget 35 | { 36 | Q_OBJECT 37 | public: 38 | SeafileTabWidget(QWidget* parent = 0); 39 | 40 | void addTab(QWidget* tab, 41 | const QString& text, 42 | const QString& icon_path, 43 | const QString& highlighted_icon); 44 | 45 | void removeTab(int index, QWidget* widget); 46 | 47 | void adjustTabsWidth(int full_width); 48 | 49 | int currentIndex() const; 50 | 51 | int count() const; 52 | 53 | signals: 54 | void currentTabChanged(int index); 55 | 56 | private: 57 | QVBoxLayout* layout_; 58 | 59 | SeafileTabBar* tabbar_; 60 | 61 | QWidget* pane_; 62 | 63 | QStackedLayout* stack_; 64 | }; 65 | 66 | 67 | #endif // SEAFILE_CLIENT_UI_SEAFILE_TAB_BAR_H 68 | -------------------------------------------------------------------------------- /src/ui/search-bar.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_SEARCH_BAR_H_ 2 | #define SEAFILE_CLIENT_SEARCH_BAR_H_ 3 | 4 | #include 5 | #include 6 | 7 | class QToolButton; 8 | class QLabel; 9 | 10 | class SearchBar : public QLineEdit 11 | { 12 | Q_OBJECT 13 | public: 14 | SearchBar(QWidget *parent=0); 15 | void setPlaceholderText(const QString& text); 16 | 17 | private slots: 18 | void onTextChanged(const QString& text); 19 | 20 | private: 21 | Q_DISABLE_COPY(SearchBar) 22 | 23 | void paintEvent(QPaintEvent* event); 24 | void resizeEvent(QResizeEvent* event); 25 | 26 | int clear_button_size_; 27 | QToolButton *clear_button_; 28 | QLabel *placeholder_label_; 29 | }; 30 | 31 | #endif // SEAFILE_CLIENT_SEARCH_BAR_H_ 32 | -------------------------------------------------------------------------------- /src/ui/server-status-dialog.cpp: -------------------------------------------------------------------------------- 1 | #include "server-status-service.h" 2 | #include "server-status-dialog.h" 3 | 4 | ServerStatusDialog::ServerStatusDialog(QWidget *parent) : QDialog(parent) 5 | { 6 | setupUi(this); 7 | 8 | #if defined(Q_OS_MAC) 9 | layout()->setContentsMargins(8, 9, 9, 4); 10 | layout()->setSpacing(5); 11 | #endif 12 | 13 | setWindowTitle(tr("Servers connection status")); 14 | setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); 15 | setWindowIcon(QIcon(":/images/seafile.png")); 16 | 17 | refreshStatus(); 18 | 19 | connect(ServerStatusService::instance(), SIGNAL(serverStatusChanged()), 20 | this, SLOT(refreshStatus())); 21 | } 22 | 23 | void ServerStatusDialog::refreshStatus() 24 | { 25 | mList->clear(); 26 | 27 | foreach (const ServerStatus& status, ServerStatusService::instance()->statuses()) { 28 | QListWidgetItem *item = new QListWidgetItem(mList); 29 | item->setData(Qt::DisplayRole, status.url.host()); 30 | 31 | if (status.connected) { 32 | item->setData(Qt::DecorationRole, QIcon(":/images/sync/done.png")); 33 | item->setData(Qt::ToolTipRole, tr("connected")); 34 | } else { 35 | item->setData(Qt::DecorationRole, QIcon(":/images/remove-red.png")); 36 | item->setData(Qt::ToolTipRole, tr("disconnected")); 37 | } 38 | 39 | mList->addItem(item); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/ui/server-status-dialog.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_SERVER_STATUS_DIALOG_H 2 | #define SEAFILE_CLIENT_SERVER_STATUS_DIALOG_H 3 | 4 | #include 5 | #include "ui_server-status-dialog.h" 6 | 7 | class ServerStatusDialog : public QDialog, 8 | public Ui::ServerStatusDialog 9 | { 10 | Q_OBJECT 11 | public: 12 | ServerStatusDialog(QWidget *parent=0); 13 | 14 | private slots: 15 | void refreshStatus(); 16 | 17 | private: 18 | Q_DISABLE_COPY(ServerStatusDialog) 19 | }; 20 | 21 | #endif // SEAFILE_CLIENT_SERVER_STATUS_DIALOG_H 22 | -------------------------------------------------------------------------------- /src/ui/set-repo-password-dialog.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_SET_REPO_PASSWORD_DIALOG_H 2 | #define SEAFILE_CLIENT_SET_REPO_PASSWORD_DIALOG_H 3 | 4 | #include 5 | #include 6 | #include "ui_set-repo-password-dialog.h" 7 | 8 | #include "api/server-repo.h" 9 | 10 | class Account; 11 | class ApiError; 12 | class SetRepoPasswordRequest; 13 | 14 | class SetRepoPasswordDialog : public QDialog, 15 | public Ui::SetRepoPasswordDialog 16 | { 17 | Q_OBJECT 18 | public: 19 | SetRepoPasswordDialog(const ServerRepo& repo, QWidget *parent=0); 20 | const QString& password() { return password_; } 21 | 22 | private slots: 23 | void onOkBtnClicked(); 24 | void requestFailed(const ApiError& error); 25 | 26 | private: 27 | Q_DISABLE_COPY(SetRepoPasswordDialog); 28 | 29 | void enableInputs(); 30 | void disableInputs(); 31 | 32 | QString password_; 33 | SetRepoPasswordRequest *request_; 34 | ServerRepo repo_; 35 | }; 36 | 37 | #endif // SEAFILE_CLIENT_SET_REPO_PASSWORD_DIALOG_H 38 | -------------------------------------------------------------------------------- /src/ui/settings-dialog.h: -------------------------------------------------------------------------------- 1 | #include 2 | #include "ui_settings-dialog.h" 3 | 4 | #include 5 | #include 6 | 7 | 8 | class SettingsDialog : public QDialog, 9 | public Ui::SettingsDialog 10 | { 11 | Q_OBJECT 12 | public: 13 | SettingsDialog(QWidget *parent=0); 14 | void setCurrentTab(int index); 15 | 16 | private slots: 17 | 18 | void autoStartChanged(int state); 19 | void hideDockIconChanged(int state); 20 | void notifyChanged(int state); 21 | void downloadChanged(int value); 22 | void uploadChanged(int value); 23 | void closeEvent(QCloseEvent *event); 24 | void showEvent(QShowEvent *event); 25 | void updateSettings(); 26 | void onOkBtnClicked(); 27 | 28 | void proxyRequirePasswordChanged(int state); 29 | void showHideControlsBasedOnCurrentProxyType(int state); 30 | 31 | private: 32 | bool updateProxySettings(); 33 | bool validateProxyInputs(); 34 | 35 | Q_DISABLE_COPY(SettingsDialog); 36 | }; 37 | -------------------------------------------------------------------------------- /src/ui/ssl-confirm-dialog.cpp: -------------------------------------------------------------------------------- 1 | #include "seafile-applet.h" 2 | #include "ssl-confirm-dialog.h" 3 | 4 | #include "utils/utils.h" 5 | 6 | SslConfirmDialog::SslConfirmDialog(const QUrl& url, 7 | const QSslCertificate& cert, 8 | const QSslCertificate& prev_cert, 9 | QWidget *parent) 10 | : QDialog(parent), 11 | url_(url) 12 | { 13 | setupUi(this); 14 | 15 | setWindowTitle(tr("Untrusted Connection")); 16 | setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); 17 | setWindowIcon(QIcon(":/images/seafile.png")); 18 | 19 | QString hint = tr("%1 uses an invalid security certificate. The connection may be insecure. Do you want to continue?").arg(url_.host()); 20 | 21 | QString fingerprint = dumpCertificateFingerprint(cert); 22 | QString prev_fingerprint = dumpCertificateFingerprint(prev_cert); 23 | 24 | hint += "\n\n"; 25 | hint += tr("Current RSA key fingerprint is %1").arg(fingerprint); 26 | if (prev_fingerprint != "") { 27 | hint += "\n"; 28 | hint += tr("Previous RSA key fingerprint is %1").arg(prev_fingerprint); 29 | } 30 | 31 | mHint->setText(hint); 32 | 33 | adjustSize(); 34 | 35 | connect(mYesBtn, SIGNAL(clicked()), this, SLOT(accept())); 36 | connect(mNoBtn, SIGNAL(clicked()), this, SLOT(reject())); 37 | } 38 | 39 | bool 40 | SslConfirmDialog::rememberChoice() const 41 | { 42 | return mRememberChoiceCheckBox->checkState() == Qt::Checked; 43 | } 44 | -------------------------------------------------------------------------------- /src/ui/ssl-confirm-dialog.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_UI_SSL_CONFIRM_DIALOG_H 2 | #define SEAFILE_CLIENT_UI_SSL_CONFIRM_DIALOG_H 3 | 4 | #include 5 | 6 | #include 7 | #include "ui_ssl-confirm-dialog.h" 8 | 9 | class QSslCertificate; 10 | 11 | class SslConfirmDialog : public QDialog, 12 | public Ui::SslConfirmDialog 13 | { 14 | Q_OBJECT 15 | public: 16 | SslConfirmDialog(const QUrl& url, 17 | const QSslCertificate& cert, 18 | const QSslCertificate& prev_cert, 19 | QWidget *parent=0); 20 | 21 | bool rememberChoice() const; 22 | 23 | private: 24 | QUrl url_; 25 | }; 26 | 27 | 28 | #endif // SEAFILE_CLIENT_UI_SSL_CONFIRM_DIALOG_H 29 | -------------------------------------------------------------------------------- /src/ui/starred-file-item-delegate.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_REPO_ITEM_DELEGATE_H 2 | #define SEAFILE_CLIENT_REPO_ITEM_DELEGATE_H 3 | 4 | #include 5 | #include 6 | 7 | class QStandardItem; 8 | class QModelIndex; 9 | class QWidget; 10 | 11 | class StarredFileItem; 12 | 13 | class StarredFileItemDelegate : public QStyledItemDelegate { 14 | Q_OBJECT 15 | public: 16 | explicit StarredFileItemDelegate(QObject *parent=0); 17 | 18 | void paint(QPainter *painter, 19 | const QStyleOptionViewItem& option, 20 | const QModelIndex& index) const; 21 | 22 | QSize sizeHint(const QStyleOptionViewItem& option, 23 | const QModelIndex& index) const; 24 | 25 | 26 | private: 27 | void paintItem(QPainter *painter, 28 | const QStyleOptionViewItem& opt, 29 | const StarredFileItem *item) const; 30 | 31 | QSize sizeHintForItem(const QStyleOptionViewItem &option, 32 | const StarredFileItem *item) const; 33 | 34 | StarredFileItem* getItem(const QModelIndex &index) const; 35 | 36 | QPixmap getIconForFile(const QString& name) const; 37 | }; 38 | 39 | 40 | #endif // SEAFILE_CLIENT_REPO_ITEM_DELEGATE_H 41 | -------------------------------------------------------------------------------- /src/ui/starred-file-item.cpp: -------------------------------------------------------------------------------- 1 | 2 | #include "starred-file-item.h" 3 | 4 | StarredFileItem::StarredFileItem(const StarredItem& file) 5 | : file_(file) 6 | { 7 | setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); 8 | } 9 | -------------------------------------------------------------------------------- /src/ui/starred-file-item.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_STARRED_FILE_ITEM_H 2 | #define SEAFILE_CLIENT_STARRED_FILE_ITEM_H 3 | 4 | #include 5 | #include "api/starred-file.h" 6 | 7 | /** 8 | * Represent a repo 9 | */ 10 | class StarredFileItem : public QStandardItem { 11 | public: 12 | explicit StarredFileItem(const StarredItem& repo); 13 | 14 | const StarredItem& file() const { return file_; } 15 | 16 | /** 17 | * Every time the item is painted, we record the metrics of each part of 18 | * the item on the screen. So later we the mouse click/hover the item, we 19 | * can decide which part is hovered, and to do corresponding actions. 20 | */ 21 | struct Metrics { 22 | QRect icon_rect; 23 | QRect name_rect; 24 | QRect subtitle_rect; 25 | QRect status_icon_rect; 26 | }; 27 | 28 | void setMetrics(const Metrics& metrics) const { metrics_ = metrics; } 29 | const Metrics& metrics() const { return metrics_; } 30 | 31 | private: 32 | StarredItem file_; 33 | 34 | mutable Metrics metrics_; 35 | }; 36 | 37 | #endif // SEAFILE_CLIENT_STARRED_FILE_ITEM_H 38 | -------------------------------------------------------------------------------- /src/ui/starred-files-list-model.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include // std::sort 5 | 6 | #include "utils/utils.h" 7 | #include "seafile-applet.h" 8 | #include "main-window.h" 9 | #include "rpc/rpc-client.h" 10 | #include "starred-file-item.h" 11 | 12 | #include "starred-files-list-model.h" 13 | 14 | namespace { 15 | 16 | bool compareFileByTimestamp(const StarredItem& a, const StarredItem& b) 17 | { 18 | return a.mtime > b.mtime; 19 | } 20 | 21 | } // namespace 22 | 23 | StarredFilesListModel::StarredFilesListModel(QObject *parent) 24 | : QStandardItemModel(parent) 25 | { 26 | } 27 | 28 | void StarredFilesListModel::setFiles(const std::vector& files) 29 | { 30 | int i, n = files.size(); 31 | 32 | clear(); 33 | 34 | std::vector list = files; 35 | 36 | std::sort(list.begin(), list.end(), compareFileByTimestamp); 37 | 38 | for (i = 0; i < n; i++) { 39 | StarredFileItem *item = new StarredFileItem(files[i]); 40 | appendRow(item); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/ui/starred-files-list-model.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_STARRED_FILES_LIST_MODEL_H 2 | #define SEAFILE_CLIENT_STARRED_FILES_LIST_MODEL_H 3 | 4 | #include 5 | #include 6 | 7 | #include "api/starred-file.h" 8 | 9 | class QModelIndex; 10 | 11 | 12 | class StarredFilesListModel : public QStandardItemModel { 13 | Q_OBJECT 14 | 15 | public: 16 | StarredFilesListModel(QObject *parent=0); 17 | 18 | void setFiles(const std::vector& files); 19 | 20 | private: 21 | 22 | std::vector files_; 23 | }; 24 | 25 | #endif // SEAFILE_CLIENT_STARRED_FILES_LIST_MODEL_H 26 | -------------------------------------------------------------------------------- /src/ui/starred-files-list-view.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_UI_STARRED_FILES_LIST_VIEW_H 2 | #define SEAFILE_CLIENT_UI_STARRED_FILES_LIST_VIEW_H 3 | 4 | #include 5 | #include "api/starred-file.h" 6 | 7 | class QAction; 8 | class QContextMenuEvent; 9 | class QMenu; 10 | class QModelIndex; 11 | class QStandardItem; 12 | 13 | class StarredFileItem; 14 | 15 | class StarredFilesListView : public QListView { 16 | Q_OBJECT 17 | public: 18 | StarredFilesListView(QWidget *parent=0); 19 | 20 | protected: 21 | void contextMenuEvent(QContextMenuEvent *event); 22 | bool viewportEvent(QEvent *event); 23 | 24 | private slots: 25 | void onItemDoubleClicked(const QModelIndex& index); 26 | 27 | private slots: 28 | void openLocalFile(); 29 | void viewFileOnWeb(); 30 | 31 | private: 32 | void createActions(); 33 | QMenu *prepareContextMenu(const StarredFileItem *item); 34 | void updateActions(); 35 | QStandardItem* getFileItem(const QModelIndex &index) const; 36 | void openLocalFile(const StarredItem& file); 37 | void openLocalDir(const StarredItem& file); 38 | 39 | QAction *open_file_action_; 40 | QAction *view_file_on_web_action_; 41 | QAction *open_repo_action_; 42 | QAction *gen_share_link_action; 43 | }; 44 | 45 | #endif // SEAFILE_CLIENT_UI_STARRED_FILES_LIST_VIEW_H 46 | -------------------------------------------------------------------------------- /src/ui/starred-files-tab.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_UI_STARRED_FILES_TAB_H 2 | #define SEAFILE_CLIENT_UI_STARRED_FILES_TAB_H 3 | 4 | #include "tab-view.h" 5 | #include "api/starred-file.h" 6 | 7 | class QTimer; 8 | class QListWidget; 9 | 10 | class GetStarredFilesRequest; 11 | class GetStarredFilesRequestV2; 12 | class ApiError; 13 | class StarredFilesListView; 14 | class StarredFilesListModel; 15 | 16 | /** 17 | * The starred files tab 18 | */ 19 | class StarredFilesTab : public TabView { 20 | Q_OBJECT 21 | public: 22 | explicit StarredFilesTab(QWidget *parent=0); 23 | 24 | public slots: 25 | void refresh(); 26 | 27 | protected: 28 | void startRefresh(); 29 | void stopRefresh(); 30 | 31 | private slots: 32 | void refreshStarredFiles(const std::vector& files); 33 | void refreshStarredFilesV2(const std::vector& files); 34 | void refreshStarredFilesFailed(const ApiError& error); 35 | 36 | private: 37 | void createStarredFilesListView(); 38 | void createLoadingView(); 39 | void createLoadingFailedView(); 40 | void createEmptyView(); 41 | void showLoadingView(); 42 | 43 | QTimer *refresh_timer_; 44 | bool in_refresh_; 45 | 46 | StarredFilesListView *files_list_view_; 47 | StarredFilesListModel *files_list_model_; 48 | 49 | QWidget *loading_view_; 50 | QWidget *loading_failed_view_; 51 | QWidget *logout_view_; 52 | QWidget *empty_view_; 53 | 54 | GetStarredFilesRequest *get_starred_files_req_; 55 | GetStarredFilesRequestV2 *get_starred_items_req_; 56 | }; 57 | 58 | #endif // SEAFILE_CLIENT_UI_STARRED_FILES_TAB_H 59 | -------------------------------------------------------------------------------- /src/ui/tab-view.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #include "tab-view.h" 5 | 6 | TabView::TabView(QWidget *parent) 7 | : QWidget (parent) 8 | { 9 | QVBoxLayout *layout = new QVBoxLayout; 10 | layout->setContentsMargins(0, 0, 0, 0); 11 | setLayout(layout); 12 | 13 | mStack = new QStackedWidget; 14 | layout->addWidget(mStack); 15 | } 16 | 17 | void TabView::showEvent(QShowEvent *event) 18 | { 19 | startRefresh(); 20 | QWidget::showEvent(event); 21 | } 22 | 23 | /** 24 | * Pause its freshing when this tab is not shown in front. 25 | */ 26 | void TabView::hideEvent(QHideEvent *event) 27 | { 28 | stopRefresh(); 29 | QWidget::hideEvent(event); 30 | } 31 | -------------------------------------------------------------------------------- /src/ui/tab-view.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_UI_TAB_VIEW_H 2 | #define SEAFILE_CLIENT_UI_TAB_VIEW_H 3 | 4 | #include 5 | 6 | class QStackedWidget; 7 | class QShowEvent; 8 | class QHideEvent; 9 | 10 | /** 11 | * Represents one tab of a QTabWidget 12 | */ 13 | class TabView : public QWidget { 14 | Q_OBJECT 15 | public: 16 | TabView(QWidget *parent=0); 17 | virtual ~TabView() {}; 18 | 19 | public slots: 20 | virtual void refresh() = 0; 21 | 22 | protected: 23 | virtual void showEvent(QShowEvent *event); 24 | virtual void hideEvent(QHideEvent *event); 25 | 26 | virtual void startRefresh() = 0; 27 | virtual void stopRefresh() = 0; 28 | 29 | QStackedWidget *mStack; 30 | }; 31 | 32 | #endif // SEAFILE_CLIENT_UI_TAB_VIEW_H 33 | -------------------------------------------------------------------------------- /src/ui/two-factor-dialog.cpp: -------------------------------------------------------------------------------- 1 | #include "two-factor-dialog.h" 2 | #include "seafile-applet.h" 3 | 4 | TwoFactorDialog::TwoFactorDialog(QWidget *parent) : 5 | QDialog(parent) 6 | { 7 | setupUi(this); 8 | mText->setText(tr("Enter the two factor authentication token")); 9 | setWindowTitle(tr("Two Factor Authentication")); 10 | setWindowIcon(QIcon(":/images/seafile.png")); 11 | 12 | connect(mSubmit, SIGNAL(clicked()), this, SLOT(doSubmit())); 13 | } 14 | 15 | QString TwoFactorDialog::getText() 16 | { 17 | return mLineEdit->text(); 18 | } 19 | 20 | bool TwoFactorDialog::rememberDeviceChecked() 21 | { 22 | return mRememberDevice->isChecked(); 23 | } 24 | 25 | void TwoFactorDialog::doSubmit() 26 | { 27 | if (!mLineEdit->text().isEmpty()) { 28 | accept(); 29 | } else { 30 | seafApplet->warningBox(tr("Please enter the two factor authentication token")); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/ui/two-factor-dialog.h: -------------------------------------------------------------------------------- 1 | #ifndef TWOFACTORDIALOG_H 2 | #define TWOFACTORDIALOG_H 3 | 4 | #include 5 | #include "ui_two-factor-dialog.h" 6 | class TwoFactorDialog : public QDialog, 7 | public Ui::TwoFactorDialog 8 | { 9 | Q_OBJECT 10 | 11 | public: 12 | TwoFactorDialog(QWidget *parent = 0); 13 | QString getText(); 14 | bool rememberDeviceChecked(); 15 | 16 | private slots: 17 | void doSubmit(); 18 | }; 19 | 20 | #endif // TWOFACTORDIALOG_H 21 | -------------------------------------------------------------------------------- /src/ui/uninstall-helper-dialog.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_UNINSTALL_HELPER_WINDOW_H 2 | #define SEAFILE_CLIENT_UNINSTALL_HELPER_WINDOW_H 3 | 4 | #include 5 | #include 6 | #include "ui_uninstall-helper-dialog.h" 7 | 8 | 9 | class UninstallHelperDialog : public QDialog, 10 | public Ui::UninstallHelperDialog 11 | { 12 | Q_OBJECT 13 | public: 14 | UninstallHelperDialog(QWidget *parent=0); 15 | 16 | private slots: 17 | void onYesClicked(); 18 | void doExit(); 19 | 20 | private: 21 | Q_DISABLE_COPY(UninstallHelperDialog) 22 | 23 | bool loadQss(const QString& path); 24 | 25 | QString style_; 26 | }; 27 | 28 | class RemoveSeafileDataThread : public QThread 29 | { 30 | Q_OBJECT 31 | public: 32 | void run(); 33 | }; 34 | 35 | 36 | #endif // SEAFILE_CLIENT_UNINSTALL_HELPER_WINDOW_H 37 | -------------------------------------------------------------------------------- /src/ui/user-name-completer.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_UI_USER_NAME_COMPLETER_H 2 | #define SEAFILE_CLIENT_UI_USER_NAME_COMPLETER_H 3 | 4 | #include 5 | 6 | class QLineEdit; 7 | class QTimer; 8 | class QTreeWidget; 9 | 10 | struct SeafileUser; 11 | class ApiError; 12 | 13 | #include "account.h" 14 | #include "api/contact-share-info.h" 15 | #include "api/requests.h" 16 | 17 | class SeafileUserNameCompleter : public QObject 18 | { 19 | Q_OBJECT 20 | 21 | public: 22 | SeafileUserNameCompleter(const Account& account, QLineEdit *parent = 0); 23 | ~SeafileUserNameCompleter(); 24 | bool eventFilter(QObject *obj, QEvent *ev) Q_DECL_OVERRIDE; 25 | 26 | const SeafileUser& currentSelectedUser() const; 27 | 28 | private slots: 29 | void onSearchUsersSuccess(const QList& contacts); 30 | void onSearchUsersFailed(const ApiError& error); 31 | void doneCompletion(); 32 | void preventSuggest(); 33 | void autoSuggest(); 34 | void showCompletion(const QList& users, const QString& pattern); 35 | void onAvatarUpdated(const QString& email, const QImage& avatar); 36 | 37 | private: 38 | Account account_; 39 | 40 | QLineEdit *editor_; 41 | QTreeWidget *popup_; 42 | QTimer *timer_; 43 | 44 | QSet in_progress_search_requests_; 45 | 46 | struct CachedUsersEntry { 47 | QSet users; 48 | qint64 ts; 49 | }; 50 | QHash cached_completion_users_by_pattern_; 51 | 52 | SeafileUser current_selected_user_; 53 | }; 54 | 55 | #endif // SEAFILE_CLIENT_UI_USER_NAME_COMPLETER_H 56 | -------------------------------------------------------------------------------- /src/utils/api-utils.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #include "utils.h" 5 | #include "seafile-applet.h" 6 | #include "rpc/rpc-client.h" 7 | #include "api-utils.h" 8 | 9 | namespace { 10 | 11 | #if defined(Q_OS_WIN32) 12 | const char *kOsName = "windows"; 13 | #elif defined(Q_OS_LINUX) 14 | const char *kOsName = "linux"; 15 | #else 16 | const char *kOsName = "mac"; 17 | #endif 18 | 19 | } // namespace 20 | 21 | QHash 22 | getSeafileLoginParams(const QString& computer_name, const QString& prefix) 23 | { 24 | 25 | QHash params; 26 | 27 | QString client_version = STRINGIZE(SEAFILE_CLIENT_VERSION); 28 | QString device_id = seafApplet->getUniqueClientId(); 29 | QString computper = computer_name.isEmpty() ? QHostInfo::localHostName() 30 | : computer_name; 31 | 32 | params.insert(prefix + "platform", kOsName); 33 | params.insert(prefix + "device_id", device_id); 34 | params.insert(prefix + "device_name", computer_name); 35 | params.insert(prefix + "client_version", client_version); 36 | params.insert(prefix + "platform_version", ""); 37 | 38 | return params; 39 | } 40 | -------------------------------------------------------------------------------- /src/utils/api-utils.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_API_UTILS_H_ 2 | #define SEAFILE_CLIENT_API_UTILS_H_ 3 | 4 | QHash 5 | getSeafileLoginParams(const QString& computer_name=QString(), 6 | const QString& prefix=QString()); 7 | 8 | #endif // SEAFILE_CLIENT_API_UTILS_H_ 9 | -------------------------------------------------------------------------------- /src/utils/file-utils.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_FILE_UTILS_H_ 2 | #define SEAFILE_CLIENT_FILE_UTILS_H_ 3 | 4 | #include 5 | #include 6 | 7 | QString mimeTypeFromFileName(const QString& fileName); 8 | QString iconPrefixFromFileName(const QString& fileName); 9 | 10 | QString getIconByFolder(); 11 | 12 | QString getIconByFileName(const QString& fileName); 13 | QString getIconByFileNameV2(const QString& fileName); 14 | 15 | QString readableNameForFolder(bool readonly = false); 16 | QString readableNameForFile(const QString& fileName); 17 | 18 | QString getParentPath(const QString& path); 19 | QString getBaseName(const QString& path); 20 | 21 | QString pathJoin(const QString& a, const QString& b); 22 | QString pathJoin(const QString& a, const QString& b, const QString& c); 23 | QString pathJoin(const QString& a, const QString& b, const QString& c, const QString& d); 24 | QString pathJoin(const QString& a, const QStringList& rest); 25 | 26 | QString expandVars(const QString& origin); 27 | QString expandUser(const QString& origin); 28 | 29 | bool createDirIfNotExists(const QString& path); 30 | 31 | 32 | #endif // SEAFILE_CLIENT_FILE_UTILS_H_ 33 | -------------------------------------------------------------------------------- /src/utils/json-utils.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include "json-utils.h" 3 | 4 | Json::Json(const json_t *root) 5 | { 6 | json_ = root; 7 | } 8 | 9 | QString Json::getString(const char *key) const 10 | { 11 | if (!json_) { 12 | return QString(); 13 | } 14 | return QString::fromUtf8(json_string_value(json_object_get(json_, key))); 15 | } 16 | 17 | qint64 Json::getLong(const char *key) const 18 | { 19 | if (!json_) { 20 | return 0; 21 | } 22 | return json_integer_value(json_object_get(json_, key)); 23 | } 24 | 25 | bool Json::getBool(const char *key) const 26 | { 27 | if (!json_) { 28 | return false; 29 | } 30 | 31 | json_t *value = json_object_get(json_, key); 32 | if (json_is_false(value)) 33 | return false; 34 | return json_is_true(value) || json_integer_value(value); 35 | } 36 | 37 | Json Json::getObject(const char *key) const 38 | { 39 | if (!json_) { 40 | return Json(); 41 | } 42 | 43 | json_t *object = json_object_get(json_, key); 44 | if (json_is_object(object)) 45 | return Json(object); 46 | return Json(); 47 | } 48 | -------------------------------------------------------------------------------- /src/utils/json-utils.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_UTILS_JSON_UTILS_H 2 | 3 | #include 4 | #include 5 | 6 | // A convenient class to access jasson `json_t` struct 7 | class Json { 8 | public: 9 | Json(const json_t *root = 0); 10 | 11 | QString getString(const char *name) const; 12 | qint64 getLong(const char *name) const; 13 | bool getBool(const char *name) const; 14 | Json getObject(const char *name) const; 15 | 16 | private: 17 | const json_t *json_; 18 | }; 19 | 20 | #endif // SEAFILE_CLIENT_UTILS_JSON_UTILS_H 21 | -------------------------------------------------------------------------------- /src/utils/log.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_UTILS_LOG_H 2 | #define SEAFILE_CLIENT_UTILS_LOG_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | G_BEGIN_DECLS 10 | 11 | int applet_log_init (const char *ccnet_dir); 12 | 13 | G_END_DECLS 14 | 15 | #endif // SEAFILE_CLIENT_UTILS_LOG_H 16 | -------------------------------------------------------------------------------- /src/utils/paint-utils.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_PAINT_UTILS_H_ 2 | #define SEAFILE_CLIENT_PAINT_UTILS_H_ 3 | 4 | #include 5 | #include "utils-mac.h" 6 | #include 7 | 8 | QString fitTextToWidth(const QString& text, const QFont& font, int width); 9 | 10 | QFont zoomFont(const QFont& font_in, double ratio); 11 | 12 | QFont changeFontSize(const QFont& font_in, int size); 13 | 14 | int textWidthInFont(const QString text, const QFont& font); 15 | 16 | int textHeightInFont(const QString text, const QFont& font); 17 | 18 | double globalDevicePixelRatio(); 19 | 20 | #endif // SEAFILE_CLIENT_PAINT_UTILS_H_ 21 | -------------------------------------------------------------------------------- /src/utils/process.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_UTILS_PROCESS_H 2 | #define SEAFILE_CLIENT_UTILS_PROCESS_H 3 | 4 | #include 5 | 6 | // process related functions 7 | int process_is_running (const char *process_name); 8 | 9 | void shutdown_process (const char *name); 10 | 11 | // Return the number of processes whose executable name is `name`. 12 | int count_process(const char *name); 13 | 14 | // Same as count_process(name), but also return the pid of the first matched 15 | // non-self process. 16 | int count_process(const char *name, uint64_t *pid); 17 | 18 | #endif // SEAFILE_CLIENT_UTILS_PROCESS_H 19 | -------------------------------------------------------------------------------- /src/utils/rsa.h: -------------------------------------------------------------------------------- 1 | /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 2 | 3 | #ifndef SEAFILE_CLIENT_RSA_H 4 | #define SEAFILE_CLIENT_RSA_H 5 | 6 | #include 7 | 8 | RSA* private_key_to_pub(RSA *priv); 9 | 10 | RSA* generate_private_key(int bits); 11 | 12 | char *id_from_pubkey (RSA *pubkey); 13 | 14 | #endif 15 | -------------------------------------------------------------------------------- /src/utils/seafile-error.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_SEAFILE_ERROR_H 2 | #define SEAFILE_CLIENT_SEAFILE_ERROR_H 3 | 4 | #include 5 | #include 6 | 7 | QString 8 | translateSyncErrorCode(const int error_code); 9 | 10 | QString 11 | translateFileSyncErrorCode(const int error_code); 12 | 13 | #endif //SEAFILE_CLIENT_SEAFILE_ERROR_H 14 | -------------------------------------------------------------------------------- /src/utils/singleton.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_UTILS_SINGLETON_H 2 | #define SEAFILE_CLIENT_UTILS_SINGLETON_H 3 | 4 | /** 5 | * This macro helps conveniently define singleton classes. Usage: 6 | * 7 | * // foo.h 8 | * #include "utils/singleton.h" 9 | * class Foo { 10 | * SINGLETON_DEFINE(Foo) 11 | * private: 12 | * Foo() 13 | * ... 14 | * } 15 | 16 | * // foo.cpp 17 | * #include "foo.h" 18 | * SINGLETON_IMPL(Foo) 19 | */ 20 | 21 | #define SINGLETON_DEFINE(CLASS) \ 22 | public: \ 23 | static CLASS *instance(); \ 24 | private: \ 25 | static CLASS *singleton_; \ 26 | 27 | #define SINGLETON_IMPL(CLASS) \ 28 | CLASS* CLASS::singleton_; \ 29 | CLASS* CLASS::instance() { \ 30 | if (singleton_ == NULL) { \ 31 | static CLASS instance; \ 32 | singleton_ = &instance; \ 33 | } \ 34 | return singleton_; \ 35 | } 36 | 37 | #endif // SEAFILE_CLIENT_UTILS_SINGLETON_H 38 | -------------------------------------------------------------------------------- /src/utils/stl.cpp: -------------------------------------------------------------------------------- 1 | #include "stl.h" 2 | 3 | namespace utils { 4 | 5 | template class BasicBufferArray; 6 | template class BasicBufferArray; 7 | 8 | template <> 9 | inline void swap(BasicBufferArray &LHS, 10 | BasicBufferArray &RHS) UTILS_CXX11_NOEXCEPT; 11 | 12 | template <> 13 | inline void swap(BasicBufferArray &LHS, 14 | BasicBufferArray &RHS) UTILS_CXX11_NOEXCEPT; 15 | 16 | } // namespace utils 17 | -------------------------------------------------------------------------------- /src/utils/translate-commit-desc.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef SEAFILE_CELINT_TRANSLATE_COMMIT_DESC_H 3 | #define SEAFILE_CELINT_TRANSLATE_COMMIT_DESC_H 4 | 5 | #include 6 | 7 | QString 8 | translateCommitDesc (const QString& input); 9 | 10 | void 11 | translateCommitDescV2(const QString& path, const QString& file_name, const QString& repo_name, 12 | const QString& obj_type, const QString& op_type, const QString& old_repo_name, 13 | const QString& old_path, const QString& old_name, int clean_trash_days, 14 | QString *out_obj_desc, QString *out_op_desc); 15 | 16 | #endif // SEAFILE_CELINT_TRANSLATE_COMMIT_DESC_H 17 | -------------------------------------------------------------------------------- /src/utils/uninstall-helpers.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_UTILS_UNINSTALL_HELPERS_H 2 | #define SEAFILE_CLIENT_UTILS_UNINSTALL_HELPERS_H 3 | 4 | #include 5 | 6 | void do_ping(); 7 | /** 8 | * Stop running seafile client. 9 | */ 10 | void do_stop(); 11 | 12 | /** 13 | * Remove ccnet and seafile-data 14 | */ 15 | void do_remove_user_data(); 16 | 17 | int get_ccnet_dir(QString *ret); 18 | int get_seafile_data_dir(const QString& ccnet_dir, QString *ret); 19 | int delete_dir_recursively(const QString& path_in); 20 | 21 | #endif // SEAFILE_CLIENT_UTILS_UNINSTALL_HELPERS_H 22 | -------------------------------------------------------------------------------- /src/utils/utils-mac.h: -------------------------------------------------------------------------------- 1 | #ifndef SEAFILE_CLIENT_UTILS_MAC_H_ 2 | #define SEAFILE_CLIENT_UTILS_MAC_H_ 3 | #include 4 | #ifdef Q_OS_MAC 5 | #include 6 | #include 7 | #include 8 | 9 | namespace utils { 10 | namespace mac { 11 | // a list for os x versions https://support.apple.com/en-us/HT201260 12 | // release major minor patch 13 | // Yosemite 10 10 ? 14 | // Mavericks 10 9 ? 15 | // Mountain Lion 10 8 ? 16 | // Lion 10 7 ? 17 | void getSystemVersion(unsigned *major, unsigned *minor, unsigned *patch); 18 | bool isAtLeastSystemVersion(unsigned major, unsigned minor, unsigned patch); 19 | bool isOSXYosemiteOrGreater(); 20 | bool isOSXMavericksOrGreater(); 21 | bool isOSXMountainLionOrGreater(); 22 | bool isOSXLionOrGreater(); 23 | 24 | void setDockIconStyle(bool hidden); 25 | void orderFrontRegardless(unsigned long long win_id, bool force = false); 26 | bool get_auto_start(); 27 | void set_auto_start(bool enabled); 28 | void copyTextToPasteboard(const QString &text); 29 | 30 | QString mainBundlePath(); 31 | 32 | // load the missing part of ca certificates 33 | std::vector getSystemCaCertificates(); 34 | 35 | } // namespace mac 36 | } // namespace utils 37 | #else 38 | namespace utils { 39 | namespace mac { 40 | inline bool isOSXYosemiteOrGreater() { return false; } 41 | inline bool isOSXMavericksOrGreater() { return false; } 42 | inline bool isOSXMountainLionOrGreater() { return false; } 43 | inline bool isOSXLionOrGreater() { return false; } 44 | } // namespace mac 45 | } // namespace utils 46 | #endif /* Q_OS_MAC */ 47 | 48 | #endif /* SEAFILE_CLIENT_UTILS_MAC_H_ */ 49 | -------------------------------------------------------------------------------- /tests/CMakeLists.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/tests/CMakeLists.txt -------------------------------------------------------------------------------- /tests/test_file-utils.h: -------------------------------------------------------------------------------- 1 | #ifndef TESTS_FILE_UTILS_H 2 | #define TESTS_FILE_UTILS_H 3 | #include 4 | 5 | class FileUtils : public QObject { 6 | Q_OBJECT 7 | public: 8 | virtual ~FileUtils() {}; 9 | 10 | private slots: 11 | void getParentPath(); 12 | void getBaseName(); 13 | void expandUser(); 14 | }; 15 | 16 | #endif // TESTS_FILE_UTILS_H 17 | 18 | -------------------------------------------------------------------------------- /tests/test_server-info.h: -------------------------------------------------------------------------------- 1 | #ifndef TESTS_SERVER_INFO_H 2 | #define TESTS_SERVER_INFO_H 3 | #include 4 | 5 | class ServerInfoTest : public QObject { 6 | Q_OBJECT 7 | public: 8 | virtual ~ServerInfoTest() {}; 9 | 10 | private slots: 11 | void testFeature(); 12 | void testVersion(); 13 | }; 14 | 15 | #endif // TESTS_SERVER_INFO_H 16 | 17 | -------------------------------------------------------------------------------- /tests/test_stl.h: -------------------------------------------------------------------------------- 1 | #ifndef TESTS_STL_H 2 | #define TESTS_STL_H 3 | #include 4 | 5 | class STLTest : public QObject { 6 | Q_OBJECT 7 | public: 8 | virtual ~STLTest() {}; 9 | 10 | private slots: 11 | void testBufferArry(); 12 | void testWBufferArry(); 13 | }; 14 | 15 | #endif // TESTS_STL_H 16 | 17 | -------------------------------------------------------------------------------- /tests/test_utils.h: -------------------------------------------------------------------------------- 1 | #ifndef TESTS_UTILS_H 2 | #define TESTS_UTILS_H 3 | #include 4 | 5 | class Utils : public QObject { 6 | Q_OBJECT 7 | public: 8 | virtual ~Utils() {}; 9 | 10 | private slots: 11 | void testReadableFileSize(); 12 | void testIncludeUrlParams(); 13 | void testDigitalCompare(); 14 | }; 15 | 16 | #endif // TESTS_UTILS_H 17 | 18 | -------------------------------------------------------------------------------- /third_party/QtAwesome/QtAwesome.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | fonts/fontawesome.ttf 4 | 5 | 6 | -------------------------------------------------------------------------------- /third_party/QtAwesome/fonts/fontawesome.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/third_party/QtAwesome/fonts/fontawesome.ttf -------------------------------------------------------------------------------- /third_party/WinSparkle-0.5.3/AUTHORS: -------------------------------------------------------------------------------- 1 | Maintainer: 2 | 3 | Vaclav Slavik 4 | 5 | 6 | Contributors: 7 | 8 | Kohan Ikin 9 | Christian L. Jacobsen 10 | Littleboy 11 | Vasco Veloso 12 | Jonas Emanuel Mueller 13 | -------------------------------------------------------------------------------- /third_party/WinSparkle-0.5.3/COPYING: -------------------------------------------------------------------------------- 1 | Copyright (c) 2009-2016 Vaclav Slavik 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | this software and associated documentation files (the "Software"), to deal in 5 | the Software without restriction, including without limitation the rights to 6 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 7 | of the Software, and to permit persons to whom the Software is furnished to do 8 | so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | -------------------------------------------------------------------------------- /third_party/WinSparkle-0.5.3/Release/WinSparkle.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/third_party/WinSparkle-0.5.3/Release/WinSparkle.dll -------------------------------------------------------------------------------- /third_party/WinSparkle-0.5.3/Release/WinSparkle.lib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/third_party/WinSparkle-0.5.3/Release/WinSparkle.lib -------------------------------------------------------------------------------- /third_party/WinSparkle-0.5.3/Release/WinSparkle.pdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/third_party/WinSparkle-0.5.3/Release/WinSparkle.pdb -------------------------------------------------------------------------------- /third_party/WinSparkle-0.5.3/x64/Release/WinSparkle.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/third_party/WinSparkle-0.5.3/x64/Release/WinSparkle.dll -------------------------------------------------------------------------------- /third_party/WinSparkle-0.5.3/x64/Release/WinSparkle.lib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/third_party/WinSparkle-0.5.3/x64/Release/WinSparkle.lib -------------------------------------------------------------------------------- /third_party/WinSparkle-0.5.3/x64/Release/WinSparkle.pdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haiwen/seafile-client/52f7d3931e5290e4503163a7081f9f4dc19f42f8/third_party/WinSparkle-0.5.3/x64/Release/WinSparkle.pdb -------------------------------------------------------------------------------- /third_party/quazip/quaadler32.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2010 Adam Walczak 3 | Copyright (C) 2005-2014 Sergey A. Tachenov 4 | 5 | This file is part of QuaZip. 6 | 7 | QuaZip is free software: you can redistribute it and/or modify 8 | it under the terms of the GNU Lesser General Public License as published by 9 | the Free Software Foundation, either version 2.1 of the License, or 10 | (at your option) any later version. 11 | 12 | QuaZip is distributed in the hope that it will be useful, 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | GNU Lesser General Public License for more details. 16 | 17 | You should have received a copy of the GNU Lesser General Public License 18 | along with QuaZip. If not, see . 19 | 20 | See COPYING file for the full LGPL text. 21 | 22 | Original ZIP package is copyrighted by Gilles Vollant and contributors, 23 | see quazip/(un)zip.h files for details. Basically it's the zlib license. 24 | */ 25 | 26 | #include "quaadler32.h" 27 | 28 | #include 29 | 30 | QuaAdler32::QuaAdler32() 31 | { 32 | reset(); 33 | } 34 | 35 | quint32 QuaAdler32::calculate(const QByteArray &data) 36 | { 37 | return adler32( adler32(0L, Z_NULL, 0), (const Bytef*)data.data(), data.size() ); 38 | } 39 | 40 | void QuaAdler32::reset() 41 | { 42 | checksum = adler32(0L, Z_NULL, 0); 43 | } 44 | 45 | void QuaAdler32::update(const QByteArray &buf) 46 | { 47 | checksum = adler32( checksum, (const Bytef*)buf.data(), buf.size() ); 48 | } 49 | 50 | quint32 QuaAdler32::value() 51 | { 52 | return checksum; 53 | } 54 | -------------------------------------------------------------------------------- /third_party/quazip/quachecksum32.cpp: -------------------------------------------------------------------------------- 1 | #include "quachecksum32.h" 2 | 3 | QuaChecksum32::~QuaChecksum32() 4 | { 5 | } 6 | -------------------------------------------------------------------------------- /third_party/quazip/quacrc32.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2005-2014 Sergey A. Tachenov 3 | 4 | This file is part of QuaZip. 5 | 6 | QuaZip is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU Lesser General Public License as published by 8 | the Free Software Foundation, either version 2.1 of the License, or 9 | (at your option) any later version. 10 | 11 | QuaZip is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU Lesser General Public License for more details. 15 | 16 | You should have received a copy of the GNU Lesser General Public License 17 | along with QuaZip. If not, see . 18 | 19 | See COPYING file for the full LGPL text. 20 | 21 | Original ZIP package is copyrighted by Gilles Vollant and contributors, 22 | see quazip/(un)zip.h files for details. Basically it's the zlib license. 23 | */ 24 | 25 | #include "quacrc32.h" 26 | 27 | #include 28 | 29 | QuaCrc32::QuaCrc32() 30 | { 31 | reset(); 32 | } 33 | 34 | quint32 QuaCrc32::calculate(const QByteArray &data) 35 | { 36 | return crc32( crc32(0L, Z_NULL, 0), (const Bytef*)data.data(), data.size() ); 37 | } 38 | 39 | void QuaCrc32::reset() 40 | { 41 | checksum = crc32(0L, Z_NULL, 0); 42 | } 43 | 44 | void QuaCrc32::update(const QByteArray &buf) 45 | { 46 | checksum = crc32( checksum, (const Bytef*)buf.data(), buf.size() ); 47 | } 48 | 49 | quint32 QuaCrc32::value() 50 | { 51 | return checksum; 52 | } 53 | -------------------------------------------------------------------------------- /third_party/quazip/quacrc32.h: -------------------------------------------------------------------------------- 1 | #ifndef QUACRC32_H 2 | #define QUACRC32_H 3 | 4 | /* 5 | Copyright (C) 2005-2014 Sergey A. Tachenov 6 | 7 | This file is part of QuaZip. 8 | 9 | QuaZip is free software: you can redistribute it and/or modify 10 | it under the terms of the GNU Lesser General Public License as published by 11 | the Free Software Foundation, either version 2.1 of the License, or 12 | (at your option) any later version. 13 | 14 | QuaZip is distributed in the hope that it will be useful, 15 | but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | GNU Lesser General Public License for more details. 18 | 19 | You should have received a copy of the GNU Lesser General Public License 20 | along with QuaZip. If not, see . 21 | 22 | See COPYING file for the full LGPL text. 23 | 24 | Original ZIP package is copyrighted by Gilles Vollant and contributors, 25 | see quazip/(un)zip.h files for details. Basically it's the zlib license. 26 | */ 27 | 28 | #include "quachecksum32.h" 29 | 30 | ///CRC32 checksum 31 | /** \class QuaCrc32 quacrc32.h 32 | * This class wrappers the crc32 function with the QuaChecksum32 interface. 33 | * See QuaChecksum32 for more info. 34 | */ 35 | class QUAZIP_EXPORT QuaCrc32 : public QuaChecksum32 { 36 | 37 | public: 38 | QuaCrc32(); 39 | 40 | quint32 calculate(const QByteArray &data); 41 | 42 | void reset(); 43 | void update(const QByteArray &buf); 44 | quint32 value(); 45 | 46 | private: 47 | quint32 checksum; 48 | }; 49 | 50 | #endif //QUACRC32_H 51 | -------------------------------------------------------------------------------- /third_party/quazip/quazip.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.30611.23 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "quazip", "quazip.vcxproj", "{63169D2E-199E-412F-97CC-A816A5636426}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|x64 = Debug|x64 11 | Release|x64 = Release|x64 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {63169D2E-199E-412F-97CC-A816A5636426}.Debug|x64.ActiveCfg = Debug|x64 15 | {63169D2E-199E-412F-97CC-A816A5636426}.Debug|x64.Build.0 = Debug|x64 16 | {63169D2E-199E-412F-97CC-A816A5636426}.Release|x64.ActiveCfg = Release|x64 17 | {63169D2E-199E-412F-97CC-A816A5636426}.Release|x64.Build.0 = Release|x64 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {D7C94128-D6F6-42B4-8179-F495464B2D51} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /third_party/quazip/vcpkg.json: -------------------------------------------------------------------------------- 1 | { 2 | "builtin-baseline": "f63682b9182187131b564c1395e4ac8ecb0c5ea8", 3 | "dependencies": [ 4 | "zlib" 5 | ], 6 | "overrides": [ 7 | { 8 | "name": "zlib", 9 | "version": "1.2.11-6" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /vcpkg.json: -------------------------------------------------------------------------------- 1 | { 2 | "builtin-baseline": "f63682b9182187131b564c1395e4ac8ecb0c5ea8", 3 | "dependencies": [ 4 | "getopt", 5 | "glib", 6 | "jansson", 7 | "openssl", 8 | "pthreads", 9 | "sqlite3", 10 | "zlib" 11 | ], 12 | "overrides": [ 13 | { 14 | "name": "jansson", 15 | "version": "2.12-1" 16 | }, 17 | { 18 | "name": "pthreads", 19 | "version": "3.0.0-4" 20 | }, 21 | { 22 | "name": "sqlite3", 23 | "version": "3.31.1" 24 | }, 25 | { 26 | "name": "zlib", 27 | "version": "1.2.11-6" 28 | } 29 | ] 30 | } 31 | --------------------------------------------------------------------------------