mirror of
https://github.com/chylex/Nextcloud-Desktop.git
synced 2026-04-15 21:44:07 +02:00
Compare commits
57 Commits
v1.8.0-bet
...
v1.8.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
38ef525d5e | ||
|
|
367b1fcc33 | ||
|
|
f5c930968e | ||
|
|
5264a8c7f6 | ||
|
|
6c4b7f1479 | ||
|
|
c42c9f0002 | ||
|
|
95f299f865 | ||
|
|
09749e2c7f | ||
|
|
dc33784a76 | ||
|
|
961df1fc44 | ||
|
|
e93c1ccb73 | ||
|
|
286ad0c478 | ||
|
|
e30970ff90 | ||
|
|
14e0e4a072 | ||
|
|
60da0a15e6 | ||
|
|
0f84510e6f | ||
|
|
1dd3488973 | ||
|
|
12e5306947 | ||
|
|
9249d6c2f9 | ||
|
|
d0f07ee3a9 | ||
|
|
3992fba168 | ||
|
|
4601ac8b0e | ||
|
|
a81b0db2a8 | ||
|
|
d88751bb8b | ||
|
|
f13dfc19a0 | ||
|
|
0fccf5e50d | ||
|
|
a2aab28ba6 | ||
|
|
8e7b7caf04 | ||
|
|
8cc5ff0e70 | ||
|
|
9086f09fe2 | ||
|
|
5a6eecd694 | ||
|
|
efe9f1b442 | ||
|
|
db7919dc2f | ||
|
|
4a01644625 | ||
|
|
1ca68140f6 | ||
|
|
071177cee2 | ||
|
|
c88742fad3 | ||
|
|
791a0fd01e | ||
|
|
3b12b9d81d | ||
|
|
31e4009737 | ||
|
|
8746914f3b | ||
|
|
2fa6839ac7 | ||
|
|
b09e08c06f | ||
|
|
659f5ad301 | ||
|
|
6fe7f01a8d | ||
|
|
99f51998f2 | ||
|
|
4c13992f5d | ||
|
|
396f38598f | ||
|
|
b6e24cbd45 | ||
|
|
d2848b9c26 | ||
|
|
227ed8ae07 | ||
|
|
b622981b23 | ||
|
|
36e14cfc69 | ||
|
|
668de9bf31 | ||
|
|
3f712dce02 | ||
|
|
2eaeaf33fa | ||
|
|
8e21d612d8 |
@@ -1,6 +1,6 @@
|
|||||||
ChangeLog
|
ChangeLog
|
||||||
=========
|
=========
|
||||||
version 1.8.0 (release 2015-02-xx)
|
version 1.8.0 (release 2015-03-xx)
|
||||||
* Mac OS: HIDPI support
|
* Mac OS: HIDPI support
|
||||||
* Support Sharing from desktop: Added a share dialog that can be
|
* Support Sharing from desktop: Added a share dialog that can be
|
||||||
opened by context menu in the file managers (Win, Mac, Nautilus)
|
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
|
* Added ability to build on Windows utilizing MingGW
|
||||||
* SQLite database fixes if running on FAT filesystems
|
* SQLite database fixes if running on FAT filesystems
|
||||||
* Improved detection of changing files to upload from local
|
* 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
|
* Fixed experience for Window manager without system tray
|
||||||
* Build with Qt 5.4
|
* Build with Qt 5.4
|
||||||
* Dropped libneon dependency if Qt 5.4 is available
|
* Dropped libneon dependency if Qt 5.4 is available
|
||||||
@@ -24,8 +24,7 @@ version 1.8.0 (release 2015-02-xx)
|
|||||||
* Prepared direct download
|
* Prepared direct download
|
||||||
* Added Crashreporter feature to be switched on on demand
|
* Added Crashreporter feature to be switched on on demand
|
||||||
* A huge amount of bug fixes in all areas of the client.
|
* A huge amount of bug fixes in all areas of the client.
|
||||||
|
* almost 700 commits since 1.7.1
|
||||||
* more than 7000 commits since 1.7.0
|
|
||||||
|
|
||||||
version 1.7.1 (release 2014-12-18)
|
version 1.7.1 (release 2014-12-18)
|
||||||
* Documentation fixes and updates
|
* Documentation fixes and updates
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ set( MIRALL_VERSION_PATCH 0 )
|
|||||||
set( MIRALL_SOVERSION 0 )
|
set( MIRALL_SOVERSION 0 )
|
||||||
|
|
||||||
if ( NOT DEFINED MIRALL_VERSION_SUFFIX )
|
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 )
|
endif( NOT DEFINED MIRALL_VERSION_SUFFIX )
|
||||||
|
|
||||||
if( NOT DEFINED MIRALL_VERSION_BUILD )
|
if( NOT DEFINED MIRALL_VERSION_BUILD )
|
||||||
|
|||||||
75
admin/osx/gen_sym_files.py
Executable file
75
admin/osx/gen_sym_files.py
Executable 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)
|
||||||
@@ -6,3 +6,4 @@ killall @APPLICATION_EXECUTABLE@
|
|||||||
# Unload the Finder plugin. see issue #2105
|
# Unload the Finder plugin. see issue #2105
|
||||||
killall Finder
|
killall Finder
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
|||||||
Binary file not shown.
@@ -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 }}
|
|
||||||
@@ -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.
|
|
||||||
|
|
||||||
----------------------------------------------------------------
|
|
||||||
----------------------------------------------------------------
|
|
||||||
@@ -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
|
|
||||||
@@ -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_)
|
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
@@ -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_
|
|
||||||
@@ -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 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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 );
|
|
||||||
Binary file not shown.
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
@@ -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.
|
|
||||||
|
|
||||||
----------------------------------------------------------------
|
|
||||||
----------------------------------------------------------------
|
|
||||||
@@ -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>
|
|
||||||
@@ -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
|
|
||||||
@@ -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
|
|
||||||
@@ -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.
|
|
||||||
@@ -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() }
|
|
||||||
|
|
||||||
Binary file not shown.
Binary file not shown.
@@ -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 */
|
|
||||||
|
|
||||||
@@ -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><INT:ShowWindow> <STR:App> <STR:Parameters> <STR:WorkingDir></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><INT:ShowWindow> <STR:App> <STR:Parameters> <STR:WorkingDir></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><STR:Verb> <INT:ShowWindow> <STR:App> <STR:Parameters> <STR:WorkingDir></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><STR:Verb> <INT:ShowWindow> <STR:App> <STR:Parameters> <STR:WorkingDir></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><INT:NSISFunctionAddress></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><STR:String></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>
|
|
||||||
@@ -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 */
|
|
||||||
@@ -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*/
|
|
||||||
@@ -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
|
|
||||||
@@ -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
|
|
||||||
@@ -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
|
|
||||||
@@ -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
|
|
||||||
@@ -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
|
|
||||||
@@ -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
@@ -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 */
|
|
||||||
|
|
||||||
@@ -441,7 +441,6 @@ Section "${APPLICATION_NAME}" SEC_APPLICATION
|
|||||||
File "${MING_BIN}\libGLESv2.dll"
|
File "${MING_BIN}\libGLESv2.dll"
|
||||||
File "${MING_BIN}\libjpeg-8.dll"
|
File "${MING_BIN}\libjpeg-8.dll"
|
||||||
File "${MING_BIN}\libpcre16-0.dll"
|
File "${MING_BIN}\libpcre16-0.dll"
|
||||||
File "${MING_BIN}\libproxy.dll"
|
|
||||||
File "${MING_BIN}\libsqlite3-0.dll"
|
File "${MING_BIN}\libsqlite3-0.dll"
|
||||||
File "${MING_BIN}\libcrypto-10.dll"
|
File "${MING_BIN}\libcrypto-10.dll"
|
||||||
File "${MING_BIN}\libssl-10.dll"
|
File "${MING_BIN}\libssl-10.dll"
|
||||||
|
|||||||
@@ -151,11 +151,12 @@ CSYNC_EXCLUDE_TYPE csync_excluded(CSYNC *ctx, const char *path, int filetype) {
|
|||||||
return match;
|
return match;
|
||||||
}
|
}
|
||||||
|
|
||||||
// See http://support.microsoft.com/kb/74496
|
// See http://support.microsoft.com/kb/74496 and
|
||||||
static const char *win_reserved_words[] = {"CON","PRN","AUX", "NUL",
|
// https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx
|
||||||
"COM1", "COM2", "COM3", "COM4",
|
// Additionally, we ignore '$Recycle.Bin', see https://github.com/owncloud/client/issues/2955
|
||||||
"LPT1", "LPT2", "LPT3", "CLOCK$" };
|
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) {
|
bool csync_is_windows_reserved_word(const char* filename) {
|
||||||
|
|
||||||
|
|||||||
@@ -151,9 +151,9 @@ ownCloud Client provides the ability to add custom patterns.
|
|||||||
|
|
||||||
By default, the ownCloud Client ignores the following files:
|
By default, the ownCloud Client ignores the following files:
|
||||||
|
|
||||||
- Files matched by one of the patterns defined in :ref:`ignoredFilesEditor-label`.
|
* 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 containing characters that do not work on certain file systems ``(`\, /, :, ?, *, ", >, <, |`)``.
|
||||||
* Files starting in ``.csync_journal.db*``, as these files are reserved for journalling.
|
* 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
|
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
|
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
|
.. note:: We recommend that you use this function only when advised to do so by
|
||||||
ownCloud support staff.
|
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>
|
||||||
|
|||||||
@@ -168,7 +168,7 @@ IFACEMETHODIMP OCContextMenu::QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT
|
|||||||
|
|
||||||
assert(!info.shareMenuTitle.empty());
|
assert(!info.shareMenuTitle.empty());
|
||||||
MENUITEMINFO mii = { sizeof(mii) };
|
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.wID = idCmdFirst + IDM_SHARE;
|
||||||
mii.fType = MFT_STRING;
|
mii.fType = MFT_STRING;
|
||||||
mii.dwTypeData = &info.shareMenuTitle[0];
|
mii.dwTypeData = &info.shareMenuTitle[0];
|
||||||
|
|||||||
@@ -12,6 +12,8 @@
|
|||||||
* details.
|
* details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
#include "CommunicationSocket.h"
|
#include "CommunicationSocket.h"
|
||||||
#include "UtilConstants.h"
|
#include "UtilConstants.h"
|
||||||
#include "StringUtil.h"
|
#include "StringUtil.h"
|
||||||
|
|||||||
@@ -105,6 +105,7 @@
|
|||||||
<ClCompile>
|
<ClCompile>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
@@ -118,6 +119,7 @@
|
|||||||
<Optimization>MaxSpeed</Optimization>
|
<Optimization>MaxSpeed</Optimization>
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
@@ -133,6 +135,7 @@
|
|||||||
<Optimization>MaxSpeed</Optimization>
|
<Optimization>MaxSpeed</Optimization>
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
@@ -159,6 +162,8 @@
|
|||||||
<ClCompile Include="stdafx.cpp">
|
<ClCompile Include="stdafx.cpp">
|
||||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
||||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|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>
|
||||||
<ClCompile Include="StringUtil.cpp" />
|
<ClCompile Include="StringUtil.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
@@ -50,4 +50,16 @@ if(NOT BUILD_LIBRARIES_ONLY)
|
|||||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
endif()
|
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()
|
endif()
|
||||||
|
|||||||
@@ -42,6 +42,10 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(WITH_CRASHREPORTER)
|
||||||
|
#include <libcrashreporter-handler/Handler.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <QTranslator>
|
#include <QTranslator>
|
||||||
#include <QMenu>
|
#include <QMenu>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
@@ -106,6 +110,11 @@ Application::Application(int &argc, char **argv) :
|
|||||||
if (isRunning())
|
if (isRunning())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
#if defined(WITH_CRASHREPORTER)
|
||||||
|
if (ConfigFile().crashReporter())
|
||||||
|
_crashHandler.reset(new CrashReporter::Handler( QDir::tempPath(), true, CRASHREPORTER_EXECUTABLE ));
|
||||||
|
#endif
|
||||||
|
|
||||||
setupLogging();
|
setupLogging();
|
||||||
setupTranslations();
|
setupTranslations();
|
||||||
|
|
||||||
@@ -149,8 +158,8 @@ Application::Application(int &argc, char **argv) :
|
|||||||
slotAccountStateAdded(ai);
|
slotAccountStateAdded(ai);
|
||||||
}
|
}
|
||||||
|
|
||||||
connect(FolderMan::instance()->socketApi(), SIGNAL(shareCommandReceived(QString, QString)),
|
connect(FolderMan::instance()->socketApi(), SIGNAL(shareCommandReceived(QString, QString, bool)),
|
||||||
_gui, SLOT(slotShowShareDialog(QString, QString)));
|
_gui, SLOT(slotShowShareDialog(QString, QString, bool)));
|
||||||
|
|
||||||
// startup procedure.
|
// startup procedure.
|
||||||
connect(&_checkConnectionTimer, SIGNAL(timeout()), this, SLOT(slotCheckConnection()));
|
connect(&_checkConnectionTimer, SIGNAL(timeout()), this, SLOT(slotCheckConnection()));
|
||||||
|
|||||||
@@ -34,6 +34,10 @@ class QMessageBox;
|
|||||||
class QSystemTrayIcon;
|
class QSystemTrayIcon;
|
||||||
class QSocket;
|
class QSocket;
|
||||||
|
|
||||||
|
namespace CrashReporter {
|
||||||
|
class Handler;
|
||||||
|
}
|
||||||
|
|
||||||
namespace OCC {
|
namespace OCC {
|
||||||
class Theme;
|
class Theme;
|
||||||
class Folder;
|
class Folder;
|
||||||
@@ -109,6 +113,9 @@ private:
|
|||||||
|
|
||||||
QTimer _checkConnectionTimer;
|
QTimer _checkConnectionTimer;
|
||||||
|
|
||||||
|
#if defined(WITH_CRASHREPORTER)
|
||||||
|
QScopedPointer<CrashReporter::Handler> _crashHandler;
|
||||||
|
#endif
|
||||||
QScopedPointer<FolderMan> _folderManager;
|
QScopedPointer<FolderMan> _folderManager;
|
||||||
|
|
||||||
friend class ownCloudGui; // for _startupNetworkError
|
friend class ownCloudGui; // for _startupNetworkError
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
#include "account.h"
|
#include "account.h"
|
||||||
#include "accountmigrator.h"
|
#include "accountmigrator.h"
|
||||||
#include "accountstate.h"
|
#include "accountstate.h"
|
||||||
|
#include "filesystem.h"
|
||||||
|
|
||||||
#ifdef Q_OS_MAC
|
#ifdef Q_OS_MAC
|
||||||
#include <CoreServices/CoreServices.h>
|
#include <CoreServices/CoreServices.h>
|
||||||
@@ -105,7 +106,6 @@ void FolderMan::unloadFolder( const QString& alias )
|
|||||||
_socketApi->slotUnregisterPath(alias);
|
_socketApi->slotUnregisterPath(alias);
|
||||||
}
|
}
|
||||||
|
|
||||||
_folderChangeSignalMapper->removeMappings(f);
|
|
||||||
if( _folderWatchers.contains(alias)) {
|
if( _folderWatchers.contains(alias)) {
|
||||||
_folderWatchers.remove(alias);
|
_folderWatchers.remove(alias);
|
||||||
}
|
}
|
||||||
@@ -852,9 +852,10 @@ bool FolderMan::startFromScratch( const QString& localFolder )
|
|||||||
|
|
||||||
// Make a backup of the folder/file.
|
// Make a backup of the folder/file.
|
||||||
QString newName = getBackupName( parentDir.absoluteFilePath( folderName ) );
|
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()
|
qDebug() << "startFromScratch: Could not rename" << fi.absoluteFilePath()
|
||||||
<< "to" << newName;
|
<< "to" << newName << "error:" << renameError;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
#include "networkjobs.h"
|
#include "networkjobs.h"
|
||||||
#include "account.h"
|
#include "account.h"
|
||||||
#include "selectivesyncdialog.h"
|
#include "selectivesyncdialog.h"
|
||||||
|
#include "creds/abstractcredentials.h"
|
||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QDesktopServices>
|
#include <QDesktopServices>
|
||||||
@@ -238,10 +239,13 @@ FolderWizardRemotePath::FolderWizardRemotePath(AccountPtr account)
|
|||||||
|
|
||||||
connect(_ui.addFolderButton, SIGNAL(clicked()), SLOT(slotAddRemoteFolder()));
|
connect(_ui.addFolderButton, SIGNAL(clicked()), SLOT(slotAddRemoteFolder()));
|
||||||
connect(_ui.refreshButton, SIGNAL(clicked()), SLOT(slotRefreshFolders()));
|
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(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()
|
void FolderWizardRemotePath::slotAddRemoteFolder()
|
||||||
@@ -293,8 +297,12 @@ void FolderWizardRemotePath::slotCreateRemoteFolderFinished(QNetworkReply::Netwo
|
|||||||
void FolderWizardRemotePath::slotHandleNetworkError(QNetworkReply *reply)
|
void FolderWizardRemotePath::slotHandleNetworkError(QNetworkReply *reply)
|
||||||
{
|
{
|
||||||
qDebug() << "** webdav mkdir request failed:" << reply->error();
|
qDebug() << "** webdav mkdir request failed:" << reply->error();
|
||||||
showWarn(tr("Failed to create the folder on %1. Please check manually.")
|
if( reply && !_account->credentials()->stillValid(reply) ) {
|
||||||
.arg(Theme::instance()->appNameGUI()));
|
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)
|
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)
|
void FolderWizardRemotePath::recursiveInsert(QTreeWidgetItem *parent, QStringList pathTrail, QString path)
|
||||||
{
|
{
|
||||||
QFileIconProvider prov;
|
if (pathTrail.isEmpty())
|
||||||
QIcon folderIcon = prov.icon(QFileIconProvider::Folder);
|
return;
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
pathTrail.removeFirst();
|
const QString parentPath = parent->data(0, Qt::UserRole).toString();
|
||||||
recursiveInsert(item, pathTrail, path);
|
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)
|
void FolderWizardRemotePath::slotUpdateDirectories(const QStringList &list)
|
||||||
@@ -362,6 +401,7 @@ void FolderWizardRemotePath::slotRefreshFolders()
|
|||||||
SLOT(slotUpdateDirectories(QStringList)));
|
SLOT(slotUpdateDirectories(QStringList)));
|
||||||
job->start();
|
job->start();
|
||||||
_ui.folderTreeWidget->clear();
|
_ui.folderTreeWidget->clear();
|
||||||
|
_ui.folderEntry->clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void FolderWizardRemotePath::slotItemExpanded(QTreeWidgetItem *item)
|
void FolderWizardRemotePath::slotItemExpanded(QTreeWidgetItem *item)
|
||||||
@@ -374,6 +414,49 @@ void FolderWizardRemotePath::slotItemExpanded(QTreeWidgetItem *item)
|
|||||||
job->start();
|
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()
|
FolderWizardRemotePath::~FolderWizardRemotePath()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,11 +86,17 @@ protected slots:
|
|||||||
void slotUpdateDirectories(const QStringList&);
|
void slotUpdateDirectories(const QStringList&);
|
||||||
void slotRefreshFolders();
|
void slotRefreshFolders();
|
||||||
void slotItemExpanded(QTreeWidgetItem*);
|
void slotItemExpanded(QTreeWidgetItem*);
|
||||||
|
void slotCurrentItemChanged(QTreeWidgetItem*);
|
||||||
|
void slotFolderEntryEdited(const QString& text);
|
||||||
|
void slotLsColFolderEntry();
|
||||||
|
void slotTypedPathFound(const QStringList& subpaths);
|
||||||
private:
|
private:
|
||||||
void recursiveInsert(QTreeWidgetItem *parent, QStringList pathTrail, QString path);
|
void recursiveInsert(QTreeWidgetItem *parent, QStringList pathTrail, QString path);
|
||||||
|
bool selectByPath(QString path);
|
||||||
Ui_FolderWizardTargetPage _ui;
|
Ui_FolderWizardTargetPage _ui;
|
||||||
bool _warnWasVisible;
|
bool _warnWasVisible;
|
||||||
AccountPtr _account;
|
AccountPtr _account;
|
||||||
|
QTimer _lscolTimer;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,10 @@
|
|||||||
<string>Form</string>
|
<string>Form</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout_6">
|
<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">
|
<widget class="QFrame" name="warnFrame">
|
||||||
<property name="palette">
|
<property name="palette">
|
||||||
<palette>
|
<palette>
|
||||||
@@ -179,7 +182,7 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="4" column="0">
|
<item row="3" column="0">
|
||||||
<spacer name="verticalSpacer">
|
<spacer name="verticalSpacer">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Vertical</enum>
|
<enum>Qt::Vertical</enum>
|
||||||
|
|||||||
@@ -28,13 +28,6 @@
|
|||||||
|
|
||||||
#include "updater/updater.h"
|
#include "updater/updater.h"
|
||||||
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
#ifdef WITH_CRASHREPORTER
|
|
||||||
#include "configfile.h"
|
|
||||||
#include <libcrashreporter-handler/Handler.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
|
|
||||||
@@ -59,13 +52,6 @@ int main(int argc, char **argv)
|
|||||||
#endif
|
#endif
|
||||||
OCC::Application app(argc, argv);
|
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
|
#ifndef Q_OS_WIN
|
||||||
signal(SIGPIPE, SIG_IGN);
|
signal(SIGPIPE, SIG_IGN);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -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();
|
AccountPtr account = AccountManager::instance()->account();
|
||||||
if (!account) {
|
if (!account) {
|
||||||
@@ -651,7 +651,7 @@ void ownCloudGui::slotShowShareDialog(const QString &sharePath, const QString &l
|
|||||||
}
|
}
|
||||||
|
|
||||||
qDebug() << Q_FUNC_INFO << "Opening share dialog";
|
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->getShares();
|
||||||
w->setAttribute( Qt::WA_DeleteOnClose, true );
|
w->setAttribute( Qt::WA_DeleteOnClose, true );
|
||||||
raiseDialog(w);
|
raiseDialog(w);
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ public slots:
|
|||||||
void slotHelp();
|
void slotHelp();
|
||||||
void slotOpenPath(const QString& path);
|
void slotOpenPath(const QString& path);
|
||||||
void slotAccountStateChanged();
|
void slotAccountStateChanged();
|
||||||
void slotShowShareDialog(const QString &sharePath, const QString &localPath);
|
void slotShowShareDialog(const QString &sharePath, const QString &localPath, bool resharingAllowed);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void slotDisplayIdle();
|
void slotDisplayIdle();
|
||||||
|
|||||||
@@ -201,33 +201,28 @@ QTreeWidgetItem* ProtocolWidget::createCompletedTreewidgetItem(const QString& fo
|
|||||||
QDateTime timestamp = QDateTime::currentDateTime();
|
QDateTime timestamp = QDateTime::currentDateTime();
|
||||||
const QString timeStr = timeString(timestamp);
|
const QString timeStr = timeString(timestamp);
|
||||||
const QString longTimeStr = timeString(timestamp, QLocale::LongFormat);
|
const QString longTimeStr = timeString(timestamp, QLocale::LongFormat);
|
||||||
QIcon icon;
|
|
||||||
QString message;
|
|
||||||
|
|
||||||
columns << timeStr;
|
columns << timeStr;
|
||||||
columns << fixupFilename(item._file);
|
columns << fixupFilename(item._file);
|
||||||
columns << folder;
|
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 useful user message.
|
||||||
// if the error string is set, it's prefered because it is a usefull user message.
|
QString message = item._errorString;
|
||||||
// at least should be...
|
if (message.isEmpty()) {
|
||||||
if(item._errorString.isEmpty()) {
|
message = Progress::asResultString(item);
|
||||||
message = Progress::asResultString(item);
|
}
|
||||||
} else {
|
columns << message;
|
||||||
message = item._errorString;
|
|
||||||
}
|
QIcon icon;
|
||||||
columns << message;
|
if (item._status == SyncFileItem::NormalError
|
||||||
if (Progress::isSizeDependent(item._instruction)) {
|
|| item._status == SyncFileItem::FatalError) {
|
||||||
columns << Utility::octetsToString( item._size );
|
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);
|
QTreeWidgetItem *twitem = new QTreeWidgetItem(columns);
|
||||||
|
|||||||
@@ -42,6 +42,9 @@ namespace {
|
|||||||
|
|
||||||
namespace OCC {
|
namespace OCC {
|
||||||
|
|
||||||
|
//
|
||||||
|
// Whenever you change something here check both settingsdialog.cpp and settingsdialogmac.cpp !
|
||||||
|
//
|
||||||
SettingsDialog::SettingsDialog(ownCloudGui *gui, QWidget *parent) :
|
SettingsDialog::SettingsDialog(ownCloudGui *gui, QWidget *parent) :
|
||||||
QDialog(parent)
|
QDialog(parent)
|
||||||
, _ui(new Ui::SettingsDialog)
|
, _ui(new Ui::SettingsDialog)
|
||||||
|
|||||||
@@ -33,6 +33,9 @@
|
|||||||
|
|
||||||
namespace OCC {
|
namespace OCC {
|
||||||
|
|
||||||
|
//
|
||||||
|
// Whenever you change something here check both settingsdialog.cpp and settingsdialogmac.cpp !
|
||||||
|
//
|
||||||
SettingsDialogMac::SettingsDialogMac(ownCloudGui *gui, QWidget *parent)
|
SettingsDialogMac::SettingsDialogMac(ownCloudGui *gui, QWidget *parent)
|
||||||
: MacPreferencesWindow(parent)
|
: MacPreferencesWindow(parent)
|
||||||
{
|
{
|
||||||
@@ -82,6 +85,10 @@ SettingsDialogMac::SettingsDialogMac(ownCloudGui *gui, QWidget *parent)
|
|||||||
connect( folderMan, SIGNAL(folderSyncStateChange(QString)),
|
connect( folderMan, SIGNAL(folderSyncStateChange(QString)),
|
||||||
this, SLOT(slotSyncStateChange(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)),
|
connect( ProgressDispatcher::instance(), SIGNAL(progressInfo(QString, Progress::Info)),
|
||||||
_accountSettings, SLOT(slotSetProgress(QString, Progress::Info)) );
|
_accountSettings, SLOT(slotSetProgress(QString, Progress::Info)) );
|
||||||
|
|
||||||
|
|||||||
@@ -33,19 +33,20 @@ namespace {
|
|||||||
|
|
||||||
namespace OCC {
|
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),
|
QDialog(parent),
|
||||||
_ui(new Ui::ShareDialog),
|
_ui(new Ui::ShareDialog),
|
||||||
_account(account),
|
_account(account),
|
||||||
_sharePath(sharePath),
|
_sharePath(sharePath),
|
||||||
_localPath(localPath),
|
_localPath(localPath),
|
||||||
_passwordJobRunning(false),
|
_passwordJobRunning(false),
|
||||||
_public_share_id(0)
|
_public_share_id(0),
|
||||||
|
_resharingAllowed(resharingAllowed)
|
||||||
{
|
{
|
||||||
setAttribute(Qt::WA_DeleteOnClose);
|
setAttribute(Qt::WA_DeleteOnClose);
|
||||||
_ui->setupUi(this);
|
_ui->setupUi(this);
|
||||||
_ui->pushButton_copy->setIcon(QIcon::fromTheme("edit-copy"));
|
_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()));
|
connect(_ui->pushButton_copy, SIGNAL(clicked(bool)), SLOT(slotPushButtonCopyLinkPressed()));
|
||||||
|
|
||||||
QPushButton *closeButton = _ui->buttonBox->button(QDialogButtonBox::Close);
|
QPushButton *closeButton = _ui->buttonBox->button(QDialogButtonBox::Close);
|
||||||
@@ -60,19 +61,23 @@ ShareDialog::ShareDialog(AccountPtr account, const QString &sharePath, const QSt
|
|||||||
_pi_date = new QProgressIndicator();
|
_pi_date = new QProgressIndicator();
|
||||||
_ui->horizontalLayout_shareLink->addWidget(_pi_link);
|
_ui->horizontalLayout_shareLink->addWidget(_pi_link);
|
||||||
_ui->horizontalLayout_password->addWidget(_pi_password);
|
_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_shareLink, SIGNAL(clicked()), this, SLOT(slotCheckBoxShareLinkClicked()));
|
||||||
connect(_ui->checkBox_password, SIGNAL(clicked()), this, SLOT(slotCheckBoxPasswordClicked()));
|
connect(_ui->checkBox_password, SIGNAL(clicked()), this, SLOT(slotCheckBoxPasswordClicked()));
|
||||||
connect(_ui->lineEdit_password, SIGNAL(returnPressed()), this, SLOT(slotPasswordReturnPressed()));
|
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->pushButton_setPassword, SIGNAL(clicked(bool)), SLOT(slotPasswordReturnPressed()));
|
||||||
connect(_ui->checkBox_expire, SIGNAL(clicked()), this, SLOT(slotCheckBoxExpireClicked()));
|
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->widget_shareLink->hide();
|
||||||
_ui->lineEdit_password->hide();
|
_ui->lineEdit_password->hide();
|
||||||
_ui->pushButton_setPassword->hide();
|
_ui->pushButton_setPassword->hide();
|
||||||
_ui->calendar->hide();
|
|
||||||
|
_ui->calendar->setDate(QDate::currentDate().addDays(1));
|
||||||
|
_ui->calendar->setEnabled(false);
|
||||||
|
|
||||||
QFileInfo f_info(_localPath);
|
QFileInfo f_info(_localPath);
|
||||||
QFileIconProvider icon_provider;
|
QFileIconProvider icon_provider;
|
||||||
@@ -96,7 +101,7 @@ ShareDialog::ShareDialog(AccountPtr account, const QString &sharePath, const QSt
|
|||||||
_ui->label_sharePath->setWordWrap(true);
|
_ui->label_sharePath->setWordWrap(true);
|
||||||
_ui->label_sharePath->setText(tr("%1 path: %2").arg(Theme::instance()->appNameGUI()).arg(_sharePath));
|
_ui->label_sharePath->setText(tr("%1 path: %2").arg(Theme::instance()->appNameGUI()).arg(_sharePath));
|
||||||
this->setWindowTitle(tr("%1 Sharing").arg(Theme::instance()->appNameGUI()));
|
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
|
// check if the file is already inside of a synced folder
|
||||||
if( sharePath.isEmpty() ) {
|
if( sharePath.isEmpty() ) {
|
||||||
// The file is not yet in an ownCloud synced folder. We could automatically
|
// The file is not yet in an ownCloud synced folder. We could automatically
|
||||||
@@ -176,6 +181,12 @@ void ShareDialog::slotPasswordReturnPressed()
|
|||||||
_ui->lineEdit_password->clearFocus();
|
_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)
|
void ShareDialog::setPassword(const QString &password)
|
||||||
{
|
{
|
||||||
if( _passwordJobRunning ) {
|
if( _passwordJobRunning ) {
|
||||||
@@ -199,7 +210,7 @@ void ShareDialog::setPassword(const QString &password)
|
|||||||
verb = "POST";
|
verb = "POST";
|
||||||
|
|
||||||
if( _ui->checkBox_expire->isChecked() ) {
|
if( _ui->checkBox_expire->isChecked() ) {
|
||||||
QDate date = _ui->calendar->selectedDate();
|
QDate date = _ui->calendar->date();
|
||||||
if( date.isValid() ) {
|
if( date.isValid() ) {
|
||||||
requestParams.append(qMakePair(QString::fromLatin1("expireDate"), date.toString("yyyy-MM-dd")));
|
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()) {
|
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->setMinimumDate(QDate::currentDate().addDays(1));
|
||||||
_ui->calendar->show();
|
_ui->calendar->setEnabled(true);
|
||||||
_ui->checkBox_expire->setChecked(true);
|
_ui->checkBox_expire->setChecked(true);
|
||||||
} else {
|
} else {
|
||||||
_ui->calendar->hide();
|
_ui->calendar->setEnabled(false);
|
||||||
_ui->checkBox_expire->setChecked(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()));
|
queryArgs.append(qMakePair(QString("t"), data.value("token").toString()));
|
||||||
url = Account::concatUrlPath(_account->url(), QLatin1String("public.php"), queryArgs).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)
|
void ShareDialog::slotDeleteShareFetched(const QString &reply)
|
||||||
@@ -319,12 +360,17 @@ void ShareDialog::slotDeleteShareFetched(const QString &reply)
|
|||||||
_public_share_id = 0;
|
_public_share_id = 0;
|
||||||
_pi_link->stopAnimation();
|
_pi_link->stopAnimation();
|
||||||
_ui->lineEdit_password->clear();
|
_ui->lineEdit_password->clear();
|
||||||
_ui->lineEdit_shareLink->clear();
|
_ui->_labelShareLink->clear();
|
||||||
|
_ui->pushButton_copy->setEnabled(false);
|
||||||
_ui->widget_shareLink->hide();
|
_ui->widget_shareLink->hide();
|
||||||
_ui->lineEdit_password->hide();
|
_ui->lineEdit_password->hide();
|
||||||
|
_ui->pushButton_setPassword->setEnabled(false);
|
||||||
_ui->pushButton_setPassword->hide();
|
_ui->pushButton_setPassword->hide();
|
||||||
_ui->checkBox_expire->setChecked(false);
|
_ui->checkBox_expire->setChecked(false);
|
||||||
_ui->calendar->hide();
|
_ui->checkBox_password->setChecked(false);
|
||||||
|
_ui->calendar->setEnabled(false);
|
||||||
|
|
||||||
|
_shareUrl.clear();
|
||||||
|
|
||||||
setShareCheckBoxTitle(false);
|
setShareCheckBoxTitle(false);
|
||||||
|
|
||||||
@@ -361,7 +407,7 @@ void ShareDialog::slotCreateShareFetched(const QString &reply)
|
|||||||
// there needs to be a password
|
// there needs to be a password
|
||||||
_ui->checkBox_password->setChecked(true);
|
_ui->checkBox_password->setChecked(true);
|
||||||
_ui->checkBox_password->setVisible(false);
|
_ui->checkBox_password->setVisible(false);
|
||||||
_ui->label_password->setText(tr("Public sharing requires a password:"));
|
_ui->label_password->setText(tr("Public shå requires a password:"));
|
||||||
_ui->lineEdit_password->setFocus();
|
_ui->lineEdit_password->setFocus();
|
||||||
_ui->widget_shareLink->show();
|
_ui->widget_shareLink->show();
|
||||||
|
|
||||||
@@ -376,7 +422,9 @@ void ShareDialog::slotCreateShareFetched(const QString &reply)
|
|||||||
QVariantMap json = QtJson::parse(reply, success).toMap();
|
QVariantMap json = QtJson::parse(reply, success).toMap();
|
||||||
_public_share_id = json.value("ocs").toMap().values("data")[0].toMap().value("id").toULongLong();
|
_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();
|
QString url = json.value("ocs").toMap().values("data")[0].toMap().value("url").toString();
|
||||||
_ui->lineEdit_shareLink->setText(url);
|
|
||||||
|
setShareLink(url);
|
||||||
|
|
||||||
setShareCheckBoxTitle(true);
|
setShareCheckBoxTitle(true);
|
||||||
|
|
||||||
_ui->widget_shareLink->show();
|
_ui->widget_shareLink->show();
|
||||||
@@ -384,14 +432,12 @@ void ShareDialog::slotCreateShareFetched(const QString &reply)
|
|||||||
|
|
||||||
void ShareDialog::slotCheckBoxPasswordClicked()
|
void ShareDialog::slotCheckBoxPasswordClicked()
|
||||||
{
|
{
|
||||||
if (_ui->checkBox_password->checkState() == Qt::Checked)
|
if (_ui->checkBox_password->checkState() == Qt::Checked) {
|
||||||
{
|
|
||||||
_ui->lineEdit_password->show();
|
_ui->lineEdit_password->show();
|
||||||
_ui->pushButton_setPassword->show();
|
_ui->pushButton_setPassword->show();
|
||||||
_ui->lineEdit_password->setPlaceholderText(tr("Choose a password for the public link"));
|
_ui->lineEdit_password->setPlaceholderText(tr("Choose a password for the public link"));
|
||||||
}
|
_ui->lineEdit_password->setFocus();
|
||||||
else
|
} else {
|
||||||
{
|
|
||||||
ShareDialog::setPassword(QString());
|
ShareDialog::setPassword(QString());
|
||||||
_ui->lineEdit_password->setPlaceholderText(QString());
|
_ui->lineEdit_password->setPlaceholderText(QString());
|
||||||
_pi_password->startAnimation();
|
_pi_password->startAnimation();
|
||||||
@@ -406,21 +452,21 @@ void ShareDialog::slotCheckBoxExpireClicked()
|
|||||||
{
|
{
|
||||||
const QDate date = QDate::currentDate().addDays(1);
|
const QDate date = QDate::currentDate().addDays(1);
|
||||||
ShareDialog::setExpireDate(date);
|
ShareDialog::setExpireDate(date);
|
||||||
_ui->calendar->setSelectedDate(date);
|
_ui->calendar->setDate(date);
|
||||||
_ui->calendar->setMinimumDate(date);
|
_ui->calendar->setMinimumDate(date);
|
||||||
_ui->calendar->show();
|
_ui->calendar->setEnabled(true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ShareDialog::setExpireDate(QDate());
|
ShareDialog::setExpireDate(QDate());
|
||||||
_ui->calendar->hide();
|
_ui->calendar->setEnabled(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShareDialog::slotPushButtonCopyLinkPressed()
|
void ShareDialog::slotPushButtonCopyLinkPressed()
|
||||||
{
|
{
|
||||||
QClipboard *clipboard = QApplication::clipboard();
|
QClipboard *clipboard = QApplication::clipboard();
|
||||||
clipboard->setText(_ui->lineEdit_shareLink->text());
|
clipboard->setText(_shareUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ShareDialog::checkJsonReturnCode(const QString &reply, QString &message)
|
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)
|
void ShareDialog::setShareCheckBoxTitle(bool haveShares)
|
||||||
{
|
{
|
||||||
const QString noSharesTitle(tr("Check to share by public link"));
|
const QString noSharesTitle(tr("Check to &share by public link"));
|
||||||
const QString haveSharesTitle(tr("Shared by public link (uncheck to delete share)"));
|
const QString haveSharesTitle(tr("&Shared by public link (uncheck to delete share)"));
|
||||||
|
|
||||||
if( haveShares ) {
|
if( haveShares ) {
|
||||||
_ui->checkBox_shareLink->setText( haveSharesTitle );
|
_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->setText( errMsg );
|
||||||
_ui->errorLabel->show();
|
_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 )
|
void ShareDialog::displayInfo( const QString& msg )
|
||||||
{
|
{
|
||||||
_ui->label_sharePath->setText(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
|
* 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
|
* here, see https://github.com/owncloud/client/issues/2732
|
||||||
|
|||||||
@@ -57,7 +57,8 @@ class ShareDialog : public QDialog
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
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();
|
~ShareDialog();
|
||||||
void getShares();
|
void getShares();
|
||||||
|
|
||||||
@@ -72,20 +73,25 @@ private slots:
|
|||||||
void slotCheckBoxPasswordClicked();
|
void slotCheckBoxPasswordClicked();
|
||||||
void slotCheckBoxExpireClicked();
|
void slotCheckBoxExpireClicked();
|
||||||
void slotPasswordReturnPressed();
|
void slotPasswordReturnPressed();
|
||||||
|
void slotPasswordChanged(const QString& newText);
|
||||||
void slotPushButtonCopyLinkPressed();
|
void slotPushButtonCopyLinkPressed();
|
||||||
void slotThumbnailFetched(const int &statusCode, const QByteArray &reply);
|
void slotThumbnailFetched(const int &statusCode, const QByteArray &reply);
|
||||||
private:
|
private:
|
||||||
void setShareCheckBoxTitle(bool haveShares);
|
void setShareCheckBoxTitle(bool haveShares);
|
||||||
void displayError(int code);
|
void displayError(int code);
|
||||||
void displayInfo( const QString& msg );
|
void displayError(const QString& errMsg);
|
||||||
|
void setShareLink( const QString& url );
|
||||||
|
|
||||||
Ui::ShareDialog *_ui;
|
Ui::ShareDialog *_ui;
|
||||||
AccountPtr _account;
|
AccountPtr _account;
|
||||||
QString _sharePath;
|
QString _sharePath;
|
||||||
QString _localPath;
|
QString _localPath;
|
||||||
|
QString _shareUrl;
|
||||||
|
#if 0
|
||||||
QString _folderAlias;
|
QString _folderAlias;
|
||||||
int _uploadFails;
|
int _uploadFails;
|
||||||
QString _expectedSyncFile;
|
QString _expectedSyncFile;
|
||||||
|
#endif
|
||||||
|
|
||||||
bool _passwordJobRunning;
|
bool _passwordJobRunning;
|
||||||
QList<QVariant> _shares;
|
QList<QVariant> _shares;
|
||||||
@@ -98,6 +104,7 @@ private:
|
|||||||
QProgressIndicator *_pi_password;
|
QProgressIndicator *_pi_password;
|
||||||
QProgressIndicator *_pi_date;
|
QProgressIndicator *_pi_date;
|
||||||
|
|
||||||
|
bool _resharingAllowed;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,15 +6,148 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>362</width>
|
<width>403</width>
|
||||||
<height>427</height>
|
<height>296</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
<string>Share NewDocument.odt</string>
|
<string>Share NewDocument.odt</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout_4">
|
<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 &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&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 &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 &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">
|
<widget class="QGroupBox" name="groupBox">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||||
@@ -81,90 +214,7 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="0">
|
<item row="3" column="1">
|
||||||
<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">
|
|
||||||
<spacer name="verticalSpacer">
|
<spacer name="verticalSpacer">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Vertical</enum>
|
<enum>Qt::Vertical</enum>
|
||||||
@@ -177,31 +227,6 @@
|
|||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</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>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<layoutdefault spacing="6" margin="11"/>
|
<layoutdefault spacing="6" margin="11"/>
|
||||||
|
|||||||
@@ -185,8 +185,9 @@ void SocketApi::slotNewConnection()
|
|||||||
broadcastMessage(QLatin1String("ICON_PATH"), iconPath );
|
broadcastMessage(QLatin1String("ICON_PATH"), iconPath );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
foreach( QString alias, FolderMan::instance()->map().keys() ) {
|
foreach( Folder *f, FolderMan::instance()->map() ) {
|
||||||
slotRegisterPath(alias);
|
QString message = buildRegisterPathMessage(f->path());
|
||||||
|
sendMessage(socket, message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -226,7 +227,10 @@ void SocketApi::slotRegisterPath( const QString& alias )
|
|||||||
{
|
{
|
||||||
Folder *f = FolderMan::instance()->folder(alias);
|
Folder *f = FolderMan::instance()->folder(alias);
|
||||||
if (f) {
|
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.
|
// files that are not within a sync folder are not synced.
|
||||||
sendMessage(socket, message);
|
sendMessage(socket, message);
|
||||||
} else {
|
} 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);
|
const QString message = QLatin1String("SHARE:OK:")+QDir::toNativeSeparators(localFile);
|
||||||
sendMessage(socket, message);
|
sendMessage(socket, message);
|
||||||
|
|
||||||
const QString folderForPath = shareFolder->path();
|
emit shareCommandReceived(remotePath, localFile, allowReshare);
|
||||||
const QString remotePath = shareFolder->remotePath() + localFile.right(localFile.count()-folderForPath.count()+1);
|
|
||||||
emit shareCommandReceived(remotePath, localFile);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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()));
|
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 )
|
SqlQuery* SocketApi::getSqlQuery( Folder *folder )
|
||||||
{
|
{
|
||||||
if( !folder ) {
|
if( !folder ) {
|
||||||
@@ -491,6 +513,10 @@ SyncJournalFileRecord SocketApi::dbFileRecord_capi( Folder *folder, QString file
|
|||||||
fileName.remove(0, folder->path().length());
|
fileName.remove(0, folder->path().length());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// remove trailing slash
|
||||||
|
if( fileName.endsWith( QLatin1Char('/') ) ) {
|
||||||
|
fileName.truncate(fileName.length()-1);
|
||||||
|
}
|
||||||
SqlQuery *query = getSqlQuery(folder);
|
SqlQuery *query = getSqlQuery(folder);
|
||||||
SyncJournalFileRecord rec;
|
SyncJournalFileRecord rec;
|
||||||
|
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ public slots:
|
|||||||
void slotClearExcludesList();
|
void slotClearExcludesList();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void shareCommandReceived(const QString &sharePath, const QString &localPath);
|
void shareCommandReceived(const QString &sharePath, const QString &localPath, bool resharingAllowed);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void slotNewConnection();
|
void slotNewConnection();
|
||||||
@@ -82,6 +82,7 @@ private:
|
|||||||
Q_INVOKABLE void command_VERSION(const QString& argument, SocketType* socket);
|
Q_INVOKABLE void command_VERSION(const QString& argument, SocketType* socket);
|
||||||
|
|
||||||
Q_INVOKABLE void command_SHARE_MENU_TITLE(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
|
#ifdef SOCKETAPI_TCP
|
||||||
QTcpServer _localServer;
|
QTcpServer _localServer;
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ void SyncRunFileLog::logItem( const SyncFileItem& item )
|
|||||||
if( item._direction == SyncFileItem::None ) {
|
if( item._direction == SyncFileItem::None ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
QString ts = item._responseTimeStamp;
|
QString ts = QString::fromAscii(item._responseTimeStamp);
|
||||||
if( ts.length() > 6 ) {
|
if( ts.length() > 6 ) {
|
||||||
QRegExp rx("(\\d\\d:\\d\\d:\\d\\d)");
|
QRegExp rx("(\\d\\d:\\d\\d:\\d\\d)");
|
||||||
if( ts.contains(rx) ) {
|
if( ts.contains(rx) ) {
|
||||||
|
|||||||
@@ -104,8 +104,12 @@ void ConnectionValidator::slotStatusFound(const QUrl&url, const QVariantMap &inf
|
|||||||
// status.php could not be loaded (network or server issue!).
|
// status.php could not be loaded (network or server issue!).
|
||||||
void ConnectionValidator::slotNoStatusFound(QNetworkReply *reply)
|
void ConnectionValidator::slotNoStatusFound(QNetworkReply *reply)
|
||||||
{
|
{
|
||||||
_errors.append(tr("Unable to connect to %1").arg(_account->url().toString()));
|
if( reply && ! _account->credentials()->stillValid(reply)) {
|
||||||
_errors.append( reply->errorString() );
|
_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 );
|
reportResult( StatusNotFound );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -254,9 +254,7 @@ void DiscoverySingleDirectoryJob::directoryListingIteratedSlot(QString file,QMap
|
|||||||
if (map.contains("permissions")) {
|
if (map.contains("permissions")) {
|
||||||
emit firstDirectoryPermissions(map.value("permissions"));
|
emit firstDirectoryPermissions(map.value("permissions"));
|
||||||
}
|
}
|
||||||
if (map.contains("getetag")) {
|
|
||||||
emit firstDirectoryEtag(map.value("getetag"));
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
// Remove /remote.php/webdav/folder/ from /remote.php/webdav/folder/subfile.txt
|
// Remove /remote.php/webdav/folder/ from /remote.php/webdav/folder/subfile.txt
|
||||||
file.remove(0, _lsColJob->reply()->request().url().path().length());
|
file.remove(0, _lsColJob->reply()->request().url().path().length());
|
||||||
@@ -276,10 +274,15 @@ void DiscoverySingleDirectoryJob::directoryListingIteratedSlot(QString file,QMap
|
|||||||
_results.append(file_stat);
|
_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()
|
void DiscoverySingleDirectoryJob::lsJobFinishedWithoutErrorSlot()
|
||||||
{
|
{
|
||||||
|
emit etagConcatenation(_etagConcatenation);
|
||||||
emit finishedWithResult(_results);
|
emit finishedWithResult(_results);
|
||||||
deleteLater();
|
deleteLater();
|
||||||
}
|
}
|
||||||
@@ -352,8 +355,8 @@ void DiscoveryMainThread::doOpendirSlot(QString subPath, DiscoveryDirectoryResul
|
|||||||
this, SLOT(singleDirectoryJobFinishedWithErrorSlot(int,QString)));
|
this, SLOT(singleDirectoryJobFinishedWithErrorSlot(int,QString)));
|
||||||
QObject::connect(_singleDirJob, SIGNAL(firstDirectoryPermissions(QString)),
|
QObject::connect(_singleDirJob, SIGNAL(firstDirectoryPermissions(QString)),
|
||||||
this, SLOT(singleDirectoryJobFirstDirectoryPermissionsSlot(QString)));
|
this, SLOT(singleDirectoryJobFirstDirectoryPermissionsSlot(QString)));
|
||||||
QObject::connect(_singleDirJob, SIGNAL(firstDirectoryEtag(QString)),
|
QObject::connect(_singleDirJob, SIGNAL(etagConcatenation(QString)),
|
||||||
this, SIGNAL(rootEtag(QString)));
|
this, SIGNAL(etagConcatenation(QString)));
|
||||||
_singleDirJob->start();
|
_singleDirJob->start();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -383,7 +386,7 @@ void DiscoveryMainThread::singleDirectoryJobFinishedWithErrorSlot(int csyncErrno
|
|||||||
if (!_currentDiscoveryDirectoryResult) {
|
if (!_currentDiscoveryDirectoryResult) {
|
||||||
return; // possibly aborted
|
return; // possibly aborted
|
||||||
}
|
}
|
||||||
qDebug() << Q_FUNC_INFO;
|
qDebug() << Q_FUNC_INFO << csyncErrnoCode << msg;
|
||||||
|
|
||||||
_currentDiscoveryDirectoryResult->code = csyncErrnoCode;
|
_currentDiscoveryDirectoryResult->code = csyncErrnoCode;
|
||||||
_currentDiscoveryDirectoryResult->msg = msg;
|
_currentDiscoveryDirectoryResult->msg = msg;
|
||||||
@@ -405,20 +408,22 @@ void DiscoveryMainThread::singleDirectoryJobFirstDirectoryPermissionsSlot(QStrin
|
|||||||
|
|
||||||
// called from SyncEngine
|
// called from SyncEngine
|
||||||
void DiscoveryMainThread::abort() {
|
void DiscoveryMainThread::abort() {
|
||||||
if (_currentDiscoveryDirectoryResult) {
|
|
||||||
if (_discoveryJob->_vioMutex.tryLock()) {
|
|
||||||
_currentDiscoveryDirectoryResult->code = EIO; // FIXME aborted
|
|
||||||
_currentDiscoveryDirectoryResult = 0;
|
|
||||||
_discoveryJob->_vioWaitCondition.wakeAll();
|
|
||||||
_discoveryJob->_vioMutex.unlock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (_singleDirJob) {
|
if (_singleDirJob) {
|
||||||
_singleDirJob->disconnect(SIGNAL(finishedWithError(int,QString)), this);
|
_singleDirJob->disconnect(SIGNAL(finishedWithError(int,QString)), this);
|
||||||
_singleDirJob->disconnect(SIGNAL(firstDirectoryPermissions(QString)), this);
|
_singleDirJob->disconnect(SIGNAL(firstDirectoryPermissions(QString)), this);
|
||||||
_singleDirJob->disconnect(SIGNAL(finishedWithResult(QLinkedList<csync_vio_file_stat_t*>)), this);
|
_singleDirJob->disconnect(SIGNAL(finishedWithResult(QLinkedList<csync_vio_file_stat_t*>)), this);
|
||||||
_singleDirJob->abort();
|
_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.
|
// Upon awakening from the _vioWaitCondition, iterator should be a valid iterator.
|
||||||
if (directoryResult->code != 0) {
|
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;
|
errno = directoryResult->code;
|
||||||
// save the error string to the context
|
// save the error string to the context
|
||||||
discoveryJob->_csync_ctx->error_string = qstrdup( directoryResult->msg.toUtf8().constData() );
|
discoveryJob->_csync_ctx->error_string = qstrdup( directoryResult->msg.toUtf8().constData() );
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ public:
|
|||||||
// This is not actually a network job, it is just a job
|
// This is not actually a network job, it is just a job
|
||||||
signals:
|
signals:
|
||||||
void firstDirectoryPermissions(const QString &);
|
void firstDirectoryPermissions(const QString &);
|
||||||
void firstDirectoryEtag(const QString &);
|
void etagConcatenation(const QString &);
|
||||||
void finishedWithResult(QLinkedList<csync_vio_file_stat_t*>);
|
void finishedWithResult(QLinkedList<csync_vio_file_stat_t*>);
|
||||||
void finishedWithError(int csyncErrnoCode, QString msg);
|
void finishedWithError(int csyncErrnoCode, QString msg);
|
||||||
private slots:
|
private slots:
|
||||||
@@ -62,6 +62,7 @@ private slots:
|
|||||||
private:
|
private:
|
||||||
QLinkedList<csync_vio_file_stat_t*> _results;
|
QLinkedList<csync_vio_file_stat_t*> _results;
|
||||||
QString _subPath;
|
QString _subPath;
|
||||||
|
QString _etagConcatenation;
|
||||||
AccountPtr _account;
|
AccountPtr _account;
|
||||||
bool _ignoredFirst;
|
bool _ignoredFirst;
|
||||||
QPointer<LsColJob> _lsColJob;
|
QPointer<LsColJob> _lsColJob;
|
||||||
@@ -116,7 +117,7 @@ public slots:
|
|||||||
void singleDirectoryJobFinishedWithErrorSlot(int csyncErrnoCode, QString msg);
|
void singleDirectoryJobFinishedWithErrorSlot(int csyncErrnoCode, QString msg);
|
||||||
void singleDirectoryJobFirstDirectoryPermissionsSlot(QString);
|
void singleDirectoryJobFirstDirectoryPermissionsSlot(QString);
|
||||||
signals:
|
signals:
|
||||||
void rootEtag(QString);
|
void etagConcatenation(QString);
|
||||||
public:
|
public:
|
||||||
void setupHooks(DiscoveryJob* discoveryJob, const QString &pathPrefix);
|
void setupHooks(DiscoveryJob* discoveryJob, const QString &pathPrefix);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -107,6 +107,54 @@ bool FileSystem::setModTime(const QString& filename, time_t modTime)
|
|||||||
return true;
|
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)
|
bool FileSystem::renameReplace(const QString& originFileName, const QString& destinationFileName, QString* errorString)
|
||||||
{
|
{
|
||||||
#ifndef Q_OS_WIN
|
#ifndef Q_OS_WIN
|
||||||
@@ -156,12 +204,12 @@ bool FileSystem::renameReplace(const QString& originFileName, const QString& des
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FileSystem::openFileSharedRead(QFile* file, QString* error)
|
bool FileSystem::openAndSeekFileSharedRead(QFile* file, QString* errorOrNull, qint64 seek)
|
||||||
{
|
{
|
||||||
bool ok = false;
|
QString errorDummy;
|
||||||
if (error) {
|
// avoid many if (errorOrNull) later.
|
||||||
error->clear();
|
QString& error = errorOrNull ? *errorOrNull : errorDummy;
|
||||||
}
|
error.clear();
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
//
|
//
|
||||||
@@ -188,9 +236,7 @@ bool FileSystem::openFileSharedRead(QFile* file, QString* error)
|
|||||||
|
|
||||||
// Bail out on error.
|
// Bail out on error.
|
||||||
if (fileHandle == INVALID_HANDLE_VALUE) {
|
if (fileHandle == INVALID_HANDLE_VALUE) {
|
||||||
if (error) {
|
error = qt_error_string();
|
||||||
*error = qt_error_string();
|
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -199,32 +245,37 @@ bool FileSystem::openFileSharedRead(QFile* file, QString* error)
|
|||||||
// the fd the handle will be closed too.
|
// the fd the handle will be closed too.
|
||||||
int fd = _open_osfhandle((intptr_t)fileHandle, _O_RDONLY);
|
int fd = _open_osfhandle((intptr_t)fileHandle, _O_RDONLY);
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
if (error) {
|
error = "could not make fd from handle";
|
||||||
*error = "could not make fd from handle";
|
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
ok = file->open(fd, QIODevice::ReadOnly, QFile::AutoCloseHandle);
|
if (!file->open(fd, QIODevice::ReadOnly, QFile::AutoCloseHandle)) {
|
||||||
#else
|
error = file->errorString();
|
||||||
ok = file->open(QFile::ReadOnly);
|
return false;
|
||||||
#endif
|
|
||||||
if (! ok && error) {
|
|
||||||
*error = file->errorString();
|
|
||||||
}
|
}
|
||||||
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
|
#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)
|
static qint64 getSizeWithCsync(const QString& filename)
|
||||||
{
|
{
|
||||||
qint64 result = 0;
|
qint64 result = 0;
|
||||||
|
|||||||
@@ -59,6 +59,14 @@ qint64 OWNCLOUDSYNC_EXPORT getSize(const QString& filename);
|
|||||||
*/
|
*/
|
||||||
bool OWNCLOUDSYNC_EXPORT fileExists(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
|
* Rename the file \a originFileName to \a destinationFileName, and overwrite the destination if it
|
||||||
* already exists
|
* already exists
|
||||||
@@ -67,13 +75,13 @@ bool renameReplace(const QString &originFileName, const QString &destinationFile
|
|||||||
QString *errorString);
|
QString *errorString);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Replacement for QFile::open(ReadOnly) that sets a more permissive sharing mode
|
* Replacement for QFile::open(ReadOnly) followed by a seek().
|
||||||
* on Windows.
|
* This version sets a more permissive sharing mode on Windows.
|
||||||
*
|
*
|
||||||
* Warning: The resuting file may have an empty fileName and be unsuitable for use
|
* 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
|
#ifdef Q_OS_WIN
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -166,7 +166,7 @@ void AbstractNetworkJob::slotFinished()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// get the Date timestamp from reply
|
// get the Date timestamp from reply
|
||||||
_responseTimestamp = QString::fromAscii(_reply->rawHeader("Date"));
|
_responseTimestamp = _reply->rawHeader("Date");
|
||||||
_duration = _durationTimer.elapsed();
|
_duration = _durationTimer.elapsed();
|
||||||
|
|
||||||
if (_followRedirects) {
|
if (_followRedirects) {
|
||||||
@@ -206,7 +206,7 @@ quint64 AbstractNetworkJob::duration()
|
|||||||
return _duration;
|
return _duration;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString AbstractNetworkJob::responseTimestamp()
|
QByteArray AbstractNetworkJob::responseTimestamp()
|
||||||
{
|
{
|
||||||
return _responseTimestamp;
|
return _responseTimestamp;
|
||||||
}
|
}
|
||||||
@@ -248,16 +248,12 @@ RequestEtagJob::RequestEtagJob(AccountPtr account, const QString &path, QObject
|
|||||||
void RequestEtagJob::start()
|
void RequestEtagJob::start()
|
||||||
{
|
{
|
||||||
QNetworkRequest req;
|
QNetworkRequest req;
|
||||||
if (path().isEmpty() || path() == QLatin1String("/")) {
|
// Let's always request all entries inside a directory. There are/were bugs in the server
|
||||||
/* For the root directory, we need to query the etags of all the sub directories
|
// where a root or root-folder ETag is not updated when its contents change. We work around
|
||||||
* because, at the time I am writing this comment (Owncloud 5.0.9), the etag of the
|
// this by concatenating the ETags of the root and its contents.
|
||||||
* root directory is not updated when the sub directories changes */
|
req.setRawHeader("Depth", "1");
|
||||||
//req.setRawHeader("Depth", "1");
|
// See https://github.com/owncloud/core/issues/5255 and others
|
||||||
//This should be fixed since oC6 https://github.com/owncloud/core/issues/5255
|
|
||||||
req.setRawHeader("Depth", "0");
|
|
||||||
} else {
|
|
||||||
req.setRawHeader("Depth", "0");
|
|
||||||
}
|
|
||||||
QByteArray xml("<?xml version=\"1.0\" ?>\n"
|
QByteArray xml("<?xml version=\"1.0\" ?>\n"
|
||||||
"<d:propfind xmlns:d=\"DAV:\">\n"
|
"<d:propfind xmlns:d=\"DAV:\">\n"
|
||||||
" <d:prop>\n"
|
" <d:prop>\n"
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ public:
|
|||||||
void setIgnoreCredentialFailure(bool ignore);
|
void setIgnoreCredentialFailure(bool ignore);
|
||||||
bool ignoreCredentialFailure() const { return _ignoreCredentialFailure; }
|
bool ignoreCredentialFailure() const { return _ignoreCredentialFailure; }
|
||||||
|
|
||||||
QString responseTimestamp();
|
QByteArray responseTimestamp();
|
||||||
quint64 duration();
|
quint64 duration();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
@@ -90,7 +90,7 @@ protected:
|
|||||||
|
|
||||||
int maxRedirects() const { return 10; }
|
int maxRedirects() const { return 10; }
|
||||||
virtual bool finished() = 0;
|
virtual bool finished() = 0;
|
||||||
QString _responseTimestamp;
|
QByteArray _responseTimestamp;
|
||||||
QElapsedTimer _durationTimer;
|
QElapsedTimer _durationTimer;
|
||||||
quint64 _duration;
|
quint64 _duration;
|
||||||
bool _timedout; // set to true when the timeout slot is recieved
|
bool _timedout; // set to true when the timeout slot is recieved
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ ProgressDispatcher* ProgressDispatcher::_instance = 0;
|
|||||||
QString Progress::asResultString( const SyncFileItem& item)
|
QString Progress::asResultString( const SyncFileItem& item)
|
||||||
{
|
{
|
||||||
switch(item._instruction) {
|
switch(item._instruction) {
|
||||||
case CSYNC_INSTRUCTION_CONFLICT:
|
|
||||||
case CSYNC_INSTRUCTION_SYNC:
|
case CSYNC_INSTRUCTION_SYNC:
|
||||||
case CSYNC_INSTRUCTION_NEW:
|
case CSYNC_INSTRUCTION_NEW:
|
||||||
if (item._direction != SyncFileItem::Up) {
|
if (item._direction != SyncFileItem::Up) {
|
||||||
@@ -33,6 +32,8 @@ QString Progress::asResultString( const SyncFileItem& item)
|
|||||||
} else {
|
} else {
|
||||||
return QCoreApplication::translate( "progress", "Uploaded");
|
return QCoreApplication::translate( "progress", "Uploaded");
|
||||||
}
|
}
|
||||||
|
case CSYNC_INSTRUCTION_CONFLICT:
|
||||||
|
return QCoreApplication::translate( "progress", "Downloaded, renamed conflicting file");
|
||||||
case CSYNC_INSTRUCTION_REMOVE:
|
case CSYNC_INSTRUCTION_REMOVE:
|
||||||
return QCoreApplication::translate( "progress", "Deleted");
|
return QCoreApplication::translate( "progress", "Deleted");
|
||||||
case CSYNC_INSTRUCTION_EVAL_RENAME:
|
case CSYNC_INSTRUCTION_EVAL_RENAME:
|
||||||
|
|||||||
@@ -399,7 +399,7 @@ void PropagateDownloadFileQNAM::slotGetFinished()
|
|||||||
_propagator->_journal->setDownloadInfo(_item._file, SyncJournalDb::DownloadInfo());
|
_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
|
// If this was with a direct download, retry without direct download
|
||||||
qWarning() << "Direct download of" << _item._directDownloadUrl << "failed. Retrying through owncloud.";
|
qWarning() << "Direct download of" << _item._directDownloadUrl << "failed. Retrying through owncloud.";
|
||||||
_item._directDownloadUrl.clear();
|
_item._directDownloadUrl.clear();
|
||||||
@@ -492,11 +492,11 @@ void PropagateDownloadFileQNAM::downloadFinished()
|
|||||||
bool isConflict = _item._instruction == CSYNC_INSTRUCTION_CONFLICT
|
bool isConflict = _item._instruction == CSYNC_INSTRUCTION_CONFLICT
|
||||||
&& !FileSystem::fileEquals(fn, _tmpFile.fileName());
|
&& !FileSystem::fileEquals(fn, _tmpFile.fileName());
|
||||||
if (isConflict) {
|
if (isConflict) {
|
||||||
QFile f(fn);
|
QString renameError;
|
||||||
QString conflictFileName = makeConflictFileName(fn, Utility::qDateTimeFromTime_t(_item._modtime));
|
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.
|
//If the rename fails, don't replace it.
|
||||||
done(SyncFileItem::SoftError, f.errorString());
|
done(SyncFileItem::SoftError, renameError);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
#include "owncloudpropagator_p.h"
|
#include "owncloudpropagator_p.h"
|
||||||
#include "account.h"
|
#include "account.h"
|
||||||
#include "syncjournalfilerecord.h"
|
#include "syncjournalfilerecord.h"
|
||||||
|
#include "filesystem.h"
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
|
|
||||||
@@ -81,7 +82,8 @@ void PropagateRemoteMove::start()
|
|||||||
QString originalFile(_propagator->getFilePath(QLatin1String("Shared")));
|
QString originalFile(_propagator->getFilePath(QLatin1String("Shared")));
|
||||||
_propagator->addTouchedFile(originalFile);
|
_propagator->addTouchedFile(originalFile);
|
||||||
_propagator->addTouchedFile(targetFile);
|
_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."));
|
done(SyncFileItem::NormalError, tr("This folder must not be renamed. It is renamed back to its original name."));
|
||||||
} else {
|
} else {
|
||||||
done(SyncFileItem::NormalError, tr("This folder must not be renamed. Please name it back to Shared."));
|
done(SyncFileItem::NormalError, tr("This folder must not be renamed. Please name it back to Shared."));
|
||||||
|
|||||||
@@ -232,17 +232,13 @@ bool UploadDevice::prepareAndOpen(const QString& fileName, qint64 start, qint64
|
|||||||
|
|
||||||
QFile file(fileName);
|
QFile file(fileName);
|
||||||
QString openError;
|
QString openError;
|
||||||
if (!FileSystem::openFileSharedRead(&file, &openError)) {
|
if (!FileSystem::openAndSeekFileSharedRead(&file, &openError, start)) {
|
||||||
setErrorString(openError);
|
setErrorString(openError);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
size = qMin(FileSystem::getSize(fileName), size);
|
size = qBound(0ll, size, FileSystem::getSize(fileName) - start);
|
||||||
_data.resize(size);
|
_data.resize(size);
|
||||||
if (!file.seek(start)) {
|
|
||||||
setErrorString(file.errorString());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
auto read = file.read(_data.data(), size);
|
auto read = file.read(_data.data(), size);
|
||||||
if (read != size) {
|
if (read != size) {
|
||||||
setErrorString(file.errorString());
|
setErrorString(file.errorString());
|
||||||
@@ -406,6 +402,7 @@ void PropagateUploadFileQNAM::startNextChunk()
|
|||||||
return;
|
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);
|
PUTFileJob* job = new PUTFileJob(_propagator->account(), _propagator->_remoteFolder + path, device, headers, _currentChunk);
|
||||||
_jobs.append(job);
|
_jobs.append(job);
|
||||||
connect(job, SIGNAL(finishedSignal()), this, SLOT(slotPutFinished()));
|
connect(job, SIGNAL(finishedSignal()), this, SLOT(slotPutFinished()));
|
||||||
@@ -422,18 +419,14 @@ void PropagateUploadFileQNAM::startNextChunk()
|
|||||||
parallelChunkUpload = env != "false" && env != "0";
|
parallelChunkUpload = env != "false" && env != "0";
|
||||||
} else {
|
} else {
|
||||||
auto version = _propagator->account()->serverVersion();
|
auto version = _propagator->account()->serverVersion();
|
||||||
auto dotPos = version.indexOf('.');
|
auto components = version.split('.');
|
||||||
if (dotPos > 0) {
|
int versionNum = (components.value(0).toInt() << 16)
|
||||||
if (version.leftRef(dotPos)
|
+ (components.value(1).toInt() << 8)
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(5, 1, 0)
|
+ components.value(2).toInt();
|
||||||
.toString() // QStringRef::toInt was added in Qt 5.1
|
if (versionNum < 0x080003) {
|
||||||
#endif
|
// Disable parallel chunk upload severs older than 8.0.3 to avoid too many
|
||||||
.toInt() < 8) {
|
// internal sever errors (#2743, #2938)
|
||||||
|
parallelChunkUpload = false;
|
||||||
// Disable parallel chunk upload on older sever to avoid too many
|
|
||||||
// internal sever errors (#2743)
|
|
||||||
parallelChunkUpload = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -695,11 +695,11 @@ void PropagateDownloadFileLegacy::start()
|
|||||||
&& !FileSystem::fileEquals(fn, tmpFile.fileName()); // compare the files to see if there was an actual conflict.
|
&& !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
|
//In case of conflict, make a backup of the old file
|
||||||
if (isConflict) {
|
if (isConflict) {
|
||||||
QFile f(fn);
|
|
||||||
QString conflictFileName = makeConflictFileName(fn, Utility::qDateTimeFromTime_t(_item._modtime));
|
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.
|
//If the rename fails, don't replace it.
|
||||||
done(SyncFileItem::NormalError, f.errorString());
|
done(SyncFileItem::NormalError, renameError);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -155,9 +155,9 @@ void PropagateLocalRename::start()
|
|||||||
|
|
||||||
_propagator->addTouchedFile(existingFile);
|
_propagator->addTouchedFile(existingFile);
|
||||||
_propagator->addTouchedFile(targetFile);
|
_propagator->addTouchedFile(targetFile);
|
||||||
QFile file(existingFile);
|
QString renameError;
|
||||||
if (!file.rename(targetFile)) {
|
if (!FileSystem::rename(existingFile, targetFile, &renameError)) {
|
||||||
done(SyncFileItem::NormalError, file.errorString());
|
done(SyncFileItem::NormalError, renameError);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,6 @@
|
|||||||
#include "syncjournalfilerecord.h"
|
#include "syncjournalfilerecord.h"
|
||||||
#include "discoveryphase.h"
|
#include "discoveryphase.h"
|
||||||
#include "creds/abstractcredentials.h"
|
#include "creds/abstractcredentials.h"
|
||||||
#include "csync_util.h"
|
|
||||||
#include "syncfilestatus.h"
|
#include "syncfilestatus.h"
|
||||||
#include "csync_private.h"
|
#include "csync_private.h"
|
||||||
|
|
||||||
@@ -51,6 +50,7 @@
|
|||||||
#ifdef USE_NEON
|
#ifdef USE_NEON
|
||||||
extern "C" int owncloud_commit(CSYNC* ctx);
|
extern "C" int owncloud_commit(CSYNC* ctx);
|
||||||
#endif
|
#endif
|
||||||
|
extern "C" const char *csync_instruction_str(enum csync_instructions_e instr);
|
||||||
|
|
||||||
namespace OCC {
|
namespace OCC {
|
||||||
|
|
||||||
@@ -636,7 +636,7 @@ void SyncEngine::startSync()
|
|||||||
_discoveryMainThread = new DiscoveryMainThread(account());
|
_discoveryMainThread = new DiscoveryMainThread(account());
|
||||||
_discoveryMainThread->setParent(this);
|
_discoveryMainThread->setParent(this);
|
||||||
connect(this, SIGNAL(finished()), _discoveryMainThread, SLOT(deleteLater()));
|
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);
|
DiscoveryJob *discoveryJob = new DiscoveryJob(_csync_ctx);
|
||||||
@@ -656,8 +656,8 @@ void SyncEngine::startSync()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SyncEngine::slotRootEtagReceived(QString e) {
|
void SyncEngine::slotRootEtagReceived(QString e) {
|
||||||
qDebug() << Q_FUNC_INFO << e;
|
|
||||||
if (_remoteRootEtag.isEmpty()) {
|
if (_remoteRootEtag.isEmpty()) {
|
||||||
|
qDebug() << Q_FUNC_INFO << e;
|
||||||
_remoteRootEtag = e;
|
_remoteRootEtag = e;
|
||||||
emit rootEtag(_remoteRootEtag);
|
emit rootEtag(_remoteRootEtag);
|
||||||
}
|
}
|
||||||
@@ -827,7 +827,8 @@ void SyncEngine::setNetworkLimits(int upload, int download)
|
|||||||
|
|
||||||
void SyncEngine::slotJobCompleted(const SyncFileItem &item)
|
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 */
|
/* Update the _syncedItems vector */
|
||||||
int idx = _syncedItems.indexOf(item);
|
int idx = _syncedItems.indexOf(item);
|
||||||
@@ -1194,6 +1195,7 @@ AccountPtr SyncEngine::account() const
|
|||||||
|
|
||||||
void SyncEngine::abort()
|
void SyncEngine::abort()
|
||||||
{
|
{
|
||||||
|
qDebug() << Q_FUNC_INFO << _discoveryMainThread;
|
||||||
// Aborts the discovery phase job
|
// Aborts the discovery phase job
|
||||||
if (_discoveryMainThread) {
|
if (_discoveryMainThread) {
|
||||||
_discoveryMainThread->abort();
|
_discoveryMainThread->abort();
|
||||||
|
|||||||
@@ -21,6 +21,13 @@
|
|||||||
|
|
||||||
#include <csync.h>
|
#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 {
|
namespace OCC {
|
||||||
|
|
||||||
class SyncFileItem {
|
class SyncFileItem {
|
||||||
@@ -51,10 +58,10 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
SyncFileItem() : _type(UnknownType), _direction(None), _isDirectory(false),
|
SyncFileItem() : _type(UnknownType), _direction(None), _isDirectory(false),
|
||||||
_instruction(CSYNC_INSTRUCTION_NONE), _modtime(0),
|
_hasBlacklistEntry(false), _status(NoStatus),
|
||||||
_size(0), _inode(0), _should_update_etag(false), _hasBlacklistEntry(false),
|
_isRestoration(false), _should_update_etag(false),
|
||||||
_status(NoStatus), _httpErrorCode(0), _requestDuration(0), _isRestoration(false),
|
_httpErrorCode(0), _requestDuration(0), _affectedItems(1),
|
||||||
_affectedItems(1)
|
_instruction(CSYNC_INSTRUCTION_NONE), _modtime(0), _size(0), _inode(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,49 +121,49 @@ public:
|
|||||||
// Variables usefull for everybody
|
// Variables usefull for everybody
|
||||||
QString _file;
|
QString _file;
|
||||||
QString _renameTarget;
|
QString _renameTarget;
|
||||||
Type _type;
|
Type _type BITFIELD(3);
|
||||||
Direction _direction;
|
Direction _direction BITFIELD(2);
|
||||||
bool _isDirectory;
|
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
|
// Variables used by the propagator
|
||||||
QString _originalFile; // as it is in the csync tree
|
|
||||||
csync_instructions_e _instruction;
|
csync_instructions_e _instruction;
|
||||||
|
QString _originalFile; // as it is in the csync tree
|
||||||
time_t _modtime;
|
time_t _modtime;
|
||||||
QByteArray _etag;
|
QByteArray _etag;
|
||||||
quint64 _size;
|
quint64 _size;
|
||||||
quint64 _inode;
|
quint64 _inode;
|
||||||
bool _should_update_etag;
|
|
||||||
QByteArray _fileId;
|
QByteArray _fileId;
|
||||||
QByteArray _remotePerm;
|
QByteArray _remotePerm;
|
||||||
QString _directDownloadUrl;
|
QString _directDownloadUrl;
|
||||||
QString _directDownloadCookies;
|
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 {
|
struct {
|
||||||
quint64 _size;
|
quint64 _size;
|
||||||
time_t _modtime;
|
time_t _modtime;
|
||||||
QByteArray _etag;
|
QByteArray _etag;
|
||||||
QByteArray _fileId;
|
QByteArray _fileId;
|
||||||
enum csync_instructions_e _instruction;
|
|
||||||
quint64 _other_size;
|
quint64 _other_size;
|
||||||
time_t _other_modtime;
|
time_t _other_modtime;
|
||||||
QByteArray _other_etag;
|
QByteArray _other_etag;
|
||||||
QByteArray _other_fileId;
|
QByteArray _other_fileId;
|
||||||
QByteArray _other_remotePerm;
|
enum csync_instructions_e _instruction BITFIELD(16);
|
||||||
enum csync_instructions_e _other_instruction;
|
enum csync_instructions_e _other_instruction BITFIELD(16);
|
||||||
} log;
|
} log;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ QString Theme::appName() const
|
|||||||
|
|
||||||
QString Theme::version() const
|
QString Theme::version() const
|
||||||
{
|
{
|
||||||
return QString::fromLocal8Bit( MIRALL_STRINGIFY( MIRALL_VERSION ));
|
return QString::fromLocal8Bit(MIRALL_VERSION_STRING);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef TOKEN_AUTH_ONLY
|
#ifndef TOKEN_AUTH_ONLY
|
||||||
|
|||||||
@@ -206,7 +206,7 @@ Celkový zbývající čas %5</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/accountsettings.cpp" line="773"/>
|
<location filename="../src/gui/accountsettings.cpp" line="773"/>
|
||||||
<source>Currently there is no storage usage information available.</source>
|
<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>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/accountsettings.cpp" line="806"/>
|
<location filename="../src/gui/accountsettings.cpp" line="806"/>
|
||||||
@@ -577,7 +577,7 @@ Opravdu chcete provést tuto akci?</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizard.cpp" line="105"/>
|
<location filename="../src/gui/folderwizard.cpp" line="105"/>
|
||||||
<source>You have no permission to write to the selected folder!</source>
|
<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>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizard.cpp" line="129"/>
|
<location filename="../src/gui/folderwizard.cpp" line="129"/>
|
||||||
@@ -625,12 +625,12 @@ Opravdu chcete provést tuto akci?</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizard.cpp" line="258"/>
|
<location filename="../src/gui/folderwizard.cpp" line="258"/>
|
||||||
<source>Create Remote Folder</source>
|
<source>Create Remote Folder</source>
|
||||||
<translation>Vytvořit vzdálený adresář</translation>
|
<translation>Vytvořit vzdálenou složku</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizard.cpp" line="259"/>
|
<location filename="../src/gui/folderwizard.cpp" line="259"/>
|
||||||
<source>Enter the name of the new folder to be created below '%1':</source>
|
<source>Enter the name of the new folder to be created below '%1':</source>
|
||||||
<translation>Zadejte název nově vytvářeného adresáře níže '%1':</translation>
|
<translation>Zadejte název nově vytvářené složky níže '%1':</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizard.cpp" line="288"/>
|
<location filename="../src/gui/folderwizard.cpp" line="288"/>
|
||||||
@@ -668,7 +668,7 @@ Opravdu chcete provést tuto akci?</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizard.cpp" line="444"/>
|
<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>
|
<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>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -1144,12 +1144,12 @@ si může v průběhu vyžádat dodatečná práva.</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudhttpcredspage.cpp" line="47"/>
|
<location filename="../src/gui/wizard/owncloudhttpcredspage.cpp" line="47"/>
|
||||||
<source>Enter user credentials</source>
|
<source>Enter user credentials</source>
|
||||||
<translation>Zadejte uživatelské údaje</translation>
|
<translation>Zadejte přihlašovací údaje</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudhttpcredspage.cpp" line="164"/>
|
<location filename="../src/gui/wizard/owncloudhttpcredspage.cpp" line="164"/>
|
||||||
<source>Update user credentials</source>
|
<source>Update user credentials</source>
|
||||||
<translation>Upravte uživatelské údaje</translation>
|
<translation>Upravte přihlašovací údaje</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -1327,7 +1327,7 @@ Nedoporučuje se jí používat.</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudwizard.cpp" line="83"/>
|
<location filename="../src/gui/wizard/owncloudwizard.cpp" line="83"/>
|
||||||
<source>Skip folders configuration</source>
|
<source>Skip folders configuration</source>
|
||||||
<translation>Přeskočit konfiguraci adresářů</translation>
|
<translation>Přeskočit konfiguraci složek</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -1456,7 +1456,7 @@ Nedoporučuje se jí používat.</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagatorjobs.cpp" line="83"/>
|
<location filename="../src/libsync/propagatorjobs.cpp" line="83"/>
|
||||||
<source>Could not remove %1 because of a local file name clash</source>
|
<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>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -1645,9 +1645,9 @@ Nedoporučuje se jí používat.</translation>
|
|||||||
<location filename="../src/gui/protocolwidget.cpp" line="265"/>
|
<location filename="../src/gui/protocolwidget.cpp" line="265"/>
|
||||||
<source>%n files are ignored because of previous errors.
|
<source>%n files are ignored because of previous errors.
|
||||||
</source>
|
</source>
|
||||||
<translation><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 chybovým hlášení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 chybovým hlášením.
|
</numerusform><numerusform>%n souborů je ignorováno kvůli předchozím chybám.
|
||||||
</numerusform></translation>
|
</numerusform></translation>
|
||||||
</message>
|
</message>
|
||||||
<message numerus="yes">
|
<message numerus="yes">
|
||||||
@@ -1670,17 +1670,17 @@ Nedoporučuje se jí používat.</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/selectivesyncdialog.cpp" line="306"/>
|
<location filename="../src/gui/selectivesyncdialog.cpp" line="306"/>
|
||||||
<source>Unchecked folders will be <b>removed</b> from your local file system and will not be synchronized to this computer anymore</source>
|
<source>Unchecked folders will be <b>removed</b> from your local file system and will not be synchronized to this computer anymore</source>
|
||||||
<translation>Neoznačené adresáře budou <b>odstraněny</b> z místního souborového systému a nebudou již synchronizovány na tento počítač</translation>
|
<translation>Neoznačené složky budou <b>odstraněny</b> z místního souborového systému a nebudou již synchronizovány na tento počítač</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/selectivesyncdialog.cpp" line="318"/>
|
<location filename="../src/gui/selectivesyncdialog.cpp" line="318"/>
|
||||||
<source>Choose What to Sync: Select remote subfolders you wish to synchronize.</source>
|
<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>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/selectivesyncdialog.cpp" line="319"/>
|
<location filename="../src/gui/selectivesyncdialog.cpp" line="319"/>
|
||||||
<source>Choose What to Sync: Deselect remote subfolders you do not wish to synchronize.</source>
|
<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>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/selectivesyncdialog.cpp" line="325"/>
|
<location filename="../src/gui/selectivesyncdialog.cpp" line="325"/>
|
||||||
@@ -1834,12 +1834,12 @@ Nedoporučuje se jí používat.</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="374"/>
|
<location filename="../src/gui/sharedialog.cpp" line="374"/>
|
||||||
<source>There is no sync folder configured.</source>
|
<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>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="386"/>
|
<location filename="../src/gui/sharedialog.cpp" line="386"/>
|
||||||
<source>Can not find an folder to upload to.</source>
|
<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>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="393"/>
|
<location filename="../src/gui/sharedialog.cpp" line="393"/>
|
||||||
@@ -2044,7 +2044,7 @@ Nedoporučuje se jí používat.</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sslerrordialog.ui" line="25"/>
|
<location filename="../src/gui/sslerrordialog.ui" line="25"/>
|
||||||
<source>Trust this certificate anyway</source>
|
<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>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sslerrordialog.ui" line="44"/>
|
<location filename="../src/gui/sslerrordialog.ui" line="44"/>
|
||||||
@@ -2055,7 +2055,7 @@ Nedoporučuje se jí používat.</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sslerrordialog.cpp" line="134"/>
|
<location filename="../src/gui/sslerrordialog.cpp" line="134"/>
|
||||||
<source>Warnings about current SSL Connection:</source>
|
<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>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sslerrordialog.cpp" line="169"/>
|
<location filename="../src/gui/sslerrordialog.cpp" line="169"/>
|
||||||
@@ -2284,7 +2284,7 @@ Nedoporučuje se jí používat.</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/syncengine.cpp" line="920"/>
|
<location filename="../src/libsync/syncengine.cpp" line="920"/>
|
||||||
<source>Not allowed because you don't have permission to add sub-directories in that directory</source>
|
<source>Not allowed because you don'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>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/syncengine.cpp" line="926"/>
|
<location filename="../src/libsync/syncengine.cpp" line="926"/>
|
||||||
@@ -2310,7 +2310,7 @@ Nedoporučuje se jí používat.</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/syncengine.cpp" line="1003"/>
|
<location filename="../src/libsync/syncengine.cpp" line="1003"/>
|
||||||
<source>Local files and share folder removed.</source>
|
<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>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/syncengine.cpp" line="1058"/>
|
<location filename="../src/libsync/syncengine.cpp" line="1058"/>
|
||||||
@@ -2584,7 +2584,7 @@ Nedoporučuje se jí používat.</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="43"/>
|
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="43"/>
|
||||||
<source><html><head/><body><p>Failed to connect to the secure server address specified. How do you wish to proceed?</p></body></html></source>
|
<source><html><head/><body><p>Failed to connect to the secure server address specified. How do you wish to proceed?</p></body></html></source>
|
||||||
<translation><html><head/><body><p>Nezdařilo se připojení k uvedenému zabezpečenému serveru. Jak si přejete dále postupovat?</p></body></html></translation>
|
<translation><html><head/><body><p>Nezdařilo se připojení k uvedené zabezpečené adrese serveru. Jak si přejete dále postupovat?</p></body></html></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="55"/>
|
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="55"/>
|
||||||
|
|||||||
@@ -245,7 +245,7 @@ Total time left %5</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/addcertificatedialog.ui" line="35"/>
|
<location filename="../src/gui/addcertificatedialog.ui" line="35"/>
|
||||||
<source>Certificate :</source>
|
<source>Certificate :</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Πιστοποιητικό :</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/addcertificatedialog.ui" line="51"/>
|
<location filename="../src/gui/addcertificatedialog.ui" line="51"/>
|
||||||
@@ -255,17 +255,17 @@ Total time left %5</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/addcertificatedialog.ui" line="60"/>
|
<location filename="../src/gui/addcertificatedialog.ui" line="60"/>
|
||||||
<source>Certificate password :</source>
|
<source>Certificate password :</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Πιστοποιήστε τον κωδικό :</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/addcertificatedialog.cpp" line="23"/>
|
<location filename="../src/gui/addcertificatedialog.cpp" line="23"/>
|
||||||
<source>Select a certificate</source>
|
<source>Select a certificate</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Επιλέξτε ένα πιστοποιητικό.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/addcertificatedialog.cpp" line="23"/>
|
<location filename="../src/gui/addcertificatedialog.cpp" line="23"/>
|
||||||
<source>Certificate files (*.p12 *.pfx)</source>
|
<source>Certificate files (*.p12 *.pfx)</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Πιστοποιήστε τα αρχεία (*.p12 *.pfx)</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -330,7 +330,7 @@ Total time left %5</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagateremotedelete.cpp" line="41"/>
|
<location filename="../src/libsync/propagateremotedelete.cpp" line="41"/>
|
||||||
<source>Connection timed out</source>
|
<source>Connection timed out</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Λήξη χρόνου σύνδεσης.</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -899,7 +899,7 @@ Checked items will also be deleted if they prevent a directory from being remove
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagateremotemove.cpp" line="45"/>
|
<location filename="../src/libsync/propagateremotemove.cpp" line="45"/>
|
||||||
<source>Connection timed out</source>
|
<source>Connection timed out</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Η σύνδεση έληξε.</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -1767,7 +1767,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.ui" line="26"/>
|
<location filename="../src/gui/sharedialog.ui" line="26"/>
|
||||||
<source>Share Info</source>
|
<source>Share Info</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Διαμοιρασμός Πληροφοριών</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.ui" line="34"/>
|
<location filename="../src/gui/sharedialog.ui" line="34"/>
|
||||||
@@ -1783,7 +1783,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.ui" line="75"/>
|
<location filename="../src/gui/sharedialog.ui" line="75"/>
|
||||||
<source>OwnCloud Path:</source>
|
<source>OwnCloud Path:</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Διαδρομή ownCloud:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.ui" line="89"/>
|
<location filename="../src/gui/sharedialog.ui" line="89"/>
|
||||||
@@ -1798,7 +1798,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.ui" line="149"/>
|
<location filename="../src/gui/sharedialog.ui" line="149"/>
|
||||||
<source>Set expiry date</source>
|
<source>Set expiry date</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Ορισμός ημερομηνίας λήξης</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="67"/>
|
<location filename="../src/gui/sharedialog.cpp" line="67"/>
|
||||||
@@ -1809,7 +1809,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="68"/>
|
<location filename="../src/gui/sharedialog.cpp" line="68"/>
|
||||||
<source>%1 Sharing</source>
|
<source>%1 Sharing</source>
|
||||||
<translation type="unfinished"/>
|
<translation>%1 Διαμοιράστηκε</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="141"/>
|
<location filename="../src/gui/sharedialog.cpp" line="141"/>
|
||||||
@@ -1829,12 +1829,12 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="374"/>
|
<location filename="../src/gui/sharedialog.cpp" line="374"/>
|
||||||
<source>There is no sync folder configured.</source>
|
<source>There is no sync folder configured.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Δεν έχει οριστεί φάκελος συνχρονισμού.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="386"/>
|
<location filename="../src/gui/sharedialog.cpp" line="386"/>
|
||||||
<source>Can not find an folder to upload to.</source>
|
<source>Can not find an folder to upload to.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Δεν βρέθηκε φάκελος για την προσθήκη αρχείου.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="393"/>
|
<location filename="../src/gui/sharedialog.cpp" line="393"/>
|
||||||
@@ -1849,7 +1849,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="420"/>
|
<location filename="../src/gui/sharedialog.cpp" line="420"/>
|
||||||
<source>Waiting to upload...</source>
|
<source>Waiting to upload...</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Αναμονή για μεταφόρτωση</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="422"/>
|
<location filename="../src/gui/sharedialog.cpp" line="422"/>
|
||||||
@@ -1859,7 +1859,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="453"/>
|
<location filename="../src/gui/sharedialog.cpp" line="453"/>
|
||||||
<source>The file can not be synced.</source>
|
<source>The file can not be synced.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Το αρχείο δεν μπορεί να συγχρονιστεί.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="463"/>
|
<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"/>
|
<location filename="../src/gui/socketapi.cpp" line="431"/>
|
||||||
<source>Share with %1</source>
|
<source>Share with %1</source>
|
||||||
<comment>parameter is ownCloud</comment>
|
<comment>parameter is ownCloud</comment>
|
||||||
<translation type="unfinished"/>
|
<translation>Διαμοιρασμός με %1</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -2218,12 +2218,12 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/syncengine.cpp" line="156"/>
|
<location filename="../src/libsync/syncengine.cpp" line="156"/>
|
||||||
<source>The mounted directory is temporarily not available on the server</source>
|
<source>The mounted directory is temporarily not available on the server</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Ο προσαρτημένος κατάλογος δεν είναι προσωρινά διαθέσιμος στον δικομιστή</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/syncengine.cpp" line="159"/>
|
<location filename="../src/libsync/syncengine.cpp" line="159"/>
|
||||||
<source>An error opening a directory happened</source>
|
<source>An error opening a directory happened</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Ένα σφάλμα συνέβη κατά το άνοιγμα ενός καταλόγου.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/syncengine.cpp" line="162"/>
|
<location filename="../src/libsync/syncengine.cpp" line="162"/>
|
||||||
@@ -2584,7 +2584,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="55"/>
|
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="55"/>
|
||||||
<source>Select a different URL</source>
|
<source>Select a different URL</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Επιλέξτε μια διαφορετική διεύθυνση.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="62"/>
|
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="62"/>
|
||||||
|
|||||||
@@ -1675,12 +1675,12 @@ Il est déconseillé de l'utiliser.</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/selectivesyncdialog.cpp" line="318"/>
|
<location filename="../src/gui/selectivesyncdialog.cpp" line="318"/>
|
||||||
<source>Choose What to Sync: Select remote subfolders you wish to synchronize.</source>
|
<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>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/selectivesyncdialog.cpp" line="319"/>
|
<location filename="../src/gui/selectivesyncdialog.cpp" line="319"/>
|
||||||
<source>Choose What to Sync: Deselect remote subfolders you do not wish to synchronize.</source>
|
<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>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/selectivesyncdialog.cpp" line="325"/>
|
<location filename="../src/gui/selectivesyncdialog.cpp" line="325"/>
|
||||||
@@ -1814,7 +1814,7 @@ Il est déconseillé de l'utiliser.</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="68"/>
|
<location filename="../src/gui/sharedialog.cpp" line="68"/>
|
||||||
<source>%1 Sharing</source>
|
<source>%1 Sharing</source>
|
||||||
<translation>%1 Partagé</translation>
|
<translation>Partage %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="141"/>
|
<location filename="../src/gui/sharedialog.cpp" line="141"/>
|
||||||
@@ -1844,7 +1844,7 @@ Il est déconseillé de l'utiliser.</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="393"/>
|
<location filename="../src/gui/sharedialog.cpp" line="393"/>
|
||||||
<source>Sharing of external directories is not yet working.</source>
|
<source>Sharing of external directories is not yet working.</source>
|
||||||
<translation>Le partage de dossiers externes n'est pas encore supporté actuellement.</translation>
|
<translation>Le partage de dossiers externes n'est pas encore pris en charge.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="408"/>
|
<location filename="../src/gui/sharedialog.cpp" line="408"/>
|
||||||
|
|||||||
@@ -244,27 +244,27 @@ Total tid kvar %5</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/addcertificatedialog.ui" line="35"/>
|
<location filename="../src/gui/addcertificatedialog.ui" line="35"/>
|
||||||
<source>Certificate :</source>
|
<source>Certificate :</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Certifikat :</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/addcertificatedialog.ui" line="51"/>
|
<location filename="../src/gui/addcertificatedialog.ui" line="51"/>
|
||||||
<source>Browse...</source>
|
<source>Browse...</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Bläddra...</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/addcertificatedialog.ui" line="60"/>
|
<location filename="../src/gui/addcertificatedialog.ui" line="60"/>
|
||||||
<source>Certificate password :</source>
|
<source>Certificate password :</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Certifikatlösenord :</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/addcertificatedialog.cpp" line="23"/>
|
<location filename="../src/gui/addcertificatedialog.cpp" line="23"/>
|
||||||
<source>Select a certificate</source>
|
<source>Select a certificate</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Välj ett certifikat</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/addcertificatedialog.cpp" line="23"/>
|
<location filename="../src/gui/addcertificatedialog.cpp" line="23"/>
|
||||||
<source>Certificate files (*.p12 *.pfx)</source>
|
<source>Certificate files (*.p12 *.pfx)</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Certifikatfiler (*.p12 *.pfx)</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -329,7 +329,7 @@ Total tid kvar %5</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagateremotedelete.cpp" line="41"/>
|
<location filename="../src/libsync/propagateremotedelete.cpp" line="41"/>
|
||||||
<source>Connection timed out</source>
|
<source>Connection timed out</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Tidsgräns för anslutningen överskreds</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -898,7 +898,7 @@ Valda objekt kommer också att raderas om dom hindrar en mapp från att tas bort
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagateremotemove.cpp" line="45"/>
|
<location filename="../src/libsync/propagateremotemove.cpp" line="45"/>
|
||||||
<source>Connection timed out</source>
|
<source>Connection timed out</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Tidsgräns för anslutningen överskreds</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<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="297"/>
|
||||||
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="318"/>
|
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="318"/>
|
||||||
<source>(%1)</source>
|
<source>(%1)</source>
|
||||||
<translation type="unfinished"/>
|
<translation>(%1)</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -1535,7 +1535,7 @@ Det är inte lämpligt använda den.</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagateupload.cpp" line="156"/>
|
<location filename="../src/libsync/propagateupload.cpp" line="156"/>
|
||||||
<source>File Removed</source>
|
<source>File Removed</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Filen Raderad</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagateupload.cpp" line="171"/>
|
<location filename="../src/libsync/propagateupload.cpp" line="171"/>
|
||||||
@@ -1792,12 +1792,12 @@ Det är inte lämpligt använda den.</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.ui" line="127"/>
|
<location filename="../src/gui/sharedialog.ui" line="127"/>
|
||||||
<source>Set password</source>
|
<source>Set password</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Ange lösenord</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.ui" line="149"/>
|
<location filename="../src/gui/sharedialog.ui" line="149"/>
|
||||||
<source>Set expiry date</source>
|
<source>Set expiry date</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Sätt utgångsdatum</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="67"/>
|
<location filename="../src/gui/sharedialog.cpp" line="67"/>
|
||||||
@@ -1813,7 +1813,7 @@ Det är inte lämpligt använda den.</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="141"/>
|
<location filename="../src/gui/sharedialog.cpp" line="141"/>
|
||||||
<source>Password Protected</source>
|
<source>Password Protected</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Lösenordsskyddad</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="299"/>
|
<location filename="../src/gui/sharedialog.cpp" line="299"/>
|
||||||
@@ -1858,7 +1858,7 @@ Det är inte lämpligt använda den.</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="453"/>
|
<location filename="../src/gui/sharedialog.cpp" line="453"/>
|
||||||
<source>The file can not be synced.</source>
|
<source>The file can not be synced.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Filen kan inte synkas.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="463"/>
|
<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"/>
|
<location filename="../src/gui/socketapi.cpp" line="431"/>
|
||||||
<source>Share with %1</source>
|
<source>Share with %1</source>
|
||||||
<comment>parameter is ownCloud</comment>
|
<comment>parameter is ownCloud</comment>
|
||||||
<translation type="unfinished"/>
|
<translation>Dela med %1</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
|
|||||||
@@ -4,22 +4,22 @@
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
|
<location filename="../src/gui/folderwizardsourcepage.ui" line="14"/>
|
||||||
<source>Form</source>
|
<source>Form</source>
|
||||||
<translation>格式</translation>
|
<translation>表單</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizardsourcepage.ui" line="33"/>
|
<location filename="../src/gui/folderwizardsourcepage.ui" line="33"/>
|
||||||
<source>Pick a local folder on your computer to sync</source>
|
<source>Pick a local folder on your computer to sync</source>
|
||||||
<translation type="unfinished"/>
|
<translation>在你的電腦中選擇一個本地資料夾用來同步</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizardsourcepage.ui" line="44"/>
|
<location filename="../src/gui/folderwizardsourcepage.ui" line="44"/>
|
||||||
<source>&Choose...</source>
|
<source>&Choose...</source>
|
||||||
<translation>選擇(&C)...</translation>
|
<translation>選擇 (&C)...</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizardsourcepage.ui" line="55"/>
|
<location filename="../src/gui/folderwizardsourcepage.ui" line="55"/>
|
||||||
<source>&Directory alias name:</source>
|
<source>&Directory alias name:</source>
|
||||||
<translation>目錄別名(&D): </translation>
|
<translation>目錄別名 (&D): </translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -27,17 +27,17 @@
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizardtargetpage.ui" line="14"/>
|
<location filename="../src/gui/folderwizardtargetpage.ui" line="14"/>
|
||||||
<source>Form</source>
|
<source>Form</source>
|
||||||
<translation>表格</translation>
|
<translation>表單</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizardtargetpage.ui" line="128"/>
|
<location filename="../src/gui/folderwizardtargetpage.ui" line="128"/>
|
||||||
<source>Select a remote destination folder</source>
|
<source>Select a remote destination folder</source>
|
||||||
<translation type="unfinished"/>
|
<translation>選擇一個遠端的目標資料夾</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizardtargetpage.ui" line="140"/>
|
<location filename="../src/gui/folderwizardtargetpage.ui" line="140"/>
|
||||||
<source>Create Folder</source>
|
<source>Create Folder</source>
|
||||||
<translation type="unfinished"/>
|
<translation>建立資料夾</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizardtargetpage.ui" line="160"/>
|
<location filename="../src/gui/folderwizardtargetpage.ui" line="160"/>
|
||||||
@@ -60,17 +60,17 @@
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/accountsettings.ui" line="14"/>
|
<location filename="../src/gui/accountsettings.ui" line="14"/>
|
||||||
<source>Form</source>
|
<source>Form</source>
|
||||||
<translation>格式</translation>
|
<translation>表單</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/accountsettings.ui" line="20"/>
|
<location filename="../src/gui/accountsettings.ui" line="20"/>
|
||||||
<source>Account to Synchronize</source>
|
<source>Account to Synchronize</source>
|
||||||
<translation type="unfinished"/>
|
<translation>同步的帳號</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/accountsettings.ui" line="41"/>
|
<location filename="../src/gui/accountsettings.ui" line="41"/>
|
||||||
<source>Connected with <server> as <user></source>
|
<source>Connected with <server> as <user></source>
|
||||||
<translation>以<user>的身分連接<server></translation>
|
<translation>以 <user> 的身分連接 <server></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/accountsettings.ui" line="55"/>
|
<location filename="../src/gui/accountsettings.ui" line="55"/>
|
||||||
@@ -91,17 +91,17 @@
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/accountsettings.ui" line="76"/>
|
<location filename="../src/gui/accountsettings.ui" line="76"/>
|
||||||
<source>Choose What to Sync</source>
|
<source>Choose What to Sync</source>
|
||||||
<translation type="unfinished"/>
|
<translation>選擇要同步的項目</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/accountsettings.ui" line="101"/>
|
<location filename="../src/gui/accountsettings.ui" line="101"/>
|
||||||
<source>Storage Usage</source>
|
<source>Storage Usage</source>
|
||||||
<translation>空間用途</translation>
|
<translation>儲存空間使用狀況</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/accountsettings.ui" line="123"/>
|
<location filename="../src/gui/accountsettings.ui" line="123"/>
|
||||||
<source>Retrieving usage information...</source>
|
<source>Retrieving usage information...</source>
|
||||||
<translation>取得用途資訊...</translation>
|
<translation>取得使用狀況資訊...</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/accountsettings.ui" line="130"/>
|
<location filename="../src/gui/accountsettings.ui" line="130"/>
|
||||||
@@ -126,7 +126,7 @@
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/accountsettings.cpp" line="111"/>
|
<location filename="../src/gui/accountsettings.cpp" line="111"/>
|
||||||
<source>No account configured.</source>
|
<source>No account configured.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>沒有設置帳號。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/accountsettings.cpp" line="169"/>
|
<location filename="../src/gui/accountsettings.cpp" line="169"/>
|
||||||
@@ -136,7 +136,7 @@
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/accountsettings.cpp" line="338"/>
|
<location filename="../src/gui/accountsettings.cpp" line="338"/>
|
||||||
<source>Confirm Folder Remove</source>
|
<source>Confirm Folder Remove</source>
|
||||||
<translation>確認移除資料夾</translation>
|
<translation>資料夾移除確認</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/accountsettings.cpp" line="339"/>
|
<location filename="../src/gui/accountsettings.cpp" line="339"/>
|
||||||
@@ -156,7 +156,7 @@
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/accountsettings.cpp" line="486"/>
|
<location filename="../src/gui/accountsettings.cpp" line="486"/>
|
||||||
<source>Sync Running</source>
|
<source>Sync Running</source>
|
||||||
<translation>同步中</translation>
|
<translation>正在同步中</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/accountsettings.cpp" line="487"/>
|
<location filename="../src/gui/accountsettings.cpp" line="487"/>
|
||||||
@@ -166,7 +166,7 @@
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/accountsettings.cpp" line="610"/>
|
<location filename="../src/gui/accountsettings.cpp" line="610"/>
|
||||||
<source>Discovering '%1'</source>
|
<source>Discovering '%1'</source>
|
||||||
<translation type="unfinished"/>
|
<translation>正在檢索 '%1'</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/accountsettings.cpp" line="650"/>
|
<location filename="../src/gui/accountsettings.cpp" line="650"/>
|
||||||
@@ -200,7 +200,7 @@ Total time left %5</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/accountsettings.cpp" line="769"/>
|
<location filename="../src/gui/accountsettings.cpp" line="769"/>
|
||||||
<source>%1 (%3%) of %2 server space in use.</source>
|
<source>%1 (%3%) of %2 server space in use.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>已使用 %2 中的 %1 (%3%) 伺服器空間。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/accountsettings.cpp" line="773"/>
|
<location filename="../src/gui/accountsettings.cpp" line="773"/>
|
||||||
@@ -225,7 +225,7 @@ Total time left %5</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/accountsettings.cpp" line="820"/>
|
<location filename="../src/gui/accountsettings.cpp" line="820"/>
|
||||||
<source>No %1 connection configured.</source>
|
<source>No %1 connection configured.</source>
|
||||||
<translation>無%1連線設定</translation>
|
<translation>沒有 %1 連線設置。</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -233,7 +233,7 @@ Total time left %5</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/addcertificatedialog.ui" line="17"/>
|
<location filename="../src/gui/addcertificatedialog.ui" line="17"/>
|
||||||
<source>SSL client certificate authentication</source>
|
<source>SSL client certificate authentication</source>
|
||||||
<translation type="unfinished"/>
|
<translation>SSL 客戶端憑證驗證</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/addcertificatedialog.ui" line="23"/>
|
<location filename="../src/gui/addcertificatedialog.ui" line="23"/>
|
||||||
@@ -243,27 +243,27 @@ Total time left %5</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/addcertificatedialog.ui" line="35"/>
|
<location filename="../src/gui/addcertificatedialog.ui" line="35"/>
|
||||||
<source>Certificate :</source>
|
<source>Certificate :</source>
|
||||||
<translation type="unfinished"/>
|
<translation>憑證:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/addcertificatedialog.ui" line="51"/>
|
<location filename="../src/gui/addcertificatedialog.ui" line="51"/>
|
||||||
<source>Browse...</source>
|
<source>Browse...</source>
|
||||||
<translation type="unfinished"/>
|
<translation>瀏覽...</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/addcertificatedialog.ui" line="60"/>
|
<location filename="../src/gui/addcertificatedialog.ui" line="60"/>
|
||||||
<source>Certificate password :</source>
|
<source>Certificate password :</source>
|
||||||
<translation type="unfinished"/>
|
<translation>憑證密碼:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/addcertificatedialog.cpp" line="23"/>
|
<location filename="../src/gui/addcertificatedialog.cpp" line="23"/>
|
||||||
<source>Select a certificate</source>
|
<source>Select a certificate</source>
|
||||||
<translation type="unfinished"/>
|
<translation>選擇一個憑證</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/addcertificatedialog.cpp" line="23"/>
|
<location filename="../src/gui/addcertificatedialog.cpp" line="23"/>
|
||||||
<source>Certificate files (*.p12 *.pfx)</source>
|
<source>Certificate files (*.p12 *.pfx)</source>
|
||||||
<translation type="unfinished"/>
|
<translation>憑證檔案 (*.p12 *.pfx)</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -271,7 +271,7 @@ Total time left %5</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/authenticationdialog.cpp" line="29"/>
|
<location filename="../src/libsync/authenticationdialog.cpp" line="29"/>
|
||||||
<source>Authentication Required</source>
|
<source>Authentication Required</source>
|
||||||
<translation type="unfinished"/>
|
<translation>必須驗證</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/authenticationdialog.cpp" line="31"/>
|
<location filename="../src/libsync/authenticationdialog.cpp" line="31"/>
|
||||||
@@ -281,12 +281,12 @@ Total time left %5</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/authenticationdialog.cpp" line="35"/>
|
<location filename="../src/libsync/authenticationdialog.cpp" line="35"/>
|
||||||
<source>&User:</source>
|
<source>&User:</source>
|
||||||
<translation type="unfinished"/>
|
<translation>使用者 (&U):</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/authenticationdialog.cpp" line="36"/>
|
<location filename="../src/libsync/authenticationdialog.cpp" line="36"/>
|
||||||
<source>&Password:</source>
|
<source>&Password:</source>
|
||||||
<translation>&密碼:</translation>
|
<translation>密碼 (&P):</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -294,12 +294,12 @@ Total time left %5</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/connectionvalidator.cpp" line="63"/>
|
<location filename="../src/libsync/connectionvalidator.cpp" line="63"/>
|
||||||
<source>No ownCloud account configured</source>
|
<source>No ownCloud account configured</source>
|
||||||
<translation type="unfinished"/>
|
<translation>沒有設置 ownCloud 帳號</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/connectionvalidator.cpp" line="86"/>
|
<location filename="../src/libsync/connectionvalidator.cpp" line="86"/>
|
||||||
<source>The configured server for this client is too old</source>
|
<source>The configured server for this client is too old</source>
|
||||||
<translation type="unfinished"/>
|
<translation>設置的伺服器對這個客戶端來說太舊了</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/connectionvalidator.cpp" line="87"/>
|
<location filename="../src/libsync/connectionvalidator.cpp" line="87"/>
|
||||||
@@ -315,7 +315,7 @@ Total time left %5</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/connectionvalidator.cpp" line="114"/>
|
<location filename="../src/libsync/connectionvalidator.cpp" line="114"/>
|
||||||
<source>timeout</source>
|
<source>timeout</source>
|
||||||
<translation type="unfinished"/>
|
<translation>逾時</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/connectionvalidator.cpp" line="147"/>
|
<location filename="../src/libsync/connectionvalidator.cpp" line="147"/>
|
||||||
@@ -328,7 +328,7 @@ Total time left %5</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagateremotedelete.cpp" line="41"/>
|
<location filename="../src/libsync/propagateremotedelete.cpp" line="41"/>
|
||||||
<source>Connection timed out</source>
|
<source>Connection timed out</source>
|
||||||
<translation type="unfinished"/>
|
<translation>連線逾時</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -368,30 +368,30 @@ Total time left %5</source>
|
|||||||
<location filename="../src/gui/folder.cpp" line="461"/>
|
<location filename="../src/gui/folder.cpp" line="461"/>
|
||||||
<source>%1 has been removed.</source>
|
<source>%1 has been removed.</source>
|
||||||
<comment>%1 names a file.</comment>
|
<comment>%1 names a file.</comment>
|
||||||
<translation type="unfinished"/>
|
<translation>%1 已被移除。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folder.cpp" line="466"/>
|
<location filename="../src/gui/folder.cpp" line="466"/>
|
||||||
<source>%1 and %2 other files have been downloaded.</source>
|
<source>%1 and %2 other files have been downloaded.</source>
|
||||||
<comment>%1 names a file.</comment>
|
<comment>%1 names a file.</comment>
|
||||||
<translation type="unfinished"/>
|
<translation>%1 和 %2 其他的檔案已被下載。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folder.cpp" line="468"/>
|
<location filename="../src/gui/folder.cpp" line="468"/>
|
||||||
<source>%1 has been downloaded.</source>
|
<source>%1 has been downloaded.</source>
|
||||||
<comment>%1 names a file.</comment>
|
<comment>%1 names a file.</comment>
|
||||||
<translation type="unfinished"/>
|
<translation>%1 已被下載。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folder.cpp" line="473"/>
|
<location filename="../src/gui/folder.cpp" line="473"/>
|
||||||
<source>%1 and %2 other files have been updated.</source>
|
<source>%1 and %2 other files have been updated.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>%1 和 %2 其他的檔案已被更新。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folder.cpp" line="475"/>
|
<location filename="../src/gui/folder.cpp" line="475"/>
|
||||||
<source>%1 has been updated.</source>
|
<source>%1 has been updated.</source>
|
||||||
<comment>%1 names a file.</comment>
|
<comment>%1 names a file.</comment>
|
||||||
<translation type="unfinished"/>
|
<translation>%1 已被更新。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folder.cpp" line="480"/>
|
<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"/>
|
<location filename="../src/gui/folder.cpp" line="482"/>
|
||||||
<source>%1 has been renamed to %2.</source>
|
<source>%1 has been renamed to %2.</source>
|
||||||
<comment>%1 and %2 name files.</comment>
|
<comment>%1 and %2 name files.</comment>
|
||||||
<translation type="unfinished"/>
|
<translation>%1 已被重新命名為 %2。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folder.cpp" line="487"/>
|
<location filename="../src/gui/folder.cpp" line="487"/>
|
||||||
@@ -412,7 +412,7 @@ Total time left %5</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folder.cpp" line="489"/>
|
<location filename="../src/gui/folder.cpp" line="489"/>
|
||||||
<source>%1 has been moved to %2.</source>
|
<source>%1 has been moved to %2.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>%1 已被搬移至 %2。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folder.cpp" line="494"/>
|
<location filename="../src/gui/folder.cpp" line="494"/>
|
||||||
@@ -428,12 +428,12 @@ Total time left %5</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folder.cpp" line="504"/>
|
<location filename="../src/gui/folder.cpp" line="504"/>
|
||||||
<source>Sync Activity</source>
|
<source>Sync Activity</source>
|
||||||
<translation>同步啟用</translation>
|
<translation>同步活動</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folder.cpp" line="782"/>
|
<location filename="../src/gui/folder.cpp" line="782"/>
|
||||||
<source>Could not read system exclude file</source>
|
<source>Could not read system exclude file</source>
|
||||||
<translation type="unfinished"/>
|
<translation>無法讀取系統的排除檔案</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folder.cpp" line="1002"/>
|
<location filename="../src/gui/folder.cpp" line="1002"/>
|
||||||
@@ -609,7 +609,7 @@ Are you sure you want to perform this operation?</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizard.cpp" line="178"/>
|
<location filename="../src/gui/folderwizard.cpp" line="178"/>
|
||||||
<source>The alias <i>%1</i> is already in use. Please pick another alias.</source>
|
<source>The alias <i>%1</i> is already in use. Please pick another alias.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>別名 <i>%1</i> 已被使用。 請選擇另一個別名。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizard.cpp" line="211"/>
|
<location filename="../src/gui/folderwizard.cpp" line="211"/>
|
||||||
@@ -622,7 +622,7 @@ Are you sure you want to perform this operation?</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizard.cpp" line="258"/>
|
<location filename="../src/gui/folderwizard.cpp" line="258"/>
|
||||||
<source>Create Remote Folder</source>
|
<source>Create Remote Folder</source>
|
||||||
<translation type="unfinished"/>
|
<translation>建立遠端資料夾</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizard.cpp" line="259"/>
|
<location filename="../src/gui/folderwizard.cpp" line="259"/>
|
||||||
@@ -647,7 +647,7 @@ Are you sure you want to perform this operation?</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizard.cpp" line="400"/>
|
<location filename="../src/gui/folderwizard.cpp" line="400"/>
|
||||||
<source>This folder is already being synced.</source>
|
<source>This folder is already being synced.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>這個資料夾已經被同步了。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizard.cpp" line="402"/>
|
<location filename="../src/gui/folderwizard.cpp" line="402"/>
|
||||||
@@ -692,12 +692,12 @@ Are you sure you want to perform this operation?</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagatedownload.cpp" line="156"/>
|
<location filename="../src/libsync/propagatedownload.cpp" line="156"/>
|
||||||
<source>Server returned wrong content-range</source>
|
<source>Server returned wrong content-range</source>
|
||||||
<translation type="unfinished"/>
|
<translation>伺服器回應錯誤的內容長度</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagatedownload.cpp" line="257"/>
|
<location filename="../src/libsync/propagatedownload.cpp" line="257"/>
|
||||||
<source>Connection Timeout</source>
|
<source>Connection Timeout</source>
|
||||||
<translation type="unfinished"/>
|
<translation>連線逾時</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -705,12 +705,12 @@ Are you sure you want to perform this operation?</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/generalsettings.ui" line="14"/>
|
<location filename="../src/gui/generalsettings.ui" line="14"/>
|
||||||
<source>Form</source>
|
<source>Form</source>
|
||||||
<translation>格式</translation>
|
<translation>表單</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/generalsettings.ui" line="20"/>
|
<location filename="../src/gui/generalsettings.ui" line="20"/>
|
||||||
<source>General Settings</source>
|
<source>General Settings</source>
|
||||||
<translation type="unfinished"/>
|
<translation>一般設定</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/generalsettings.ui" line="26"/>
|
<location filename="../src/gui/generalsettings.ui" line="26"/>
|
||||||
@@ -730,7 +730,7 @@ Are you sure you want to perform this operation?</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/generalsettings.ui" line="47"/>
|
<location filename="../src/gui/generalsettings.ui" line="47"/>
|
||||||
<source>Show crash reporter</source>
|
<source>Show crash reporter</source>
|
||||||
<translation type="unfinished"/>
|
<translation>顯示意外回報器</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/generalsettings.ui" line="57"/>
|
<location filename="../src/gui/generalsettings.ui" line="57"/>
|
||||||
@@ -746,7 +746,7 @@ Are you sure you want to perform this operation?</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/generalsettings.ui" line="98"/>
|
<location filename="../src/gui/generalsettings.ui" line="98"/>
|
||||||
<source>&Restart && Update</source>
|
<source>&Restart && Update</source>
|
||||||
<translation>重新啟動並更新</translation>
|
<translation>重新啟動並更新 (&R)</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -767,7 +767,7 @@ Are you sure you want to perform this operation?</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/ignorelisteditor.ui" line="14"/>
|
<location filename="../src/gui/ignorelisteditor.ui" line="14"/>
|
||||||
<source>Ignored Files Editor</source>
|
<source>Ignored Files Editor</source>
|
||||||
<translation type="unfinished"/>
|
<translation>忽略的檔案編輯器</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/ignorelisteditor.ui" line="53"/>
|
<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>
|
<message>
|
||||||
<location filename="../src/gui/ignorelisteditor.cpp" line="105"/>
|
<location filename="../src/gui/ignorelisteditor.cpp" line="105"/>
|
||||||
<source>Add Ignore Pattern</source>
|
<source>Add Ignore Pattern</source>
|
||||||
<translation type="unfinished"/>
|
<translation>增加忽略格式</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/ignorelisteditor.cpp" line="106"/>
|
<location filename="../src/gui/ignorelisteditor.cpp" line="106"/>
|
||||||
<source>Add a new ignore pattern:</source>
|
<source>Add a new ignore pattern:</source>
|
||||||
<translation type="unfinished"/>
|
<translation>增加一個新的忽略格式:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/ignorelisteditor.cpp" line="128"/>
|
<location filename="../src/gui/ignorelisteditor.cpp" line="128"/>
|
||||||
<source>Edit Ignore Pattern</source>
|
<source>Edit Ignore Pattern</source>
|
||||||
<translation type="unfinished"/>
|
<translation>編輯忽略格式</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/ignorelisteditor.cpp" line="129"/>
|
<location filename="../src/gui/ignorelisteditor.cpp" line="129"/>
|
||||||
<source>Edit ignore pattern:</source>
|
<source>Edit ignore pattern:</source>
|
||||||
<translation type="unfinished"/>
|
<translation>編輯忽略格式:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/ignorelisteditor.cpp" line="140"/>
|
<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>
|
<message>
|
||||||
<location filename="../src/gui/logbrowser.cpp" line="71"/>
|
<location filename="../src/gui/logbrowser.cpp" line="71"/>
|
||||||
<source>&Search: </source>
|
<source>&Search: </source>
|
||||||
<translation>&搜尋:</translation>
|
<translation>搜尋 (&S):</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/logbrowser.cpp" line="79"/>
|
<location filename="../src/gui/logbrowser.cpp" line="79"/>
|
||||||
<source>&Find</source>
|
<source>&Find</source>
|
||||||
<translation>&尋找:</translation>
|
<translation>尋找 (&F):</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/logbrowser.cpp" line="97"/>
|
<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>
|
<message>
|
||||||
<location filename="../src/gui/logbrowser.cpp" line="104"/>
|
<location filename="../src/gui/logbrowser.cpp" line="104"/>
|
||||||
<source>S&ave</source>
|
<source>S&ave</source>
|
||||||
<translation>儲存</translation>
|
<translation>儲存 (&A)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/logbrowser.cpp" line="105"/>
|
<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>
|
<message>
|
||||||
<location filename="../src/libsync/propagateremotemove.cpp" line="45"/>
|
<location filename="../src/libsync/propagateremotemove.cpp" line="45"/>
|
||||||
<source>Connection timed out</source>
|
<source>Connection timed out</source>
|
||||||
<translation type="unfinished"/>
|
<translation>連線逾時</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -929,7 +929,7 @@ Checked items will also be deleted if they prevent a directory from being remove
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/networksettings.ui" line="14"/>
|
<location filename="../src/gui/networksettings.ui" line="14"/>
|
||||||
<source>Form</source>
|
<source>Form</source>
|
||||||
<translation>格式</translation>
|
<translation>表單</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/networksettings.ui" line="23"/>
|
<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>
|
<message>
|
||||||
<location filename="../src/gui/updater/ocupdater.cpp" line="55"/>
|
<location filename="../src/gui/updater/ocupdater.cpp" line="55"/>
|
||||||
<source>New Update Ready</source>
|
<source>New Update Ready</source>
|
||||||
<translation type="unfinished"/>
|
<translation>新的更新已就緒</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/updater/ocupdater.cpp" line="56"/>
|
<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="297"/>
|
||||||
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="318"/>
|
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="318"/>
|
||||||
<source>(%1)</source>
|
<source>(%1)</source>
|
||||||
<translation type="unfinished"/>
|
<translation>(%1)</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -1172,7 +1172,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="163"/>
|
<location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="163"/>
|
||||||
<source>&Next ></source>
|
<source>&Next ></source>
|
||||||
<translation type="unfinished"/>
|
<translation>下一步 (&N) ></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="295"/>
|
<location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="295"/>
|
||||||
@@ -1195,7 +1195,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudsetupwizard.cpp" line="193"/>
|
<location filename="../src/gui/owncloudsetupwizard.cpp" line="193"/>
|
||||||
<source>Timeout while trying to connect to %1 at %2.</source>
|
<source>Timeout while trying to connect to %1 at %2.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>從 %2 嘗試連線到 %1 逾時。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudsetupwizard.cpp" line="204"/>
|
<location filename="../src/gui/owncloudsetupwizard.cpp" line="204"/>
|
||||||
@@ -1346,7 +1346,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagateupload.cpp" line="76"/>
|
<location filename="../src/libsync/propagateupload.cpp" line="76"/>
|
||||||
<source>Connection Timeout</source>
|
<source>Connection Timeout</source>
|
||||||
<translation type="unfinished"/>
|
<translation>連線逾時</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -1362,7 +1362,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagator_legacy.cpp" line="435"/>
|
<location filename="../src/libsync/propagator_legacy.cpp" line="435"/>
|
||||||
<source>Sync was aborted by user.</source>
|
<source>Sync was aborted by user.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>使用者中斷同步</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagator_legacy.cpp" line="488"/>
|
<location filename="../src/libsync/propagator_legacy.cpp" line="488"/>
|
||||||
@@ -1377,7 +1377,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagator_legacy.cpp" line="516"/>
|
<location filename="../src/libsync/propagator_legacy.cpp" line="516"/>
|
||||||
<source>Server returned wrong content-range</source>
|
<source>Server returned wrong content-range</source>
|
||||||
<translation type="unfinished"/>
|
<translation>伺服器回應錯誤的內容長度</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagator_legacy.cpp" line="567"/>
|
<location filename="../src/libsync/propagator_legacy.cpp" line="567"/>
|
||||||
@@ -1395,7 +1395,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagatedownload.cpp" line="429"/>
|
<location filename="../src/libsync/propagatedownload.cpp" line="429"/>
|
||||||
<source>The file could not be downloaded completely.</source>
|
<source>The file could not be downloaded completely.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>檔案下載無法完成。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagatedownload.cpp" line="465"/>
|
<location filename="../src/libsync/propagatedownload.cpp" line="465"/>
|
||||||
@@ -1431,7 +1431,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagatorjobs.cpp" line="121"/>
|
<location filename="../src/libsync/propagatorjobs.cpp" line="121"/>
|
||||||
<source>could not create directory %1</source>
|
<source>could not create directory %1</source>
|
||||||
<translation type="unfinished"/>
|
<translation>無法建立目錄 %1</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -1444,7 +1444,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagatorjobs.cpp" line="68"/>
|
<location filename="../src/libsync/propagatorjobs.cpp" line="68"/>
|
||||||
<source>Could not remove directory '%1'; </source>
|
<source>Could not remove directory '%1'; </source>
|
||||||
<translation type="unfinished"/>
|
<translation>無法移除目錄 '%1':</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagatorjobs.cpp" line="83"/>
|
<location filename="../src/libsync/propagatorjobs.cpp" line="83"/>
|
||||||
@@ -1515,7 +1515,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagator_legacy.cpp" line="246"/>
|
<location filename="../src/libsync/propagator_legacy.cpp" line="246"/>
|
||||||
<source>Sync was aborted by user.</source>
|
<source>Sync was aborted by user.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>使用者中斷同步</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagator_legacy.cpp" line="252"/>
|
<location filename="../src/libsync/propagator_legacy.cpp" line="252"/>
|
||||||
@@ -1528,7 +1528,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagateupload.cpp" line="156"/>
|
<location filename="../src/libsync/propagateupload.cpp" line="156"/>
|
||||||
<source>File Removed</source>
|
<source>File Removed</source>
|
||||||
<translation type="unfinished"/>
|
<translation>檔案已移除</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagateupload.cpp" line="171"/>
|
<location filename="../src/libsync/propagateupload.cpp" line="171"/>
|
||||||
@@ -1562,12 +1562,12 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/protocolwidget.ui" line="14"/>
|
<location filename="../src/gui/protocolwidget.ui" line="14"/>
|
||||||
<source>Form</source>
|
<source>Form</source>
|
||||||
<translation>格式</translation>
|
<translation>表單</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/protocolwidget.ui" line="20"/>
|
<location filename="../src/gui/protocolwidget.ui" line="20"/>
|
||||||
<source>Sync Activity</source>
|
<source>Sync Activity</source>
|
||||||
<translation>同步啟用</translation>
|
<translation>同步活動</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/protocolwidget.ui" line="49"/>
|
<location filename="../src/gui/protocolwidget.ui" line="49"/>
|
||||||
@@ -1617,7 +1617,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/protocolwidget.cpp" line="73"/>
|
<location filename="../src/gui/protocolwidget.cpp" line="73"/>
|
||||||
<source>Copy the activity list to the clipboard.</source>
|
<source>Copy the activity list to the clipboard.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>複製活動列表到剪貼簿。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/protocolwidget.cpp" line="118"/>
|
<location filename="../src/gui/protocolwidget.cpp" line="118"/>
|
||||||
@@ -1672,7 +1672,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/selectivesyncdialog.cpp" line="325"/>
|
<location filename="../src/gui/selectivesyncdialog.cpp" line="325"/>
|
||||||
<source>Choose What to Sync</source>
|
<source>Choose What to Sync</source>
|
||||||
<translation type="unfinished"/>
|
<translation>選擇要同步的項目</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -1759,7 +1759,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.ui" line="26"/>
|
<location filename="../src/gui/sharedialog.ui" line="26"/>
|
||||||
<source>Share Info</source>
|
<source>Share Info</source>
|
||||||
<translation type="unfinished"/>
|
<translation>分享資訊</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.ui" line="34"/>
|
<location filename="../src/gui/sharedialog.ui" line="34"/>
|
||||||
@@ -1785,7 +1785,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.ui" line="127"/>
|
<location filename="../src/gui/sharedialog.ui" line="127"/>
|
||||||
<source>Set password</source>
|
<source>Set password</source>
|
||||||
<translation type="unfinished"/>
|
<translation>設定密碼</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.ui" line="149"/>
|
<location filename="../src/gui/sharedialog.ui" line="149"/>
|
||||||
@@ -1801,12 +1801,12 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="68"/>
|
<location filename="../src/gui/sharedialog.cpp" line="68"/>
|
||||||
<source>%1 Sharing</source>
|
<source>%1 Sharing</source>
|
||||||
<translation type="unfinished"/>
|
<translation>%1 分享</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="141"/>
|
<location filename="../src/gui/sharedialog.cpp" line="141"/>
|
||||||
<source>Password Protected</source>
|
<source>Password Protected</source>
|
||||||
<translation type="unfinished"/>
|
<translation>密碼保護</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="299"/>
|
<location filename="../src/gui/sharedialog.cpp" line="299"/>
|
||||||
@@ -1821,7 +1821,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="374"/>
|
<location filename="../src/gui/sharedialog.cpp" line="374"/>
|
||||||
<source>There is no sync folder configured.</source>
|
<source>There is no sync folder configured.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>尚未設置同步資料夾。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="386"/>
|
<location filename="../src/gui/sharedialog.cpp" line="386"/>
|
||||||
@@ -1841,7 +1841,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="420"/>
|
<location filename="../src/gui/sharedialog.cpp" line="420"/>
|
||||||
<source>Waiting to upload...</source>
|
<source>Waiting to upload...</source>
|
||||||
<translation type="unfinished"/>
|
<translation>上傳等候中...</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="422"/>
|
<location filename="../src/gui/sharedialog.cpp" line="422"/>
|
||||||
@@ -1864,12 +1864,12 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/creds/shibbolethcredentials.cpp" line="291"/>
|
<location filename="../src/libsync/creds/shibbolethcredentials.cpp" line="291"/>
|
||||||
<source>Login Error</source>
|
<source>Login Error</source>
|
||||||
<translation type="unfinished"/>
|
<translation>登入錯誤</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/creds/shibbolethcredentials.cpp" line="291"/>
|
<location filename="../src/libsync/creds/shibbolethcredentials.cpp" line="291"/>
|
||||||
<source>You must sign in as user %1</source>
|
<source>You must sign in as user %1</source>
|
||||||
<translation type="unfinished"/>
|
<translation>您必須以 %1 使用者登入</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -1909,7 +1909,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sslbutton.cpp" line="97"/>
|
<location filename="../src/gui/sslbutton.cpp" line="97"/>
|
||||||
<source><h3>Certificate Details</h3></source>
|
<source><h3>Certificate Details</h3></source>
|
||||||
<translation type="unfinished"/>
|
<translation><h3>憑證細節</h3></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sslbutton.cpp" line="100"/>
|
<location filename="../src/gui/sslbutton.cpp" line="100"/>
|
||||||
@@ -1949,17 +1949,17 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sslbutton.cpp" line="110"/>
|
<location filename="../src/gui/sslbutton.cpp" line="110"/>
|
||||||
<source><h3>Issuer</h3></source>
|
<source><h3>Issuer</h3></source>
|
||||||
<translation type="unfinished"/>
|
<translation><h3>簽發者</h3></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sslbutton.cpp" line="113"/>
|
<location filename="../src/gui/sslbutton.cpp" line="113"/>
|
||||||
<source>Issuer:</source>
|
<source>Issuer:</source>
|
||||||
<translation type="unfinished"/>
|
<translation>簽發者:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sslbutton.cpp" line="114"/>
|
<location filename="../src/gui/sslbutton.cpp" line="114"/>
|
||||||
<source>Issued on:</source>
|
<source>Issued on:</source>
|
||||||
<translation type="unfinished"/>
|
<translation>簽發於:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sslbutton.cpp" line="115"/>
|
<location filename="../src/gui/sslbutton.cpp" line="115"/>
|
||||||
@@ -1979,7 +1979,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sslbutton.cpp" line="124"/>
|
<location filename="../src/gui/sslbutton.cpp" line="124"/>
|
||||||
<source>SHA-256:</source>
|
<source>SHA-256:</source>
|
||||||
<translation type="unfinished"/>
|
<translation>SHA-256:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sslbutton.cpp" line="126"/>
|
<location filename="../src/gui/sslbutton.cpp" line="126"/>
|
||||||
@@ -1989,7 +1989,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sslbutton.cpp" line="130"/>
|
<location filename="../src/gui/sslbutton.cpp" line="130"/>
|
||||||
<source><p><b>Note:</b> This certificate was manually approved</p></source>
|
<source><p><b>Note:</b> This certificate was manually approved</p></source>
|
||||||
<translation type="unfinished"/>
|
<translation><p><b>注意:</b> 此憑證已被手動核准</p></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sslbutton.cpp" line="150"/>
|
<location filename="../src/gui/sslbutton.cpp" line="150"/>
|
||||||
@@ -2024,7 +2024,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sslerrordialog.ui" line="14"/>
|
<location filename="../src/gui/sslerrordialog.ui" line="14"/>
|
||||||
<source>Form</source>
|
<source>Form</source>
|
||||||
<translation>格式</translation>
|
<translation>表單</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sslerrordialog.ui" line="25"/>
|
<location filename="../src/gui/sslerrordialog.ui" line="25"/>
|
||||||
@@ -2045,7 +2045,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sslerrordialog.cpp" line="169"/>
|
<location filename="../src/gui/sslerrordialog.cpp" line="169"/>
|
||||||
<source>with Certificate %1</source>
|
<source>with Certificate %1</source>
|
||||||
<translation>使用認證%1</translation>
|
<translation>與憑證 %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sslerrordialog.cpp" line="177"/>
|
<location filename="../src/gui/sslerrordialog.cpp" line="177"/>
|
||||||
@@ -2095,7 +2095,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sslerrordialog.cpp" line="197"/>
|
<location filename="../src/gui/sslerrordialog.cpp" line="197"/>
|
||||||
<source>Issuer: %1</source>
|
<source>Issuer: %1</source>
|
||||||
<translation>發行者:%1</translation>
|
<translation>簽發者: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -2168,7 +2168,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/syncengine.cpp" line="132"/>
|
<location filename="../src/libsync/syncengine.cpp" line="132"/>
|
||||||
<source>A network connection timeout happened.</source>
|
<source>A network connection timeout happened.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>網路連線逾時。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/syncengine.cpp" line="135"/>
|
<location filename="../src/libsync/syncengine.cpp" line="135"/>
|
||||||
@@ -2203,7 +2203,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/syncengine.cpp" line="153"/>
|
<location filename="../src/libsync/syncengine.cpp" line="153"/>
|
||||||
<source>Aborted by the user</source>
|
<source>Aborted by the user</source>
|
||||||
<translation type="unfinished"/>
|
<translation>使用者中斷</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/syncengine.cpp" line="156"/>
|
<location filename="../src/libsync/syncengine.cpp" line="156"/>
|
||||||
@@ -2253,12 +2253,12 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/syncengine.cpp" line="567"/>
|
<location filename="../src/libsync/syncengine.cpp" line="567"/>
|
||||||
<source>Unable to initialize a sync journal.</source>
|
<source>Unable to initialize a sync journal.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>同步處理日誌無法初始化</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/syncengine.cpp" line="648"/>
|
<location filename="../src/libsync/syncengine.cpp" line="648"/>
|
||||||
<source>Cannot open the sync journal</source>
|
<source>Cannot open the sync journal</source>
|
||||||
<translation type="unfinished"/>
|
<translation>同步處理日誌無法開啟</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/syncengine.cpp" line="895"/>
|
<location filename="../src/libsync/syncengine.cpp" line="895"/>
|
||||||
@@ -2310,12 +2310,12 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/syncengine.cpp" line="1068"/>
|
<location filename="../src/libsync/syncengine.cpp" line="1068"/>
|
||||||
<source>the destination</source>
|
<source>the destination</source>
|
||||||
<translation type="unfinished"/>
|
<translation>目標</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/syncengine.cpp" line="1068"/>
|
<location filename="../src/libsync/syncengine.cpp" line="1068"/>
|
||||||
<source>the source</source>
|
<source>the source</source>
|
||||||
<translation type="unfinished"/>
|
<translation>來源</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -2354,7 +2354,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="226"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="226"/>
|
||||||
<source>Disconnected from server</source>
|
<source>Disconnected from server</source>
|
||||||
<translation type="unfinished"/>
|
<translation>已從伺服器斷線</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="259"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="259"/>
|
||||||
@@ -2364,12 +2364,12 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="264"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="264"/>
|
||||||
<source>No sync folders configured.</source>
|
<source>No sync folders configured.</source>
|
||||||
<translation>尚未指定同步資料夾</translation>
|
<translation>尚未設置同步資料夾。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="274"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="274"/>
|
||||||
<source>There are no sync folders configured.</source>
|
<source>There are no sync folders configured.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>尚未設置同步資料夾。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="295"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="295"/>
|
||||||
@@ -2379,7 +2379,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="299"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="299"/>
|
||||||
<source>Recent Changes</source>
|
<source>Recent Changes</source>
|
||||||
<translation type="unfinished"/>
|
<translation>最近的更動</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="316"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="316"/>
|
||||||
@@ -2404,7 +2404,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="414"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="414"/>
|
||||||
<source>Calculating quota...</source>
|
<source>Calculating quota...</source>
|
||||||
<translation type="unfinished"/>
|
<translation>限額計算中...</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="416"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="416"/>
|
||||||
@@ -2454,17 +2454,17 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="453"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="453"/>
|
||||||
<source>%1% of %2 in use</source>
|
<source>%1% of %2 in use</source>
|
||||||
<translation type="unfinished"/>
|
<translation>已使用 %2 中的 %1%</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="465"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="465"/>
|
||||||
<source>No items synced recently</source>
|
<source>No items synced recently</source>
|
||||||
<translation type="unfinished"/>
|
<translation>最近沒有項目被同步</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="477"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="477"/>
|
||||||
<source>Discovering '%1'</source>
|
<source>Discovering '%1'</source>
|
||||||
<translation type="unfinished"/>
|
<translation>正在檢索 '%1'</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="482"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="482"/>
|
||||||
@@ -2500,7 +2500,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
|
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="20"/>
|
||||||
<source>Form</source>
|
<source>Form</source>
|
||||||
<translation>格式</translation>
|
<translation>表單</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="32"/>
|
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="32"/>
|
||||||
@@ -2516,7 +2516,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="88"/>
|
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="88"/>
|
||||||
<source>Server</source>
|
<source>Server</source>
|
||||||
<translation type="unfinished"/>
|
<translation>伺服器</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="265"/>
|
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="265"/>
|
||||||
@@ -2526,7 +2526,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="131"/>
|
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="131"/>
|
||||||
<source>&Local Folder</source>
|
<source>&Local Folder</source>
|
||||||
<translation>本地資料夾(&L)</translation>
|
<translation>本地資料夾 (&L)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="174"/>
|
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="174"/>
|
||||||
@@ -2541,7 +2541,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="161"/>
|
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="161"/>
|
||||||
<source>&Keep local data</source>
|
<source>&Keep local data</source>
|
||||||
<translation>保留本地資料(&K)</translation>
|
<translation>保留本地資料 (&K)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="171"/>
|
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="171"/>
|
||||||
@@ -2551,7 +2551,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="224"/>
|
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="224"/>
|
||||||
<source>S&ync everything from server</source>
|
<source>S&ync everything from server</source>
|
||||||
<translation type="unfinished"/>
|
<translation>從伺服器同步任何東西 (&Y)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="306"/>
|
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="306"/>
|
||||||
@@ -2564,7 +2564,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="14"/>
|
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="14"/>
|
||||||
<source>Connection failed</source>
|
<source>Connection failed</source>
|
||||||
<translation type="unfinished"/>
|
<translation>連線失敗</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="43"/>
|
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="43"/>
|
||||||
@@ -2584,7 +2584,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="69"/>
|
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.ui" line="69"/>
|
||||||
<source>Configure client-side TLS certificate</source>
|
<source>Configure client-side TLS certificate</source>
|
||||||
<translation type="unfinished"/>
|
<translation>設定客戶端 TLS 憑證</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.cpp" line="18"/>
|
<location filename="../src/gui/wizard/owncloudconnectionmethoddialog.cpp" line="18"/>
|
||||||
@@ -2597,17 +2597,17 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudhttpcredspage.ui" line="14"/>
|
<location filename="../src/gui/wizard/owncloudhttpcredspage.ui" line="14"/>
|
||||||
<source>Form</source>
|
<source>Form</source>
|
||||||
<translation>格式</translation>
|
<translation>表單</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudhttpcredspage.ui" line="38"/>
|
<location filename="../src/gui/wizard/owncloudhttpcredspage.ui" line="38"/>
|
||||||
<source>&Username</source>
|
<source>&Username</source>
|
||||||
<translation>使用者名稱</translation>
|
<translation>使用者名稱 (&U)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudhttpcredspage.ui" line="48"/>
|
<location filename="../src/gui/wizard/owncloudhttpcredspage.ui" line="48"/>
|
||||||
<source>&Password</source>
|
<source>&Password</source>
|
||||||
<translation>密碼</translation>
|
<translation>密碼 (&P)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudhttpcredspage.ui" line="58"/>
|
<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/owncloudsetuppage.ui" line="14"/>
|
||||||
<location filename="../src/gui/wizard/owncloudsetupnocredspage.ui" line="20"/>
|
<location filename="../src/gui/wizard/owncloudsetupnocredspage.ui" line="20"/>
|
||||||
<source>Form</source>
|
<source>Form</source>
|
||||||
<translation>格式</translation>
|
<translation>表單</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudsetuppage.ui" line="20"/>
|
<location filename="../src/gui/owncloudsetuppage.ui" line="20"/>
|
||||||
<source>Server &address:</source>
|
<source>Server &address:</source>
|
||||||
<translation>伺服器&位置:</translation>
|
<translation>伺服器位址 (&A):</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudsetuppage.ui" line="36"/>
|
<location filename="../src/gui/owncloudsetuppage.ui" line="36"/>
|
||||||
@@ -2646,7 +2646,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudsetuppage.ui" line="47"/>
|
<location filename="../src/gui/owncloudsetuppage.ui" line="47"/>
|
||||||
<source>Use &secure connection</source>
|
<source>Use &secure connection</source>
|
||||||
<translation>使用&安全連線</translation>
|
<translation>使用安全連線 (&S)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudsetuppage.ui" line="60"/>
|
<location filename="../src/gui/owncloudsetuppage.ui" line="60"/>
|
||||||
@@ -2656,7 +2656,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudsetuppage.ui" line="75"/>
|
<location filename="../src/gui/owncloudsetuppage.ui" line="75"/>
|
||||||
<source>&Username:</source>
|
<source>&Username:</source>
|
||||||
<translation>&使用者名稱</translation>
|
<translation>使用者名稱 (&U):</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudsetuppage.ui" line="85"/>
|
<location filename="../src/gui/owncloudsetuppage.ui" line="85"/>
|
||||||
@@ -2666,7 +2666,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudsetuppage.ui" line="92"/>
|
<location filename="../src/gui/owncloudsetuppage.ui" line="92"/>
|
||||||
<source>&Password:</source>
|
<source>&Password:</source>
|
||||||
<translation>&密碼:</translation>
|
<translation>密碼 (&P):</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudsetuppage.ui" line="102"/>
|
<location filename="../src/gui/owncloudsetuppage.ui" line="102"/>
|
||||||
@@ -2681,7 +2681,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudsetuppage.ui" line="120"/>
|
<location filename="../src/gui/owncloudsetuppage.ui" line="120"/>
|
||||||
<source>&Do not store password on local machine</source>
|
<source>&Do not store password on local machine</source>
|
||||||
<translation>&不儲存密碼在本地機器上</translation>
|
<translation>不儲存密碼在本地機器上 (&D)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudsetuppage.ui" line="140"/>
|
<location filename="../src/gui/owncloudsetuppage.ui" line="140"/>
|
||||||
@@ -2696,7 +2696,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudsetupnocredspage.ui" line="83"/>
|
<location filename="../src/gui/wizard/owncloudsetupnocredspage.ui" line="83"/>
|
||||||
<source>Server &Address</source>
|
<source>Server &Address</source>
|
||||||
<translation>伺服器位址</translation>
|
<translation>伺服器位址 (&A)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudsetupnocredspage.ui" line="99"/>
|
<location filename="../src/gui/wizard/owncloudsetupnocredspage.ui" line="99"/>
|
||||||
@@ -2714,7 +2714,7 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudwizardresultpage.ui" line="14"/>
|
<location filename="../src/gui/wizard/owncloudwizardresultpage.ui" line="14"/>
|
||||||
<source>Form</source>
|
<source>Form</source>
|
||||||
<translation>格式</translation>
|
<translation>表單</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudwizardresultpage.ui" line="20"/>
|
<location filename="../src/gui/wizard/owncloudwizardresultpage.ui" line="20"/>
|
||||||
@@ -2738,22 +2738,22 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/utility.cpp" line="113"/>
|
<location filename="../src/libsync/utility.cpp" line="113"/>
|
||||||
<source>%L1 TiB</source>
|
<source>%L1 TiB</source>
|
||||||
<translation type="unfinished"/>
|
<translation>%L1 TiB</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/utility.cpp" line="116"/>
|
<location filename="../src/libsync/utility.cpp" line="116"/>
|
||||||
<source>%L1 GiB</source>
|
<source>%L1 GiB</source>
|
||||||
<translation type="unfinished"/>
|
<translation>%L1 GiB</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/utility.cpp" line="119"/>
|
<location filename="../src/libsync/utility.cpp" line="119"/>
|
||||||
<source>%L1 MiB</source>
|
<source>%L1 MiB</source>
|
||||||
<translation type="unfinished"/>
|
<translation>%L1 MiB</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/utility.cpp" line="122"/>
|
<location filename="../src/libsync/utility.cpp" line="122"/>
|
||||||
<source>%L1 KiB</source>
|
<source>%L1 KiB</source>
|
||||||
<translation type="unfinished"/>
|
<translation>%L1 KiB</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/utility.cpp" line="125"/>
|
<location filename="../src/libsync/utility.cpp" line="125"/>
|
||||||
@@ -2807,12 +2807,12 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/progressdispatcher.cpp" line="42"/>
|
<location filename="../src/libsync/progressdispatcher.cpp" line="42"/>
|
||||||
<source>Ignored</source>
|
<source>Ignored</source>
|
||||||
<translation type="unfinished"/>
|
<translation>已忽略</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/progressdispatcher.cpp" line="44"/>
|
<location filename="../src/libsync/progressdispatcher.cpp" line="44"/>
|
||||||
<source>Filesystem access error</source>
|
<source>Filesystem access error</source>
|
||||||
<translation type="unfinished"/>
|
<translation>存取檔案系統錯誤</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/progressdispatcher.cpp" line="46"/>
|
<location filename="../src/libsync/progressdispatcher.cpp" line="46"/>
|
||||||
@@ -2838,17 +2838,17 @@ It is not advisable to use it.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/progressdispatcher.cpp" line="66"/>
|
<location filename="../src/libsync/progressdispatcher.cpp" line="66"/>
|
||||||
<source>deleting</source>
|
<source>deleting</source>
|
||||||
<translation type="unfinished"/>
|
<translation>刪除中</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/progressdispatcher.cpp" line="69"/>
|
<location filename="../src/libsync/progressdispatcher.cpp" line="69"/>
|
||||||
<source>moving</source>
|
<source>moving</source>
|
||||||
<translation type="unfinished"/>
|
<translation>搬移中</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/progressdispatcher.cpp" line="71"/>
|
<location filename="../src/libsync/progressdispatcher.cpp" line="71"/>
|
||||||
<source>ignoring</source>
|
<source>ignoring</source>
|
||||||
<translation type="unfinished"/>
|
<translation>忽略中</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/progressdispatcher.cpp" line="73"/>
|
<location filename="../src/libsync/progressdispatcher.cpp" line="73"/>
|
||||||
|
|||||||
@@ -32,27 +32,27 @@
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizardtargetpage.ui" line="107"/>
|
<location filename="../src/gui/folderwizardtargetpage.ui" line="110"/>
|
||||||
<source>TextLabel</source>
|
<source>TextLabel</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>Select a remote destination folder</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizardtargetpage.ui" line="140"/>
|
<location filename="../src/gui/folderwizardtargetpage.ui" line="143"/>
|
||||||
<source>Create Folder</source>
|
<source>Create Folder</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizardtargetpage.ui" line="160"/>
|
<location filename="../src/gui/folderwizardtargetpage.ui" line="163"/>
|
||||||
<source>Refresh</source>
|
<source>Refresh</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizardtargetpage.ui" line="174"/>
|
<location filename="../src/gui/folderwizardtargetpage.ui" line="177"/>
|
||||||
<source>Folders</source>
|
<source>Folders</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -309,18 +309,23 @@ Total time left %5</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/connectionvalidator.cpp" line="107"/>
|
<location filename="../src/libsync/connectionvalidator.cpp" line="108"/>
|
||||||
<location filename="../src/libsync/connectionvalidator.cpp" line="114"/>
|
<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>
|
<source>Unable to connect to %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/connectionvalidator.cpp" line="115"/>
|
<location filename="../src/libsync/connectionvalidator.cpp" line="119"/>
|
||||||
<source>timeout</source>
|
<source>timeout</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>The provided credentials are not correct</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -333,6 +338,14 @@ Total time left %5</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</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>
|
<context>
|
||||||
<name>OCC::Folder</name>
|
<name>OCC::Folder</name>
|
||||||
<message>
|
<message>
|
||||||
@@ -473,52 +486,52 @@ Are you sure you want to perform this operation?</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderman.cpp" line="1011"/>
|
<location filename="../src/gui/folderman.cpp" line="1012"/>
|
||||||
<source>Undefined State.</source>
|
<source>Undefined State.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderman.cpp" line="1014"/>
|
<location filename="../src/gui/folderman.cpp" line="1015"/>
|
||||||
<source>Waits to start syncing.</source>
|
<source>Waits to start syncing.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderman.cpp" line="1017"/>
|
<location filename="../src/gui/folderman.cpp" line="1018"/>
|
||||||
<source>Preparing for sync.</source>
|
<source>Preparing for sync.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderman.cpp" line="1020"/>
|
<location filename="../src/gui/folderman.cpp" line="1021"/>
|
||||||
<source>Sync is running.</source>
|
<source>Sync is running.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderman.cpp" line="1023"/>
|
<location filename="../src/gui/folderman.cpp" line="1024"/>
|
||||||
<source>Last Sync was successful.</source>
|
<source>Last Sync was successful.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>Last Sync was successful, but with warnings on individual files.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderman.cpp" line="1031"/>
|
<location filename="../src/gui/folderman.cpp" line="1032"/>
|
||||||
<source>Setup Error.</source>
|
<source>Setup Error.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderman.cpp" line="1034"/>
|
<location filename="../src/gui/folderman.cpp" line="1035"/>
|
||||||
<source>User Abort.</source>
|
<source>User Abort.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderman.cpp" line="1037"/>
|
<location filename="../src/gui/folderman.cpp" line="1038"/>
|
||||||
<source>Sync is paused.</source>
|
<source>Sync is paused.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderman.cpp" line="1043"/>
|
<location filename="../src/gui/folderman.cpp" line="1044"/>
|
||||||
<source>%1 (Sync is paused)</source>
|
<source>%1 (Sync is paused)</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -545,8 +558,8 @@ Are you sure you want to perform this operation?</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>OCC::FolderWizard</name>
|
<name>OCC::FolderWizard</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizard.cpp" line="504"/>
|
<location filename="../src/gui/folderwizard.cpp" line="587"/>
|
||||||
<location filename="../src/gui/folderwizard.cpp" line="506"/>
|
<location filename="../src/gui/folderwizard.cpp" line="589"/>
|
||||||
<source>Add Folder</source>
|
<source>Add Folder</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -554,67 +567,67 @@ Are you sure you want to perform this operation?</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>OCC::FolderWizardLocalPath</name>
|
<name>OCC::FolderWizardLocalPath</name>
|
||||||
<message>
|
<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>
|
<source>Click to select a local folder to sync.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>Enter the path to the local folder.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>The directory alias is a descriptive name for this sync connection.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>No valid local folder selected!</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>You have no permission to write to the selected folder!</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>The local path %1 is already an upload folder. Please pick another one!</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>An already configured folder is contained in the current entry.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<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>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>An already configured folder contains the currently entered folder.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<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>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>The alias can not be empty. Please provide a descriptive alias word.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizard.cpp" line="178"/>
|
<location filename="../src/gui/folderwizard.cpp" line="179"/>
|
||||||
<source>The alias <i>%1</i> is already in use. Please pick another alias.</source>
|
<source>The alias <i>%1</i> is already in use. Please pick another alias.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizard.cpp" line="211"/>
|
<location filename="../src/gui/folderwizard.cpp" line="212"/>
|
||||||
<source>Select the source folder</source>
|
<source>Select the source folder</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -622,42 +635,47 @@ Are you sure you want to perform this operation?</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>OCC::FolderWizardRemotePath</name>
|
<name>OCC::FolderWizardRemotePath</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizard.cpp" line="258"/>
|
<location filename="../src/gui/folderwizard.cpp" line="262"/>
|
||||||
<source>Create Remote Folder</source>
|
<source>Create Remote Folder</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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 '%1':</source>
|
<source>Enter the name of the new folder to be created below '%1':</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>Folder was successfully created on %1.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>Failed to create the folder on %1. Please check manually.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>Choose this to sync the entire account</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>This folder is already being synced.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizard.cpp" line="404"/>
|
<location filename="../src/gui/folderwizard.cpp" line="487"/>
|
||||||
<source>You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>.</source>
|
<source>You are already syncing <i>%1</i>, which is a parent folder of <i>%2</i>.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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 <b>not</b> supported. If you want to sync multiple folders, please remove the currently configured root folder sync.</source>
|
<source>You are already syncing all your files. Syncing another folder is <b>not</b> supported. If you want to sync multiple folders, please remove the currently configured root folder sync.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -665,7 +683,7 @@ Are you sure you want to perform this operation?</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>OCC::FolderWizardSelectiveSync</name>
|
<name>OCC::FolderWizardSelectiveSync</name>
|
||||||
<message>
|
<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>
|
<source>Choose What to Sync: You can optionally deselect remote subfolders you do not wish to synchronize.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -673,12 +691,12 @@ Are you sure you want to perform this operation?</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>OCC::FormatWarningsWizardPage</name>
|
<name>OCC::FormatWarningsWizardPage</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizard.cpp" line="45"/>
|
<location filename="../src/gui/folderwizard.cpp" line="46"/>
|
||||||
<source><b>Warning:</b> %1</source>
|
<source><b>Warning:</b> %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizard.cpp" line="47"/>
|
<location filename="../src/gui/folderwizard.cpp" line="48"/>
|
||||||
<source><b>Warning:</b></source>
|
<source><b>Warning:</b></source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -897,7 +915,7 @@ Checked items will also be deleted if they prevent a directory from being remove
|
|||||||
<context>
|
<context>
|
||||||
<name>OCC::MoveJob</name>
|
<name>OCC::MoveJob</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagateremotemove.cpp" line="47"/>
|
<location filename="../src/libsync/propagateremotemove.cpp" line="48"/>
|
||||||
<source>Connection timed out</source>
|
<source>Connection timed out</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -1363,7 +1381,7 @@ It is not advisable to use it.</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>OCC::PollJob</name>
|
<name>OCC::PollJob</name>
|
||||||
<message>
|
<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>
|
<source>Invalid JSON reply from the poll URL</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -1495,22 +1513,22 @@ It is not advisable to use it.</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>OCC::PropagateRemoteMove</name>
|
<name>OCC::PropagateRemoteMove</name>
|
||||||
<message>
|
<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>
|
<source>This folder must not be renamed. It is renamed back to its original name.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>This folder must not be renamed. Please name it back to Shared.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>The file was renamed but is part of a read only share. The original file was restored.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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 "%1 %2".</source>
|
<source>Wrong HTTP code returned by server. Expected 201, but received "%1 %2".</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -1537,12 +1555,12 @@ It is not advisable to use it.</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>OCC::PropagateUploadFileQNAM</name>
|
<name>OCC::PropagateUploadFileQNAM</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagateupload.cpp" line="169"/>
|
<location filename="../src/libsync/propagateupload.cpp" line="174"/>
|
||||||
<source>File Removed</source>
|
<source>File Removed</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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"/>
|
<location filename="../src/libsync/propagateupload.cpp" line="546"/>
|
||||||
<source>Local file changed during sync.</source>
|
<source>Local file changed during sync.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@@ -1631,12 +1649,12 @@ It is not advisable to use it.</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>Currently no files are ignored because of previous errors and no downloads are in progress.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message numerus="yes">
|
<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>%n files are ignored because of previous errors.
|
||||||
</source>
|
</source>
|
||||||
<translation type="unfinished">
|
<translation type="unfinished">
|
||||||
@@ -1645,7 +1663,7 @@ It is not advisable to use it.</source>
|
|||||||
</translation>
|
</translation>
|
||||||
</message>
|
</message>
|
||||||
<message numerus="yes">
|
<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>%n files are partially downloaded.
|
||||||
</source>
|
</source>
|
||||||
<translation type="unfinished">
|
<translation type="unfinished">
|
||||||
@@ -1654,7 +1672,7 @@ It is not advisable to use it.</source>
|
|||||||
</translation>
|
</translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>Try to sync these again.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -1719,22 +1737,22 @@ It is not advisable to use it.</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/settingsdialog.cpp" line="73"/>
|
<location filename="../src/gui/settingsdialog.cpp" line="76"/>
|
||||||
<source>Account</source>
|
<source>Account</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/settingsdialog.cpp" line="78"/>
|
<location filename="../src/gui/settingsdialog.cpp" line="81"/>
|
||||||
<source>Activity</source>
|
<source>Activity</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/settingsdialog.cpp" line="84"/>
|
<location filename="../src/gui/settingsdialog.cpp" line="87"/>
|
||||||
<source>General</source>
|
<source>General</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/settingsdialog.cpp" line="90"/>
|
<location filename="../src/gui/settingsdialog.cpp" line="93"/>
|
||||||
<source>Network</source>
|
<source>Network</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -1742,27 +1760,27 @@ It is not advisable to use it.</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>OCC::SettingsDialogMac</name>
|
<name>OCC::SettingsDialogMac</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/settingsdialogmac.cpp" line="63"/>
|
<location filename="../src/gui/settingsdialogmac.cpp" line="66"/>
|
||||||
<source>%1</source>
|
<source>%1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/settingsdialogmac.cpp" line="67"/>
|
<location filename="../src/gui/settingsdialogmac.cpp" line="70"/>
|
||||||
<source>Account</source>
|
<source>Account</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/settingsdialogmac.cpp" line="71"/>
|
<location filename="../src/gui/settingsdialogmac.cpp" line="74"/>
|
||||||
<source>Activity</source>
|
<source>Activity</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/settingsdialogmac.cpp" line="75"/>
|
<location filename="../src/gui/settingsdialogmac.cpp" line="78"/>
|
||||||
<source>General</source>
|
<source>General</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/settingsdialogmac.cpp" line="79"/>
|
<location filename="../src/gui/settingsdialogmac.cpp" line="82"/>
|
||||||
<source>Network</source>
|
<source>Network</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -1775,145 +1793,150 @@ It is not advisable to use it.</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.ui" line="26"/>
|
<location filename="../src/gui/sharedialog.ui" line="159"/>
|
||||||
<source>Share Info</source>
|
<source>Share Info</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.ui" line="34"/>
|
<location filename="../src/gui/sharedialog.ui" line="20"/>
|
||||||
<location filename="../src/gui/sharedialog.ui" line="194"/>
|
<location filename="../src/gui/sharedialog.ui" line="167"/>
|
||||||
<source>TextLabel</source>
|
<source>TextLabel</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.ui" line="53"/>
|
<location filename="../src/gui/sharedialog.ui" line="71"/>
|
||||||
<source>share label</source>
|
<source>Copy &Link</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.ui" line="75"/>
|
<location filename="../src/gui/sharedialog.ui" line="95"/>
|
||||||
<source>ownCloud Path:</source>
|
<location filename="../src/gui/sharedialog.cpp" line="104"/>
|
||||||
|
<source>Set p&assword</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.ui" line="116"/>
|
<location filename="../src/gui/sharedialog.ui" line="116"/>
|
||||||
<source>Set expiration date</source>
|
<source>Set &Password</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.ui" line="134"/>
|
<location filename="../src/gui/sharedialog.ui" line="127"/>
|
||||||
<source>Set Password</source>
|
<source>Set &expiration date</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>Share link</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.ui" line="105"/>
|
<location filename="../src/gui/sharedialog.cpp" line="102"/>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="99"/>
|
<location filename="../src/gui/sharedialog.cpp" line="618"/>
|
||||||
<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"/>
|
|
||||||
<source>%1 path: %2</source>
|
<source>%1 path: %2</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="98"/>
|
<location filename="../src/gui/sharedialog.cpp" line="103"/>
|
||||||
<source>%1 Sharing</source>
|
<source>%1 Sharing</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="175"/>
|
<location filename="../src/gui/sharedialog.cpp" line="180"/>
|
||||||
<source>Password Protected</source>
|
<source>Password Protected</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="364"/>
|
<location filename="../src/gui/sharedialog.cpp" line="438"/>
|
||||||
<source>Public sharing requires a password:</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="391"/>
|
|
||||||
<source>Choose a password for the public link</source>
|
<source>Choose a password for the public link</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="444"/>
|
<location filename="../src/gui/sharedialog.cpp" line="509"/>
|
||||||
<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"/>
|
|
||||||
<source>OCS API error code: %1</source>
|
<source>OCS API error code: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>There is no sync folder configured.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>Cannot find an folder to upload to.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>A sync file with the same name exists. The file cannot be registered to sync.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>The file cannot be synced.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>Sharing of external directories is not yet working.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="84"/>
|
<location filename="../src/gui/sharedialog.cpp" line="89"/>
|
||||||
<source>Share Directory</source>
|
<source>Share Directory</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="86"/>
|
<location filename="../src/gui/sharedialog.cpp" line="91"/>
|
||||||
<source>Share File</source>
|
<source>Share File</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharedialog.cpp" line="94"/>
|
<location filename="../src/gui/sharedialog.cpp" line="99"/>
|
||||||
<source>Local path: %1</source>
|
<source>Local path: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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&aring requires a password:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/gui/sharedialog.cpp" line="490"/>
|
||||||
|
<source>Check to &share by public link</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/gui/sharedialog.cpp" line="491"/>
|
||||||
|
<source>&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>
|
<source>Waiting to upload...</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>Unable to register in sync space.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>Sync of registered file was not successful yet.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -1952,7 +1975,7 @@ It is not advisable to use it.</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>OCC::SocketApi</name>
|
<name>OCC::SocketApi</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/socketapi.cpp" line="439"/>
|
<location filename="../src/gui/socketapi.cpp" line="453"/>
|
||||||
<source>Share with %1</source>
|
<source>Share with %1</source>
|
||||||
<comment>parameter is ownCloud</comment>
|
<comment>parameter is ownCloud</comment>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@@ -2325,59 +2348,59 @@ It is not advisable to use it.</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/syncengine.cpp" line="937"/>
|
<location filename="../src/libsync/syncengine.cpp" line="938"/>
|
||||||
<location filename="../src/libsync/syncengine.cpp" line="944"/>
|
<location filename="../src/libsync/syncengine.cpp" line="945"/>
|
||||||
<source>Ignored because of the "choose what to sync" blacklist</source>
|
<source>Ignored because of the "choose what to sync" blacklist</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/syncengine.cpp" line="962"/>
|
<location filename="../src/libsync/syncengine.cpp" line="963"/>
|
||||||
<source>Not allowed because you don't have permission to add sub-directories in that directory</source>
|
<source>Not allowed because you don't have permission to add sub-directories in that directory</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/syncengine.cpp" line="968"/>
|
<location filename="../src/libsync/syncengine.cpp" line="969"/>
|
||||||
<source>Not allowed because you don't have permission to add parent directory</source>
|
<source>Not allowed because you don't have permission to add parent directory</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/syncengine.cpp" line="975"/>
|
<location filename="../src/libsync/syncengine.cpp" line="976"/>
|
||||||
<source>Not allowed because you don't have permission to add files in that directory</source>
|
<source>Not allowed because you don't have permission to add files in that directory</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/syncengine.cpp" line="1012"/>
|
<location filename="../src/libsync/syncengine.cpp" line="1013"/>
|
||||||
<location filename="../src/libsync/syncengine.cpp" line="1032"/>
|
<location filename="../src/libsync/syncengine.cpp" line="1033"/>
|
||||||
<source>Not allowed to remove, restoring</source>
|
<source>Not allowed to remove, restoring</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>Local files and share folder removed.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>Move not allowed, item restored</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>Move not allowed because %1 is read-only</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/syncengine.cpp" line="1110"/>
|
<location filename="../src/libsync/syncengine.cpp" line="1111"/>
|
||||||
<source>the destination</source>
|
<source>the destination</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/syncengine.cpp" line="1110"/>
|
<location filename="../src/libsync/syncengine.cpp" line="1111"/>
|
||||||
<source>the source</source>
|
<source>the source</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -2829,12 +2852,12 @@ It is not advisable to use it.</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>main.cpp</name>
|
<name>main.cpp</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/main.cpp" line="45"/>
|
<location filename="../src/gui/main.cpp" line="38"/>
|
||||||
<source>System Tray not available</source>
|
<source>System Tray not available</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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 <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as 'trayer' and try again.</source>
|
<source>%1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as 'trayer' and try again.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -2850,74 +2873,79 @@ It is not advisable to use it.</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>progress</name>
|
<name>progress</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/progressdispatcher.cpp" line="32"/>
|
<location filename="../src/libsync/progressdispatcher.cpp" line="31"/>
|
||||||
<source>Downloaded</source>
|
<source>Downloaded</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/progressdispatcher.cpp" line="34"/>
|
<location filename="../src/libsync/progressdispatcher.cpp" line="33"/>
|
||||||
<source>Uploaded</source>
|
<source>Uploaded</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<source>Deleted</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/progressdispatcher.cpp" line="40"/>
|
<location filename="../src/libsync/progressdispatcher.cpp" line="41"/>
|
||||||
<source>Moved to %1</source>
|
<source>Moved to %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/progressdispatcher.cpp" line="42"/>
|
<location filename="../src/libsync/progressdispatcher.cpp" line="43"/>
|
||||||
<source>Ignored</source>
|
<source>Ignored</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/progressdispatcher.cpp" line="44"/>
|
<location filename="../src/libsync/progressdispatcher.cpp" line="45"/>
|
||||||
<source>Filesystem access error</source>
|
<source>Filesystem access error</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/progressdispatcher.cpp" line="46"/>
|
<location filename="../src/libsync/progressdispatcher.cpp" line="47"/>
|
||||||
<source>Error</source>
|
<source>Error</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/progressdispatcher.cpp" line="49"/>
|
<location filename="../src/libsync/progressdispatcher.cpp" line="50"/>
|
||||||
<location filename="../src/libsync/progressdispatcher.cpp" line="52"/>
|
<location filename="../src/libsync/progressdispatcher.cpp" line="53"/>
|
||||||
<source>Unknown</source>
|
<source>Unknown</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/progressdispatcher.cpp" line="62"/>
|
<location filename="../src/libsync/progressdispatcher.cpp" line="63"/>
|
||||||
<source>downloading</source>
|
<source>downloading</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/progressdispatcher.cpp" line="64"/>
|
<location filename="../src/libsync/progressdispatcher.cpp" line="65"/>
|
||||||
<source>uploading</source>
|
<source>uploading</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/progressdispatcher.cpp" line="66"/>
|
<location filename="../src/libsync/progressdispatcher.cpp" line="67"/>
|
||||||
<source>deleting</source>
|
<source>deleting</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/progressdispatcher.cpp" line="69"/>
|
<location filename="../src/libsync/progressdispatcher.cpp" line="70"/>
|
||||||
<source>moving</source>
|
<source>moving</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/progressdispatcher.cpp" line="71"/>
|
<location filename="../src/libsync/progressdispatcher.cpp" line="72"/>
|
||||||
<source>ignoring</source>
|
<source>ignoring</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/progressdispatcher.cpp" line="73"/>
|
<location filename="../src/libsync/progressdispatcher.cpp" line="74"/>
|
||||||
<location filename="../src/libsync/progressdispatcher.cpp" line="75"/>
|
<location filename="../src/libsync/progressdispatcher.cpp" line="76"/>
|
||||||
<source>error</source>
|
<source>error</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
|||||||
Reference in New Issue
Block a user