1
0
mirror of https://github.com/chylex/Nextcloud-Desktop.git synced 2026-04-05 22:34:18 +02:00

Compare commits

...

57 Commits

Author SHA1 Message Date
Klaas Freitag
38ef525d5e Push version to final 1.8.0 2015-03-16 15:28:58 +01:00
Jenkins for ownCloud
367b1fcc33 [tx-robot] updated from transifex 2015-03-16 02:18:44 -04:00
Jenkins for ownCloud
f5c930968e [tx-robot] updated from transifex 2015-03-14 02:18:44 -04:00
Jocelyn Turcotte
5264a8c7f6 shell_integration: Fix disappearing context menus on Windows #2898
Since each new connection to the socket API would trigger a broadcast
of REGISTER_PATH to all existing connections, opening the context menu
would trigger a SHChangeNotify call of the root directory through
the overlay icon extension, which is currently also connected to the
socket API, waiting for changes.

Fix the issue by sending the initial REGISTER_PATH automatic response
only to the connecting socket.
2015-03-13 20:53:59 +01:00
Markus Goetz
6c4b7f1479 OS X: Always return 0 from pre_install.sh 2015-03-13 16:35:44 +01:00
Markus Goetz
c42c9f0002 Propagator: Add comment 2015-03-13 15:48:35 +01:00
Christian Kamm
95f299f865 Remote folder wizard: Add optional manual entry #2613 2015-03-13 09:52:21 +01:00
Jenkins for ownCloud
09749e2c7f [tx-robot] updated from transifex 2015-03-13 02:18:46 -04:00
Carla Schroder
dc33784a76 spelling corrections 2015-03-12 09:48:00 -07:00
Carla Schroder
961df1fc44 fix server side permissions table 2015-03-12 09:46:27 -07:00
Jocelyn Turcotte
e93c1ccb73 Install the crash handler earlier during startup
This moves the crash handler installation during the OCC::Application
contruction. This still leaves a window where crashes wouldn't be
caught, leaving the QtSingleApplication and theme initialization
code unreported, but isn't requiring any refactoring for now.

Issue #2952
2015-03-12 17:16:05 +01:00
Klaas Freitag
286ad0c478 Doc: Formatting fixes 2015-03-12 16:59:12 +01:00
Klaas Freitag
e30970ff90 Some ChangeLog corrections. 2015-03-12 16:49:41 +01:00
Daniel Molkentin
14e0e4a072 Win32: More reserved file names to ignore, including Recycle Bin
Addresses #2955
2015-03-12 16:25:32 +01:00
Jocelyn Turcotte
60da0a15e6 shell_integration: Remove the incorrect usage of the MIIM_BITMAP flag
This flag should only be specified if the hbmpItem member of the
MENUITEMINFO has been set.
2015-03-12 15:22:29 +01:00
Jocelyn Turcotte
0f84510e6f Fix the build with GCC 4.7
Disable bitfields completely in SyncFileItem with that compiler.
2015-03-12 14:54:11 +01:00
Christian Kamm
1dd3488973 Uploads: Fix big seeks on Windows. #2954 2015-03-12 13:18:08 +01:00
Klaas Freitag
12e5306947 Set version postfix to rc1 2015-03-12 11:21:23 +01:00
Christian Kamm
9249d6c2f9 Logging: Print instruction when job completed. 2015-03-12 10:26:44 +01:00
Christian Kamm
d0f07ee3a9 FolderMan: fix folderSyncStateChange emission. #2896
It was not emitted when a removed folder finished its sync,
and that left the UI in an old state sometimes.

Removing the Folder explicitly is unnecessary as a QSignalMapper
will automatically remove mappings for deleted QObjects.
2015-03-12 10:00:45 +01:00
Christian Kamm
3992fba168 Activity: Set a message for conflicts. #2792
Also show size when conflicting files are downloaded.
2015-03-12 10:00:45 +01:00
Daniel Molkentin
4601ac8b0e Remove unused (and partly binary!) NSIS artifacts 2015-03-12 09:29:48 +01:00
Jenkins for ownCloud
a81b0db2a8 [tx-robot] updated from transifex 2015-03-12 02:18:36 -04:00
Jocelyn Turcotte
d88751bb8b shell_integrations: Fix the precompiled headers usage in OCUtil
Enable it in all configurations and add the missing include.
2015-03-11 22:17:46 +01:00
Markus Goetz
f13dfc19a0 OS X: Fix UI glitches related to sync folder
For #2113 and #2947
2015-03-11 16:42:12 +01:00
Jocelyn Turcotte
0fccf5e50d Completely disable the crash handler if the user disabled it
The config currently only disable the reporter, but still leaves
the crash handler installed on startup. This causes conflicts
when running those builds in lldb.

Work around the issue by requiring the crash reporter to be
disabled in the settings before owncloud can be run in lldb.
This has the negative side-effect of not covering the
initial ConfigFile loading with the crash handler.

Issue #2946
2015-03-11 15:49:49 +01:00
Klaas Freitag
a2aab28ba6 ShareDialog: Connect the proper DateEdit signal. 2015-03-11 15:46:05 +01:00
Klaas Freitag
8e7b7caf04 ShareDialog: If the password is empty, disable button 2015-03-11 14:57:55 +01:00
Klaas Freitag
8cc5ff0e70 ShareDialog: Consider if resharing is not allowed on a share.
If a file or directory is shared without resharing permission, the
share dialog displays an error. This is not the optimal solution, but
best for now, as we do not have the permissions available for the file
manager plugin.

This fixes #2923
2015-03-11 14:12:08 +01:00
Klaas Freitag
9086f09fe2 SocketAPI: If filename has a trailing slash, remove it.
The SyncJournal stores the the names of directories without trailing slash.
2015-03-11 14:11:18 +01:00
Klaas Freitag
5a6eecd694 doc: Added snippet about custom WebDAV properties. 2015-03-11 14:11:18 +01:00
Christian Kamm
efe9f1b442 Lnk: Work around QFile::rename() #2792
QFile::rename() fails if the source file is a shortcut to a file
or directory that does not exist.
2015-03-11 12:29:33 +01:00
Jocelyn Turcotte
db7919dc2f Shrink sizeof(SyncFileItem) by 20%
Move all small fields together in the struct and make them use bitfields.
Also remove the unused log::_other_remotePerm field.
2015-03-11 11:49:11 +01:00
Olivier Goffart
4a01644625 Disable parallel uploads for server versions <= 8.0.2
Issue #2938
2015-03-11 11:31:51 +01:00
Jenkins for ownCloud
1ca68140f6 [tx-robot] updated from transifex 2015-03-11 02:18:42 -04:00
Klaas Freitag
071177cee2 Output a more sensible error message for auth errors 2015-03-10 12:14:14 +01:00
Klaas Freitag
c88742fad3 Revert "SetupW: Display proper error messages if password or user was wrong."
This reverts commit 396f38598f.

This adds redundant code and potentially breaks Shibboleth
2015-03-10 11:17:35 +01:00
Jenkins for ownCloud
791a0fd01e [tx-robot] updated from transifex 2015-03-10 02:18:50 -04:00
Markus Goetz
3b12b9d81d Revert "Propagator: Delete job on finish"
Needs a bit more thinking.

This reverts commit 8746914f3b.
2015-03-09 16:19:16 +01:00
Markus Goetz
31e4009737 Propagator: Use QBA for responseTimestamp instead of QString 2015-03-09 15:52:52 +01:00
Markus Goetz
8746914f3b Propagator: Delete job on finish 2015-03-09 15:41:43 +01:00
Klaas Freitag
2fa6839ac7 Make win32 build work again. 2015-03-09 15:14:55 +01:00
Klaas Freitag
b09e08c06f ShareDialog: Made it less "webbish" for better usability.
- Check the share checkbox automatically on open of the dialog
- Use the date picker with popping up calendar
- Proper initial size
- no resizing and appearing and disappearing.

Fixes probably #2917, also #2764
2015-03-09 14:33:02 +01:00
Jenkins for ownCloud
659f5ad301 [tx-robot] updated from transifex 2015-03-09 02:18:47 -04:00
Jenkins for ownCloud
6fe7f01a8d [tx-robot] updated from transifex 2015-03-07 02:18:24 -05:00
Jocelyn Turcotte
99f51998f2 Fix a crash in the crash reporter on OSX
The install_name of dependent libraries need to be updated
like we do for cmd and gui.
2015-03-06 19:28:53 +01:00
Jocelyn Turcotte
4c13992f5d Add a gen_sym_files script for OSX
This attempts to replicate what i686-w64-mingw32-gen_sym_files
is doing for us with MinGW by parsing the output of otool -L
to get the library name actually used by the executable.
2015-03-06 19:28:53 +01:00
Klaas Freitag
396f38598f SetupW: Display proper error messages if password or user was wrong.
If the password or user was wrong during setup, the client showed a
ConnectionClosed error instead of a proper Username or password wrong
message. This was because in HTTPCredentials::slotAuthentication, the
reply is closed, and a property is set to indicate the auth problem.

This patch now checks at all occurences of networkErrors if it might
have been an authentication problem, and displays something useful.

There is a good chance that this is a sufficient fix for
owncloud/enterprise#556
2015-03-06 16:41:59 +01:00
Klaas Freitag
b6e24cbd45 Push version to beta3 2015-03-06 16:41:59 +01:00
Klaas Freitag
d2848b9c26 Theme: Return the correct version string from version() 2015-03-06 16:41:59 +01:00
Daniel Molkentin
227ed8ae07 win32: libproxy is not needed 2015-03-06 15:47:15 +01:00
Markus Goetz
b622981b23 SyncEngine: Show a debug msg only when relevant 2015-03-06 09:28:50 +01:00
Jenkins for ownCloud
36e14cfc69 [tx-robot] updated from transifex 2015-03-06 02:18:35 -05:00
Markus Goetz
668de9bf31 Propagate: Don't retry direct download on abort 2015-03-05 21:56:39 +01:00
Markus Goetz
3f712dce02 ETags: For Folder and RequestEtagJob, always use Concatenation 2015-03-05 17:49:12 +01:00
Markus Goetz
2eaeaf33fa Discovery: Change abort code a bit
Now pressing pause in the UI will not show an error to the user.
2015-03-05 16:50:33 +01:00
Jenkins for ownCloud
8e21d612d8 [tx-robot] updated from transifex 2015-03-05 02:18:52 -05:00
83 changed files with 1175 additions and 5218 deletions

View File

@@ -1,6 +1,6 @@
ChangeLog
=========
version 1.8.0 (release 2015-02-xx)
version 1.8.0 (release 2015-03-xx)
* Mac OS: HIDPI support
* Support Sharing from desktop: Added a share dialog that can be
opened by context menu in the file managers (Win, Mac, Nautilus)
@@ -12,7 +12,7 @@ version 1.8.0 (release 2015-02-xx)
* Added ability to build on Windows utilizing MingGW
* SQLite database fixes if running on FAT filesystems
* Improved detection of changing files to upload from local
* Preparations for the muli-account feature
* Preparations for the multi-account feature
* Fixed experience for Window manager without system tray
* Build with Qt 5.4
* Dropped libneon dependency if Qt 5.4 is available
@@ -24,8 +24,7 @@ version 1.8.0 (release 2015-02-xx)
* Prepared direct download
* Added Crashreporter feature to be switched on on demand
* A huge amount of bug fixes in all areas of the client.
* more than 7000 commits since 1.7.0
* almost 700 commits since 1.7.1
version 1.7.1 (release 2014-12-18)
* Documentation fixes and updates

View File

@@ -4,7 +4,7 @@ set( MIRALL_VERSION_PATCH 0 )
set( MIRALL_SOVERSION 0 )
if ( NOT DEFINED MIRALL_VERSION_SUFFIX )
set( MIRALL_VERSION_SUFFIX "beta2") #e.g. beta1, beta2, rc1
set( MIRALL_VERSION_SUFFIX "") #e.g. beta1, beta2, rc1
endif( NOT DEFINED MIRALL_VERSION_SUFFIX )
if( NOT DEFINED MIRALL_VERSION_BUILD )

75
admin/osx/gen_sym_files.py Executable file
View File

@@ -0,0 +1,75 @@
#!/usr/bin/env python
import logging, os, re, subprocess, sys
import os.path
import pdb, pprint
if len(sys.argv) < 4:
print("Usage:")
print("\tgen_sym_files.py <path to breakpad's dump_syms> <path to owncloud.app> <symbol output dir>")
print("")
print("Symbols will be created in './symbols'")
sys.exit(1)
dump_symsPath = sys.argv[1]
bundlePath = sys.argv[2]
outPath = sys.argv[3]
macOsDir = os.path.join(bundlePath, 'Contents', 'MacOS')
pluginsDir = os.path.join(bundlePath, 'Contents', 'PlugIns')
def resolvePath(input):
resolved = re.sub(r'@\w+', macOsDir, input)
return os.path.normpath(resolved)
def extractDeps(macho):
deps = [macho]
otool = subprocess.Popen(['otool', '-L', macho], stdout=subprocess.PIPE)
for l in otool.communicate()[0].splitlines():
m = re.search(r'@[^\s]+', l)
if m:
path = resolvePath(m.group(0))
if not os.path.exists(path):
logging.warning("Non-existant file found in dependencies, ignoring: [%s]", path)
continue
deps.append(path)
return deps
def findDeps():
deps = []
for f in os.listdir(macOsDir):
path = os.path.join(macOsDir, f)
if not os.path.islink(path):
deps += extractDeps(path)
for root, dirs, files in os.walk(pluginsDir):
for f in files:
path = os.path.join(root, f)
deps += extractDeps(path)
return sorted(set(deps))
def dumpSyms(deps):
for dep in deps:
print("Generating symbols for [%s]" % dep)
with open('temp.sym', 'w') as temp:
subprocess.check_call([dump_symsPath, dep], stdout=temp)
with open('temp.sym', 'r') as temp:
header = temp.readline()
fields = header.split()
key, name = fields[3:5]
destDir = '%s/%s/%s/' % (outPath, name, key)
destPath = destDir + name + '.sym'
if os.path.exists(destPath):
logging.warning("Symbols already exist: [%s]", destPath)
continue
if not os.path.exists(destDir):
os.makedirs(destDir)
os.rename('temp.sym', destPath)
def strip(deps):
for dep in deps:
print("Stripping symbols off [%s]" % dep)
subprocess.check_call(['strip', '-S', dep])
print('=== Generating symbols for [%s] in [%s]' % (bundlePath, outPath))
deps = findDeps()
dumpSyms(deps)
strip(deps)

View File

@@ -6,3 +6,4 @@ killall @APPLICATION_EXECUTABLE@
# Unload the Finder plugin. see issue #2105
killall Finder
exit 0

View File

@@ -1,35 +0,0 @@
{\rtf1\ansi\ansicpg1252\uc1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f39\fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Verdana;}
{\f172\froman\fcharset238\fprq2 Times New Roman CE;}{\f173\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f175\froman\fcharset161\fprq2 Times New Roman Greek;}{\f176\froman\fcharset162\fprq2 Times New Roman Tur;}
{\f177\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f178\froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f179\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f180\froman\fcharset163\fprq2 Times New Roman (Vietnamese);}
{\f562\fswiss\fcharset238\fprq2 Verdana CE;}{\f563\fswiss\fcharset204\fprq2 Verdana Cyr;}{\f565\fswiss\fcharset161\fprq2 Verdana Greek;}{\f566\fswiss\fcharset162\fprq2 Verdana Tur;}{\f569\fswiss\fcharset186\fprq2 Verdana Baltic;}
{\f570\fswiss\fcharset163\fprq2 Verdana (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;
\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{
\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 Normal;}{\*\cs10 \additive \ssemihidden Default Paragraph Font;}{\*
\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv
\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}{\*\cs15 \additive \ul\cf2 \sbasedon10 \styrsid7485074 Hyperlink;}}
{\*\latentstyles\lsdstimax156\lsdlockeddef0}{\*\rsidtbl \rsid6712196\rsid7485074\rsid11352300\rsid15940516}{\*\generator Microsoft Word 11.0.5604;}{\info{\title Processes v1}{\author Hardwired}{\operator Hardwired}{\creatim\yr2004\mo12\dy12\hr23\min42}
{\revtim\yr2004\mo12\dy12\hr23\min51}{\version2}{\edmins9}{\nofpages1}{\nofwords80}{\nofchars458}{\nofcharsws537}{\vern24689}}\widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180
\dgvspace180\dghorigin1800\dgvorigin1440\dghshow1\dgvshow1
\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct
\asianbrkrule\rsidroot7485074\newtblstyruls\nogrowautofit \fet0\sectd \linex0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}
{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}
{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain
\qj \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7485074 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\b\f39\insrsid7485074\charrsid7485074 Processes v1.0}{\f39\insrsid7485074\charrsid7485074 .0.1
\par }{\f39\fs20\insrsid7485074
\par }\pard \qj \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15940516 {\f39\fs20\insrsid15940516 This software binaries and source-code are free for any kind of use, including commercial use. }{
\f39\fs20\insrsid7485074\charrsid7485074 There is no restriction and no guaranty for using}{\f39\fs20\insrsid7485074\charrsid7485074 t}{\f39\fs20\insrsid7485074\charrsid7485074 his software}{\f39\fs20\insrsid7485074\charrsid7485074 and/or it
s source-code. }{\f39\fs20\insrsid15940516
\par I}{\f39\fs20\insrsid7485074\charrsid7485074 f you use the plug}{\f39\fs20\insrsid7485074\charrsid7485074 -}{\f39\fs20\insrsid7485074\charrsid7485074 in }{\f39\fs20\insrsid7485074\charrsid7485074 and/}{\f39\fs20\insrsid7485074\charrsid7485074 or it}{
\f39\fs20\insrsid7485074\charrsid7485074 s}{\f39\fs20\insrsid7485074\charrsid7485074 source-code, I would }{\f39\fs20\insrsid7485074\charrsid7485074 appreciate }{\f39\fs20\insrsid7485074\charrsid7485074 if my name is mentioned.}{
\f39\fs20\insrsid7485074\charrsid7485074
\par }\pard \qj \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7485074 {\f39\fs20\insrsid7485074\charrsid7485074
\par }{\b\f39\fs20\insrsid7485074\charrsid7485074 Andrei Ciubotaru [Hardwired]
\par }{\f39\fs20\insrsid7485074\charrsid7485074 Lead Developer ICode&Ideas SRL (}{\field\flddirty{\*\fldinst {\f39\fs20\insrsid7485074\charrsid7485074 HYPERLINK "http://www.icode.ro/" }{\f39\fs20\insrsid7485074\charrsid7485074 {\*\datafield
00d0c9ea79f9bace118c8200aa004ba90b02000000170000001500000068007400740070003a002f002f007700770077002e00690063006f00640065002e0072006f002f000000e0c9ea79f9bace118c8200aa004ba90b2a00000068007400740070003a002f002f007700770077002e00690063006f00640065002e007200
6f002f000000}}}{\fldrslt {\cs15\f39\fs20\ul\cf2\insrsid7485074\charrsid7485074 http://www.icode.ro/}}}{\f39\fs20\insrsid7485074\charrsid7485074 )
\par }{\field{\*\fldinst {\f39\fs20\insrsid7485074 HYPERLINK "hardwiredteks@gmail.com" }{\f39\fs20\insrsid15940516\charrsid7485074 {\*\datafield
00d0c9ea79f9bace118c8200aa004ba90b02000000010000000303000000000000c00000000000004600001800000068617264776972656474656b7340676d61696c2e636f6d00ffffadde000000000000000000000000000000000000000000000000}}}{\fldrslt {
\cs15\f39\fs20\ul\cf2\insrsid7485074\charrsid7485074 hardwiredteks@gmail.com}}}{\f39\fs20\insrsid7485074\charrsid7485074 , }{\field{\*\fldinst {\f39\fs20\insrsid7485074 HYPERLINK "hardwired@icode.ro" }{\f39\fs20\insrsid15940516\charrsid7485074
{\*\datafield 00d0c9ea79f9bace118c8200aa004ba90b02000000010000000303000000000000c0000000000000460000130000006861726477697265644069636f64652e726f00ffffadde000000000000000000000000000000000000000000000000}}}{\fldrslt {
\cs15\f39\fs20\ul\cf2\insrsid7485074\charrsid7485074 hardwired@icode.ro}}}{\f39\fs20\insrsid7485074\charrsid7485074
\par }}

View File

@@ -1,122 +0,0 @@
----------------------------------------------------------------
----------------------------------------------------------------
Processes (Processes.dll)
Version: 1.0.1.0
Release: 24.february.2005
Description: Nullsoft Installer (NSIS) plug-in for managing?!
Windows processes.
Copyright: © 2004-2005 Hardwired. No rights reserved.
There is no restriction and no guaranty for using
this software.
Author: Andrei Ciubotaru [Hardwired]
Lead Developer ICode&Ideas SRL (http://www.icode.ro/)
hardwiredteks@gmail.com, hardwired@icode.ro
----------------------------------------------------------------
----------------------------------------------------------------
INTRODUCTION
The Need For Plug-in - I need it for the one of my installers.
Briefly: Use it when you need to find\kill a process when
installing\uninstalling some application. Also, use it when you
need to test the presence of a device driver.
SUPPORT
Supported platforms are: WinNT,Win2K,WinXP and Win2003 Server.
DESCRIPTION
Processes::FindProcess <process_name> ;without ".exe"
Searches the currently running processes for the given
process name.
return: 1 - the process was found
0 - the process was not found
Processes::KillProcess <process_name> ; without ".exe"
Searches the currently running processes for the given
process name. If the process is found then the it gets
killed.
return: 1 - the process was found and killed
0 - the process was not found or the process
cannot be killed (insuficient rights)
Processes::FindDevice <device_base_name>
Searches the installed devices drivers for the given
device base name.
(important: I said BASE NAME not FILENAME)
return: 1 - the device driver was found
0 - the device driver was not found
USAGE
First of all, does not matter where you use it. Ofcourse, the
routines must be called inside of a Section/Function scope.
Processes::FindProcess "process_name"
Pop $R0
StrCmp $R0 "1" make_my_day noooooo
make_my_day:
...
noooooo:
...
Processes::KillProcess "process_name"
Pop $R0
StrCmp $R0 "1" dead_meat why_wont_you_die
dead_meat:
...
why_wont_you_die:
...
Processes::FindDevice "device_base_name"
Pop $R0
StrCmp $R0 "1" blabla more_blabla
blabla:
...
more_blabla:
...
THANKS
Sunil Kamath for inspiring me. I wanted to use its FindProcDLL
but my requirements made it imposible.
Nullsoft for creating this very powerfull installer. One big,
free and full-featured (hmmm... and guiless for the moment) mean
install machine!:)
ME for being such a great coder...
... HAHAHAHAHAHAHA!
ONE MORE THING
If you use the plugin or it's source-code, I would apreciate
if my name is mentioned.
----------------------------------------------------------------
----------------------------------------------------------------

View File

@@ -1,8 +0,0 @@
// stdafx.cpp : source file that includes just the standard includes
// KillProcDLL.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
#include "stdafx.h"
// TODO: reference any additional headers you need in STDAFX.H
// and not in this file

View File

@@ -1,34 +0,0 @@
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#if !defined(AFX_STDAFX_H__780690DC_E128_403D_BC07_780D1B2CC101__INCLUDED_)
#define AFX_STDAFX_H__780690DC_E128_403D_BC07_780D1B2CC101__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#include <windows.h>
#include <string> // String management...
//From exam28.cpp
#include <tlhelp32.h>
//#include <iostream.h>
#ifdef BORLANDC
#include <string.h>
#include <ctype.h>
#endif
//To make it a NSIS Plug-In
#include "exdll.h"
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_STDAFX_H__780690DC_E128_403D_BC07_780D1B2CC101__INCLUDED_)

View File

@@ -1,37 +0,0 @@
#include <windows.h>
#include "exdll.h"
HINSTANCE g_hInstance;
HWND g_hwndParent;
void __declspec(dllexport) myFunction(HWND hwndParent, int string_size,
char *variables, stack_t **stacktop)
{
g_hwndParent=hwndParent;
EXDLL_INIT();
// note if you want parameters from the stack, pop them off in order.
// i.e. if you are called via exdll::myFunction file.dat poop.dat
// calling popstring() the first time would give you file.dat,
// and the second time would give you poop.dat.
// you should empty the stack of your parameters, and ONLY your
// parameters.
// do your stuff here
{
char buf[1024];
wsprintf(buf,"$0=%s\n",getuservariable(INST_0));
MessageBox(g_hwndParent,buf,0,MB_OK);
}
}
BOOL WINAPI _DllMainCRTStartup(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
{
g_hInstance=hInst;
return TRUE;
}

View File

@@ -1,136 +0,0 @@
#ifndef _EXDLL_H_
#define _EXDLL_H_
//
// only include this file from one place in your DLL.
// (it is all static, if you use it in two places it will fail)
//
#define EXDLL_INIT() { \
g_stringsize = string_size; \
g_stacktop = stacktop; \
g_variables = variables; }
//
// For page showing plug-ins
//
#define WM_NOTIFY_OUTER_NEXT (WM_USER+0x8)
#define WM_NOTIFY_CUSTOM_READY (WM_USER+0xd)
#define NOTIFY_BYE_BYE 'x'
typedef struct _stack_t
{
struct _stack_t *next;
char text[1]; // this should be the length of string_size
} stack_t;
static unsigned int g_stringsize;
static stack_t **g_stacktop;
static char *g_variables;
enum
{
INST_0, // $0
INST_1, // $1
INST_2, // $2
INST_3, // $3
INST_4, // $4
INST_5, // $5
INST_6, // $6
INST_7, // $7
INST_8, // $8
INST_9, // $9
INST_R0, // $R0
INST_R1, // $R1
INST_R2, // $R2
INST_R3, // $R3
INST_R4, // $R4
INST_R5, // $R5
INST_R6, // $R6
INST_R7, // $R7
INST_R8, // $R8
INST_R9, // $R9
INST_CMDLINE, // $CMDLINE
INST_INSTDIR, // $INSTDIR
INST_OUTDIR, // $OUTDIR
INST_EXEDIR, // $EXEDIR
INST_LANG, // $LANGUAGE
__INST_LAST
};
//
// utility functions (not required but often useful)
//
static int popstring( char *str )
{
stack_t *th;
if( !g_stacktop ||
!*g_stacktop )
return 1;
th = (*g_stacktop);
lstrcpy( str, th->text );
*g_stacktop = th->next;
GlobalFree( (HGLOBAL)th );
return 0;
}
static void pushstring( char *str )
{
stack_t *th;
if( !g_stacktop )
return;
th = (stack_t*)GlobalAlloc( GPTR, sizeof(stack_t) + g_stringsize );
lstrcpyn( th->text, str, g_stringsize );
th->next = *g_stacktop;
*g_stacktop = th;
}
static char *getuservariable( int varnum )
{
if( varnum < 0 ||
varnum >= __INST_LAST )
return NULL;
return (g_variables + varnum*g_stringsize);
}
static void setuservariable( int varnum, char *var )
{
if( var != NULL &&
varnum >= 0 &&
varnum < __INST_LAST )
lstrcpy( g_variables + varnum*g_stringsize, var );
}
#endif//_EXDLL_H_

View File

@@ -1,411 +0,0 @@
#include "stdafx.h"
#include "processes.h"
#include "string.h"
//-------------------------------------------------------------------------------------------
// global variables
lpfEnumProcesses EnumProcesses;
lpfEnumProcessModules EnumProcessModules;
lpfGetModuleBaseName GetModuleBaseName;
lpfEnumDeviceDrivers EnumDeviceDrivers;
lpfGetDeviceDriverBaseName GetDeviceDriverBaseName;
HINSTANCE g_hInstance;
HWND g_hwndParent;
HINSTANCE g_hInstLib;
//-------------------------------------------------------------------------------------------
// main DLL entry
BOOL WINAPI _DllMainCRTStartup( HANDLE hInst,
ULONG ul_reason_for_call,
LPVOID lpReserved )
{
g_hInstance = (struct HINSTANCE__ *)hInst;
return TRUE;
}
//-------------------------------------------------------------------------------------------
// loads the psapi routines
bool LoadPSAPIRoutines( void )
{
if( NULL == (g_hInstLib = LoadLibraryA( "PSAPI.DLL" )) )
return false;
EnumProcesses = (lpfEnumProcesses) GetProcAddress( g_hInstLib, "EnumProcesses" );
EnumProcessModules = (lpfEnumProcessModules) GetProcAddress( g_hInstLib, "EnumProcessModules" );
GetModuleBaseName = (lpfGetModuleBaseName) GetProcAddress( g_hInstLib, "GetModuleBaseNameA" );
EnumDeviceDrivers = (lpfEnumDeviceDrivers) GetProcAddress( g_hInstLib, "EnumDeviceDrivers" );
GetDeviceDriverBaseName = (lpfGetDeviceDriverBaseName) GetProcAddress( g_hInstLib, "GetDeviceDriverBaseNameA" );
if( ( NULL == EnumProcesses ) ||
( NULL == EnumProcessModules ) ||
( NULL == EnumDeviceDrivers ) ||
( NULL == GetModuleBaseName ) ||
( NULL == GetDeviceDriverBaseName ) )
{
FreeLibrary( g_hInstLib );
return false;
}
return true;
}
//-------------------------------------------------------------------------------------------
// free the psapi routines
bool FreePSAPIRoutines( void )
{
EnumProcesses = NULL;
EnumProcessModules = NULL;
GetModuleBaseName = NULL;
EnumDeviceDrivers = NULL;
if( FALSE == FreeLibrary( g_hInstLib ) )
return false;
return true;
}
//-------------------------------------------------------------------------------------------
// find a process by name
// return value: true - process was found
// false - process not found
bool FindProc( char *szProcess )
{
char szProcessName[ 1024 ];
char szCurrentProcessName[ 1024 ];
DWORD dPID[ 1024 ];
DWORD dPIDSize( 1024 );
DWORD dSize( 1024 );
HANDLE hProcess;
HMODULE phModule[ 1024 ];
//
// make the name lower case
//
memset( szProcessName, 0, 1024*sizeof(char) );
sprintf( szProcessName, "%s", szProcess );
strlwr( szProcessName );
//
// load PSAPI routines
//
if( false == LoadPSAPIRoutines() )
return false;
//
// enumerate processes names
//
if( FALSE == EnumProcesses( dPID, dSize, &dPIDSize ) )
{
FreePSAPIRoutines();
return false;
}
//
// walk trough and compare see if the process is running
//
for( int k( dPIDSize / sizeof( DWORD ) ); k >= 0; k-- )
{
memset( szCurrentProcessName, 0, 1024*sizeof(char) );
if( NULL != ( hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, dPID[ k ] ) ) )
{
if( TRUE == EnumProcessModules( hProcess, phModule, sizeof(HMODULE)*1024, &dPIDSize ) )
if( GetModuleBaseName( hProcess, phModule[ 0 ], szCurrentProcessName, 1024 ) > 0 )
{
strlwr( szCurrentProcessName );
if( NULL != strstr( szCurrentProcessName, szProcessName ) )
{
FreePSAPIRoutines();
CloseHandle( hProcess );
return true;
}
}
CloseHandle( hProcess );
}
}
//
// free PSAPI routines
//
FreePSAPIRoutines();
return false;
}
//-------------------------------------------------------------------------------------------
// kills a process by name
// return value: true - process was found
// false - process not found
bool KillProc( char *szProcess )
{
char szProcessName[ 1024 ];
char szCurrentProcessName[ 1024 ];
DWORD dPID[ 1024 ];
DWORD dPIDSize( 1024 );
DWORD dSize( 1024 );
HANDLE hProcess;
HMODULE phModule[ 1024 ];
//
// make the name lower case
//
memset( szProcessName, 0, 1024*sizeof(char) );
sprintf( szProcessName, "%s", szProcess );
strlwr( szProcessName );
//
// load PSAPI routines
//
if( false == LoadPSAPIRoutines() )
return false;
//
// enumerate processes names
//
if( FALSE == EnumProcesses( dPID, dSize, &dPIDSize ) )
{
FreePSAPIRoutines();
return false;
}
//
// walk trough and compare see if the process is running
//
for( int k( dPIDSize / sizeof( DWORD ) ); k >= 0; k-- )
{
memset( szCurrentProcessName, 0, 1024*sizeof(char) );
if( NULL != ( hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, dPID[ k ] ) ) )
{
if( TRUE == EnumProcessModules( hProcess, phModule, sizeof(HMODULE)*1024, &dPIDSize ) )
if( GetModuleBaseName( hProcess, phModule[ 0 ], szCurrentProcessName, 1024 ) > 0 )
{
strlwr( szCurrentProcessName );
if( NULL != strstr( szCurrentProcessName, szProcessName ) )
{
FreePSAPIRoutines();
//
// kill process
//
if( false == TerminateProcess( hProcess, 0 ) )
{
CloseHandle( hProcess );
return true;
}
//
// refresh systray
//
UpdateWindow( FindWindow( NULL, "Shell_TrayWnd" ) );
//
// refresh desktop window
//
UpdateWindow( GetDesktopWindow() );
CloseHandle( hProcess );
return true;
}
}
CloseHandle( hProcess );
}
}
//
// free PSAPI routines
//
FreePSAPIRoutines();
return false;
}
//-------------------------------------------------------------------------------------------
bool FindDev( char *szDriverName )
{
char szDeviceName[ 1024 ];
char szCurrentDeviceName[ 1024 ];
LPVOID lpDevices[ 1024 ];
DWORD dDevicesSize( 1024 );
DWORD dSize( 1024 );
TCHAR tszCurrentDeviceName[ 1024 ];
DWORD dNameSize( 1024 );
//
// make the name lower case
//
memset( szDeviceName, 0, 1024*sizeof(char) );
sprintf( szDeviceName, "%s", strlwr( szDriverName ) );
//
// load PSAPI routines
//
if( false == LoadPSAPIRoutines() )
return false;
//
// enumerate devices
//
if( FALSE == EnumDeviceDrivers( lpDevices, dSize, &dDevicesSize ) )
{
FreePSAPIRoutines();
return false;
}
//
// walk trough and compare see if the device driver exists
//
for( int k( dDevicesSize / sizeof( LPVOID ) ); k >= 0; k-- )
{
memset( szCurrentDeviceName, 0, 1024*sizeof(char) );
memset( tszCurrentDeviceName, 0, 1024*sizeof(TCHAR) );
if( 0 != GetDeviceDriverBaseName( lpDevices[ k ], tszCurrentDeviceName, dNameSize ) )
{
sprintf( szCurrentDeviceName, "%S", tszCurrentDeviceName );
if( 0 == strcmp( strlwr( szCurrentDeviceName ), szDeviceName ) )
{
FreePSAPIRoutines();
return true;
}
}
}
//
// free PSAPI routines
//
FreePSAPIRoutines();
return false;
}
//-------------------------------------------------------------------------------------------
extern "C" __declspec(dllexport) void FindProcess( HWND hwndParent,
int string_size,
char *variables,
stack_t **stacktop )
{
char szParameter[ 1024 ];
g_hwndParent = hwndParent;
EXDLL_INIT();
{
popstring( szParameter );
if( true == FindProc( szParameter ) )
wsprintf( szParameter, "1" );
else
wsprintf( szParameter, "0" );
setuservariable( INST_R0, szParameter );
}
}
//-------------------------------------------------------------------------------------------
extern "C" __declspec(dllexport) void KillProcess( HWND hwndParent,
int string_size,
char *variables,
stack_t **stacktop )
{
char szParameter[ 1024 ];
g_hwndParent = hwndParent;
EXDLL_INIT();
{
popstring( szParameter );
if( true == KillProc( szParameter ) )
wsprintf( szParameter, "1" );
else
wsprintf( szParameter, "0" );
setuservariable( INST_R0, szParameter );
}
}
//-------------------------------------------------------------------------------------------
extern "C" __declspec(dllexport) void FindDevice( HWND hwndParent,
int string_size,
char *variables,
stack_t **stacktop )
{
char szParameter[ 1024 ];
g_hwndParent = hwndParent;
EXDLL_INIT();
{
popstring( szParameter );
if( true == FindDev( szParameter ) )
wsprintf( szParameter, "1" );
else
wsprintf( szParameter, "0" );
setuservariable( INST_R0, szParameter );
}
}

