Comparar commits

..

9 Commits

Autor SHA1 Mensagem Data
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
167 arquivos alterados com 6382 adições e 7489 exclusões
+1
Ver Arquivo
@@ -7,6 +7,7 @@ CMakeLists.txt.user*
doc/_build/*
*.kate-swp
*.kdev4
win/
admin/win/nsi/l10n/pofiles/*.po
*.swp
*~$
-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
-22
Ver Arquivo
@@ -1,27 +1,5 @@
ChangeLog
=========
version 2.1.1 (release 2016-02-10)
* 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
* OS X: Fix the file system watcher ignoring unicode paths (#4424)
* Windows Installer: Update to NSIS 2.50, fixes possible DLL injection
* 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 "") #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
@@ -25,8 +25,6 @@ def extractDeps(macho):
deps = [macho]
otool = subprocess.Popen(['otool', '-L', macho], stdout=subprocess.PIPE)
for l in otool.communicate()[0].splitlines():
if 'is not an object file' in l:
return []
m = re.search(r'@[^\s]+', l)
if m:
path = resolvePath(m.group(0))
+22 -23
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',
]
@@ -249,38 +251,35 @@ def CopyPlugin(path, subdir):
commands.append(args)
return new_path
def CopyFramework(source_dylib):
parts = source_dylib.split(os.sep)
print "CopyFramework:", source_dylib
def CopyFramework(path):
parts = path.split(os.sep)
print "CopyFramework:", path
for i, part in enumerate(parts):
matchObj = re.match(r'(\w+\.framework)', part)
if matchObj:
full_path = os.path.join(frameworks_dir, *parts[i:-1])
framework = matchObj.group(1)
dylib_name = parts[-1]
source_path = os.path.join('/', *parts[:i+1])
dest_path = os.path.join(frameworks_dir, framework)
dest_dylib_path = os.path.join(frameworks_dir, *parts[i:-1])
break
if os.path.exists(dest_path):
print dest_path, "already exists, skipping copy..."
return os.path.join(dest_dylib_path, dylib_name)
args = ['mkdir', '-p', full_path]
commands.append(args)
args = ['ditto', '--arch=x86_64', path, full_path]
commands.append(args)
args = ['chmod', 'u+w', os.path.join(full_path, parts[-1])]
commands.append(args)
resources_dir = os.path.join(frameworks_dir, framework, "Resources")
args = ['mkdir', '-p', dest_dylib_path]
args = ['mkdir', resources_dir]
commands.append(args)
args = ['ditto', '--arch=x86_64', source_dylib, dest_dylib_path]
commands.append(args)
args = ['chmod', 'u+w', os.path.join(dest_dylib_path, parts[-1])]
commands.append(args)
args = ['ln', '-s', '5', os.path.join(dest_path, 'Versions', 'Current')]
commands.append(args)
args = ['ln', '-s', os.path.join('Versions', 'Current', dylib_name), os.path.join(dest_path, dylib_name)]
commands.append(args)
args = ['ln', '-s', os.path.join('Versions', 'Current', 'Resources'), os.path.join(dest_path, 'Resources')]
commands.append(args)
args = ['cp', '-r', os.path.join(source_path, 'Versions', '5', 'Resources'), os.path.join(dest_path, 'Versions', '5')]
args = ['chmod', 'u+w', resources_dir]
commands.append(args)
return os.path.join(dest_dylib_path, dylib_name)
info_plist = os.path.join(os.path.split(path)[0], '..', '..', 'Contents', 'Info.plist')
if not os.path.exists(info_plist):
info_plist = os.path.join(os.path.split(path)[0], 'Resources', 'Info.plist')
if os.path.exists(info_plist):
args = ['cp', '-r', info_plist, resources_dir]
commands.append(args)
return os.path.join(full_path, parts[-1])
def FixId(path, library_name):
id = '@executable_path/../Frameworks/%s' % library_name
-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 -2
Ver Arquivo
@@ -9,9 +9,8 @@ team_identifier="$3"
codesign -s "$identity" --force --preserve-metadata=entitlements --verbose=4 --deep "$src_app"
# Verify the signature
codesign -dv $src_app
codesign --verify -v $src_app
spctl -a -t exec -vv $src_app
codesign -dv $src_app
# Validate that the key used for signing the binary matches the expected TeamIdentifier
# needed to pass the SocketApi through the sandbox
@@ -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
-30
Ver Arquivo
@@ -1,30 +0,0 @@
#!/bin/bash
#
# This script creates a new windows toolchain repository in OBS.
# It only works for versions that do not yet exist.
#
# Make sure to adopt the variable stableversion.
# Set the new stable version accordingly:
stableversion=2.1
targetproject="isv:ownCloud:toolchains:mingw:win32:${stableversion}"
# Create the new repo
# get the xml build description of the stable repo
xml=`osc meta prj isv:ownCloud:toolchains:mingw:win32:stable`
stable_xml="${xml/stable/$stableversion}"
echo $stable_xml
echo $stable_xml | osc meta prj -F - ${targetproject}
# now copy all packages
packs=`osc ls isv:ownCloud:toolchains:mingw:win32:stable`
for pack in $packs
do
osc copypac isv:ownCloud:toolchains:mingw:win32:stable $pack $targetproject
done
-37
Ver Arquivo
@@ -1,37 +0,0 @@
FROM opensuse:42.1
MAINTAINER Daniel Molkentin <danimo@owncloud.com>
ENV TERM ansi
ENV HOME /root
ENV REFRESHED_AT 20160202
RUN zypper --non-interactive --gpg-auto-import-keys refresh
RUN zypper --non-interactive --gpg-auto-import-keys ar http://download.opensuse.org/repositories/windows:/mingw/openSUSE_42.1/windows:mingw.repo
RUN zypper --non-interactive --gpg-auto-import-keys ar http://download.opensuse.org/repositories/isv:ownCloud:toolchains:mingw:win32:2.1/openSUSE_Leap_42.1/isv:ownCloud:toolchains:mingw:win32:2.1.repo
RUN zypper --non-interactive --gpg-auto-import-keys install cmake make mingw32-cross-binutils mingw32-cross-cpp mingw32-cross-gcc \
mingw32-cross-gcc-c++ mingw32-cross-pkg-config mingw32-filesystem \
mingw32-headers mingw32-runtime site-config mingw32-libwebp \
mingw32-cross-libqt5-qmake mingw32-cross-libqt5-qttools mingw32-libqt5* \
mingw32-qt5keychain* mingw32-angleproject* \
mingw32-cross-nsis mingw32-libopenssl* \
mingw32-sqlite* kdewin-png2ico \
osslsigncode wget
# RPM depends on curl for installs from HTTP
RUN zypper --non-interactive --gpg-auto-import-keys install curl
# sudo needed for building as user
RUN zypper --non-interactive --gpg-auto-import-keys install sudo
# Use packaged UAC dependencies
RUN zypper --non-interactive --gpg-auto-import-keys install mingw32-cross-nsis-plugin-uac mingw32-cross-nsis-plugin-nsprocess
# Required for checksumming
RUN zypper --non-interactive --gpg-auto-import-keys install mingw32-zlib-devel
# Required for windres not to crash
RUN zypper --non-interactive --gpg-auto-import-keys install glibc-locale
CMD /bin/bash
+9 -9
Ver Arquivo
@@ -7,13 +7,13 @@ fi
useradd user -u ${2:-1000}
su - user << EOF
cd /home/user/$1
rm -rf build-win32
mkdir build-win32
cd build-win32
../admin/win/download_runtimes.sh
cmake .. -DCMAKE_TOOLCHAIN_FILE=../admin/win/Toolchain-mingw32-openSUSE.cmake -DWITH_CRASHREPORTER=ON
make -j4
make package
ctest .
cd /home/user/$1
rm -rf build-win32
mkdir build-win32
cd build-win32
../admin/win/download_runtimes.sh
cmake .. -DCMAKE_TOOLCHAIN_FILE=../admin/win/Toolchain-mingw32-openSUSE.cmake -DWITH_CRASHREPORTER=ON
make -j4
make package
ctest .
EOF
+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} をアンインストール"
+3 -3
Ver Arquivo
@@ -1,15 +1,15 @@
# Auto-generated - do not modify
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_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 "Ярлык на рабочем столе (перезапись существующего)"
+2 -2
Ver Arquivo
@@ -9,7 +9,6 @@ StrCpy $PageReinstall_NEW_Field_3 "Ne odstrani namestitve"
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Program je že nameščen"
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Izberite način namestitve programa ${APPLICATION_NAME}."
StrCpy $PageReinstall_OLD_Field_1 "Novejša različica programa ${APPLICATION_NAME} je že nameščena! Ni priporočljivo namestiti starejše. V kolikor želite vseeno nadaljevati z namestitvijo, prej odstranite obstoječo različico. Izberite opravilo in pritisnite gumb za nadaljevanje."
StrCpy $PageReinstall_SAME_Field_1 "Program ${APPLICATION_NAME} ${VERSION} je že nameščen.$\n$\nIzberite opravilo, ki ga želite izvesti in kliknite za nadaljevanje."
StrCpy $PageReinstall_SAME_Field_2 "Dodaj/Ponovno namesti programe"
StrCpy $PageReinstall_SAME_Field_3 "Odstrani ${APPLICATION_NAME}"
StrCpy $UNINSTALLER_APPDATA_TITLE "Odstrani ${APPLICATION_NAME}"
@@ -38,6 +37,7 @@ StrCpy $UAC_ERROR_ELEVATE "Ni mogo
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Namestilnik zahteva skrbniška dovoljenja."
StrCpy $INIT_INSTALLER_RUNNING "Namestilnik je že zagnan."
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Program za odstranjevanje namestitve zahteva skrbniška dovoljenja."
StrCpy $UAC_ERROR_LOGON_SERVICE "Storitev za prijavo ni zagnana. Opravilo je ustavljeno!"
StrCpy $INIT_UNINSTALLER_RUNNING "Program za odstranjevanje namestitve je že zagnan."
StrCpy $SectionGroup_Shortcuts "Bližnjice"
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} is already installed.$\r$\nSelect the operation you want to perform and click Next to continue."
StrCpy $UAC_ERROR_LOGON_SERVICE "Logon service is not running, aborting!"
+1 -1
Ver Arquivo
@@ -1,6 +1,6 @@
# Auto-generated - do not modify
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Mostrar notas de la versión"
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Se encontrarion ${APPLICATION_EXECUTABLE} proceso(s) que debe/n ser detenidos.$\"$\n$\"¿Quiere que el instalador lo haga por usted?"
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Se encontrarion ${APPLICATION_EXECUTABLE} proceso(s) que debe/n ser detenidos.$\"$\\n$\"¿Quiere que el instalador lo haga por usted?"
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Parando el proceso ${APPLICATION_EXECUTABLE}."
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Proceso a detener no encontrado!"
StrCpy $PageReinstall_NEW_Field_1 "Una versión anterior de ${APPLICATION_NAME} esta instalada en el sistema. Es recomendado que quite esta versión antes de instalar. Elija la operación a realizar y seleccione Siguiente para continuar."
+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 -6
Ver Arquivo
@@ -104,13 +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('$\\\\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;
+5 -56
Ver Arquivo
@@ -106,42 +106,6 @@ static bool _last_db_return_error(CSYNC* ctx) {
return ctx->statedb.lastReturnValue != SQLITE_OK && ctx->statedb.lastReturnValue != SQLITE_DONE && ctx->statedb.lastReturnValue != SQLITE_ROW;
}
/*
* This static method is needed because the type members of the two structs use
* different enum values. A direct comparion is not neccessarily correct.
*
* tmp is csync_file_stat_t
* fs is csync_vio_file_stat_t with this vio type:
* enum csync_vio_file_type_e {
* CSYNC_VIO_FILE_TYPE_UNKNOWN,
* CSYNC_VIO_FILE_TYPE_REGULAR,
* CSYNC_VIO_FILE_TYPE_DIRECTORY,
* CSYNC_VIO_FILE_TYPE_FIFO,
* CSYNC_VIO_FILE_TYPE_SOCKET,
* CSYNC_VIO_FILE_TYPE_CHARACTER_DEVICE,
* CSYNC_VIO_FILE_TYPE_BLOCK_DEVICE,
* CSYNC_VIO_FILE_TYPE_SYMBOLIC_LINK
* };
*
* csync_file_stat_t can be:
* CSYNC_FTW_TYPE_SKIP, CSYNC_FTW_TYPE_FILE
* CSYNC_FTW_TYPE_DIR, CSYNC_FTW_TYPE_SLINK
*/
static bool _csync_filetype_different( const csync_file_stat_t *tmp, const csync_vio_file_stat_t *fs)
{
if( !(tmp && fs)) return false;
if( tmp->type == CSYNC_FTW_TYPE_SKIP ) return true;
if( tmp->type == CSYNC_FTW_TYPE_DIR && fs->type != CSYNC_VIO_FILE_TYPE_DIRECTORY )
return true;
if( tmp->type == CSYNC_FTW_TYPE_FILE && fs->type != CSYNC_VIO_FILE_TYPE_REGULAR )
return true;
if( tmp->type == CSYNC_FTW_TYPE_SLINK && fs->type != CSYNC_VIO_FILE_TYPE_SYMBOLIC_LINK )
return true;
return false; // both are NOT different.
}
/* Return true if two mtime are considered equal
* We consider mtime that are one hour difference to be equal if they are one hour appart
@@ -308,12 +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 (_csync_filetype_different(tmp, fs)) {
st->child_modified = 1;
}
goto out;
}
if (ctx->current == LOCAL_REPLICA &&
@@ -338,12 +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 (_csync_filetype_different(tmp, fs)) {
st->child_modified = 1;
}
st->instruction = CSYNC_INSTRUCTION_EVAL;
goto out;
}
@@ -391,12 +343,10 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
}
/* translate the file type between the two stat types csync has. */
if( tmp && tmp->type == CSYNC_FTW_TYPE_FILE ) {
if( tmp && tmp->type == 0 ) {
tmp_vio_type = CSYNC_VIO_FILE_TYPE_REGULAR;
} else if( tmp && tmp->type == CSYNC_FTW_TYPE_DIR) {
} else if( tmp && tmp->type == 2 ) {
tmp_vio_type = CSYNC_VIO_FILE_TYPE_DIRECTORY;
} else if( tmp && tmp->type == CSYNC_FTW_TYPE_SLINK ) {
tmp_vio_type = CSYNC_VIO_FILE_TYPE_SYMBOLIC_LINK;
} else {
tmp_vio_type = CSYNC_VIO_FILE_TYPE_UNKNOWN;
}
@@ -429,7 +379,8 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
return -1;
}
if(tmp ) { /* tmp existing at all */
if ( _csync_filetype_different(tmp, fs)) {
if ((tmp->type == CSYNC_FTW_TYPE_DIR && fs->type != CSYNC_VIO_FILE_TYPE_DIRECTORY) ||
(tmp->type == CSYNC_FTW_TYPE_FILE && fs->type != CSYNC_VIO_FILE_TYPE_REGULAR)) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "WARN: file types different is not!");
st->instruction = CSYNC_INSTRUCTION_NEW;
goto out;
@@ -820,9 +771,7 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
* local stat function.
*/
if( d_name[0] == '.' ) {
if (strcmp(".sys.admin#recall#", d_name) != 0) { /* recall file shall not be ignored (#4420) */
dirent->flags |= CSYNC_VIO_FILE_FLAGS_HIDDEN;
}
dirent->flags |= CSYNC_VIO_FILE_FLAGS_HIDDEN;
}
if( res == 0) {
-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)
+56 -54
Ver Arquivo
@@ -28,6 +28,9 @@ Linux
4. (Optional) Call ``make install`` to install the client to the ``/usr/local/bin`` directory.
.. note:: This step requires the ``mingw32-cross-nsis`` packages be installed on
Windows.
Mac OS X
--------
@@ -60,17 +63,15 @@ To set up your build environment for development using HomeBrew_:
5. For compilation of the client, follow the :ref:`generic-build-instructions`.
6. Install the Packages_ package creation tool.
7. In the build directory, run ``admin/osx/create_mac.sh <build_dir>
6. In the build directory, run ``admin/osx/create_mac.sh <build_dir>
<install_dir>``. If you have a developer signing certificate, you can specify
its Common Name as a third parameter (use quotes) to have the package
signed automatically.
.. note:: Contrary to earlier versions, ownCloud 1.7 and later are packaged
as a ``pkg`` installer. Do not call "make package" at any time when
compiling for OS X, as this will build a disk image, and will not
work correctly.
.. note:: Contrary to earlier versions, ownCloud 1.7 and later are packaged
as a ``pkg`` installer. Do not call "make package" at any time when
compiling for OS X, as this will build a disk image, and will not
work correctly.
Windows Development Build
-----------------------
@@ -110,62 +111,64 @@ follow `Windows Installer Build (Cross-Compile)`_ instead.
6. Create the build directory::
mkdir client-build
cd client-build
mkdir client-build
cd client-build
7. Build the client::
cmake -G "MinGW Makefiles" ../client
mingw32-make
cmake -G "MinGW Makefiles" ../client
mingw32-make
.. note:: You can try using ninja to build in parallel using
``cmake -G Ninja ../client`` and ``ninja`` instead.
.. note:: Refer to the :ref:`generic-build-instructions` section for additional options.
.. note:: You can try using ninja to build in parallel using
``cmake -G Ninja ../client`` and ``ninja`` instead.
.. note:: Refer to the :ref:`generic-build-instructions` section for additional options.
The ownCloud binary will appear in the ``bin`` directory.
The ownCloud binary will appear in the ``bin`` directory.
Windows Installer Build (Cross-Compile)
---------------------------------------
Due to the large number of dependencies, building the client installer for Windows
is **currently only officially supported on openSUSE**, by using the MinGW cross compiler.
You can set up any currently supported version of openSUSE in a virtual machine if you do not
You can set up openSUSE 13.1, 13.2 or openSUSE Factory in a virtual machine if you do not
have it installed already.
In order to make setup simple, you can use the provided Dockerfile to build your own image.
To cross-compile:
1. Assuming you are in the root of the ownCloud Client's source tree, you can
build an image from this Dockerfile like this::
1. Add the following repository using YaST or ``zypper ar`` (adjust when using another openSUSE version)::
cd admin/win32/docker
docker build . -t ownCloud-client-win32:<version>
zypper ar https://build.opensuse.org/project/show/isv:ownCloud:toolchains:mingw:win32:stable
Replace ``<version>`` by the version of the client you are building, e.g.
|version| for the release of the client that this document describes.
If you do not wish to use docker, you can run the commands in ``RUN`` manually
in a shell, e.g. to create your own build environment in a virtual machine.
2. Install the cross-compiler packages and the cross-compiled dependencies::
.. note:: Docker images are specific to releases. This one refers to |version|.
Newer releases may have different dependencies, and thus require a later
version of the docker image! Always pick the docker image fitting your release
of ownCloud client!
zypper install cmake make mingw32-cross-binutils mingw32-cross-cpp mingw32-cross-gcc \
mingw32-cross-gcc-c++ mingw32-cross-pkg-config mingw32-filesystem \
mingw32-headers mingw32-runtime site-config mingw32-libwebp \
mingw32-cross-libqt5-qmake mingw32-cross-libqt5-qttools mingw32-libqt5*
2. From within the source tree Run the docker instance::
3. For the installer, install the NSIS installer package::
docker run ownCloud-client-win32:<version> -v "$PWD:/home/jenkins/client" \
admin/win32/docker/build.sh $(id -u)
zypper install mingw32-cross-nsis mingw32-cross-nsis-plugin-uac mingw32-cross-nsis-plugin-nsprocess
It will run the build, create an NSIS based installer, as well as run tests.
You will find the resulting binary in an newly created ``build-win32`` subfolder.
4. Follow the :ref:`generic-build-instructions`
If you do not wish to use docker, and ran the ``RUN`` commands above in a virtual machine,
you can run the indented commands in the lower section of ``build.sh`` manually in your
source tree.
.. note:: When building for Windows platforms, you must specify a special
toolchain file that enables cmake to locate the platform-specific tools. To add
this parameter to the call to cmake, enter
``-DCMAKE_TOOLCHAIN_FILE=../client/admin/win/Toolchain-mingw32-openSUSE.cmake``.
4. Finally, you should sign the installer to avoid warnings upon installation.
This requires a `Microsoft Authenticode`_ Certificate ``osslsigncode`` to sign the installer::
5. Build by running ``make``.
osslsigncode -pkcs12 $HOME/.codesign/packages.pfx -h sha256 \
.. note:: Using ``make package`` produces an NSIS-based installer, provided
the NSIS mingw32 packages are installed.
6. If you want to sign the installer, acquire a `Microsoft Authenticode`_ Certificate and install ``osslsigncode`` to sign the installer::
zypper install osslsigncode
7. Sign the package::
osslsigncode -pkcs12 $HOME/.codesign/packages.pfx -h sha1 \
-pass yourpass \
-n "ACME Client" \
-i "http://acme.com" \
@@ -176,7 +179,6 @@ In order to make setup simple, you can use the provided Dockerfile to build your
for ``-in``, use the URL to the time stamping server provided by your CA along with the Authenticode certificate. Alternatively,
you may use the official Microsoft ``signtool`` utility on Microsoft Windows.
If you're familiar with docker, you can use the version of ``osslsigncode`` that is part of the docker image.
.. _generic-build-instructions:
@@ -193,29 +195,30 @@ To build the most up to date version of the client:
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::
mkdir client-build
cd client-build
mkdir client-build
cd 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``
directories.
.. 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``,
where ``target`` is a private location, i.e. in parallel to your build
dir by specifying ``../install``.
.. 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``.
4. Call ``make``.
The owncloud binary will appear in the ``bin`` directory.
The owncloud binary will appear in the ``bin`` directory.
The following are known cmake parameters:
@@ -239,4 +242,3 @@ The following are known cmake parameters:
.. _Qt: http://www.qt.io/download
.. _`Microsoft Authenticode`: https://msdn.microsoft.com/en-us/library/ie/ms537361%28v=vs.85%29.aspx
.. _QtKeychain: https://github.com/frankosterfeld/qtkeychain
.. _Packages: http://s.sudre.free.fr/Software/Packages/about.html
-2
Ver Arquivo
@@ -288,5 +288,3 @@ epub_copyright = u'2013, The ownCloud developers'
# Include todos?
todo_include_todos = True
rst_epilog = '.. |version| replace:: %s' % version
-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()
@@ -1,6 +0,0 @@
#!/bin/sh
# this script creates a plugin for nemo, just be replacing
# all occurences of Nautilus with Nemo.
sed -i.org -e 's/autilus/emo/g' syncstate_nemo.py
+1 -1
Ver Arquivo
@@ -3,4 +3,4 @@
# this script replaces the line
# appname = 'ownCloud'
# with the correct branding name in the syncstate.py script
sed -i.org -e 's/appname\s*=\s*'"'"'ownCloud'"'/appname = '$1'/" syncstate.py
/usr/bin/sed -i.org -e 's/appname\s*=\s*'"'"'ownCloud'"'/appname = '$1'/" syncstate.py
@@ -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 -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();
+14 -5
Ver Arquivo
@@ -30,6 +30,7 @@ AccountState::AccountState(AccountPtr account)
, _state(AccountState::Disconnected)
, _connectionStatus(ConnectionValidator::Undefined)
, _waitingForNewCredentials(false)
, _credentialsFetchMode(Interactive)
{
qRegisterMetaType<AccountState*>("AccountState*");
@@ -44,6 +45,7 @@ AccountState::AccountState(AccountPtr account)
AccountState::~AccountState()
{
qDebug() << "Account state for account" << account()->displayName() << "deleted";
}
AccountPtr AccountState::account() const
@@ -83,7 +85,7 @@ void AccountState::setState(State state)
_connectionStatus = ConnectionValidator::Undefined;
_connectionErrors.clear();
} else if (oldState == SignedOut && _state == Disconnected) {
checkConnectivity();
checkConnectivity(Interactive);
}
}
@@ -144,7 +146,7 @@ void AccountState::tagLastSuccessfullETagRequest()
_timeSinceLastETagCheck.restart();
}
void AccountState::checkConnectivity()
void AccountState::checkConnectivity(CredentialFetchMode credentialsFetchMode)
{
if (isSignedOut() || _waitingForNewCredentials) {
return;
@@ -166,6 +168,7 @@ void AccountState::checkConnectivity()
return;
}
_credentialsFetchMode = credentialsFetchMode;
ConnectionValidator * conValidator = new ConnectionValidator(account());
_connectionValidator = conValidator;
connect(conValidator, SIGNAL(connectionResult(ConnectionValidator::Status,QStringList)),
@@ -259,7 +262,13 @@ void AccountState::slotCredentialsFetched(AbstractCredentials* credentials)
{
if (!credentials->ready()) {
// No exiting credentials found in the keychain
credentials->askFromUser();
if (_credentialsFetchMode == Interactive)
credentials->askFromUser();
else {
Logger::instance()->postOptionalGuiLog(tr("Reauthentication required"), tr("You need to re-login to continue using the account %1.").arg(_account->displayName()));
setState(SignedOut);
_waitingForNewCredentials = false;
}
return;
}
@@ -269,7 +278,7 @@ void AccountState::slotCredentialsFetched(AbstractCredentials* credentials)
// connection validation, even if it's currently running.
delete _connectionValidator;
checkConnectivity();
checkConnectivity(_credentialsFetchMode);
}
void AccountState::slotCredentialsAsked(AbstractCredentials* credentials)
@@ -286,7 +295,7 @@ void AccountState::slotCredentialsAsked(AbstractCredentials* credentials)
// connection validation, even if it's currently running.
delete _connectionValidator;
checkConnectivity();
checkConnectivity(_credentialsFetchMode);
}
std::unique_ptr<QSettings> AccountState::settings()
+3 -1
Ver Arquivo
@@ -59,6 +59,7 @@ public:
/// An error like invalid credentials where retrying won't help.
ConfigurationError
};
enum CredentialFetchMode { Interactive, NonInteractive };
/// The actual current connectivity status.
typedef ConnectionValidator::Status ConnectionStatus;
@@ -90,7 +91,7 @@ public:
/// Triggers a ping to the server to update state and
/// connection status and errors.
void checkConnectivity();
void checkConnectivity(CredentialFetchMode credentialsFetchMode);
/** Returns a new settings object for this account, already in the right groups. */
std::unique_ptr<QSettings> settings();
@@ -126,6 +127,7 @@ private:
ConnectionStatus _connectionStatus;
QStringList _connectionErrors;
bool _waitingForNewCredentials;
CredentialFetchMode _credentialsFetchMode;
QElapsedTimer _timeSinceLastETagCheck;
QPointer<ConnectionValidator> _connectionValidator;
};
+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 )
+2 -12
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*)),
@@ -271,7 +267,7 @@ void Application::slotCheckConnection()
// when the error is permanent.
if (state != AccountState::SignedOut
&& state != AccountState::ConfigurationError) {
accountState->checkConnectivity();
accountState->checkConnectivity(AccountState::NonInteractive);
}
}
@@ -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()
+4 -3
Ver Arquivo
@@ -28,7 +28,6 @@
#include "account.h"
#include "theme.h"
#include "cookiejar.h"
#include "owncloudgui.h"
#include "syncengine.h"
#include <keychain.h>
@@ -270,7 +269,9 @@ void ShibbolethCredentials::slotReadJobDone(QKeychain::Job *job)
void ShibbolethCredentials::showLoginWindow()
{
if (!_browser.isNull()) {
ownCloudGui::raiseDialog(_browser);
_browser->activateWindow();
_browser->raise();
// FIXME On OS X this does not raise properly
return;
}
@@ -285,7 +286,7 @@ void ShibbolethCredentials::showLoginWindow()
this, SLOT(onShibbolethCookieReceived(QNetworkCookie)), Qt::QueuedConnection);
connect(_browser, SIGNAL(rejected()), this, SLOT(slotBrowserRejected()));
ownCloudGui::raiseDialog(_browser);
_browser->show();
}
QList<QNetworkCookie> ShibbolethCredentials::accountCookies(Account* account)
+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) {
const int margins = aliasFm.height(); // same as 2*aliasMargin of paint
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);
}
+1 -1
Ver Arquivo
@@ -63,7 +63,7 @@ static void callback(
qstring.resize(pathLength);
CFStringGetCharacters(path, CFRangeMake(0, pathLength), reinterpret_cast<UniChar *>(qstring.data()));
paths.append(qstring.normalized(QString::NormalizationForm_C));
paths.append(qstring);
}
reinterpret_cast<FolderWatcherPrivate*>(clientCallBackInfo)->doNotifyParent(paths);
-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
+5 -26
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();
@@ -771,33 +771,12 @@ void ownCloudGui::slotShowShareDialog(const QString &sharePath, const QString &l
const auto accountState = folder->accountState();
ShareDialog *w = 0;
if (_shareDialogs.contains(localPath) && _shareDialogs[localPath]) {
qDebug() << Q_FUNC_INFO << "Raising share dialog" << sharePath << localPath;
w = _shareDialogs[localPath];
} else {
qDebug() << Q_FUNC_INFO << "Opening share dialog" << sharePath << localPath;
w = new ShareDialog(accountState->account(), sharePath, localPath, resharingAllowed);
w->getShares();
w->setAttribute( Qt::WA_DeleteOnClose, true );
_shareDialogs[localPath] = w;
connect(w, SIGNAL(destroyed(QObject*)), SLOT(slotRemoveDestroyedShareDialogs()));
}
qDebug() << Q_FUNC_INFO << "Opening share dialog" << sharePath << localPath;
ShareDialog *w = new ShareDialog(accountState->account(), sharePath, localPath, resharingAllowed);
w->getShares();
w->setAttribute( Qt::WA_DeleteOnClose, true );
raiseDialog(w);
}
void ownCloudGui::slotRemoveDestroyedShareDialogs()
{
QMutableMapIterator<QString, QPointer<ShareDialog> > it(_shareDialogs);
while (it.hasNext()) {
it.next();
if (! it.value() || it.value() == sender()) {
it.remove();
qDebug() << "REMOVED";
}
}
}
} // end namespace
-3
Ver Arquivo
@@ -31,7 +31,6 @@ class Folder;
class SettingsDialog;
class SettingsDialogMac;
class ShareDialog;
class Application;
class LogBrowser;
class AccountState;
@@ -78,7 +77,6 @@ public slots:
void slotOpenPath(const QString& path);
void slotAccountStateChanged();
void slotShowShareDialog(const QString &sharePath, const QString &localPath, bool resharingAllowed);
void slotRemoveDestroyedShareDialogs();
private slots:
void slotDisplayIdle();
@@ -101,7 +99,6 @@ private:
QMenu *_recentActionsMenu;
QVector<QMenu*> _accountMenus;
bool _qdbusmenuWorkaround;
QMap<QString, QPointer<ShareDialog> > _shareDialogs;
QAction *_actionLogin;
QAction *_actionLogout;
+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);
+2 -7
Ver Arquivo
@@ -151,7 +151,7 @@ void LinkShare::setPassword(const QString &password)
{
OcsShareJob *job = new OcsShareJob(_account);
connect(job, SIGNAL(shareJobFinished(QVariantMap, QVariant)), SLOT(slotPasswordSet(QVariantMap, QVariant)));
connect(job, SIGNAL(ocsError(int, QString)), SLOT(slotSetPasswordError(int,QString)));
connect(job, SIGNAL(ocsError(int, QString)), SLOT(slotOcsError(int, QString)));
job->setPassword(getId(), password);
}
@@ -175,11 +175,6 @@ void LinkShare::slotExpireDateSet(const QVariantMap&, const QVariant &value)
emit expireDateSet();
}
void LinkShare::slotSetPasswordError(int statusCode, const QString &message)
{
emit passwordSetError(statusCode, message);
}
ShareManager::ShareManager(AccountPtr account, QObject *parent)
: QObject(parent),
_account(account)
@@ -206,7 +201,7 @@ void ShareManager::slotLinkShareCreated(const QVariantMap &reply)
* meant that a share was password protected
*/
if (code == 403) {
emit linkShareRequiresPassword(message);
emit linkShareRequiresPassword();
return;
}
+1 -10
Ver Arquivo
@@ -195,13 +195,11 @@ signals:
void expireDateSet();
void publicUploadSet();
void passwordSet();
void passwordSetError(int statusCode, const QString &message);
private slots:
void slotPasswordSet(const QVariantMap&, const QVariant &value);
void slotPublicUploadSet(const QVariantMap&, const QVariant &value);
void slotExpireDateSet(const QVariantMap&, const QVariant &value);
void slotSetPasswordError(int statusCode, const QString &message);
private:
bool _passwordSet;
@@ -261,17 +259,10 @@ public:
signals:
void shareCreated(const QSharedPointer<Share> &share);
void linkShareCreated(const QSharedPointer<LinkShare> &share);
void linkShareRequiresPassword();
void sharesFetched(const QList<QSharedPointer<Share>> &shares);
void serverError(int code, const QString &message);
/** Emitted when creating a link share with password fails.
*
* @param message the error message reported by the server
*
* See createLinkShare().
*/
void linkShareRequiresPassword(const QString &message);
private slots:
void slotSharesFetched(const QVariantMap &reply);
void slotLinkShareCreated(const QVariantMap &reply);
+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);
+19 -38
Ver Arquivo
@@ -140,14 +140,13 @@ ShareLinkWidget::ShareLinkWidget(AccountPtr account,
connect(_manager, SIGNAL(sharesFetched(QList<QSharedPointer<Share>>)), SLOT(slotSharesFetched(QList<QSharedPointer<Share>>)));
connect(_manager, SIGNAL(linkShareCreated(QSharedPointer<LinkShare>)), SLOT(slotCreateShareFetched(const QSharedPointer<LinkShare>)));
connect(_manager, SIGNAL(linkShareRequiresPassword(QString)), SLOT(slotCreateShareRequiresPassword(QString)));
connect(_manager, SIGNAL(serverError(int, QString)), SLOT(slotServerError(int,QString)));
connect(_manager, SIGNAL(linkShareRequiresPassword()), SLOT(slotCreateShareRequiresPassword()));
connect(_manager, SIGNAL(serverError(int, QString)), SLOT(displayError(int, QString)));
}
void ShareLinkWidget::setExpireDate(const QDate &date)
{
_pi_date->startAnimation();
_ui->errorLabel->hide();
_share->setExpireDate(date);
}
@@ -171,6 +170,8 @@ ShareLinkWidget::~ShareLinkWidget()
void ShareLinkWidget::slotPasswordReturnPressed()
{
setPassword(_ui->lineEdit_password->text());
_ui->lineEdit_password->setText(QString());
_ui->lineEdit_password->setPlaceholderText(tr("Password Protected"));
_ui->lineEdit_password->clearFocus();
}
@@ -184,7 +185,6 @@ void ShareLinkWidget::setPassword(const QString &password)
{
_pi_link->startAnimation();
_pi_password->startAnimation();
_ui->errorLabel->hide();
_ui->checkBox_password->setEnabled(false);
_ui->lineEdit_password->setEnabled(false);
@@ -199,9 +199,6 @@ void ShareLinkWidget::setPassword(const QString &password)
void ShareLinkWidget::slotPasswordSet()
{
_ui->lineEdit_password->setText(QString());
_ui->lineEdit_password->setPlaceholderText(tr("Password Protected"));
/*
* When setting/deleting a password from a share the old share is
* deleted and a new one is created. So we need to refetch the shares
@@ -241,7 +238,6 @@ void ShareLinkWidget::slotSharesFetched(const QList<QSharedPointer<Share>> &shar
_ui->lineEdit_password->setEnabled(true);
_ui->checkBox_password->setChecked(true);
_ui->lineEdit_password->setPlaceholderText("********");
_ui->lineEdit_password->setText(QString());
_ui->lineEdit_password->show();
_ui->pushButton_setPassword->show();
} else {
@@ -282,8 +278,7 @@ void ShareLinkWidget::slotSharesFetched(const QList<QSharedPointer<Share>> &shar
connect(_share.data(), SIGNAL(publicUploadSet()), SLOT(slotPublicUploadSet()));
connect(_share.data(), SIGNAL(passwordSet()), SLOT(slotPasswordSet()));
connect(_share.data(), SIGNAL(shareDeleted()), SLOT(slotDeleteShareFetched()));
connect(_share.data(), SIGNAL(serverError(int, QString)), SLOT(slotServerError(int,QString)));
connect(_share.data(), SIGNAL(passwordSetError(int, QString)), SLOT(slotPasswordSetError(int,QString)));
connect(_share.data(), SIGNAL(serverError(int, QString)), SLOT(displayError(int, QString)));
break;
}
@@ -363,11 +358,14 @@ void ShareLinkWidget::slotCheckBoxShareLinkClicked()
{
qDebug() << Q_FUNC_INFO <<( _ui->checkBox_shareLink->checkState() == Qt::Checked);
if (_ui->checkBox_shareLink->checkState() == Qt::Checked) {
_pi_link->startAnimation();
/*
* Check the capabilities if the server requires a password for a share
* Ask for it directly
*/
if (_account->capabilities().sharePublicLinkEnforcePassword()) {
_pi_link->stopAnimation();
_ui->checkBox_password->setChecked(true);
_ui->checkBox_password->setEnabled(false);
_ui->checkBox_password->setText(tr("Public sh&aring requires a password"));
@@ -381,9 +379,7 @@ void ShareLinkWidget::slotCheckBoxShareLinkClicked()
return;
}
_pi_link->startAnimation();
_ui->checkBox_shareLink->setEnabled(false);
_ui->errorLabel->hide();
_manager->createLinkShare(_sharePath);
} else {
@@ -409,24 +405,18 @@ void ShareLinkWidget::slotCreateShareFetched(const QSharedPointer<LinkShare> sha
getShares();
}
void ShareLinkWidget::slotCreateShareRequiresPassword(const QString& message)
void ShareLinkWidget::slotCreateShareRequiresPassword()
{
// there needs to be a password
_pi_link->stopAnimation();
_pi_password->stopAnimation();
_pi_editing->stopAnimation();
_ui->checkBox_password->setChecked(true);
_ui->checkBox_password->setEnabled(false);
_ui->checkBox_password->setText(tr("Public sh&aring requires a password"));
_ui->lineEdit_password->setEnabled(true);
_ui->lineEdit_password->setFocus();
_ui->pushButton_copy->hide();
_ui->widget_shareLink->show();
_ui->checkBox_expire->setEnabled(false);
_ui->checkBox_editing->setEnabled(false);
if (!message.isEmpty()) {
_ui->errorLabel->setText(message);
_ui->errorLabel->show();
}
_passwordRequired = true;
@@ -489,7 +479,6 @@ void ShareLinkWidget::setPublicUpload(bool publicUpload)
{
_ui->checkBox_editing->setEnabled(false);
_pi_editing->startAnimation();
_ui->errorLabel->hide();
_share->setPublicUpload(publicUpload);
}
@@ -513,24 +502,11 @@ void ShareLinkWidget::setShareCheckBoxTitle(bool haveShares)
}
void ShareLinkWidget::slotServerError(int code, const QString &message)
void ShareLinkWidget::displayError(int code, const QString &message)
{
_pi_link->stopAnimation();
_pi_date->stopAnimation();
_pi_password->stopAnimation();
_pi_editing->stopAnimation();
qDebug() << "Error from server" << code << message;
displayError(message);
}
void ShareLinkWidget::slotPasswordSetError(int code, const QString &message)
{
slotServerError(code, message);
_ui->checkBox_password->setEnabled(true);
_ui->lineEdit_password->setEnabled(true);
_ui->lineEdit_password->setFocus();
const QString arg = QString("%1, %2").arg(code).arg(message);
const QString errMsg = tr("OCS API error code: %1").arg(arg);
displayError(errMsg);
}
void ShareLinkWidget::displayError(const QString& errMsg)
@@ -539,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);
}
}
+3 -3
Ver Arquivo
@@ -56,7 +56,7 @@ public:
private slots:
void slotSharesFetched(const QList<QSharedPointer<Share>> &shares);
void slotCreateShareFetched(const QSharedPointer<LinkShare> share);
void slotCreateShareRequiresPassword(const QString& message);
void slotCreateShareRequiresPassword();
void slotDeleteShareFetched();
void slotPasswordSet();
void slotExpireSet();
@@ -70,11 +70,11 @@ private slots:
void slotCheckBoxEditingClicked();
void slotPublicUploadSet();
void slotServerError(int code, const QString &message);
void slotPasswordSetError(int code, const QString &message);
void displayError(int code, const QString &message);
private:
void setShareCheckBoxTitle(bool haveShares);
void displayError(int code);
void displayError(const QString& errMsg);
void setShareLink( const QString& url );
void resizeEvent(QResizeEvent *e);

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