Comparar commits

..

12 Commits

Autor SHA1 Mensagem Data
Roeland Jago Douma a0b0e3ca3d [Sharing] Show same avatar placeholder for group/federated shares as on
web
2015-12-22 09:54:32 +01:00
Roeland Jago Douma 22ca648a3d [Sharing] Show avatars! 2015-12-22 09:13:27 +01:00
Roeland Jago Douma 4daf051e1d [Sharing] Show placeholders for avatars
Just like on the web show placeholders for avatars in the sharing dialog
2015-12-21 16:19:09 +01:00
Christian Kamm ae806e8214 Merge remote-tracking branch 'origin/2.1' 2015-12-10 11:07:20 +01:00
Jürgen Weigert e67bb1c5ce Merge pull request #4201 from owncloud/jnweiger-patch-1
improved linux build instructions.
2015-12-03 14:05:24 +01:00
Jürgen Weigert f2c9a49c50 fixed formatting lines 212 215 2015-12-03 14:04:43 +01:00
Olivier Goffart e27374324d AccountSettings: Remove the F5 reset folder shortcut
This secret key was used to wipe the database. In the past this was
usefull because of many bugs, but now this is not usefull anymore.
And cause trouble because it also erase the selective sync list.

Issue #4182
2015-12-02 12:27:53 +01:00
Daniel Molkentin 895f0b29aa Merge remote-tracking branch 'origin/2.1' 2015-11-30 00:47:10 +01:00
Jürgen Weigert f54f48615d Update building.rst
ah, and the instructions miss the 'cd client' before git submodule init.
2015-11-26 12:06:32 +01:00
Jürgen Weigert 06bb97e6d9 Update building.rst 2015-11-26 12:02:23 +01:00
Jürgen Weigert 0763f65329 improved linux build instructions.
I am using :: lists, as the ``  versions mangle multi-line commands all in one long line.
The cmake command should just end in .., not in ../client
2015-11-26 11:55:23 +01:00
Markus Goetz 40395bdc0e VERSION.cmake: master is now 2.2 2015-11-17 15:47:46 +01:00
148 arquivos alterados com 5756 adições e 6758 exclusões
-3
Ver Arquivo
@@ -10,6 +10,3 @@
[submodule "src/3rdparty/libcrashreporter-qt"]
path = src/3rdparty/libcrashreporter-qt
url = git://github.com/dschmidt/libcrashreporter-qt.git
[submodule "src/3rdparty/qtkeychain"]
path = src/3rdparty/qtkeychain
url = https://github.com/frankosterfeld/qtkeychain.git
-20
Ver Arquivo
@@ -1,25 +1,5 @@
ChangeLog
=========
version 2.1.1 (release 2016-01-2x)
* UI improvements for HiDPI screens, error messages, RTL languages
* Fix occurences of "Connection Closed" when a new unauthenticated TCP socket is used
* Fix undeliberate WiFi scanning done by Qt Network classes
* Several fixes/improvements to the sharing dialog
* Several fixes/improvements to the server activity tab
* Create the directory when using --confdir and it does not exist
* Windows Overlay icons: Fix DLL and icon oddities
* Mac Overlay icons: Don't install legacy Finder plugin on >= 10.10
* Linux Overlay icons: Nemo plugin
* Overlay icons: Fix several wrong icon state computations
* Allow changeable upload chunk size in owncloud.cfg
* Crash fixes on account deletion
* Forget password on explicit sign-out
* Sync Engine: .lnk files
* Sync Engine: symlinked syn directories
* Sync Engine: Windows: Fix deleting and replacing of read-only files (#4308 #4277)
* Sync Engine: Fixes for files becoming directories and vice versa (#4302)
* Misc other fixes/improvements
version 2.1 (release 2015-12-03)
* GUI: Added a display of server activities
* GUI: Added a separate view for not synced items, ignores, errors
+3 -3
Ver Arquivo
@@ -1,10 +1,10 @@
set( MIRALL_VERSION_MAJOR 2 )
set( MIRALL_VERSION_MINOR 1 )
set( MIRALL_VERSION_PATCH 1 )
set( MIRALL_VERSION_MINOR 2 )
set( MIRALL_VERSION_PATCH 0 )
set( MIRALL_SOVERSION 0 )
if ( NOT DEFINED MIRALL_VERSION_SUFFIX )
set( MIRALL_VERSION_SUFFIX "beta1") #e.g. beta1, beta2, rc1
set( MIRALL_VERSION_SUFFIX "git") #e.g. beta1, beta2, rc1
endif( NOT DEFINED MIRALL_VERSION_SUFFIX )
if( NOT DEFINED MIRALL_VERSION_BUILD )
+2
Ver Arquivo
@@ -38,6 +38,8 @@ QT_PLUGINS = [
'imageformats/libqgif.dylib',
'imageformats/libqico.dylib',
'imageformats/libqjpeg.dylib',
'bearer/libqcorewlanbearer.dylib',
'bearer/libqgenericbearer.dylib',
'imageformats/libqsvg.dylib',
'imageformats/libqmng.dylib',
]
-34
Ver Arquivo
@@ -1115,28 +1115,6 @@
</dict>
<key>PACKAGE_UUID</key>
<string>39F61FCD-6EAA-4F3A-81C6-25E3F667DFB5</string>
<key>REQUIREMENTS</key>
<array>
<dict>
<key>BEHAVIOR</key>
<integer>1</integer>
<key>DICTIONARY</key>
<dict>
<key>IC_REQUIREMENT_JAVASCRIPT_FUNCTION</key>
<string>olderOsx</string>
<key>IC_REQUIREMENT_JAVASCRIPT_PARAMETERS</key>
<array/>
</dict>
<key>IDENTIFIER</key>
<string>fr.whitebox.Packages.requirement.javascript</string>
<key>MESSAGE</key>
<array/>
<key>NAME</key>
<string>JavaScript</string>
<key>STATE</key>
<true/>
</dict>
</array>
<key>TITLE</key>
<array/>
<key>TOOLTIP</key>
@@ -1450,18 +1428,6 @@
<string>@CMAKE_INSTALL_DIR@</string>
</dict>
</dict>
<key>SHARED_GLOBAL_DATA</key>
<dict>
<key>IC_REQUIREMENT_JAVASCRIPT_SHARED_SOURCE_CODE</key>
<string>
function olderOsx() {
if(system.compareVersions(system.version.ProductVersion, '10.10') == -1) {
return true;
}
return false;
}
</string>
</dict>
<key>TYPE</key>
<integer>0</integer>
<key>VERSION</key>
@@ -1,39 +0,0 @@
From cf6881c03d9f08c6ace83defe461423bb87f30d8 Mon Sep 17 00:00:00 2001
From: =?utf8?q?Tor=20Arne=20Vestb=C3=B8?= <tor.arne.vestbo@theqtcompany.com>
Date: Fri, 15 Jan 2016 14:15:51 +0100
Subject: [PATCH] OS X: Ensure system tray icon is prepared even when menu bar
is hidden
On OS X 10.11 (El Capitan) the system menu bar can be automatically
hidden, in which case the menu bar height is reported to be 0 when
using the menuBarHeight API.
This resulted in failing to prepare an image for the system tray
icon item, making the tray item "invisible".
Instead we now use the [[NSStatusBar systemStatusBar] thickness]
API, which returns the correct height regardless of the menu bar
being hidden or not.
Task-number: QTBUG-48960
Change-Id: I208fb8df13754964a6f254cadfbff06dd56c6bab
---
src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm b/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm
index a3ffb5b..8152c57 100644
--- a/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm
+++ b/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm
@@ -198,7 +198,7 @@ void QCocoaSystemTrayIcon::updateIcon(const QIcon &icon)
// current OS X versions is 22 points. Provide some future-proofing
// by deriving the icon height from the menu height.
const int padding = 4;
- const int menuHeight = [[[NSApplication sharedApplication] mainMenu] menuBarHeight];
+ const int menuHeight = [[NSStatusBar systemStatusBar] thickness];
const int maxImageHeight = menuHeight - padding;
// Select pixmap based on the device pixel height. Ideally we would use
--
2.6.2.2.g1b5ffa3
-1
Ver Arquivo
@@ -37,7 +37,6 @@ purpose is outlined in each patches' front matter.
* 0013-Make-UnknownAccessibility-not-block-requests.patch
* 0015-Remove-legacy-platform-code-in-QSslSocket-for-OS-X-1.patch
* 0016-Fix-possible-crash-when-passing-an-invalid-PAC-URL.patch
* 0019-Ensure-system-tray-icon-is-prepared-even-when-menu-bar.patch
### Not submitted to be part of any release:
* 0006-Fix-force-debug-info-with-macx-clang_NOUPSTREAM.patch
+1 -1
Ver Arquivo
@@ -29,7 +29,7 @@ StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "${APPLICATION_NAME}erako Abiarazle
StrCpy $UNINSTALLER_FILE_Detail "Desinstalatzailea idazten"
StrCpy $UNINSTALLER_REGISTRY_Detail "Instalatzaileko Erregistroko Giltzak idazten"
StrCpy $UNINSTALLER_FINISHED_Detail "Bukatuta"
StrCpy $UNINSTALL_MESSAGEBOX "Ez dirudi ${APPLICATION_NAME} '$INSTDIR'.$ direktorioan instalatuta dagoenik.$\n$\nJarraitu hala ere (ez da aholkatzen)?"
StrCpy $UNINSTALL_MESSAGEBOX "Ez dirudi ${APPLICATION_NAME} '$INSTDIR'.$ direktorioan instalatuta dagoenik.\n$\nJarraitu hala ere (ez da aholkatzen)?"
StrCpy $UNINSTALL_ABORT "Desinstalazioak erabiltzaileak bertan behera utzi du"
StrCpy $INIT_NO_QUICK_LAUNCH "Abiarazle Bizkorreko Lasterbidea (E/E)"
StrCpy $INIT_NO_DESKTOP "Mahaigaineko Lasterbidea (dagoena berridazten du)"
+1 -1
Ver Arquivo
@@ -30,7 +30,7 @@ StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "میانبر اجرای سریع ب
StrCpy $UNINSTALLER_FILE_Detail "نوشتن حذف کننده"
StrCpy $UNINSTALLER_REGISTRY_Detail "در حال نوشتن کلید های رجیستری نصاب"
StrCpy $UNINSTALLER_FINISHED_Detail "اتمام"
StrCpy $UNINSTALL_MESSAGEBOX "به نظر نمی رسد نرم افزار ${APPLICATION_NAME} در '$INSTDIR'.$\n$\nنصب شده باشد.$\nآیا می خواهید ادامه دهید ( توصیه نشده است ) ؟"
StrCpy $UNINSTALL_MESSAGEBOX "به نظر نمی رسد نرم افزار ${APPLICATION_NAME} در '$INSTDIR'.$\n$\nنصب شده باشد.\nآیا می خواهید ادامه دهید ( توصیه نشده است ) ؟"
StrCpy $UNINSTALL_ABORT "عمل حذف توسط کاربر متوقف شد"
StrCpy $INIT_NO_QUICK_LAUNCH "میانبر بازکردن سریع ( N/A )"
StrCpy $INIT_NO_DESKTOP "میانبر دسکتاپ (رونویسی وجود دارد)"
+2 -2
Ver Arquivo
@@ -1,6 +1,6 @@
# Auto-generated - do not modify
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Näytä julkaisutiedot"
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Havaittiin sovelluksen ${APPLICATION_EXECUTABLE} prosessi (tai prosesseja) jotka pitäisi pysäyttää.$\nHaluatko että asennusohjelma pysäyttää nämä puolestasi?"
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Havaittiin sovelluksen ${APPLICATION_EXECUTABLE} prosessi (tai prosesseja) jotka pitäisi pysäyttää.\nHaluatko että asennusohjelma pysäyttää nämä puolestasi?"
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Pysäytetään sovelluksen ${APPLICATION_EXECUTABLE} prosessit."
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Tapettavaa prosessia ei löytynyt!"
StrCpy $PageReinstall_NEW_Field_1 "Vanhempi versio sovelluksesta ${APPLICATION_NAME} on jo asennettu. On suositeltavaa että poistat vanhan asennuksen ensin. Valitse mikä toiminto suoritetaan ja napsauta Seuraava jatkaaksesi."
@@ -30,7 +30,7 @@ StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Pikak
StrCpy $UNINSTALLER_FILE_Detail "Kirjoitetaan poisto-ohjelmaa"
StrCpy $UNINSTALLER_REGISTRY_Detail "Kirjoitetaan asennusohjelman rekisteriavaimia"
StrCpy $UNINSTALLER_FINISHED_Detail "Valmis"
StrCpy $UNINSTALL_MESSAGEBOX "Vaikuttaa siltä että sovellus ${APPLICATION_NAME} on asennettu kansioon '$INSTDIR'.$\n$\nHaluatko jatkaa tästä huolimatta (ei suositeltavaa)?"
StrCpy $UNINSTALL_MESSAGEBOX "Vaikuttaa siltä että sovellus ${APPLICATION_NAME} on asennettu kansioon '$INSTDIR'.\n\nHaluatko jatkaa tästä huolimatta (ei suositeltavaa)?"
StrCpy $UNINSTALL_ABORT "Poistaminen keskeytettiin käyttäjän toimesta"
StrCpy $INIT_NO_QUICK_LAUNCH "Pikakäynnistyksen pikakuvake (-)"
StrCpy $INIT_NO_DESKTOP "Työpöydän pikakuvake (korvaa nykyinen)"
+1 -1
Ver Arquivo
@@ -30,7 +30,7 @@ StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Scorciatoia per ${APPLICATION_NAME}
StrCpy $UNINSTALLER_FILE_Detail "Creazione del programma di disinstallazione"
StrCpy $UNINSTALLER_REGISTRY_Detail "Scrittura delle chiavi di registro del programma di installazione"
StrCpy $UNINSTALLER_FINISHED_Detail "Completato"
StrCpy $UNINSTALL_MESSAGEBOX "Non sembra che ${APPLICATION_NAME} sia installato nella cartella '$INSTDIR'.$$\nVuoi continuare comunque (non consigliato)?"
StrCpy $UNINSTALL_MESSAGEBOX "Non sembra che ${APPLICATION_NAME} sia installato nella cartella '$INSTDIR'.$\nVuoi continuare comunque (non consigliato)?"
StrCpy $UNINSTALL_ABORT "Disinstallazione interrotta dall'utente"
StrCpy $INIT_NO_QUICK_LAUNCH "Scorciatoia dell'avvio veloce (N/D)"
StrCpy $INIT_NO_DESKTOP "Scorciatoia del desktop (sovrascrivi se esistente)"
+2 -2
Ver Arquivo
@@ -3,12 +3,12 @@ StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "${APPLICATION_EXECUTABLE} のプロセスを終了する必要があります。$\nインストーラーがそのプロセスを停止してもよろしいですか?"
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "${APPLICATION_EXECUTABLE} プロセスを停止しています。"
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "終了するプロセスがありません"
StrCpy $PageReinstall_NEW_Field_1 "システムに ${APPLICATION_NAME} の旧バージョンがインストールされています。$\n旧バージョンをアンインストールし、最新バージョンをインストールするのをお勧めします。$\nオペレーションを選択し、次へをクリックする。"
StrCpy $PageReinstall_NEW_Field_1 "システムに ${APPLICATION_NAME} の旧バージョンがインストールされています。\n旧バージョンをアンインストールし、最新バージョンをインストールするのをお勧めします。\nオペレーションを選択し、次へをクリックする。"
StrCpy $PageReinstall_NEW_Field_2 "インストール前にアンインストールする"
StrCpy $PageReinstall_NEW_Field_3 "アンインストールしない"
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "インストール済"
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "${APPLICATION_NAME} のインストール方法を選択する"
StrCpy $PageReinstall_OLD_Field_1 "${APPLICATION_NAME} の最新バージョンがすでにインストールされています。$\n旧バージョンのインストールはお勧めしません。旧バージョンのインストールが本当に必要な場合は、まず最新バージョンをアンインストールしてから、旧バージョンをインストールしてください。$\nオペレーションを選択し、次へをクリックする。"
StrCpy $PageReinstall_OLD_Field_1 "${APPLICATION_NAME} の最新バージョンがすでにインストールされています。\n旧バージョンのインストールはお勧めしません。旧バージョンのインストールが本当に必要な場合は、まず最新バージョンをアンインストールしてから、旧バージョンをインストールしてください。\nオペレーションを選択し、次へをクリックする。"
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} は、${VERSION} が既にインストールされています。$\n$\n実行したい操作を選択し、次へをクリックする。"
StrCpy $PageReinstall_SAME_Field_2 "追加/再インストールコンポーネント"
StrCpy $PageReinstall_SAME_Field_3 "${APPLICATION_NAME} をアンインストール"
+2 -2
Ver Arquivo
@@ -3,13 +3,13 @@ StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Mostrar notas de lançamento"
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Processos(s) ${APPLICATION_EXECUTABLE} em execução. Estes processos precisam de ser interrompidos.$\\nDeseja que o instalador os termine automaticamente?"
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "A terminar os processos ${APPLICATION_EXECUTABLE}."
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Não foi encontrado o processo a terminar!"
StrCpy $PageReinstall_NEW_Field_1 "Uma versão antiga de ${APPLICATION_NAME} está instalada no sistema. É recomendado que você desinstale a versão atual antes de instalar a mais recente. Selecione a operação que deseja executar e clique em $\"Avançar$\" para continuar."
StrCpy $PageReinstall_NEW_Field_1 "Uma versão antiga de ${APPLICATION_NAME} está instalada no sistema. É recomendado que você desinstale a versão atual antes de instalar. Selecione a operação que deseja executar e clique em $\"Avançar$\" para continuar."
StrCpy $PageReinstall_NEW_Field_2 "Desinstalar antes de instalar"
StrCpy $PageReinstall_NEW_Field_3 "Não desinstale"
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Já instalado"
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Escolha como pretende instalar ${APPLICATION_NAME}."
StrCpy $PageReinstall_OLD_Field_1 "Uma versão mais recente do ${APPLICATION_NAME} já está instalada! Não é recomendada a instalação de uma versão mais antiga. Se realmente deseja instalar esta versão, aconselha-se a desinstalação da versão atual primeiro. Selecione a operação que deseja executar e clique em Avançar para continuar."
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} já está instalada.$\nSelecione a operação que deseja realizar e clique em 'Seguinte' para continuar."
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} já está instalada.\nSelecione a operação que deseja realizar e clique em 'Seguinte' para continuar."
StrCpy $PageReinstall_SAME_Field_2 "Adicionar/Reinstalar Componentes"
StrCpy $PageReinstall_SAME_Field_3 "Desinstalar ${APPLICATION_NAME}"
StrCpy $UNINSTALLER_APPDATA_TITLE "Desinstalar ${APPLICATION_NAME}"
+1 -1
Ver Arquivo
@@ -30,7 +30,7 @@ StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Ярлык в меню быстро
StrCpy $UNINSTALLER_FILE_Detail "Сохранение деинсталлятора"
StrCpy $UNINSTALLER_REGISTRY_Detail "Запись ключей реестра установщика"
StrCpy $UNINSTALLER_FINISHED_Detail "Завершено"
StrCpy $UNINSTALL_MESSAGEBOX "Похоже, что приложение ${APPLICATION_NAME} не установлено в каталог '$INSTDIR'.$\nВсе равно продолжить (не рекомендуется)?"
StrCpy $UNINSTALL_MESSAGEBOX "Похоже, что приложение ${APPLICATION_NAME} не установлено в каталог '$INSTDIR'.\nВсе равно продолжить (не рекомендуется)?"
StrCpy $UNINSTALL_ABORT "Удаление отменено пользователем"
StrCpy $INIT_NO_QUICK_LAUNCH "Ярлык быстрого запуска (не доступен)"
StrCpy $INIT_NO_DESKTOP "Ярлык на рабочем столе (перезапись существующего)"
+1 -1
Ver Arquivo
@@ -1,6 +1,6 @@
# Auto-generated - do not modify
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "แสดงบันทึกประจำรุ่น"
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "พบว่ากระบวนการ ${APPLICATION_EXECUTABLE} จะต้องหยุดทำงาน$\nคุณต้องการติดตั้งเพื่อหยุดการทำงานเหล่านี้ของคุณ?"
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "พบว่ากระบวนการ ${APPLICATION_EXECUTABLE} จะต้องหยุดทำงาน\nคุณต้องการติดตั้งเพื่อหยุดการทำงานเหล่านี้ของคุณ?"
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "ฆ่ากระบวนการทำงาน ${APPLICATION_EXECUTABLE}"
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "ไม่พบการฆ่ากระบวนการ!"
StrCpy $PageReinstall_NEW_Field_1 "รุ่นเก่าของ ${APPLICATION_NAME} มีการติดตั้งในระบบของคุณ ขอแนะนำให้คุณถอนการติดตั้งรุ่นปัจจุบันออกก่อน เลือกการดำเนินการที่คุณต้องการที่จะดำเนินการและคลิกถัดไปเพื่อดำเนินการต่อ"
+3 -5
Ver Arquivo
@@ -104,12 +104,10 @@ localeToName = {
def escapeNSIS(st):
return st.replace('\\', r'$\\')\
.replace('\t', r'$\t')\
.replace('\r', r'$\r')\
.replace('\n', r'$\n')\
.replace('\r', r'\r')\
.replace('\n', r'\n')\
.replace('\"', r'$\"')\
.replace('$$\\', '$\\')\
.replace('$\\n', r'$\n')
.replace('$$\\', '$\\')
translationCache = {}
+1 -1
Submodule binary updated: 71633edc9a...8b72648a93
+5
Ver Arquivo
@@ -40,6 +40,7 @@
!define QT_DLL_PATH "${MING_BIN}"
!define ACCESSIBLE_DLL_PATH "${MING_LIB}/qt5/plugins/accessible"
!define SQLITE_DLL_PATH "${MING_LIB}/qt5/plugins/sqldrivers"
!define BEARER_DLL_PATH "${MING_LIB}/qt5/plugins/bearer"
!define IMAGEFORMATS_DLL_PATH "${MING_LIB}/qt5/plugins/imageformats"
!define PLATFORMS_DLL_PATH "${MING_LIB}/qt5/plugins/platforms"
@@ -406,6 +407,10 @@ Section "${APPLICATION_NAME}" SEC_APPLICATION
SetOutPath "$INSTDIR\sqldrivers"
File "${SQLITE_DLL_PATH}\qsqlite.dll"
SetOutPath "$INSTDIR\bearer"
File "${BEARER_DLL_PATH}\qgenericbearer.dll"
File "${BEARER_DLL_PATH}\qnativewifibearer.dll"
SetOutPath "$INSTDIR"
;License & release notes.
File "@CPACK_RESOURCE_FILE_LICENSE@"
+1 -4
Ver Arquivo
@@ -134,10 +134,7 @@ enum csync_instructions_e {
CSYNC_INSTRUCTION_IGNORE = 0x00000020, /* The file is ignored (UPDATE|RECONCILE) */
CSYNC_INSTRUCTION_SYNC = 0x00000040, /* The file need to be pushed to the other remote (RECONCILE) */
CSYNC_INSTRUCTION_STAT_ERROR = 0x00000080,
CSYNC_INSTRUCTION_ERROR = 0x00000100,
CSYNC_INSTRUCTION_TYPE_CHANGE = 0x0000200, /* Like NEW, but deletes the old entity first (RECONCILE)
Used when the type of something changes from directory to file
or back. */
CSYNC_INSTRUCTION_ERROR = 0x00000100
};
enum csync_ftw_type_e {
+1 -1
Ver Arquivo
@@ -192,7 +192,7 @@ struct csync_file_stat_s {
char *destpath; /* for renames */
const char *etag;
char file_id[FILE_ID_BUF_SIZE+1]; /* the ownCloud file id is fixed width in ownCloud. */
char file_id[FILE_ID_BUF_SIZE+1]; /* the ownCloud file id is fixed width of 21 byte. */
char *directDownloadUrl;
char *directDownloadCookies;
char remotePerm[REMOTE_PERM_BUF_SIZE+1];
+1 -7
Ver Arquivo
@@ -283,13 +283,7 @@ static int _csync_merge_algorithm_visitor(void *obj, void *data) {
break;
/* file on the other replica has not been modified */
case CSYNC_INSTRUCTION_NONE:
if (cur->type != other->type) {
// If the type of the entity changed, it's like NEW, but
// needs to delete the other entity first.
cur->instruction = CSYNC_INSTRUCTION_TYPE_CHANGE;
} else {
cur->instruction = CSYNC_INSTRUCTION_SYNC;
}
cur->instruction = CSYNC_INSTRUCTION_SYNC;
break;
case CSYNC_INSTRUCTION_IGNORE:
cur->instruction = CSYNC_INSTRUCTION_IGNORE;
-10
Ver Arquivo
@@ -272,11 +272,6 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
(uint64_t) fs->size, (uint64_t) tmp->size, fs->remotePerm, tmp->remotePerm, tmp->has_ignored_files );
if (ctx->current == REMOTE_REPLICA && !c_streq(fs->etag, tmp->etag)) {
st->instruction = CSYNC_INSTRUCTION_EVAL;
// Preserve the EVAL flag later on if the type has changed.
if (tmp->type != fs->type)
st->child_modified = 1;
goto out;
}
if (ctx->current == LOCAL_REPLICA &&
@@ -301,11 +296,6 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
goto out;
}
}
// Preserve the EVAL flag later on if the type has changed.
if (tmp->type != fs->type)
st->child_modified = 1;
st->instruction = CSYNC_INSTRUCTION_EVAL;
goto out;
}
-1
Ver Arquivo
@@ -55,7 +55,6 @@ static const _instr_code_struct _instr[] =
{ "INSTRUCTION_SYNC", CSYNC_INSTRUCTION_SYNC },
{ "INSTRUCTION_STAT_ERR", CSYNC_INSTRUCTION_STAT_ERROR },
{ "INSTRUCTION_ERROR", CSYNC_INSTRUCTION_ERROR },
{ "INSTRUCTION_TYPE_CHANGE", CSYNC_INSTRUCTION_TYPE_CHANGE },
{ NULL, CSYNC_INSTRUCTION_ERROR }
};
-11
Ver Arquivo
@@ -250,17 +250,6 @@ int csync_vio_local_stat(const char *uri, csync_vio_file_stat_t *buf) {
/* printf("Index: %I64i\n", FileIndex.QuadPart); */
buf->inode = FileIndex.QuadPart;
if (!(buf->fields & CSYNC_VIO_FILE_STAT_FIELDS_SIZE)) {
buf->size = (fileInfo.nFileSizeHigh * ((int64_t)(MAXDWORD)+1)) + fileInfo.nFileSizeLow;
buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_SIZE;
}
if (!(buf->fields & CSYNC_VIO_FILE_STAT_FIELDS_MTIME)) {
DWORD rem;
buf->mtime = FileTimeToUnixTime(&fileInfo.ftLastWriteTime, &rem);
/* CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Local File MTime: %llu", (unsigned long long) buf->mtime ); */
buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MTIME;
}
c_free_locale_string(wuri);
CloseHandle(h);
return 0;
@@ -53,12 +53,6 @@ static void setup_init(void **state) {
assert_int_equal(rc, 0);
rc = _csync_exclude_add(&(csync->excludes), "пятницы.*");
assert_int_equal(rc, 0);
rc = _csync_exclude_add(&(csync->excludes), "*/*.out");
assert_int_equal(rc, 0);
rc = _csync_exclude_add(&(csync->excludes), "latex*/*.run.xml");
assert_int_equal(rc, 0);
rc = _csync_exclude_add(&(csync->excludes), "latex/*/*.tex.tmp");
assert_int_equal(rc, 0);
*state = csync;
}
@@ -166,21 +160,7 @@ static void check_csync_excluded(void **state)
rc = csync_excluded(csync, "unicode/中文.💩", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
/* path wildcards */
rc = csync_excluded(csync, "foobar/my_manuscript.out", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
rc = csync_excluded(csync, "latex_tmp/my_manuscript.run.xml", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
rc = csync_excluded(csync, "word_tmp/my_manuscript.run.xml", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
rc = csync_excluded(csync, "latex/my_manuscript.tex.tmp", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
rc = csync_excluded(csync, "latex/songbook/my_manuscript.tex.tmp", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
}
static void check_csync_excluded_traversal(void **state)
+12 -11
Ver Arquivo
@@ -193,25 +193,26 @@ You can download the desktop sync client from the ownCloud `Client Download Page
To build the most up to date version of the client:
1. Clone the latest versions of the client from Git_ as follows:
1. Clone the latest versions of the client from Git_ as follows::
``git clone git://github.com/owncloud/client.git``
``git submodule init``
``git submodule update``
git clone git://github.com/owncloud/client.git
cd client
git submodule init
git submodule update
2. Create the build directory:
2. Create the build directory::
``mkdir client-build``
``cd client-build``
mkdir client-build
cd client-build
3. Configure the client build:
3. Configure the client build::
``cmake -DCMAKE_BUILD_TYPE="Debug" ../client``
cmake -DCMAKE_BUILD_TYPE="Debug" ..
..note:: You must use absolute paths for the ``include`` and ``library``
.. note:: You must use absolute paths for the ``include`` and ``library``
directories.
..note:: On Mac OS X, you need to specify ``-DCMAKE_INSTALL_PREFIX=target``,
.. note:: On Mac OS X, you need to specify ``-DCMAKE_INSTALL_PREFIX=target``,
where ``target`` is a private location, i.e. in parallel to your build
dir by specifying ``../install``.
-5
Ver Arquivo
@@ -116,11 +116,6 @@ button, and re-select the folder tree that you want to sync.
.. figure:: images/client-7.png
:alt: Extra options for sync operations
.. note:: ownCloud does not preserve the mtime (modification time) of
directories, though it does update the mtimes on files. See
`Wrong folder date when syncing
<https://github.com/owncloud/core/issues/7009>`_ for discussion of this.
Adding New Accounts
^^^^^^^^^^^^^^^^^^^
-12
Ver Arquivo
@@ -56,18 +56,6 @@ OPTIONS
``--davpath [path]``
Overrides the WebDAV Path with ``path``
``--exclude [file]``
Exclude list file
``--unsyncedfolders [file]``
File containing the list of unsynced folders (selective sync)
``--max-sync-retries [n]``
Retries maximum n times (defaults to 3)
``-h``
Sync hidden files,do not ignore them
Example
=======
To synchronize the ownCloud directory ``Music`` to the local directory ``media/music``
+11 -20
Ver Arquivo
@@ -19,25 +19,28 @@ the server URL.
Other command line switches supported by ``owncloudcmd`` include the following:
``--user``, ``-u`` ``[user]``
Use ``user`` as the login name.
Specify the user's login name.
``--password``, ``-p`` ``[password]``
Use ``password`` as the password.
Specify the user's password.
``-n``
Use ``netrc (5)`` for login.
Use ``netrc (5)`` for login.
``--non-interactive``
Do not prompt for questions.
Do not prompt for questions.
``--silent``, ``--s``
Inhibits verbose log output.
``--silent``, ``-s``
Inhibits verbose log output.
``--trust``
Trust any SSL certificate, including invalid ones.
Trust any SSL certificate, including invalid ones.
``--httpproxy http://[user@pass:]<server>:<port>``
Uses ``server`` as HTTP proxy.
Uses the specified ``server`` as the HTTP proxy.
``--unsyncedfolders [file]``
File containing list of folders to not sync
``--nonshib``
Uses Non Shibboleth WebDAV Authentication
@@ -45,18 +48,6 @@ Other command line switches supported by ``owncloudcmd`` include the following:
``--davpath [path]``
Overrides the WebDAV Path with ``path``
``--exclude [file]``
Exclude list file
``--unsyncedfolders [file]``
File containing the list of unsynced folders (selective sync)
``--max-sync-retries [n]``
Retries maximum n times (defaults to 3)
``-h``
Sync hidden files,do not ignore them
Credential Handling
~~~~~~~~~~~~~~~~~~~
@@ -21,6 +21,7 @@
{
SyncClientProxy *_syncClientProxy;
NSMutableSet *_registeredDirectories;
NSMutableSet *_requestedUrls;
NSString *_shareMenuTitle;
}
@@ -83,25 +83,7 @@
- (NSMenu *)menuForMenuKind:(FIMenuKind)whichMenu
{
FIFinderSyncController *syncController = [FIFinderSyncController defaultController];
NSMutableSet *rootPaths = [[NSMutableSet alloc] init];
[syncController.directoryURLs enumerateObjectsUsingBlock: ^(id obj, BOOL *stop) {
[rootPaths addObject:[obj path]];
}];
// The server doesn't support sharing a root directory so do not show the option in this case.
// It is still possible to get a problematic sharing by selecting both the root and a child,
// but this is so complicated to do and meaningless that it's not worth putting this check
// also in shareMenuAction.
__block BOOL onlyRootsSelected = YES;
[syncController.selectedItemURLs enumerateObjectsUsingBlock: ^(id obj, NSUInteger idx, BOOL *stop) {
if (![rootPaths member:[obj path]]) {
onlyRootsSelected = NO;
*stop = YES;
}
}];
if (_shareMenuTitle && !onlyRootsSelected) {
if (_shareMenuTitle) {
NSMenu *menu = [[NSMenu alloc] initWithTitle:@""];
[menu addItemWithTitle:_shareMenuTitle action:@selector(shareMenuAction:) keyEquivalent:@"title"];
@@ -64,13 +64,13 @@ private:
return r;
if (status.startsWith("OK"))
r << "vcs-normal";
r << "ownCloud_ok";
if (status.startsWith("SYNC") || status.startsWith("NEW"))
r << "vcs-update-required";
r << "ownCloud_sync";
if (status.startsWith("IGNORE") || status.startsWith("WARN"))
r << "vcs-locally-modified-unstaged";
r << "ownCloud_warn";
if (status.startsWith("ERROR"))
r << "vcs-conflicting";
r << "ownCloud_error";
if (status.contains("+SWM"))
r << "document-share";
@@ -1,40 +1,32 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xml:space="preserve"
enable-background="new 0 0 128 128"
viewBox="0 0 128 128"
y="0px"
x="0px"
id="Sync"
version="1.1"><metadata
id="metadata29"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs27" /><g
transform="matrix(0.96875,0,0,0.96875,2,2)"
id="g3"><g
id="g5"><g
id="g7"><circle
style="fill:#e0d92d"
id="circle9"
r="61.900002"
cy="64"
cx="64" /><path
style="fill:#8e7409"
id="path11"
d="M 64,128 C 28.7,128 0,99.3 0,64 0,28.7 28.7,0 64,0 c 35.3,0 64,28.7 64,64 0,35.3 -28.7,64 -64,64 z M 64,4.1 C 31,4.1 4.1,31 4.1,64 4.1,97 31,123.9 64,123.9 97,123.9 123.9,97 123.9,64 123.9,31 97,4.1 64,4.1 Z" /></g></g><g
id="g13"><g
id="g15"><g
id="g17"><path
style="fill:#ffffff"
id="path19"
d="m 64,107.4 c -5.6,0 -10.2,-4.6 -10.2,-10.2 0,-5.6 4.6,-10.2 10.2,-10.2 5.6,0 10.2,4.6 10.2,10.2 0,5.6 -4.6,10.2 -10.2,10.2 z M 64,81.3 C 55.7,81.3 55.7,74 55.7,71.1 L 52,30.9 52,30.8 c 0,-5.6 5.4,-10.2 12,-10.2 6.6,0 12,4.6 12,10.2 l 0,0.1 -3.7,40.3 c 0,2.8 0,10.1 -8.3,10.1 z" /></g><g
id="g21"><path
style="fill:#8e7409"
id="path23"
d="m 64,21.9 c 5.9,0 10.7,4 10.7,8.8 L 71,71 c 0,4.9 -1.1,8.8 -7,8.8 -5.9,0 -6.9,-4 -6.9,-8.8 L 53.4,30.7 C 53.3,25.9 58.1,21.9 64,21.9 m 0,66.4 c 4.9,0 8.9,4 8.9,8.8 0,4.9 -4,8.9 -8.9,8.9 -4.9,0 -8.9,-4 -8.9,-8.9 0,-4.8 4,-8.8 8.9,-8.8 m 0,-69.1 c -3.5,0 -6.8,1.1 -9.3,3.2 -2.7,2.2 -4.1,5.2 -4.1,8.4 l 0,0.1 0,0.1 3.7,40.1 c 0,2.3 0.2,5.2 1.7,7.6 1.6,2.6 4.3,3.9 8,3.9 3.7,0 6.4,-1.3 8,-3.9 1.5,-2.3 1.7,-5.3 1.7,-7.6 l 3.7,-40.1 0,-0.1 0,-0.1 c 0,-3.2 -1.5,-6.2 -4.1,-8.4 -2.5,-2.1 -5.8,-3.2 -9.3,-3.2 l 0,0 z m 0,66.4 c -6.4,0 -11.6,5.2 -11.6,11.6 0,6.4 5.2,11.6 11.6,11.6 6.4,0 11.6,-5.2 11.6,-11.6 0,-6.4 -5.2,-11.6 -11.6,-11.6 l 0,0 z" /></g></g></g></g></svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Sync" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
<g>
<g>
<g>
<circle fill="#E0D92D" cx="64" cy="64" r="61.9"/>
<path fill="#8E7409" d="M64,128C28.7,128,0,99.3,0,64S28.7,0,64,0s64,28.7,64,64S99.3,128,64,128z M64,4.1C31,4.1,4.1,31,4.1,64
c0,33,26.9,59.9,59.9,59.9c33,0,59.9-26.9,59.9-59.9C123.9,31,97,4.1,64,4.1z"/>
</g>
</g>
<g>
<g>
<g>
<path fill="#FFFFFF" d="M64,107.4c-5.6,0-10.2-4.6-10.2-10.2C53.8,91.6,58.4,87,64,87c5.6,0,10.2,4.6,10.2,10.2
C74.2,102.8,69.6,107.4,64,107.4z M64,81.3c-8.3,0-8.3-7.3-8.3-10.2L52,30.9v-0.1c0-5.6,5.4-10.2,12-10.2c6.6,0,12,4.6,12,10.2
v0.1l-3.7,40.3C72.3,74,72.3,81.3,64,81.3z"/>
</g>
<g>
<path fill="#8E7409" d="M64,21.9c5.9,0,10.7,4,10.7,8.8l-3.7,40.3c0,4.9-1.1,8.8-7,8.8c-5.9,0-6.9-4-6.9-8.8l-3.7-40.3
C53.3,25.9,58.1,21.9,64,21.9 M64,88.3c4.9,0,8.9,4,8.9,8.8c0,4.9-4,8.9-8.9,8.9c-4.9,0-8.9-4-8.9-8.9
C55.1,92.3,59.1,88.3,64,88.3 M64,19.2c-3.5,0-6.8,1.1-9.3,3.2c-2.7,2.2-4.1,5.2-4.1,8.4v0.1l0,0.1l3.7,40.1
c0,2.3,0.2,5.2,1.7,7.6c1.6,2.6,4.3,3.9,8,3.9c3.7,0,6.4-1.3,8-3.9c1.5-2.3,1.7-5.3,1.7-7.6L77.4,31l0-0.1v-0.1
c0-3.2-1.5-6.2-4.1-8.4C70.8,20.3,67.5,19.2,64,19.2L64,19.2z M64,85.6c-6.4,0-11.6,5.2-11.6,11.6c0,6.4,5.2,11.6,11.6,11.6
c6.4,0,11.6-5.2,11.6-11.6C75.6,90.8,70.4,85.6,64,85.6L64,85.6z"/>
</g>
</g>
</g>
</g>
</svg>

Antes

Largura:  |  Altura:  |  Tamanho: 2.4 KiB

Depois

Largura:  |  Altura:  |  Tamanho: 1.7 KiB

+36 -39
Ver Arquivo
@@ -1,39 +1,36 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xml:space="preserve"
enable-background="new 0 0 128 128"
viewBox="0 0 128 128"
y="0px"
x="0px"
id="Sync"
version="1.1"><metadata
id="metadata27"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs25" /><g
transform="matrix(0.96875,0,0,0.96875,2,2)"
id="g3"><g
id="g5"><g
id="g7"><circle
style="fill:#b23015"
id="circle9"
r="61.900002"
cy="64"
cx="64" /><path
style="fill:#981d05"
id="path11"
d="M 64,128 C 28.7,128 0,99.3 0,64 0,28.7 28.7,0 64,0 c 35.3,0 64,28.7 64,64 0,35.3 -28.7,64 -64,64 z M 64,4.1 C 31,4.1 4.1,31 4.1,64 4.1,97 31,123.9 64,123.9 97,123.9 123.9,97 123.9,64 123.9,31 97,4.1 64,4.1 Z" /></g></g><g
id="g13"><g
id="g15"><path
style="fill:#ffffff"
id="path17"
d="m 41.8,95.2 c -2.4,0 -4.4,-0.9 -6.2,-2.6 -1.7,-1.7 -2.7,-3.9 -2.8,-6.4 -0.1,-2.6 0.7,-4.8 2.5,-6.8 L 50.8,64 35.4,48.6 c -1.9,-1.9 -2.7,-4 -2.5,-6.5 0.2,-2.3 1.1,-4.5 2.7,-6.3 l 0,0 0,0 c 1.9,-1.9 4,-2.9 6.3,-2.9 0.2,0 0.4,0 0.6,0 2.4,0.2 4.5,1.1 6.4,2.8 l 0,0 15.1,15 15.4,-15.2 c 1.8,-1.8 3.9,-2.7 6.3,-2.7 0.1,0 0.1,0 0.2,0 2.4,0.1 4.6,1 6.5,2.8 l 0,0 c 1.7,1.7 2.6,3.9 2.6,6.5 0,2.6 -0.9,4.8 -2.6,6.6 L 77.4,64 92.5,79.2 c 1.7,1.7 2.6,3.9 2.7,6.5 0.1,2.6 -0.8,5 -2.7,6.9 -1.7,1.7 -4,2.6 -6.6,2.6 -2.6,0 -4.9,-1 -6.8,-3 L 64,77.4 48.9,92.6 l 0,0 c -1.7,1.5 -3.8,2.4 -6.4,2.6 -0.2,0 -0.5,0 -0.7,0 z" /></g><g
id="g19"><path
style="fill:#981d05"
id="path21"
d="m 41.9,34.1 c 0.2,0 0.3,0 0.5,0 2,0.2 3.9,1 5.5,2.5 l 16,16 16.4,-16.2 c 1.5,-1.5 3.3,-2.3 5.3,-2.3 0.1,0 0.1,0 0.2,0 2.1,0 4,0.8 5.6,2.4 1.5,1.5 2.2,3.3 2.2,5.6 0,2.2 -0.7,4.1 -2.2,5.7 l -16,16.2 16,16.2 c 1.5,1.5 2.3,3.3 2.3,5.6 0.1,2.3 -0.7,4.2 -2.3,5.9 -1.5,1.5 -3.3,2.2 -5.6,2.2 -2.3,0 -4.2,-0.9 -5.9,-2.6 L 64,75.5 48,91.7 c -1.5,1.3 -3.3,2.1 -5.5,2.2 -0.2,0 -0.4,0 -0.6,0 -2,0 -3.7,-0.7 -5.2,-2.2 -1.5,-1.5 -2.3,-3.3 -2.4,-5.5 -0.1,-2.2 0.6,-4.1 2.2,-5.7 L 52.7,64 36.3,47.6 C 34.7,46 34,44.2 34.2,42.2 c 0.2,-2.1 0.9,-3.9 2.3,-5.6 1.8,-1.6 3.5,-2.5 5.4,-2.5 m 0,-2.7 c -2.6,0 -5,1.1 -7.2,3.3 l -0.1,0.1 -0.1,0.1 c -1.8,2.1 -2.8,4.5 -3,7.1 -0.2,2.9 0.8,5.5 2.9,7.6 L 48.9,64 34.4,78.5 l 0,0 0,0 c -2.1,2.2 -3.1,4.8 -2.9,7.8 0.2,2.9 1.2,5.3 3.2,7.3 2,2 4.4,3 7.2,3 0.3,0 0.5,0 0.8,0 2.8,-0.2 5.2,-1.2 7.2,-2.9 L 50,93.6 50.1,93.5 64,79.4 78,93.2 c 2.2,2.3 4.8,3.4 7.8,3.4 3,0 5.6,-1 7.6,-3 2.2,-2.2 3.3,-4.9 3.1,-7.9 -0.1,-3 -1.2,-5.5 -3.1,-7.5 L 79.3,64 93.4,49.8 l 0,0 0,0 c 2,-2.1 3,-4.6 3,-7.6 0,-3 -1,-5.5 -3,-7.5 l 0,0 0,0 c -2.2,-2 -4.7,-3.1 -7.4,-3.2 -0.1,0 -0.1,0 -0.2,0 -2.8,0 -5.2,1 -7.3,3.1 L 64,48.8 49.9,34.7 l 0,-0.1 -0.1,-0.1 c -2.1,-1.9 -4.5,-2.9 -7.2,-3.2 -0.2,0.1 -0.5,0.1 -0.7,0.1 l 0,0 z" /></g></g></g></svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Sync" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
<g>
<g>
<g>
<circle fill="#B23015" cx="64" cy="64" r="61.9"/>
<path fill="#981D05" d="M64,128C28.7,128,0,99.3,0,64S28.7,0,64,0s64,28.7,64,64S99.3,128,64,128z M64,4.1C31,4.1,4.1,31,4.1,64
S31,123.9,64,123.9c33,0,59.9-26.9,59.9-59.9S97,4.1,64,4.1z"/>
</g>
</g>
<g>
<g>
<path fill="#FFFFFF" d="M41.8,95.2c-2.4,0-4.4-0.9-6.2-2.6c-1.7-1.7-2.7-3.9-2.8-6.4c-0.1-2.6,0.7-4.8,2.5-6.8L50.8,64L35.4,48.6
c-1.9-1.9-2.7-4-2.5-6.5c0.2-2.3,1.1-4.5,2.7-6.3l0,0l0,0c1.9-1.9,4-2.9,6.3-2.9c0.2,0,0.4,0,0.6,0c2.4,0.2,4.5,1.1,6.4,2.8l0,0
L64,50.7l15.4-15.2c1.8-1.8,3.9-2.7,6.3-2.7c0.1,0,0.1,0,0.2,0c2.4,0.1,4.6,1,6.5,2.8l0,0c1.7,1.7,2.6,3.9,2.6,6.5
c0,2.6-0.9,4.8-2.6,6.6L77.4,64l15.1,15.2c1.7,1.7,2.6,3.9,2.7,6.5c0.1,2.6-0.8,5-2.7,6.9c-1.7,1.7-4,2.6-6.6,2.6
c-2.6,0-4.9-1-6.8-3L64,77.4L48.9,92.6l0,0c-1.7,1.5-3.8,2.4-6.4,2.6C42.3,95.2,42,95.2,41.8,95.2z"/>
</g>
<g>
<path fill="#981D05" d="M41.9,34.1c0.2,0,0.3,0,0.5,0c2,0.2,3.9,1,5.5,2.5l16,16l16.4-16.2c1.5-1.5,3.3-2.3,5.3-2.3
c0.1,0,0.1,0,0.2,0c2.1,0,4,0.8,5.6,2.4c1.5,1.5,2.2,3.3,2.2,5.6c0,2.2-0.7,4.1-2.2,5.7L75.4,64l16,16.2c1.5,1.5,2.3,3.3,2.3,5.6
c0.1,2.3-0.7,4.2-2.3,5.9c-1.5,1.5-3.3,2.2-5.6,2.2c-2.3,0-4.2-0.9-5.9-2.6L64,75.5l-16,16.2c-1.5,1.3-3.3,2.1-5.5,2.2
c-0.2,0-0.4,0-0.6,0c-2,0-3.7-0.7-5.2-2.2c-1.5-1.5-2.3-3.3-2.4-5.5c-0.1-2.2,0.6-4.1,2.2-5.7L52.7,64L36.3,47.6
c-1.6-1.6-2.3-3.4-2.1-5.4c0.2-2.1,0.9-3.9,2.3-5.6C38.3,35,40,34.1,41.9,34.1 M41.9,31.4c-2.6,0-5,1.1-7.2,3.3l-0.1,0.1
l-0.1,0.1c-1.8,2.1-2.8,4.5-3,7.1c-0.2,2.9,0.8,5.5,2.9,7.6L48.9,64L34.4,78.5l0,0l0,0c-2.1,2.2-3.1,4.8-2.9,7.8
c0.2,2.9,1.2,5.3,3.2,7.3c2,2,4.4,3,7.2,3c0.3,0,0.5,0,0.8,0c2.8-0.2,5.2-1.2,7.2-2.9l0.1-0.1l0.1-0.1L64,79.4L78,93.2
c2.2,2.3,4.8,3.4,7.8,3.4c3,0,5.6-1,7.6-3c2.2-2.2,3.3-4.9,3.1-7.9c-0.1-3-1.2-5.5-3.1-7.5L79.3,64l14.1-14.2l0,0l0,0
c2-2.1,3-4.6,3-7.6c0-3-1-5.5-3-7.5l0,0l0,0c-2.2-2-4.7-3.1-7.4-3.2c-0.1,0-0.1,0-0.2,0c-2.8,0-5.2,1-7.3,3.1L64,48.8L49.9,34.7
l0-0.1l-0.1-0.1c-2.1-1.9-4.5-2.9-7.2-3.2C42.4,31.4,42.1,31.4,41.9,31.4L41.9,31.4z"/>
</g>
</g>
</g>
</svg>

Antes

Largura:  |  Altura:  |  Tamanho: 3.2 KiB

Depois

Largura:  |  Altura:  |  Tamanho: 2.5 KiB

@@ -1,8 +0,0 @@
#!/bin/sh
# Dimensions taken from https://www.apriorit.com/dev-blog/357-shell-extentions-basics-samples-common-problems#_Toc408244375
convert -background transparent attention.svg -gravity SouthWest \( -clone 0 -resize 10x10 -extent 16x16 \) \( -clone 0 -resize 16x16 -extent 32x32 \) \( -clone 0 -resize 24x24 -extent 48x48 \) \( -clone 0 -resize 128x128 -extent 256x256 \) -delete 0 ../../../windows/OCOverlays/ico/Warning.ico
convert -background transparent error.svg -gravity SouthWest \( -clone 0 -resize 10x10 -extent 16x16 \) \( -clone 0 -resize 16x16 -extent 32x32 \) \( -clone 0 -resize 24x24 -extent 48x48 \) \( -clone 0 -resize 128x128 -extent 256x256 \) -delete 0 ../../../windows/OCOverlays/ico/Error.ico
convert -background transparent ok.svg -gravity SouthWest \( -clone 0 -resize 10x10 -extent 16x16 \) \( -clone 0 -resize 16x16 -extent 32x32 \) \( -clone 0 -resize 24x24 -extent 48x48 \) \( -clone 0 -resize 128x128 -extent 256x256 \) -delete 0 ../../../windows/OCOverlays/ico/OK.ico
convert -background transparent shared.svg -gravity SouthWest \( -clone 0 -resize 10x10 -extent 16x16 \) \( -clone 0 -resize 16x16 -extent 32x32 \) \( -clone 0 -resize 24x24 -extent 48x48 \) \( -clone 0 -resize 128x128 -extent 256x256 \) -delete 0 ../../../windows/OCOverlays/ico/OK_Shared.ico
convert -background transparent sync.svg -gravity SouthWest \( -clone 0 -resize 10x10 -extent 16x16 \) \( -clone 0 -resize 16x16 -extent 32x32 \) \( -clone 0 -resize 24x24 -extent 48x48 \) \( -clone 0 -resize 128x128 -extent 256x256 \) -delete 0 ../../../windows/OCOverlays/ico/Sync.ico
+23 -36
Ver Arquivo
@@ -1,36 +1,23 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xml:space="preserve"
enable-background="new 0 0 128 128"
viewBox="0 0 128 128"
y="0px"
x="0px"
id="Sync"
version="1.1"><metadata
id="metadata25"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs23" /><g
transform="matrix(0.96875,0,0,0.96875,2,2)"
id="g3"><g
id="g5"><path
style="fill:#5eb220"
id="path7"
d="m 64,2.1 c 34.2,0 61.9,27.7 61.9,61.9 0,34.2 -27.7,61.9 -61.9,61.9 C 29.8,125.9 2.1,98.2 2.1,64 2.1,29.8 29.8,2.1 64,2.1 Z" /><path
style="fill:#3a9804"
id="path9"
d="M 64,128 C 28.7,128 0,99.3 0,64 0,28.7 28.7,0 64,0 c 35.3,0 64,28.7 64,64 0,35.3 -28.7,64 -64,64 z M 64,4.1 C 31,4.1 4.1,31 4.1,64 4.1,97 31,123.9 64,123.9 97,123.9 123.9,97 123.9,64 123.9,31 97,4.1 64,4.1 Z" /></g><g
id="g11"><g
id="g13"><polygon
style="fill:#ffffff"
id="polygon15"
points="35.9,63.8 53,77.3 87.1,31 100.3,40.7 61.3,93.9 56.2,100.7 25.7,76.8 " /></g><g
id="g17"><path
style="fill:#3a9804"
id="path19"
d="M 87.3,32.4 98.9,41 94.6,46.8 60.4,93.2 56,99.2 50.2,94.6 32.8,81.1 27.1,76.7 36,65.3 l 5.7,4.4 11.5,9 L 83,38.2 87.3,32.4 M 86.8,29.5 85.6,31.2 81.3,37 52.8,75.8 43,68.1 37.3,63.7 35.7,62.4 34.4,64 25.5,75.4 24.3,77 l 1.6,1.3 5.7,4.4 17.4,13.6 5.8,4.6 1.7,1.3 1.3,-1.7 4.4,-6 34.1,-46.5 4.3,-5.8 1.2,-1.7 -1.7,-1.2 -11.6,-8.5 -1.7,-1.3 0,0 z" /></g></g></g></svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Sync" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
<g>
<g>
<path fill="#5EB220" d="M64,2.1c34.2,0,61.9,27.7,61.9,61.9S98.2,125.9,64,125.9C29.8,125.9,2.1,98.2,2.1,64S29.8,2.1,64,2.1z"/>
<path fill="#3A9804" d="M64,128C28.7,128,0,99.3,0,64S28.7,0,64,0s64,28.7,64,64S99.3,128,64,128z M64,4.1C31,4.1,4.1,31,4.1,64
S31,123.9,64,123.9c33,0,59.9-26.9,59.9-59.9S97,4.1,64,4.1z"/>
</g>
<g>
<g>
<polygon fill="#FFFFFF" points="25.7,76.8 35.9,63.8 53,77.3 87.1,31 100.3,40.7 61.3,93.9 56.2,100.7 "/>
</g>
<g>
<path fill="#3A9804" d="M87.3,32.4L98.9,41l-4.3,5.8L60.4,93.2l-4.4,6l-5.8-4.6L32.8,81.1l-5.7-4.4L36,65.3l5.7,4.4l11.5,9
L83,38.2L87.3,32.4 M86.8,29.5l-1.2,1.7L81.3,37L52.8,75.8L43,68.1l-5.7-4.4l-1.6-1.3L34.4,64l-8.9,11.4L24.3,77l1.6,1.3l5.7,4.4
l17.4,13.6l5.8,4.6l1.7,1.3l1.3-1.7l4.4-6L96.3,48l4.3-5.8l1.2-1.7l-1.7-1.2l-11.6-8.5L86.8,29.5L86.8,29.5z"/>
</g>
</g>
</g>
</svg>

Antes

Largura:  |  Altura:  |  Tamanho: 1.9 KiB

Depois

Largura:  |  Altura:  |  Tamanho: 1.3 KiB

+62 -47
Ver Arquivo
@@ -1,47 +1,62 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
id="Sync"
x="0px"
y="0px"
viewBox="0 0 128 128"
enable-background="new 0 0 128 128"
xml:space="preserve"><metadata
id="metadata37"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs35" /><g
id="g3362"><g
id="g5"
transform="matrix(0.96875,0,0,0.96875,2,2)"><g
id="g7"><g
id="g9"><path
d="m 64,2.1 c 34.2,0 61.9,27.7 61.9,61.9 0,34.2 -27.7,61.9 -61.9,61.9 C 29.8,125.9 2.1,98.2 2.1,64 2.1,29.8 29.8,2.1 64,2.1 Z"
id="path11"
style="fill:#5eb220" /></g><g
id="g13"><path
d="M 64,128 C 28.7,128 0,99.3 0,64 0,28.7 28.7,0 64,0 c 35.3,0 64,28.7 64,64 0,35.3 -28.7,64 -64,64 z M 64,4.1 C 31,4.1 4.1,31 4.1,64 4.1,97 31,123.9 64,123.9 97,123.9 123.9,97 123.9,64 123.9,31 97,4.1 64,4.1 Z"
id="path15"
style="fill:#3a9804" /></g></g></g><g
transform="matrix(0.96875,0,0,0.96875,0.50025,-1002.0125)"
id="g17"><g
id="g19"><g
id="g21"><path
d="m 83.9,1059.9 c -7.9,0 -14.2,6.4 -14.2,14.2 0,0.4 0,0.9 0.1,1.3 l -27.4,14 c -2.5,-2.1 -5.7,-3.4 -9.2,-3.4 -7.9,0 -14.2,6.4 -14.2,14.2 0,7.9 6.4,14.2 14.2,14.2 3.2,0 6.1,-1 8.5,-2.8 l 28.2,14.3 c 0,0.2 -0.1,0.5 -0.1,0.8 0,7.9 6.4,14.2 14.2,14.2 7.8,0 14.2,-6.4 14.2,-14.2 0,-7.9 -6.4,-14.2 -14.2,-14.2 -3.7,0 -7.1,1.4 -9.6,3.7 l -27.2,-13.9 c 0.1,-0.7 0.2,-1.4 0.2,-2.2 0,-0.4 -0.1,-0.8 -0.1,-1.2 l 27.5,-14 c 2.5,2.1 5.7,3.4 9.2,3.4 7.9,0 14.2,-6.4 14.2,-14.2 -0.1,-7.9 -6.5,-14.3 -14.3,-14.2 l 0,0 z"
id="path23"
style="fill:#ffffff" /><path
d="m 83.9,1141.9 c -8.4,0 -15.2,-6.8 -15.2,-15.1 0,-0.1 0,-0.2 0,-0.2 l -27.1,-13.8 c -2.5,1.7 -5.4,2.6 -8.5,2.6 -8.3,0 -15.1,-6.8 -15.1,-15.1 0,-8.3 6.8,-15.1 15.1,-15.1 3.4,0 6.7,1.1 9.4,3.2 L 68.8,1075 c 0,-0.3 0,-0.5 0,-0.8 0,-8 6.2,-14.6 14.1,-15.1 l 0,0 1,-0.1 c 8.3,0 15.1,6.8 15.1,15.1 0,8.4 -6.8,15.2 -15.1,15.2 -3.4,0 -6.7,-1.1 -9.3,-3.2 l -26.4,13.4 c 0,0.2 0,0.5 0,0.7 0,0.6 -0.1,1.1 -0.1,1.7 l 26.1,13.3 c 2.7,-2.3 6.2,-3.5 9.7,-3.5 8.3,0 15.1,6.8 15.1,15.2 0,8.2 -6.8,15 -15.1,15 z m -42.5,-31.3 29.2,14.9 -0.1,0.9 c 0,0.1 0,0.3 0,0.4 0,7.3 6,13.3 13.3,13.3 7.3,0 13.3,-6 13.3,-13.3 0,-7.3 -6,-13.3 -13.3,-13.3 -3.3,0 -6.5,1.2 -9,3.5 l -0.5,0.4 -28.3,-14.5 0.1,-0.6 c 0.1,-0.7 0.2,-1.4 0.2,-2.1 0,-0.3 0,-0.5 0,-0.8 l -0.1,-1 28.5,-14.5 0.5,0.4 c 2.4,2 5.5,3.2 8.6,3.2 7.3,0 13.3,-6 13.3,-13.3 0,-7.1 -5.6,-12.9 -12.6,-13.3 l -0.7,0 c -7.3,0 -13.3,6 -13.3,13.3 0,0.4 0,0.7 0.1,1.1 l 0.1,0.6 -0.5,0.4 -28,14.3 -0.5,-0.4 c -2.4,-2 -5.5,-3.2 -8.6,-3.2 -7.3,0 -13.3,6 -13.3,13.3 0,7.3 6,13.3 13.3,13.3 2.9,0 5.6,-0.9 7.9,-2.6 l 0.4,-0.4 z"
id="path25"
style="fill:#3a9804" /></g><g
id="g27"><path
d="m 83.9,1141.2 c -8,0 -14.4,-6.5 -14.4,-14.4 0,-0.2 0,-0.3 0,-0.5 0,-0.1 0,-0.1 0,-0.2 l -28,-14.2 c -2.4,1.8 -5.4,2.7 -8.5,2.7 -7.9,0 -14.4,-6.5 -14.4,-14.4 0,-7.9 6.5,-14.4 14.4,-14.4 3.4,0 6.7,1.2 9.3,3.4 l 27.2,-13.9 0,-0.1 c 0,-0.4 -0.1,-0.7 -0.1,-1.1 0,-7.9 6.4,-14.3 14.2,-14.4 l 0,-0.1 0.2,0 c 7.9,0 14.4,6.5 14.4,14.4 0,8 -6.5,14.4 -14.4,14.4 -3.4,0 -6.6,-1.2 -9.2,-3.3 l -27.2,13.9 0,0.2 c 0,0.3 0.1,0.6 0.1,0.9 0,0.7 -0.1,1.4 -0.2,2.1 l 27,13.8 c 2.6,-2.4 6.1,-3.7 9.6,-3.7 7.9,0 14.4,6.5 14.4,14.4 0,8 -6.5,14.5 -14.4,14.5 z m -42.4,-29.8 0,0 28.4,14.4 0,0.1 c 0,0.1 0,0.2 0,0.3 0,0.2 0,0.3 0,0.5 0,7.7 6.3,14 14.1,14 7.7,0 14,-6.3 14,-14 0,-7.8 -6.3,-14.1 -14,-14.1 -3.5,0 -6.9,1.3 -9.5,3.7 l -0.1,0.1 -0.1,-0.1 -27.3,-14 0,-0.1 c 0.1,-0.7 0.2,-1.4 0.2,-2.2 0,-0.3 0,-0.6 -0.1,-0.9 0,-0.1 0,-0.2 0,-0.3 l 0,-0.1 0.1,-0.1 27.6,-14 0.1,0.1 c 2.5,2.1 5.8,3.3 9.1,3.3 7.7,0 14,-6.3 14,-14.1 0,-7.7 -6.2,-13.9 -13.8,-14 l 0,0.1 -0.2,0 c -7.8,0 -14.1,6.3 -14.1,14 0,0.4 0,0.7 0.1,1 l 0,0.3 -0.1,0.1 -27.5,14 -0.1,-0.1 c -2.5,-2.2 -5.8,-3.3 -9.1,-3.3 -7.7,0 -14,6.3 -14,14 0,7.7 6.3,14 14,14 2.9,0.2 5.8,-0.7 8.3,-2.6 l 0,0 z"
id="path29"
style="fill:#ffffff" /><path
d="m 83.9,1142.1 c -8.5,0 -15.3,-6.9 -15.3,-15.3 0,0 0,-0.1 0,-0.1 L 41.7,1113 c -2.5,1.7 -5.5,2.6 -8.6,2.6 -8.4,0 -15.3,-6.9 -15.3,-15.3 0,-8.4 6.9,-15.3 15.3,-15.3 3.4,0 6.7,1.1 9.4,3.2 l 26.1,-13.3 c 0,-0.2 0,-0.4 0,-0.7 0,-8 6.2,-14.6 14.1,-15.3 l 0,0 1,-0.1 c 8.6,0 15.5,6.9 15.5,15.3 0,8.5 -6.9,15.3 -15.3,15.3 -3.4,0 -6.7,-1.1 -9.3,-3.2 l -26.2,13.3 c 0,0.2 0,0.4 0,0.6 0,0.5 0,1 -0.1,1.6 l 25.8,13.2 c 2.7,-2.3 6.2,-3.5 9.7,-3.5 8.4,0 15.3,6.9 15.3,15.3 0.1,8.5 -6.8,15.4 -15.2,15.4 z m -42.6,-31.7 0.7,0.3 28.8,14.7 -0.1,1.1 c 0,0.1 0,0.2 0,0.4 0,7.2 5.9,13.1 13.1,13.1 7.2,0 13.1,-5.9 13.1,-13.1 0,-7.2 -5.9,-13.1 -13.1,-13.1 -3.3,0 -6.4,1.2 -8.8,3.4 l -0.5,0.4 -0.6,-0.2 -28,-14.3 0.1,-0.6 c 0.1,-0.8 0.2,-1.5 0.2,-2.2 0,-0.3 0,-0.5 0,-0.8 l -0.1,-1 0.5,-0.4 28.2,-14.4 0.5,0.4 c 2.5,2.1 5.5,3.2 8.6,3.2 7.2,0 13.1,-5.9 13.1,-13.1 0,-6.9 -5.5,-12.7 -12.3,-13.1 l -0.6,0 c -7.5,0 -13.4,5.9 -13.4,13.1 0,0.3 0,0.7 0.1,1 l 0.1,1 -0.5,0.3 -28.2,14.4 -0.5,-0.4 c -2.4,-2.1 -5.5,-3.2 -8.6,-3.2 -7.2,0 -13.1,5.9 -13.1,13.1 0,7.2 5.9,13.1 13.1,13.1 2.9,0 5.6,-0.9 7.8,-2.5 l 0.4,-0.6 z"
id="path31"
style="fill:#3a9804" /></g></g></g></g></svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Sync" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
<g>
<g>
<g>
<g>
<path fill="#5EB220" d="M64,2.1c34.2,0,61.9,27.7,61.9,61.9S98.2,125.9,64,125.9C29.8,125.9,2.1,98.2,2.1,64S29.8,2.1,64,2.1z"
/>
</g>
<g>
<path fill="#3A9804" d="M64,128C28.7,128,0,99.3,0,64S28.7,0,64,0s64,28.7,64,64S99.3,128,64,128z M64,4.1C31,4.1,4.1,31,4.1,64
S31,123.9,64,123.9c33,0,59.9-26.9,59.9-59.9S97,4.1,64,4.1z"/>
</g>
</g>
</g>
<g transform="translate(0 -1036.4)">
<g>
<g>
<path fill="#FFFFFF" d="M83.9,1059.9c-7.9,0-14.2,6.4-14.2,14.2c0,0.4,0,0.9,0.1,1.3l-27.4,14c-2.5-2.1-5.7-3.4-9.2-3.4
c-7.9,0-14.2,6.4-14.2,14.2c0,7.9,6.4,14.2,14.2,14.2c3.2,0,6.1-1,8.5-2.8l28.2,14.3c0,0.2-0.1,0.5-0.1,0.8
c0,7.9,6.4,14.2,14.2,14.2c7.8,0,14.2-6.4,14.2-14.2c0-7.9-6.4-14.2-14.2-14.2c-3.7,0-7.1,1.4-9.6,3.7l-27.2-13.9
c0.1-0.7,0.2-1.4,0.2-2.2c0-0.4-0.1-0.8-0.1-1.2l27.5-14c2.5,2.1,5.7,3.4,9.2,3.4c7.9,0,14.2-6.4,14.2-14.2
C98.1,1066.2,91.7,1059.8,83.9,1059.9L83.9,1059.9z"/>
<path fill="#3A9804" d="M83.9,1141.9c-8.4,0-15.2-6.8-15.2-15.1c0-0.1,0-0.2,0-0.2l-27.1-13.8c-2.5,1.7-5.4,2.6-8.5,2.6
c-8.3,0-15.1-6.8-15.1-15.1c0-8.3,6.8-15.1,15.1-15.1c3.4,0,6.7,1.1,9.4,3.2l26.3-13.4c0-0.3,0-0.5,0-0.8
c0-8,6.2-14.6,14.1-15.1l0,0l1-0.1c8.3,0,15.1,6.8,15.1,15.1c0,8.4-6.8,15.2-15.1,15.2c-3.4,0-6.7-1.1-9.3-3.2l-26.4,13.4
c0,0.2,0,0.5,0,0.7c0,0.6-0.1,1.1-0.1,1.7l26.1,13.3c2.7-2.3,6.2-3.5,9.7-3.5c8.3,0,15.1,6.8,15.1,15.2
C99,1135.1,92.2,1141.9,83.9,1141.9z M41.4,1110.6l29.2,14.9l-0.1,0.9c0,0.1,0,0.3,0,0.4c0,7.3,6,13.3,13.3,13.3
c7.3,0,13.3-6,13.3-13.3c0-7.3-6-13.3-13.3-13.3c-3.3,0-6.5,1.2-9,3.5l-0.5,0.4l-28.3-14.5l0.1-0.6c0.1-0.7,0.2-1.4,0.2-2.1
c0-0.3,0-0.5,0-0.8l-0.1-1l28.5-14.5l0.5,0.4c2.4,2,5.5,3.2,8.6,3.2c7.3,0,13.3-6,13.3-13.3c0-7.1-5.6-12.9-12.6-13.3l-0.7,0
c-7.3,0-13.3,6-13.3,13.3c0,0.4,0,0.7,0.1,1.1l0.1,0.6l-0.5,0.4l-28,14.3l-0.5-0.4c-2.4-2-5.5-3.2-8.6-3.2
c-7.3,0-13.3,6-13.3,13.3c0,7.3,6,13.3,13.3,13.3c2.9,0,5.6-0.9,7.9-2.6L41.4,1110.6z"/>
</g>
<g>
<path fill="#FFFFFF" d="M83.9,1141.2c-8,0-14.4-6.5-14.4-14.4c0-0.2,0-0.3,0-0.5c0-0.1,0-0.1,0-0.2l-28-14.2
c-2.4,1.8-5.4,2.7-8.5,2.7c-7.9,0-14.4-6.5-14.4-14.4c0-7.9,6.5-14.4,14.4-14.4c3.4,0,6.7,1.2,9.3,3.4l27.2-13.9l0-0.1
c0-0.4-0.1-0.7-0.1-1.1c0-7.9,6.4-14.3,14.2-14.4l0-0.1h0.2c7.9,0,14.4,6.5,14.4,14.4c0,8-6.5,14.4-14.4,14.4
c-3.4,0-6.6-1.2-9.2-3.3L47.4,1099l0,0.2c0,0.3,0.1,0.6,0.1,0.9c0,0.7-0.1,1.4-0.2,2.1l27,13.8c2.6-2.4,6.1-3.7,9.6-3.7
c7.9,0,14.4,6.5,14.4,14.4C98.3,1134.7,91.8,1141.2,83.9,1141.2z M41.5,1111.4L41.5,1111.4l28.4,14.4l0,0.1c0,0.1,0,0.2,0,0.3
c0,0.2,0,0.3,0,0.5c0,7.7,6.3,14,14.1,14c7.7,0,14-6.3,14-14c0-7.8-6.3-14.1-14-14.1c-3.5,0-6.9,1.3-9.5,3.7l-0.1,0.1l-0.1-0.1
l-27.3-14l0-0.1c0.1-0.7,0.2-1.4,0.2-2.2c0-0.3,0-0.6-0.1-0.9c0-0.1,0-0.2,0-0.3l0-0.1l0.1-0.1l27.6-14l0.1,0.1
c2.5,2.1,5.8,3.3,9.1,3.3c7.7,0,14-6.3,14-14.1c0-7.7-6.2-13.9-13.8-14l0,0.1h-0.2c-7.8,0-14.1,6.3-14.1,14c0,0.4,0,0.7,0.1,1
l0,0.3l-0.1,0.1l-27.5,14l-0.1-0.1c-2.5-2.2-5.8-3.3-9.1-3.3c-7.7,0-14,6.3-14,14c0,7.7,6.3,14,14,14
C36.1,1114.2,39,1113.3,41.5,1111.4L41.5,1111.4z"/>
<path fill="#3A9804" d="M83.9,1142.1c-8.5,0-15.3-6.9-15.3-15.3c0,0,0-0.1,0-0.1l-26.9-13.7c-2.5,1.7-5.5,2.6-8.6,2.6
c-8.4,0-15.3-6.9-15.3-15.3c0-8.4,6.9-15.3,15.3-15.3c3.4,0,6.7,1.1,9.4,3.2l26.1-13.3c0-0.2,0-0.4,0-0.7
c0-8,6.2-14.6,14.1-15.3l0,0l1-0.1c8.6,0,15.5,6.9,15.5,15.3c0,8.5-6.9,15.3-15.3,15.3c-3.4,0-6.7-1.1-9.3-3.2l-26.2,13.3
c0,0.2,0,0.4,0,0.6c0,0.5,0,1-0.1,1.6l25.8,13.2c2.7-2.3,6.2-3.5,9.7-3.5c8.4,0,15.3,6.9,15.3,15.3
C99.2,1135.2,92.3,1142.1,83.9,1142.1z M41.3,1110.4l0.7,0.3l28.8,14.7l-0.1,1.1c0,0.1,0,0.2,0,0.4c0,7.2,5.9,13.1,13.1,13.1
c7.2,0,13.1-5.9,13.1-13.1c0-7.2-5.9-13.1-13.1-13.1c-3.3,0-6.4,1.2-8.8,3.4l-0.5,0.4l-0.6-0.2l-28-14.3l0.1-0.6
c0.1-0.8,0.2-1.5,0.2-2.2c0-0.3,0-0.5,0-0.8l-0.1-1l0.5-0.4l28.2-14.4l0.5,0.4c2.5,2.1,5.5,3.2,8.6,3.2
c7.2,0,13.1-5.9,13.1-13.1c0-6.9-5.5-12.7-12.3-13.1l-0.6,0c-7.5,0-13.4,5.9-13.4,13.1c0,0.3,0,0.7,0.1,1l0.1,1l-0.5,0.3
l-28.2,14.4l-0.5-0.4c-2.4-2.1-5.5-3.2-8.6-3.2c-7.2,0-13.1,5.9-13.1,13.1c0,7.2,5.9,13.1,13.1,13.1c2.9,0,5.6-0.9,7.8-2.5
L41.3,1110.4z"/>
</g>
</g>
</g>
</g>
</svg>

Antes

Largura:  |  Altura:  |  Tamanho: 5.5 KiB

Depois

Largura:  |  Altura:  |  Tamanho: 4.6 KiB

+55 -48
Ver Arquivo
@@ -1,48 +1,55 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xml:space="preserve"
enable-background="new 0 0 128 128"
viewBox="0 0 128 128"
y="0px"
x="0px"
id="Sync"
version="1.1"><metadata
id="metadata37"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs35" /><g
transform="matrix(0.96875,0,0,0.96875,2,2)"
id="g3"><g
id="g5"><circle
style="fill:#2268ab"
id="circle7"
r="61.933998"
cy="64"
cx="64" /><path
style="fill:#114999"
id="path9"
d="M 64,128 C 28.711,128 0,99.289 0,64 0,28.711 28.711,0 64,0 c 35.289,0 64,28.711 64,64 0,35.289 -28.711,64 -64,64 z M 64,4.132 C 30.989,4.132 4.132,30.987 4.132,64 4.132,97.013 30.989,123.868 64,123.868 97.011,123.868 123.868,97.013 123.868,64 123.868,30.987 97.011,4.132 64,4.132 Z" /></g><g
id="g11"><g
id="g13"><g
id="g15"><path
style="fill:#ffffff"
id="path17"
d="M 85.311,53.564 C 81.354,45.453 73.09,40.257 64.047,40.257 c -1.375,0 -2.764,0.121 -4.125,0.364 -8.236,1.448 -15.172,7.237 -18.111,15.105 l -0.264,0.705 -14.818,2.616 0.346,-1.871 C 29.911,41.813 42.143,29.669 57.511,26.96 c 2.164,-0.38 4.361,-0.575 6.543,-0.575 12.025,0 23.222,5.73 30.3,15.411 l 4.771,-6.193 1.889,21.721 0.325,1.479 -0.046,0.004 0,0.007 -23.129,4.048 7.147,-9.298 z" /></g><g
id="g19"><path
style="fill:#114999"
id="path21"
d="m 64.053,27.711 c 12.314,0 23.643,6.318 30.25,16.325 l 3.8,-4.938 1.6,18.411 c 0.007,0.048 0.025,0.111 0.036,0.159 l -0.025,0.003 0.014,0.074 -18.446,3.232 5.568,-7.243 C 82.854,44.818 73.914,38.936 64.047,38.936 c -1.436,0 -2.889,0.125 -4.353,0.38 -9.054,1.595 -16.114,7.893 -19.121,15.948 l -12.197,2.152 c 2.672,-14.457 14.061,-26.452 29.368,-29.152 2.117,-0.373 4.227,-0.553 6.309,-0.553 m 0,-2.647 c -2.257,0 -4.536,0.2 -6.768,0.595 -7.957,1.405 -15.164,5.177 -20.846,10.911 -5.55,5.605 -9.239,12.65 -10.664,20.368 l -0.693,3.745 3.754,-0.661 12.196,-2.152 1.49,-0.264 0.528,-1.415 c 1.343,-3.602 3.6,-6.819 6.525,-9.307 3.014,-2.557 6.668,-4.273 10.575,-4.962 1.289,-0.225 2.596,-0.343 3.896,-0.343 8.264,0 15.839,4.602 19.704,11.845 l -4.564,5.941 -4.143,5.386 6.697,-1.168 18.443,-3.232 1.371,-0.24 1.393,-0.173 -0.625,-2.82 -1.582,-18.248 -0.593,-6.761 -4.143,5.377 -1.65,2.145 C 91.132,35.633 87.118,32.268 82.579,29.799 76.9,26.702 70.489,25.064 64.053,25.064 l 0,0 z" /></g></g><g
id="g23"><g
id="g25"><path
style="fill:#ffffff"
id="path27"
d="M 64.032,101.541 C 52.05,101.541 40.875,95.84 33.778,86.2 l -4.825,6.289 -1.918,-21.98 c -0.007,-0.032 -0.011,-0.063 -0.014,-0.087 l -0.147,-1.245 13.597,-2.398 0.018,0.096 9.422,-1.653 -7.093,9.234 c 3.979,8.048 12.221,13.207 21.211,13.207 1.368,0 2.761,-0.12 4.125,-0.362 8.154,-1.439 15.068,-7.148 18.036,-14.902 l 0.268,-0.704 14.857,-2.62 -0.361,1.884 C 99.543,78.37 95.968,85.127 90.618,90.5 c -5.475,5.498 -12.411,9.121 -20.057,10.466 -2.157,0.382 -4.354,0.575 -6.529,0.575 z" /></g><g
id="g29"><path
style="fill:#114999"
id="path31"
d="m 46.793,67.111 -5.518,7.182 c 4.021,8.855 12.918,14.691 22.754,14.691 1.432,0 2.89,-0.123 4.353,-0.384 8.975,-1.581 15.997,-7.784 19.043,-15.732 l 12.232,-2.159 c -2.743,14.366 -14.086,26.268 -29.325,28.957 -2.118,0.37 -4.221,0.554 -6.3,0.554 -12.278,0 -23.582,-6.291 -30.204,-16.255 l -3.85,5.019 -1.632,-18.652 C 28.339,70.307 28.339,70.28 28.335,70.259 l 11.054,-1.948 c 0.004,0.029 0.018,0.059 0.025,0.095 l 7.379,-1.295 m 6.239,-3.779 -6.697,1.173 -4.764,0.834 -0.014,-0.093 -2.629,0.463 -11.05,1.948 -2.471,0.432 0.304,2.487 c 0.004,0.029 0.007,0.059 0.011,0.095 l 1.622,18.545 0.589,6.779 4.143,-5.398 1.711,-2.23 c 3.225,3.986 7.239,7.329 11.761,9.784 5.675,3.084 12.068,4.713 18.486,4.713 2.25,0 4.525,-0.2 6.761,-0.591 7.914,-1.398 15.097,-5.145 20.765,-10.841 5.535,-5.559 9.232,-12.555 10.696,-20.223 l 0.718,-3.768 -3.775,0.668 -12.232,2.156 -1.475,0.259 -0.536,1.402 c -1.361,3.55 -3.618,6.723 -6.529,9.173 -2.996,2.522 -6.629,4.218 -10.503,4.902 -1.29,0.225 -2.6,0.343 -3.893,0.343 -8.214,0 -15.764,-4.564 -19.65,-11.746 l 4.511,-5.872 4.14,-5.394 0,0 z" /></g></g></g></g></svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Sync" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
<g>
<g>
<circle fill="#2268AB" cx="64" cy="64" r="61.934"/>
<path fill="#114999" d="M64,128C28.711,128,0,99.289,0,64S28.711,0,64,0s64,28.711,64,64S99.289,128,64,128z M64,4.132
C30.989,4.132,4.132,30.987,4.132,64S30.989,123.868,64,123.868S123.868,97.013,123.868,64S97.011,4.132,64,4.132z"/>
</g>
<g>
<g>
<g>
<path fill="#FFFFFF" d="M85.311,53.564c-3.957-8.111-12.221-13.307-21.264-13.307c-1.375,0-2.764,0.121-4.125,0.364
c-8.236,1.448-15.172,7.237-18.111,15.105l-0.264,0.705l-14.818,2.616l0.346-1.871c2.836-15.363,15.068-27.507,30.436-30.216
c2.164-0.38,4.361-0.575,6.543-0.575c12.025,0,23.222,5.73,30.3,15.411l4.771-6.193l1.889,21.721l0.325,1.479l-0.046,0.004
v0.007l-23.129,4.048L85.311,53.564z"/>
</g>
<g>
<path fill="#114999" d="M64.053,27.711c12.314,0,23.643,6.318,30.25,16.325l3.8-4.938l1.6,18.411
c0.007,0.048,0.025,0.111,0.036,0.159l-0.025,0.003l0.014,0.074l-18.446,3.232l5.568-7.243
c-3.996-8.916-12.936-14.798-22.803-14.798c-1.436,0-2.889,0.125-4.353,0.38c-9.054,1.595-16.114,7.893-19.121,15.948
l-12.197,2.152c2.672-14.457,14.061-26.452,29.368-29.152C59.861,27.891,61.971,27.711,64.053,27.711 M64.053,25.064
c-2.257,0-4.536,0.2-6.768,0.595c-7.957,1.405-15.164,5.177-20.846,10.911c-5.55,5.605-9.239,12.65-10.664,20.368l-0.693,3.745
l3.754-0.661l12.196-2.152l1.49-0.264l0.528-1.415c1.343-3.602,3.6-6.819,6.525-9.307c3.014-2.557,6.668-4.273,10.575-4.962
c1.289-0.225,2.596-0.343,3.896-0.343c8.264,0,15.839,4.602,19.704,11.845l-4.564,5.941l-4.143,5.386l6.697-1.168l18.443-3.232
l1.371-0.24l1.393-0.173l-0.625-2.82l-1.582-18.248l-0.593-6.761l-4.143,5.377l-1.65,2.145
c-3.222-3.998-7.236-7.363-11.775-9.832C76.9,26.702,70.489,25.064,64.053,25.064L64.053,25.064z"/>
</g>
</g>
<g>
<g>
<path fill="#FFFFFF" d="M64.032,101.541c-11.982,0-23.157-5.701-30.254-15.341l-4.825,6.289l-1.918-21.98
c-0.007-0.032-0.011-0.063-0.014-0.087l-0.147-1.245l13.597-2.398l0.018,0.096l9.422-1.653l-7.093,9.234
c3.979,8.048,12.221,13.207,21.211,13.207c1.368,0,2.761-0.12,4.125-0.362c8.154-1.439,15.068-7.148,18.036-14.902l0.268-0.704
l14.857-2.62l-0.361,1.884C99.543,78.37,95.968,85.127,90.618,90.5c-5.475,5.498-12.411,9.121-20.057,10.466
C68.404,101.348,66.207,101.541,64.032,101.541z"/>
</g>
<g>
<path fill="#114999" d="M46.793,67.111l-5.518,7.182c4.021,8.855,12.918,14.691,22.754,14.691c1.432,0,2.89-0.123,4.353-0.384
c8.975-1.581,15.997-7.784,19.043-15.732l12.232-2.159c-2.743,14.366-14.086,26.268-29.325,28.957
c-2.118,0.37-4.221,0.554-6.3,0.554c-12.278,0-23.582-6.291-30.204-16.255l-3.85,5.019l-1.632-18.652
c-0.007-0.025-0.007-0.052-0.011-0.073l11.054-1.948c0.004,0.029,0.018,0.059,0.025,0.095L46.793,67.111 M53.032,63.332
l-6.697,1.173l-4.764,0.834l-0.014-0.093l-2.629,0.463l-11.05,1.948l-2.471,0.432l0.304,2.487
c0.004,0.029,0.007,0.059,0.011,0.095l1.622,18.545l0.589,6.779l4.143-5.398l1.711-2.23c3.225,3.986,7.239,7.329,11.761,9.784
c5.675,3.084,12.068,4.713,18.486,4.713c2.25,0,4.525-0.2,6.761-0.591c7.914-1.398,15.097-5.145,20.765-10.841
c5.535-5.559,9.232-12.555,10.696-20.223l0.718-3.768l-3.775,0.668l-12.232,2.156l-1.475,0.259l-0.536,1.402
c-1.361,3.55-3.618,6.723-6.529,9.173c-2.996,2.522-6.629,4.218-10.503,4.902c-1.29,0.225-2.6,0.343-3.893,0.343
c-8.214,0-15.764-4.564-19.65-11.746l4.511-5.872L53.032,63.332L53.032,63.332z"/>
</g>
</g>
</g>
</g>
</svg>

Antes

Largura:  |  Altura:  |  Tamanho: 4.6 KiB

Depois

Largura:  |  Altura:  |  Tamanho: 3.8 KiB

+1 -13
Ver Arquivo
@@ -3,7 +3,6 @@
if( UNIX AND NOT APPLE )
configure_file(syncstate.py syncstate.py COPYONLY)
configure_file(syncstate.py syncstate_nemo.py COPYONLY)
# Call the setupappname.sh script to set the custom app name.
set (cmd "${CMAKE_CURRENT_SOURCE_DIR}/setappname.sh")
@@ -11,18 +10,7 @@ if( UNIX AND NOT APPLE )
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
ERROR_VARIABLE errors OUTPUT_VARIABLE out)
# Create a nemo plugin script from the nautilus one.
# nemocmd copies the syncstate.py and performs string replacement.
set (nemocmd "${CMAKE_CURRENT_SOURCE_DIR}/createnemoplugin.sh")
execute_process(COMMAND ${nemocmd}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
ERROR_VARIABLE errors OUTPUT_VARIABLE out)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/syncstate.py DESTINATION ${DATADIR}/nautilus-python/extensions)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/syncstate_nemo.py DESTINATION ${DATADIR}/nemo-python/extensions RENAME syncstate.py)
install(FILES syncstate.py DESTINATION ${DATADIR}/nautilus-python/extensions)
endif()
@@ -60,6 +60,10 @@ STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv)
if (!SUCCEEDED(hResult)) { return hResult; }
if (IsEqualCLSID(guid, rclsid)) { return CreateFactory(riid, ppv, State_Error); }
hResult = CLSIDFromString(OVERLAY_GUID_ERROR_SHARED, (LPCLSID)&guid);
if (!SUCCEEDED(hResult)) { return hResult; }
if (IsEqualCLSID(guid, rclsid)) { return CreateFactory(riid, ppv, State_ErrorShared); }
hResult = CLSIDFromString(OVERLAY_GUID_OK, (LPCLSID)&guid);
if (!SUCCEEDED(hResult)) { return hResult; }
if (IsEqualCLSID(guid, rclsid)) { return CreateFactory(riid, ppv, State_OK); }
@@ -72,10 +76,18 @@ STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv)
if (!SUCCEEDED(hResult)) { return hResult; }
if (IsEqualCLSID(guid, rclsid)) { return CreateFactory(riid, ppv, State_Sync); }
hResult = CLSIDFromString(OVERLAY_GUID_SYNC_SHARED, (LPCLSID)&guid);
if (!SUCCEEDED(hResult)) { return hResult; }
if (IsEqualCLSID(guid, rclsid)) { return CreateFactory(riid, ppv, State_SyncShared); }
hResult = CLSIDFromString(OVERLAY_GUID_WARNING, (LPCLSID)&guid);
if (!SUCCEEDED(hResult)) { return hResult; }
if (IsEqualCLSID(guid, rclsid)) { return CreateFactory(riid, ppv, State_Warning); }
hResult = CLSIDFromString(OVERLAY_GUID_WARNING_SHARED, (LPCLSID)&guid);
if (!SUCCEEDED(hResult)) { return hResult; }
if (IsEqualCLSID(guid, rclsid)) { return CreateFactory(riid, ppv, State_WarningShared); }
return CLASS_E_CLASSNOTAVAILABLE;
}
@@ -121,13 +133,19 @@ HRESULT _stdcall DllRegisterServer(void)
hResult = RegisterCLSID(OVERLAY_GUID_ERROR, OVERLAY_NAME_ERROR, szModule);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = RegisterCLSID(OVERLAY_GUID_ERROR_SHARED, OVERLAY_NAME_ERROR_SHARED, szModule);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = RegisterCLSID(OVERLAY_GUID_OK, OVERLAY_NAME_OK, szModule);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = RegisterCLSID(OVERLAY_GUID_OK_SHARED, OVERLAY_NAME_OK_SHARED, szModule);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = RegisterCLSID(OVERLAY_GUID_SYNC, OVERLAY_NAME_SYNC, szModule);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = RegisterCLSID(OVERLAY_GUID_SYNC_SHARED, OVERLAY_NAME_SYNC_SHARED,szModule);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = RegisterCLSID(OVERLAY_GUID_WARNING, OVERLAY_NAME_WARNING, szModule);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = RegisterCLSID(OVERLAY_GUID_WARNING_SHARED, OVERLAY_NAME_WARNING_SHARED, szModule);
return hResult;
}
@@ -169,13 +187,19 @@ STDAPI DllUnregisterServer(void)
hResult = UnregisterCLSID(OVERLAY_GUID_ERROR, OVERLAY_NAME_ERROR);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = UnregisterCLSID(OVERLAY_GUID_ERROR_SHARED, OVERLAY_NAME_ERROR_SHARED);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = UnregisterCLSID(OVERLAY_GUID_OK, OVERLAY_NAME_OK);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = UnregisterCLSID(OVERLAY_GUID_OK_SHARED, OVERLAY_NAME_OK_SHARED);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = UnregisterCLSID(OVERLAY_GUID_SYNC, OVERLAY_NAME_SYNC);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = UnregisterCLSID(OVERLAY_GUID_SYNC_SHARED, OVERLAY_NAME_SYNC_SHARED);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = UnregisterCLSID(OVERLAY_GUID_WARNING, OVERLAY_NAME_WARNING);
if (!SUCCEEDED(hResult)) { return hResult; }
hResult = UnregisterCLSID(OVERLAY_GUID_WARNING_SHARED, OVERLAY_NAME_WARNING_SHARED);
return hResult;
}
@@ -115,12 +115,18 @@ IFACEMETHODIMP OCOverlay::GetPriority(int *pPriority)
*pPriority = 1;
case State_Warning:
*pPriority = 2;
case State_Sync:
case State_WarningShared:
*pPriority = 3;
case State_Error:
case State_Sync:
*pPriority = 4;
default:
case State_SyncShared:
*pPriority = 5;
case State_Error:
*pPriority = 6;
case State_ErrorShared:
*pPriority = 7;
default:
*pPriority = 8;
}
return S_OK;
Arquivo binário não exibido.
@@ -18,10 +18,10 @@
#pragma once
enum State {
State_Error = 0,
State_Error = 0, State_ErrorShared,
State_OK, State_OKShared,
State_Sync,
State_Warning
State_Sync, State_SyncShared,
State_Warning, State_WarningShared
};
class OCOverlayFactory : public IClassFactory
@@ -184,11 +184,22 @@
<ResourceCompile Include="OCOverlay.rc" />
</ItemGroup>
<ItemGroup>
<Image Include="Error.ico" />
<Image Include="Error_Shared.ico" />
<Image Include="ico\Error.ico" />
<Image Include="ico\Error_Shared.ico" />
<Image Include="ico\OK.ico" />
<Image Include="ico\OK_Shared.ico" />
<Image Include="ico\Sync.ico" />
<Image Include="ico\Sync_Shared.ico" />
<Image Include="ico\Warning.ico" />
<Image Include="ico\Warning_Shared.ico" />
<Image Include="OK.ico" />
<Image Include="OK_Shared.ico" />
<Image Include="Sync.ico" />
<Image Include="Sync_Shared.ico" />
<Image Include="Warning.ico" />
<Image Include="Warning_Shared.ico" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
@@ -14,19 +14,25 @@
#define OVERLAY_GUID_ERROR L"{0960F090-F328-48A3-B746-276B1E3C3722}"
#define OVERLAY_GUID_ERROR_SHARED L"{0960F091-F328-48A3-B746-276B1E3C3722}"
#define OVERLAY_GUID_OK L"{0960F092-F328-48A3-B746-276B1E3C3722}"
#define OVERLAY_GUID_OK_SHARED L"{0960F093-F328-48A3-B746-276B1E3C3722}"
#define OVERLAY_GUID_SYNC L"{0960F094-F328-48A3-B746-276B1E3C3722}"
#define OVERLAY_GUID_SYNC_SHARED L"{0960F095-F328-48A3-B746-276B1E3C3722}"
#define OVERLAY_GUID_WARNING L"{0960F096-F328-48A3-B746-276B1E3C3722}"
#define OVERLAY_GUID_WARNING_SHARED L"{0960F097-F328-48A3-B746-276B1E3C3722}"
#define OVERLAY_GENERIC_NAME L"OC Overlay Handler"
// two spaces to put us ahead of the competition :/
#define OVERLAY_NAME_ERROR L" OCError"
#define OVERLAY_NAME_ERROR_SHARED L" OCErrorShared"
#define OVERLAY_NAME_OK L" OCOK"
#define OVERLAY_NAME_OK_SHARED L" OCOKShared"
#define OVERLAY_NAME_SYNC L" OCSync"
#define OVERLAY_NAME_SYNC_SHARED L" OCSyncShared"
#define OVERLAY_NAME_WARNING L" OCWarning"
#define OVERLAY_NAME_WARNING_SHARED L" OCWarningShared"
#define REGISTRY_OVERLAY_KEY L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ShellIconOverlayIdentifiers"
#define REGISTRY_CLSID L"CLSID"
Arquivo binário não exibido.