View File

@@ -1,49 +0,0 @@
#pragma once
//-------------------------------------------------------------------------------------------
// PSAPI function pointers
typedef BOOL (WINAPI *lpfEnumProcesses) ( DWORD *, DWORD, DWORD * );
typedef BOOL (WINAPI *lpfEnumProcessModules) ( HANDLE, HMODULE *, DWORD, LPDWORD );
typedef DWORD (WINAPI *lpfGetModuleBaseName) ( HANDLE, HMODULE, LPTSTR, DWORD );
typedef BOOL (WINAPI *lpfEnumDeviceDrivers) ( LPVOID *, DWORD, LPDWORD );
typedef BOOL (WINAPI *lpfGetDeviceDriverBaseName)( LPVOID, LPTSTR, DWORD );
//-------------------------------------------------------------------------------------------
// Internal use routines
bool LoadPSAPIRoutines( void );
bool FreePSAPIRoutines( void );
bool FindProc( char *szProcess );
bool KillProc( char *szProcess );
bool FindDev( char *szDriverName );
//-------------------------------------------------------------------------------------------
// Exported routines
extern "C" __declspec(dllexport) void FindProcess( HWND hwndParent,
int string_size,
char *variables,
stack_t **stacktop );
extern "C" __declspec(dllexport) void KillProcess( HWND hwndParent,
int string_size,
char *variables,
stack_t **stacktop );
extern "C" __declspec(dllexport) void FindDevice( HWND hwndParent,
int string_size,
char *variables,
stack_t **stacktop );

View File

@@ -1,103 +0,0 @@
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,1
PRODUCTVERSION 1,0,0,1
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x2L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "Comments", "NSIS Plug-in for Windows process management. Only WinNT, Win2K, WinXP and Win2003 Server supported."
VALUE "CompanyName", "Andrei Ciubotaru [Hardwired]"
VALUE "FileDescription", "Windows Processes Management"
VALUE "FileVersion", "1, 0, 0, 1"
VALUE "InternalName", "Processes"
VALUE "LegalCopyright", "Copyright (c) 2004 Hardwired. No rights reserved."
VALUE "OriginalFilename", "Processes.dll"
VALUE "ProductName", "Processes"
VALUE "ProductVersion", "1, 0, 0, 1"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
#endif // English (U.S.) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

View File

@@ -1,21 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 8.00
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "processes", "processes.vcproj", "{3438467F-A719-46DC-93E5-137A8B691727}"
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfiguration) = preSolution
Debug = Debug
Release = Release
EndGlobalSection
GlobalSection(ProjectConfiguration) = postSolution
{3438467F-A719-46DC-93E5-137A8B691727}.Debug.ActiveCfg = Debug|Win32
{3438467F-A719-46DC-93E5-137A8B691727}.Debug.Build.0 = Debug|Win32
{3438467F-A719-46DC-93E5-137A8B691727}.Release.ActiveCfg = Release|Win32
{3438467F-A719-46DC-93E5-137A8B691727}.Release.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
EndGlobalSection
GlobalSection(ExtensibilityAddIns) = postSolution
EndGlobalSection
EndGlobal

View File

@@ -1,122 +0,0 @@
----------------------------------------------------------------
----------------------------------------------------------------
Processes (Processes.dll)
Version: 1.0.0.1
Release: 12.december.2004
Description:Nullsoft Installer (NSIS) plug-in for managing?!
Windows processes.
Copyright: © 2004 Hardwired. No rights reserved.
There is no restriction and no guaranty for using
this software.
Author: Andrei Ciubotaru [Hardwired]
Lead Developer ICode&Ideas SRL (http://www.icode.ro)
hardwiredteks@gmail.com, hardwired@icode.ro
----------------------------------------------------------------
----------------------------------------------------------------
INTRODUCTION
The Need For Plug-in - I need it for the one of my installers.
Briefly: Use it when you need to find\kill a process when
installing\uninstalling some application. Also, use it when you
need to test the presence of a device driver.
SUPPORT
Supported platforms are: WinNT,Win2K,WinXP and Win2003 Server.
DESCRIPTION
Processes::FindProcess <process_name.exe>
Searches the currently running processes for the given
process name.
return: 1 - the process was found
0 - the process was not found
Processes::KillProcess <process_name.exe>
Searches the currently running processes for the given
process name. If the process is found then the it gets
killed.
return: 1 - the process was found and killed
0 - the process was not found or the process
cannot be killed (insuficient rights)
Processes::FindDevice <device_base_name>
Searches the installed devices drivers for the given
device base name.
(important: I said BASE NAME not FILENAME)
return: 1 - the device driver was found
0 - the device driver was not found
USAGE
First of all, does not matter where you use it. Ofcourse, the
routines must be called inside of a Section/Function scope.
Processes::FindProcess "process_name.exe"
Pop $R0
StrCmp $R0 "1" make_my_day noooooo
make_my_day:
...
noooooo:
...
Processes::KillProcess "process_name.exe"
Pop $R0
StrCmp $R0 "1" dead_meat why_wont_you_die
dead_meat:
...
why_wont_you_die:
...
Processes::FindDevice "device_base_name"
Pop $R0
StrCmp $R0 "1" blabla more_blabla
blabla:
...
more_blabla:
...
THANKS
Sunil Kamath for inspiring me. I wanted to use its FindProcDLL
but my requirements made it imposible.
Nullsoft for creating this very powerfull installer. One big,
free and full-featured (hmmm... and guiless for the moment) mean
install machine!:)
ME for being such a great coder...
... HAHAHAHAHAHAHA!
ONE MORE THING
If you use the plugin or it's source-code, I would apreciate
if my name is mentioned.
----------------------------------------------------------------
----------------------------------------------------------------

View File

@@ -1,222 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.10"
Name="processes"
SccProjectName="processes"
SccLocalPath=".">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory=".\Debug"
IntermediateDirectory=".\Debug"
ConfigurationType="2"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FINDPROCDLL_EXPORTS"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
UsePrecompiledHeader="3"
PrecompiledHeaderThrough="stdafx.h"
PrecompiledHeaderFile=".\Debug/processes.pch"
AssemblerListingLocation=".\Debug/"
ObjectFile=".\Debug/"
ProgramDataBaseFileName=".\Debug/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
DebugInformationFormat="4"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
OutputFile=".\Debug/processes.dll"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
GenerateDebugInformation="TRUE"
ProgramDatabaseFile=".\Debug/processes.pdb"
ImportLibrary=".\Debug/processes.lib"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName=".\Debug/processes.tlb"
HeaderFileName=""/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="1034"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="..\bin"
IntermediateDirectory="..\bin\processes"
ConfigurationType="2"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2"
WholeProgramOptimization="TRUE">
<Tool
Name="VCCLCompilerTool"
Optimization="3"
GlobalOptimizations="TRUE"
InlineFunctionExpansion="1"
FavorSizeOrSpeed="1"
OptimizeForWindowsApplication="TRUE"
PreprocessorDefinitions="NDEBUG;_WINDOWS;_USRDLL;FINDPROCDLL_EXPORTS"
StringPooling="TRUE"
RuntimeLibrary="0"
StructMemberAlignment="1"
EnableFunctionLevelLinking="TRUE"
UsePrecompiledHeader="3"
PrecompiledHeaderThrough="stdafx.h"
PrecompiledHeaderFile="..\bin\processes/processes.pch"
AssemblerListingLocation="..\bin\processes/"
ObjectFile="..\bin\processes/"
ProgramDataBaseFileName="..\bin\processes/"
WarningLevel="4"
SuppressStartupBanner="TRUE"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="libc.lib"
OutputFile="..\bin/Processes.dll"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
IgnoreAllDefaultLibraries="FALSE"
ProgramDatabaseFile="..\bin/processes.pdb"
OptimizeForWindows98="1"
ImportLibrary="..\bin/processes.lib"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName=".\Release/processes.tlb"
HeaderFileName=""/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
<File
RelativePath="processes.cpp">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;_USRDLL;FINDPROCDLL_EXPORTS;$(NoInherit)"
BasicRuntimeChecks="3"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="1"
PreprocessorDefinitions="NDEBUG;_WINDOWS;_MBCS;_USRDLL;FINDPROCDLL_EXPORTS;$(NoInherit)"/>
</FileConfiguration>
</File>
<File
RelativePath=".\processes.rc">
</File>
<File
RelativePath="StdAfx.cpp">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;_USRDLL;FINDPROCDLL_EXPORTS;$(NoInherit)"
BasicRuntimeChecks="3"
UsePrecompiledHeader="1"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="1"
PreprocessorDefinitions="NDEBUG;_WINDOWS;_MBCS;_USRDLL;FINDPROCDLL_EXPORTS;$(NoInherit)"
UsePrecompiledHeader="1"/>
</FileConfiguration>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl">
<File
RelativePath="exdll.h">
</File>
<File
RelativePath=".\processes.h">
</File>
<File
RelativePath=".\resource.h">
</File>
<File
RelativePath="StdAfx.h">
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">
</Filter>
<File
RelativePath="processes.txt">
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@@ -1,15 +0,0 @@
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by processes.rc
//
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 101
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

View File

@@ -1,102 +0,0 @@
History:
--------
v0.0.11d - 20090705 (AndersK)
*Fixed UAC_RealWorldFullyLoadedDualModeExample.nsi so installing as admin will allow both modes
v0.0.11c - 20090124 (AndersK)
*Checks for seclogon service on NT5 and returns ERROR_SERVICE_NOT_ACTIVE in $0 if not running
v0.0.11b - 20090102 (AndersK)
*Fixed unicode compile bugs
v0.0.11 - 20081021 (AndersK)
+Added UAC_GetUserShellFolderPath.nsi (Uses the new UAC::GetShellFolderPath)
v0.0.10a - 20081004 (AndersK)
+Added SEE_MASK_NOZONECHECKS flag (experimental)
v0.0.10 - 20080812 (AndersK)
+Added ugly hook hack to the shells run-as dialog on xp, defaults to other user
v0.0.9 - 20080721 (AndersK)
*Fixed UAC_RealWorldFullyLoadedDualModeExample.nsi related bug (Thanks Case)
v0.0.8 - 20080310 (AndersK)
+HTML Readme
+Added UAC::GetOuterHwnd (used by UAC_RealWorldFullyLoadedDualModeExample.nsi)
*Fixed UAC_RealWorldFullyLoadedDualModeExample.nsi
*Major code cleanup in UAC.cpp
-Removed UAC::RunElevatedAndProcessMessages (UAC::RunElevated now supports non NULL $HWNDParent)
-Removed several useless sample scripts
v0.0.7e - 20080229 (AndersK)
*Added ugly hack for hackwnd to find correct title and give us a proper taskbar so the elevation dialog does not get lost (2000,XP (This also fixed Alt-Tab icon on Vista))
*Should compile with MSVC2005 now (Thanks Case)
*More unicode fixes, this time even tested with NSIS Unicode (Only RunElevated and Exec tested)
v0.0.7d - 20080226 (AndersK)
*Fixed a couple of unicode version bugs (Unicode version still untested)
*Fixed weird XP string length bug (Thanks kfank)
v0.0.7c - 20080218 (AndersK)
*Fixed SyncVars string length bug
v0.0.7b - 20080205 (AndersK)
*Fixed DelayLoadDlls() problem on NT4
v0.0.7 - 20080120 (AndersK)
+Added UAC::StackPush (For use with ExecCodeSegment)
v0.0.6d - 20071108 (AndersK)
+Now syncs basic registers/variables before calling UAC::*Exec* and UAC::ExecCodeSegment (r0-r9,R0-R9,$CMDLINE,$INSTDIR,$OUTDIR,$EXEDIR,$LANGUAGE)
+Added UAC::RunElevatedAndProcessMessages, this can be called after .onInit (Very experimental, DO NOT USE)
+New include file with helper macros: UAC.nsh
*Replazed Clammerz hack with a better version
v0.0.6c - 20071014 (AndersK)
+Check for and split up "domain\user" style input in RunAs.cpp for CreateProcessWithLogonW
*Added a ugly hack to trick messagebox'es in .OnInit to appear correctly on Vista (Thanks Clammerz)
v0.0.6b - 20070523 (AndersK)
*Fixed showwindow flag (Thanks for the help kichik)
v0.0.6 - 20070512 (AndersK)
+Added basic language support for MyRunAs dialog.
v0.0.5e - 20070509 (AndersK)
*Fixed detection of UAC mode?
+IPC window is visible (but offscreen) during elevation to help with SetForegroundWindow/Focus problems
v0.0.5d - 20070324 (AndersK)
*Fixed stupid IsAdmin bug
v0.0.5c - 20070304 (AndersK)
*_IsAdmin now uses CheckTokenMembership if it exists ( MSKB:Q118626 / http://blogs.msdn.com/larryosterman/archive/2007/03/14/why-does-kb-118626-use-accesscheck-to-check-if-you-re-a-member-of-the-administrators-group.aspx )
v0.0.5b - 20070301 (AndersK)
*Fixed ExecCodeSegment (Thread now calls CoInitialize)
v0.0.5 - 20070228 (AndersK)
+Added ExecCodeSegment (You can now call ANY code in the context of the original user)
v0.0.4b - 20070226 (AndersK)
*Fixed (My)RunAs font (http://blogs.msdn.com/oldnewthing/archive/2005/02/04/366987.aspx)
v0.0.4 - 20070225 (AndersK)
+Added (My)RunAs dialog, used on Vista when running as LUA with UAC off
+Always uses /NCRC for elevated instance
*Now compiles as UNICODE (Untested, no UnicodeNSIS to test on)
v0.0.3 - 20070224 (AndersK)
+Added Exec/ExecWait
+Added Verb & ShowWindow support for ShellExec[Wait]
v0.0.2 - 20070219 (AndersK)
+Added ShellExecWait
*IPC srv wnd now has its own thread and msg loop
*Removed CRT dependency
*Hopefully loads on Win95 now
v0.0.1 - 20070215 (AndersK)
*Initial release

View File

@@ -1,14 +0,0 @@
This software is provided 'as-is', without any express or implied warranty.
ZLIB/LIBPNG LICENSE
-------------------
This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.

View File

@@ -1,149 +0,0 @@
/*
Alternative to ExDll.h
v0.0.1 - 20060811 (AndersK)
*/
#pragma once
#include <TChar.h>
typedef TCHAR NSISCH;
#define NSISCALL __stdcall
namespace NSIS {
__forceinline void* NSISCALL MemAlloc(SIZE_T cb) {return GlobalAlloc(LPTR,cb);}
__forceinline void NSISCALL MemFree(void* p) {GlobalFree(p);}
enum {
INST_0, // $0
INST_1, // $1
INST_2, // $2
INST_3, // $3
INST_4, // $4
INST_5, // $5
INST_6, // $6
INST_7, // $7
INST_8, // $8
INST_9, // $9
INST_R0, // $R0
INST_R1, // $R1
INST_R2, // $R2
INST_R3, // $R3
INST_R4, // $R4
INST_R5, // $R5
INST_R6, // $R6
INST_R7, // $R7
INST_R8, // $R8
INST_R9, // $R9
INST_CMDLINE, // $CMDLINE
INST_INSTDIR, // $INSTDIR
INST_OUTDIR, // $OUTDIR
INST_EXEDIR, // $EXEDIR
INST_LANG, // $LANGUAGE
__INST_LAST,
VIDX_TEMP=(INST_LANG+1), //#define state_temp_dir g_usrvars[25]
VIDX_PLUGINSDIR,//# define state_plugins_dir g_usrvars[26]
VIDX_EXEPATH,//#define state_exe_path g_usrvars[27]
VIDX_EXEFILENAME,//#define state_exe_file g_usrvars[28]
VIDX_STATECLICKNEXT,//#define state_click_next g_usrvars[30]
__VIDX_UNDOCLAST
};
typedef struct _stack_t {
struct _stack_t *next;
NSISCH text[ANYSIZE_ARRAY];
} stack_t;
typedef struct {
int autoclose;
int all_user_var;
int exec_error;
int abort;
int exec_reboot;
int reboot_called;
int XXX_cur_insttype; // deprecated
int XXX_insttype_changed; // deprecated
int silent;
int instdir_error;
int rtl;
int errlvl;
//NSIS v2.3x ?
int alter_reg_view;
int status_update;
} exec_flags_type;
typedef struct {
exec_flags_type *exec_flags;
int (NSISCALL *ExecuteCodeSegment)(int, HWND);
void (NSISCALL *validate_filename)(char *);
} extra_parameters;
extern UINT StrSize;
extern stack_t **StackTop;
extern NSISCH*Vars;
inline bool NSISCALL SetErrLvl(extra_parameters*pExtraParams,int ErrLevel) {return pExtraParams? ((pExtraParams->exec_flags->errlvl=ErrLevel)||true):false;}
inline bool NSISCALL SetErrorFlag(extra_parameters*pExtraParams) {return pExtraParams? ((pExtraParams->exec_flags->exec_error=1)||true):false;}
inline bool NSISCALL ClearErrorFlag(extra_parameters*pExtraParams) {return pExtraParams?((pExtraParams->exec_flags->exec_error=0)||true):false;}
__forceinline int NSISCALL ExecuteCodeSegment(extra_parameters*pExtraParams,int pos,HWND hwndProgress=NULL) {
return pExtraParams?pExtraParams->ExecuteCodeSegment(pos,hwndProgress):(/*EXEC_ERROR*/0x7FFFFFFF);
}
static NSISCH* __fastcall GetVar(const int varnum)
{
//ASSERT(NSIS::Vars && NSIS::StrSize);
if (varnum < 0 || varnum >= __VIDX_UNDOCLAST) return NULL;
return NSIS::Vars+(varnum*NSIS::StrSize);
}
inline void NSISCALL SetVarUINT(const int varnum,UINT Value) {
wsprintf(GetVar(varnum),_T("%u"),Value);
}
static stack_t* NSISCALL StackPop() {
if (NSIS::StackTop && *NSIS::StackTop) {
stack_t*s=(*NSIS::StackTop);
*NSIS::StackTop=(*NSIS::StackTop)->next;
return s;
}
return 0;
}
__forceinline void NSISCALL StackFreeItem(stack_t*pStackItem) {NSIS::MemFree(pStackItem);}
static DWORD NSISCALL StackPush(NSISCH*InStr,UINT StackStrSize=NSIS::StrSize) {
if (!NSIS::StackTop)return ERROR_INVALID_PARAMETER;
stack_t*sNew=(stack_t*)NSIS::MemAlloc(sizeof(stack_t)+(StackStrSize*sizeof(NSISCH)));
if (!sNew)return ERROR_OUTOFMEMORY;
lstrcpyn(sNew->text,InStr,StackStrSize);
sNew->next=*NSIS::StackTop;
*NSIS::StackTop=sNew;
return NO_ERROR;
}
}; /* namespace */
#define NSISUTIL_INIT() namespace NSIS {static UINT StrSize;static stack_t **StackTop;static NSISCH*Vars;}//Call in only ONE source file
#define NSISUTIL_INITEXPORT(_v,_strsize,_stackt) NSIS::Vars=_v;NSIS::StrSize=_strsize;NSIS::StackTop=_stackt
//#define NSISEXPORT4(_func,_h,_strsize,_v,_stackt) extern "C" void __declspec(dllexport) __cdecl \
// _func (HWND _h,int _strsize,NSISCH*_v,NSIS::stack_t **_stackt) { NSISUTIL_INITEXPORT(_v,_strsize,_stackt); TRACE("EXPORT::" #_func "\n");
//#define NSISEXPORT5(_func,_h,_strsize,_v,_stackt,_eparams) extern "C" void __declspec(dllexport) __cdecl \
// _func (HWND _h,int _strsize,NSISCH*_v,NSIS::stack_t **_stackt,NSIS::extra_parameters* _eparams) { NSISUTIL_INITEXPORT(_v,_strsize,_stackt); TRACE("EXPORT::" #_func "\n");
//#define NSISEXPORT NSISEXPORT5
#ifdef _MSC_VER
# define EXPORTNSISFUNC extern "C" void __declspec(dllexport) __cdecl
# else
# error EXPORTNSISFUNC needs compiler goo, you are on your own!
# endif
#define NSISFUNCSTART4(_h,_strsize,_v,_stackt) {NSISUTIL_INITEXPORT(_v,_strsize,_stackt);
#define NSISFUNCSTART5(_h,_strsize,_v,_stackt,_eparams) NSISFUNCSTART4(_h,_strsize,_v,_stackt)
#define NSISFUNCSTART NSISFUNCSTART5
#define NSISFUNCEND() }

View File

@@ -1,277 +0,0 @@
//Copyright (C) 2007 Anders Kjersem. Licensed under the zlib/libpng license, see License.txt for details.
/*
If UAC is disabled, the runas verb is broken (Vista RTM) so when running as LUA there is no way to elevate so
we provide our own dialog.
*/
#include "UAC.h"
#ifdef FEAT_CUSTOMRUNASDLG
#include <Lmcons.h>//UNLEN && GNLEN && PWLEN
#include <WindowsX.h>
#include "resource.h"
#include "NSISUtil.h"
using namespace NSIS;
#define ERRAPP_TRYAGAIN (0x20000000|1)
#define MYMAX_DOMAIN (2+max(GNLEN,MAX_COMPUTERNAME_LENGTH)+1)
static LPCTSTR g_RunAsDlgTitle=_T("Run as");
static LPCTSTR g_RunAsHelpText=_T("You may not have the necessary permissions to use all the features of the program you are about to run. You may run this program as a different user or continue to run the program as the current user.");
static LPCTSTR g_RunAsCurrUsrFmt=_T("&Current user (%s)");//Max 50 chars!
static LPCTSTR g_RunAsSpecHelp=_T("Run the program as the &following user:");
FORCEINLINE bool MySetDlgItemText(HWND hDlg,int id,LPCTSTR s) {return MySndDlgItemMsg(hDlg,id,WM_SETTEXT,0,(LPARAM)s)!=0;}
typedef struct {
SHELLEXECUTEINFO*pSEI;
bool AsSelf;
} RUNASDLGDATA;
void MyRunAsFmtCurrUserRadio(HWND hDlg,LPCTSTR Fmt) {
TCHAR bufFullName[MYMAX_DOMAIN+UNLEN+1];
TCHAR buf[50+MYMAX_DOMAIN+UNLEN+1];
*bufFullName=0;
ULONG cch;
if ((!_GetUserNameEx || !_GetUserNameEx(NameSamCompatible,bufFullName,&(cch=COUNTOF(bufFullName)))) &&
!_GetUserName(bufFullName,&(cch=COUNTOF(bufFullName))) ) {
*bufFullName=0;
}
wsprintf(buf,Fmt,*bufFullName?bufFullName:_T("?"));
MySetDlgItemText(hDlg,IDC_RUNASCURR,buf);
// default the "User name:" to Administrator from shell32
if (LoadString(GetModuleHandle(_T("SHELL32.dll")),21763, bufFullName, COUNTOF(bufFullName)) > 0) {
MySetDlgItemText(hDlg,IDC_USERNAME,bufFullName);
}
}
#ifdef FEAT_CUSTOMRUNASDLG_TRANSLATE
void MyRunAsTranslateDlgString(LPCTSTR StrID,LPTSTR Ini,HWND hDlg,INT_PTR DlgItemId,int special=0) {
TCHAR buf[MAX_PATH*2];
DWORD len=GetPrivateProfileString(_T("MyRunAsStrings"),StrID,0,buf,ARRAYSIZE(buf),Ini);
if (len) {
if (IDC_RUNASCURR==special)
MyRunAsFmtCurrUserRadio(hDlg,buf);
else
(DlgItemId==-1) ? SetWindowText(hDlg,buf) : MySetDlgItemText(hDlg,DlgItemId,buf);
}
}
void MyRunAsTranslateDlg(HWND hDlg) {
DWORD len;
TCHAR buf[MAX_PATH*2];
HMODULE hDll=GetWindowInstance(hDlg);ASSERT(hDll);
if ( (len=GetModuleFileName(hDll,buf,ARRAYSIZE(buf))) <1)return;
buf[len-3]=0;
lstrcat(buf,_T("lng"));
MyRunAsTranslateDlgString(_T("DlgTitle"),buf,hDlg,-1);
MyRunAsTranslateDlgString(_T("HelpText"),buf,hDlg,IDC_HELPTEXT);
MyRunAsTranslateDlgString(_T("OptCurrUser"),buf,hDlg,IDC_RUNASCURR,IDC_RUNASCURR);
MyRunAsTranslateDlgString(_T("OptOtherUser"),buf,hDlg,IDC_RUNASSPEC);
MyRunAsTranslateDlgString(_T("Username"),buf,hDlg,IDC_LBLUSER);
MyRunAsTranslateDlgString(_T("Pwd"),buf,hDlg,IDC_LBLPWD);
MyRunAsTranslateDlgString(_T("OK"),buf,hDlg,IDOK);
MyRunAsTranslateDlgString(_T("Cancel"),buf,hDlg,IDCANCEL);
HWND h=GetDlgItem(hDlg,IDC_RUNASCURR);
if (GetPrivateProfileInt(_T("MyRunAsCfg"),_T("DisableCurrUserOpt"),false,buf))EnableWindow(h,false);
if (GetPrivateProfileInt(_T("MyRunAsCfg"),_T("HideCurrUserOpt"),false,buf))ShowWindow(h,false);
}
#endif
bool ErrorIsLogonError(DWORD err) {
switch (err) {
case ERROR_LOGON_FAILURE:
case ERROR_ACCOUNT_RESTRICTION:
case ERROR_INVALID_LOGON_HOURS:
case ERROR_INVALID_WORKSTATION:
case ERROR_PASSWORD_EXPIRED:
case ERROR_ACCOUNT_DISABLED:
case ERROR_NONE_MAPPED:
case ERROR_NO_SUCH_USER:
case ERROR_INVALID_ACCOUNT_NAME:
return true;
}
return false;
}
void VerifyOKBtn(HWND hDlg,RUNASDLGDATA*pRADD) {
const bool HasText=pRADD?(pRADD->AsSelf?true:MySndDlgItemMsg(hDlg,IDC_USERNAME,WM_GETTEXTLENGTH)>0):false;
EnableWindow(GetDlgItem(hDlg,IDOK),HasText);
}
void SetDlgState(HWND hDlg,bool AsSelf,RUNASDLGDATA*pRADD) {
if (pRADD)pRADD->AsSelf=AsSelf;
MySndDlgItemMsg(hDlg,IDC_RUNASCURR,BM_SETCHECK,AsSelf?BST_CHECKED:BST_UNCHECKED);
MySndDlgItemMsg(hDlg,IDC_RUNASSPEC,BM_SETCHECK,!AsSelf?BST_CHECKED:BST_UNCHECKED);
int ids[]={IDC_USERNAME,IDC_PASSWORD,IDC_LBLUSER,IDC_LBLPWD};
for (int i=0; i<COUNTOF(ids);++i)EnableWindow(GetDlgItem(hDlg,ids[i]),!AsSelf);
VerifyOKBtn(hDlg,pRADD);
}
INT_PTR CALLBACK MyRunAsDlgProc(HWND hwnd,UINT uMsg,WPARAM wp,LPARAM lp) {
RUNASDLGDATA*pRADD=(RUNASDLGDATA*)GetWindowLongPtr(hwnd,GWLP_USERDATA);
switch(uMsg) {
//case WM_DESTROY:
// break;
case WM_CLOSE:
return DestroyWindow(hwnd);
case WM_INITDIALOG:
{
pRADD=(RUNASDLGDATA*)lp;ASSERT(pRADD);
SetWindowLongPtr(hwnd,GWLP_USERDATA,lp);
Edit_LimitText(GetDlgItem(hwnd,IDC_USERNAME),UNLEN+1+MYMAX_DOMAIN); //room for "foo@BAR" or "BAR\foo"
Edit_LimitText(GetDlgItem(hwnd,IDC_PASSWORD),PWLEN);
const HINSTANCE hSh32=GetModuleHandle(_T("SHELL32.dll"));
const HICON hIco=(HICON)LoadImage(hSh32,MAKEINTRESOURCE(194),IMAGE_ICON,32,32,LR_SHARED);
MySndDlgItemMsg(hwnd,IDC_SHICON,STM_SETICON,(WPARAM)hIco);
SendMessage(hwnd,WM_SETTEXT,0,(LPARAM)g_RunAsDlgTitle);
MySetDlgItemText(hwnd,IDC_HELPTEXT,g_RunAsHelpText);
MyRunAsFmtCurrUserRadio(hwnd,g_RunAsCurrUsrFmt);
MySetDlgItemText(hwnd,IDC_RUNASSPEC,g_RunAsSpecHelp);
#ifdef FEAT_CUSTOMRUNASDLG_TRANSLATE
MyRunAsTranslateDlg(hwnd);
#endif
SetDlgState(hwnd,false,pRADD);
#if defined(BUILD_DBG) && 0 //auto login used during testing ;)
SetDlgItemText(hwnd,IDC_USERNAME,_T("root"));
SetDlgItemText(hwnd,IDC_PASSWORD,_T("???"));
Sleep(1);PostMessage(hwnd,WM_COMMAND,IDOK,0);
#endif
}
return true;
case WM_COMMAND:
{
switch(HIWORD(wp)) {
case EN_CHANGE:
VerifyOKBtn(hwnd,pRADD);
break;
case EN_SETFOCUS:
case BN_CLICKED:
if (LOWORD(wp)<=IDCANCEL)break;
SetDlgState(hwnd,LOWORD(wp)==IDC_RUNASCURR,pRADD);
return FALSE;
}
INT_PTR exitcode=!pRADD?-1:IDCANCEL;
switch(LOWORD(wp)) {
case IDOK:
if (pRADD) {
SHELLEXECUTEINFO&sei=*pRADD->pSEI;
PROCESS_INFORMATION pi={0};
DWORD ec=NO_ERROR;
WCHAR*wszExec;//Also used as TCHAR buffer in AsSelf mode
bool PerformTCharFmt=pRADD->AsSelf;
//const DWORD CommonStartupInfoFlags=STARTF_FORCEONFEEDBACK;
#ifdef UNICODE
PerformTCharFmt=true;
#endif
wszExec=(WCHAR*)NSIS::MemAlloc( (pRADD->AsSelf?sizeof(TCHAR):sizeof(WCHAR)) *(lstrlen(sei.lpFile)+1+lstrlen(sei.lpParameters)+1));
if (!wszExec)ec=ERROR_OUTOFMEMORY;
if (PerformTCharFmt)wsprintf((TCHAR*)wszExec,_T("%s%s%s"),sei.lpFile,((sei.lpParameters&&*sei.lpParameters)?_T(" "):_T("")),sei.lpParameters);
if (!ec) {
if (pRADD->AsSelf) {
STARTUPINFO si={sizeof(si)};
TRACEF("MyRunAs:CreateProcess:%s|\n",wszExec);
ec=(CreateProcess(0,(TCHAR*)wszExec,0,0,false,0,0,0,&si,&pi)?NO_ERROR:GetLastError());
}
else {
//All Wide strings!
WCHAR wszPwd[PWLEN+1];
WCHAR wszUName[UNLEN+1+MYMAX_DOMAIN+1];
STARTUPINFOW siw={sizeof(siw)};
WCHAR*p;
#ifndef UNICODE
//Build unicode string, we already know the buffer is big enough so no error handling
p=wszExec;
MultiByteToWideChar(CP_THREAD_ACP,0,sei.lpFile,-1,p,0xFFFFFF);
if (sei.lpParameters && *sei.lpParameters) {
p+=lstrlen(sei.lpFile);*p++=L' ';*p=0;
MultiByteToWideChar(CP_THREAD_ACP,0,sei.lpParameters,-1,p,0xFFFFFF);
}
#endif
SendMessageW(GetDlgItem(hwnd,IDC_USERNAME),WM_GETTEXT,COUNTOF(wszUName),(LPARAM)wszUName);
SendMessageW(GetDlgItem(hwnd,IDC_PASSWORD),WM_GETTEXT,COUNTOF(wszPwd),(LPARAM)wszPwd);
//Try to find [\\]domain\user and split into username and domain strings
WCHAR*pUName=wszUName,*pDomain=0;
p=wszUName;
//if (*p==p[1]=='\\')pUName=(p+=2);else \ //Should we still split things up if the string starts with \\ ? Is it possible to use \\machine\user at all?
++p;//Don't parse "\something", require at least one char before backslash "?[*\]something"
while(*p && *p!='\\')++p;
if (*p=='\\') {
pDomain=pUName;
pUName=p+1;*p=0;
}
TRACEF("MyRunAs:CreateProcessWithLogonW:%ws|%ws|%ws|%ws|\n",pUName,pDomain?pDomain:L"NO?DOMAIN",wszPwd,wszExec);
ec=(_CreateProcessWithLogonW(pUName,pDomain?pDomain:0,wszPwd,LOGON_WITH_PROFILE,0,wszExec,0,0,0,&siw,&pi)?NO_ERROR:GetLastError());
TRACEF("MyRunAs:CreateProcessWithLogonW: ret=%u\n",ec);
SecureZeroMemory(wszPwd,sizeof(wszPwd));//if (wszPwd) {volatile WCHAR*_p=wszPwd;for(;_p&&*_p;++_p)*_p=1;if (_p)*wszPwd=0;}//Burn password (And attempt to prevent compiler from removing it)
if (ec && ErrorIsLogonError(ec)) {
LPTSTR szMsg;
DWORD ret=FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,0,ec,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPTSTR)&szMsg,0,0);
if (ret) {
ec=ERRAPP_TRYAGAIN;
MessageBox(hwnd,szMsg,0,MB_ICONWARNING);
LocalFree(szMsg);
}
else ec=GetLastError();
}
}
}
NSIS::MemFree(wszExec);
if (pi.hThread)CloseHandle(pi.hThread);
if (ERRAPP_TRYAGAIN==ec)break;
if (ec) {
SetLastError(ec);
exitcode=-1;
}
else {
pRADD->pSEI->hProcess=pi.hProcess;
exitcode=IDOK;
}
}
case IDCANCEL:
EndDialog(hwnd,exitcode);
}
}
break;
}
return FALSE;
}
DWORD MyRunAs(HINSTANCE hInstDll,SHELLEXECUTEINFO&sei) {
INT_PTR ec;
ASSERT(sei.cbSize>=sizeof(SHELLEXECUTEINFO) && hInstDll);
if (ec=DelayLoadDlls())return ec;
ASSERT(_CreateProcessWithLogonW && _GetUserName);
RUNASDLGDATA radd={0};
radd.pSEI=&sei;
ec=DialogBoxParam(hInstDll,MAKEINTRESOURCE(IDD_MYRUNAS),sei.hwnd,MyRunAsDlgProc,(LPARAM)&radd);
TRACEF("MyRunAs returned %d (%s|%s)\n",ec,sei.lpFile,sei.lpParameters);
switch(ec) {
case 0:
return ERROR_INVALID_HANDLE;//DialogBoxParam returns 0 on bad hwnd
case IDOK:
return NO_ERROR;
case IDCANCEL:
return ERROR_CANCELLED;
}
//TODO:BUGBUG: on vista, the last error seems to get lost, should probably put it in RUNASDLGDATA and always return IDOK
return GetLastError();
}
#ifdef BUILD_DBG
// RunDll exports are __stdcall, we dont care about that for this debug export, rundll32.exe is able to handle this mistake
extern "C" void __declspec(dllexport) __cdecl DBGRDMyRunAs(HWND hwnd,HINSTANCE hinst,LPTSTR lpCmdLine,int nCmdShow) {
SHELLEXECUTEINFO sei={sizeof(sei)};
sei.lpFile=_T("Notepad.exe");//sei.lpParameters=_T("param1");
TRACEF("ec=%d\n",MyRunAs(GetModuleHandle(_T("UAC.dll")),sei));
}
#endif
#endif /* FEAT_CUSTOMRUNASDLG */