Antes

Largura:  |  Altura:  |  Tamanho: 27 KiB

Depois

Largura:  |  Altura:  |  Tamanho: 30 KiB

Arquivo binário não exibido.

Depois

Largura:  |  Altura:  |  Tamanho: 30 KiB

Arquivo binário não exibido.

Antes

Largura:  |  Altura:  |  Tamanho: 26 KiB

Depois

Largura:  |  Altura:  |  Tamanho: 30 KiB

Arquivo binário não exibido.

Antes

Largura:  |  Altura:  |  Tamanho: 29 KiB

Depois

Largura:  |  Altura:  |  Tamanho: 30 KiB

Arquivo binário não exibido.

Antes

Largura:  |  Altura:  |  Tamanho: 31 KiB

Depois

Largura:  |  Altura:  |  Tamanho: 30 KiB

Arquivo binário não exibido.

Depois

Largura:  |  Altura:  |  Tamanho: 30 KiB

Arquivo binário não exibido.

Antes

Largura:  |  Altura:  |  Tamanho: 25 KiB

Depois

Largura:  |  Altura:  |  Tamanho: 30 KiB

Arquivo binário não exibido.

Depois

Largura:  |  Altura:  |  Tamanho: 30 KiB

@@ -18,6 +18,9 @@
#include "UtilConstants.h"
#include "StringUtil.h"
#include <WinSock2.h>
#include <Ws2def.h>
#include <windows.h>
#include <iostream>
#include <vector>
#include <array>
@@ -42,6 +45,7 @@ CommunicationSocket::~CommunicationSocket()
bool CommunicationSocket::Close()
{
WSACleanup();
if (_pipe == INVALID_HANDLE_VALUE) {
return false;
}
+1 -1
Ver Arquivo
@@ -143,7 +143,7 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Windows</SubSystem>
</Link>
</ItemDefinitionGroup>
@@ -225,7 +225,7 @@ RemotePathChecker::FileState RemotePathChecker::_StrToFileState(const std::wstri
} else if (str == L"SYNC" || str == L"NEW") {
return StateSync;
} else if (str == L"SYNC+SWM" || str == L"NEW+SWM") {
return StateSync;
return StateSyncSWM;
} else if (str == L"OK") {
return StateOk;
} else if (str == L"OK+SWM") {
@@ -233,11 +233,11 @@ RemotePathChecker::FileState RemotePathChecker::_StrToFileState(const std::wstri
} else if (str == L"IGNORE") {
return StateWarning;
} else if (str == L"IGNORE+SWM") {
return StateWarning;
return StateWarningSWM;
} else if (str == L"ERROR") {
return StateError;
} else if (str == L"ERROR+SWM") {
return StateError;
return StateErrorSWM;
}
return StateNone;
@@ -29,10 +29,10 @@ class __declspec(dllexport) RemotePathChecker {
public:
enum FileState {
// Order synced with OCOverlay
StateError = 0,
StateError = 0, StateErrorSWM,
StateOk, StateOkSWM,
StateSync,
StateWarning,
StateSync, StateSyncSWM,
StateWarning, StateWarningSWM,
StateNone
};
RemotePathChecker();
+1
Ver Arquivo
@@ -45,6 +45,7 @@ set(client_SRCS
accountmanager.cpp
accountsettings.cpp
application.cpp
avatarjob.cpp
folder.cpp
folderman.cpp
folderstatusmodel.cpp
+1 -31
Ver Arquivo
@@ -103,11 +103,6 @@ AccountSettings::AccountSettings(AccountState *accountState, QWidget *parent) :
connect(_model, SIGNAL(rowsInserted(QModelIndex,int,int)),
this, SLOT(refreshSelectiveSyncStatus()));
QAction *resetFolderAction = new QAction(this);
resetFolderAction->setShortcut(QKeySequence(Qt::Key_F5));
connect(resetFolderAction, SIGNAL(triggered()), SLOT(slotResetCurrentFolder()));
addAction(resetFolderAction);
QAction *syncNowAction = new QAction(this);
syncNowAction->setShortcut(QKeySequence(Qt::Key_F6));
connect(syncNowAction, SIGNAL(triggered()), SLOT(slotSyncCurrentFolderNow()));
@@ -242,7 +237,7 @@ void AccountSettings::slotFolderListClicked(const QModelIndex& indx)
// tries to find if we clicked on the '...' button.
QTreeView *tv = ui->_folderList;
auto pos = tv->mapFromGlobal(QCursor::pos());
if (FolderStatusDelegate::optionsButtonRect(tv->visualRect(indx), layoutDirection()).contains(pos)) {
if (FolderStatusDelegate::optionsButtonRect(tv->visualRect(indx)).contains(pos)) {
slotCustomContextMenuRequested(pos);
return;
}
@@ -359,31 +354,6 @@ void AccountSettings::slotRemoveCurrentFolder()
}
}
void AccountSettings::slotResetCurrentFolder()
{
QModelIndex selected = ui->_folderList->selectionModel()->currentIndex();
if( selected.isValid() ) {
QString alias = _model->data( selected, FolderStatusDelegate::FolderAliasRole ).toString();
if (alias.isEmpty())
return;
int ret = QMessageBox::question( 0, tr("Confirm Folder Reset"),
tr("<p>Do you really want to reset folder <i>%1</i> and rebuild your client database?</p>"
"<p><b>Note:</b> This function is designed for maintenance purposes only. "
"No files will be removed, but this can cause significant data traffic and "
"take several minutes or hours to complete, depending on the size of the folder. "
"Only use this option if advised by your administrator.</p>").arg(alias),
QMessageBox::Yes|QMessageBox::No );
if( ret == QMessageBox::Yes ) {
FolderMan *folderMan = FolderMan::instance();
if(Folder *f = folderMan->folder(alias)) {
f->slotTerminateSync();
f->wipe();
}
folderMan->slotScheduleAllFolders();
}
}
}
void AccountSettings::slotOpenCurrentFolder()
{
QModelIndex selected = ui->_folderList->selectionModel()->currentIndex();
-1
Ver Arquivo
@@ -72,7 +72,6 @@ protected slots:
void slotEnableCurrentFolder();
void slotSyncCurrentFolderNow();
void slotRemoveCurrentFolder();
void slotResetCurrentFolder();
void slotOpenCurrentFolder();
void slotFolderWizardAccepted();
void slotFolderWizardRejected();
+1
Ver Arquivo
@@ -45,6 +45,7 @@ AccountState::AccountState(AccountPtr account)
AccountState::~AccountState()
{
qDebug() << "Account state for account" << account()->displayName() << "deleted";
}
AccountPtr AccountState::account() const
+4 -15
Ver Arquivo
@@ -122,16 +122,6 @@ void ActivityItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
pm = userIcon.pixmap(iconWidth, iconHeight, QIcon::Normal);
painter->drawPixmap(QPoint(userIconRect.left(), userIconRect.top()), pm);
QPalette::ColorGroup cg = option.state & QStyle::State_Enabled
? QPalette::Normal : QPalette::Disabled;
if (cg == QPalette::Normal && !(option.state & QStyle::State_Active))
cg = QPalette::Inactive;
if (option.state & QStyle::State_Selected) {
painter->setPen(option.palette.color(cg, QPalette::HighlightedText));
} else {
painter->setPen(option.palette.color(cg, QPalette::Text));
}
const QString elidedAction = fm.elidedText(actionText, Qt::ElideRight, actionTextBox.width());
painter->drawText(actionTextBox, elidedAction);
@@ -140,13 +130,12 @@ void ActivityItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
accountRole.remove(0, atPos+1);
}
QString timeStr;
if ( accountOnline ) {
timeStr = tr("%1 on %2").arg(timeText).arg(accountRole);
} else {
timeStr = tr("%1 on %2 (disconnected)").arg(timeText).arg(accountRole);
QString timeStr = tr("%1 on %2").arg(timeText).arg(accountRole);
if( !accountOnline ) {
QPalette p = option.palette;
painter->setPen(p.color(QPalette::Disabled, QPalette::Text));
timeStr.append(" ");
timeStr.append(tr("(disconnected)"));
}
const QString elidedTime = fm.elidedText(timeStr, Qt::ElideRight, timeBox.width());
+5 -5
Ver Arquivo
@@ -442,24 +442,24 @@ void ActivitySettings::slotCopyToClipboard()
QTextStream ts(&text);
int idx = _tab->currentIndex();
QString message;
QString theSubject;
if( idx == 0 ) {
// the activity widget
_activityWidget->storeActivityList(ts);
message = tr("The server activity list has been copied to the clipboard.");
theSubject = tr("server activity list");
} else if(idx == 1 ) {
// the protocol widget
_protocolWidget->storeSyncActivity(ts);
message = tr("The sync activity list has been copied to the clipboard.");
theSubject = tr("sync activity list");
} else if(idx == 2 ) {
// issues Widget
message = tr("The list of unsynched items has been copied to the clipboard.");
theSubject = tr("not syned items list");
_protocolWidget->storeSyncIssues(ts);
}
QApplication::clipboard()->setText(text);
emit guiLog(tr("Copied to clipboard"), message);
emit guiLog(tr("Copied to clipboard"), tr("The %1 has been copied to the clipboard.").arg(theSubject));
}
void ActivitySettings::slotRemoveAccount( AccountState *ptr )
+1 -11
Ver Arquivo
@@ -113,7 +113,6 @@ Application::Application(int &argc, char **argv) :
#if QT_VERSION > QT_VERSION_CHECK(5, 0, 0)
setAttribute(Qt::AA_UseHighDpiPixmaps, true);
#endif
parseOptions(arguments());
//no need to waste time;
if ( _helpOnly || _versionOnly ) return;
@@ -166,9 +165,6 @@ Application::Application(int &argc, char **argv) :
_gui->slotToggleLogBrowser(); // _showLogWindow is set in parseOptions.
}
// Enable word wrapping of QInputDialog (#4197)
setStyleSheet("QInputDialog QLabel { qproperty-wordWrap:1; }");
connect(AccountManager::instance(), SIGNAL(accountAdded(AccountState*)),
SLOT(slotAccountStateAdded(AccountState*)));
connect(AccountManager::instance(), SIGNAL(accountRemoved(AccountState*)),
@@ -546,9 +542,7 @@ void Application::setupTranslations()
const QString qtBaseTrFile = QLatin1String("qtbase_") + lang;
if (!qtTranslator->load(qtTrFile, qtTrPath)) {
if (!qtTranslator->load(qtTrFile, trPath)) {
if (!qtTranslator->load(qtBaseTrFile, qtTrPath)) {
qtTranslator->load(qtBaseTrFile, trPath);
}
qtTranslator->load(qtBaseTrFile, trPath);
}
}
const QString qtkeychainTrFile = QLatin1String("qtkeychain_") + lang;
@@ -566,10 +560,6 @@ void Application::setupTranslations()
if (property("ui_lang").isNull())
setProperty("ui_lang", "C");
}
// Work around Qt 5 < 5.5.0 regression, see https://bugreports.qt.io/browse/QTBUG-43447
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) && QT_VERSION < QT_VERSION_CHECK(5, 5, 0)
setLayoutDirection(QApplication::tr("QT_LAYOUT_DIRECTION") == QLatin1String("RTL") ? Qt::RightToLeft : Qt::LeftToRight);
#endif
}
bool Application::giveHelp()
+53
Ver Arquivo
@@ -0,0 +1,53 @@
/*
* Copyright (C) by Roeland Jago Douma <roeland@famdouma.nl>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
#include "avatarjob.h"
#include "networkjobs.h"
#include "account.h"
#include <QLatin1String>
namespace OCC {
AvatarJob::AvatarJob(const QString &userId, int size, AccountPtr account, QObject* parent)
: AbstractNetworkJob(account, QLatin1String("remote.php/dav/avatars/"), parent)
{
setIgnoreCredentialFailure(true);
//Append <userid>/<size> to the path
setPath(path() + userId + QString("/%1").arg(size));
}
void AvatarJob::start()
{
setReply(getRequest(path()));
setupConnections(reply());
AbstractNetworkJob::start();
}
bool AvatarJob::finished()
{
int statusCode = reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if (statusCode != 200) {
emit avatarNotAvailable(statusCode);
} else {
QByteArray data = reply()->readAll();
QString mimeType = reply()->header(QNetworkRequest::ContentTypeHeader).toString();
emit avatarReady(data, mimeType);
}
return true;
}
}
+63
Ver Arquivo
@@ -0,0 +1,63 @@
/*
* Copyright (C) by Roeland Jago Douma <roeland@famdouma.nl>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
#ifndef AVATARJOB_H
#define AVATARJOB_H
#include "networkjobs.h"
#include "accountfwd.h"
namespace OCC {
/**
* @brief Job to fetch an avatar for a user
* @ingroup gui
*/
class AvatarJob : public AbstractNetworkJob {
Q_OBJECT
public:
/**
* @param userId The user for which to obtain the avatar
* @param size The size of the avatar (square so size*size)
* @param account For which account to obtain the avatar
* @param parent Parent of the object
*/
explicit AvatarJob(const QString& userId, int size, AccountPtr account, QObject* parent = 0);
public slots:
/* Start the job */
void start() Q_DECL_OVERRIDE;
signals:
/**
* Signal that the job is done and returned an avatar
*
* @param reply the content of the reply
* @param the mimetype (set by the server)
*/
void avatarReady(QByteArray reply, QString mimeType);
/**
* Signal that the job is done but the server did not return
* an avatar
*
* @param statusCode The status code returned by the server
*/
void avatarNotAvailable(int statusCode);
private slots:
virtual bool finished() Q_DECL_OVERRIDE;
};
}
#endif // AVATAR_H
+14 -31
Ver Arquivo
@@ -247,9 +247,7 @@ QString Folder::remotePath() const
QUrl Folder::remoteUrl() const
{
if (!_accountState) {
return QUrl("http://deleted-account");
}
Q_ASSERT(_accountState);
return Account::concatUrlPath(_accountState->account()->davUrl(), remotePath());
}
@@ -298,22 +296,19 @@ void Folder::prepareToSync()
void Folder::slotRunEtagJob()
{
qDebug() << "* Trying to check" << remoteUrl().toString() << "for changes via ETag check. (time since last sync:" << (_timeSinceLastSyncDone.elapsed() / 1000) << "s)";
qDebug() << "* Trying to check" << alias() << "for changes via ETag check. (time since last sync:" << (_timeSinceLastSyncDone.elapsed() / 1000) << "s)";
if (!_accountState) {
qDebug() << "Can't run EtagJob, account is deleted";
return;
}
Q_ASSERT(_accountState );
AccountPtr account = _accountState->account();
if (!_requestEtagJob.isNull()) {
qDebug() << Q_FUNC_INFO << remoteUrl().toString() << "has ETag job queued, not trying to sync";
qDebug() << Q_FUNC_INFO << alias() << "has ETag job queued, not trying to sync";
return;
}
if (_definition.paused || !_accountState->isConnected()) {
qDebug() << "Not syncing. :" << remoteUrl().toString() << _definition.paused << AccountState::stateString(_accountState->state());
qDebug() << "Not syncing. :" << alias() << _definition.paused << AccountState::stateString(_accountState->state());
return;
}
@@ -361,13 +356,12 @@ void Folder::slotRunEtagJob()
void Folder::etagRetreived(const QString& etag)
{
//qDebug() << "* Compare etag with previous etag: last:" << _lastEtag << ", received:" << etag;
qDebug() << "* Compare etag with previous etag: last:" << _lastEtag << ", received:" << etag;
// re-enable sync if it was disabled because network was down
FolderMan::instance()->setSyncEnabled(true);
if (_lastEtag != etag) {
qDebug() << "* Compare etag with previous etag: last:" << _lastEtag << ", received:" << etag << "-> CHANGED";
_lastEtag = etag;
emit scheduleToSync(this);
}
@@ -434,7 +428,6 @@ void Folder::bubbleUpSyncResult()
if (!item->hasErrorStatus() && item->_direction == SyncFileItem::Down) {
switch (item->_instruction) {
case CSYNC_INSTRUCTION_NEW:
case CSYNC_INSTRUCTION_TYPE_CHANGE:
newItems++;
if (!firstItemNew)
firstItemNew = item;
@@ -495,7 +488,7 @@ void Folder::bubbleUpSyncResult()
if(renTarget != renSource) {
status.set(SyncFileStatus::STATUS_MOVE);
}
createGuiLog( firstItemRenamed->_originalFile, status, renamedItems, firstItemRenamed->_renameTarget );
createGuiLog( firstItemRenamed->_file, status, renamedItems, firstItemRenamed->_renameTarget );
}
createGuiLog( firstItemError->_file, SyncFileStatus::STATUS_ERROR, errorItems );
@@ -577,7 +570,7 @@ int Folder::slotDiscardDownloadProgress()
foreach (const SyncJournalDb::DownloadInfo & deleted_info, deleted_infos) {
const QString tmppath = folderpath.filePath(deleted_info._tmpfile);
qDebug() << "Deleting temporary file: " << tmppath;
FileSystem::remove(tmppath);
QFile::remove(tmppath);
}
return deleted_infos.size();
}
@@ -709,11 +702,7 @@ bool Folder::estimateState(QString fn, csync_ftw_type_e t, SyncFileStatus* s)
void Folder::saveToSettings() const
{
if (!_accountState) {
qDebug() << "Can't save folder to settings, account is deleted";
return;
}
Q_ASSERT(_accountState);
auto settings = _accountState->settings();
settings->beginGroup(QLatin1String("Folders"));
FolderDefinition::save(*settings, _definition);
@@ -724,10 +713,7 @@ void Folder::saveToSettings() const
void Folder::removeFromSettings() const
{
if (!_accountState) {
qDebug() << "Can't remove folder from settings, account is deleted";
return;
}
Q_ASSERT(_accountState);
auto settings = _accountState->settings();
settings->beginGroup(QLatin1String("Folders"));
@@ -864,10 +850,7 @@ bool Folder::proxyDirty()
void Folder::startSync(const QStringList &pathList)
{
if (!_accountState) {
qDebug() << "Can't startSync, account is deleted";
return;
}
Q_ASSERT(_accountState);
Q_UNUSED(pathList)
if (!_csync_ctx) {
@@ -877,7 +860,7 @@ void Folder::startSync(const QStringList &pathList)
if (!_csync_ctx) {
qDebug() << Q_FUNC_INFO << "init failed.";
// the error should already be set
QMetaObject::invokeMethod(this, "slotSyncFinished", Qt::QueuedConnection, Q_ARG(bool, false));
QMetaObject::invokeMethod(this, "slotSyncFinished", Qt::QueuedConnection);
return;
}
} else if (proxyDirty()) {
@@ -899,13 +882,13 @@ void Folder::startSync(const QStringList &pathList)
_syncResult.setSyncFileItemVector(SyncFileItemVector());
emit syncStateChange();
qDebug() << "*** Start syncing " << remoteUrl().toString() << " - client version"
qDebug() << "*** Start syncing " << alias() << " - client version"
<< qPrintable(Theme::instance()->version());
if (! setIgnoredFiles())
{
slotSyncError(tr("Could not read system exclude file"));
QMetaObject::invokeMethod(this, "slotSyncFinished", Qt::QueuedConnection, Q_ARG(bool, false));
QMetaObject::invokeMethod(this, "slotSyncFinished", Qt::QueuedConnection);
return;
}
+1 -1
Ver Arquivo
@@ -282,7 +282,7 @@ private:
void createGuiLog(const QString& filename, SyncFileStatus status, int count,
const QString& renameTarget = QString::null );
QPointer<AccountState> _accountState;
AccountState* _accountState;
FolderDefinition _definition;
SyncResult _syncResult;
+7 -7
Ver Arquivo
@@ -523,12 +523,12 @@ void FolderMan::slotEtagJobDestroyed(QObject* /*o*/)
void FolderMan::slotRunOneEtagJob()
{
if (_currentEtagJob.isNull()) {
Folder *folder;
QString alias;
foreach(Folder *f, _folderMap) {
if (f->etagJob()) {
// Caveat: always grabs the first folder with a job, but we think this is Ok for now and avoids us having a seperate queue.
_currentEtagJob = f->etagJob();
folder = f;
alias = f->alias();
break;
}
}
@@ -540,7 +540,7 @@ void FolderMan::slotRunOneEtagJob()
restartApplication();
}
} else {
qDebug() << "Scheduling" << folder->remoteUrl().toString() << "to check remote ETag";
qDebug() << "Scheduling" << alias << "to check remote ETag";
_currentEtagJob->start(); // on destroy/end it will continue the queue via slotEtagJobDestroyed
}
}
@@ -657,7 +657,7 @@ void FolderMan::startScheduledSyncSoon(qint64 msMinimumDelay)
void FolderMan::slotStartScheduledFolderSync()
{
if( _currentSyncFolder ) {
qDebug() << "Currently folder " << _currentSyncFolder->remoteUrl().toString() << " is running, wait for finish!";
qDebug() << "Currently folder " << _currentSyncFolder->alias() << " is running, wait for finish!";
return;
}
@@ -672,7 +672,7 @@ void FolderMan::slotStartScheduledFolderSync()
}
// Find the first folder in the queue that can be synced.
Folder* f = 0;
Folder* f = nullptr;
while( !_scheduleQueue.isEmpty() ) {
f = _scheduleQueue.dequeue();
Q_ASSERT(f);
@@ -746,7 +746,7 @@ void FolderMan::slotForwardFolderSyncStateChange()
void FolderMan::slotFolderSyncStarted( )
{
qDebug() << ">===================================== sync started for " << _currentSyncFolder->remoteUrl().toString();
qDebug() << ">===================================== sync started for " << _currentSyncFolder->alias();
}
/*
@@ -757,7 +757,7 @@ void FolderMan::slotFolderSyncStarted( )
*/
void FolderMan::slotFolderSyncFinished( const SyncResult& )
{
qDebug() << "<===================================== sync finished for " << _currentSyncFolder->remoteUrl().toString();
qDebug() << "<===================================== sync finished for " << _currentSyncFolder->alias();
_lastSyncFolder = _currentSyncFolder;
_currentSyncFolder = 0;
+53 -76
Ver Arquivo
@@ -26,14 +26,6 @@
#include <QPainter>
#include <QApplication>
inline static QFont makeAliasFont(const QFont &normalFont)
{
QFont aliasFont = normalFont;
aliasFont.setBold(true);
aliasFont.setPointSize(normalFont.pointSize()+2);
return aliasFont;
}
namespace OCC {
FolderStatusDelegate::FolderStatusDelegate() : QStyledItemDelegate() {
@@ -49,15 +41,18 @@ QString FolderStatusDelegate::addFolderText()
QSize FolderStatusDelegate::sizeHint(const QStyleOptionViewItem & option ,
const QModelIndex & index) const
{
QFont aliasFont = makeAliasFont(option.font);
QFont aliasFont = option.font;
QFont font = option.font;
aliasFont.setPointSize( font.pointSize() +2 );
QFontMetrics fm(font);
QFontMetrics aliasFm(aliasFont);
int aliasMargin = aliasFm.height()/2;
int margin = fm.height()/4;
auto classif = static_cast<const FolderStatusModel *>(index.model())->classify(index);
if (classif == FolderStatusModel::AddButton) {
int margins = fm.height();
QFontMetrics fm(option.font);
QStyleOptionButton opt;
static_cast<QStyleOption&>(opt) = option;
@@ -65,7 +60,7 @@ QSize FolderStatusDelegate::sizeHint(const QStyleOptionViewItem & option ,
return QApplication::style()->sizeFromContents(
QStyle::CT_PushButton, &opt, fm.size(Qt::TextSingleLine, opt.text)).
expandedTo(QApplication::globalStrut())
+ QSize(0, margins);
+ QSize(0, 2*aliasMargin);
}
if (classif != FolderStatusModel::RootFolder) {
@@ -73,22 +68,6 @@ QSize FolderStatusDelegate::sizeHint(const QStyleOptionViewItem & option ,
}
// calc height
int h = rootFolderHeightWithoutErrors(fm, aliasFm);
// add some space to show an error condition.
if( ! qvariant_cast<QStringList>(index.data(FolderErrorMsg)).isEmpty() ) {
int margin = fm.height()/4;
QStringList errMsgs = qvariant_cast<QStringList>(index.data(FolderErrorMsg));
h += margin + errMsgs.count()*fm.height();
}
return QSize( 0, h);
}
int FolderStatusDelegate::rootFolderHeightWithoutErrors(const QFontMetrics &fm, const QFontMetrics &aliasFm)
{
const int aliasMargin = aliasFm.height()/2;
const int margin = fm.height()/4;
int h = aliasMargin; // margin to top
h += aliasFm.height(); // alias
@@ -97,7 +76,14 @@ int FolderStatusDelegate::rootFolderHeightWithoutErrors(const QFontMetrics &fm,
h += margin; // between local and remote path
h += fm.height(); // remote path
h += aliasMargin; // bottom margin
return h;
// add some space to show an error condition.
if( ! qvariant_cast<QStringList>(index.data(FolderErrorMsg)).isEmpty() ) {
QStringList errMsgs = qvariant_cast<QStringList>(index.data(FolderErrorMsg));
h += aliasMargin*2 + errMsgs.count()*fm.height();
}
return QSize( 0, h);
}
void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
@@ -105,14 +91,15 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
{
QStyledItemDelegate::paint(painter,option,index);
auto textAlign = Qt::AlignLeft;
QFont aliasFont = makeAliasFont(option.font);
QFont aliasFont = option.font;
QFont subFont = option.font;
QFont errorFont = subFont;
QFont progressFont = subFont;
progressFont.setPointSize( subFont.pointSize()-2);
//font.setPixelSize(font.weight()+);
aliasFont.setBold(true);
aliasFont.setPointSize( subFont.pointSize()+2 );
QFontMetrics subFm( subFont );
QFontMetrics aliasFm( aliasFont );
@@ -130,7 +117,6 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
opt.text = addFolderText();
opt.rect.setWidth(qMin(opt.rect.width(), hint.width()));
opt.rect.adjust(0, aliasMargin, 0, -aliasMargin);
opt.rect = QStyle::visualRect(option.direction, option.rect, opt.rect);
QApplication::style()->drawControl(QStyle::CE_PushButton, &opt, painter
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
, option.widget
@@ -155,7 +141,10 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
QString itemString = qvariant_cast<QString>(index.data(SyncProgressItemString));
int warningCount = qvariant_cast<int>(index.data(WarningCount));
bool syncOngoing = qvariant_cast<bool>(index.data(SyncRunning));
bool syncEnabled = qvariant_cast<bool>(index.data(FolderAccountConnected));
// QString statusText = qvariant_cast<QString>(index.data(FolderStatus));
bool syncEnabled = index.data(FolderAccountConnected).toBool();
// QString syncStatus = syncEnabled? tr( "Enabled" ) : tr( "Disabled" );
QRect iconRect = option.rect;
QRect aliasRect = option.rect;
@@ -188,11 +177,8 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
int iconSize = iconRect.width();
auto optionsButtonVisualRect = optionsButtonRect(option.rect, option.direction);
QPixmap pm = statusIcon.pixmap(iconSize, iconSize, syncEnabled ? QIcon::Normal : QIcon::Disabled );
painter->drawPixmap(QStyle::visualRect(option.direction, option.rect, iconRect).left(),
iconRect.top(), pm);
painter->drawPixmap(QPoint(iconRect.left(), iconRect.top()), pm);
// only show the warning icon if the sync is running. Otherwise its
// encoded in the status icon.
@@ -205,7 +191,6 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
QIcon warnIcon(":/client/resources/warning");
QPixmap pm = warnIcon.pixmap(16,16, syncEnabled ? QIcon::Normal : QIcon::Disabled );
warnRect = QStyle::visualRect(option.direction, option.rect, warnRect);
painter->drawPixmap(QPoint(warnRect.left(), warnRect.top()),pm );
}
@@ -232,7 +217,7 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
}
QString elidedAlias = aliasFm.elidedText(aliasText, Qt::ElideRight, aliasRect.width());
painter->setFont(aliasFont);
painter->drawText(QStyle::visualRect(option.direction, option.rect, aliasRect), textAlign, elidedAlias);
painter->drawText(aliasRect, elidedAlias);
const bool showProgess = !overallString.isEmpty() || !itemString.isEmpty();
if(!showProgess) {
@@ -246,56 +231,56 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
elidedRemotePathText = subFm.elidedText(tr("Remote path: %1").arg(remotePath),
Qt::ElideMiddle, remotePathRect.width());
}
painter->drawText(QStyle::visualRect(option.direction, option.rect, remotePathRect),
textAlign, elidedRemotePathText);
painter->drawText(remotePathRect, elidedRemotePathText);
QString elidedPathText = subFm.elidedText(pathText, Qt::ElideMiddle, localPathRect.width());
painter->drawText(QStyle::visualRect(option.direction, option.rect, localPathRect),
textAlign, elidedPathText);
painter->drawText(localPathRect, elidedPathText);
}
// paint an error overlay if there is an error string
int h = iconRect.bottom();
if( !errorTexts.isEmpty() ) {
h += margin;
h += aliasMargin;
QRect errorRect = localPathRect;
errorRect.setLeft( iconRect.left());
errorRect.setTop( h );
errorRect.setHeight(errorTexts.count() * subFm.height() + 2 * margin);
errorRect.setRight( option.rect.right() - margin );
errorRect.setHeight(errorTexts.count() * subFm.height()+aliasMargin);
errorRect.setRight( option.rect.right()-aliasMargin );
painter->setBrush( QColor(0xbb, 0x4d, 0x4d) );
painter->setPen( QColor(0xaa, 0xaa, 0xaa));
painter->drawRoundedRect(QStyle::visualRect(option.direction, option.rect, errorRect),
4, 4);
painter->drawRoundedRect( errorRect, 4, 4 );
painter->setPen( Qt::white );
painter->setFont(errorFont);
QRect errorTextRect( errorRect.left() + margin,
errorRect.top() + margin,
errorRect.width() - 2 * margin,
subFm.height() );
QRect errorTextRect = errorRect;
errorTextRect.setLeft( errorTextRect.left()+aliasMargin );
errorTextRect.setTop( errorTextRect.top()+aliasMargin/2 );
int x = errorTextRect.left();
int y = errorTextRect.top()+aliasMargin/2 + subFm.height()/2;
foreach( QString eText, errorTexts ) {
painter->drawText(QStyle::visualRect(option.direction, option.rect, errorTextRect), textAlign,
subFm.elidedText( eText, Qt::ElideLeft, errorTextRect.width()));
errorTextRect.translate(0, errorTextRect.height());
painter->drawText(x, y, subFm.elidedText( eText, Qt::ElideLeft, errorTextRect.width()-2*aliasMargin));
y += subFm.height();
}
h = errorRect.bottom();
}
h += margin;
h += aliasMargin;
// Sync File Progress Bar: Show it if syncFile is not empty.
if (showProgess) {
int fileNameTextHeight = subFm.boundingRect(tr("File")).height();
int barHeight = qMax(fileNameTextHeight, aliasFm.height()+4);
int overallWidth = option.rect.right() - aliasMargin - optionsButtonVisualRect.width() - nextToIcon;
int barHeight = qMax(fileNameTextHeight, aliasFm.height()+4); ;
int overallWidth = option.rect.width()-aliasMargin-nextToIcon;
painter->save();
// Sizes-Text
QRect octetRect = progressFm.boundingRect(QRect(), 0, overallString );
int progressTextWidth = octetRect.width() + 5;
int progressTextWidth = octetRect.width() + 2;
// Overall Progress Bar.
QRect pBRect;
@@ -311,7 +296,7 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
pBarOpt.maximum = 100;
pBarOpt.progress = overallPercent;
pBarOpt.orientation = Qt::Horizontal;
pBarOpt.rect = QStyle::visualRect(option.direction, option.rect, pBRect);
pBarOpt.rect = pBRect;
QApplication::style()->drawControl( QStyle::CE_ProgressBar, &pBarOpt, painter );
@@ -323,8 +308,7 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
overallProgressRect.setWidth( progressTextWidth );
painter->setFont(progressFont);
painter->drawText(QStyle::visualRect(option.direction, option.rect, overallProgressRect),
Qt::AlignRight | Qt::AlignVCenter, overallString);
painter->drawText( overallProgressRect, Qt::AlignRight+Qt::AlignVCenter, overallString);
// painter->drawRect(overallProgressRect);
// Individual File Progress
@@ -335,8 +319,7 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
fileRect.setHeight(fileNameTextHeight);
QString elidedText = progressFm.elidedText(itemString, Qt::ElideLeft, fileRect.width());
painter->drawText(QStyle::visualRect(option.direction, option.rect, fileRect),
Qt::AlignLeft | Qt::AlignVCenter, elidedText);
painter->drawText( fileRect, Qt::AlignLeft+Qt::AlignVCenter, elidedText);
painter->restore();
}
@@ -351,7 +334,7 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
btnOpt.state |= QStyle::State_Raised;
btnOpt.arrowType = Qt::NoArrow;
btnOpt.subControls = QStyle::SC_ToolButton;
btnOpt.rect = optionsButtonVisualRect;
btnOpt.rect = optionsButtonRect(option.rect);
btnOpt.icon = m_moreIcon;
btnOpt.iconSize = btnOpt.rect.size();
QApplication::style()->drawComplexControl( QStyle::CC_ToolButton, &btnOpt, painter );
@@ -364,26 +347,20 @@ bool FolderStatusDelegate::editorEvent ( QEvent * event, QAbstractItemModel * mo
return QStyledItemDelegate::editorEvent(event, model, option, index);
}
QRect FolderStatusDelegate::optionsButtonRect(QRect within, Qt::LayoutDirection direction)
QRect FolderStatusDelegate::optionsButtonRect(const QRect &within)
{
QFont font = QFont();
QFont aliasFont = makeAliasFont(font);
QFontMetrics fm(font);
QFontMetrics aliasFm(aliasFont);
within.setHeight(FolderStatusDelegate::rootFolderHeightWithoutErrors(fm, aliasFm));
QStyleOptionToolButton opt;
opt.text = QLatin1String("...");
QFontMetrics fm = QFontMetrics(QFont());
QSize textSize = fm.size(Qt::TextShowMnemonic, opt.text);
opt.rect.setSize(textSize);
QSize size = QApplication::style()->sizeFromContents(QStyle::CT_ToolButton, &opt, textSize).
expandedTo(QApplication::globalStrut());
int margin = QApplication::style()->pixelMetric(QStyle::PM_DefaultLayoutSpacing);
QRect r(QPoint(within.right() - size.width() - margin,
within.top() + within.height()/2 - size.height()/2),
size);
return QStyle::visualRect(direction, within, r);
return QRect(QPoint(within.right() - size.width() - margin,
within.top() + within.height()/2 - size.height()/2),
size);
}
+3 -2
Ver Arquivo
@@ -33,6 +33,8 @@ public:
HeaderRole,
FolderPathRole,
FolderSecondPathRole,
FolderRemotePath,
FolderStatus,
FolderErrorMsg,
FolderSyncPaused,
FolderStatusIconRole,
@@ -55,8 +57,7 @@ public:
/**
* return the position of the option button within the item
*/
static QRect optionsButtonRect(QRect within, Qt::LayoutDirection direction);
static int rootFolderHeightWithoutErrors(const QFontMetrics &fm, const QFontMetrics &aliasFm);
static QRect optionsButtonRect(const QRect &within);
private:
static QString addFolderText();
};
+3 -5
Ver Arquivo
@@ -187,8 +187,6 @@ QVariant FolderStatusModel::data(const QModelIndex &index, int role) const
switch (role) {
case FolderStatusDelegate::FolderPathRole : return f->shortGuiPath();
case FolderStatusDelegate::FolderSecondPathRole : return f->remotePath();
case FolderStatusDelegate::FolderErrorMsg : return f->syncResult().errorStrings();
case FolderStatusDelegate::SyncRunning : return f->syncResult().status() == SyncResult::SyncRunning;
case FolderStatusDelegate::HeaderRole : return f->aliasGui();
case FolderStatusDelegate::FolderAliasRole : return f->alias();
case FolderStatusDelegate::FolderSyncPaused : return f->syncPaused();
@@ -710,7 +708,8 @@ void FolderStatusModel::slotUpdateFolderState(Folder *folder)
if( ! folder ) return;
for (int i = 0; i < _folders.count(); ++i) {
if (_folders.at(i)._folder == folder) {
emit dataChanged(index(i), index(i));
emit dataChanged(index(i), index(i),
QVector<int>() << FolderStatusDelegate::FolderStatus);
}
}
}
@@ -971,7 +970,7 @@ void FolderStatusModel::slotFolderSyncStateChange(Folder *f)
// Reset the progress info after a sync.
_folders[folderIndex]._progress = SubFolderInfo::Progress();
} else if (state == SyncResult::Error) {
_folders[folderIndex]._progress = SubFolderInfo::Progress();
_folders[folderIndex]._progress._progressString = f->syncResult().errorString();
}
// update the icon etc. now
@@ -980,7 +979,6 @@ void FolderStatusModel::slotFolderSyncStateChange(Folder *f)
if (state == SyncResult::Success) {
foreach (const SyncFileItemPtr &i, f->syncResult().syncFileItemVector()) {
if (i->_isDirectory && (i->_instruction == CSYNC_INSTRUCTION_NEW
|| i->_instruction == CSYNC_INSTRUCTION_TYPE_CHANGE
|| i->_instruction == CSYNC_INSTRUCTION_REMOVE
|| i->_instruction == CSYNC_INSTRUCTION_RENAME)) {
// There is a new or a removed folder. reset all data
+2 -1
Ver Arquivo
@@ -79,7 +79,8 @@ void FolderWatcherPrivate::inotifyRegisterPath(const QString& path)
int wd = inotify_add_watch(_fd, path.toUtf8().constData(),
IN_CLOSE_WRITE | IN_ATTRIB | IN_MOVE |
IN_CREATE |IN_DELETE | IN_DELETE_SELF |
IN_MOVE_SELF |IN_UNMOUNT |IN_ONLYDIR);
IN_MOVE_SELF |IN_UNMOUNT |IN_ONLYDIR |
IN_DONT_FOLLOW );
if( wd > -1 ) {
_watches.insert(wd, path);
}
-23
Ver Arquivo
@@ -47,34 +47,11 @@ int main(int argc, char **argv)
{
Q_INIT_RESOURCE(client);
#ifdef Q_OS_WIN
// If the font size ratio is set on Windows, we need to
// enable the auto pixelRatio in Qt since we don't
// want to use sizes relative to the font size everywhere.
// This is automatic on OS X, but opt-in on Windows
// https://doc-snapshots.qt.io/qt5-5.6/highdpi.html#qt-support
#if QT_VERSION < QT_VERSION_CHECK(5, 6, 0)
qputenv("QT_DEVICE_PIXEL_RATIO", "auto");
#else
qputenv("QT_AUTO_SCREEN_SCALE_FACTOR", "1");
#endif
#endif // Q_OS_WIN
#ifdef Q_OS_MAC
Mac::CocoaInitializer cocoaInit; // RIIA
#endif
OCC::Application app(argc, argv);
#ifdef Q_OS_WIN
// The Windows style still has pixelated elements with Qt 5.6,
// it's recommended to use the Fusion style in this case, even
// though it looks slightly less native. Check here after the
// QApplication was constructed, but before any QWidget is
// constructed.
if (app.devicePixelRatio() > 1)
QApplication::setStyle(QStringLiteral("fusion"));
#endif // Q_OS_WIN
#ifndef Q_OS_WIN
signal(SIGPIPE, SIG_IGN);
#endif
+1 -1
Ver Arquivo
@@ -199,7 +199,7 @@ void ownCloudGui::slotSyncStateChange( Folder* folder )
auto result = folder->syncResult();
qDebug() << "Sync state changed for folder " << folder->remoteUrl().toString() << ": " << result.statusString();
qDebug() << "Sync state changed for folder " << folder->alias() << ": " << result.statusString();
if (result.status() == SyncResult::Success || result.status() == SyncResult::Error) {
Logger::instance()->enterNextLogFile();
+13 -5
Ver Arquivo
@@ -126,7 +126,7 @@ void ProtocolWidget::hideEvent(QHideEvent *ev)
QWidget::hideEvent(ev);
}
void ProtocolWidget::cleanItems(const QString& folder)
void ProtocolWidget::cleanIgnoreItems(const QString& folder)
{
int itemCnt = _ui->_treeWidget->topLevelItemCount();
@@ -136,13 +136,21 @@ void ProtocolWidget::cleanItems(const QString& folder)
itemCnt--;
}
// The issue list is a state, clear it and let the next sync fill it
// with ignored files and propagation errors.
// limit also in the protocol widget
itemCnt = _issueItemView->topLevelItemCount();
// Limit the number of items in the issue view
while(itemCnt > 2000) {
delete _issueItemView->takeTopLevelItem(itemCnt - 1);
itemCnt--;
}
// clean up the issue list
for( int cnt = itemCnt-1; cnt >=0 ; cnt-- ) {
QTreeWidgetItem *item = _issueItemView->topLevelItem(cnt);
bool isErrorItem = item->data(0, IgnoredIndicatorRole).toBool();
QString itemFolder = item->data(2, Qt::UserRole).toString();
if( itemFolder == folder ) {
if( isErrorItem && itemFolder == folder ) {
delete item;
}
}
@@ -253,7 +261,7 @@ void ProtocolWidget::slotProgressInfo( const QString& folder, const ProgressInfo
{
if( !progress.hasStarted() ) {
// The sync is restarting, clean the old items
cleanItems(folder);
cleanIgnoreItems(folder);
computeResyncButtonEnabled();
} else if (progress.completedFiles() >= progress.totalFiles()) {
//Sync completed
+1 -1
Ver Arquivo
@@ -63,7 +63,7 @@ signals:
private:
void setSyncResultStatus(const SyncResult& result );
void cleanItems( const QString& folder );
void cleanIgnoreItems( const QString& folder );
void computeResyncButtonEnabled();
QTreeWidgetItem* createCompletedTreewidgetItem(const QString &folder, const SyncFileItem &item );
+1 -1
Ver Arquivo
@@ -57,7 +57,7 @@
</column>
</widget>
</item>
<item row="2" column="0" colspan="2">
<item row="2" column="1">
<widget class="QDialogButtonBox" name="_dialogButtonBox"/>
</item>
</layout>
+4 -9
Ver Arquivo
@@ -183,22 +183,17 @@ void SettingsDialog::showFirstPage()
void SettingsDialog::showActivityPage()
{
if (_activityAction) {
_activityAction->trigger();
slotSwitchPage(_activityAction);
}
}
void SettingsDialog::accountAdded(AccountState *s)
{
auto height = _toolBar->sizeHint().height();
bool brandingSingleAccount = !Theme::instance()->multiAccount();
auto accountAction = createColorAwareAction(QLatin1String(":/client/resources/account.png"),
brandingSingleAccount ? tr("Account") : s->account()->displayName());
if (!brandingSingleAccount) {
accountAction->setToolTip(s->account()->displayName());
accountAction->setIconText(s->shortDisplayNameForSettings(height * buttonSizeRatio));
}
s->account()->displayName());
accountAction->setToolTip(s->account()->displayName());
accountAction->setIconText(s->shortDisplayNameForSettings(height * buttonSizeRatio));
_toolBar->insertAction(_toolBar->actions().at(0), accountAction);
auto accountSettings = new AccountSettings(s, this);
_ui->stack->insertWidget(0 , accountSettings);
+1 -1
Ver Arquivo
@@ -117,7 +117,7 @@ void SettingsDialogMac::accountAdded(AccountState *s)
QIcon accountIcon = MacStandardIcon::icon(MacStandardIcon::UserAccounts);
auto accountSettings = new AccountSettings(s, this);
QString displayName = Theme::instance()->multiAccount() ? s->shortDisplayNameForSettings() : tr("Account");
QString displayName = s->shortDisplayNameForSettings();
insertPreferencesPanel(0, accountIcon, displayName, accountSettings);
+5 -14
Ver Arquivo
@@ -63,7 +63,6 @@ void ShareeModel::fetch(const QString &search, const ShareeSet &blacklist)
_shareeBlacklist = blacklist;
OcsShareeJob *job = new OcsShareeJob(_account);
connect(job, SIGNAL(shareeJobFinished(QVariantMap)), SLOT(shareesFetched(QVariantMap)));
connect(job, SIGNAL(ocsError(int,QString)), SIGNAL(displayErrorMessage(int,QString)));
job->getSharees(_search, _type, 1, 50);
}
@@ -197,19 +196,11 @@ QVariant ShareeModel::data(const QModelIndex &index, int role) const
return QVariant();
}
const auto & sharee = _sharees.at(index.row());
if (role == Qt::DisplayRole) {
return sharee->format();
} else if (role == Qt::EditRole) {
// This role is used by the completer - it should match
// the full name and the user name and thus we include both
// in the output here. But we need to take care this string
// doesn't leak to the user.
return QString(sharee->displayName() + " (" + sharee->shareWith() + ")");
} else if (role == Qt::UserRole) {
return QVariant::fromValue(sharee);
if (role == Qt::DisplayRole || role == Qt::EditRole) {
return _sharees.at(index.row())->format();
}
if (role == Qt::UserRole) {
return QVariant::fromValue(_sharees.at(index.row()));
}
return QVariant();
-3
Ver Arquivo
@@ -64,11 +64,8 @@ public:
QSharedPointer<Sharee> getSharee(int at);
QString currentSearch() const { return _search; }
signals:
void shareesReady();
void displayErrorMessage(int code, const QString &);
private slots:
void shareesFetched(const QVariantMap &reply);
+7 -2
Ver Arquivo
@@ -505,8 +505,8 @@ void ShareLinkWidget::setShareCheckBoxTitle(bool haveShares)
void ShareLinkWidget::displayError(int code, const QString &message)
{
const QString arg = QString("%1, %2").arg(code).arg(message);
qDebug() << "Error from server" << code << message;
displayError(message);
const QString errMsg = tr("OCS API error code: %1").arg(arg);
displayError(errMsg);
}
void ShareLinkWidget::displayError(const QString& errMsg)
@@ -515,5 +515,10 @@ void ShareLinkWidget::displayError(const QString& errMsg)
_ui->errorLabel->show();
}
void ShareLinkWidget::displayError(int code)
{
const QString errMsg = tr("OCS API error code: %1").arg(code);
displayError(errMsg);
}
}
+1
Ver Arquivo
@@ -74,6 +74,7 @@ private slots:
private:
void setShareCheckBoxTitle(bool haveShares);
void displayError(int code);
void displayError(const QString& errMsg);
void setShareLink( const QString& url );
void resizeEvent(QResizeEvent *e);
+1
Ver Arquivo
@@ -224,6 +224,7 @@
</layout>
<zorder>errorLabel</zorder>
<zorder>widget_shareLink</zorder>
<zorder>verticalSpacer</zorder>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>
+111 -62
Ver Arquivo
@@ -26,6 +26,7 @@
#include "thumbnailjob.h"
#include "share.h"
#include "sharee.h"
#include "avatarjob.h"
#include "QProgressIndicator.h"
#include <QBuffer>
@@ -39,6 +40,9 @@
#include <QPropertyAnimation>
#include <QMenu>
#include <QAction>
#include <QCryptographicHash>
#include <QColor>
#include <QPainter>
namespace OCC {
@@ -48,8 +52,7 @@ ShareUserGroupWidget::ShareUserGroupWidget(AccountPtr account, const QString &sh
_account(account),
_sharePath(sharePath),
_localPath(localPath),
_resharingAllowed(resharingAllowed),
_disableCompleterActivated(false)
_resharingAllowed(resharingAllowed)
{
setAttribute(Qt::WA_DeleteOnClose);
setObjectName("SharingDialogUG"); // required as group for saveGeometry call
@@ -64,10 +67,8 @@ ShareUserGroupWidget::ShareUserGroupWidget(AccountPtr account, const QString &sh
_isFile ? QLatin1String("file") : QLatin1String("folder"),
_completer);
connect(_completerModel, SIGNAL(shareesReady()), this, SLOT(slotShareesReady()));
connect(_completerModel, SIGNAL(displayErrorMessage(int,QString)), this, SLOT(displayError(int,QString)));
_completer->setModel(_completerModel);
_completer->setCaseSensitivity(Qt::CaseInsensitive);
#if QT_VERSION >= QT_VERSION_CHECK(5, 2, 0)
_completer->setFilterMode(Qt::MatchContains);
#endif
@@ -76,15 +77,8 @@ ShareUserGroupWidget::ShareUserGroupWidget(AccountPtr account, const QString &sh
_manager = new ShareManager(_account, this);
connect(_manager, SIGNAL(sharesFetched(QList<QSharedPointer<Share>>)), SLOT(slotSharesFetched(QList<QSharedPointer<Share>>)));
connect(_manager, SIGNAL(shareCreated(QSharedPointer<Share>)), SLOT(getShares()));
connect(_manager, SIGNAL(serverError(int,QString)), this, SLOT(displayError(int,QString)));
connect(_ui->shareeLineEdit, SIGNAL(returnPressed()), SLOT(slotLineEditReturn()));
// By making the next two QueuedConnections we can override
// the strings the completer sets on the line edit.
connect(_completer, SIGNAL(activated(QModelIndex)), SLOT(slotCompleterActivated(QModelIndex)),
Qt::QueuedConnection);
connect(_completer, SIGNAL(highlighted(QModelIndex)), SLOT(slotCompleterHighlighted(QModelIndex)),
Qt::QueuedConnection);
// connect(_ui->shareeLineEdit, SIGNAL(returnPressed()), SLOT(on_searchPushButton_clicked()));
connect(_completer, SIGNAL(activated(QModelIndex)), SLOT(slotCompleterActivated(QModelIndex)));
// Queued connection so this signal is recieved after textChanged
connect(_ui->shareeLineEdit, SIGNAL(textEdited(QString)),
@@ -94,7 +88,6 @@ ShareUserGroupWidget::ShareUserGroupWidget(AccountPtr account, const QString &sh
_completionTimer.setInterval(600);
setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Expanding);
_ui->errorLabel->hide();
}
ShareUserGroupWidget::~ShareUserGroupWidget()
@@ -109,7 +102,6 @@ void ShareUserGroupWidget::on_shareeLineEdit_textChanged(const QString &)
void ShareUserGroupWidget::slotLineEditTextEdited(const QString& text)
{
_disableCompleterActivated = false;
// First textChanged is called first and we stopped the timer when the text is changed, programatically or not
// Then we restart the timer here if the user touched a key
if (!text.isEmpty()) {
@@ -117,28 +109,6 @@ void ShareUserGroupWidget::slotLineEditTextEdited(const QString& text)
}
}
void ShareUserGroupWidget::slotLineEditReturn()
{
_disableCompleterActivated = false;
// did the user type in one of the options?
const auto text = _ui->shareeLineEdit->text();
for (int i = 0; i < _completerModel->rowCount(); ++i) {
const auto sharee = _completerModel->getSharee(i);
if (sharee->format() == text
|| sharee->displayName() == text
|| sharee->shareWith() == text) {
slotCompleterActivated(_completerModel->index(i));
// make sure we do not send the same item twice (because return is called when we press
// return to activate an item inthe completer)
_disableCompleterActivated = true;
return;
}
}
// nothing found? try to refresh completion
_completionTimer.start();
}
void ShareUserGroupWidget::searchForSharees()
{
@@ -152,7 +122,7 @@ void ShareUserGroupWidget::searchForSharees()
foreach (auto sw, _ui->scrollArea->findChildren<ShareWidget*>()) {
blacklist << sw->share()->getShareWith();
}
_ui->errorLabel->hide();
_completerModel->fetch(_ui->shareeLineEdit->text(), blacklist);
}
@@ -166,6 +136,7 @@ void ShareUserGroupWidget::slotSharesFetched(const QList<QSharedPointer<Share>>
{
QScrollArea *scrollArea = _ui->scrollArea;
auto newViewPort = new QWidget(scrollArea);
auto layout = new QVBoxLayout(newViewPort);
@@ -178,7 +149,7 @@ void ShareUserGroupWidget::slotSharesFetched(const QList<QSharedPointer<Share>>
continue;
}
ShareWidget *s = new ShareWidget(share, _isFile, _ui->scrollArea);
ShareWidget *s = new ShareWidget(share, _isFile, _account, _ui->scrollArea);
connect(s, SIGNAL(resizeRequested()), this, SLOT(slotAdjustScrollWidgetSize()));
layout->addWidget(s);
@@ -195,8 +166,6 @@ void ShareUserGroupWidget::slotSharesFetched(const QList<QSharedPointer<Share>>
scrollArea->setMinimumSize(minimumSize);
scrollArea->setVisible(!shares.isEmpty());
scrollArea->setWidget(newViewPort);
_disableCompleterActivated = false;
}
void ShareUserGroupWidget::slotAdjustScrollWidgetSize()
@@ -211,19 +180,14 @@ void ShareUserGroupWidget::slotAdjustScrollWidgetSize()
}
}
void ShareUserGroupWidget::slotShareesReady()
{
if (_completerModel->rowCount() == 0) {
displayError(0, tr("No results for '%1'").arg(_completerModel->currentSearch()));
return;
}
_completer->complete();
}
void ShareUserGroupWidget::slotCompleterActivated(const QModelIndex & index)
{
if (_disableCompleterActivated)
return;
// The index is an index from the QCompletion model which is itelf a proxy
// model proxying the _completerModel
auto sharee = qvariant_cast<QSharedPointer<Sharee>>(index.data(Qt::UserRole));
@@ -237,27 +201,15 @@ void ShareUserGroupWidget::slotCompleterActivated(const QModelIndex & index)
_ui->shareeLineEdit->setText(QString());
}
void ShareUserGroupWidget::slotCompleterHighlighted(const QModelIndex & index)
{
// By default the completer would set the text to EditRole,
// override that here.
_ui->shareeLineEdit->setText(index.data(Qt::DisplayRole).toString());
}
void ShareUserGroupWidget::displayError(int code, const QString& message)
{
qDebug() << "Error from server" << code << message;
_ui->errorLabel->setText(message);
_ui->errorLabel->show();
}
ShareWidget::ShareWidget(QSharedPointer<Share> share,
bool isFile,
AccountPtr account,
QWidget *parent) :
QWidget(parent),
_ui(new Ui::ShareWidget),
_share(share),
_isFile(isFile)
_isFile(isFile),
_account(account)
{
_ui->setupUi(this);
@@ -304,6 +256,103 @@ ShareWidget::ShareWidget(QSharedPointer<Share> share,
if (!share->account()->capabilities().shareResharing()) {
_ui->permissionShare->hide();
}
loadAvatar();
}
void ShareWidget::loadAvatar()
{
/* Set the default place holder
* This is calculated the same way as on the webinterface
* So that the colors match
*
* This is done first so that we can directly show something
*/
// Set size of the placeholder
_ui->avatar->setMinimumHeight(48);
_ui->avatar->setMinimumWidth(48);
_ui->avatar->setMaximumHeight(48);
_ui->avatar->setMaximumWidth(48);
_ui->avatar->setAlignment(Qt::AlignCenter);
/* Calculate the hue
* We could use more digits but we have the MSB now which
* is already plenty
*/
const QString text = _share->getShareWith()->displayName();
QString seed = _share->getShareWith()->shareWith();
if (_share->getShareWith()->type() != Sharee::User) {
seed += QString(" %1").arg(_share->getShareWith()->type());
}
const QByteArray hash = QCryptographicHash::hash(seed.toUtf8(), QCryptographicHash::Md5);
int hue = ((double)hash.mid(0, 3).toHex().toInt(0, 16) / (double)0xffffff) * 255;
const QColor bg = QColor::fromHsl(hue, 230, 166);
const QString style = QString("* {\
color: #fff;\
background-color: %1;\
border-radius: 24px;\
font-size: 26px\
}").arg(bg.name());
// Set the style
_ui->avatar->setStyleSheet(style);
// Set the placeholder text
_ui->avatar->setText(text.at(0).toUpper());
// We can only fetch avatars for local users currently
if (_share->getShareWith()->type() == Sharee::User) {
AvatarJob *job = new AvatarJob(_share->getShareWith()->shareWith(), 48, _account, this);
connect(job, SIGNAL(avatarReady(QByteArray, QString)), SLOT(slotAvatarLoaded(QByteArray, QString)));
job->start();
}
}
void ShareWidget::slotAvatarLoaded(const QByteArray &data, const QString &mimeType)
{
QPixmap p;
bool valid = false;
if (mimeType == "image/png") {
valid = p.loadFromData(data, "PNG");
} else if (mimeType == "image/jpeg") {
valid = p.loadFromData(data, "JPG");
} else {
// Guess the filetype
valid = p.loadFromData(data);
}
// If the image was loaded succesfully set it!
if (valid) {
/*
* We want round avatars so create a new pixmap to draw
* the round avatar on and set a transparent background
*/
QPixmap avatar(p.width(), p.height());
avatar.fill(QColor(0,0,0,0));
// Initialise our painer
QPainter painter(&avatar);
painter.setRenderHint(QPainter::Antialiasing);
// Set to draw only a cricle
QPainterPath path;
path.addEllipse(0,0,p.width(),p.height());
painter.setClipPath(path);
// Draw the round avatar
painter.drawPixmap(0,0,p.width(),p.width(),p);
// Set the avatar
_ui->avatar->setPixmap(avatar);
// Remove the stylesheet
_ui->avatar->setStyleSheet("");
}
}
void ShareWidget::on_deleteShareButton_clicked()
+9 -5
Ver Arquivo
@@ -48,7 +48,10 @@ class ShareWidget : public QWidget
Q_OBJECT
public:
explicit ShareWidget(QSharedPointer<Share> Share, bool isFile, QWidget *parent = 0);
explicit ShareWidget(QSharedPointer<Share> Share,
bool isFile,
AccountPtr account,
QWidget *parent = 0);
~ShareWidget();
QSharedPointer<Share> share() const;
@@ -65,12 +68,16 @@ private slots:
void slotShareDeleted();
void slotPermissionsSet();
void slotAvatarLoaded(const QByteArray &data, const QString &mimeType);
private:
void displayPermissions();
void loadAvatar();
Ui::ShareWidget *_ui;
QSharedPointer<Share> _share;
bool _isFile;
AccountPtr _account;
QAction *_permissionCreate;
QAction *_permissionUpdate;
@@ -104,12 +111,9 @@ private slots:
void searchForSharees();
void slotLineEditTextEdited(const QString &text);
void slotLineEditReturn();
void slotCompleterActivated(const QModelIndex & index);
void slotCompleterHighlighted(const QModelIndex & index);
void slotShareesReady();
void slotAdjustScrollWidgetSize();
void displayError(int code ,const QString &message);
private:
Ui::ShareUserGroupWidget *_ui;
@@ -123,7 +127,7 @@ private:
bool _resharingAllowed;
bool _isFile;
bool _disableCompleterActivated; // in order to avoid that we share the contents twice
ShareManager *_manager;
};
+1 -11
Ver Arquivo
@@ -41,23 +41,13 @@
<x>0</x>
<y>0</y>
<width>441</width>
<height>98</height>
<height>128</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3"/>
</widget>
</widget>
</item>
<item>
<widget class="QLabel" name="errorLabel">
<property name="text">
<string notr="true">Placeholder for Error text</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<layoutdefault spacing="6" margin="11"/>
+7
Ver Arquivo
@@ -31,6 +31,13 @@
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="avatar">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="sharedWith">
<property name="text">
+11 -11
Ver Arquivo
@@ -374,28 +374,28 @@ void SocketApi::command_SHARE(const QString& localFile, QIODevice* socket)
// if the folder isn't connected, don't open the share dialog
sendMessage(socket, message);
} else {
const QString localFileClean = QDir::cleanPath(localFile);
const QString file = localFileClean.mid(shareFolder->cleanPath().length()+1);
const QString file = QDir::cleanPath(localFile).mid(shareFolder->cleanPath().length()+1);
SyncFileStatus fileStatus = this->fileStatus(shareFolder, file);
// Verify the file is on the server (to our knowledge of course)
if (fileStatus.tag() != SyncFileStatus::STATUS_UPTODATE &&
if (fileStatus.tag() != SyncFileStatus::STATUS_SYNC &&
fileStatus.tag() != SyncFileStatus::STATUS_UPDATED) {
const QString message = QLatin1String("SHARE:NOTSYNCED:")+QDir::toNativeSeparators(localFile);
sendMessage(socket, message);
return;
}
const QString remotePath = shareFolder->remotePath() + QLatin1Char('/') + file;
const QString folderForPath = shareFolder->path();
const QString remotePath = shareFolder->remotePath() + localFile.right(localFile.count()-folderForPath.count()+1);
// Can't share root folder
if (remotePath == "/") {
if (QDir::cleanPath(remotePath) == "/") {
const QString message = QLatin1String("SHARE:CANNOTSHAREROOT:")+QDir::toNativeSeparators(localFile);
sendMessage(socket, message);
return;
}
SyncJournalFileRecord rec = dbFileRecord_capi(shareFolder, localFileClean);
SyncJournalFileRecord rec = dbFileRecord_capi(shareFolder, localFile);
bool allowReshare = true; // lets assume the good
if( rec.isValid() ) {
@@ -407,7 +407,7 @@ void SocketApi::command_SHARE(const QString& localFile, QIODevice* socket)
const QString message = QLatin1String("SHARE:OK:")+QDir::toNativeSeparators(localFile);
sendMessage(socket, message);
emit shareCommandReceived(remotePath, localFileClean, allowReshare);
emit shareCommandReceived(remotePath, localFile, allowReshare);
}
}
@@ -435,7 +435,7 @@ void SocketApi::command_SHARE_STATUS(const QString &localFile, QIODevice *socket
SyncFileStatus fileStatus = this->fileStatus(shareFolder, file);
// Verify the file is on the server (to our knowledge of course)
if (fileStatus.tag() != SyncFileStatus::STATUS_UPTODATE &&
if (fileStatus.tag() != SyncFileStatus::STATUS_SYNC &&
fileStatus.tag() != SyncFileStatus::STATUS_UPDATED) {
const QString message = QLatin1String("SHARE_STATUS:NOTSYNCED:")+QDir::toNativeSeparators(localFile);
sendMessage(socket, message);
@@ -621,7 +621,7 @@ SyncFileStatus SocketApi::fileStatus(Folder *folder, const QString& systemFileNa
case SyncResult::Success:
case SyncResult::Problem:
status.set(SyncFileStatus::STATUS_UPTODATE);
status.set(SyncFileStatus::STATUS_SYNC);
return status;
case SyncResult::Error:
@@ -636,7 +636,7 @@ SyncFileStatus SocketApi::fileStatus(Folder *folder, const QString& systemFileNa
}
} else if (type == CSYNC_FTW_TYPE_DIR) {
if (rec.isValid()) {
status.set(SyncFileStatus::STATUS_UPTODATE);
status.set(SyncFileStatus::STATUS_SYNC);
} else {
qDebug() << "Could not determine state for folder" << fileName << "will set STATUS_NEW";
status.set(SyncFileStatus::STATUS_NEW);
@@ -644,7 +644,7 @@ SyncFileStatus SocketApi::fileStatus(Folder *folder, const QString& systemFileNa
} else if (type == CSYNC_FTW_TYPE_FILE) {
if (rec.isValid()) {
if( FileSystem::getModTime(fi.absoluteFilePath()) == Utility::qDateTimeToTime_t(rec._modtime) ) {
status.set(SyncFileStatus::STATUS_UPTODATE);
status.set(SyncFileStatus::STATUS_SYNC);
} else {
if (rec._remotePerm.isNull() || rec._remotePerm.contains("W") ) {
status.set(SyncFileStatus::STATUS_EVAL);
-3
Ver Arquivo
@@ -78,9 +78,6 @@ QString SyncRunFileLog::instructionToStr( csync_instructions_e inst )
case CSYNC_INSTRUCTION_ERROR:
re = "INST_ERROR";
break;
case CSYNC_INSTRUCTION_TYPE_CHANGE:
re = "INST_TYPE_CHANGE";
break;
}
return re;
-19
Ver Arquivo
@@ -2,19 +2,6 @@
#include <QDebug>
#import <Cocoa/Cocoa.h>
@interface NotificationCenterDelegate : NSObject
@end
@implementation NotificationCenterDelegate
// Always show, even if app is active at the moment.
- (BOOL)userNotificationCenter:(NSUserNotificationCenter *)center
shouldPresentNotification:(NSUserNotification *)notification
{
Q_UNUSED(center);
Q_UNUSED(notification);
return YES;
}
@end
namespace OCC {
bool canOsXSendUserNotification()
@@ -28,12 +15,6 @@ void sendOsXUserNotification(const QString &title, const QString &message)
Class cuserNotificationCenter = NSClassFromString(@"NSUserNotificationCenter");
id userNotificationCenter = [cuserNotificationCenter defaultUserNotificationCenter];
static dispatch_once_t once;
dispatch_once(&once, ^{
id delegate = [[NotificationCenterDelegate alloc] init];
[userNotificationCenter setDelegate:delegate];
});
Class cuserNotification = NSClassFromString(@"NSUserNotification");
id notification = [[cuserNotification alloc] init];
[notification setTitle:[NSString stringWithUTF8String:title.toUtf8().data()]];
+2 -3
Ver Arquivo
@@ -76,7 +76,7 @@ void AbstractNetworkJob::setReply(QNetworkReply *reply)
void AbstractNetworkJob::setTimeout(qint64 msec)
{
//qDebug() << Q_FUNC_INFO << msec;
qDebug() << Q_FUNC_INFO << msec;
_timer.start(msec);
}
@@ -225,8 +225,7 @@ void AbstractNetworkJob::start()
const QUrl url = account()->url();
const QString displayUrl = QString( "%1://%2%3").arg(url.scheme()).arg(url.host()).arg(url.path());
QString parentMetaObjectName = parent() ? parent()->metaObject()->className() : "";
qDebug() << "!!!" << metaObject()->className() << "created for" << displayUrl << "+" << path() << parentMetaObjectName;
qDebug() << "!!!" << metaObject()->className() << "created for" << displayUrl << "+" << path();
}
void AbstractNetworkJob::slotTimeout()
+1
Ver Arquivo
@@ -56,6 +56,7 @@ AccountPtr Account::create()
Account::~Account()
{
qDebug() << "Account" << displayName() << "deleted";
delete _credentials;
delete _am;
}
+5 -10
Ver Arquivo
@@ -49,7 +49,6 @@ static const char skipUpdateCheckC[] = "skipUpdateCheck";
static const char updateCheckIntervalC[] = "updateCheckInterval";
static const char geometryC[] = "geometry";
static const char timeoutC[] = "timeout";
static const char chunkSizeC[] = "chunkSize";
static const char transmissionChecksumC[] = "transmissionChecksum";
static const char proxyHostC[] = "Proxy/host";
@@ -96,9 +95,11 @@ bool ConfigFile::setConfDir(const QString &value)
if( dirPath.isEmpty() ) return false;
QFileInfo fi(dirPath);
if ( !fi.exists() ) {
QDir().mkpath(dirPath);
fi.setFile(dirPath);
if ( !fi.exists() && !fi.isAbsolute() ) {
QDir::current().mkdir(dirPath);
QDir dir = QDir::current();
dir.cd(dirPath);
fi.setFile(dir.path());
}
if( fi.exists() && fi.isDir() ) {
dirPath = fi.absoluteFilePath();
@@ -121,12 +122,6 @@ int ConfigFile::timeout() const
return settings.value(QLatin1String(timeoutC), 300).toInt(); // default to 5 min
}
quint64 ConfigFile::chunkSize() const
{
QSettings settings(configFile(), QSettings::IniFormat);
return settings.value(QLatin1String(chunkSizeC), 5*1024*1024).toLongLong(); // default to 5 MiB
}
QString ConfigFile::transmissionChecksum() const
{
QSettings settings(configFile(), QSettings::IniFormat);
-1
Ver Arquivo
@@ -106,7 +106,6 @@ public:
void setOptionalDesktopNotifications(bool show);
int timeout() const;
quint64 chunkSize() const;
// send a checksum as a header along with the transmission or not.
// possible values:
+14 -35
Ver Arquivo
@@ -16,6 +16,7 @@
#include <QMutex>
#include <QDebug>
#include <QNetworkReply>
#include <QAuthenticator>
#include <QSettings>
#include <QInputDialog>
@@ -42,22 +43,6 @@ const char certifPasswdC[] = "certificatePasswd";
const char authenticationFailedC[] = "owncloud-authentication-failed";
} // ns
class HttpCredentialsAccessManager : public AccessManager {
public:
HttpCredentialsAccessManager(const HttpCredentials *cred, QObject* parent = 0)
: AccessManager(parent), _cred(cred) {}
protected:
QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData) Q_DECL_OVERRIDE {
QByteArray credHash = QByteArray(_cred->user().toUtf8()+":"+_cred->password().toUtf8()).toBase64();
QNetworkRequest req(request);
req.setRawHeader(QByteArray("Authorization"), QByteArray("Basic ") + credHash);
//qDebug() << "Request for " << req.url() << "with authorization" << QByteArray::fromBase64(credHash);
return AccessManager::createRequest(op, req, outgoingData);
}
private:
const HttpCredentials *_cred;
};
HttpCredentials::HttpCredentials()
: _ready(false)
{
@@ -122,7 +107,7 @@ void HttpCredentials::setAccount(Account* account)
QNetworkAccessManager* HttpCredentials::getQNAM() const
{
AccessManager* qnam = new HttpCredentialsAccessManager(this);
AccessManager* qnam = new AccessManager;
connect( qnam, SIGNAL(authenticationRequired(QNetworkReply*, QAuthenticator*)),
this, SLOT(slotAuthentication(QNetworkReply*,QAuthenticator*)));
@@ -176,10 +161,7 @@ void HttpCredentials::fetchFromKeychain()
}
bool HttpCredentials::stillValid(QNetworkReply *reply)
{
return ((reply->error() != QNetworkReply::AuthenticationRequiredError)
// returned if user or password is incorrect
&& (reply->error() != QNetworkReply::OperationCanceledError
|| !reply->property(authenticationFailedC).toBool()));
return (reply->error() != QNetworkReply::AuthenticationRequiredError);
}
void HttpCredentials::slotReadJobDone(QKeychain::Job *job)
@@ -249,15 +231,6 @@ void HttpCredentials::invalidateToken()
_account->clearCookieJar();
// let QNAM forget about the password
// This needs to be done later in the event loop because we might be called (directly or
// indirectly) from QNetworkAccessManagerPrivate::authenticationRequired, which itself
// is a called from a BlockingQueuedConnection from the Qt HTTP thread. And clearing the
// cache needs to synchronize again with the HTTP thread.
QTimer::singleShot(0, this, SLOT(clearQNAMCache()));
}
void HttpCredentials::clearQNAMCache()
{
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
_account->networkAccessManager()->clearAccessCache();
#else
@@ -307,12 +280,18 @@ void HttpCredentials::slotWriteJobDone(QKeychain::Job *job)
void HttpCredentials::slotAuthentication(QNetworkReply* reply, QAuthenticator* authenticator)
{
Q_UNUSED(authenticator)
// Because of issue #4326, we need to set the login and password manually at every requests
// Thus, if we reach this signal, those credentials were invalid and we terminate.
qDebug() << "Stop request: Authentication failed for " << reply->url().toString();
if (reply->property(authenticationFailedC).toBool()) {
qDebug() << "Authentication failed for " << reply->url().toString();
return;
}
// QNAM sends the user and password in latin-1, but the server expects UTF-8.
// So send mojibake on purpose
authenticator->setUser(QString::fromLatin1(user().toUtf8()));
authenticator->setPassword(QString::fromLatin1(password().toUtf8()));
// Set a property so we don't send the same password twice
reply->setProperty(authenticationFailedC, true);
reply->close();
}
} // namespace OCC
-1
Ver Arquivo
@@ -61,7 +61,6 @@ private Q_SLOTS:
void slotAuthentication(QNetworkReply*, QAuthenticator*);
void slotReadJobDone(QKeychain::Job*);
void slotWriteJobDone(QKeychain::Job*);
void clearQNAMCache();
protected:
QString _user;

Alguns arquivos não foram exibidos porque demasiados arquivos foram alterados neste diff Mostrar Mais