View File

@@ -1,222 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<title>UAC plug-in readme</title>
<script type="text/javascript">
function NavGL(q){window.open("http://www.google.com/search?hl=en&btnI=I&num=2&q="+escape(q));return 0;}
</script>
<style type="text/css">
html,body {background-color:#FFF; color:#000;}
a:link, a:visited, a:active {color:#00F;}
h2 {border-bottom:0.1em solid #000;}
#docHdrHdln{text-align:center;}
.importanttxt {color:#e00;}
.code {font-family:monospace;}
.nsisvar {color:#C00;}
.str {color:#390}
.inifile {background-color:#EEE;border:1px solid #000;padding:0.2em;}
.inicomment {background-color:#f5f5c5;color:#555;}
table.piexport {text-align:left;margin-bottom:1em;}
table.piexport td {vertical-align:top;}
table.piexport table.ret {padding:0;margin:0;border:0;}
</style>
</head><body>
<h1 id="docHdrHdln">UAC plug-in</h1>
<code><pre>
Interactive User (MediumIL) Admin user(HighIL)
+++[Setup.exe]++++++++++++++ +++[Setup.exe]++++++++++++++
+ + + +
+ ***[.OnInit]************ + + ***[.OnInit]************ +
+ * UAC::RunElevated >---+-+------>+ * * +
+ * NSIS.Quit() * + + * * +
+ ************************ + + ***********||*********** +
+ + + || +
+ + + \/ +
+ ***[Sections]*********** + + ***[Sections]*********** +
+ * * + /--+-+-< UAC::Exec * +
+ ************************ + | + ************************ +
+ + | + +
+ Win32.CreateProcess() <-+----/ + +
+ + + +
++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++
</pre></code>
<h2>Contents</h2>
<ul>
<li><a href="#exports">Plugin Functions</a>
<li><a href="#lang">Language support</a>
<li><a href="#knownissues">Known Issues</a>
<li><a href="#glossary">Glossary</a>
</ul>
<a name="exports"><h2>Plugin Functions</h2></a><div class="CntSec"><p>
Every function will try to emulate the basic NSIS instruction (of similar name) when UAC::RunElevated has not "succeeded" or running on a system that does not support elevation (Win9x/NT4)</p>
<table class="piexport"><tr><th colspan=2>UAC::RunElevated</th></tr>
<tr><td>Parameters:</td><td></td></tr>
<tr><td>Returns:</td><td>
<table class="ret">
<tr><td><span class="nsisvar">$0</span></td><td>Win32 error code (0 on success, 1223 if user aborted elevation dialog, anything else should be treated as a fatal error)</td></tr>
<tr><td><span class="nsisvar">$1</span></td><td><span class="code">If <span class="nsisvar">$0</span>==0</span>:
<table class="ret">
<tr><td>0</td><td>UAC is not supported by the OS</td></tr>
<tr><td>1</td><td>Started a elevated child process, the current process should act like a wrapper (Call Quit without any further processing)</td></tr>
<tr><td>2</td><td>The process is already running @ HighIL (Member of admin group)</td></tr>
<tr><td>3</td><td>You should call RunElevated again (This can happen if a user without admin priv. is used in the runas dialog)</td></tr>
</table>
</td></tr>
<tr><td><span class="nsisvar">$2</span></td><td><span class="code">If <span class="nsisvar">$0</span>==0 && <span class="nsisvar">$1</span>==1</span>: ExitCode of the elevated fork process (The NSIS errlvl is also set)</td></tr>
<tr><td><span class="nsisvar">$3</span></td><td><span class="code">If <span class="nsisvar">$0</span>==0</span>: 1 if the user is a member of the admin group or 0 otherwise</td></tr>
</table></td></tr>
<tr><td>Description:</td><td>Allows non-admin/UAC.LUA users to re-spawn the installer as another user and UAC.Admin users to elevate.</td></tr>
</table>
<!--table class="piexport"><tr><th colspan=2>UAC::RunElevatedAndProcessMessages <i style="font-size:smaller;">(Experimental)</i></th></tr>
<tr><td>Parameters:</td><td></td></tr>
<tr><td>Returns:</td><td><i>See UAC::RunElevated</i></td></tr>
<tr><td>Description:</td><td>Version of UAC::RunElevated that can be called from a page</td></tr>
</table-->
<table class="piexport"><tr><th colspan=2>UAC::Unload</th></tr>
<tr><td>Parameters:</td><td></td></tr>
<tr><td>Returns:</td><td></td></tr>
<tr><td>Description:</td><td>Cleanup, you must call this function in .OnInstFailed, .onUserAbort and .OnInstSuccess</td></tr>
</table>
<table class="piexport"><tr>
<th colspan=2>UAC::Exec</th></tr>
<tr><td>Parameters:</td><td>&lt;INT:ShowWindow&gt; &lt;STR:App&gt; &lt;STR:Parameters&gt; &lt;STR:WorkingDir&gt;</td></tr>
<tr><td>Returns:</td><td>
<table class="ret">
<tr><td><span class="nsisvar">$0</span></td><td>Win32 error code, 0 on success (ErrorFlag is also set on error)</td></tr>
</table></td></tr>
</table>
<table class="piexport"><tr>
<th colspan=2>UAC::ExecWait</th></tr>
<tr><td>Parameters:</td><td>&lt;INT:ShowWindow&gt; &lt;STR:App&gt; &lt;STR:Parameters&gt; &lt;STR:WorkingDir&gt;</td></tr>
<tr><td>Returns:</td><td>
<table class="ret">
<tr><td><span class="nsisvar">$0</span></td><td>Win32 error code, 0 on success (ErrorFlag is also set on error)</td></tr>
<tr><td><span class="nsisvar">$1</span></td><td>Exitcode of new process</td></tr>
</table></td></tr>
</table>
<table class="piexport"><tr>
<th colspan=2>UAC::ShellExec</th></tr>
<tr><td>Parameters:</td><td>&lt;STR:Verb&gt; &lt;INT:ShowWindow&gt; &lt;STR:App&gt; &lt;STR:Parameters&gt; &lt;STR:WorkingDir&gt;</td></tr>
<tr><td>Returns:</td><td>
<table class="ret">
<tr><td><span class="nsisvar">$0</span></td><td>Win32 error code, 0 on success (ErrorFlag is also set on error)</td></tr>
</table></td></tr>
</table>
<table class="piexport"><tr>
<th colspan=2>UAC::ShellExecWait</th></tr>
<tr><td>Parameters:</td><td>&lt;STR:Verb&gt; &lt;INT:ShowWindow&gt; &lt;STR:App&gt; &lt;STR:Parameters&gt; &lt;STR:WorkingDir&gt;</td></tr>
<tr><td>Returns:</td><td>
<table class="ret">
<tr><td><span class="nsisvar">$0</span></td><td>Win32 error code, 0 on success (ErrorFlag is also set on error)</td></tr>
<tr><td><span class="nsisvar">$1</span></td><td>Exitcode of new process</td></tr>
</table></td></tr>
</table>
<table class="piexport"><tr><th colspan=2>UAC::IsAdmin</th></tr>
<tr><td>Parameters:</td><td></td></tr>
<tr><td>Returns:</td><td><span class="nsisvar">$0</span> (BOOL) result</td></tr>
<tr><td>Description:</td><td>Check current thread/process token for a non-deny admin group SID entry</td></tr>
</table>
<table class="piexport"><tr><th colspan=2>UAC::ExecCodeSegment</th></tr>
<tr><td>Parameters:</td><td>&lt;INT:NSISFunctionAddress&gt;</td></tr>
<tr><td>Returns:</td><td>[None] (ErrorFlag is set on error)</td></tr>
<tr><td>Description:</td><td>Calls NSIS function in LUA/outer instance (If you use instructions that alter the UI or the stack/variables in the code segment (StrCpy,Push/Pop/Exch,DetailPrint etc.) they will affect the hidden wrapper installer and not "your" installer instance)</td></tr>
</table>
<table class="piexport"><tr><th colspan=2>UAC::StackPush</th></tr>
<tr><td>Parameters:</td><td>&lt;STR:String&gt;</td></tr>
<tr><td>Returns:</td><td>[None] (ErrorFlag is set on error)</td></tr>
<tr><td>Description:</td><td>Push to outer instance stack (For use with UAC::ExecCodeSegment)</td></tr>
</table>
<table class="piexport"><tr><th colspan=2>UAC::GetOuterHwnd</th></tr>
<tr><td>Parameters:</td><td></td></tr>
<tr><td>Returns:</td><td><span class="nsisvar">$0</span> HWNDPARENT of outer instance</td></tr>
<tr><td>Description:</td><td>For use with ${UAC.RunElevatedAndProcessMessages}</td></tr>
</table>
<table class="piexport"><tr><th colspan=2>UAC::SupportsUAC</th></tr>
<tr><td>Parameters:</td><td></td></tr>
<tr><td>Returns:</td><td><span class="nsisvar">$0</span> !=0 if supported</td></tr>
<tr><td>Description:</td><td>Check if the OS supports UAC (And the user has UAC turned on) <span class="importanttxt">This function only tests if UAC is active, will return 0 on NT5 even though runas is implemented on those platforms, will also return 0 on NT6+ if UAC is off. You should only call this function during testing, NOT to determine if you can call UAC::RunElevated</span></td></tr>
</table>
<table class="piexport"><tr><th colspan=2>UAC::GetElevationType</th></tr>
<tr><td>Parameters:</td><td></td></tr>
<tr><td>Returns:</td><td>
<table class="ret">
<tr><td><span class="nsisvar">$0</span></td><td><a href="#" OnClick="return NavGL('TOKEN_ELEVATION_TYPE Enumeration')">TOKEN_ELEVATION_TYPE</a>:
<table class="ret">
<tr><td>0</td><td>Unsupported/Failed (ErrorFlag is also set)</td></tr>
<tr><td>1</td><td>TokenElevationTypeDefault: User is not using a split token (UAC disabled)</td></tr>
<tr><td>2</td><td>TokenElevationTypeFull: UAC enabled, the (current) process is elevated</td></tr>
<tr><td>3</td><td>TokenElevationTypeLimited: UAC enabled, the process is not elevated</td></tr>
</table>
</td></tr>
</table></td></tr>
</table>
</div>
<a name="lang"><h2>Language support</h2></a><div class="CntSec">
<p>If the plugin is built with FEAT_CUSTOMRUNASDLG_TRANSLATE (Enabled by default),
you can extract a file named <span class="str">UAC.LNG</span> to <span class="nsisvar">$pluginsdir</span>.
It is a ini file with the following sections:
</p><pre class="inifile">
[MyRunAsCfg]
<span class="inicomment">;Set to 1 to disable the radio button</span>
DisableCurrUserOpt=
<span class="inicomment">;Set to 1 to hide the radio button</span>
HideCurrUserOpt=
[MyRunAsStrings]
DlgTitle=Hello There!
HelpText=Just do your thing!
<span class="inicomment">;Label for current user radio button, %s is replaced with result of GetUserNameEx(NameSamCompatible,...)</span>
OptCurrUser=Self service (%s)
OptOtherUser=Run as someone:
UserName=Who:
Pwd=PIN:
OK=Okey!
Cancel=No Way</pre>
</div>
<a name="knownissues"><h2>Known Issues</h2></a><div class="CntSec">
<ul>
<li>UACPI.KI#1: DetailPrint in outer process is ignored
<li>UACPI.KI#2: Elevation can fail if the installer is located on a remote share that requires authentication
</ul>
</div>
<a name="glossary"><h2>Glossary</h2></a><div class="CntSec">
<ul>
<li>AAM: Admin Approval Mode
<li>IL: Integrity level (Part of the new MIC/WIC security levels added to NT6)
<li>LUA: Limited/Least-privilege User Account
<li>MIC: <a href="http://en.wikipedia.org/wiki/Mandatory_Integrity_Control">Mandatory Integrity Controls</a> (Now known as WIC)
<li>UAC: User Account Control (Part of the UAP umbrella)
<li>UAP: User Account Protection
<li>WIC: <a href="http://www.securityfocus.com/infocus/1887">Windows Integrity Controls</a>
<li>Win32 error code: Standard windows error codes, ERROR_???
</ul>
</div>
</body></html>

View File

@@ -1,191 +0,0 @@
/*
=======================
UAC helper include file
.......................
Macros starting with UAC.I should only be called from the installer and vice versa for UAC.U macros.
*/
!ifndef UAC_HDR__INC
!define UAC_HDR__INC
!include LogicLib.nsh
!define UAC.RunElevatedAndProcessMessages 'UAC::RunElevated '
!define UAC.Unload 'UAC::Unload '
!define UAC.StackPush 'UAC::StackPush '
/*!macro _UAC.BuildOnInitElevationFunc _funcprefix
Function ${_funcprefix}onInit
!ifmacrodef
FunctionEnd
!macroend*/
!macro _UAC.GenerateSimpleFunction _funcprefix _funcName _funcCode
Function ${_funcprefix}${_funcName}
${_funcCode}
#messagebox mb_ok "${_funcprefix}${_funcName}"
FunctionEnd
!macroend
!macro _UAC.TryDef _d _v
!ifndef ${_d}
!define ${_d} "${_v}"
!endif
!macroend
!macro _UAC.InitStrings _modeprefix
!insertmacro _UAC.TryDef UACSTR.UnDataFile "UAC.dat"
!insertmacro _UAC.TryDef UACSTR.${_modeprefix}ElvWinErr "Unable to elevate , error $0"
!ifNdef __UNINSTALL__
!insertmacro _UAC.TryDef UACSTR.${_modeprefix}ElvAbortReqAdmin "This installer requires admin access, aborting!"
!insertmacro _UAC.TryDef UACSTR.${_modeprefix}ElvMustTryAgain "This installer requires admin access, try again"
!else
!insertmacro _UAC.TryDef UACSTR.${_modeprefix}ElvAbortReqAdmin "This uninstaller requires admin access, aborting!"
!insertmacro _UAC.TryDef UACSTR.${_modeprefix}ElvMustTryAgain "This uninstaller requires admin access, try again"
!endif
!macroend
!ifmacroNdef _UAC.GenerateUninstallerTango
!macro _UAC.GenerateUninstallerTango UninstallerFileName
!ifdef __GLOBAL__
!error "UAC: Needs to be called inside a function"
!endif
!ifNdef __UNINSTALL__
!error "UAC: _UAC.GenerateUninstallerTango should only be called by uninstaller, see http://forums.winamp.com/showthread.php?threadid=280330"
!endif
!ifNdef UAC_UNINSTALLERTANGOFORALLPLATFORMS
!include WinVer.nsh
!endif
!insertmacro _UAC.InitStrings 'U.'
ReadIniStr $0 "$ExeDir\${UACSTR.UnDataFile}" UAC "Un.Ready"
${IF} $0 != 1
!ifNdef UAC_UNINSTALLERTANGOFORALLPLATFORMS
${AndIf} ${AtLeastWinVista}
!endif
InitPluginsDir
WriteIniStr "$PluginsDir\${UACSTR.UnDataFile}" UAC "Un.Ready" 1
CopyFiles /SILENT "$EXEPATH" "$PluginsDir\${UninstallerFileName}"
StrCpy $0 ""
${IfThen} ${Silent} ${|} StrCpy $0 "/S " ${|}
ExecWait '"$PluginsDir\${UninstallerFileName}" $0/NCRC _?=$INSTDIR' $0
SetErrorLevel $0
Quit
${EndIf}
!macroend
!endif
!ifmacroNdef _UAC.GenerateOnInitElevationCode
!macro _UAC.GenerateOnInitElevationCode _modeprefix
!ifndef __FUNCTION__
!error "UAC: Needs to be called inside a function"
!endif
!insertmacro _UAC.InitStrings ${_modeprefix}
!define _UAC.GOIECUniq L${__LINE__}
UAC_Elevate_${_UAC.GOIECUniq}:
UAC::RunElevated
StrCmp 1223 $0 UAC_ElevationAborted_${_UAC.GOIECUniq} ; UAC dialog aborted by user?
StrCmp 0 $0 0 UAC_Err_${_UAC.GOIECUniq} ; Error?
StrCmp 1 $1 0 UAC_Success_${_UAC.GOIECUniq} ;Are we the real deal or just the wrapper?
Quit
UAC_Err_${_UAC.GOIECUniq}:
MessageBox mb_iconstop "${UACSTR.${_modeprefix}ElvWinErr}"
Abort
UAC_ElevationAborted_${_UAC.GOIECUniq}:
MessageBox mb_iconstop "${UACSTR.${_modeprefix}ElvAbortReqAdmin}"
Abort
UAC_Success_${_UAC.GOIECUniq}:
# if $0==0 && $3==1, we are a member of the admin group (Any OS)
# if $0==0 && $1==0, UAC not supported (Probably <NT6), run as normal?
# if $0==0 && $1==3, we can try to elevate again
StrCmp 1 $3 /*+4*/ UAC_Done_${_UAC.GOIECUniq} ;Admin?
StrCmp 3 $1 0 UAC_ElevationAborted_${_UAC.GOIECUniq} ;Try again or abort?
MessageBox mb_iconexclamation "${UACSTR.${_modeprefix}ElvMustTryAgain}" ;Inform user...
goto UAC_Elevate_${_UAC.GOIECUniq} ;...lets try again
UAC_Done_${_UAC.GOIECUniq}:
!undef _UAC.GOIECUniq
!macroend
!endif
!define UAC.I.Elevate.AdminOnly '!insertmacro UAC.I.Elevate.AdminOnly '
!macro UAC.I.Elevate.AdminOnly
!insertmacro _UAC.GenerateOnInitElevationCode 'I.'
!macroend
!define UAC.U.Elevate.AdminOnly '!insertmacro UAC.U.Elevate.AdminOnly '
!macro UAC.U.Elevate.AdminOnly _UninstallerName
!ifNdef UAC_DISABLEUNINSTALLERTANGO
!insertmacro _UAC.GenerateUninstallerTango "${_UninstallerName}"
!endif
!insertmacro _UAC.GenerateOnInitElevationCode 'U.'
!macroend
!define UAC.AutoCodeUnload '!insertmacro UAC.AutoCodeUnload '
!macro UAC.AutoCodeUnload _HasUninstaller
!insertmacro _UAC.GenerateSimpleFunction "" .OnInstFailed '${UAC.Unload}'
!insertmacro _UAC.GenerateSimpleFunction "" .OnInstSuccess '${UAC.Unload}'
!ifNdef MUI_INCLUDED
!insertmacro _UAC.GenerateSimpleFunction "" .onUserAbort '${UAC.Unload}'
!else
!ifNdef MUI_CUSTOMFUNCTION_ABORT
!error "UAC: must call $$ {UAC.Unload} in MUI_CUSTOMFUNCTION_ABORT!"
!endif
!endif
!if "${_HasUninstaller}" != ""
!insertmacro _UAC.GenerateSimpleFunction "un" .onUninstFailed '${UAC.Unload}'
!insertmacro _UAC.GenerateSimpleFunction "un" .onUninstSuccess '${UAC.Unload}'
!ifNdef MUI_INCLUDED
!insertmacro _UAC.GenerateSimpleFunction "un" .onUserAbort '${UAC.Unload}'
!else
!ifNdef MUI_CUSTOMFUNCTION_ABORT
!error "UAC: must call $$ {UAC.Unload} in MUI_CUSTOMFUNCTION_(UN)ABORT!"
!endif
!endif
!endif
!macroend
!define UAC.FastCallFunctionAsUser '!insertmacro UAC.FastCallFunctionAsUser '
!macro UAC.FastCallFunctionAsUser _func _var
GetFunctionAddress ${_var} ${_func}
UAC::ExecCodeSegment ${_var}
!macroend
!define UAC.CallFunctionAsUser '!insertmacro UAC.CallFunctionAsUser '
!macro UAC.CallFunctionAsUser _func
push $R9
!insertmacro UAC.FastCallFunctionAsUser ${_func} $R9
pop $R9
!macroend
!define UAC.FastCallGetOuterInstanceHwndParent UAC::GetOuterHwnd
!define UAC.GetOuterInstanceHwndParent '!insertmacro UAC.GetOuterInstanceHwndParent '
!macro UAC.GetOuterInstanceHwndParent _var
push $0
${UAC.FastCallGetOuterInstanceHwndParent}
Exch $0
Pop ${_var}
!macroend
!macro _UAC.DumpEx _disp _f _fp _v
${_f} ${_fp}
DetailPrint "${_disp}=${_v}"
!macroend
!macro _UAC.Dump _f _fp _v
!insertmacro _UAC.DumpEx `${_f}` `${_f}` `${_fp}` `${_v}`
!macroend
!macro _UAC.DbgDetailPrint
push $0
push $1
System::Call /NoUnload "advapi32::GetUserName(t.r0,*i${NSIS_MAX_STRLEN})"
System::Call "Kernel32::GetComputerName(t.r1,*i${NSIS_MAX_STRLEN})"
DetailPrint "$1\$0"
;!insertmacro _UAC.DumpEx "User" System::Call "advapi32::GetUserName(t.r0,*i${NSIS_MAX_STRLEN})" $0
!insertmacro _UAC.DumpEx "CmdLine" "" "" "$CmdLine"
!insertmacro _UAC.Dump UAC::IsAdmin "" $0
!insertmacro _UAC.Dump UAC::SupportsUAC "" $0
!insertmacro _UAC.Dump UAC::GetElevationType "" $0
pop $1
pop $0
!macroend
!endif /* ifndef UAC_HDR__INC */

View File

@@ -1,62 +0,0 @@
RequestExecutionLevel user /* RequestExecutionLevel REQUIRED! */
!define APPNAME "UAC_AdminOnly"
Name "${APPNAME}"
OutFile "${APPNAME}.exe"
ShowInstDetails show
!include UAC.nsh ;<<< New headerfile that does everything for you ;)
!include LogicLib.nsh
!define UACSTR.I.ElvAbortReqAdmin "This fancy app requires admin rights fool" ;custom error string, see _UAC.InitStrings macro in uac.nsh for more
Function .OnInit
${UAC.I.Elevate.AdminOnly}
FunctionEnd
Function .OnInstFailed
${UAC.Unload}
FunctionEnd
Function .OnInstSuccess
${UAC.Unload}
FunctionEnd
Function ExecCodeSegmentTest
${If} "$1" != "666, the # of the beast"
MessageBox mb_ok "uh oh"
${EndIf}
FunctionEnd
Section "Info"
!insertmacro _UAC.DbgDetailPrint
StrCpy $1 "666, the # of the beast"
!insertmacro UAC.CallFunctionAsUser ExecCodeSegmentTest
SectionEnd
page InstFiles
/* LEGACY CODE: (now uses magic code from UAC.nsh)
Function .OnInit
UAC_Elevate:
UAC::RunElevated
StrCmp 1223 $0 UAC_ElevationAborted ; UAC dialog aborted by user?
StrCmp 0 $0 0 UAC_Err ; Error?
StrCmp 1 $1 0 UAC_Success ;Are we the real deal or just the wrapper?
Quit
UAC_Err:
MessageBox mb_iconstop "Unable to elevate , error $0"
Abort
UAC_ElevationAborted:
/*System::Call "user32::CreateWindowEx(i ${WS_EX_TRANSPARENT}|${WS_EX_LAYERED}, t 'Button', t 'blah', i 0, i 10, i 10, i 10, i 10, i 0, i 0, i 0) i .r0"
ShowWindow $0 ${SW_SHOW}
System::Call "user32::SetForegroundWindow(i r0) i."
System::Call "user32::DestroyWindow(i r0) i."
* /
MessageBox mb_iconstop "This installer requires admin access, aborting!"
Abort
UAC_Success:
StrCmp 1 $3 +4 ;Admin?
StrCmp 3 $1 0 UAC_ElevationAborted ;Try again or abort?
MessageBox mb_iconstop "This installer requires admin access, try again" ;Inform user...
goto UAC_Elevate ;... and try again
FunctionEnd*/

View File

@@ -1,45 +0,0 @@
/*
This sample will try to elevate, but it will also allow non admin users to continue if they click cancel in the elevation dialog
*/
RequestExecutionLevel user /* RequestExecutionLevel REQUIRED! */
!define APPNAME "UAC_AllowLUA"
Name "${APPNAME}"
OutFile "${APPNAME}.exe"
ShowInstDetails show
!include UAC.nsh
Function .OnInstFailed
UAC::Unload ;Must call unload!
FunctionEnd
Function .OnInstSuccess
UAC::Unload ;Must call unload!
FunctionEnd
Function .OnInit
UAC::RunElevated
;MessageBox mb_iconinformation "Debug: UAC::RunElevated: $\n0(Error)=$0 $\n1(UACMode)=$1 $\n2=$2 $\nadmin=$3$\n$\n$CmdLine"
StrCmp 1223 $0 UAC_ElevationAborted ; UAC dialog aborted by user?
StrCmp 0 $0 0 UAC_Err ; Error?
StrCmp 1 $1 0 UAC_Success ;Are we the real deal or just the wrapper?
Quit
UAC_Err:
MessageBox mb_iconstop "Unable to elevate , error $0"
Abort
UAC_ElevationAborted:
# elevation was aborted, we still run as normal
UAC_Success:
FunctionEnd
Section "Info"
!insertmacro _UAC.DbgDetailPrint
SectionEnd
Page InstFiles

View File

@@ -1,30 +0,0 @@
RequestExecutionLevel user /* RequestExecutionLevel REQUIRED! */
!define APPNAME "UAC_GetUserShellFolderPath"
Name "${APPNAME}"
OutFile "${APPNAME}.exe"
ShowInstDetails show
!include UAC.nsh
!include LogicLib.nsh
page instfiles
Function .onInit
${UAC.I.Elevate.AdminOnly}
FunctionEnd
!ifndef CSIDL_PERSONAL
!define CSIDL_PERSONAL 0x0005 ;My Documents
!endif
Section
/*
You can specify a fallback value in the 2nd parameter, it is used if the installer is not elevated
or running on NT4/Win9x or on errors.
If you just want to check for success, use "" as the 2nd parameter and compare $0 with ""
*/
UAC::GetShellFolderPath ${CSIDL_PERSONAL} $Documents
DetailPrint MyDocs=$0
SectionEnd

View File

@@ -1,235 +0,0 @@
/*
This sample supports two modes, installing as a normal user (single user install) AND as admin (all users install)
This sample uses the registry plugin, so you need to download that if you don't already have it
*/
!define APPNAME "UAC_RealWorldFullyLoadedDualMode"
!define ELEVATIONTITLE "${APPNAME}: Elevate" ;displayed during elevation on our custom page
!define UNINSTALLER_NAME "Uninstall ${APPNAME}.exe"
!define UNINSTALLER_REGSECTION "${APPNAME}"
!define RegPath.MSUninstall "Software\Microsoft\Windows\CurrentVersion\Uninstall"
Name "${APPNAME}"
OutFile "${APPNAME}.exe"
ShowInstDetails show
SetCompressor LZMA
RequestExecutionLevel user /* RequestExecutionLevel REQUIRED! */
!include MUI.nsh
!include UAC.nsh
!include LogicLib.nsh
!include Registry.nsh
!include nsDialogs.nsh ;for our custom page
!include FileFunc.nsh ;we need to parse the command line
!insertmacro GetParameters
!insertmacro GetOptions
!define MUI_CUSTOMFUNCTION_ABORT onAbort
!define MUI_CUSTOMFUNCTION_GUIINIT onGuiInit
!define MUI_COMPONENTSPAGE_NODESC
!define MUI_FINISHPAGE_NOAUTOCLOSE
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\llama-blue.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\llama-blue.ico"
!define MUI_WELCOMEPAGE_TITLE_3LINES
var InstMode # 0: Single user, 1:All users, >1:elevated instance, perform page jump
var hKey # Reg hive
var hSelModeAdminRadio
var StartMenuFolder
!macro SetMode IsAdmin
!if "${IsAdmin}" > 0
SetShellVarContext all
StrCpy $InstMode 1
StrCpy $hKey HKLM
!else
SetShellVarContext current
StrCpy $InstMode 0
StrCpy $hKey HKCU
!endif
!macroend
Function .OnInit
!insertmacro SetMode 0
${GetParameters} $R9
${GetOptions} "$R9" UAC $0 ;look for special /UAC:???? parameter (sort of undocumented)
${Unless} ${Errors}
UAC::IsAdmin
${If} $0 < 1
SetErrorLevel 666 ;special return value for outer instance so it knows we did not have admin rights
Quit
${EndIf}
!insertmacro SetMode 1
StrCpy $InstMode 2
${EndIf}
FunctionEnd
Function onGuiInit
${If} $InstMode >= 2
${UAC.GetOuterInstanceHwndParent} $0
${If} $0 <> 0
System::Call /NOUNLOAD "*(i,i,i,i)i.r1"
System::Call /NOUNLOAD 'user32::GetWindowRect(i $0,i r1)i.r2'
${If} $2 <> 0
System::Call /NOUNLOAD "*$1(i.r2,i.r3)"
System::Call /NOUNLOAD 'user32::SetWindowPos(i $hwndParent,i0,ir2,ir3,i0,i0,i 4|1)'
${EndIf}
ShowWindow $hwndParent ${SW_SHOW}
ShowWindow $0 ${SW_HIDE} ;hide outer instance installer window
System::Free $1
${EndIf}
${EndIf}
FunctionEnd
Function Un.OnInit
!insertmacro SetMode 0
ReadRegDWORD $0 HKLM "${RegPath.MSUninstall}\${UNINSTALLER_REGSECTION}" InstMode ;We saved the "mode" in the installer
${If} $0 U> 0
; If it was installed for all users, we have to be admin to uninstall it
${UAC.U.Elevate.AdminOnly} "${UNINSTALLER_NAME}"
!insertmacro SetMode 1
${EndIf}
FunctionEnd
Function onAbort
${UAC.Unload}
FunctionEnd
${UAC.AutoCodeUnload} 1 ;Auto-generate .OnInstFailed and .OnInstSuccess functions
!define MUI_PAGE_CUSTOMFUNCTION_PRE SkipPageInElvModePreCB
!insertmacro MUI_PAGE_WELCOME
Page Custom ModeSelectionPageCreate ModeSelectionPageLeave
!define MUI_PAGE_CUSTOMFUNCTION_PRE CmpntsPreCB
!insertmacro MUI_PAGE_COMPONENTS
!define MUI_PAGE_CUSTOMFUNCTION_PRE DirPreCB
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_STARTMENU 1 $StartMenuFolder
!insertmacro MUI_PAGE_INSTFILES
!define MUI_FINISHPAGE_TITLE_3LINES
!define MUI_FINISHPAGE_RUN
!define MUI_FINISHPAGE_RUN_FUNCTION FinishRunCB
!insertmacro MUI_PAGE_FINISH
!define MUI_WELCOMEPAGE_TITLE_3LINES
!insertmacro MUI_UNPAGE_WELCOME
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
Function CmpntsPreCB
GetDlgItem $0 $hwndparent 3
${IfThen} $InstMode >= 1 ${|} EnableWindow $0 0 ${|} ;prevent user from going back and selecting single user so noobs don't end up installing as the wrong user
FunctionEnd
Function SkipPageInElvModePreCB
${IfThen} $InstMode > 1 ${|} Abort ${|} ;skip this page so we get to the mode selection page
FunctionEnd
Function ModeSelectionPageCreate
${If} $InstMode > 1
StrCpy $InstMode 1
Abort ;skip this page and contine where the "parent" would have gone
${EndIf}
!insertmacro MUI_HEADER_TEXT_PAGE "Select install type" "Blah blah blah blah"
nsDialogs::Create /NOUNLOAD 1018
Pop $0
${NSD_CreateLabel} 0 20u 75% 20u "Blah blah blah blah select install type..."
Pop $0
System::Call "advapi32::GetUserName(t.r0, *i ${NSIS_MAX_STRLEN}r1) i.r2"
${NSD_CreateRadioButton} 0 40u 75% 15u "Single User ($0)"
Pop $0
${IfThen} $InstMode U< 1 ${|} SendMessage $0 ${BM_SETCHECK} 1 0 ${|}
${NSD_CreateRadioButton} 0 60u 75% 15u "All users"
Pop $hSelModeAdminRadio
${IfThen} $InstMode U> 0 ${|} SendMessage $hSelModeAdminRadio ${BM_SETCHECK} 1 0 ${|}
nsDialogs::Show
FunctionEnd
!macro EnableCtrl dlg id state
push $language
GetDlgItem $language ${dlg} ${id}
EnableWindow $language ${state}
pop $language
!macroend
Function ModeSelectionPageLeave
SendMessage $hSelModeAdminRadio ${BM_GETCHECK} 0 0 $9
UAC::IsAdmin
${If} $9 U> 0
${If} $0 <> 0
!insertmacro SetMode 1
${Else}
System::Call /NoUnload 'user32::GetWindowText(i $HwndParent,t.R1,i ${NSIS_MAX_STRLEN})' ;get original window title
System::Call /NoUnload 'user32::SetWindowText(i $HwndParent,t "${ELEVATIONTITLE}")' ;set out special title
StrCpy $2 "" ;reset special return, only gets set when sub process is executed, not when user cancels
!insertmacro EnableCtrl $HWNDParent 1 0 ;Disable next button, just because it looks good ;)
${UAC.RunElevatedAndProcessMessages}
!insertmacro EnableCtrl $HWNDParent 1 1
System::Call 'user32::SetWindowText(i $HwndParent,t "$R1")' ;restore title
${If} $2 = 666 ;our special return, the new process was not admin after all
MessageBox mb_iconExclamation "You need to login with an account that is a member of the admin group to continue..."
Abort
${ElseIf} $0 = 1223 ;cancel
Abort
${Else}
${If} $0 <> 0
${If} $0 = 1062
MessageBox mb_iconstop "Unable to elevate, Secondary Logon service not running!"
${Else}
MessageBox mb_iconstop "Unable to elevate, error $0 ($1,$2,$3)"
${EndIf}
Abort
${EndIf}
${EndIf}
Quit ;We now have a new process, the install will continue there, we have nothing left to do here
${EndIf}
${EndIf}
FunctionEnd
Function DirPreCB
${If} $InstDir == ""
${If} $InstMode U> 0
StrCpy $InstDir "$ProgramFiles\${APPNAME}"
${Else}
StrCpy $InstDir "$APPDATA\${APPNAME}"
${EndIf}
${EndIf}
FunctionEnd
Function FinishRunCB
UAC::Exec "" "Notepad.exe" "$Windir\Win.INI" "$InstDir"
FunctionEnd
Function CreateSMShortcuts
CreateShortcut "$SMPrograms\${APPNAME}.lnk" "$Windir\Notepad.exe"
FunctionEnd
Function CreateDeskShortcuts
CreateShortcut "$Desktop\${APPNAME}.lnk" "$Windir\Notepad.exe"
FunctionEnd
Section "!Required files"
SectionIn RO
SetOutPath -
!insertmacro _UAC.DbgDetailPrint ;some debug info, useful during testing
;Install files here...
WriteUninstaller "$InstDir\${UNINSTALLER_NAME}"
${registry::Write} "$hKey\${RegPath.MSUninstall}\${UNINSTALLER_REGSECTION}" DisplayName "${APPNAME}" REG_SZ $0
${registry::Write} "$hKey\${RegPath.MSUninstall}\${UNINSTALLER_REGSECTION}" UninstallString "$InstDir\${UNINSTALLER_NAME}" REG_SZ $0
${registry::Write} "$hKey\${RegPath.MSUninstall}\${UNINSTALLER_REGSECTION}" InstMode $InstMode REG_DWORD $0
${registry::Unload}
SectionEnd
Section "Startmenu Shortcuts"
${UAC.CallFunctionAsUser} CreateSMShortcuts
SectionEnd
Section "Desktop Shortcut"
${UAC.CallFunctionAsUser} CreateDeskShortcuts
SectionEnd
Section Uninstall
Delete "$InstDir\${UNINSTALLER_NAME}"
Delete "$SMPrograms\${APPNAME}.lnk"
Delete "$Desktop\${APPNAME}.lnk"
RMDir "$InstDir"
${registry::DeleteKey} "$hKey\${RegPath.MSUninstall}\${UNINSTALLER_REGSECTION}" $0
${registry::Unload}
SectionEnd

View File

@@ -1,49 +0,0 @@
/*
This script was made in response to http://forums.winamp.com/showthread.php?threadid=280330
It is a ugly hack and is mostly here just to have a solution right now.
Hopefully, NSIS will add support for changing the RequestExecutionLevel of the uninstaller
This code inspired the _UAC.GenerateUninstallerTango macro (called by ${UAC.U.Elevate.AdminOnly} unless you define UAC_DISABLEUNINSTALLERTANGO)
*/
RequestExecutionLevel user /* RequestExecutionLevel REQUIRED! */
!define APPNAME "UAC_Uninstaller"
Name "${APPNAME}"
OutFile "${APPNAME}.exe"
ShowInstDetails show
!include LogicLib.nsh
!define UNINSTALLER_UACDATA "uac.ini"
!define UNINSTALLER_NAME "Uninstall FooBarBaz"
Function un.onInit
ReadIniStr $0 "$ExeDir\${UNINSTALLER_UACDATA}" UAC "Un.First"
${IF} $0 != 1
;SetSilent silent
InitPluginsDir
WriteIniStr "$PluginsDir\${UNINSTALLER_UACDATA}" UAC "Un.First" 1
CopyFiles /SILENT "$EXEPATH" "$PluginsDir\${UNINSTALLER_NAME}.exe"
StrCpy $0 ""
${IfThen} ${Silent} ${|} StrCpy $0 "/S " ${|}
ExecWait '"$PluginsDir\${UNINSTALLER_NAME}.exe" $0/NCRC _?=$INSTDIR' $0
SetErrorLevel $0
Quit
${EndIf}
# UAC code goes here ...
FunctionEnd
Section
WriteUninstaller "$exedir\${UNINSTALLER_NAME}.exe"
SetAutoClose true
DetailPrint "Uninstalling..."
Sleep 1111
Exec '"$exedir\${UNINSTALLER_NAME}.exe"'
SectionEnd
Section uninstall
MessageBox mb_ok "My filename is: $EXEFILE"
Delete "$instdir\${UNINSTALLER_NAME}.exe"
Delete "$instdir\${APPNAME}.exe" ;delete generated installer aswell, this is just a sample script
SectionEnd
page InstFiles

View File

@@ -1,24 +0,0 @@
//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by resource.rc
//
#define IDD_MYRUNAS 101
#define IDC_RUNASCURR 1000
#define IDC_RUNASSPEC 1001
#define IDC_SHICON 1002
#define IDC_HELPTEXT 1003
#define IDC_USERNAME 1004
#define IDC_PASSWORD 1005
#define IDC_LBLUSER 1007
#define IDC_LBLPWD 1008
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 102
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1009
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

View File

@@ -1,109 +0,0 @@
//Microsoft Developer Studio generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
#include "uac.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_MYRUNAS DIALOG DISCARDABLE 0, 0, 250, 145
STYLE DS_MODALFRAME | DS_NOIDLEMSG | DS_SETFOREGROUND | DS_FIXEDSYS |
DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "&OK",IDOK,132,122,50,14
PUSHBUTTON "Ca&ncel",IDCANCEL,188,122,50,14
ICON "",IDC_SHICON,7,7,20,20
LTEXT "",IDC_HELPTEXT,34,7,204,35
CONTROL "",IDC_RUNASCURR,"Button",BS_AUTORADIOBUTTON,20,49,218,
10
CONTROL "",IDC_RUNASSPEC,"Button",BS_AUTORADIOBUTTON,20,65,218,
10
LTEXT "&User name:",IDC_LBLUSER,20,84,42,16
EDITTEXT IDC_USERNAME,63,83,175,14,ES_AUTOHSCROLL
LTEXT "&Password:",IDC_LBLPWD,20,102,42,20
EDITTEXT IDC_PASSWORD,63,100,175,14,ES_PASSWORD | ES_AUTOHSCROLL
END
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE
BEGIN
IDD_MYRUNAS, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 238
TOPMARGIN, 7
BOTTOMMARGIN, 136
END
END
#endif // APSTUDIO_INVOKED
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE DISCARDABLE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""afxres.h""\r\n"
"#include ""uac.h""\r\n"
"\0"
END
3 TEXTINCLUDE DISCARDABLE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
#endif // English (U.S.) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

File diff suppressed because it is too large Load Diff

View File

@@ -1,169 +0,0 @@
//Copyright (C) 2007 Anders Kjersem. Licensed under the zlib/libpng license, see License.txt for details.
#pragma once
/** /#define BUILD_DBGRELEASE // Include simple debug output in release version */
/** /#define BUILD_DBGSELECTELVMODE //Test MyRunAs*/
/** /#define UNICODE // Unicode build */
/**/#define FEAT_CUSTOMRUNASDLG // Include custom runas dialog */
/**/#define FEAT_CUSTOMRUNASDLG_TRANSLATE //*/
/**/#define FEAT_MSRUNASDLGMODHACK // Default to other user radio button */
#if !defined(APSTUDIO_INVOKED) && !defined(RC_INVOKED)
#if (defined(_MSC_VER) && !defined(_DEBUG))
#pragma comment(linker,"/opt:nowin98")
#pragma comment(linker,"/ignore:4078")
#pragma comment(linker,"/merge:.rdata=.text")
//#pragma intrinsic(memset) //http://www.codeguru.com/forum/showthread.php?t=371491&page=2&pp=15 | http://www.ddj.com/windows/184416623
#endif
#if defined(UNICODE) && !defined(_UNICODE)
#define _UNICODE
#endif
#ifdef _UNICODE
#define TFUNCSUFFIX W
#else
#define TFUNCSUFFIX A
#endif
#define _PCJOIN(a,b) a##b
#define PCJOIN(a,b) _PCJOIN(a,b)
#define _WIN32_WINNT 0x0501
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <ShellAPI.h>
#include <TChar.h>
#include "NSISUtil.h"
#ifndef SEE_MASK_NOZONECHECKS
#define SEE_MASK_NOZONECHECKS 0x00800000
#endif
#define COUNTOF(___c) ( sizeof(___c)/sizeof(___c[0]) )
#ifndef ARRAYSIZE
#define ARRAYSIZE COUNTOF
#endif
#define FORCEINLINE __forceinline
#if _MSC_VER >= 1400
extern void* __cdecl memset(void*mem,int c,size_t len);
#endif
FORCEINLINE LRESULT MySndDlgItemMsg(HWND hDlg,int id,UINT Msg,WPARAM wp=0,LPARAM lp=0) {return SendMessage(GetDlgItem(hDlg,id),Msg,wp,lp);}
#ifndef UAC_NOCUSTOMIMPLEMENTATIONS
FORCEINLINE HANDLE WINAPI GetCurrentProcess(){return ((HANDLE)(-1));}
FORCEINLINE HANDLE WINAPI GetCurrentThread(){return ((HANDLE)(-2));}
#define MyTStrLen lstrlen
#undef lstrcpy
#define lstrcpy MyTStrCpy
FORCEINLINE LPTSTR MyTStrCpy(LPTSTR s1,LPCTSTR s2) {return PCJOIN(lstr,PCJOIN(cpyn,TFUNCSUFFIX))(s1,s2,0x7FFFFFFF);}
#undef lstrcat
#define lstrcat MyTStrCat
LPTSTR MyTStrCat(LPTSTR s1,LPCTSTR s2)
#ifdef UAC_INITIMPORTS
{return s1?MyTStrCpy(&s1[MyTStrLen(s1)],s2):NULL;}
#else
;
#endif //UAC_INITIMPORTS
#endif //UAC_NOCUSTOMIMPLEMENTATIONS
//DelayLoaded functions:
typedef BOOL (WINAPI*ALLOWSETFOREGROUNDWINDOW)(DWORD dwProcessId);
typedef BOOL (WINAPI*OPENPROCESSTOKEN)(HANDLE ProcessHandle,DWORD DesiredAccess,PHANDLE TokenHandle);
typedef BOOL (WINAPI*OPENTHREADTOKEN)(HANDLE ThreadHandle,DWORD DesiredAccess,BOOL OpenAsSelf,PHANDLE TokenHandle);
typedef BOOL (WINAPI*GETTOKENINFORMATION)(HANDLE hToken,TOKEN_INFORMATION_CLASS TokInfoClass,LPVOID TokInfo,DWORD TokInfoLenh,PDWORD RetLen);
typedef BOOL (WINAPI*ALLOCATEANDINITIALIZESID)(PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority,BYTE nSubAuthorityCount,DWORD sa0,DWORD sa1,DWORD sa2,DWORD sa3,DWORD sa4,DWORD sa5,DWORD sa6,DWORD sa7,PSID*pSid);
typedef PVOID (WINAPI*FREESID)(PSID pSid);
typedef BOOL (WINAPI*EQUALSID)(PSID pSid1,PSID pSid2);
typedef BOOL (WINAPI*CHECKTOKENMEMBERSHIP)(HANDLE TokenHandle,PSID SidToCheck,PBOOL IsMember);
#ifdef FEAT_CUSTOMRUNASDLG
typedef BOOL (WINAPI*GETUSERNAME)(LPTSTR lpBuffer,LPDWORD nSize);
typedef BOOL (WINAPI*CREATEPROCESSWITHLOGONW)(LPCWSTR lpUsername,LPCWSTR lpDomain,LPCWSTR lpPassword,DWORD dwLogonFlags,LPCWSTR lpApplicationName,LPWSTR lpCommandLine,DWORD dwCreationFlags,LPVOID pEnv,LPCWSTR WorkDir,LPSTARTUPINFOW pSI,LPPROCESS_INFORMATION pPI);
#define SECURITY_WIN32
#include <Security.h>//NameSamCompatible
typedef BOOLEAN (WINAPI*GETUSERNAMEEX)(EXTENDED_NAME_FORMAT NameFormat,LPTSTR lpNameBuffer,PULONG nSize);
#endif
#ifdef UAC_INITIMPORTS
ALLOWSETFOREGROUNDWINDOW _AllowSetForegroundWindow=0;
OPENPROCESSTOKEN _OpenProcessToken=0;
OPENTHREADTOKEN _OpenThreadToken=0;
GETTOKENINFORMATION _GetTokenInformation=0;
ALLOCATEANDINITIALIZESID _AllocateAndInitializeSid=0;
FREESID _FreeSid=0;
EQUALSID _EqualSid=0;
CHECKTOKENMEMBERSHIP _CheckTokenMembership=0;
#ifdef FEAT_CUSTOMRUNASDLG
GETUSERNAME _GetUserName=0;
GETUSERNAMEEX _GetUserNameEx=0;
CREATEPROCESSWITHLOGONW _CreateProcessWithLogonW=0;
#endif
#else
#ifdef FEAT_CUSTOMRUNASDLG
extern GETUSERNAME _GetUserName;
extern GETUSERNAMEEX _GetUserNameEx;
extern CREATEPROCESSWITHLOGONW _CreateProcessWithLogonW;
#endif
#endif /* UAC_INITIMPORTS */
extern DWORD DelayLoadDlls();
#ifdef FEAT_CUSTOMRUNASDLG
extern DWORD MyRunAs(HINSTANCE hInstDll,SHELLEXECUTEINFO&sei);
#endif
#if !defined(NTDDI_VISTA) || defined(BUILD_OLDSDK)
//#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < 0x06000000) || !defined(NTDDI_VISTA)
//#if !defined(TOKEN_ELEVATION_TYPE) || defined(BUILD_OLDSDK)
enum TOKEN_ELEVATION_TYPE {
TokenElevationTypeDefault = 1,
TokenElevationTypeFull,
TokenElevationTypeLimited
};
enum _TOKEN_INFORMATION_CLASS___VISTA {
TokenElevationType = (TokenOrigin+1),
TokenLinkedToken,
TokenElevation,
TokenHasRestrictions,
TokenAccessInformation,
TokenVirtualizationAllowed,
TokenVirtualizationEnabled,
TokenIntegrityLevel,
TokenUIAccess,
TokenMandatoryPolicy,
TokenLogonSid,
};
#endif
#if defined(_DEBUG) || defined(BUILD_DBGRELEASE)
//Simple debug helpers:
#define BUILD_DBG
/** /#define BUILD_XPTEST //Pretend UAC exists and "elevate" with NT runas */
#define DBG_RESETDBGVIEW() do{HWND hDbgView=FindWindowA("dbgviewClass",0);PostMessage(hDbgView,WM_COMMAND,40020,0);if(0)SetForegroundWindow(hDbgView);}while(0)
#define _pp_MakeStr_(x) #x
#define pp_MakeStr(x) _pp_MakeStr_(x)
#define TRACE OutputDebugStringA
#define DBGONLY(_x) _x
#ifndef ASSERT
#define ASSERT(_x) do{if(!(_x)){MessageBoxA(GetActiveWindow(),#_x##"\n\n"##__FILE__##":"## pp_MakeStr(__LINE__),"SimpleAssert",0);/*TRACE(#_x##"\n"##__FILE__##":" pp_MakeStr(__LINE__)"\n");*/}}while(0)
#endif
#define VERIFY(_x) ASSERT(_x)
static void TRACEF(const char*fmt,...) {va_list a;va_start(a,fmt);static TCHAR b[1024*4];if (sizeof(TCHAR)!=sizeof(char)){static TCHAR fmtBuf[COUNTOF(b)];VERIFY(wsprintf(fmtBuf,_T("%hs"),fmt)<COUNTOF(fmtBuf));fmt=(LPCSTR)fmtBuf;}wvsprintf(b,(TCHAR*)fmt,a);OutputDebugString(b);}
#else
#define TRACE /*(void)0*/
#define DBGONLY(_x)
#define ASSERT(_x)
#define VERIFY(_x) ((void)(_x))
#define TRACEF TRACE
#endif /* DEBUG */
#endif /* APSTUDIO_INVOKED */

View File

@@ -441,7 +441,6 @@ Section "${APPLICATION_NAME}" SEC_APPLICATION
File "${MING_BIN}\libGLESv2.dll"
File "${MING_BIN}\libjpeg-8.dll"
File "${MING_BIN}\libpcre16-0.dll"
File "${MING_BIN}\libproxy.dll"
File "${MING_BIN}\libsqlite3-0.dll"
File "${MING_BIN}\libcrypto-10.dll"
File "${MING_BIN}\libssl-10.dll"

View File

@@ -151,11 +151,12 @@ CSYNC_EXCLUDE_TYPE csync_excluded(CSYNC *ctx, const char *path, int filetype) {
return match;
}
// See http://support.microsoft.com/kb/74496
static const char *win_reserved_words[] = {"CON","PRN","AUX", "NUL",
"COM1", "COM2", "COM3", "COM4",
"LPT1", "LPT2", "LPT3", "CLOCK$" };
// See http://support.microsoft.com/kb/74496 and
// https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx
// Additionally, we ignore '$Recycle.Bin', see https://github.com/owncloud/client/issues/2955
static const char* win_reserved_words[] = {"CON", "PRN", "AUX", "NUL", "COM1", "COM2", "COM3", "COM4", "COM5",
"COM6", "COM7", "COM8", "COM9", "LPT1", "LPT2", "LPT3", "LPT4",
"LPT5", "LPT6", "LPT7", "LPT8", "LPT9", "CLOCK$", "$Recycle.Bin" };
bool csync_is_windows_reserved_word(const char* filename) {

View File

@@ -151,9 +151,9 @@ ownCloud Client provides the ability to add custom patterns.
By default, the ownCloud Client ignores the following files:
- Files matched by one of the patterns defined in :ref:`ignoredFilesEditor-label`.
- Files containing characters that do not work on certain file systems (`\, /, :, ?, *, ", >, <, |`).
* Files starting in ``.csync_journal.db*``, as these files are reserved for journalling.
* Files matched by one of the patterns defined in the Ignored Files Editor
* Files containing characters that do not work on certain file systems ``(`\, /, :, ?, *, ", >, <, |`)``.
* Files starting in ``.csync_journal.db``, as these files are reserved for journalling.
If a pattern selected using a checkbox in the `ignoredFilesEditor-label` (or if
a line in the exclude file starts with the character `]` directly followed by
@@ -204,3 +204,69 @@ journal. This function can be used to recreate the journal database.
.. note:: We recommend that you use this function only when advised to do so by
ownCloud support staff.
Custom WebDAV Properties
------------------------
In the communication between client and server a couple of custom WebDAV properties
were introduced. They are either needed for sync functionality or help have a positive
effect on synchronization performance.
This chapter describes additional xml elements which the server returns in response
to a successful PROPFIND request on a file or directory. The elements are returned in
the namespace oc.
Server Side Permissions
------------------------
The XML element ``<oc:permissions>`` represents the permission- and sharing state of the
item. It is a list of characters, and each of the chars has a meaning as outlined
in the table below:
+----+----------------+-------------------------------------------+
|Code| Resource | Description |
+----+----------------+-------------------------------------------+
| S | File or Folder | is shared |
+----+----------------+-------------------------------------------+
| R | File or Folder | can share (includes reshare) |
+----+----------------+-------------------------------------------+
| M | File or Folder | is mounted (like on DropBox, Samba, etc.) |
+----+----------------+-------------------------------------------+
| W | File | can write file |
+----+----------------+-------------------------------------------+
| C | Folder |can create file in folder |
+----+----------------+-------------------------------------------+
| K | Folder | can create folder (mkdir) |
+----+----------------+-------------------------------------------+
| D | File or Folder |can delete file or folder |
+----+----------------+-------------------------------------------+
| N | File or Folder | can rename file or folder |
+----+----------------+-------------------------------------------+
| V | File or Folder | can move file or folder |
+----+----------------+-------------------------------------------+
Example:
<oc:permissions>RDNVCK</oc:permissions>
File- or Directory Size
-----------------------
The XML element ``<oc:size>`` represents the file- or directory size in bytes. For
directories, the size of the whole file tree underneath the directory is accumulated.
Example:
<oc:size>2429176697</oc:size>
FileID
------
The XML element ``<oc:id>`` represents the so called file ID. It is a non volatile string id
that stays constant as long as the file exists. It is not changed if the file changes or
is renamed or moved.
Example:
<oc:id>00000020oc5cfy6qqizm</oc:id>

View File

@@ -168,7 +168,7 @@ IFACEMETHODIMP OCContextMenu::QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT
assert(!info.shareMenuTitle.empty());
MENUITEMINFO mii = { sizeof(mii) };
mii.fMask = MIIM_BITMAP | MIIM_STRING | MIIM_FTYPE | MIIM_ID | MIIM_STATE;
mii.fMask = MIIM_STRING | MIIM_FTYPE | MIIM_ID | MIIM_STATE;
mii.wID = idCmdFirst + IDM_SHARE;
mii.fType = MFT_STRING;
mii.dwTypeData = &info.shareMenuTitle[0];

View File

@@ -12,6 +12,8 @@
* details.
*/
#include "stdafx.h"
#include "CommunicationSocket.h"
#include "UtilConstants.h"
#include "StringUtil.h"

View File

@@ -105,6 +105,7 @@
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PrecompiledHeader>Use</PrecompiledHeader>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -118,6 +119,7 @@
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PrecompiledHeader>Use</PrecompiledHeader>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -133,6 +135,7 @@
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PrecompiledHeader>Use</PrecompiledHeader>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -159,6 +162,8 @@
<ClCompile Include="stdafx.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
</ClCompile>
<ClCompile Include="StringUtil.cpp" />
</ItemGroup>

View File

@@ -50,4 +50,16 @@ if(NOT BUILD_LIBRARIES_ONLY)
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif()
# FIXME: The following lines are dup in src/gui and src/cmd because it needs to be done after both are installed
#FIXME: find a nice solution to make the second if(BUILD_OWNCLOUD_OSX_BUNDLE) unnecessary
# currently it needs to be done because the code right above needs to be executed no matter
# if building a bundle or not and the install_qt4_executable needs to be called afterwards
if(BUILD_OWNCLOUD_OSX_BUNDLE)
get_target_property (QT_QMAKE_EXECUTABLE Qt5::qmake IMPORTED_LOCATION)
install(CODE "
message(STATUS \"Deploying (Qt) dependencies and fixing library pathes...\")
execute_process(COMMAND \"${CMAKE_SOURCE_DIR}/admin/osx/macdeployqt.py\" ${CMAKE_INSTALL_PREFIX}/${OWNCLOUD_OSX_BUNDLE} ${QT_QMAKE_EXECUTABLE})
" COMPONENT RUNTIME)
endif()
endif()

View File

@@ -42,6 +42,10 @@
#include <windows.h>
#endif
#if defined(WITH_CRASHREPORTER)
#include <libcrashreporter-handler/Handler.h>
#endif
#include <QTranslator>
#include <QMenu>
#include <QMessageBox>
@@ -106,6 +110,11 @@ Application::Application(int &argc, char **argv) :
if (isRunning())
return;
#if defined(WITH_CRASHREPORTER)
if (ConfigFile().crashReporter())
_crashHandler.reset(new CrashReporter::Handler( QDir::tempPath(), true, CRASHREPORTER_EXECUTABLE ));
#endif
setupLogging();
setupTranslations();
@@ -149,8 +158,8 @@ Application::Application(int &argc, char **argv) :
slotAccountStateAdded(ai);
}
connect(FolderMan::instance()->socketApi(), SIGNAL(shareCommandReceived(QString, QString)),
_gui, SLOT(slotShowShareDialog(QString, QString)));
connect(FolderMan::instance()->socketApi(), SIGNAL(shareCommandReceived(QString, QString, bool)),
_gui, SLOT(slotShowShareDialog(QString, QString, bool)));
// startup procedure.
connect(&_checkConnectionTimer, SIGNAL(timeout()), this, SLOT(slotCheckConnection()));

View File

@@ -34,6 +34,10 @@ class QMessageBox;
class QSystemTrayIcon;
class QSocket;
namespace CrashReporter {
class Handler;
}
namespace OCC {
class Theme;
class Folder;
@@ -109,6 +113,9 @@ private:
QTimer _checkConnectionTimer;
#if defined(WITH_CRASHREPORTER)
QScopedPointer<CrashReporter::Handler> _crashHandler;
#endif
QScopedPointer<FolderMan> _folderManager;
friend class ownCloudGui; // for _startupNetworkError

View File

@@ -21,6 +21,7 @@
#include "account.h"
#include "accountmigrator.h"
#include "accountstate.h"
#include "filesystem.h"
#ifdef Q_OS_MAC
#include <CoreServices/CoreServices.h>
@@ -105,7 +106,6 @@ void FolderMan::unloadFolder( const QString& alias )
_socketApi->slotUnregisterPath(alias);
}
_folderChangeSignalMapper->removeMappings(f);
if( _folderWatchers.contains(alias)) {
_folderWatchers.remove(alias);
}
@@ -852,9 +852,10 @@ bool FolderMan::startFromScratch( const QString& localFolder )
// Make a backup of the folder/file.
QString newName = getBackupName( parentDir.absoluteFilePath( folderName ) );
if( !parentDir.rename( fi.absoluteFilePath(), newName ) ) {
QString renameError;
if( !FileSystem::rename( fi.absoluteFilePath(), newName, &renameError ) ) {
qDebug() << "startFromScratch: Could not rename" << fi.absoluteFilePath()
<< "to" << newName;
<< "to" << newName << "error:" << renameError;
return false;
}
}

View File

@@ -19,6 +19,7 @@
#include "networkjobs.h"
#include "account.h"
#include "selectivesyncdialog.h"
#include "creds/abstractcredentials.h"
#include <QDebug>
#include <QDesktopServices>
@@ -238,10 +239,13 @@ FolderWizardRemotePath::FolderWizardRemotePath(AccountPtr account)
connect(_ui.addFolderButton, SIGNAL(clicked()), SLOT(slotAddRemoteFolder()));
connect(_ui.refreshButton, SIGNAL(clicked()), SLOT(slotRefreshFolders()));
connect(_ui.folderTreeWidget, SIGNAL(itemClicked(QTreeWidgetItem*,int)), SIGNAL(completeChanged()));
connect(_ui.folderTreeWidget, SIGNAL(itemActivated(QTreeWidgetItem*,int)), SIGNAL(completeChanged()));
connect(_ui.folderTreeWidget, SIGNAL(itemExpanded(QTreeWidgetItem*)), SLOT(slotItemExpanded(QTreeWidgetItem*)));
connect(_ui.folderTreeWidget, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(slotCurrentItemChanged(QTreeWidgetItem*)));
connect(_ui.folderEntry, SIGNAL(textEdited(QString)), SLOT(slotFolderEntryEdited(QString)));
_lscolTimer.setInterval(500);
_lscolTimer.setSingleShot(true);
connect(&_lscolTimer, SIGNAL(timeout()), SLOT(slotLsColFolderEntry()));
}
void FolderWizardRemotePath::slotAddRemoteFolder()
@@ -293,8 +297,12 @@ void FolderWizardRemotePath::slotCreateRemoteFolderFinished(QNetworkReply::Netwo
void FolderWizardRemotePath::slotHandleNetworkError(QNetworkReply *reply)
{
qDebug() << "** webdav mkdir request failed:" << reply->error();
showWarn(tr("Failed to create the folder on %1. Please check manually.")
.arg(Theme::instance()->appNameGUI()));
if( reply && !_account->credentials()->stillValid(reply) ) {
showWarn(tr("Authentication failed accessing %1").arg(Theme::instance()->appNameGUI()));
} else {
showWarn(tr("Failed to create the folder on %1. Please check manually.")
.arg(Theme::instance()->appNameGUI()));
}
}
static QTreeWidgetItem* findFirstChild(QTreeWidgetItem *parent, const QString& text)
@@ -310,27 +318,58 @@ static QTreeWidgetItem* findFirstChild(QTreeWidgetItem *parent, const QString& t
void FolderWizardRemotePath::recursiveInsert(QTreeWidgetItem *parent, QStringList pathTrail, QString path)
{
QFileIconProvider prov;
QIcon folderIcon = prov.icon(QFileIconProvider::Folder);
if (pathTrail.size() == 0) {
if (path.endsWith('/')) {
path.chop(1);
}
parent->setToolTip(0, path);
parent->setData(0, Qt::UserRole, path);
} else {
QTreeWidgetItem *item = findFirstChild(parent, pathTrail.first());
if (!item) {
item = new QTreeWidgetItem(parent);
item->setIcon(0, folderIcon);
item->setText(0, pathTrail.first());
item->setData(0, Qt::UserRole, pathTrail.first());
item->setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator);
}
if (pathTrail.isEmpty())
return;
pathTrail.removeFirst();
recursiveInsert(item, pathTrail, path);
const QString parentPath = parent->data(0, Qt::UserRole).toString();
const QString folderName = pathTrail.first();
QString folderPath;
if (parentPath == QLatin1String("/")) {
folderPath = folderName;
} else {
folderPath = parentPath + "/" + folderName;
}
QTreeWidgetItem *item = findFirstChild(parent, folderName);
if (!item) {
item = new QTreeWidgetItem(parent);
QFileIconProvider prov;
QIcon folderIcon = prov.icon(QFileIconProvider::Folder);
item->setIcon(0, folderIcon);
item->setText(0, folderName);
item->setData(0, Qt::UserRole, folderPath);
item->setToolTip(0, folderPath);
item->setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator);
}
pathTrail.removeFirst();
recursiveInsert(item, pathTrail, path);
}
bool FolderWizardRemotePath::selectByPath(QString path)
{
if (path.startsWith(QLatin1Char('/'))) {
path = path.mid(1);
}
if (path.endsWith(QLatin1Char('/'))) {
path.chop(1);
}
QTreeWidgetItem *it = _ui.folderTreeWidget->topLevelItem(0);
if (!path.isEmpty()) {
const QStringList pathTrail = path.split(QLatin1Char('/'));
foreach (const QString& path, pathTrail) {
if (!it) {
return false;
}
it = findFirstChild(it, path);
}
}
if (!it) {
return false;
}
_ui.folderTreeWidget->setCurrentItem(it);
return true;
}
void FolderWizardRemotePath::slotUpdateDirectories(const QStringList &list)
@@ -362,6 +401,7 @@ void FolderWizardRemotePath::slotRefreshFolders()
SLOT(slotUpdateDirectories(QStringList)));
job->start();
_ui.folderTreeWidget->clear();
_ui.folderEntry->clear();
}
void FolderWizardRemotePath::slotItemExpanded(QTreeWidgetItem *item)
@@ -374,6 +414,49 @@ void FolderWizardRemotePath::slotItemExpanded(QTreeWidgetItem *item)
job->start();
}
void FolderWizardRemotePath::slotCurrentItemChanged(QTreeWidgetItem *item)
{
if (item) {
QString dir = item->data(0, Qt::UserRole).toString();
if (!dir.startsWith(QLatin1Char('/'))) {
dir.prepend(QLatin1Char('/'));
}
_ui.folderEntry->setText(dir);
}
emit completeChanged();
}
void FolderWizardRemotePath::slotFolderEntryEdited(const QString& text)
{
if (selectByPath(text)) {
_lscolTimer.stop();
return;
}
_ui.folderTreeWidget->setCurrentItem(0);
_lscolTimer.start(); // avoid sending a request on each keystroke
}
void FolderWizardRemotePath::slotLsColFolderEntry()
{
QString path = _ui.folderEntry->text();
if (path.startsWith(QLatin1Char('/')))
path = path.mid(1);
LsColJob *job = new LsColJob(_account, path, this);
job->setProperties(QList<QByteArray>() << "resourcetype");
connect(job, SIGNAL(directoryListingSubfolders(QStringList)),
SLOT(slotTypedPathFound(QStringList)));
job->start();
}
void FolderWizardRemotePath::slotTypedPathFound(const QStringList& subpaths)
{
slotUpdateDirectories(subpaths);
selectByPath(_ui.folderEntry->text());
}
FolderWizardRemotePath::~FolderWizardRemotePath()
{
}

View File

@@ -86,11 +86,17 @@ protected slots:
void slotUpdateDirectories(const QStringList&);
void slotRefreshFolders();
void slotItemExpanded(QTreeWidgetItem*);
void slotCurrentItemChanged(QTreeWidgetItem*);
void slotFolderEntryEdited(const QString& text);
void slotLsColFolderEntry();
void slotTypedPathFound(const QStringList& subpaths);
private:
void recursiveInsert(QTreeWidgetItem *parent, QStringList pathTrail, QString path);
bool selectByPath(QString path);
Ui_FolderWizardTargetPage _ui;
bool _warnWasVisible;
AccountPtr _account;
QTimer _lscolTimer;
};

View File

@@ -14,7 +14,10 @@
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout_6">
<item row="3" column="0">
<item row="1" column="0">
<widget class="QLineEdit" name="folderEntry"/>
</item>
<item row="2" column="0">
<widget class="QFrame" name="warnFrame">
<property name="palette">
<palette>
@@ -179,7 +182,7 @@
</layout>
</widget>
</item>
<item row="4" column="0">
<item row="3" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>

View File

@@ -28,13 +28,6 @@
#include "updater/updater.h"
#include "config.h"
#ifdef WITH_CRASHREPORTER
#include "configfile.h"
#include <libcrashreporter-handler/Handler.h>
#endif
#include <QTimer>
#include <QMessageBox>
@@ -59,13 +52,6 @@ int main(int argc, char **argv)
#endif
OCC::Application app(argc, argv);
#ifdef WITH_CRASHREPORTER
CrashReporter::Handler* handler = new CrashReporter::Handler( QDir::tempPath(), true, CRASHREPORTER_EXECUTABLE );
ConfigFile cfgFile;
handler->setActive(cfgFile.crashReporter());
#endif
#ifndef Q_OS_WIN
signal(SIGPIPE, SIG_IGN);
#endif

View File

@@ -642,7 +642,7 @@ void ownCloudGui::raiseDialog( QWidget *raiseWidget )
}
void ownCloudGui::slotShowShareDialog(const QString &sharePath, const QString &localPath)
void ownCloudGui::slotShowShareDialog(const QString &sharePath, const QString &localPath, bool resharingAllowed)
{
AccountPtr account = AccountManager::instance()->account();
if (!account) {
@@ -651,7 +651,7 @@ void ownCloudGui::slotShowShareDialog(const QString &sharePath, const QString &l
}
qDebug() << Q_FUNC_INFO << "Opening share dialog";
ShareDialog *w = new ShareDialog(account, sharePath, localPath);
ShareDialog *w = new ShareDialog(account, sharePath, localPath, resharingAllowed);
w->getShares();
w->setAttribute( Qt::WA_DeleteOnClose, true );
raiseDialog(w);

View File

@@ -70,7 +70,7 @@ public slots:
void slotHelp();
void slotOpenPath(const QString& path);
void slotAccountStateChanged();
void slotShowShareDialog(const QString &sharePath, const QString &localPath);
void slotShowShareDialog(const QString &sharePath, const QString &localPath, bool resharingAllowed);
private slots:
void slotDisplayIdle();

View File

@@ -201,33 +201,28 @@ QTreeWidgetItem* ProtocolWidget::createCompletedTreewidgetItem(const QString& fo
QDateTime timestamp = QDateTime::currentDateTime();
const QString timeStr = timeString(timestamp);
const QString longTimeStr = timeString(timestamp, QLocale::LongFormat);
QIcon icon;
QString message;
columns << timeStr;
columns << fixupFilename(item._file);
columns << folder;
if (Progress::isWarningKind(item._status)) {
message= item._errorString;
columns << message;
if (item._status == SyncFileItem::NormalError || item._status == SyncFileItem::FatalError) {
icon = Theme::instance()->syncStateIcon(SyncResult::Error);
} else {
icon = Theme::instance()->syncStateIcon(SyncResult::Problem);
}
} else {
// if the error string is set, it's prefered because it is a usefull user message.
// at least should be...
if(item._errorString.isEmpty()) {
message = Progress::asResultString(item);
} else {
message = item._errorString;
}
columns << message;
if (Progress::isSizeDependent(item._instruction)) {
columns << Utility::octetsToString( item._size );
}
// If the error string is set, it's prefered because it is a useful user message.
QString message = item._errorString;
if (message.isEmpty()) {
message = Progress::asResultString(item);
}
columns << message;
QIcon icon;
if (item._status == SyncFileItem::NormalError
|| item._status == SyncFileItem::FatalError) {
icon = Theme::instance()->syncStateIcon(SyncResult::Error);
} else if (Progress::isWarningKind(item._status)) {
icon = Theme::instance()->syncStateIcon(SyncResult::Problem);
}
if (Progress::isSizeDependent(item._instruction)) {
columns << Utility::octetsToString( item._size );
}
QTreeWidgetItem *twitem = new QTreeWidgetItem(columns);

View File

@@ -42,6 +42,9 @@ namespace {
namespace OCC {
//
// Whenever you change something here check both settingsdialog.cpp and settingsdialogmac.cpp !
//
SettingsDialog::SettingsDialog(ownCloudGui *gui, QWidget *parent) :
QDialog(parent)
, _ui(new Ui::SettingsDialog)

View File

@@ -33,6 +33,9 @@
namespace OCC {
//
// Whenever you change something here check both settingsdialog.cpp and settingsdialogmac.cpp !
//
SettingsDialogMac::SettingsDialogMac(ownCloudGui *gui, QWidget *parent)
: MacPreferencesWindow(parent)
{
@@ -82,6 +85,10 @@ SettingsDialogMac::SettingsDialogMac(ownCloudGui *gui, QWidget *parent)
connect( folderMan, SIGNAL(folderSyncStateChange(QString)),
this, SLOT(slotSyncStateChange(QString)));
connect( _accountSettings, SIGNAL(folderChanged()), gui, SLOT(slotFoldersChanged()));
connect( _accountSettings, SIGNAL(openFolderAlias(const QString&)),
gui, SLOT(slotFolderOpenAction(QString)));
connect( ProgressDispatcher::instance(), SIGNAL(progressInfo(QString, Progress::Info)),
_accountSettings, SLOT(slotSetProgress(QString, Progress::Info)) );

View File

@@ -33,19 +33,20 @@ namespace {
namespace OCC {
ShareDialog::ShareDialog(AccountPtr account, const QString &sharePath, const QString &localPath, QWidget *parent) :
ShareDialog::ShareDialog(AccountPtr account, const QString &sharePath, const QString &localPath, bool resharingAllowed, QWidget *parent) :
QDialog(parent),
_ui(new Ui::ShareDialog),
_account(account),
_sharePath(sharePath),
_localPath(localPath),
_passwordJobRunning(false),
_public_share_id(0)
_public_share_id(0),
_resharingAllowed(resharingAllowed)
{
setAttribute(Qt::WA_DeleteOnClose);
_ui->setupUi(this);
_ui->pushButton_copy->setIcon(QIcon::fromTheme("edit-copy"));
_ui->pushButton_copy->setText(tr("Copy Link"));
_ui->pushButton_copy->setEnabled(false);
connect(_ui->pushButton_copy, SIGNAL(clicked(bool)), SLOT(slotPushButtonCopyLinkPressed()));
QPushButton *closeButton = _ui->buttonBox->button(QDialogButtonBox::Close);
@@ -60,19 +61,23 @@ ShareDialog::ShareDialog(AccountPtr account, const QString &sharePath, const QSt
_pi_date = new QProgressIndicator();
_ui->horizontalLayout_shareLink->addWidget(_pi_link);
_ui->horizontalLayout_password->addWidget(_pi_password);
_ui->horizontalLayout_expire->addWidget(_pi_date);
// _ui->horizontalLayout_expire->addWidget(_pi_date);
connect(_ui->checkBox_shareLink, SIGNAL(clicked()), this, SLOT(slotCheckBoxShareLinkClicked()));
connect(_ui->checkBox_password, SIGNAL(clicked()), this, SLOT(slotCheckBoxPasswordClicked()));
connect(_ui->lineEdit_password, SIGNAL(returnPressed()), this, SLOT(slotPasswordReturnPressed()));
connect(_ui->lineEdit_password, SIGNAL(textChanged(QString)), this, SLOT(slotPasswordChanged(QString)));
connect(_ui->pushButton_setPassword, SIGNAL(clicked(bool)), SLOT(slotPasswordReturnPressed()));
connect(_ui->checkBox_expire, SIGNAL(clicked()), this, SLOT(slotCheckBoxExpireClicked()));
connect(_ui->calendar, SIGNAL(clicked(QDate)), SLOT(slotCalendarClicked(QDate)));
connect(_ui->calendar, SIGNAL(dateChanged(QDate)), SLOT(slotCalendarClicked(QDate)));
_ui->pushButton_setPassword->setEnabled(false);
_ui->widget_shareLink->hide();
_ui->lineEdit_password->hide();
_ui->pushButton_setPassword->hide();
_ui->calendar->hide();
_ui->calendar->setDate(QDate::currentDate().addDays(1));
_ui->calendar->setEnabled(false);
QFileInfo f_info(_localPath);
QFileIconProvider icon_provider;
@@ -96,7 +101,7 @@ ShareDialog::ShareDialog(AccountPtr account, const QString &sharePath, const QSt
_ui->label_sharePath->setWordWrap(true);
_ui->label_sharePath->setText(tr("%1 path: %2").arg(Theme::instance()->appNameGUI()).arg(_sharePath));
this->setWindowTitle(tr("%1 Sharing").arg(Theme::instance()->appNameGUI()));
_ui->label_password->setText(tr("Set password"));
_ui->label_password->setText(tr("Set p&assword"));
// check if the file is already inside of a synced folder
if( sharePath.isEmpty() ) {
// The file is not yet in an ownCloud synced folder. We could automatically
@@ -176,6 +181,12 @@ void ShareDialog::slotPasswordReturnPressed()
_ui->lineEdit_password->clearFocus();
}
void ShareDialog::slotPasswordChanged(const QString& newText)
{
// disable the set-passwort button
_ui->pushButton_setPassword->setEnabled( newText.length() > 0 );
}
void ShareDialog::setPassword(const QString &password)
{
if( _passwordJobRunning ) {
@@ -199,7 +210,7 @@ void ShareDialog::setPassword(const QString &password)
verb = "POST";
if( _ui->checkBox_expire->isChecked() ) {
QDate date = _ui->calendar->selectedDate();
QDate date = _ui->calendar->date();
if( date.isValid() ) {
requestParams.append(qMakePair(QString::fromLatin1("expireDate"), date.toString("yyyy-MM-dd")));
}
@@ -281,12 +292,12 @@ void ShareDialog::slotSharesFetched(const QString &reply)
}
if (data.value("expiration").isValid()) {
_ui->calendar->setSelectedDate(QDate::fromString(data.value("expiration").toString(), "yyyy-MM-dd 00:00:00"));
_ui->calendar->setDate(QDate::fromString(data.value("expiration").toString(), "yyyy-MM-dd 00:00:00"));
_ui->calendar->setMinimumDate(QDate::currentDate().addDays(1));
_ui->calendar->show();
_ui->calendar->setEnabled(true);
_ui->checkBox_expire->setChecked(true);
} else {
_ui->calendar->hide();
_ui->calendar->setEnabled(false);
_ui->checkBox_expire->setChecked(false);
}
@@ -300,10 +311,40 @@ void ShareDialog::slotSharesFetched(const QString &reply)
queryArgs.append(qMakePair(QString("t"), data.value("token").toString()));
url = Account::concatUrlPath(_account->url(), QLatin1String("public.php"), queryArgs).toString();
}
_ui->lineEdit_shareLink->setText(url);
setShareLink(url);
_ui->pushButton_copy->setEnabled(true);
}
}
setShareCheckBoxTitle(_shares.count() > 0);
if( _shares.count()>0 ) {
setShareCheckBoxTitle(true);
} else {
// If there are no shares yet, check the checkbox to create a link automatically.
// If its clear that resharing is not allowed, display an error
if( !_resharingAllowed ) {
displayError(tr("The file can not be shared because it was shared without sharing permission."));
_ui->checkBox_shareLink->setEnabled(false);
} else {
_ui->checkBox_shareLink->setChecked(true);
slotCheckBoxShareLinkClicked();
}
}
}
void ShareDialog::setShareLink( const QString& url )
{
// FIXME: shorten the url for output.
const QUrl realUrl(url);
if( realUrl.isValid() ) {
const QString u = QString("<a href=\"%1\">%2</a>").arg(realUrl.toString(QUrl::None)).arg(url);
_ui->_labelShareLink->setText(u);
_shareUrl = url;
_ui->pushButton_copy->setEnabled(true);
} else {
_shareUrl.clear();
_ui->_labelShareLink->setText(QString::null);
}
}
void ShareDialog::slotDeleteShareFetched(const QString &reply)
@@ -319,12 +360,17 @@ void ShareDialog::slotDeleteShareFetched(const QString &reply)
_public_share_id = 0;
_pi_link->stopAnimation();
_ui->lineEdit_password->clear();
_ui->lineEdit_shareLink->clear();
_ui->_labelShareLink->clear();
_ui->pushButton_copy->setEnabled(false);
_ui->widget_shareLink->hide();
_ui->lineEdit_password->hide();
_ui->pushButton_setPassword->setEnabled(false);
_ui->pushButton_setPassword->hide();
_ui->checkBox_expire->setChecked(false);
_ui->calendar->hide();
_ui->checkBox_password->setChecked(false);
_ui->calendar->setEnabled(false);
_shareUrl.clear();
setShareCheckBoxTitle(false);
@@ -361,7 +407,7 @@ void ShareDialog::slotCreateShareFetched(const QString &reply)
// there needs to be a password
_ui->checkBox_password->setChecked(true);
_ui->checkBox_password->setVisible(false);
_ui->label_password->setText(tr("Public sharing requires a password:"));
_ui->label_password->setText(tr("Public sh&aring requires a password:"));
_ui->lineEdit_password->setFocus();
_ui->widget_shareLink->show();
@@ -376,7 +422,9 @@ void ShareDialog::slotCreateShareFetched(const QString &reply)
QVariantMap json = QtJson::parse(reply, success).toMap();
_public_share_id = json.value("ocs").toMap().values("data")[0].toMap().value("id").toULongLong();
QString url = json.value("ocs").toMap().values("data")[0].toMap().value("url").toString();
_ui->lineEdit_shareLink->setText(url);
setShareLink(url);
setShareCheckBoxTitle(true);
_ui->widget_shareLink->show();
@@ -384,14 +432,12 @@ void ShareDialog::slotCreateShareFetched(const QString &reply)
void ShareDialog::slotCheckBoxPasswordClicked()
{
if (_ui->checkBox_password->checkState() == Qt::Checked)
{
if (_ui->checkBox_password->checkState() == Qt::Checked) {
_ui->lineEdit_password->show();
_ui->pushButton_setPassword->show();
_ui->lineEdit_password->setPlaceholderText(tr("Choose a password for the public link"));
}
else
{
_ui->lineEdit_password->setFocus();
} else {
ShareDialog::setPassword(QString());
_ui->lineEdit_password->setPlaceholderText(QString());
_pi_password->startAnimation();
@@ -406,21 +452,21 @@ void ShareDialog::slotCheckBoxExpireClicked()
{
const QDate date = QDate::currentDate().addDays(1);
ShareDialog::setExpireDate(date);
_ui->calendar->setSelectedDate(date);
_ui->calendar->setDate(date);
_ui->calendar->setMinimumDate(date);
_ui->calendar->show();
_ui->calendar->setEnabled(true);
}
else
{
ShareDialog::setExpireDate(QDate());
_ui->calendar->hide();
_ui->calendar->setEnabled(false);
}
}
void ShareDialog::slotPushButtonCopyLinkPressed()
{
QClipboard *clipboard = QApplication::clipboard();
clipboard->setText(_ui->lineEdit_shareLink->text());
clipboard->setText(_shareUrl);
}
int ShareDialog::checkJsonReturnCode(const QString &reply, QString &message)
@@ -441,8 +487,8 @@ int ShareDialog::checkJsonReturnCode(const QString &reply, QString &message)
void ShareDialog::setShareCheckBoxTitle(bool haveShares)
{
const QString noSharesTitle(tr("Check to share by public link"));
const QString haveSharesTitle(tr("Shared by public link (uncheck to delete share)"));
const QString noSharesTitle(tr("Check to &share by public link"));
const QString haveSharesTitle(tr("&Shared by public link (uncheck to delete share)"));
if( haveShares ) {
_ui->checkBox_shareLink->setText( haveSharesTitle );
@@ -452,19 +498,24 @@ void ShareDialog::setShareCheckBoxTitle(bool haveShares)
}
void ShareDialog::displayError(int code)
void ShareDialog::displayError(const QString& errMsg)
{
const QString errMsg = tr("OCS API error code: %1").arg(code);
_ui->errorLabel->setText( errMsg );
_ui->errorLabel->show();
}
void ShareDialog::displayError(int code)
{
const QString errMsg = tr("OCS API error code: %1").arg(code);
displayError(errMsg);
}
#if 0
void ShareDialog::displayInfo( const QString& msg )
{
_ui->label_sharePath->setText(msg);
}
#if 0
/*
* This code is disabled for now as we do not have answers for all the questions involved
* here, see https://github.com/owncloud/client/issues/2732

View File

@@ -57,7 +57,8 @@ class ShareDialog : public QDialog
Q_OBJECT
public:
explicit ShareDialog(AccountPtr account, const QString &sharePath, const QString &localPath, QWidget *parent = 0);
explicit ShareDialog(AccountPtr account, const QString &sharePath, const QString &localPath,
bool resharingAllowed, QWidget *parent = 0);
~ShareDialog();
void getShares();
@@ -72,20 +73,25 @@ private slots:
void slotCheckBoxPasswordClicked();
void slotCheckBoxExpireClicked();
void slotPasswordReturnPressed();
void slotPasswordChanged(const QString& newText);
void slotPushButtonCopyLinkPressed();
void slotThumbnailFetched(const int &statusCode, const QByteArray &reply);
private:
void setShareCheckBoxTitle(bool haveShares);
void displayError(int code);
void displayInfo( const QString& msg );
void displayError(const QString& errMsg);
void setShareLink( const QString& url );
Ui::ShareDialog *_ui;
AccountPtr _account;
QString _sharePath;
QString _localPath;
QString _shareUrl;
#if 0
QString _folderAlias;
int _uploadFails;
QString _expectedSyncFile;
#endif
bool _passwordJobRunning;
QList<QVariant> _shares;
@@ -98,6 +104,7 @@ private:
QProgressIndicator *_pi_password;
QProgressIndicator *_pi_date;
bool _resharingAllowed;
};
}

View File

@@ -6,15 +6,148 @@
<rect>
<x>0</x>
<y>0</y>
<width>362</width>
<height>427</height>
<width>403</width>
<height>296</height>
</rect>
</property>
<property name="windowTitle">
<string>Share NewDocument.odt</string>
</property>
<layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0">
<item row="4" column="0">
<widget class="QLabel" name="errorLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="1" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_shareLink">
<item>
<widget class="QCheckBox" name="checkBox_shareLink">
<property name="text">
<string>Share link</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="0" colspan="2">
<widget class="QWidget" name="widget_shareLink" native="true">
<layout class="QGridLayout" name="gridLayout_3">
<property name="topMargin">
<number>0</number>
</property>
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
</property>
<item>
<widget class="QLabel" name="_labelShareLink">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="text">
<string/>
</property>
<property name="textFormat">
<enum>Qt::RichText</enum>
</property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_copy">
<property name="text">
<string>Copy &amp;Link</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_password">
<item>
<widget class="QCheckBox" name="checkBox_password">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_password">
<property name="text">
<string>Set p&amp;assword</string>
</property>
<property name="buddy">
<cstring>checkBox_password</cstring>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_14">
<item>
<widget class="QLineEdit" name="lineEdit_password">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_setPassword">
<property name="text">
<string>Set &amp;Password</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="3" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QCheckBox" name="checkBox_expire">
<property name="text">
<string>Set &amp;expiration date</string>
</property>
</widget>
</item>
<item>
<widget class="QDateEdit" name="calendar">
<property name="calendarPopup">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item row="5" column="0">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="standardButtons">
<set>QDialogButtonBox::Close</set>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
@@ -81,90 +214,7 @@
</layout>
</widget>
</item>
<item row="2" column="0">
<widget class="QWidget" name="widget_shareLink" native="true">
<layout class="QGridLayout" name="gridLayout_3">
<item row="1" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_password">
<item>
<widget class="QCheckBox" name="checkBox_password">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_password">
<property name="text">
<string>Set password</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="3" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_expire">
<item>
<widget class="QCheckBox" name="checkBox_expire">
<property name="text">
<string>Set expiration date</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_14">
<item>
<widget class="QLineEdit" name="lineEdit_password">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_setPassword">
<property name="text">
<string>Set Password</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="4" column="0">
<widget class="QCalendarWidget" name="calendar"/>
</item>
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
</property>
<item>
<widget class="QLineEdit" name="lineEdit_shareLink">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_copy">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item row="3" column="0">
<item row="3" column="1">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
@@ -177,31 +227,6 @@
</property>
</spacer>
</item>
<item row="1" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_shareLink">
<item>
<widget class="QCheckBox" name="checkBox_shareLink">
<property name="text">
<string>Share link</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="4" column="0">
<widget class="QLabel" name="errorLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="standardButtons">
<set>QDialogButtonBox::Close</set>
</property>
</widget>
</item>
</layout>
</widget>
<layoutdefault spacing="6" margin="11"/>

View File

@@ -185,8 +185,9 @@ void SocketApi::slotNewConnection()
broadcastMessage(QLatin1String("ICON_PATH"), iconPath );
#endif
foreach( QString alias, FolderMan::instance()->map().keys() ) {
slotRegisterPath(alias);
foreach( Folder *f, FolderMan::instance()->map() ) {
QString message = buildRegisterPathMessage(f->path());
sendMessage(socket, message);
}
}
@@ -226,7 +227,10 @@ void SocketApi::slotRegisterPath( const QString& alias )
{
Folder *f = FolderMan::instance()->folder(alias);
if (f) {
broadcastMessage(QLatin1String("REGISTER_PATH"), f->path() );
QString message = buildRegisterPathMessage(f->path());
foreach(SocketType *socket, _listeners) {
sendMessage(socket, message);
}
}
}
@@ -420,12 +424,22 @@ void SocketApi::command_SHARE(const QString& localFile, SocketType* socket)
// files that are not within a sync folder are not synced.
sendMessage(socket, message);
} else {
const QString folderForPath = shareFolder->path();
const QString remotePath = shareFolder->remotePath() + localFile.right(localFile.count()-folderForPath.count()+1);
SyncJournalFileRecord rec = dbFileRecord_capi(shareFolder, localFile);
bool allowReshare = true; // lets assume the good
if( rec.isValid() ) {
// check the permission: Is resharing allowed?
if( !rec._remotePerm.contains('R') ) {
allowReshare = false;
}
}
const QString message = QLatin1String("SHARE:OK:")+QDir::toNativeSeparators(localFile);
sendMessage(socket, message);
const QString folderForPath = shareFolder->path();
const QString remotePath = shareFolder->remotePath() + localFile.right(localFile.count()-folderForPath.count()+1);
emit shareCommandReceived(remotePath, localFile);
emit shareCommandReceived(remotePath, localFile, allowReshare);
}
}
@@ -439,6 +453,14 @@ void SocketApi::command_SHARE_MENU_TITLE(const QString &, SocketType* socket)
sendMessage(socket, QLatin1String("SHARE_MENU_TITLE:") + tr("Share with %1", "parameter is ownCloud").arg(Theme::instance()->appNameGUI()));
}
QString SocketApi::buildRegisterPathMessage(const QString& path)
{
QFileInfo fi(path);
QString message = QLatin1String("REGISTER_PATH:");
message.append(QDir::toNativeSeparators(fi.absoluteFilePath()));
return message;
}
SqlQuery* SocketApi::getSqlQuery( Folder *folder )
{
if( !folder ) {
@@ -491,6 +513,10 @@ SyncJournalFileRecord SocketApi::dbFileRecord_capi( Folder *folder, QString file
fileName.remove(0, folder->path().length());
}
// remove trailing slash
if( fileName.endsWith( QLatin1Char('/') ) ) {
fileName.truncate(fileName.length()-1);
}
SqlQuery *query = getSqlQuery(folder);
SyncJournalFileRecord rec;

View File

@@ -58,7 +58,7 @@ public slots:
void slotClearExcludesList();
signals:
void shareCommandReceived(const QString &sharePath, const QString &localPath);
void shareCommandReceived(const QString &sharePath, const QString &localPath, bool resharingAllowed);
private slots:
void slotNewConnection();
@@ -82,6 +82,7 @@ private:
Q_INVOKABLE void command_VERSION(const QString& argument, SocketType* socket);
Q_INVOKABLE void command_SHARE_MENU_TITLE(const QString& argument, SocketType* socket);
QString buildRegisterPathMessage(const QString& path);
#ifdef SOCKETAPI_TCP
QTcpServer _localServer;

View File

@@ -129,7 +129,7 @@ void SyncRunFileLog::logItem( const SyncFileItem& item )
if( item._direction == SyncFileItem::None ) {
return;
}
QString ts = item._responseTimeStamp;
QString ts = QString::fromAscii(item._responseTimeStamp);
if( ts.length() > 6 ) {
QRegExp rx("(\\d\\d:\\d\\d:\\d\\d)");
if( ts.contains(rx) ) {

View File

@@ -104,8 +104,12 @@ void ConnectionValidator::slotStatusFound(const QUrl&url, const QVariantMap &inf
// status.php could not be loaded (network or server issue!).
void ConnectionValidator::slotNoStatusFound(QNetworkReply *reply)
{
_errors.append(tr("Unable to connect to %1").arg(_account->url().toString()));
_errors.append( reply->errorString() );
if( reply && ! _account->credentials()->stillValid(reply)) {
_errors.append(tr("Authentication error: Either username or password are wrong."));
} else {
_errors.append(tr("Unable to connect to %1").arg(_account->url().toString()));
_errors.append( reply->errorString() );
}
reportResult( StatusNotFound );
}

View File

@@ -254,9 +254,7 @@ void DiscoverySingleDirectoryJob::directoryListingIteratedSlot(QString file,QMap
if (map.contains("permissions")) {
emit firstDirectoryPermissions(map.value("permissions"));
}
if (map.contains("getetag")) {
emit firstDirectoryEtag(map.value("getetag"));
}
} else {
// Remove /remote.php/webdav/folder/ from /remote.php/webdav/folder/subfile.txt
file.remove(0, _lsColJob->reply()->request().url().path().length());
@@ -276,10 +274,15 @@ void DiscoverySingleDirectoryJob::directoryListingIteratedSlot(QString file,QMap
_results.append(file_stat);
}
//This works in concerto with the RequestEtagJob and the Folder object to check if the remote folder changed.
if (map.contains("getetag")) {
_etagConcatenation += map.value("getetag");
}
}
void DiscoverySingleDirectoryJob::lsJobFinishedWithoutErrorSlot()
{
emit etagConcatenation(_etagConcatenation);
emit finishedWithResult(_results);
deleteLater();
}
@@ -352,8 +355,8 @@ void DiscoveryMainThread::doOpendirSlot(QString subPath, DiscoveryDirectoryResul
this, SLOT(singleDirectoryJobFinishedWithErrorSlot(int,QString)));
QObject::connect(_singleDirJob, SIGNAL(firstDirectoryPermissions(QString)),
this, SLOT(singleDirectoryJobFirstDirectoryPermissionsSlot(QString)));
QObject::connect(_singleDirJob, SIGNAL(firstDirectoryEtag(QString)),
this, SIGNAL(rootEtag(QString)));
QObject::connect(_singleDirJob, SIGNAL(etagConcatenation(QString)),
this, SIGNAL(etagConcatenation(QString)));
_singleDirJob->start();
}
@@ -383,7 +386,7 @@ void DiscoveryMainThread::singleDirectoryJobFinishedWithErrorSlot(int csyncErrno
if (!_currentDiscoveryDirectoryResult) {
return; // possibly aborted
}
qDebug() << Q_FUNC_INFO;
qDebug() << Q_FUNC_INFO << csyncErrnoCode << msg;
_currentDiscoveryDirectoryResult->code = csyncErrnoCode;
_currentDiscoveryDirectoryResult->msg = msg;
@@ -405,20 +408,22 @@ void DiscoveryMainThread::singleDirectoryJobFirstDirectoryPermissionsSlot(QStrin
// called from SyncEngine
void DiscoveryMainThread::abort() {
if (_currentDiscoveryDirectoryResult) {
if (_discoveryJob->_vioMutex.tryLock()) {
_currentDiscoveryDirectoryResult->code = EIO; // FIXME aborted
_currentDiscoveryDirectoryResult = 0;
_discoveryJob->_vioWaitCondition.wakeAll();
_discoveryJob->_vioMutex.unlock();
}
}
if (_singleDirJob) {
_singleDirJob->disconnect(SIGNAL(finishedWithError(int,QString)), this);
_singleDirJob->disconnect(SIGNAL(firstDirectoryPermissions(QString)), this);
_singleDirJob->disconnect(SIGNAL(finishedWithResult(QLinkedList<csync_vio_file_stat_t*>)), this);
_singleDirJob->abort();
}
if (_currentDiscoveryDirectoryResult) {
if (_discoveryJob->_vioMutex.tryLock()) {
_currentDiscoveryDirectoryResult->msg = tr("Aborted by the user"); // Actually also created somewhere else by sync engine
_currentDiscoveryDirectoryResult->code = EIO;
_currentDiscoveryDirectoryResult = 0;
_discoveryJob->_vioWaitCondition.wakeAll();
_discoveryJob->_vioMutex.unlock();
}
}
}
@@ -442,7 +447,7 @@ csync_vio_handle_t* DiscoveryJob::remote_vio_opendir_hook (const char *url,
// Upon awakening from the _vioWaitCondition, iterator should be a valid iterator.
if (directoryResult->code != 0) {
qDebug() << Q_FUNC_INFO << directoryResult->code << "when opening" << url;
qDebug() << Q_FUNC_INFO << directoryResult->code << "when opening" << url << "msg=" << directoryResult->msg;
errno = directoryResult->code;
// save the error string to the context
discoveryJob->_csync_ctx->error_string = qstrdup( directoryResult->msg.toUtf8().constData() );

View File

@@ -52,7 +52,7 @@ public:
// This is not actually a network job, it is just a job
signals:
void firstDirectoryPermissions(const QString &);
void firstDirectoryEtag(const QString &);
void etagConcatenation(const QString &);
void finishedWithResult(QLinkedList<csync_vio_file_stat_t*>);
void finishedWithError(int csyncErrnoCode, QString msg);
private slots:
@@ -62,6 +62,7 @@ private slots:
private:
QLinkedList<csync_vio_file_stat_t*> _results;
QString _subPath;
QString _etagConcatenation;
AccountPtr _account;
bool _ignoredFirst;
QPointer<LsColJob> _lsColJob;
@@ -116,7 +117,7 @@ public slots:
void singleDirectoryJobFinishedWithErrorSlot(int csyncErrnoCode, QString msg);
void singleDirectoryJobFirstDirectoryPermissionsSlot(QString);
signals:
void rootEtag(QString);
void etagConcatenation(QString);
public:
void setupHooks(DiscoveryJob* discoveryJob, const QString &pathPrefix);
};

View File

@@ -107,6 +107,54 @@ bool FileSystem::setModTime(const QString& filename, time_t modTime)
return true;
}
#ifdef Q_OS_WIN
static bool isLnkFile(const QString& filename)
{
return filename.endsWith(".lnk");
}
#endif
bool FileSystem::rename(const QString &originFileName,
const QString &destinationFileName,
QString *errorString)
{
bool success = false;
QString error;
#ifdef Q_OS_WIN
if (isLnkFile(originFileName) || isLnkFile(destinationFileName)) {
success = MoveFileEx((wchar_t*)originFileName.utf16(),
(wchar_t*)destinationFileName.utf16(),
MOVEFILE_COPY_ALLOWED | MOVEFILE_WRITE_THROUGH);
if (!success) {
wchar_t *string = 0;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, ::GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPWSTR)&string, 0, NULL);
error = QString::fromWCharArray(string);
LocalFree((HLOCAL)string);
}
} else
#endif
{
QFile orig(originFileName);
success = orig.rename(destinationFileName);
if (!success) {
error = orig.errorString();
}
}
if (!success) {
qDebug() << "FAIL: renaming file" << originFileName
<< "to" << destinationFileName
<< "failed: " << error;
if (errorString) {
*errorString = error;
}
}
return success;
}
bool FileSystem::renameReplace(const QString& originFileName, const QString& destinationFileName, QString* errorString)
{
#ifndef Q_OS_WIN
@@ -156,12 +204,12 @@ bool FileSystem::renameReplace(const QString& originFileName, const QString& des
return true;
}
bool FileSystem::openFileSharedRead(QFile* file, QString* error)
bool FileSystem::openAndSeekFileSharedRead(QFile* file, QString* errorOrNull, qint64 seek)
{
bool ok = false;
if (error) {
error->clear();
}
QString errorDummy;
// avoid many if (errorOrNull) later.
QString& error = errorOrNull ? *errorOrNull : errorDummy;
error.clear();
#ifdef Q_OS_WIN
//
@@ -188,9 +236,7 @@ bool FileSystem::openFileSharedRead(QFile* file, QString* error)
// Bail out on error.
if (fileHandle == INVALID_HANDLE_VALUE) {
if (error) {
*error = qt_error_string();
}
error = qt_error_string();
return false;
}
@@ -199,32 +245,37 @@ bool FileSystem::openFileSharedRead(QFile* file, QString* error)
// the fd the handle will be closed too.
int fd = _open_osfhandle((intptr_t)fileHandle, _O_RDONLY);
if (fd == -1) {
if (error) {
*error = "could not make fd from handle";
}
error = "could not make fd from handle";
return false;
}
ok = file->open(fd, QIODevice::ReadOnly, QFile::AutoCloseHandle);
#else
ok = file->open(QFile::ReadOnly);
#endif
if (! ok && error) {
*error = file->errorString();
if (!file->open(fd, QIODevice::ReadOnly, QFile::AutoCloseHandle)) {
error = file->errorString();
return false;
}
return ok;
// Seek to the right spot
LARGE_INTEGER *li = reinterpret_cast<LARGE_INTEGER*>(&seek);
DWORD newFilePointer = SetFilePointer(fileHandle, li->LowPart, &li->HighPart, FILE_BEGIN);
if (newFilePointer == 0xFFFFFFFF && GetLastError() != NO_ERROR) {
error = qt_error_string();
return false;
}
return true;
#else
if (!file->open(QFile::ReadOnly)) {
error = file->errorString();
return false;
}
if (!file->seek(seek)) {
error = file->errorString();
return false;
}
return true;
#endif
}
#ifdef Q_OS_WIN
static bool isLnkFile(const QString& filename)
{
return filename.endsWith(".lnk");
}
static bool isLnkFile(const QFileInfo& fi)
{
return fi.suffix() == "lnk";
}
static qint64 getSizeWithCsync(const QString& filename)
{
qint64 result = 0;

View File

@@ -59,6 +59,14 @@ qint64 OWNCLOUDSYNC_EXPORT getSize(const QString& filename);
*/
bool OWNCLOUDSYNC_EXPORT fileExists(const QString& filename);
/**
* Rename the file \a originFileName to \a destinationFileName.
*
* It behaves as QFile::rename() but handles .lnk files correctly on Windows.
*/
bool OWNCLOUDSYNC_EXPORT rename(const QString& originFileName,
const QString& destinationFileName,
QString* errorString = NULL);
/**
* Rename the file \a originFileName to \a destinationFileName, and overwrite the destination if it
* already exists
@@ -67,13 +75,13 @@ bool renameReplace(const QString &originFileName, const QString &destinationFile
QString *errorString);
/**
* Replacement for QFile::open(ReadOnly) that sets a more permissive sharing mode
* on Windows.
* Replacement for QFile::open(ReadOnly) followed by a seek().
* This version sets a more permissive sharing mode on Windows.
*
* Warning: The resuting file may have an empty fileName and be unsuitable for use
* with QFileInfo!
* with QFileInfo! Calling seek() on the QFile with >32bit signed values will fail!
*/
bool openFileSharedRead(QFile* file, QString* error);
bool openAndSeekFileSharedRead(QFile* file, QString* error, qint64 seek);
#ifdef Q_OS_WIN
/**

View File

@@ -166,7 +166,7 @@ void AbstractNetworkJob::slotFinished()
}
// get the Date timestamp from reply
_responseTimestamp = QString::fromAscii(_reply->rawHeader("Date"));
_responseTimestamp = _reply->rawHeader("Date");
_duration = _durationTimer.elapsed();
if (_followRedirects) {
@@ -206,7 +206,7 @@ quint64 AbstractNetworkJob::duration()
return _duration;
}
QString AbstractNetworkJob::responseTimestamp()
QByteArray AbstractNetworkJob::responseTimestamp()
{
return _responseTimestamp;
}
@@ -248,16 +248,12 @@ RequestEtagJob::RequestEtagJob(AccountPtr account, const QString &path, QObject
void RequestEtagJob::start()
{
QNetworkRequest req;
if (path().isEmpty() || path() == QLatin1String("/")) {
/* For the root directory, we need to query the etags of all the sub directories
* because, at the time I am writing this comment (Owncloud 5.0.9), the etag of the
* root directory is not updated when the sub directories changes */
//req.setRawHeader("Depth", "1");
//This should be fixed since oC6 https://github.com/owncloud/core/issues/5255
req.setRawHeader("Depth", "0");
} else {
req.setRawHeader("Depth", "0");
}
// Let's always request all entries inside a directory. There are/were bugs in the server
// where a root or root-folder ETag is not updated when its contents change. We work around
// this by concatenating the ETags of the root and its contents.
req.setRawHeader("Depth", "1");
// See https://github.com/owncloud/core/issues/5255 and others
QByteArray xml("<?xml version=\"1.0\" ?>\n"
"<d:propfind xmlns:d=\"DAV:\">\n"
" <d:prop>\n"

View File

@@ -66,7 +66,7 @@ public:
void setIgnoreCredentialFailure(bool ignore);
bool ignoreCredentialFailure() const { return _ignoreCredentialFailure; }
QString responseTimestamp();
QByteArray responseTimestamp();
quint64 duration();
public slots:
@@ -90,7 +90,7 @@ protected:
int maxRedirects() const { return 10; }
virtual bool finished() = 0;
QString _responseTimestamp;
QByteArray _responseTimestamp;
QElapsedTimer _durationTimer;
quint64 _duration;
bool _timedout; // set to true when the timeout slot is recieved

View File

@@ -25,7 +25,6 @@ ProgressDispatcher* ProgressDispatcher::_instance = 0;
QString Progress::asResultString( const SyncFileItem& item)
{
switch(item._instruction) {
case CSYNC_INSTRUCTION_CONFLICT:
case CSYNC_INSTRUCTION_SYNC:
case CSYNC_INSTRUCTION_NEW:
if (item._direction != SyncFileItem::Up) {
@@ -33,6 +32,8 @@ QString Progress::asResultString( const SyncFileItem& item)
} else {
return QCoreApplication::translate( "progress", "Uploaded");
}
case CSYNC_INSTRUCTION_CONFLICT:
return QCoreApplication::translate( "progress", "Downloaded, renamed conflicting file");
case CSYNC_INSTRUCTION_REMOVE:
return QCoreApplication::translate( "progress", "Deleted");
case CSYNC_INSTRUCTION_EVAL_RENAME:

View File

@@ -399,7 +399,7 @@ void PropagateDownloadFileQNAM::slotGetFinished()
_propagator->_journal->setDownloadInfo(_item._file, SyncJournalDb::DownloadInfo());
}
if(!_item._directDownloadUrl.isEmpty()) {
if(!_item._directDownloadUrl.isEmpty() && err != QNetworkReply::OperationCanceledError) {
// If this was with a direct download, retry without direct download
qWarning() << "Direct download of" << _item._directDownloadUrl << "failed. Retrying through owncloud.";
_item._directDownloadUrl.clear();
@@ -492,11 +492,11 @@ void PropagateDownloadFileQNAM::downloadFinished()
bool isConflict = _item._instruction == CSYNC_INSTRUCTION_CONFLICT
&& !FileSystem::fileEquals(fn, _tmpFile.fileName());
if (isConflict) {
QFile f(fn);
QString renameError;
QString conflictFileName = makeConflictFileName(fn, Utility::qDateTimeFromTime_t(_item._modtime));
if (!f.rename(conflictFileName)) {
if (!FileSystem::rename(fn, conflictFileName, &renameError)) {
//If the rename fails, don't replace it.
done(SyncFileItem::SoftError, f.errorString());
done(SyncFileItem::SoftError, renameError);
return;
}
}

View File

@@ -16,6 +16,7 @@
#include "owncloudpropagator_p.h"
#include "account.h"
#include "syncjournalfilerecord.h"
#include "filesystem.h"
#include <QFile>
#include <QStringList>
@@ -81,7 +82,8 @@ void PropagateRemoteMove::start()
QString originalFile(_propagator->getFilePath(QLatin1String("Shared")));
_propagator->addTouchedFile(originalFile);
_propagator->addTouchedFile(targetFile);
if( QFile::rename( targetFile, originalFile) ) {
QString renameError;
if( FileSystem::rename(targetFile, originalFile, &renameError) ) {
done(SyncFileItem::NormalError, tr("This folder must not be renamed. It is renamed back to its original name."));
} else {
done(SyncFileItem::NormalError, tr("This folder must not be renamed. Please name it back to Shared."));

View File

@@ -232,17 +232,13 @@ bool UploadDevice::prepareAndOpen(const QString& fileName, qint64 start, qint64
QFile file(fileName);
QString openError;
if (!FileSystem::openFileSharedRead(&file, &openError)) {
if (!FileSystem::openAndSeekFileSharedRead(&file, &openError, start)) {
setErrorString(openError);
return false;
}
size = qMin(FileSystem::getSize(fileName), size);
size = qBound(0ll, size, FileSystem::getSize(fileName) - start);
_data.resize(size);
if (!file.seek(start)) {
setErrorString(file.errorString());
return false;
}
auto read = file.read(_data.data(), size);
if (read != size) {
setErrorString(file.errorString());
@@ -406,6 +402,7 @@ void PropagateUploadFileQNAM::startNextChunk()
return;
}
// job takes ownership of device via a QScopedPointer. Job deletes itself when finishing
PUTFileJob* job = new PUTFileJob(_propagator->account(), _propagator->_remoteFolder + path, device, headers, _currentChunk);
_jobs.append(job);
connect(job, SIGNAL(finishedSignal()), this, SLOT(slotPutFinished()));
@@ -422,18 +419,14 @@ void PropagateUploadFileQNAM::startNextChunk()
parallelChunkUpload = env != "false" && env != "0";
} else {
auto version = _propagator->account()->serverVersion();
auto dotPos = version.indexOf('.');
if (dotPos > 0) {
if (version.leftRef(dotPos)
#if QT_VERSION < QT_VERSION_CHECK(5, 1, 0)
.toString() // QStringRef::toInt was added in Qt 5.1
#endif
.toInt() < 8) {
// Disable parallel chunk upload on older sever to avoid too many
// internal sever errors (#2743)
parallelChunkUpload = false;
}
auto components = version.split('.');
int versionNum = (components.value(0).toInt() << 16)
+ (components.value(1).toInt() << 8)
+ components.value(2).toInt();
if (versionNum < 0x080003) {
// Disable parallel chunk upload severs older than 8.0.3 to avoid too many
// internal sever errors (#2743, #2938)
parallelChunkUpload = false;
}
}

View File

@@ -695,11 +695,11 @@ void PropagateDownloadFileLegacy::start()
&& !FileSystem::fileEquals(fn, tmpFile.fileName()); // compare the files to see if there was an actual conflict.
//In case of conflict, make a backup of the old file
if (isConflict) {
QFile f(fn);
QString conflictFileName = makeConflictFileName(fn, Utility::qDateTimeFromTime_t(_item._modtime));
if (!f.rename(conflictFileName)) {
QString renameError;
if (!FileSystem::rename(fn, conflictFileName, &renameError)) {
//If the rename fails, don't replace it.
done(SyncFileItem::NormalError, f.errorString());
done(SyncFileItem::NormalError, renameError);
return;
}
}

View File

@@ -155,9 +155,9 @@ void PropagateLocalRename::start()
_propagator->addTouchedFile(existingFile);
_propagator->addTouchedFile(targetFile);
QFile file(existingFile);
if (!file.rename(targetFile)) {
done(SyncFileItem::NormalError, file.errorString());
QString renameError;
if (!FileSystem::rename(existingFile, targetFile, &renameError)) {
done(SyncFileItem::NormalError, renameError);
return;
}
}

View File

@@ -21,7 +21,6 @@
#include "syncjournalfilerecord.h"
#include "discoveryphase.h"
#include "creds/abstractcredentials.h"
#include "csync_util.h"
#include "syncfilestatus.h"
#include "csync_private.h"
@@ -51,6 +50,7 @@
#ifdef USE_NEON
extern "C" int owncloud_commit(CSYNC* ctx);
#endif
extern "C" const char *csync_instruction_str(enum csync_instructions_e instr);
namespace OCC {
@@ -636,7 +636,7 @@ void SyncEngine::startSync()
_discoveryMainThread = new DiscoveryMainThread(account());
_discoveryMainThread->setParent(this);
connect(this, SIGNAL(finished()), _discoveryMainThread, SLOT(deleteLater()));
connect(_discoveryMainThread, SIGNAL(rootEtag(QString)), this, SLOT(slotRootEtagReceived(QString)));
connect(_discoveryMainThread, SIGNAL(etagConcatenation(QString)), this, SLOT(slotRootEtagReceived(QString)));
DiscoveryJob *discoveryJob = new DiscoveryJob(_csync_ctx);
@@ -656,8 +656,8 @@ void SyncEngine::startSync()
}
void SyncEngine::slotRootEtagReceived(QString e) {
qDebug() << Q_FUNC_INFO << e;
if (_remoteRootEtag.isEmpty()) {
qDebug() << Q_FUNC_INFO << e;
_remoteRootEtag = e;
emit rootEtag(_remoteRootEtag);
}
@@ -827,7 +827,8 @@ void SyncEngine::setNetworkLimits(int upload, int download)
void SyncEngine::slotJobCompleted(const SyncFileItem &item)
{
qDebug() << Q_FUNC_INFO << item._file << item._status << item._errorString;
const char * instruction_str = csync_instruction_str(item._instruction);
qDebug() << Q_FUNC_INFO << item._file << instruction_str << item._status << item._errorString;
/* Update the _syncedItems vector */
int idx = _syncedItems.indexOf(item);
@@ -1194,6 +1195,7 @@ AccountPtr SyncEngine::account() const
void SyncEngine::abort()
{
qDebug() << Q_FUNC_INFO << _discoveryMainThread;
// Aborts the discovery phase job
if (_discoveryMainThread) {
_discoveryMainThread->abort();

View File

@@ -21,6 +21,13 @@
#include <csync.h>
#if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && !defined(Q_CC_CLANG) && (__GNUC__ * 100 + __GNUC_MINOR__ < 408)
// openSuse 12.3 didn't like enum bitfields.
#define BITFIELD(size)
#else
#define BITFIELD(size) :size
#endif
namespace OCC {
class SyncFileItem {
@@ -51,10 +58,10 @@ public:
};
SyncFileItem() : _type(UnknownType), _direction(None), _isDirectory(false),
_instruction(CSYNC_INSTRUCTION_NONE), _modtime(0),
_size(0), _inode(0), _should_update_etag(false), _hasBlacklistEntry(false),
_status(NoStatus), _httpErrorCode(0), _requestDuration(0), _isRestoration(false),
_affectedItems(1)
_hasBlacklistEntry(false), _status(NoStatus),
_isRestoration(false), _should_update_etag(false),
_httpErrorCode(0), _requestDuration(0), _affectedItems(1),
_instruction(CSYNC_INSTRUCTION_NONE), _modtime(0), _size(0), _inode(0)
{
}
@@ -114,49 +121,49 @@ public:
// Variables usefull for everybody
QString _file;
QString _renameTarget;
Type _type;
Direction _direction;
bool _isDirectory;
Type _type BITFIELD(3);
Direction _direction BITFIELD(2);
bool _isDirectory BITFIELD(1);
/// Whether there's an entry in the blacklist table.
/// Note: that entry may have retries left, so this can be true
/// without the status being FileIgnored.
bool _hasBlacklistEntry BITFIELD(1);
// Variables usefull to report to the user
Status _status BITFIELD(4);
bool _isRestoration BITFIELD(1); // The original operation was forbidden, and this is a restoration
bool _should_update_etag BITFIELD(1);
quint16 _httpErrorCode;
QString _errorString; // Contains a string only in case of error
QByteArray _responseTimeStamp;
quint64 _requestDuration;
quint32 _affectedItems; // the number of affected items by the operation on this item.
// usually this value is 1, but for removes on dirs, it might be much higher.
// Variables used by the propagator
QString _originalFile; // as it is in the csync tree
csync_instructions_e _instruction;
QString _originalFile; // as it is in the csync tree
time_t _modtime;
QByteArray _etag;
quint64 _size;
quint64 _inode;
bool _should_update_etag;
QByteArray _fileId;
QByteArray _remotePerm;
QString _directDownloadUrl;
QString _directDownloadCookies;
/// Whether there's an entry in the blacklist table.
/// Note: that entry may have retries left, so this can be true
/// without the status being FileIgnored.
bool _hasBlacklistEntry;
// Variables usefull to report to the user
Status _status;
QString _errorString; // Contains a string only in case of error
int _httpErrorCode;
QString _responseTimeStamp;
quint64 _requestDuration;
bool _isRestoration; // The original operation was forbidden, and this is a restoration
int _affectedItems; // the number of affected items by the operation on this item.
// usually this value is 1, but for removes on dirs, it might be much higher.
struct {
quint64 _size;
time_t _modtime;
QByteArray _etag;
QByteArray _fileId;
enum csync_instructions_e _instruction;
quint64 _other_size;
time_t _other_modtime;
QByteArray _other_etag;
QByteArray _other_fileId;
QByteArray _other_remotePerm;
enum csync_instructions_e _other_instruction;
enum csync_instructions_e _instruction BITFIELD(16);
enum csync_instructions_e _other_instruction BITFIELD(16);
} log;
};

View File

@@ -98,7 +98,7 @@ QString Theme::appName() const
QString Theme::version() const
{
return QString::fromLocal8Bit( MIRALL_STRINGIFY( MIRALL_VERSION ));
return QString::fromLocal8Bit(MIRALL_VERSION_STRING);
}
#ifndef TOKEN_AUTH_ONLY

View File

@@ -206,7 +206,7 @@ Celkový zbývající čas %5</translation>
<message>
<location filename="../src/gui/accountsettings.cpp" line="773"/>
<source>Currently there is no storage usage information available.</source>
<translation>Momentálně nejsou k dispozici žádné informace o využití úložiště</translation>
<translation>Momentálně nejsou k dispozici žádné informace o využití úložiště.</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="806"/>
@@ -577,7 +577,7 @@ Opravdu chcete provést tuto akci?</translation>
<message>
<location filename="../src/gui/folderwizard.cpp" line="105"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Nemáte oprávněné pro zápis do zvolené složky!</translation>
<translation>Nemáte oprávnění pro zápis do zvolené složky!</translation>
</message>
<message>
<location filename="../src/gui/folderwizard.cpp" line="129"/>
@@ -625,12 +625,12 @@ Opravdu chcete provést tuto akci?</translation>
<message>
<location filename="../src/gui/folderwizard.cpp" line="258"/>
<source>Create Remote Folder</source>
<translation>Vytvořit vzdálený adresář</translation>
<translation>Vytvořit vzdálenou složku</translation>
</message>
<message>
<location filename="../src/gui/folderwizard.cpp" line="259"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation>Zadejte název nově vytvářeného adresáře níže &apos;%1&apos;:</translation>
<translation>Zadejte název nově vytvářené složky níže &apos;%1&apos;:</translation>
</message>
<message>
<location filename="../src/gui/folderwizard.cpp" line="288"/>
@@ -668,7 +668,7 @@ Opravdu chcete provést tuto akci?</translation>
<message>
<location filename="../src/gui/folderwizard.cpp" line="444"/>
<source>Choose What to Sync: You can optionally deselect remote subfolders you do not wish to synchronize.</source>
<translation>Výběr synchronizace: Můžete dodatečně označit podadresáře, které si nepřejete synchronizovat.</translation>
<translation>Výběr synchronizace: Můžete dodatečně označit podsložky, které si nepřejete synchronizovat.</translation>
</message>
</context>
<context>
@@ -1144,12 +1144,12 @@ si může v průběhu vyžádat dodatečná práva.</translation>
<message>
<location filename="../src/gui/wizard/owncloudhttpcredspage.cpp" line="47"/>
<source>Enter user credentials</source>
<translation>Zadejte uživatelské údaje</translation>
<translation>Zadejte přihlašovací údaje</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudhttpcredspage.cpp" line="164"/>
<source>Update user credentials</source>
<translation>Upravte uživatelské údaje</translation>
<translation>Upravte přihlašovací údaje</translation>
</message>
</context>
<context>
@@ -1327,7 +1327,7 @@ Nedoporučuje se jí používat.</translation>
<message>
<location filename="../src/gui/wizard/owncloudwizard.cpp" line="83"/>
<source>Skip folders configuration</source>
<translation>Přeskočit konfiguraci adresářů</translation>
<translation>Přeskočit konfiguraci složek</translation>
</message>
</context>
<context>
@@ -1456,7 +1456,7 @@ Nedoporučuje se jí používat.</translation>
<message>
<location filename="../src/libsync/propagatorjobs.cpp" line="83"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation>Nelze odstranit %1 z důvodu kolize názvu se souborem v místním systému!</translation>
<translation>Nelze odstranit %1 z důvodu kolize názvu se souborem v místním systému</translation>
</message>
</context>
<context>
@@ -1645,9 +1645,9 @@ Nedoporučuje se jí používat.</translation>
<location filename="../src/gui/protocolwidget.cpp" line="265"/>
<source>%n files are ignored because of previous errors.
</source>
<translation><numerusform>%n soubor je ignorováno kvůli předchozím chybovým hlášením.
</numerusform><numerusform>%n soubory jsou ignorovány kvůli předchozím chybovým hlášením.
</numerusform><numerusform>%n souborů je ignorováno kvůli předchozím chybovým hlášením.
<translation><numerusform>%n soubor je ignorován kvůli předchozím chybám.
</numerusform><numerusform>%n soubory jsou ignorovány kvůli předchozím chybám.
</numerusform><numerusform>%n souborů je ignorováno kvůli předchozím chybám.
</numerusform></translation>
</message>
<message numerus="yes">
@@ -1670,17 +1670,17 @@ Nedoporučuje se jí používat.</translation>
<message>
<location filename="../src/gui/selectivesyncdialog.cpp" line="306"/>
<source>Unchecked folders will be &lt;b&gt;removed&lt;/b&gt; from your local file system and will not be synchronized to this computer anymore</source>
<translation>Neoznačené adresáře budou &lt;b&gt;odstraněny&lt;/b&gt; z místního souborového systému a nebudou již synchronizovány na tento počítač</translation>
<translation>Neoznačené složky budou &lt;b&gt;odstraněny&lt;/b&gt; z místního souborového systému a nebudou již synchronizovány na tento počítač</translation>
</message>
<message>
<location filename="../src/gui/selectivesyncdialog.cpp" line="318"/>
<source>Choose What to Sync: Select remote subfolders you wish to synchronize.</source>
<translation>Výběr synchronizace: Označte vzdálené podadresáře, které si přejete synchronizovat.</translation>
<translation>Výběr synchronizace: Označte vzdálené podsložky, které si přejete synchronizovat.</translation>
</message>
<message>
<location filename="../src/gui/selectivesyncdialog.cpp" line="319"/>
<source>Choose What to Sync: Deselect remote subfolders you do not wish to synchronize.</source>
<translation>Výběr synchronizace: Označte vzdálené podadresáře, které si nepřejete synchronizovat.</translation>
<translation>Výběr synchronizace: Odznačte vzdálené podsložky, které si nepřejete synchronizovat.</translation>
</message>
<message>
<location filename="../src/gui/selectivesyncdialog.cpp" line="325"/>
@@ -1834,12 +1834,12 @@ Nedoporučuje se jí používat.</translation>
<message>
<location filename="../src/gui/sharedialog.cpp" line="374"/>
<source>There is no sync folder configured.</source>
<translation>Není nakonfigurován žádný synchronizační adresář.</translation>
<translation>Není nakonfigurována žádná synchronizační složka.</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="386"/>
<source>Can not find an folder to upload to.</source>
<translation>Nelze nalézt adresář pro nahrávání.</translation>
<translation>Nelze nalézt složka pro nahrávání.</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="393"/>
@@ -2044,7 +2044,7 @@ Nedoporučuje se jí používat.</translation>
<message>
<location filename="../src/gui/sslerrordialog.ui" line="25"/>
<source>Trust this certificate anyway</source>
<translation>Přesto certifikátu důvěřovat</translation>
<translation>Přesto tomuto certifikátu důvěřovat</translation>
</message>
<message>
<location filename="../src/gui/sslerrordialog.ui" line="44"/>
@@ -2055,7 +2055,7 @@ Nedoporučuje se jí používat.</translation>
<message>
<location filename="../src/gui/sslerrordialog.cpp" line="134"/>
<source>Warnings about current SSL Connection:</source>
<translation>Varování v aktuálním SSL spojení:</translation>
<translation>Varování o aktuálním SSL spojení:</translation>
</message>
<message>
<location filename="../src/gui/sslerrordialog.cpp" line="169"/>
@@ -2284,7 +2284,7 @@ Nedoporučuje se jí používat.</translation>
<message>
<location filename="../src/libsync/syncengine.cpp" line="920"/>
<source>Not allowed because you don&apos;t have permission to add sub-directories in that directory</source>
<translation>Není povoleno, protože nemáte oprávnění vytvářet podadresáře v tomto adresáři.</translation>
<translation>Není povoleno, protože nemáte oprávnění vytvářet podadresáře v tomto adresáři</translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="926"/>
@@ -2310,7 +2310,7 @@ Nedoporučuje se jí používat.</translation>
<message>
<location filename="../src/libsync/syncengine.cpp" line="1003"/>
<source>Local files and share folder removed.</source>
<translation>Místní soubory a sdílený adresář byly odstraněny.</translation>
<translation>Místní soubory a sdílená složka byly odstraněny.</translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="1058"/>
@@ -2584,7 +2584,7 @@ Nedoporučuje se jí používat.</translation>
<message>
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="43"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Failed to connect to the secure server address specified. How do you wish to proceed?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Nezdařilo se připojení k uvedenému zabezpečenému serveru. Jak si přejete dále postupovat?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Nezdařilo se připojení k uvedené zabezpečené adrese serveru. Jak si přejete dále postupovat?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="55"/>

View File

@@ -245,7 +245,7 @@ Total time left %5</source>
<message>
<location filename="../src/gui/addcertificatedialog.ui" line="35"/>
<source>Certificate :</source>
<translation type="unfinished"/>
<translation>Πιστοποιητικό :</translation>
</message>
<message>
<location filename="../src/gui/addcertificatedialog.ui" line="51"/>
@@ -255,17 +255,17 @@ Total time left %5</source>
<message>
<location filename="../src/gui/addcertificatedialog.ui" line="60"/>
<source>Certificate password :</source>
<translation type="unfinished"/>
<translation>Πιστοποιήστε τον κωδικό :</translation>
</message>
<message>
<location filename="../src/gui/addcertificatedialog.cpp" line="23"/>
<source>Select a certificate</source>
<translation type="unfinished"/>
<translation>Επιλέξτε ένα πιστοποιητικό.</translation>
</message>
<message>
<location filename="../src/gui/addcertificatedialog.cpp" line="23"/>
<source>Certificate files (*.p12 *.pfx)</source>
<translation type="unfinished"/>
<translation>Πιστοποιήστε τα αρχεία (*.p12 *.pfx)</translation>
</message>
</context>
<context>
@@ -330,7 +330,7 @@ Total time left %5</source>
<message>
<location filename="../src/libsync/propagateremotedelete.cpp" line="41"/>
<source>Connection timed out</source>
<translation type="unfinished"/>
<translation>Λήξη χρόνου σύνδεσης.</translation>
</message>
</context>
<context>
@@ -899,7 +899,7 @@ Checked items will also be deleted if they prevent a directory from being remove
<message>
<location filename="../src/libsync/propagateremotemove.cpp" line="45"/>
<source>Connection timed out</source>
<translation type="unfinished"/>
<translation>Η σύνδεση έληξε.</translation>
</message>
</context>
<context>
@@ -1767,7 +1767,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sharedialog.ui" line="26"/>
<source>Share Info</source>
<translation type="unfinished"/>
<translation>Διαμοιρασμός Πληροφοριών</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.ui" line="34"/>
@@ -1783,7 +1783,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sharedialog.ui" line="75"/>
<source>OwnCloud Path:</source>
<translation type="unfinished"/>
<translation>Διαδρομή ownCloud:</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.ui" line="89"/>
@@ -1798,7 +1798,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sharedialog.ui" line="149"/>
<source>Set expiry date</source>
<translation type="unfinished"/>
<translation>Ορισμός ημερομηνίας λήξης</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="67"/>
@@ -1809,7 +1809,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sharedialog.cpp" line="68"/>
<source>%1 Sharing</source>
<translation type="unfinished"/>
<translation>%1 Διαμοιράστηκε</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="141"/>
@@ -1829,12 +1829,12 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sharedialog.cpp" line="374"/>
<source>There is no sync folder configured.</source>
<translation type="unfinished"/>
<translation>Δεν έχει οριστεί φάκελος συνχρονισμού.</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="386"/>
<source>Can not find an folder to upload to.</source>
<translation type="unfinished"/>
<translation>Δεν βρέθηκε φάκελος για την προσθήκη αρχείου.</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="393"/>
@@ -1849,7 +1849,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sharedialog.cpp" line="420"/>
<source>Waiting to upload...</source>
<translation type="unfinished"/>
<translation>Αναμονή για μεταφόρτωση</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="422"/>
@@ -1859,7 +1859,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sharedialog.cpp" line="453"/>
<source>The file can not be synced.</source>
<translation type="unfinished"/>
<translation>Το αρχείο δεν μπορεί να συγχρονιστεί.</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="463"/>
@@ -1909,7 +1909,7 @@ It is not advisable to use it.</source>
<location filename="../src/gui/socketapi.cpp" line="431"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation type="unfinished"/>
<translation>Διαμοιρασμός με %1</translation>
</message>
</context>
<context>
@@ -2218,12 +2218,12 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/syncengine.cpp" line="156"/>
<source>The mounted directory is temporarily not available on the server</source>
<translation type="unfinished"/>
<translation>Ο προσαρτημένος κατάλογος δεν είναι προσωρινά διαθέσιμος στον δικομιστή</translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="159"/>
<source>An error opening a directory happened</source>
<translation type="unfinished"/>
<translation>Ένα σφάλμα συνέβη κατά το άνοιγμα ενός καταλόγου.</translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="162"/>
@@ -2584,7 +2584,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="55"/>
<source>Select a different URL</source>
<translation type="unfinished"/>
<translation>Επιλέξτε μια διαφορετική διεύθυνση.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="62"/>

View File

@@ -1675,12 +1675,12 @@ Il est déconseillé de l&apos;utiliser.</translation>
<message>
<location filename="../src/gui/selectivesyncdialog.cpp" line="318"/>
<source>Choose What to Sync: Select remote subfolders you wish to synchronize.</source>
<translation>Choisissez le contenu à synchroniser : sélectionnez les sous-dossiers distants que vous voulez synchroniser.</translation>
<translation>Choisir le contenu à synchroniser : Sélectionnez les sous-dossiers distants que vous voulez synchroniser.</translation>
</message>
<message>
<location filename="../src/gui/selectivesyncdialog.cpp" line="319"/>
<source>Choose What to Sync: Deselect remote subfolders you do not wish to synchronize.</source>
<translation>Choisissez le contenu à synchroniser : désélectionnez les sous-dossiers distants que vous ne voulez pas synchroniser.</translation>
<translation>Choisir le contenu à synchroniser : Désélectionnez les sous-dossiers distants que vous ne voulez pas synchroniser.</translation>
</message>
<message>
<location filename="../src/gui/selectivesyncdialog.cpp" line="325"/>
@@ -1814,7 +1814,7 @@ Il est déconseillé de l&apos;utiliser.</translation>
<message>
<location filename="../src/gui/sharedialog.cpp" line="68"/>
<source>%1 Sharing</source>
<translation>%1 Partagé</translation>
<translation>Partage %1</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="141"/>
@@ -1844,7 +1844,7 @@ Il est déconseillé de l&apos;utiliser.</translation>
<message>
<location filename="../src/gui/sharedialog.cpp" line="393"/>
<source>Sharing of external directories is not yet working.</source>
<translation>Le partage de dossiers externes n&apos;est pas encore supporté actuellement.</translation>
<translation>Le partage de dossiers externes n&apos;est pas encore pris en charge.</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="408"/>

View File

@@ -244,27 +244,27 @@ Total tid kvar %5</translation>
<message>
<location filename="../src/gui/addcertificatedialog.ui" line="35"/>
<source>Certificate :</source>
<translation type="unfinished"/>
<translation>Certifikat :</translation>
</message>
<message>
<location filename="../src/gui/addcertificatedialog.ui" line="51"/>
<source>Browse...</source>
<translation type="unfinished"/>
<translation>Bläddra...</translation>
</message>
<message>
<location filename="../src/gui/addcertificatedialog.ui" line="60"/>
<source>Certificate password :</source>
<translation type="unfinished"/>
<translation>Certifikatlösenord :</translation>
</message>
<message>
<location filename="../src/gui/addcertificatedialog.cpp" line="23"/>
<source>Select a certificate</source>
<translation type="unfinished"/>
<translation>Välj ett certifikat</translation>
</message>
<message>
<location filename="../src/gui/addcertificatedialog.cpp" line="23"/>
<source>Certificate files (*.p12 *.pfx)</source>
<translation type="unfinished"/>
<translation>Certifikatfiler (*.p12 *.pfx)</translation>
</message>
</context>
<context>
@@ -329,7 +329,7 @@ Total tid kvar %5</translation>
<message>
<location filename="../src/libsync/propagateremotedelete.cpp" line="41"/>
<source>Connection timed out</source>
<translation type="unfinished"/>
<translation>Tidsgräns för anslutningen överskreds</translation>
</message>
</context>
<context>
@@ -898,7 +898,7 @@ Valda objekt kommer också att raderas om dom hindrar en mapp från att tas bort
<message>
<location filename="../src/libsync/propagateremotemove.cpp" line="45"/>
<source>Connection timed out</source>
<translation type="unfinished"/>
<translation>Tidsgräns för anslutningen överskreds</translation>
</message>
</context>
<context>
@@ -1131,7 +1131,7 @@ efter ytterligare privilegier under processen.</translation>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="297"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="318"/>
<source>(%1)</source>
<translation type="unfinished"/>
<translation>(%1)</translation>
</message>
</context>
<context>
@@ -1535,7 +1535,7 @@ Det är inte lämpligt använda den.</translation>
<message>
<location filename="../src/libsync/propagateupload.cpp" line="156"/>
<source>File Removed</source>
<translation type="unfinished"/>
<translation>Filen Raderad</translation>
</message>
<message>
<location filename="../src/libsync/propagateupload.cpp" line="171"/>
@@ -1792,12 +1792,12 @@ Det är inte lämpligt använda den.</translation>
<message>
<location filename="../src/gui/sharedialog.ui" line="127"/>
<source>Set password</source>
<translation type="unfinished"/>
<translation>Ange lösenord</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.ui" line="149"/>
<source>Set expiry date</source>
<translation type="unfinished"/>
<translation>Sätt utgångsdatum</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="67"/>
@@ -1813,7 +1813,7 @@ Det är inte lämpligt använda den.</translation>
<message>
<location filename="../src/gui/sharedialog.cpp" line="141"/>
<source>Password Protected</source>
<translation type="unfinished"/>
<translation>Lösenordsskyddad</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="299"/>
@@ -1858,7 +1858,7 @@ Det är inte lämpligt använda den.</translation>
<message>
<location filename="../src/gui/sharedialog.cpp" line="453"/>
<source>The file can not be synced.</source>
<translation type="unfinished"/>
<translation>Filen kan inte synkas.</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="463"/>
@@ -1908,7 +1908,7 @@ Det är inte lämpligt använda den.</translation>
<location filename="../src/gui/socketapi.cpp" line="431"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation type="unfinished"/>
<translation>Dela med %1</translation>
</message>
</context>
<context>

View File

@@ -4,22 +4,22 @@
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
<source>Form</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="33"/>
<source>Pick a local folder on your computer to sync</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="44"/>
<source>&amp;Choose...</source>
<translation>(&amp;C)...</translation>
<translation> (&amp;C)...</translation>
</message>
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="55"/>
<source>&amp;Directory alias name:</source>
<translation>(&amp;D): </translation>
<translation> (&amp;D): </translation>
</message>
</context>
<context>
@@ -27,17 +27,17 @@
<message>
<location filename="../src/gui/folderwizardtargetpage.ui" line="14"/>
<source>Form</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderwizardtargetpage.ui" line="128"/>
<source>Select a remote destination folder</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderwizardtargetpage.ui" line="140"/>
<source>Create Folder</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderwizardtargetpage.ui" line="160"/>
@@ -60,17 +60,17 @@
<message>
<location filename="../src/gui/accountsettings.ui" line="14"/>
<source>Form</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="20"/>
<source>Account to Synchronize</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="41"/>
<source>Connected with &lt;server&gt; as &lt;user&gt;</source>
<translation>&lt;user&gt;&lt;server&gt;</translation>
<translation> &lt;user&gt; &lt;server&gt;</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="55"/>
@@ -91,17 +91,17 @@
<message>
<location filename="../src/gui/accountsettings.ui" line="76"/>
<source>Choose What to Sync</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="101"/>
<source>Storage Usage</source>
<translation></translation>
<translation>使</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="123"/>
<source>Retrieving usage information...</source>
<translation>...</translation>
<translation>使...</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.ui" line="130"/>
@@ -126,7 +126,7 @@
<message>
<location filename="../src/gui/accountsettings.cpp" line="111"/>
<source>No account configured.</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="169"/>
@@ -136,7 +136,7 @@
<message>
<location filename="../src/gui/accountsettings.cpp" line="338"/>
<source>Confirm Folder Remove</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="339"/>
@@ -156,7 +156,7 @@
<message>
<location filename="../src/gui/accountsettings.cpp" line="486"/>
<source>Sync Running</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="487"/>
@@ -166,7 +166,7 @@
<message>
<location filename="../src/gui/accountsettings.cpp" line="610"/>
<source>Discovering &apos;%1&apos;</source>
<translation type="unfinished"/>
<translation> &apos;%1&apos;</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="650"/>
@@ -200,7 +200,7 @@ Total time left %5</source>
<message>
<location filename="../src/gui/accountsettings.cpp" line="769"/>
<source>%1 (%3%) of %2 server space in use.</source>
<translation type="unfinished"/>
<translation>使 %2 %1 (%3%) </translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="773"/>
@@ -225,7 +225,7 @@ Total time left %5</source>
<message>
<location filename="../src/gui/accountsettings.cpp" line="820"/>
<source>No %1 connection configured.</source>
<translation>%1</translation>
<translation> %1 </translation>
</message>
</context>
<context>
@@ -233,7 +233,7 @@ Total time left %5</source>
<message>
<location filename="../src/gui/addcertificatedialog.ui" line="17"/>
<source>SSL client certificate authentication</source>
<translation type="unfinished"/>
<translation>SSL </translation>
</message>
<message>
<location filename="../src/gui/addcertificatedialog.ui" line="23"/>
@@ -243,27 +243,27 @@ Total time left %5</source>
<message>
<location filename="../src/gui/addcertificatedialog.ui" line="35"/>
<source>Certificate :</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/addcertificatedialog.ui" line="51"/>
<source>Browse...</source>
<translation type="unfinished"/>
<translation>...</translation>
</message>
<message>
<location filename="../src/gui/addcertificatedialog.ui" line="60"/>
<source>Certificate password :</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/addcertificatedialog.cpp" line="23"/>
<source>Select a certificate</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/addcertificatedialog.cpp" line="23"/>
<source>Certificate files (*.p12 *.pfx)</source>
<translation type="unfinished"/>
<translation> (*.p12 *.pfx)</translation>
</message>
</context>
<context>
@@ -271,7 +271,7 @@ Total time left %5</source>
<message>
<location filename="../src/libsync/authenticationdialog.cpp" line="29"/>
<source>Authentication Required</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/libsync/authenticationdialog.cpp" line="31"/>
@@ -281,12 +281,12 @@ Total time left %5</source>
<message>
<location filename="../src/libsync/authenticationdialog.cpp" line="35"/>
<source>&amp;User:</source>
<translation type="unfinished"/>
<translation>使 (&amp;U):</translation>
</message>
<message>
<location filename="../src/libsync/authenticationdialog.cpp" line="36"/>
<source>&amp;Password:</source>
<translation>&amp;:</translation>
<translation> (&amp;P):</translation>
</message>
</context>
<context>
@@ -294,12 +294,12 @@ Total time left %5</source>
<message>
<location filename="../src/libsync/connectionvalidator.cpp" line="63"/>
<source>No ownCloud account configured</source>
<translation type="unfinished"/>
<translation> ownCloud </translation>
</message>
<message>
<location filename="../src/libsync/connectionvalidator.cpp" line="86"/>
<source>The configured server for this client is too old</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/libsync/connectionvalidator.cpp" line="87"/>
@@ -315,7 +315,7 @@ Total time left %5</source>
<message>
<location filename="../src/libsync/connectionvalidator.cpp" line="114"/>
<source>timeout</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/libsync/connectionvalidator.cpp" line="147"/>
@@ -328,7 +328,7 @@ Total time left %5</source>
<message>
<location filename="../src/libsync/propagateremotedelete.cpp" line="41"/>
<source>Connection timed out</source>
<translation type="unfinished"/>
<translation></translation>
</message>
</context>
<context>
@@ -368,30 +368,30 @@ Total time left %5</source>
<location filename="../src/gui/folder.cpp" line="461"/>
<source>%1 has been removed.</source>
<comment>%1 names a file.</comment>
<translation type="unfinished"/>
<translation>%1 </translation>
</message>
<message>
<location filename="../src/gui/folder.cpp" line="466"/>
<source>%1 and %2 other files have been downloaded.</source>
<comment>%1 names a file.</comment>
<translation type="unfinished"/>
<translation>%1 %2 </translation>
</message>
<message>
<location filename="../src/gui/folder.cpp" line="468"/>
<source>%1 has been downloaded.</source>
<comment>%1 names a file.</comment>
<translation type="unfinished"/>
<translation>%1 </translation>
</message>
<message>
<location filename="../src/gui/folder.cpp" line="473"/>
<source>%1 and %2 other files have been updated.</source>
<translation type="unfinished"/>
<translation>%1 %2 </translation>
</message>
<message>
<location filename="../src/gui/folder.cpp" line="475"/>
<source>%1 has been updated.</source>
<comment>%1 names a file.</comment>
<translation type="unfinished"/>
<translation>%1 </translation>
</message>
<message>
<location filename="../src/gui/folder.cpp" line="480"/>
@@ -402,7 +402,7 @@ Total time left %5</source>
<location filename="../src/gui/folder.cpp" line="482"/>
<source>%1 has been renamed to %2.</source>
<comment>%1 and %2 name files.</comment>
<translation type="unfinished"/>
<translation>%1 %2</translation>
</message>
<message>
<location filename="../src/gui/folder.cpp" line="487"/>
@@ -412,7 +412,7 @@ Total time left %5</source>
<message>
<location filename="../src/gui/folder.cpp" line="489"/>
<source>%1 has been moved to %2.</source>
<translation type="unfinished"/>
<translation>%1 %2</translation>
</message>
<message>
<location filename="../src/gui/folder.cpp" line="494"/>
@@ -428,12 +428,12 @@ Total time left %5</source>
<message>
<location filename="../src/gui/folder.cpp" line="504"/>
<source>Sync Activity</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folder.cpp" line="782"/>
<source>Could not read system exclude file</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folder.cpp" line="1002"/>
@@ -609,7 +609,7 @@ Are you sure you want to perform this operation?</source>
<message>
<location filename="../src/gui/folderwizard.cpp" line="178"/>
<source>The alias &lt;i&gt;%1&lt;/i&gt; is already in use. Please pick another alias.</source>
<translation type="unfinished"/>
<translation> &lt;i&gt;%1&lt;/i&gt; 使 </translation>
</message>
<message>
<location filename="../src/gui/folderwizard.cpp" line="211"/>
@@ -622,7 +622,7 @@ Are you sure you want to perform this operation?</source>
<message>
<location filename="../src/gui/folderwizard.cpp" line="258"/>
<source>Create Remote Folder</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderwizard.cpp" line="259"/>
@@ -647,7 +647,7 @@ Are you sure you want to perform this operation?</source>
<message>
<location filename="../src/gui/folderwizard.cpp" line="400"/>
<source>This folder is already being synced.</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderwizard.cpp" line="402"/>
@@ -692,12 +692,12 @@ Are you sure you want to perform this operation?</source>
<message>
<location filename="../src/libsync/propagatedownload.cpp" line="156"/>
<source>Server returned wrong content-range</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/libsync/propagatedownload.cpp" line="257"/>
<source>Connection Timeout</source>
<translation type="unfinished"/>
<translation></translation>
</message>
</context>
<context>
@@ -705,12 +705,12 @@ Are you sure you want to perform this operation?</source>
<message>
<location filename="../src/gui/generalsettings.ui" line="14"/>
<source>Form</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="20"/>
<source>General Settings</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="26"/>
@@ -730,7 +730,7 @@ Are you sure you want to perform this operation?</source>
<message>
<location filename="../src/gui/generalsettings.ui" line="47"/>
<source>Show crash reporter</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="57"/>
@@ -746,7 +746,7 @@ Are you sure you want to perform this operation?</source>
<message>
<location filename="../src/gui/generalsettings.ui" line="98"/>
<source>&amp;Restart &amp;&amp; Update</source>
<translation></translation>
<translation> (&amp;R)</translation>
</message>
</context>
<context>
@@ -767,7 +767,7 @@ Are you sure you want to perform this operation?</source>
<message>
<location filename="../src/gui/ignorelisteditor.ui" line="14"/>
<source>Ignored Files Editor</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/ignorelisteditor.ui" line="53"/>
@@ -799,22 +799,22 @@ Checked items will also be deleted if they prevent a directory from being remove
<message>
<location filename="../src/gui/ignorelisteditor.cpp" line="105"/>
<source>Add Ignore Pattern</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/ignorelisteditor.cpp" line="106"/>
<source>Add a new ignore pattern:</source>
<translation type="unfinished"/>
<translation>:</translation>
</message>
<message>
<location filename="../src/gui/ignorelisteditor.cpp" line="128"/>
<source>Edit Ignore Pattern</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/ignorelisteditor.cpp" line="129"/>
<source>Edit ignore pattern:</source>
<translation type="unfinished"/>
<translation>:</translation>
</message>
<message>
<location filename="../src/gui/ignorelisteditor.cpp" line="140"/>
@@ -832,12 +832,12 @@ Checked items will also be deleted if they prevent a directory from being remove
<message>
<location filename="../src/gui/logbrowser.cpp" line="71"/>
<source>&amp;Search: </source>
<translation>&amp;:</translation>
<translation> (&amp;S):</translation>
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="79"/>
<source>&amp;Find</source>
<translation>&amp;:</translation>
<translation> (&amp;F):</translation>
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="97"/>
@@ -852,7 +852,7 @@ Checked items will also be deleted if they prevent a directory from being remove
<message>
<location filename="../src/gui/logbrowser.cpp" line="104"/>
<source>S&amp;ave</source>
<translation></translation>
<translation> (&amp;A)</translation>
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="105"/>
@@ -893,7 +893,7 @@ Checked items will also be deleted if they prevent a directory from being remove
<message>
<location filename="../src/libsync/propagateremotemove.cpp" line="45"/>
<source>Connection timed out</source>
<translation type="unfinished"/>
<translation></translation>
</message>
</context>
<context>
@@ -929,7 +929,7 @@ Checked items will also be deleted if they prevent a directory from being remove
<message>
<location filename="../src/gui/networksettings.ui" line="14"/>
<source>Form</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/gui/networksettings.ui" line="23"/>
@@ -1030,7 +1030,7 @@ Checked items will also be deleted if they prevent a directory from being remove
<message>
<location filename="../src/gui/updater/ocupdater.cpp" line="55"/>
<source>New Update Ready</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/updater/ocupdater.cpp" line="56"/>
@@ -1125,7 +1125,7 @@ for additional privileges during the process.</source>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="297"/>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="318"/>
<source>(%1)</source>
<translation type="unfinished"/>
<translation>(%1)</translation>
</message>
</context>
<context>
@@ -1172,7 +1172,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="163"/>
<source>&amp;Next &gt;</source>
<translation type="unfinished"/>
<translation> (&amp;N) &gt;</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="295"/>
@@ -1195,7 +1195,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="193"/>
<source>Timeout while trying to connect to %1 at %2.</source>
<translation type="unfinished"/>
<translation> %2 %1 </translation>
</message>
<message>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="204"/>
@@ -1346,7 +1346,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/propagateupload.cpp" line="76"/>
<source>Connection Timeout</source>
<translation type="unfinished"/>
<translation></translation>
</message>
</context>
<context>
@@ -1362,7 +1362,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/propagator_legacy.cpp" line="435"/>
<source>Sync was aborted by user.</source>
<translation type="unfinished"/>
<translation>使</translation>
</message>
<message>
<location filename="../src/libsync/propagator_legacy.cpp" line="488"/>
@@ -1377,7 +1377,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/propagator_legacy.cpp" line="516"/>
<source>Server returned wrong content-range</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/libsync/propagator_legacy.cpp" line="567"/>
@@ -1395,7 +1395,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/propagatedownload.cpp" line="429"/>
<source>The file could not be downloaded completely.</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/libsync/propagatedownload.cpp" line="465"/>
@@ -1431,7 +1431,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/propagatorjobs.cpp" line="121"/>
<source>could not create directory %1</source>
<translation type="unfinished"/>
<translation> %1</translation>
</message>
</context>
<context>
@@ -1444,7 +1444,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/propagatorjobs.cpp" line="68"/>
<source>Could not remove directory &apos;%1&apos;; </source>
<translation type="unfinished"/>
<translation> &apos;%1&apos;:</translation>
</message>
<message>
<location filename="../src/libsync/propagatorjobs.cpp" line="83"/>
@@ -1515,7 +1515,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/propagator_legacy.cpp" line="246"/>
<source>Sync was aborted by user.</source>
<translation type="unfinished"/>
<translation>使</translation>
</message>
<message>
<location filename="../src/libsync/propagator_legacy.cpp" line="252"/>
@@ -1528,7 +1528,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/propagateupload.cpp" line="156"/>
<source>File Removed</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/libsync/propagateupload.cpp" line="171"/>
@@ -1562,12 +1562,12 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/protocolwidget.ui" line="14"/>
<source>Form</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/gui/protocolwidget.ui" line="20"/>
<source>Sync Activity</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/gui/protocolwidget.ui" line="49"/>
@@ -1617,7 +1617,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/protocolwidget.cpp" line="73"/>
<source>Copy the activity list to the clipboard.</source>
<translation type="unfinished"/>
<translation>簿</translation>
</message>
<message>
<location filename="../src/gui/protocolwidget.cpp" line="118"/>
@@ -1672,7 +1672,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/selectivesyncdialog.cpp" line="325"/>
<source>Choose What to Sync</source>
<translation type="unfinished"/>
<translation></translation>
</message>
</context>
<context>
@@ -1759,7 +1759,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sharedialog.ui" line="26"/>
<source>Share Info</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.ui" line="34"/>
@@ -1785,7 +1785,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sharedialog.ui" line="127"/>
<source>Set password</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.ui" line="149"/>
@@ -1801,12 +1801,12 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sharedialog.cpp" line="68"/>
<source>%1 Sharing</source>
<translation type="unfinished"/>
<translation>%1 </translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="141"/>
<source>Password Protected</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="299"/>
@@ -1821,7 +1821,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sharedialog.cpp" line="374"/>
<source>There is no sync folder configured.</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="386"/>
@@ -1841,7 +1841,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sharedialog.cpp" line="420"/>
<source>Waiting to upload...</source>
<translation type="unfinished"/>
<translation>...</translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="422"/>
@@ -1864,12 +1864,12 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/creds/shibbolethcredentials.cpp" line="291"/>
<source>Login Error</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/libsync/creds/shibbolethcredentials.cpp" line="291"/>
<source>You must sign in as user %1</source>
<translation type="unfinished"/>
<translation> %1 使</translation>
</message>
</context>
<context>
@@ -1909,7 +1909,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sslbutton.cpp" line="97"/>
<source>&lt;h3&gt;Certificate Details&lt;/h3&gt;</source>
<translation type="unfinished"/>
<translation>&lt;h3&gt;&lt;/h3&gt;</translation>
</message>
<message>
<location filename="../src/gui/sslbutton.cpp" line="100"/>
@@ -1949,17 +1949,17 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sslbutton.cpp" line="110"/>
<source>&lt;h3&gt;Issuer&lt;/h3&gt;</source>
<translation type="unfinished"/>
<translation>&lt;h3&gt;&lt;/h3&gt;</translation>
</message>
<message>
<location filename="../src/gui/sslbutton.cpp" line="113"/>
<source>Issuer:</source>
<translation type="unfinished"/>
<translation>:</translation>
</message>
<message>
<location filename="../src/gui/sslbutton.cpp" line="114"/>
<source>Issued on:</source>
<translation type="unfinished"/>
<translation>:</translation>
</message>
<message>
<location filename="../src/gui/sslbutton.cpp" line="115"/>
@@ -1979,7 +1979,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sslbutton.cpp" line="124"/>
<source>SHA-256:</source>
<translation type="unfinished"/>
<translation>SHA-256:</translation>
</message>
<message>
<location filename="../src/gui/sslbutton.cpp" line="126"/>
@@ -1989,7 +1989,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sslbutton.cpp" line="130"/>
<source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This certificate was manually approved&lt;/p&gt;</source>
<translation type="unfinished"/>
<translation>&lt;p&gt;&lt;b&gt;:&lt;/b&gt; &lt;/p&gt;</translation>
</message>
<message>
<location filename="../src/gui/sslbutton.cpp" line="150"/>
@@ -2024,7 +2024,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sslerrordialog.ui" line="14"/>
<source>Form</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/gui/sslerrordialog.ui" line="25"/>
@@ -2045,7 +2045,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sslerrordialog.cpp" line="169"/>
<source>with Certificate %1</source>
<translation>使%1</translation>
<translation> %1</translation>
</message>
<message>
<location filename="../src/gui/sslerrordialog.cpp" line="177"/>
@@ -2095,7 +2095,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sslerrordialog.cpp" line="197"/>
<source>Issuer: %1</source>
<translation>:%1</translation>
<translation>: %1</translation>
</message>
</context>
<context>
@@ -2168,7 +2168,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/syncengine.cpp" line="132"/>
<source>A network connection timeout happened.</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="135"/>
@@ -2203,7 +2203,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/syncengine.cpp" line="153"/>
<source>Aborted by the user</source>
<translation type="unfinished"/>
<translation>使</translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="156"/>
@@ -2253,12 +2253,12 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/syncengine.cpp" line="567"/>
<source>Unable to initialize a sync journal.</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="648"/>
<source>Cannot open the sync journal</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="895"/>
@@ -2310,12 +2310,12 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/syncengine.cpp" line="1068"/>
<source>the destination</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="1068"/>
<source>the source</source>
<translation type="unfinished"/>
<translation></translation>
</message>
</context>
<context>
@@ -2354,7 +2354,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="226"/>
<source>Disconnected from server</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="259"/>
@@ -2364,12 +2364,12 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="264"/>
<source>No sync folders configured.</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="274"/>
<source>There are no sync folders configured.</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="295"/>
@@ -2379,7 +2379,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="299"/>
<source>Recent Changes</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="316"/>
@@ -2404,7 +2404,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="414"/>
<source>Calculating quota...</source>
<translation type="unfinished"/>
<translation>...</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="416"/>
@@ -2454,17 +2454,17 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="453"/>
<source>%1% of %2 in use</source>
<translation type="unfinished"/>
<translation>使 %2 %1%</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="465"/>
<source>No items synced recently</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="477"/>
<source>Discovering &apos;%1&apos;</source>
<translation type="unfinished"/>
<translation> &apos;%1&apos;</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="482"/>
@@ -2500,7 +2500,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
<source>Form</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="32"/>
@@ -2516,7 +2516,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="88"/>
<source>Server</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="265"/>
@@ -2526,7 +2526,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="131"/>
<source>&amp;Local Folder</source>
<translation>(&amp;L)</translation>
<translation> (&amp;L)</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="174"/>
@@ -2541,7 +2541,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="161"/>
<source>&amp;Keep local data</source>
<translation>(&amp;K)</translation>
<translation> (&amp;K)</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="171"/>
@@ -2551,7 +2551,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="224"/>
<source>S&amp;ync everything from server</source>
<translation type="unfinished"/>
<translation>西 (&amp;Y)</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="306"/>
@@ -2564,7 +2564,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="14"/>
<source>Connection failed</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="43"/>
@@ -2584,7 +2584,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="69"/>
<source>Configure client-side TLS certificate</source>
<translation type="unfinished"/>
<translation> TLS </translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.cpp" line="18"/>
@@ -2597,17 +2597,17 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/wizard/owncloudhttpcredspage.ui" line="14"/>
<source>Form</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudhttpcredspage.ui" line="38"/>
<source>&amp;Username</source>
<translation>使</translation>
<translation>使 (&amp;U)</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudhttpcredspage.ui" line="48"/>
<source>&amp;Password</source>
<translation></translation>
<translation> (&amp;P)</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudhttpcredspage.ui" line="58"/>
@@ -2627,12 +2627,12 @@ It is not advisable to use it.</source>
<location filename="../src/gui/owncloudsetuppage.ui" line="14"/>
<location filename="../src/gui/wizard/owncloudsetupnocredspage.ui" line="20"/>
<source>Form</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/gui/owncloudsetuppage.ui" line="20"/>
<source>Server &amp;address:</source>
<translation>&amp;:</translation>
<translation> (&amp;A):</translation>
</message>
<message>
<location filename="../src/gui/owncloudsetuppage.ui" line="36"/>
@@ -2646,7 +2646,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/owncloudsetuppage.ui" line="47"/>
<source>Use &amp;secure connection</source>
<translation>使&amp;</translation>
<translation>使 (&amp;S)</translation>
</message>
<message>
<location filename="../src/gui/owncloudsetuppage.ui" line="60"/>
@@ -2656,7 +2656,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/owncloudsetuppage.ui" line="75"/>
<source>&amp;Username:</source>
<translation>&amp;使</translation>
<translation>使 (&amp;U):</translation>
</message>
<message>
<location filename="../src/gui/owncloudsetuppage.ui" line="85"/>
@@ -2666,7 +2666,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/owncloudsetuppage.ui" line="92"/>
<source>&amp;Password:</source>
<translation>&amp;:</translation>
<translation> (&amp;P):</translation>
</message>
<message>
<location filename="../src/gui/owncloudsetuppage.ui" line="102"/>
@@ -2681,7 +2681,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/owncloudsetuppage.ui" line="120"/>
<source>&amp;Do not store password on local machine</source>
<translation>&amp;</translation>
<translation> (&amp;D)</translation>
</message>
<message>
<location filename="../src/gui/owncloudsetuppage.ui" line="140"/>
@@ -2696,7 +2696,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/wizard/owncloudsetupnocredspage.ui" line="83"/>
<source>Server &amp;Address</source>
<translation></translation>
<translation> (&amp;A)</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudsetupnocredspage.ui" line="99"/>
@@ -2714,7 +2714,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/wizard/owncloudwizardresultpage.ui" line="14"/>
<source>Form</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudwizardresultpage.ui" line="20"/>
@@ -2738,22 +2738,22 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/utility.cpp" line="113"/>
<source>%L1 TiB</source>
<translation type="unfinished"/>
<translation>%L1 TiB</translation>
</message>
<message>
<location filename="../src/libsync/utility.cpp" line="116"/>
<source>%L1 GiB</source>
<translation type="unfinished"/>
<translation>%L1 GiB</translation>
</message>
<message>
<location filename="../src/libsync/utility.cpp" line="119"/>
<source>%L1 MiB</source>
<translation type="unfinished"/>
<translation>%L1 MiB</translation>
</message>
<message>
<location filename="../src/libsync/utility.cpp" line="122"/>
<source>%L1 KiB</source>
<translation type="unfinished"/>
<translation>%L1 KiB</translation>
</message>
<message>
<location filename="../src/libsync/utility.cpp" line="125"/>
@@ -2807,12 +2807,12 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="42"/>
<source>Ignored</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="44"/>
<source>Filesystem access error</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="46"/>
@@ -2838,17 +2838,17 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="66"/>
<source>deleting</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="69"/>
<source>moving</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="71"/>
<source>ignoring</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="73"/>

View File

@@ -32,27 +32,27 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderwizardtargetpage.ui" line="107"/>
<location filename="../src/gui/folderwizardtargetpage.ui" line="110"/>
<source>TextLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderwizardtargetpage.ui" line="128"/>
<location filename="../src/gui/folderwizardtargetpage.ui" line="131"/>
<source>Select a remote destination folder</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderwizardtargetpage.ui" line="140"/>
<location filename="../src/gui/folderwizardtargetpage.ui" line="143"/>
<source>Create Folder</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderwizardtargetpage.ui" line="160"/>
<location filename="../src/gui/folderwizardtargetpage.ui" line="163"/>
<source>Refresh</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderwizardtargetpage.ui" line="174"/>
<location filename="../src/gui/folderwizardtargetpage.ui" line="177"/>
<source>Folders</source>
<translation type="unfinished"></translation>
</message>
@@ -309,18 +309,23 @@ Total time left %5</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/connectionvalidator.cpp" line="107"/>
<location filename="../src/libsync/connectionvalidator.cpp" line="114"/>
<location filename="../src/libsync/connectionvalidator.cpp" line="108"/>
<source>Authentication error: Either username or password are wrong.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/connectionvalidator.cpp" line="110"/>
<location filename="../src/libsync/connectionvalidator.cpp" line="118"/>
<source>Unable to connect to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/connectionvalidator.cpp" line="115"/>
<location filename="../src/libsync/connectionvalidator.cpp" line="119"/>
<source>timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/connectionvalidator.cpp" line="146"/>
<location filename="../src/libsync/connectionvalidator.cpp" line="150"/>
<source>The provided credentials are not correct</source>
<translation type="unfinished"></translation>
</message>
@@ -333,6 +338,14 @@ Total time left %5</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OCC::DiscoveryMainThread</name>
<message>
<location filename="../src/libsync/discoveryphase.cpp" line="419"/>
<source>Aborted by the user</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OCC::Folder</name>
<message>
@@ -473,52 +486,52 @@ Are you sure you want to perform this operation?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1011"/>
<location filename="../src/gui/folderman.cpp" line="1012"/>
<source>Undefined State.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1014"/>
<location filename="../src/gui/folderman.cpp" line="1015"/>
<source>Waits to start syncing.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1017"/>
<location filename="../src/gui/folderman.cpp" line="1018"/>
<source>Preparing for sync.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1020"/>
<location filename="../src/gui/folderman.cpp" line="1021"/>
<source>Sync is running.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1023"/>
<location filename="../src/gui/folderman.cpp" line="1024"/>
<source>Last Sync was successful.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1028"/>
<location filename="../src/gui/folderman.cpp" line="1029"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1031"/>
<location filename="../src/gui/folderman.cpp" line="1032"/>
<source>Setup Error.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1034"/>
<location filename="../src/gui/folderman.cpp" line="1035"/>
<source>User Abort.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1037"/>
<location filename="../src/gui/folderman.cpp" line="1038"/>
<source>Sync is paused.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1043"/>
<location filename="../src/gui/folderman.cpp" line="1044"/>
<source>%1 (Sync is paused)</source>
<translation type="unfinished"></translation>
</message>
@@ -545,8 +558,8 @@ Are you sure you want to perform this operation?</source>
<context>
<name>OCC::FolderWizard</name>
<message>
<location filename="../src/gui/folderwizard.cpp" line="504"/>
<location filename="../src/gui/folderwizard.cpp" line="506"/>
<location filename="../src/gui/folderwizard.cpp" line="587"/>
<location filename="../src/gui/folderwizard.cpp" line="589"/>
<source>Add Folder</source>
<translation type="unfinished"></translation>
</message>
@@ -554,67 +567,67 @@ Are you sure you want to perform this operation?</source>
<context>
<name>OCC::FolderWizardLocalPath</name>
<message>
<location filename="../src/gui/folderwizard.cpp" line="63"/>
<location filename="../src/gui/folderwizard.cpp" line="64"/>
<source>Click to select a local folder to sync.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderwizard.cpp" line="67"/>
<location filename="../src/gui/folderwizard.cpp" line="68"/>
<source>Enter the path to the local folder.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderwizard.cpp" line="71"/>
<location filename="../src/gui/folderwizard.cpp" line="72"/>
<source>The directory alias is a descriptive name for this sync connection.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderwizard.cpp" line="100"/>
<location filename="../src/gui/folderwizard.cpp" line="101"/>
<source>No valid local folder selected!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderwizard.cpp" line="105"/>
<location filename="../src/gui/folderwizard.cpp" line="106"/>
<source>You have no permission to write to the selected folder!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderwizard.cpp" line="129"/>
<location filename="../src/gui/folderwizard.cpp" line="130"/>
<source>The local path %1 is already an upload folder. Please pick another one!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderwizard.cpp" line="134"/>
<location filename="../src/gui/folderwizard.cpp" line="135"/>
<source>An already configured folder is contained in the current entry.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderwizard.cpp" line="141"/>
<location filename="../src/gui/folderwizard.cpp" line="142"/>
<source>The selected folder is a symbolic link. An already configured folder is contained in the folder this link is pointing to.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderwizard.cpp" line="148"/>
<location filename="../src/gui/folderwizard.cpp" line="149"/>
<source>An already configured folder contains the currently entered folder.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderwizard.cpp" line="154"/>
<location filename="../src/gui/folderwizard.cpp" line="155"/>
<source>The selected folder is a symbolic link. An already configured folder is the parent of the current selected contains the folder this link is pointing to.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderwizard.cpp" line="167"/>
<location filename="../src/gui/folderwizard.cpp" line="168"/>
<source>The alias can not be empty. Please provide a descriptive alias word.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderwizard.cpp" line="178"/>
<location filename="../src/gui/folderwizard.cpp" line="179"/>
<source>The alias &lt;i&gt;%1&lt;/i&gt; is already in use. Please pick another alias.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderwizard.cpp" line="211"/>
<location filename="../src/gui/folderwizard.cpp" line="212"/>
<source>Select the source folder</source>
<translation type="unfinished"></translation>
</message>
@@ -622,42 +635,47 @@ Are you sure you want to perform this operation?</source>
<context>
<name>OCC::FolderWizardRemotePath</name>
<message>
<location filename="../src/gui/folderwizard.cpp" line="258"/>
<location filename="../src/gui/folderwizard.cpp" line="262"/>
<source>Create Remote Folder</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderwizard.cpp" line="259"/>
<location filename="../src/gui/folderwizard.cpp" line="263"/>
<source>Enter the name of the new folder to be created below &apos;%1&apos;:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderwizard.cpp" line="288"/>
<location filename="../src/gui/folderwizard.cpp" line="292"/>
<source>Folder was successfully created on %1.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderwizard.cpp" line="296"/>
<location filename="../src/gui/folderwizard.cpp" line="301"/>
<source>Authentication failed accessing %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderwizard.cpp" line="303"/>
<source>Failed to create the folder on %1. Please check manually.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderwizard.cpp" line="345"/>
<location filename="../src/gui/folderwizard.cpp" line="384"/>
<source>Choose this to sync the entire account</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderwizard.cpp" line="402"/>
<location filename="../src/gui/folderwizard.cpp" line="485"/>
<source>This folder is already being synced.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderwizard.cpp" line="404"/>
<location filename="../src/gui/folderwizard.cpp" line="487"/>
<source>You are already syncing &lt;i&gt;%1&lt;/i&gt;, which is a parent folder of &lt;i&gt;%2&lt;/i&gt;.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderwizard.cpp" line="408"/>
<location filename="../src/gui/folderwizard.cpp" line="491"/>
<source>You are already syncing all your files. Syncing another folder is &lt;b&gt;not&lt;/b&gt; supported. If you want to sync multiple folders, please remove the currently configured root folder sync.</source>
<translation type="unfinished"></translation>
</message>
@@ -665,7 +683,7 @@ Are you sure you want to perform this operation?</source>
<context>
<name>OCC::FolderWizardSelectiveSync</name>
<message>
<location filename="../src/gui/folderwizard.cpp" line="446"/>
<location filename="../src/gui/folderwizard.cpp" line="529"/>
<source>Choose What to Sync: You can optionally deselect remote subfolders you do not wish to synchronize.</source>
<translation type="unfinished"></translation>
</message>
@@ -673,12 +691,12 @@ Are you sure you want to perform this operation?</source>
<context>
<name>OCC::FormatWarningsWizardPage</name>
<message>
<location filename="../src/gui/folderwizard.cpp" line="45"/>
<location filename="../src/gui/folderwizard.cpp" line="46"/>
<source>&lt;b&gt;Warning:&lt;/b&gt; %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderwizard.cpp" line="47"/>
<location filename="../src/gui/folderwizard.cpp" line="48"/>
<source>&lt;b&gt;Warning:&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
@@ -897,7 +915,7 @@ Checked items will also be deleted if they prevent a directory from being remove
<context>
<name>OCC::MoveJob</name>
<message>
<location filename="../src/libsync/propagateremotemove.cpp" line="47"/>
<location filename="../src/libsync/propagateremotemove.cpp" line="48"/>
<source>Connection timed out</source>
<translation type="unfinished"></translation>
</message>
@@ -1363,7 +1381,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PollJob</name>
<message>
<location filename="../src/libsync/propagateupload.cpp" line="132"/>
<location filename="../src/libsync/propagateupload.cpp" line="137"/>
<source>Invalid JSON reply from the poll URL</source>
<translation type="unfinished"></translation>
</message>
@@ -1495,22 +1513,22 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateRemoteMove</name>
<message>
<location filename="../src/libsync/propagateremotemove.cpp" line="85"/>
<location filename="../src/libsync/propagateremotemove.cpp" line="87"/>
<source>This folder must not be renamed. It is renamed back to its original name.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/propagateremotemove.cpp" line="87"/>
<location filename="../src/libsync/propagateremotemove.cpp" line="89"/>
<source>This folder must not be renamed. Please name it back to Shared.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/propagateremotemove.cpp" line="125"/>
<location filename="../src/libsync/propagateremotemove.cpp" line="127"/>
<source>The file was renamed but is part of a read only share. The original file was restored.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
<location filename="../src/libsync/propagateremotemove.cpp" line="143"/>
<source>Wrong HTTP code returned by server. Expected 201, but received &quot;%1 %2&quot;.</source>
<translation type="unfinished"></translation>
</message>
@@ -1537,12 +1555,12 @@ It is not advisable to use it.</source>
<context>
<name>OCC::PropagateUploadFileQNAM</name>
<message>
<location filename="../src/libsync/propagateupload.cpp" line="169"/>
<location filename="../src/libsync/propagateupload.cpp" line="174"/>
<source>File Removed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/propagateupload.cpp" line="183"/>
<location filename="../src/libsync/propagateupload.cpp" line="188"/>
<location filename="../src/libsync/propagateupload.cpp" line="546"/>
<source>Local file changed during sync.</source>
<translation type="unfinished"></translation>
@@ -1631,12 +1649,12 @@ It is not advisable to use it.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/protocolwidget.cpp" line="258"/>
<location filename="../src/gui/protocolwidget.cpp" line="253"/>
<source>Currently no files are ignored because of previous errors and no downloads are in progress.</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location filename="../src/gui/protocolwidget.cpp" line="261"/>
<location filename="../src/gui/protocolwidget.cpp" line="256"/>
<source>%n files are ignored because of previous errors.
</source>
<translation type="unfinished">
@@ -1645,7 +1663,7 @@ It is not advisable to use it.</source>
</translation>
</message>
<message numerus="yes">
<location filename="../src/gui/protocolwidget.cpp" line="262"/>
<location filename="../src/gui/protocolwidget.cpp" line="257"/>
<source>%n files are partially downloaded.
</source>
<translation type="unfinished">
@@ -1654,7 +1672,7 @@ It is not advisable to use it.</source>
</translation>
</message>
<message>
<location filename="../src/gui/protocolwidget.cpp" line="263"/>
<location filename="../src/gui/protocolwidget.cpp" line="258"/>
<source>Try to sync these again.</source>
<translation type="unfinished"></translation>
</message>
@@ -1719,22 +1737,22 @@ It is not advisable to use it.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/settingsdialog.cpp" line="73"/>
<location filename="../src/gui/settingsdialog.cpp" line="76"/>
<source>Account</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/settingsdialog.cpp" line="78"/>
<location filename="../src/gui/settingsdialog.cpp" line="81"/>
<source>Activity</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/settingsdialog.cpp" line="84"/>
<location filename="../src/gui/settingsdialog.cpp" line="87"/>
<source>General</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/settingsdialog.cpp" line="90"/>
<location filename="../src/gui/settingsdialog.cpp" line="93"/>
<source>Network</source>
<translation type="unfinished"></translation>
</message>
@@ -1742,27 +1760,27 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SettingsDialogMac</name>
<message>
<location filename="../src/gui/settingsdialogmac.cpp" line="63"/>
<location filename="../src/gui/settingsdialogmac.cpp" line="66"/>
<source>%1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/settingsdialogmac.cpp" line="67"/>
<location filename="../src/gui/settingsdialogmac.cpp" line="70"/>
<source>Account</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/settingsdialogmac.cpp" line="71"/>
<location filename="../src/gui/settingsdialogmac.cpp" line="74"/>
<source>Activity</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/settingsdialogmac.cpp" line="75"/>
<location filename="../src/gui/settingsdialogmac.cpp" line="78"/>
<source>General</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/settingsdialogmac.cpp" line="79"/>
<location filename="../src/gui/settingsdialogmac.cpp" line="82"/>
<source>Network</source>
<translation type="unfinished"></translation>
</message>
@@ -1775,145 +1793,150 @@ It is not advisable to use it.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.ui" line="26"/>
<location filename="../src/gui/sharedialog.ui" line="159"/>
<source>Share Info</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.ui" line="34"/>
<location filename="../src/gui/sharedialog.ui" line="194"/>
<location filename="../src/gui/sharedialog.ui" line="20"/>
<location filename="../src/gui/sharedialog.ui" line="167"/>
<source>TextLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.ui" line="53"/>
<source>share label</source>
<location filename="../src/gui/sharedialog.ui" line="71"/>
<source>Copy &amp;Link</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.ui" line="75"/>
<source>ownCloud Path:</source>
<location filename="../src/gui/sharedialog.ui" line="95"/>
<location filename="../src/gui/sharedialog.cpp" line="104"/>
<source>Set p&amp;assword</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.ui" line="116"/>
<source>Set expiration date</source>
<source>Set &amp;Password</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.ui" line="134"/>
<source>Set Password</source>
<location filename="../src/gui/sharedialog.ui" line="127"/>
<source>Set &amp;expiration date</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.ui" line="185"/>
<location filename="../src/gui/sharedialog.ui" line="186"/>
<source>share label</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.ui" line="208"/>
<source>ownCloud Path:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.ui" line="29"/>
<source>Share link</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.ui" line="105"/>
<location filename="../src/gui/sharedialog.cpp" line="99"/>
<source>Set password</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="48"/>
<source>Copy Link</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="97"/>
<location filename="../src/gui/sharedialog.cpp" line="567"/>
<location filename="../src/gui/sharedialog.cpp" line="102"/>
<location filename="../src/gui/sharedialog.cpp" line="618"/>
<source>%1 path: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="98"/>
<location filename="../src/gui/sharedialog.cpp" line="103"/>
<source>%1 Sharing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="175"/>
<location filename="../src/gui/sharedialog.cpp" line="180"/>
<source>Password Protected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="364"/>
<source>Public sharing requires a password:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="391"/>
<location filename="../src/gui/sharedialog.cpp" line="438"/>
<source>Choose a password for the public link</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="444"/>
<source>Check to share by public link</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="445"/>
<source>Shared by public link (uncheck to delete share)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="457"/>
<location filename="../src/gui/sharedialog.cpp" line="509"/>
<source>OCS API error code: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="480"/>
<location filename="../src/gui/sharedialog.cpp" line="531"/>
<source>There is no sync folder configured.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="492"/>
<location filename="../src/gui/sharedialog.cpp" line="543"/>
<source>Cannot find an folder to upload to.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="514"/>
<location filename="../src/gui/sharedialog.cpp" line="565"/>
<source>A sync file with the same name exists. The file cannot be registered to sync.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="559"/>
<location filename="../src/gui/sharedialog.cpp" line="610"/>
<source>The file cannot be synced.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="499"/>
<location filename="../src/gui/sharedialog.cpp" line="550"/>
<source>Sharing of external directories is not yet working.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="84"/>
<location filename="../src/gui/sharedialog.cpp" line="89"/>
<source>Share Directory</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="86"/>
<location filename="../src/gui/sharedialog.cpp" line="91"/>
<source>Share File</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="94"/>
<location filename="../src/gui/sharedialog.cpp" line="99"/>
<source>Local path: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="526"/>
<location filename="../src/gui/sharedialog.cpp" line="325"/>
<source>The file can not be shared because it was shared without sharing permission.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="410"/>
<source>Public sh&amp;aring requires a password:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="490"/>
<source>Check to &amp;share by public link</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="491"/>
<source>&amp;Shared by public link (uncheck to delete share)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="577"/>
<source>Waiting to upload...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="528"/>
<location filename="../src/gui/sharedialog.cpp" line="579"/>
<source>Unable to register in sync space.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="569"/>
<location filename="../src/gui/sharedialog.cpp" line="620"/>
<source>Sync of registered file was not successful yet.</source>
<translation type="unfinished"></translation>
</message>
@@ -1952,7 +1975,7 @@ It is not advisable to use it.</source>
<context>
<name>OCC::SocketApi</name>
<message>
<location filename="../src/gui/socketapi.cpp" line="439"/>
<location filename="../src/gui/socketapi.cpp" line="453"/>
<source>Share with %1</source>
<comment>parameter is ownCloud</comment>
<translation type="unfinished"></translation>
@@ -2325,59 +2348,59 @@ It is not advisable to use it.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="937"/>
<location filename="../src/libsync/syncengine.cpp" line="944"/>
<location filename="../src/libsync/syncengine.cpp" line="938"/>
<location filename="../src/libsync/syncengine.cpp" line="945"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="962"/>
<location filename="../src/libsync/syncengine.cpp" line="963"/>
<source>Not allowed because you don&apos;t have permission to add sub-directories in that directory</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="968"/>
<location filename="../src/libsync/syncengine.cpp" line="969"/>
<source>Not allowed because you don&apos;t have permission to add parent directory</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="975"/>
<location filename="../src/libsync/syncengine.cpp" line="976"/>
<source>Not allowed because you don&apos;t have permission to add files in that directory</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="995"/>
<location filename="../src/libsync/syncengine.cpp" line="996"/>
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="1012"/>
<location filename="../src/libsync/syncengine.cpp" line="1032"/>
<location filename="../src/libsync/syncengine.cpp" line="1013"/>
<location filename="../src/libsync/syncengine.cpp" line="1033"/>
<source>Not allowed to remove, restoring</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="1045"/>
<location filename="../src/libsync/syncengine.cpp" line="1046"/>
<source>Local files and share folder removed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="1100"/>
<location filename="../src/libsync/syncengine.cpp" line="1101"/>
<source>Move not allowed, item restored</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="1109"/>
<location filename="../src/libsync/syncengine.cpp" line="1110"/>
<source>Move not allowed because %1 is read-only</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="1110"/>
<location filename="../src/libsync/syncengine.cpp" line="1111"/>
<source>the destination</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="1110"/>
<location filename="../src/libsync/syncengine.cpp" line="1111"/>
<source>the source</source>
<translation type="unfinished"></translation>
</message>
@@ -2829,12 +2852,12 @@ It is not advisable to use it.</source>
<context>
<name>main.cpp</name>
<message>
<location filename="../src/gui/main.cpp" line="45"/>
<location filename="../src/gui/main.cpp" line="38"/>
<source>System Tray not available</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/main.cpp" line="46"/>
<location filename="../src/gui/main.cpp" line="39"/>
<source>%1 requires on a working system tray. If you are running XFCE, please follow &lt;a href=&quot;http://docs.xfce.org/xfce/xfce4-panel/systray&quot;&gt;these instructions&lt;/a&gt;. Otherwise, please install a system tray application such as &apos;trayer&apos; and try again.</source>
<translation type="unfinished"></translation>
</message>
@@ -2850,74 +2873,79 @@ It is not advisable to use it.</source>
<context>
<name>progress</name>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="32"/>
<location filename="../src/libsync/progressdispatcher.cpp" line="31"/>
<source>Downloaded</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="34"/>
<location filename="../src/libsync/progressdispatcher.cpp" line="33"/>
<source>Uploaded</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="37"/>
<location filename="../src/libsync/progressdispatcher.cpp" line="36"/>
<source>Downloaded, renamed conflicting file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="38"/>
<source>Deleted</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="40"/>
<location filename="../src/libsync/progressdispatcher.cpp" line="41"/>
<source>Moved to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="42"/>
<location filename="../src/libsync/progressdispatcher.cpp" line="43"/>
<source>Ignored</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="44"/>
<location filename="../src/libsync/progressdispatcher.cpp" line="45"/>
<source>Filesystem access error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="46"/>
<location filename="../src/libsync/progressdispatcher.cpp" line="47"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="49"/>
<location filename="../src/libsync/progressdispatcher.cpp" line="52"/>
<location filename="../src/libsync/progressdispatcher.cpp" line="50"/>
<location filename="../src/libsync/progressdispatcher.cpp" line="53"/>
<source>Unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="62"/>
<location filename="../src/libsync/progressdispatcher.cpp" line="63"/>
<source>downloading</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="64"/>
<location filename="../src/libsync/progressdispatcher.cpp" line="65"/>
<source>uploading</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="66"/>
<location filename="../src/libsync/progressdispatcher.cpp" line="67"/>
<source>deleting</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="69"/>
<location filename="../src/libsync/progressdispatcher.cpp" line="70"/>
<source>moving</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="71"/>
<location filename="../src/libsync/progressdispatcher.cpp" line="72"/>
<source>ignoring</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="73"/>
<location filename="../src/libsync/progressdispatcher.cpp" line="75"/>
<location filename="../src/libsync/progressdispatcher.cpp" line="74"/>
<location filename="../src/libsync/progressdispatcher.cpp" line="76"/>
<source>error</source>
<translation type="unfinished"></translation>
</message>