mirror of
https://github.com/chylex/Nextcloud-Desktop.git
synced 2026-04-04 12:11:33 +02:00
Compare commits
1628 Commits
v1.6.4
...
v1.8.0-bet
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
17570acab2 | ||
|
|
4710609cb9 | ||
|
|
d297580d26 | ||
|
|
b50f1d0318 | ||
|
|
957c9f060d | ||
|
|
0bf0bab1eb | ||
|
|
a7c97388a9 | ||
|
|
86c480ee09 | ||
|
|
0184a00151 | ||
|
|
b9161aa06c | ||
|
|
00e42d1177 | ||
|
|
d37dd040d0 | ||
|
|
a2aef04f21 | ||
|
|
8f75434558 | ||
|
|
3dd6bcc323 | ||
|
|
063271e978 | ||
|
|
438c4fe72e | ||
|
|
f4144d6d38 | ||
|
|
eada70ba44 | ||
|
|
bed34b1ddd | ||
|
|
3439ea395b | ||
|
|
ba3bab8f49 | ||
|
|
9ba88f6baf | ||
|
|
6be0b2b6c3 | ||
|
|
e4fce1250b | ||
|
|
926bc56b3a | ||
|
|
8523803d94 | ||
|
|
4f202e5f4c | ||
|
|
7e211ef3d9 | ||
|
|
dc85ee3f0a | ||
|
|
91ae912373 | ||
|
|
9aeda891c3 | ||
|
|
5cdf448693 | ||
|
|
89c69250ef | ||
|
|
5b6a6319c2 | ||
|
|
e79e2b80c8 | ||
|
|
f8b24ac34d | ||
|
|
4ff0d6635c | ||
|
|
51b9ec30a9 | ||
|
|
377887871c | ||
|
|
d45d3892cb | ||
|
|
0bf6a220ae | ||
|
|
04a4d7c2c9 | ||
|
|
209d93ac05 | ||
|
|
c44abf4918 | ||
|
|
d7f5e89a1d | ||
|
|
72ec7ccde2 | ||
|
|
13aaa46a55 | ||
|
|
3121546fb6 | ||
|
|
51337a10af | ||
|
|
5f3104786a | ||
|
|
faec7362fe | ||
|
|
adfb216325 | ||
|
|
e0656af1fc | ||
|
|
07fe077f7f | ||
|
|
d3103adbd8 | ||
|
|
d4132072d8 | ||
|
|
b8e9dd587d | ||
|
|
c48ab4830d | ||
|
|
eedb5d0dae | ||
|
|
07849537cf | ||
|
|
4849c31add | ||
|
|
9a4f4854de | ||
|
|
9ff48e6bb5 | ||
|
|
01bca39138 | ||
|
|
6e8527e66d | ||
|
|
0d2b7967bc | ||
|
|
70c8803a79 | ||
|
|
0d2fb0754c | ||
|
|
dbca7469f2 | ||
|
|
1e57432aae | ||
|
|
7c0d3b8485 | ||
|
|
46abd47bfe | ||
|
|
2a88f5083c | ||
|
|
5ec793e045 | ||
|
|
1554f41441 | ||
|
|
9e945eb471 | ||
|
|
b5212c4467 | ||
|
|
c4dd1cfb69 | ||
|
|
00774b95a1 | ||
|
|
7de559f351 | ||
|
|
eaa9c4fdf8 | ||
|
|
6050d5873c | ||
|
|
94e61c3205 | ||
|
|
c4cf13bd97 | ||
|
|
71e22ffe2c | ||
|
|
3169a6f170 | ||
|
|
e7b190404a | ||
|
|
446e2b27d7 | ||
|
|
856df4c5f6 | ||
|
|
34237f604e | ||
|
|
6d380c8548 | ||
|
|
af0001a149 | ||
|
|
2debd5a198 | ||
|
|
59bdda6226 | ||
|
|
21345b81f1 | ||
|
|
4f03234487 | ||
|
|
3dd8ce08b8 | ||
|
|
f233af04f6 | ||
|
|
3a1501dea4 | ||
|
|
11f1229c31 | ||
|
|
acb7e972ea | ||
|
|
667665b809 | ||
|
|
1ac523ec01 | ||
|
|
ca56e5d9ca | ||
|
|
43a51c1bef | ||
|
|
68ec24797b | ||
|
|
26132fd14e | ||
|
|
5fdf9bb7d2 | ||
|
|
ca68ccd76a | ||
|
|
1f9d7c41e8 | ||
|
|
52d330d8e5 | ||
|
|
17eb509c4e | ||
|
|
48254579a2 | ||
|
|
9d93642102 | ||
|
|
a3106b1771 | ||
|
|
d2670b8473 | ||
|
|
227b7ccabd | ||
|
|
6c3e19e531 | ||
|
|
ed49a708d0 | ||
|
|
e04300a01c | ||
|
|
65cebe7edd | ||
|
|
63cda04b56 | ||
|
|
acda7bddb8 | ||
|
|
6ffc04808d | ||
|
|
c932e26f83 | ||
|
|
682ce2e1e2 | ||
|
|
9873204be6 | ||
|
|
49021fd96d | ||
|
|
5dc2871e2b | ||
|
|
481d4f3478 | ||
|
|
5cf8726e60 | ||
|
|
db6214e090 | ||
|
|
bb215ad095 | ||
|
|
df214cd6c1 | ||
|
|
ea72d7bb11 | ||
|
|
d2f1e6e03e | ||
|
|
37f19dd0fe | ||
|
|
0c987f58e6 | ||
|
|
f84758eaac | ||
|
|
8c58236e7c | ||
|
|
027328d3a6 | ||
|
|
332601ed26 | ||
|
|
6c0a449ebe | ||
|
|
b1d2e1fa10 | ||
|
|
44e1d33faa | ||
|
|
183b3c61e4 | ||
|
|
a199f2ba40 | ||
|
|
d6c4f749a6 | ||
|
|
8af2c6c397 | ||
|
|
367ef7195a | ||
|
|
43d6dbb0f2 | ||
|
|
cd0ad21132 | ||
|
|
6fa73e073f | ||
|
|
5fc231cda4 | ||
|
|
1ca8ab81c7 | ||
|
|
22d3a4a48f | ||
|
|
d70e146c1f | ||
|
|
3888a461f3 | ||
|
|
4df2c8d872 | ||
|
|
989005d616 | ||
|
|
ed05a24cc4 | ||
|
|
2cee591b0e | ||
|
|
8a71d7d254 | ||
|
|
7950eb8ed6 | ||
|
|
f59515883d | ||
|
|
2c432e0b97 | ||
|
|
524f04f34e | ||
|
|
9e7ee42eb7 | ||
|
|
6f82e80698 | ||
|
|
37680a0909 | ||
|
|
350ad98c27 | ||
|
|
2a3df5562c | ||
|
|
b0dbb49ca8 | ||
|
|
4603798996 | ||
|
|
3169833cd7 | ||
|
|
75540e8a4c | ||
|
|
9abc3e1333 | ||
|
|
fb79211514 | ||
|
|
502e7081cf | ||
|
|
dcba129a98 | ||
|
|
b856266e91 | ||
|
|
7f1f62e14a | ||
|
|
fe51ada1e8 | ||
|
|
6708c959d9 | ||
|
|
af9daaeff7 | ||
|
|
a999884adf | ||
|
|
807277c0ae | ||
|
|
0af97156c9 | ||
|
|
12ac9f9aa9 | ||
|
|
3885d5d706 | ||
|
|
f284786749 | ||
|
|
c54621eb19 | ||
|
|
2943b4a85a | ||
|
|
ed4d31ebc5 | ||
|
|
ed0b4e48d5 | ||
|
|
f9938c90ff | ||
|
|
bcdc19f0e3 | ||
|
|
fb967427e8 | ||
|
|
0b10761291 | ||
|
|
316c476bbd | ||
|
|
081cc0b9e8 | ||
|
|
560759ede8 | ||
|
|
0f98a90858 | ||
|
|
094da51d82 | ||
|
|
39097980b0 | ||
|
|
3c26bfa618 | ||
|
|
168c89aba7 | ||
|
|
0502f684e9 | ||
|
|
45cb679ea7 | ||
|
|
c9f9d55658 | ||
|
|
d285db653e | ||
|
|
dde8e35785 | ||
|
|
5860e5a46b | ||
|
|
fa4e6d8261 | ||
|
|
145df8ec67 | ||
|
|
af5cbdbed8 | ||
|
|
ba8b1bbe06 | ||
|
|
82e5e36c57 | ||
|
|
f2a7e0b28f | ||
|
|
0e86ceff73 | ||
|
|
c91de092e5 | ||
|
|
7a173f6e62 | ||
|
|
95f7e83c5c | ||
|
|
d8b621d05f | ||
|
|
fb87ad1442 | ||
|
|
c580275a01 | ||
|
|
5c2298fa37 | ||
|
|
08043bed21 | ||
|
|
906779c4b1 | ||
|
|
bd80c034ba | ||
|
|
fd69f60a49 | ||
|
|
00ed37dd02 | ||
|
|
4de815ad67 | ||
|
|
86eed7cb81 | ||
|
|
63f18a7ebb | ||
|
|
233f0423fa | ||
|
|
d5bddca01d | ||
|
|
00cb6f71da | ||
|
|
9ac35d5869 | ||
|
|
bd1db30eea | ||
|
|
6c3a5b1d69 | ||
|
|
c233baab5b | ||
|
|
aa6a5e4ac2 | ||
|
|
71560ace71 | ||
|
|
0fba4eee98 | ||
|
|
91fce3ea73 | ||
|
|
b50475bc17 | ||
|
|
40c802b148 | ||
|
|
7d9f917810 | ||
|
|
a5ae1a9734 | ||
|
|
506360716a | ||
|
|
22ad34fa0e | ||
|
|
ce0e7e4a5d | ||
|
|
907b79d3b8 | ||
|
|
863731fd6a | ||
|
|
c9f1b3229b | ||
|
|
2b8b204cfc | ||
|
|
264471af43 | ||
|
|
e31514f769 | ||
|
|
08d3ae9f02 | ||
|
|
f654c53c35 | ||
|
|
7121b64c59 | ||
|
|
cd0c9b2ddb | ||
|
|
b80bbe6587 | ||
|
|
879d41bf2d | ||
|
|
7b1cfd69d7 | ||
|
|
ff695f08f7 | ||
|
|
ef9f2a965d | ||
|
|
ac0e8b1fe1 | ||
|
|
da0f7317b4 | ||
|
|
3e81839af5 | ||
|
|
0af5574951 | ||
|
|
0ae9055ea6 | ||
|
|
885aafcea3 | ||
|
|
7445fa7ef7 | ||
|
|
a544133d73 | ||
|
|
b3c02798a3 | ||
|
|
0bd6eb1792 | ||
|
|
3ec19ee355 | ||
|
|
0215b250af | ||
|
|
6a0c9fdd34 | ||
|
|
7f1593c5d7 | ||
|
|
e420a689dc | ||
|
|
9addd56f9b | ||
|
|
a7e69a5dc5 | ||
|
|
f6a83d5de2 | ||
|
|
d1d8a40acf | ||
|
|
cb18dfaaef | ||
|
|
a22a03e501 | ||
|
|
9a35b5670e | ||
|
|
017b54f9a8 | ||
|
|
9b7e6cc5c1 | ||
|
|
209276efa8 | ||
|
|
d2fc3e8023 | ||
|
|
1afdeb7216 | ||
|
|
b754ffb047 | ||
|
|
89eb4727b4 | ||
|
|
5619947685 | ||
|
|
31e584e3e3 | ||
|
|
ad09f6491b | ||
|
|
efbe033bfb | ||
|
|
2c6f0950f6 | ||
|
|
b680788f48 | ||
|
|
5e0d4ab31d | ||
|
|
488f993f45 | ||
|
|
876407e2e7 | ||
|
|
811cbc27c0 | ||
|
|
214f925b2f | ||
|
|
cefa31eb82 | ||
|
|
25e90ff658 | ||
|
|
fa390299f9 | ||
|
|
accb036507 | ||
|
|
44690ff596 | ||
|
|
e20f819c1d | ||
|
|
1d011a2f9a | ||
|
|
bc84a78b0f | ||
|
|
6034bd0946 | ||
|
|
6abe714dff | ||
|
|
37606dab4b | ||
|
|
f9b98d6d1d | ||
|
|
786a877986 | ||
|
|
b637ae1e53 | ||
|
|
cc8a54d314 | ||
|
|
c86d8e5acf | ||
|
|
4a819026df | ||
|
|
7671ae8df7 | ||
|
|
94d0c28f69 | ||
|
|
df555d5321 | ||
|
|
c3468b7ed6 | ||
|
|
bbf0e7c0a5 | ||
|
|
3f5c1d2ade | ||
|
|
dd063d0207 | ||
|
|
309ff2997c | ||
|
|
8e8ca97eec | ||
|
|
b734958ab9 | ||
|
|
51d7559a2c | ||
|
|
5c4f706fe4 | ||
|
|
7ac32a19b5 | ||
|
|
6e4da53e31 | ||
|
|
8e3dbcb7c0 | ||
|
|
5287984307 | ||
|
|
5539f1d498 | ||
|
|
e8cce4d1a1 | ||
|
|
ab0bc75e43 | ||
|
|
2d8053a9df | ||
|
|
c4dd64940e | ||
|
|
414ac5433d | ||
|
|
b2c01ffe21 | ||
|
|
517dea6958 | ||
|
|
225e6c6b9f | ||
|
|
1dd4fecffb | ||
|
|
5f2645b84a | ||
|
|
fc4b11e224 | ||
|
|
cf3383dd59 | ||
|
|
ead6ba50e7 | ||
|
|
7127b989c6 | ||
|
|
3fc755d92f | ||
|
|
0dc43e5211 | ||
|
|
4ddbb17a11 | ||
|
|
bfe31645ab | ||
|
|
09f843727d | ||
|
|
191a6b7d2b | ||
|
|
096511fc89 | ||
|
|
85687ce4a2 | ||
|
|
a6bfb23d20 | ||
|
|
c2f3413dc5 | ||
|
|
755daeb024 | ||
|
|
26233ac078 | ||
|
|
2ee2876855 | ||
|
|
ee2e6e5dce | ||
|
|
facb6b2e81 | ||
|
|
ec3c83c0c9 | ||
|
|
0ad4fb7273 | ||
|
|
763d5f67cd | ||
|
|
b7d4c997a3 | ||
|
|
bd7f45e398 | ||
|
|
748440ced3 | ||
|
|
5c7795bb63 | ||
|
|
f7ebd2e793 | ||
|
|
9298891d00 | ||
|
|
3a1dc6f23e | ||
|
|
e250153204 | ||
|
|
a2e5a6628d | ||
|
|
6b3278cd8e | ||
|
|
16c4864e67 | ||
|
|
11f225aada | ||
|
|
cd8affc255 | ||
|
|
8677fb18bb | ||
|
|
8979981553 | ||
|
|
4fa212c43b | ||
|
|
a9da5ebff6 | ||
|
|
38ebfec1fb | ||
|
|
6c7acd585e | ||
|
|
e8efaa5ed8 | ||
|
|
5a83b30303 | ||
|
|
986b23856f | ||
|
|
96872e2b3b | ||
|
|
42ffed3f57 | ||
|
|
a006c6962c | ||
|
|
cc3f7995fb | ||
|
|
3f399225fa | ||
|
|
dc5d0e367c | ||
|
|
a2803e4f5f | ||
|
|
b1d392e415 | ||
|
|
cbf00e9378 | ||
|
|
414838cae8 | ||
|
|
3ee14164db | ||
|
|
63712de170 | ||
|
|
43673d6694 | ||
|
|
f195648b90 | ||
|
|
06f77acfa1 | ||
|
|
f04a693fbe | ||
|
|
c012711763 | ||
|
|
c6daa8e59b | ||
|
|
7cc6c1a10f | ||
|
|
7f73cc1694 | ||
|
|
87973ac692 | ||
|
|
9a13ec736d | ||
|
|
1a3041690f | ||
|
|
84e5ad7346 | ||
|
|
4559bb5553 | ||
|
|
2d51a78ee7 | ||
|
|
95a380ae9e | ||
|
|
d8c59fcb73 | ||
|
|
8dff17d78b | ||
|
|
53d5de685c | ||
|
|
f0ce8b8fd4 | ||
|
|
aeb1f10621 | ||
|
|
a3e7f513e6 | ||
|
|
8b63a6f29b | ||
|
|
133a8ec225 | ||
|
|
131747ea4b | ||
|
|
e982790ad5 | ||
|
|
a7f1f886d3 | ||
|
|
d034f10af3 | ||
|
|
a2b817f0c0 | ||
|
|
bce6d44e06 | ||
|
|
d5f2c36abd | ||
|
|
d86b3f04b1 | ||
|
|
72a90199db | ||
|
|
e69702799f | ||
|
|
118aead9b9 | ||
|
|
49bb861045 | ||
|
|
1d6661e7e4 | ||
|
|
a43173fa90 | ||
|
|
d2a24b5186 | ||
|
|
40f44c2389 | ||
|
|
441b5bd1dc | ||
|
|
dc2f0d59cb | ||
|
|
4dcfacf2d5 | ||
|
|
b7485106ef | ||
|
|
f82893496b | ||
|
|
c418e58f88 | ||
|
|
054e557531 | ||
|
|
3020dc75ab | ||
|
|
9ea359de52 | ||
|
|
c5daf7d1b6 | ||
|
|
b7d7f424c5 | ||
|
|
e1fa6f1a0d | ||
|
|
a23e0fef8d | ||
|
|
0fd0b08c09 | ||
|
|
ce1690b450 | ||
|
|
46bd473664 | ||
|
|
6030fec6cb | ||
|
|
b7323dc403 | ||
|
|
c6d74d6c12 | ||
|
|
a42709f814 | ||
|
|
3016844dd7 | ||
|
|
8fbb55a0c8 | ||
|
|
f046a7e7fe | ||
|
|
92ce707268 | ||
|
|
3f5887cc03 | ||
|
|
fb3f5d86cf | ||
|
|
512492bf30 | ||
|
|
2477c3914e | ||
|
|
afee1ee1c0 | ||
|
|
f233593909 | ||
|
|
3253cc38b2 | ||
|
|
b154e1baa1 | ||
|
|
714599aeaa | ||
|
|
119a9983a9 | ||
|
|
8866494c94 | ||
|
|
2e06b4be66 | ||
|
|
0ec2e71f58 | ||
|
|
fc3a8b944e | ||
|
|
2ed2ef3b28 | ||
|
|
a3c5da90d2 | ||
|
|
e7e91b6931 | ||
|
|
1f9d02e7fa | ||
|
|
0895ca3e4a | ||
|
|
2ee70db7cd | ||
|
|
c9c1547813 | ||
|
|
9a8c868793 | ||
|
|
13ec5da84e | ||
|
|
3e34d000f2 | ||
|
|
12203461f0 | ||
|
|
a337564864 | ||
|
|
734db6f932 | ||
|
|
d76e3c0488 | ||
|
|
c0de20dda0 | ||
|
|
79c37f9fe4 | ||
|
|
7f520a6f28 | ||
|
|
23f72ecf7b | ||
|
|
8c57e7621b | ||
|
|
c460b3f3be | ||
|
|
1c001ee138 | ||
|
|
fab82107bb | ||
|
|
78362af168 | ||
|
|
1c58b75ac2 | ||
|
|
41568c885d | ||
|
|
dba2efe367 | ||
|
|
e3b07f569a | ||
|
|
65a307970b | ||
|
|
3e3ca14b4c | ||
|
|
8b45d1c928 | ||
|
|
0fe7a69b39 | ||
|
|
6d09f1b6c0 | ||
|
|
1ada20ac7b | ||
|
|
d04eedeb8d | ||
|
|
f275002ebe | ||
|
|
d4e0941c27 | ||
|
|
9dc57359b9 | ||
|
|
06b31d7cf0 | ||
|
|
4d7b8bdb25 | ||
|
|
421a8cc6b7 | ||
|
|
3a448fda91 | ||
|
|
3706c76622 | ||
|
|
9a6710e330 | ||
|
|
1113980b20 | ||
|
|
e890c4ae1b | ||
|
|
7ada625161 | ||
|
|
7d8dd54b19 | ||
|
|
0b275c4933 | ||
|
|
e529bbed90 | ||
|
|
39e97779ec | ||
|
|
629d46ca25 | ||
|
|
c5a35ad56f | ||
|
|
1e94161ec1 | ||
|
|
6f78ff200c | ||
|
|
02e96484a8 | ||
|
|
67b0e4dd15 | ||
|
|
a3b21022af | ||
|
|
ad92e7b888 | ||
|
|
c73522de2e | ||
|
|
14f5e8e32e | ||
|
|
f3797abecf | ||
|
|
5b7ec19778 | ||
|
|
e71c617bfd | ||
|
|
1310bef528 | ||
|
|
f1432992d3 | ||
|
|
348b7bf4eb | ||
|
|
30479cc5a2 | ||
|
|
1ba1bdec2d | ||
|
|
8993af4378 | ||
|
|
7246011b62 | ||
|
|
058d868edd | ||
|
|
9a58d0e559 | ||
|
|
281c0e1553 | ||
|
|
52a63a65ef | ||
|
|
cdac8d56d5 | ||
|
|
b04cb23ed5 | ||
|
|
7b4be209aa | ||
|
|
c712b7c46c | ||
|
|
22c6892870 | ||
|
|
134650eb44 | ||
|
|
506ba022f1 | ||
|
|
fc6d572a6c | ||
|
|
e6eb91c5f9 | ||
|
|
ced986e010 | ||
|
|
cde9b3ac85 | ||
|
|
b54c079766 | ||
|
|
2db17a57d2 | ||
|
|
a992c5b8d3 | ||
|
|
58f1a9bb30 | ||
|
|
269b59c2ba | ||
|
|
d462c8838f | ||
|
|
1297ac77b9 | ||
|
|
d57d3cf1f6 | ||
|
|
ae85aa33fd | ||
|
|
f2eadacf09 | ||
|
|
9ebc41ed6f | ||
|
|
f9dfdd58df | ||
|
|
c9f9388ef6 | ||
|
|
7ae6712d56 | ||
|
|
98a283b4ec | ||
|
|
d524f6b395 | ||
|
|
6b716683e2 | ||
|
|
ba2c33af0b | ||
|
|
de11f602d5 | ||
|
|
b8cb180e4b | ||
|
|
260c8e0227 | ||
|
|
e579504181 | ||
|
|
7c034b427e | ||
|
|
08868594ae | ||
|
|
f25d175b5d | ||
|
|
cc6e548a78 | ||
|
|
17a4299f74 | ||
|
|
776f4dc316 | ||
|
|
5db55d9e29 | ||
|
|
5c9564ac08 | ||
|
|
5c5a89c1a4 | ||
|
|
176413d312 | ||
|
|
b70ecc3dd3 | ||
|
|
89670e5ce4 | ||
|
|
174e1acbc7 | ||
|
|
1f09a24a72 | ||
|
|
eed91ddf46 | ||
|
|
96a7118d05 | ||
|
|
6eec896282 | ||
|
|
a78bb252de | ||
|
|
0ba07f19f7 | ||
|
|
a49a6bfd88 | ||
|
|
b87931c0a9 | ||
|
|
9b640d586b | ||
|
|
7440ffc0e6 | ||
|
|
63e901cd0b | ||
|
|
af4e9c30f5 | ||
|
|
5805ffebec | ||
|
|
39bfacf1d5 | ||
|
|
8d30fc2718 | ||
|
|
19daff36b0 | ||
|
|
c34c8ff358 | ||
|
|
af68cb6029 | ||
|
|
6b6b212643 | ||
|
|
dd2a71fa8f | ||
|
|
cd72d133a3 | ||
|
|
d3662d0e34 | ||
|
|
cf6219bb6f | ||
|
|
45eeb5065f | ||
|
|
f563eb1f63 | ||
|
|
2c1f31cecb | ||
|
|
ef16c409ef | ||
|
|
1029f9521c | ||
|
|
825eca078d | ||
|
|
1eccfb798f | ||
|
|
b9b9f3c136 | ||
|
|
7810da51a8 | ||
|
|
a470138450 | ||
|
|
4e20a02fe5 | ||
|
|
7bad731ad2 | ||
|
|
eeb54290b3 | ||
|
|
dc1e73dcb7 | ||
|
|
94be12b9e4 | ||
|
|
1862fb77ff | ||
|
|
782463589e | ||
|
|
ff570c4a6b | ||
|
|
06b619f0ed | ||
|
|
f5cc6cfd07 | ||
|
|
0f5cf00e35 | ||
|
|
105ff694f2 | ||
|
|
26ff6be63c | ||
|
|
47e3da9ebf | ||
|
|
b7ce5ba82a | ||
|
|
5723abe6eb | ||
|
|
95a9b0427c | ||
|
|
0692fea9d8 | ||
|
|
b0882a5cd2 | ||
|
|
4c1a0005e6 | ||
|
|
05ceed926c | ||
|
|
b691521662 | ||
|
|
ce300d88ee | ||
|
|
05c0249672 | ||
|
|
2498c13078 | ||
|
|
ab5dae741a | ||
|
|
cddad94e45 | ||
|
|
2f0a40c1c8 | ||
|
|
24b07aaaef | ||
|
|
ece1100d65 | ||
|
|
3b1ff5bf41 | ||
|
|
e5b03634ae | ||
|
|
1bd1c61c3c | ||
|
|
9cd81d87b2 | ||
|
|
59efea1b0e | ||
|
|
59f18583d1 | ||
|
|
d0b40bab47 | ||
|
|
d76192cce1 | ||
|
|
0e828d802e | ||
|
|
9505d7cc51 | ||
|
|
1c4072e231 | ||
|
|
86e13ea06f | ||
|
|
c12d3870cd | ||
|
|
fce76a13cb | ||
|
|
82b14370fc | ||
|
|
a9d8e9dcd8 | ||
|
|
542e989046 | ||
|
|
f5c199740d | ||
|
|
f37b81c8b7 | ||
|
|
c0ea69ee24 | ||
|
|
5640cbf653 | ||
|
|
6d81e5c87a | ||
|
|
3c7ff97ed4 | ||
|
|
2120ff8037 | ||
|
|
92c35c6aa6 | ||
|
|
149b16aefd | ||
|
|
114c38c1ff | ||
|
|
e5269a4151 | ||
|
|
81584c6d51 | ||
|
|
0d9ae241c9 | ||
|
|
e726e7aad8 | ||
|
|
c7c05ea869 | ||
|
|
b5da8423a6 | ||
|
|
c3de0a2d4b | ||
|
|
83880aed52 | ||
|
|
de56b753d1 | ||
|
|
dab01e3f3f | ||
|
|
e46ab72718 | ||
|
|
9f6d7eb587 | ||
|
|
bbd9098e44 | ||
|
|
47ad4e3fe8 | ||
|
|
9330d2e1e8 | ||
|
|
020e19f770 | ||
|
|
3be5600caf | ||
|
|
22dd275b15 | ||
|
|
6342e76e19 | ||
|
|
55dd149a03 | ||
|
|
39a0f28753 | ||
|
|
dd45b448d9 | ||
|
|
7740150576 | ||
|
|
4f367faf4d | ||
|
|
3840186dd8 | ||
|
|
d77fcea365 | ||
|
|
ed51a45187 | ||
|
|
c832226aa1 | ||
|
|
a20375372d | ||
|
|
ba86988101 | ||
|
|
6073e3f345 | ||
|
|
d31ccacf57 | ||
|
|
7e3d2029e0 | ||
|
|
de48e65091 | ||
|
|
3243365210 | ||
|
|
7ae0338f5c | ||
|
|
b2460fbee2 | ||
|
|
8dc3f2146a | ||
|
|
a993496ab4 | ||
|
|
61e72ef50b | ||
|
|
d7ac878efd | ||
|
|
e5a0db8782 | ||
|
|
24d4840c93 | ||
|
|
fa70798fb5 | ||
|
|
1af480ea3b | ||
|
|
a76fc0ee5a | ||
|
|
80e86d6c1b | ||
|
|
dc13e39bb1 | ||
|
|
98c5871d38 | ||
|
|
5a109d9293 | ||
|
|
56316bc980 | ||
|
|
21c8e65d13 | ||
|
|
86d8079739 | ||
|
|
d2be45bce1 | ||
|
|
5d048c18bc | ||
|
|
0fb779d363 | ||
|
|
d0ed82a686 | ||
|
|
d33b68ccc9 | ||
|
|
26f068bcab | ||
|
|
f0dc3725e8 | ||
|
|
2de22b408b | ||
|
|
04b62b139d | ||
|
|
2f20f3c65d | ||
|
|
53b3e5af1b | ||
|
|
7dbb98c2e5 | ||
|
|
8b35cda4c6 | ||
|
|
cb36a37779 | ||
|
|
704c5f2de7 | ||
|
|
3fcb0d2d6b | ||
|
|
2dfe0ed42e | ||
|
|
ac48fbae9c | ||
|
|
6048a7143a | ||
|
|
7c24db07c2 | ||
|
|
271cdac474 | ||
|
|
79e2c132cc | ||
|
|
b5736fb5a7 | ||
|
|
7822a6b000 | ||
|
|
306b63599c | ||
|
|
3021fb546e | ||
|
|
a5bd437d48 | ||
|
|
08156186fa | ||
|
|
f1006ca8b0 | ||
|
|
93c85711d1 | ||
|
|
e5ef5f2410 | ||
|
|
52a5729298 | ||
|
|
b9849580f8 | ||
|
|
4525161e7c | ||
|
|
dee6d18d69 | ||
|
|
d44179142f | ||
|
|
c66c01245b | ||
|
|
bce6916c13 | ||
|
|
681c43631b | ||
|
|
2f740fe471 | ||
|
|
b1c10c8454 | ||
|
|
1d5b3aadea | ||
|
|
2d420cd72c | ||
|
|
707d6880a8 | ||
|
|
dbad1a8d45 | ||
|
|
36eaff92e5 | ||
|
|
e51c299937 | ||
|
|
8c7953a47c | ||
|
|
4527784905 | ||
|
|
ee8a93ae9a | ||
|
|
6096362052 | ||
|
|
89c51e7649 | ||
|
|
6c92076ec3 | ||
|
|
2bba4134fb | ||
|
|
10175c8d57 | ||
|
|
7804bf0a9a | ||
|
|
336c95ce5b | ||
|
|
babe891242 | ||
|
|
bb37e93f52 | ||
|
|
aa0f2c64ff | ||
|
|
e66ca267f4 | ||
|
|
eeb5ca42e0 | ||
|
|
74ec90c725 | ||
|
|
03ee742981 | ||
|
|
557c63b372 | ||
|
|
b4c86bcf40 | ||
|
|
0094c1ecf5 | ||
|
|
6b5fcf53eb | ||
|
|
4b001a77b3 | ||
|
|
357c08c5b3 | ||
|
|
e7d9ec50dc | ||
|
|
09b0ba31ef | ||
|
|
8231bc931b | ||
|
|
26ffa078ef | ||
|
|
eb60aca34f | ||
|
|
4d3020421a | ||
|
|
f1ce0a1cf3 | ||
|
|
dd28a645a1 | ||
|
|
561e3c780d | ||
|
|
8371e34d87 | ||
|
|
46fd79604d | ||
|
|
d08c2de619 | ||
|
|
a452a05e52 | ||
|
|
0a96aa3aaf | ||
|
|
07bcaaebf9 | ||
|
|
0cde7c8ac1 | ||
|
|
b285e98988 | ||
|
|
ab40ba2f75 | ||
|
|
bbcb8ba3e7 | ||
|
|
ef48de34f7 | ||
|
|
7e898cf60c | ||
|
|
2f5cea0e73 | ||
|
|
282abdd804 | ||
|
|
9b178c5bb2 | ||
|
|
d491663143 | ||
|
|
8eaeba6486 | ||
|
|
631e67949e | ||
|
|
77d2cba155 | ||
|
|
2149092c7a | ||
|
|
100d1361b6 | ||
|
|
76f5266fa1 | ||
|
|
3ebe3b1196 | ||
|
|
c4f96c2fba | ||
|
|
d880f2ffbc | ||
|
|
f8f5a7ceaa | ||
|
|
b01839e9a4 | ||
|
|
75dbf12ae6 | ||
|
|
9bb89dced5 | ||
|
|
661fe5df66 | ||
|
|
8a93437e55 | ||
|
|
b20752f13e | ||
|
|
61967f6e1b | ||
|
|
f0fef4f232 | ||
|
|
7eb10a08b8 | ||
|
|
4c83653d5d | ||
|
|
3149cd03be | ||
|
|
5314765410 | ||
|
|
621a37be15 | ||
|
|
6de104a03a | ||
|
|
97560509ea | ||
|
|
32aaecd832 | ||
|
|
dfba8fbe5e | ||
|
|
32fea6523f | ||
|
|
d1c1a18226 | ||
|
|
04558beabe | ||
|
|
425d0d77c5 | ||
|
|
edf7cd29dd | ||
|
|
27318dded6 | ||
|
|
11fe0c5b4b | ||
|
|
886f9d82f2 | ||
|
|
4f2fb4af5d | ||
|
|
6c8eab734e | ||
|
|
9d5d6aff38 | ||
|
|
705cd571a5 | ||
|
|
48d3c75745 | ||
|
|
6fbd28d228 | ||
|
|
285cb78962 | ||
|
|
708655d9b2 | ||
|
|
9bd7ffe952 | ||
|
|
8febd90f2a | ||
|
|
51109ea485 | ||
|
|
1579c23ff1 | ||
|
|
bf18ecae13 | ||
|
|
89971925ca | ||
|
|
2ba007ee4f | ||
|
|
d1cc3c34c9 | ||
|
|
de79f9338a | ||
|
|
5471bfd5a8 | ||
|
|
961df010cb | ||
|
|
103986b320 | ||
|
|
764c0cdb03 | ||
|
|
12b09fab67 | ||
|
|
ed5a8ab090 | ||
|
|
41fa562dce | ||
|
|
6c2ce06fea | ||
|
|
ef019cdbfa | ||
|
|
1b02a1a6f3 | ||
|
|
1d8900dc19 | ||
|
|
171fd22d91 | ||
|
|
78d50f4033 | ||
|
|
fee18dd457 | ||
|
|
81d3ce8257 | ||
|
|
5213970c3d | ||
|
|
bcc06af904 | ||
|
|
a98242a2b8 | ||
|
|
5f715ca063 | ||
|
|
0ceeff62d6 | ||
|
|
f53a7c0e4a | ||
|
|
41b07d045a | ||
|
|
0d303f1d1f | ||
|
|
b6d97cfffb | ||
|
|
3e982ad34c | ||
|
|
dafd9c308f | ||
|
|
7f836cc01b | ||
|
|
147fa60f81 | ||
|
|
a1b9405e2e | ||
|
|
db02d44c6a | ||
|
|
dff1f77dfa | ||
|
|
1a2fff8ed8 | ||
|
|
52c12b33c3 | ||
|
|
29987ca2aa | ||
|
|
02f971b534 | ||
|
|
479b340d75 | ||
|
|
06c48f58cc | ||
|
|
0ee81a2865 | ||
|
|
e78c251832 | ||
|
|
efbc495f79 | ||
|
|
f8b73eb9d9 | ||
|
|
f25a590af5 | ||
|
|
0539098371 | ||
|
|
788c27bf2f | ||
|
|
a587148c73 | ||
|
|
9acd3a58ee | ||
|
|
dce30a27b9 | ||
|
|
449f5adaba | ||
|
|
2380b7af3d | ||
|
|
10989d13e4 | ||
|
|
fe1653ede6 | ||
|
|
b4071cec01 | ||
|
|
b1c842373d | ||
|
|
a3d70b3cf6 | ||
|
|
70912c44de | ||
|
|
98d9f7924d | ||
|
|
172295289e | ||
|
|
8ba08d7e87 | ||
|
|
8915f94931 | ||
|
|
1543899795 | ||
|
|
31bf844452 | ||
|
|
6d94acee8f | ||
|
|
0c8b74a025 | ||
|
|
dad8c1c27c | ||
|
|
2e12acdf32 | ||
|
|
d6156dd755 | ||
|
|
2c67a7ca71 | ||
|
|
688b8dcc38 | ||
|
|
280edee1db | ||
|
|
37a7ad4795 | ||
|
|
b9ea72f189 | ||
|
|
8f8265b219 | ||
|
|
00ae3c3120 | ||
|
|
1e49f152be | ||
|
|
f72ca4d83e | ||
|
|
5b10a9f3a7 | ||
|
|
d0fb1acebb | ||
|
|
09be4d22ee | ||
|
|
11a64320f0 | ||
|
|
d7d241196e | ||
|
|
4eac66b84a | ||
|
|
fa606b38b7 | ||
|
|
497b7808b6 | ||
|
|
b10c2b5946 | ||
|
|
fa881ba1c7 | ||
|
|
eb1b17e8e4 | ||
|
|
9ae4d45243 | ||
|
|
2eec85a97c | ||
|
|
1cd5681967 | ||
|
|
c85b6193d5 | ||
|
|
eab488e64f | ||
|
|
50e718b1e7 | ||
|
|
fc36e7eccf | ||
|
|
0cc2bbf5d9 | ||
|
|
7c36e5c0e6 | ||
|
|
d2669debb9 | ||
|
|
1b62ed1e7e | ||
|
|
637fb449c6 | ||
|
|
e82b319ee7 | ||
|
|
c3d41f0d48 | ||
|
|
e9248066df | ||
|
|
819472d366 | ||
|
|
21bbdd6f49 | ||
|
|
a88ac00115 | ||
|
|
30683b38a8 | ||
|
|
45aefeb146 | ||
|
|
9daacd7aee | ||
|
|
580ecbff0c | ||
|
|
db3318886e | ||
|
|
54eb837950 | ||
|
|
0bd73788f4 | ||
|
|
e395282e0e | ||
|
|
1f129d0bcb | ||
|
|
c2ae5e5fd1 | ||
|
|
292a7357bd | ||
|
|
ece11dc3d8 | ||
|
|
99aa2cdf2a | ||
|
|
0eb9401c62 | ||
|
|
ab14a589c8 | ||
|
|
122fa596b3 | ||
|
|
5406407ed6 | ||
|
|
b72cee2783 | ||
|
|
fe023e2229 | ||
|
|
66595a3597 | ||
|
|
1dae928a7c | ||
|
|
9b1779bb06 | ||
|
|
97cc05eeea | ||
|
|
20dd3b0a69 | ||
|
|
f348eabf19 | ||
|
|
5870a57002 | ||
|
|
278bc5a8cd | ||
|
|
3c89415df1 | ||
|
|
5981f700f5 | ||
|
|
af5e8ee18c | ||
|
|
52e8343f76 | ||
|
|
a4dbf5942c | ||
|
|
ada1d42ebf | ||
|
|
f27182ae05 | ||
|
|
2fddf05515 | ||
|
|
91d1864840 | ||
|
|
6e42ee1bd4 | ||
|
|
f3cc614427 | ||
|
|
79052ba7c6 | ||
|
|
0edd4d3c02 | ||
|
|
71516c480d | ||
|
|
4960890d70 | ||
|
|
76f0f3cbf2 | ||
|
|
1304c2c4ab | ||
|
|
a84b7dc27e | ||
|
|
927af0adec | ||
|
|
2dfbc2058f | ||
|
|
79ee6c2f3b | ||
|
|
f59a6862ca | ||
|
|
fa962b7f53 | ||
|
|
71408bab60 | ||
|
|
9e015eb654 | ||
|
|
4ce03e8b61 | ||
|
|
68b7f412b6 | ||
|
|
20011f3a84 | ||
|
|
2d020b5989 | ||
|
|
1909b465dc | ||
|
|
88b7f2e0ee | ||
|
|
f5f04bcc4b | ||
|
|
531d586460 | ||
|
|
2630a73a1c | ||
|
|
4decd15ca9 | ||
|
|
3a59dd24f3 | ||
|
|
c232411e96 | ||
|
|
1cf1f6edcb | ||
|
|
5d36a27893 | ||
|
|
da94533647 | ||
|
|
db08d5021e | ||
|
|
69066013c1 | ||
|
|
aef569ee9d | ||
|
|
cf881aa6dc | ||
|
|
a48bf3142c | ||
|
|
33d9f4b882 | ||
|
|
49c40a4b11 | ||
|
|
d1eff0ae24 | ||
|
|
c0131695c5 | ||
|
|
fcbadda40f | ||
|
|
2455faa6fe | ||
|
|
7da8a5e374 | ||
|
|
b3950165c4 | ||
|
|
b8ab859c59 | ||
|
|
99a3cb0eab | ||
|
|
0be4b59cff | ||
|
|
fef37b0222 | ||
|
|
ddfc7c75df | ||
|
|
7618f29657 | ||
|
|
291231c561 | ||
|
|
7ad557f2f8 | ||
|
|
ef70052b0e | ||
|
|
202426f536 | ||
|
|
d240415671 | ||
|
|
1aca22b5f8 | ||
|
|
ff970ee3f5 | ||
|
|
51a46a8ad7 | ||
|
|
68792ee9db | ||
|
|
bcff1ced5e | ||
|
|
7ce2a93c63 | ||
|
|
4d33773cef | ||
|
|
5d19426930 | ||
|
|
1b51a10b19 | ||
|
|
aab870af32 | ||
|
|
38ff7d87c8 | ||
|
|
7c70ada423 | ||
|
|
12e2bac16b | ||
|
|
34a27c748a | ||
|
|
7ec0c52439 | ||
|
|
905dd20d0c | ||
|
|
a73fbccf8c | ||
|
|
7f1d707d23 | ||
|
|
f1fb36bcb8 | ||
|
|
25c274a0bd | ||
|
|
d4bbd28757 | ||
|
|
98b7248df0 | ||
|
|
0fb0f2c204 | ||
|
|
6abaad1ae8 | ||
|
|
89aec52503 | ||
|
|
79d13d9242 | ||
|
|
b6f42a91f4 | ||
|
|
cc5f5cf3a6 | ||
|
|
2aef6a2174 | ||
|
|
79f00c2a2a | ||
|
|
e5068e7543 | ||
|
|
858218ac34 | ||
|
|
b8e8d975aa | ||
|
|
6e0330ff65 | ||
|
|
3aa7178382 | ||
|
|
439bf7641e | ||
|
|
34042028b3 | ||
|
|
d69049ce10 | ||
|
|
44a281534d | ||
|
|
59a9cc7c12 | ||
|
|
2f34b046d0 | ||
|
|
a73316306d | ||
|
|
cf12a56b4c | ||
|
|
928652e4cf | ||
|
|
7950b49cb1 | ||
|
|
f8b1b243c1 | ||
|
|
cc6aa66ab0 | ||
|
|
ea381392a7 | ||
|
|
bb7f63dcfd | ||
|
|
253d65727b | ||
|
|
61138b58bf | ||
|
|
5490063b7e | ||
|
|
d2e1489fe7 | ||
|
|
2c6324e3e5 | ||
|
|
e442ba863a | ||
|
|
2b4849a2fa | ||
|
|
eb898646bc | ||
|
|
79b547b83b | ||
|
|
2356601bb3 | ||
|
|
9b88c7d3c1 | ||
|
|
302499b483 | ||
|
|
17e16f5e79 | ||
|
|
b176ff6626 | ||
|
|
e5471d8318 | ||
|
|
902bb7a198 | ||
|
|
03dc27a327 | ||
|
|
9291ace558 | ||
|
|
15c11ea172 | ||
|
|
cd6950d984 | ||
|
|
de96350bee | ||
|
|
b037e6356e | ||
|
|
824628061b | ||
|
|
a9f1e165b5 | ||
|
|
c60b433c42 | ||
|
|
933c7e36d1 | ||
|
|
449abace66 | ||
|
|
6025b3a91b | ||
|
|
c473428be6 | ||
|
|
e06e5fe55f | ||
|
|
dc8f437b31 | ||
|
|
2219d409a4 | ||
|
|
aabcf80774 | ||
|
|
1cf956ec21 | ||
|
|
315c2eb4ca | ||
|
|
54e2b9345b | ||
|
|
9743fee8f9 | ||
|
|
696f801df0 | ||
|
|
fef0d0b31c | ||
|
|
75101a0319 | ||
|
|
d1a660ce20 | ||
|
|
4356005c5a | ||
|
|
86a00eee3f | ||
|
|
ccf532672b | ||
|
|
6b52e9db34 | ||
|
|
8fdee79505 | ||
|
|
d9de6e68ad | ||
|
|
988fe70771 | ||
|
|
132fac86d7 | ||
|
|
d02175210b | ||
|
|
1dd3d080b8 | ||
|
|
d171431ac7 | ||
|
|
76e0d61b19 | ||
|
|
cc6d83a953 | ||
|
|
617887a0c6 | ||
|
|
e4fe4cb4d3 | ||
|
|
dc0a054d94 | ||
|
|
924d9b985f | ||
|
|
bb3bd6930a | ||
|
|
1245ed6f06 | ||
|
|
01b0ee49de | ||
|
|
2436ef9574 | ||
|
|
94f3a1ab1f | ||
|
|
9c98883bea | ||
|
|
2fb19e25b5 | ||
|
|
6fbbe2d0e4 | ||
|
|
c291eb3db4 | ||
|
|
7f38ce8908 | ||
|
|
1781400340 | ||
|
|
3760f14da8 | ||
|
|
dc18366111 | ||
|
|
936252765a | ||
|
|
b62b87eed3 | ||
|
|
4b716f3ea6 | ||
|
|
ddbe181e48 | ||
|
|
27f9d4523b | ||
|
|
8a7cfbd8de | ||
|
|
463a9a5485 | ||
|
|
ee7fe4a38a | ||
|
|
dccb9def3a | ||
|
|
5c5d57a996 | ||
|
|
de2ce5a0a2 | ||
|
|
7b114e2cae | ||
|
|
25d519fed3 | ||
|
|
8d819956d3 | ||
|
|
4aec783362 | ||
|
|
b494181764 | ||
|
|
9575271fcd | ||
|
|
b6eda9076e | ||
|
|
88072a985a | ||
|
|
c27f151451 | ||
|
|
64a7025522 | ||
|
|
ce2741cebc | ||
|
|
b40b670639 | ||
|
|
3d6b622879 | ||
|
|
4c67a8812a | ||
|
|
4c4d02c0d0 | ||
|
|
c1831f4946 | ||
|
|
4b2c1bacd1 | ||
|
|
3909102436 | ||
|
|
78e50747e4 | ||
|
|
b09498d852 | ||
|
|
7fcf723039 | ||
|
|
d27ab8c6ca | ||
|
|
0350508b65 | ||
|
|
32739cc305 | ||
|
|
f515fe77c4 | ||
|
|
f6d20cbe55 | ||
|
|
8bc0d9acd3 | ||
|
|
73325bcd41 | ||
|
|
1b5bbfdad3 | ||
|
|
fcd211b190 | ||
|
|
55b3eb467f | ||
|
|
192c23bfce | ||
|
|
72e0418e4c | ||
|
|
4fc044d368 | ||
|
|
1544606bf0 | ||
|
|
255330d342 | ||
|
|
ad139e19ab | ||
|
|
4c0891a22e | ||
|
|
8e6e51f9a6 | ||
|
|
faa502163e | ||
|
|
4ff0e7e0a2 | ||
|
|
12459bf07e | ||
|
|
b25ef28e82 | ||
|
|
ef6c82ba00 | ||
|
|
7e009667a2 | ||
|
|
1f1eb933d1 | ||
|
|
aa85e875bd | ||
|
|
1b4c613fa6 | ||
|
|
57ef515def | ||
|
|
8cd1d43798 | ||
|
|
59643177af | ||
|
|
e2d5ae1035 | ||
|
|
cd9f2e5ea5 | ||
|
|
acd3df33b6 | ||
|
|
1bc8fd9b49 | ||
|
|
600a6d9346 | ||
|
|
0e22864426 | ||
|
|
5306cdc7a1 | ||
|
|
344b98bf13 | ||
|
|
12f5e4b46e | ||
|
|
261d7ee688 | ||
|
|
633267c457 | ||
|
|
80f9ed70d3 | ||
|
|
fa8f6f91c4 | ||
|
|
c3f8e099f4 | ||
|
|
6cb8134690 | ||
|
|
95a77e5ccc | ||
|
|
21783ecef7 | ||
|
|
d8a8b53fc9 | ||
|
|
e71ce01f90 | ||
|
|
6827f9977c | ||
|
|
6d24bd0361 | ||
|
|
22c1629dd3 | ||
|
|
bd9d5432f5 | ||
|
|
370ee5c6f6 | ||
|
|
fe2e4d87c5 | ||
|
|
e9c4635f6b | ||
|
|
7337010fd8 | ||
|
|
f06019ab81 | ||
|
|
55567f8dd2 | ||
|
|
2ccfdcb084 | ||
|
|
084d9de4c9 | ||
|
|
41875c2ddb | ||
|
|
4ad9ff4301 | ||
|
|
c7ff1e9b3f | ||
|
|
fe3f751a8a | ||
|
|
996b7166d2 | ||
|
|
839b2fa8fd | ||
|
|
8b1aebcdba | ||
|
|
f4e2041b0b | ||
|
|
24df6f838d | ||
|
|
c313cc02f2 | ||
|
|
4e13c882f8 | ||
|
|
0fe51d826f | ||
|
|
b2976baf9b | ||
|
|
a0a5a49d7b | ||
|
|
9a1781f613 | ||
|
|
f983264b5d | ||
|
|
40cebeedfc | ||
|
|
1f9280c68e | ||
|
|
14ed261606 | ||
|
|
4fb671e7f4 | ||
|
|
aad5c96759 | ||
|
|
72b8da317f | ||
|
|
7f9033f1f1 | ||
|
|
a42e384935 | ||
|
|
9b37357513 | ||
|
|
23269c9a08 | ||
|
|
327f70240c | ||
|
|
0a7642dbe0 | ||
|
|
742b036a07 | ||
|
|
6e00989a9e | ||
|
|
68f0227ca1 | ||
|
|
fe9a2e7ba4 | ||
|
|
a248fc36fe | ||
|
|
e28a7a7ae3 | ||
|
|
b92789825d | ||
|
|
c3b6aecb79 | ||
|
|
4688126f84 | ||
|
|
5a5c03a826 | ||
|
|
f3477877d0 | ||
|
|
7bef588851 | ||
|
|
72a25cf6ee | ||
|
|
74e13f4c70 | ||
|
|
3c09ef6cbf | ||
|
|
68bfcf5d24 | ||
|
|
b2a10de71a | ||
|
|
267b9e5c2f | ||
|
|
55d94bf15a | ||
|
|
629e2a9e1c | ||
|
|
86acdf69d9 | ||
|
|
a6987ad703 | ||
|
|
5642e40bc8 | ||
|
|
50d178feaa | ||
|
|
8d71328192 | ||
|
|
17b320f7dc | ||
|
|
8df14ee845 | ||
|
|
550d6d66d1 | ||
|
|
f1ad82d0ba | ||
|
|
2fb283749c | ||
|
|
7480d34742 | ||
|
|
5a4c023fc9 | ||
|
|
e8afac3a01 | ||
|
|
6284517dc9 | ||
|
|
80c096b6f1 | ||
|
|
04cc513bbd | ||
|
|
f004d5085d | ||
|
|
98e21ae0ad | ||
|
|
00274722ce | ||
|
|
8b93678e3d | ||
|
|
1b3ec955b1 | ||
|
|
5356898efc | ||
|
|
2ca8805cda | ||
|
|
8e5c41e6f3 | ||
|
|
0f7efbc22e | ||
|
|
6b7bd07c97 | ||
|
|
8d85516e72 | ||
|
|
0f4cf74ae0 | ||
|
|
4dfe0fad7d | ||
|
|
2e91ea8093 | ||
|
|
77e3480b2f | ||
|
|
bca1ef42fc | ||
|
|
010ab7119e | ||
|
|
3cb93510ac | ||
|
|
8a88ca6f34 | ||
|
|
81d786733d | ||
|
|
336e74b992 | ||
|
|
74b3e2ce3f | ||
|
|
ed6e3e4ee2 | ||
|
|
f8bea55b10 | ||
|
|
72cd84e878 | ||
|
|
35b6d09615 | ||
|
|
1ae727e70f | ||
|
|
0e5d0c1170 | ||
|
|
7ff62bc577 | ||
|
|
bb32831a60 | ||
|
|
743c1c2eda | ||
|
|
0e9a08cbbf | ||
|
|
d2445ec72d | ||
|
|
fef713aaed | ||
|
|
c4d73688a6 | ||
|
|
56b721b2eb | ||
|
|
2981b37219 | ||
|
|
cfc2f84d3e | ||
|
|
2a5691e575 | ||
|
|
774432066e | ||
|
|
e6c501de8e | ||
|
|
d5a8661480 | ||
|
|
2fdb3cfdfb | ||
|
|
8961e61f60 | ||
|
|
e5191acd73 | ||
|
|
997504c03c | ||
|
|
ea690c285b | ||
|
|
28879712e9 | ||
|
|
3c2e43d883 | ||
|
|
dde06dfaba | ||
|
|
eb0f074097 | ||
|
|
b6c9b5645c | ||
|
|
5041880854 | ||
|
|
a281b36d6f | ||
|
|
7772501cdf | ||
|
|
2c904afd04 | ||
|
|
2cc13fb74a | ||
|
|
df3c3bca02 | ||
|
|
d1b991e198 | ||
|
|
00f793a841 | ||
|
|
bdb9598227 | ||
|
|
c6deb392fd | ||
|
|
3477ea0eeb | ||
|
|
9dacad99fa | ||
|
|
73e35c66af | ||
|
|
d3b599b727 | ||
|
|
4369151cd8 | ||
|
|
846773efd3 | ||
|
|
bcfa34357b | ||
|
|
e0c2e8ed86 | ||
|
|
b80a3876ab | ||
|
|
26e17f58ef | ||
|
|
45d1567057 | ||
|
|
8aacb3f7ec | ||
|
|
99ee81a489 | ||
|
|
517ffbd783 | ||
|
|
7dd926d4f1 | ||
|
|
cbc7942a00 | ||
|
|
3806905f5b | ||
|
|
2496f23e45 | ||
|
|
4bb1172c84 | ||
|
|
367ff79ef1 | ||
|
|
2961c44bbe | ||
|
|
997559dc6d | ||
|
|
79d28bbc35 | ||
|
|
6bc425f981 | ||
|
|
2cdfc16829 | ||
|
|
e63d45cca9 | ||
|
|
553f186b7c | ||
|
|
623dfc0286 | ||
|
|
ffa7f35a87 | ||
|
|
081b7d4aa9 | ||
|
|
9c3c4bac66 | ||
|
|
6ec218ef11 | ||
|
|
ad2eabeb3b | ||
|
|
26c377d05b | ||
|
|
caa75d98be | ||
|
|
3ad9356ca4 | ||
|
|
dd5296f03c | ||
|
|
e673d76f22 | ||
|
|
393eb7bb4d | ||
|
|
2fa5a5b8c3 | ||
|
|
ca63b79ed8 | ||
|
|
f8b097669a | ||
|
|
2f284209d8 | ||
|
|
09881040a3 | ||
|
|
9066ad5790 | ||
|
|
62d0e670dc | ||
|
|
e7d597045b | ||
|
|
eaa3a2eae2 | ||
|
|
21d7d8988a | ||
|
|
e76386be4f | ||
|
|
b3b3ca0e16 | ||
|
|
730e86c4cd | ||
|
|
a92f1cb055 | ||
|
|
a54162e009 | ||
|
|
48864a6921 | ||
|
|
92f07cb60f | ||
|
|
e17243bc1f | ||
|
|
0e45dd7a3d | ||
|
|
65f313f1b4 | ||
|
|
da4958c716 | ||
|
|
653b8494f5 | ||
|
|
6ed6f84f6e | ||
|
|
ff0ba56bc3 | ||
|
|
e795d04f30 | ||
|
|
8d3806b080 | ||
|
|
5597ebe455 | ||
|
|
5f96de32bb | ||
|
|
d2436ce23d | ||
|
|
fbadadc377 | ||
|
|
8de3bda0b1 | ||
|
|
3c4f410a4e | ||
|
|
9c0a21a5fb | ||
|
|
94ddf7e5d8 | ||
|
|
f45dd8e94f | ||
|
|
b735dc07d6 | ||
|
|
68c902e60b | ||
|
|
e19214c3c4 | ||
|
|
4759429702 | ||
|
|
b626589c07 | ||
|
|
02704cdf74 | ||
|
|
4555d4bcbe | ||
|
|
184e58f5e5 | ||
|
|
5c7f3c1642 | ||
|
|
36331512bc | ||
|
|
3e916cfbb9 | ||
|
|
4a9ad14e11 | ||
|
|
f80816d88f | ||
|
|
817f89d586 | ||
|
|
458645101b | ||
|
|
1e306012ec | ||
|
|
db2c198feb | ||
|
|
71a901a24e | ||
|
|
f4ea34e63b | ||
|
|
0d54b88ab2 | ||
|
|
da0bd14bf3 | ||
|
|
6ce746b9ea | ||
|
|
02355696ff | ||
|
|
38254125c9 | ||
|
|
e5b3363ecf | ||
|
|
6c3eb06b65 | ||
|
|
c759e8bb8f | ||
|
|
b83f6c0b3a | ||
|
|
ade92d8ac1 | ||
|
|
08398784e4 | ||
|
|
afea881d90 | ||
|
|
194bba2118 | ||
|
|
a5967e4ecd | ||
|
|
21e22a50c5 | ||
|
|
2f361278d2 | ||
|
|
319cf76417 | ||
|
|
be7b08b50a | ||
|
|
22c01748ce | ||
|
|
02809d5016 | ||
|
|
d21f312936 | ||
|
|
357b041bb4 | ||
|
|
61999a67cd | ||
|
|
8da97a7c6f | ||
|
|
2caa69e0cb | ||
|
|
c5932569f8 | ||
|
|
1921d1a5be | ||
|
|
8745a684ae | ||
|
|
892cd962f8 | ||
|
|
3f543b881d | ||
|
|
4a1d0eb80e | ||
|
|
760ecd71fc | ||
|
|
04f1026cd8 | ||
|
|
b03c4cc62e | ||
|
|
18e9357aaf | ||
|
|
46b8260693 | ||
|
|
d5bd3190d4 | ||
|
|
e497b6d458 | ||
|
|
2e4320ee05 | ||
|
|
3406fcdce4 | ||
|
|
14a5ff6747 | ||
|
|
8dbfcd782b | ||
|
|
abf0f90a13 | ||
|
|
4d5c74c019 | ||
|
|
70ff928381 | ||
|
|
b48ab79a92 | ||
|
|
9a7fbd4f71 | ||
|
|
ef3b4956ad | ||
|
|
fd4642d827 | ||
|
|
6dd248e527 | ||
|
|
7d00c3646a | ||
|
|
e355e12385 | ||
|
|
34b31c0146 | ||
|
|
3934fa019e | ||
|
|
dc53e96f92 | ||
|
|
7fcf6f9f79 | ||
|
|
bd48ab23c3 | ||
|
|
4e28ba73bb | ||
|
|
16cb37ecd0 | ||
|
|
d4d630b2e9 | ||
|
|
2ff27cdd63 | ||
|
|
2f81167164 | ||
|
|
6897c5d41f | ||
|
|
233450d850 | ||
|
|
7428a8fa63 | ||
|
|
18359d7871 | ||
|
|
df12a58e3d | ||
|
|
4b3d124b5a | ||
|
|
51e941e7b5 | ||
|
|
62ea6f316f | ||
|
|
4cb9b3a85b | ||
|
|
806ab8ea46 | ||
|
|
582a8fe7fd | ||
|
|
08ca8b54b1 | ||
|
|
abafbef985 | ||
|
|
06863ca9c6 | ||
|
|
e49b8981dd | ||
|
|
2e91557c28 | ||
|
|
4d4eab8b1c | ||
|
|
4d4ae9374b | ||
|
|
b8e20b412c | ||
|
|
e36f3c5b10 | ||
|
|
8a55f831f4 | ||
|
|
0dcc9be5c1 | ||
|
|
5ee00a8df7 | ||
|
|
1af3d3f18b | ||
|
|
f54248c0a7 | ||
|
|
2911c0e1c4 | ||
|
|
16d35c1489 | ||
|
|
cd82a8585a | ||
|
|
6927fc80c3 | ||
|
|
89a95d6445 | ||
|
|
f9192e27fa | ||
|
|
ba5e955ccb | ||
|
|
fae3e46a59 | ||
|
|
3777074e84 | ||
|
|
5310a3cc1d | ||
|
|
1509c4ffba | ||
|
|
71ea2b582c | ||
|
|
219098c182 | ||
|
|
35b3ddd61f | ||
|
|
a892b79dba | ||
|
|
cd22a1846f | ||
|
|
eadcdab8e7 | ||
|
|
46ffd1c29a |
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -2,3 +2,4 @@
|
|||||||
.gitignore export-ignore
|
.gitignore export-ignore
|
||||||
.gitattributes export-ignore
|
.gitattributes export-ignore
|
||||||
.commit-template export-ignore
|
.commit-template export-ignore
|
||||||
|
binary/ export-ignore
|
||||||
|
|||||||
151
.gitignore
vendored
151
.gitignore
vendored
@@ -2,7 +2,6 @@
|
|||||||
*build*/
|
*build*/
|
||||||
*flymake*
|
*flymake*
|
||||||
CMakeLists.txt.user*
|
CMakeLists.txt.user*
|
||||||
*.patch
|
|
||||||
*~
|
*~
|
||||||
*.autosave
|
*.autosave
|
||||||
doc/_build/*
|
doc/_build/*
|
||||||
@@ -16,3 +15,153 @@ build*
|
|||||||
cscope.*
|
cscope.*
|
||||||
tags
|
tags
|
||||||
t1.cfg
|
t1.cfg
|
||||||
|
|
||||||
|
## Ignore Visual Studio temporary files, build results, and
|
||||||
|
## files generated by popular Visual Studio add-ons.
|
||||||
|
|
||||||
|
# User-specific files
|
||||||
|
*.suo
|
||||||
|
*.user
|
||||||
|
*.sln.docstates
|
||||||
|
|
||||||
|
# Build results
|
||||||
|
[Dd]ebug/
|
||||||
|
[Dd]ebugPublic/
|
||||||
|
[Rr]elease/
|
||||||
|
[Rr]eleases/
|
||||||
|
x64/
|
||||||
|
x86/
|
||||||
|
build/
|
||||||
|
bld/
|
||||||
|
[Bb]in/
|
||||||
|
[Oo]bj/
|
||||||
|
|
||||||
|
# Roslyn cache directories
|
||||||
|
*.ide/
|
||||||
|
|
||||||
|
# MSTest test Results
|
||||||
|
[Tt]est[Rr]esult*/
|
||||||
|
[Bb]uild[Ll]og.*
|
||||||
|
|
||||||
|
#NUNIT
|
||||||
|
*.VisualState.xml
|
||||||
|
TestResult.xml
|
||||||
|
|
||||||
|
# Build Results of an ATL Project
|
||||||
|
[Dd]ebugPS/
|
||||||
|
[Rr]eleasePS/
|
||||||
|
dlldata.c
|
||||||
|
|
||||||
|
*_i.c
|
||||||
|
*_p.c
|
||||||
|
*_i.h
|
||||||
|
*.ilk
|
||||||
|
*.meta
|
||||||
|
*.obj
|
||||||
|
*.pch
|
||||||
|
*.pdb
|
||||||
|
*.pgc
|
||||||
|
*.pgd
|
||||||
|
*.rsp
|
||||||
|
*.sbr
|
||||||
|
*.tlb
|
||||||
|
*.tli
|
||||||
|
*.tlh
|
||||||
|
*.tmp
|
||||||
|
*.tmp_proj
|
||||||
|
*.log
|
||||||
|
*.vspscc
|
||||||
|
*.vssscc
|
||||||
|
.builds
|
||||||
|
*.pidb
|
||||||
|
*.svclog
|
||||||
|
*.scc
|
||||||
|
|
||||||
|
# Mac OS X specific
|
||||||
|
shell_integration/MacOSX/*.xcworkspace/xcuserdata/
|
||||||
|
**/.DS_Store
|
||||||
|
|
||||||
|
# Visual C++ cache files
|
||||||
|
ipch/
|
||||||
|
*.aps
|
||||||
|
*.ncb
|
||||||
|
*.opensdf
|
||||||
|
*.sdf
|
||||||
|
*.cachefile
|
||||||
|
|
||||||
|
# Visual Studio profiler
|
||||||
|
*.psess
|
||||||
|
*.vsp
|
||||||
|
*.vspx
|
||||||
|
|
||||||
|
# TFS 2012 Local Workspace
|
||||||
|
$tf/
|
||||||
|
|
||||||
|
# NCrunch
|
||||||
|
_NCrunch_*
|
||||||
|
.*crunch*.local.xml
|
||||||
|
|
||||||
|
# Web workbench (sass)
|
||||||
|
.sass-cache/
|
||||||
|
|
||||||
|
# Installshield output folder
|
||||||
|
[Ee]xpress/
|
||||||
|
|
||||||
|
# Click-Once directory
|
||||||
|
publish/
|
||||||
|
|
||||||
|
# Publish Web Output
|
||||||
|
*.[Pp]ublish.xml
|
||||||
|
*.azurePubxml
|
||||||
|
## TODO: Comment the next line if you want to checkin your
|
||||||
|
## web deploy settings but do note that will include unencrypted
|
||||||
|
## passwords
|
||||||
|
*.pubxml
|
||||||
|
|
||||||
|
# NuGet Packages
|
||||||
|
packages/*
|
||||||
|
*.nupkg
|
||||||
|
## TODO: If the tool you use requires repositories.config
|
||||||
|
## uncomment the next line
|
||||||
|
#!packages/repositories.config
|
||||||
|
|
||||||
|
# Enable "build/" folder in the NuGet Packages folder since
|
||||||
|
# NuGet packages use it for MSBuild targets.
|
||||||
|
# This line needs to be after the ignore of the build folder
|
||||||
|
# (and the packages folder if the line above has been uncommented)
|
||||||
|
!packages/build/
|
||||||
|
|
||||||
|
# Windows Store app package directory
|
||||||
|
AppPackages/
|
||||||
|
|
||||||
|
# Others
|
||||||
|
sql/
|
||||||
|
*.Cache
|
||||||
|
ClientBin/
|
||||||
|
[Ss]tyle[Cc]op.*
|
||||||
|
~$*
|
||||||
|
*~
|
||||||
|
*.dbmdl
|
||||||
|
*.dbproj.schemaview
|
||||||
|
*.pfx
|
||||||
|
*.publishsettings
|
||||||
|
node_modules/
|
||||||
|
|
||||||
|
# RIA/Silverlight projects
|
||||||
|
Generated_Code/
|
||||||
|
|
||||||
|
# Backup & report files from converting an old project file
|
||||||
|
# to a newer Visual Studio version. Backup files are not needed,
|
||||||
|
# because we have git ;-)
|
||||||
|
_UpgradeReport_Files/
|
||||||
|
Backup*/
|
||||||
|
UpgradeLog*.XML
|
||||||
|
UpgradeLog*.htm
|
||||||
|
|
||||||
|
# SQL Server files
|
||||||
|
*.mdf
|
||||||
|
*.ldf
|
||||||
|
|
||||||
|
# Microsoft Fakes
|
||||||
|
FakesAssemblies/
|
||||||
|
|
||||||
|
|||||||
6
.gitmodules
vendored
6
.gitmodules
vendored
@@ -4,3 +4,9 @@
|
|||||||
[submodule "src/3rdparty/qtmacgoodies"]
|
[submodule "src/3rdparty/qtmacgoodies"]
|
||||||
path = src/3rdparty/qtmacgoodies
|
path = src/3rdparty/qtmacgoodies
|
||||||
url = git://github.com/shadone/qtmacgoodies.git
|
url = git://github.com/shadone/qtmacgoodies.git
|
||||||
|
[submodule "binary"]
|
||||||
|
path = binary
|
||||||
|
url = git://github.com/owncloud/owncloud-client-binary.git
|
||||||
|
[submodule "src/3rdparty/libcrashreporter-qt"]
|
||||||
|
path = src/3rdparty/libcrashreporter-qt
|
||||||
|
url = git://github.com/dschmidt/libcrashreporter-qt.git
|
||||||
|
|||||||
@@ -1,10 +1,7 @@
|
|||||||
|
|
||||||
cmake_minimum_required(VERSION 2.6)
|
cmake_minimum_required(VERSION 2.6)
|
||||||
project(mirall)
|
cmake_policy(VERSION 2.8.0)
|
||||||
set(PACKAGE "mirall")
|
|
||||||
set( CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules )
|
|
||||||
|
|
||||||
include(Warnings)
|
project(client)
|
||||||
|
|
||||||
set(OEM_THEME_DIR "" CACHE STRING "Define directory containing a custom theme")
|
set(OEM_THEME_DIR "" CACHE STRING "Define directory containing a custom theme")
|
||||||
if ( EXISTS ${OEM_THEME_DIR}/OEM.cmake )
|
if ( EXISTS ${OEM_THEME_DIR}/OEM.cmake )
|
||||||
@@ -12,15 +9,38 @@ if ( EXISTS ${OEM_THEME_DIR}/OEM.cmake )
|
|||||||
else ()
|
else ()
|
||||||
include ( ${CMAKE_SOURCE_DIR}/OWNCLOUD.cmake )
|
include ( ${CMAKE_SOURCE_DIR}/OWNCLOUD.cmake )
|
||||||
endif()
|
endif()
|
||||||
|
# need this logic to not mess with re/uninstallations via macosx.pkgproj
|
||||||
|
if(${APPLICATION_REV_DOMAIN} STREQUAL "com.owncloud.desktopclient")
|
||||||
|
set(APPLICATION_REV_DOMAIN_INSTALLER "com.ownCloud.client")
|
||||||
|
else()
|
||||||
|
set(APPLICATION_REV_DOMAIN_INSTALLER ${APPLICATION_REV_DOMAIN})
|
||||||
|
endif()
|
||||||
|
|
||||||
if (NOT DEFINED APPLICATION_SHORTNAME)
|
if (NOT DEFINED APPLICATION_SHORTNAME)
|
||||||
set ( APPLICATION_SHORTNAME ${APPLICATION_NAME} )
|
set ( APPLICATION_SHORTNAME ${APPLICATION_NAME} )
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
set(PACKAGE "${APPLICATION_SHORTNAME}-client")
|
||||||
|
set( CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules )
|
||||||
|
|
||||||
|
if(NOT CRASHREPORTER_EXECUTABLE)
|
||||||
|
set(CRASHREPORTER_EXECUTABLE "${APPLICATION_EXECUTABLE}_crash_reporter")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(Warnings)
|
||||||
|
|
||||||
include(${CMAKE_SOURCE_DIR}/VERSION.cmake)
|
include(${CMAKE_SOURCE_DIR}/VERSION.cmake)
|
||||||
configure_file( ${CMAKE_SOURCE_DIR}/src/mirall/version.h.in "${CMAKE_CURRENT_BINARY_DIR}/src/mirall/version.h" )
|
|
||||||
include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR} "${CMAKE_CURRENT_BINARY_DIR}/src/mirall/")
|
include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR} "${CMAKE_CURRENT_BINARY_DIR}/src/mirall/")
|
||||||
|
|
||||||
|
# disable the crashrepoter if libcrashreporter-qt is not available or we're building for ARM
|
||||||
|
if( CMAKE_SYSTEM_PROCESSOR MATCHES "arm" OR NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/src/3rdparty/libcrashreporter-qt/CMakeLists.txt")
|
||||||
|
set( WITH_CRASHREPORTER OFF )
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT WITH_CRASHREPORTER)
|
||||||
|
message(STATUS "Build of crashreporter disabled.")
|
||||||
|
endif()
|
||||||
|
|
||||||
#####
|
#####
|
||||||
## handle DBUS for Fdo notifications
|
## handle DBUS for Fdo notifications
|
||||||
if( UNIX AND NOT APPLE )
|
if( UNIX AND NOT APPLE )
|
||||||
@@ -36,12 +56,12 @@ include(QtVersionAbstraction)
|
|||||||
setup_qt()
|
setup_qt()
|
||||||
|
|
||||||
include(GetGitRevisionDescription)
|
include(GetGitRevisionDescription)
|
||||||
|
|
||||||
get_git_head_revision(GIT_REFSPEC GIT_SHA1)
|
get_git_head_revision(GIT_REFSPEC GIT_SHA1)
|
||||||
|
|
||||||
# if we cannot get it from git, directly try .tag (packages)
|
# if we cannot get it from git, directly try .tag (packages)
|
||||||
# this will work if the tar balls have been properly created
|
# this will work if the tar balls have been properly created
|
||||||
# via git-archive.
|
# via git-archive.
|
||||||
if (GIT_SHA1)
|
|
||||||
if (${GIT_SHA1} STREQUAL "GITDIR-NOTFOUND")
|
if (${GIT_SHA1} STREQUAL "GITDIR-NOTFOUND")
|
||||||
file(READ ${CMAKE_SOURCE_DIR}/.tag sha1_candidate)
|
file(READ ${CMAKE_SOURCE_DIR}/.tag sha1_candidate)
|
||||||
string(REPLACE "\n" "" sha1_candidate ${sha1_candidate})
|
string(REPLACE "\n" "" sha1_candidate ${sha1_candidate})
|
||||||
@@ -50,7 +70,7 @@ if (${GIT_SHA1} STREQUAL "GITDIR-NOTFOUND")
|
|||||||
set (GIT_SHA1 "${sha1_candidate}")
|
set (GIT_SHA1 "${sha1_candidate}")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
endif()
|
message(STATUS "GIT_SHA1 ${GIT_SHA1}")
|
||||||
|
|
||||||
set(SYSCONFDIR ${SYSCONF_INSTALL_DIR})
|
set(SYSCONFDIR ${SYSCONF_INSTALL_DIR})
|
||||||
set(DATADIR ${DATA_INSTALL_DIR})
|
set(DATADIR ${DATA_INSTALL_DIR})
|
||||||
@@ -98,7 +118,27 @@ endif()
|
|||||||
#if( UNIX AND NOT APPLE ) # Fdo notifications
|
#if( UNIX AND NOT APPLE ) # Fdo notifications
|
||||||
# find_package(Qt4 4.7.0 COMPONENTS QtDBus REQUIRED )
|
# find_package(Qt4 4.7.0 COMPONENTS QtDBus REQUIRED )
|
||||||
#endif()
|
#endif()
|
||||||
find_package(Neon REQUIRED)
|
|
||||||
|
|
||||||
|
set(USE_NEON TRUE)
|
||||||
|
if(HAVE_QT5)
|
||||||
|
message(STATUS "Using Qt ${Qt5Core_VERSION_MAJOR}.${Qt5Core_VERSION_MINOR}.x")
|
||||||
|
if (${Qt5Core_VERSION_MAJOR} EQUAL "5")
|
||||||
|
if (${Qt5Core_VERSION_MINOR} EQUAL "4" OR ${Qt5Core_VERSION_MINOR} GREATER 4)
|
||||||
|
message(STATUS "We would not require Neon in this setup, compile without!")
|
||||||
|
set(USE_NEON FALSE)
|
||||||
|
else()
|
||||||
|
message(STATUS "Still requiring Neon with this Qt version :-( Qt 5.4 is better!")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
message(STATUS "If possible compile me with Qt 5.4 which is much faster/better.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (USE_NEON)
|
||||||
|
find_package(Neon REQUIRED)
|
||||||
|
endif(USE_NEON)
|
||||||
|
find_package(OpenSSL 1.0.0 REQUIRED)
|
||||||
|
|
||||||
if(NOT TOKEN_AUTH_ONLY)
|
if(NOT TOKEN_AUTH_ONLY)
|
||||||
if (Qt5Core_DIR)
|
if (Qt5Core_DIR)
|
||||||
@@ -108,7 +148,10 @@ if(NOT TOKEN_AUTH_ONLY)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
Find_package(Sparkle)
|
if(APPLE)
|
||||||
|
find_package(Sparkle)
|
||||||
|
endif(APPLE)
|
||||||
|
|
||||||
if(UNIX)
|
if(UNIX)
|
||||||
find_package(INotify REQUIRED)
|
find_package(INotify REQUIRED)
|
||||||
else()
|
else()
|
||||||
@@ -118,6 +161,12 @@ find_package(Sphinx)
|
|||||||
find_package(PdfLatex)
|
find_package(PdfLatex)
|
||||||
|
|
||||||
|
|
||||||
|
find_package(SQLite3 3.8.0 REQUIRED)
|
||||||
|
# On some OS, we want to use our own, not the system sqlite
|
||||||
|
if (USE_OUR_OWN_SQLITE3)
|
||||||
|
include_directories(BEFORE ${SQLITE3_INCLUDE_DIR})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
configure_file(config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
|
configure_file(config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
|
||||||
|
|
||||||
@@ -131,13 +180,17 @@ if( WIN32 )
|
|||||||
add_definitions( -D__USE_MINGW_ANSI_STDIO=1 )
|
add_definitions( -D__USE_MINGW_ANSI_STDIO=1 )
|
||||||
endif( WIN32 )
|
endif( WIN32 )
|
||||||
|
|
||||||
# Handle Translations, pick all mirall_* files from trans directory.
|
# Handle Translations, pick all client_* files from trans directory.
|
||||||
file( GLOB TRANS_FILES ${CMAKE_SOURCE_DIR}/translations/mirall_*.ts)
|
file( GLOB TRANS_FILES ${CMAKE_SOURCE_DIR}/translations/client_*.ts)
|
||||||
set(TRANSLATIONS ${TRANS_FILES})
|
set(TRANSLATIONS ${TRANS_FILES})
|
||||||
|
|
||||||
add_subdirectory(csync)
|
add_subdirectory(csync)
|
||||||
add_subdirectory(src)
|
add_subdirectory(src)
|
||||||
|
if(NOT BUILD_LIBRARIES_ONLY)
|
||||||
|
add_subdirectory(shell_integration)
|
||||||
add_subdirectory(doc)
|
add_subdirectory(doc)
|
||||||
|
add_subdirectory(admin)
|
||||||
|
endif(NOT BUILD_LIBRARIES_ONLY)
|
||||||
|
|
||||||
if(UNIT_TESTING)
|
if(UNIT_TESTING)
|
||||||
include(CTest)
|
include(CTest)
|
||||||
@@ -146,7 +199,8 @@ if(UNIT_TESTING)
|
|||||||
endif(UNIT_TESTING)
|
endif(UNIT_TESTING)
|
||||||
|
|
||||||
if(BUILD_OWNCLOUD_OSX_BUNDLE)
|
if(BUILD_OWNCLOUD_OSX_BUNDLE)
|
||||||
configure_file(sync-exclude.lst ${OWNCLOUD_OSX_BUNDLE}/Contents/Resources/sync-exclude.lst COPYONLY)
|
install(FILES sync-exclude.lst DESTINATION ${OWNCLOUD_OSX_BUNDLE}/Contents/Resources/)
|
||||||
else()
|
else()
|
||||||
install( FILES sync-exclude.lst DESTINATION ${SYSCONFDIR}/${APPLICATION_SHORTNAME} )
|
install( FILES sync-exclude.lst DESTINATION ${SYSCONFDIR}/${APPLICATION_SHORTNAME} )
|
||||||
|
configure_file(sync-exclude.lst bin/sync-exclude.lst COPYONLY)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ direct these to the [mailing list][mailinglist] or our [forum][forum].
|
|||||||
We are also available on [IRC][irc].
|
We are also available on [IRC][irc].
|
||||||
|
|
||||||
### Bug Reporting Guidelines
|
### Bug Reporting Guidelines
|
||||||
* Important: Report the issue using our [template][template], it includes all the
|
* __Important__: Report the issue using our [template][template], it includes all the
|
||||||
informations we need to track down the issue.
|
informations we need to track down the issue.
|
||||||
* This repository is *only* for issues within the ownCloud desktop client.
|
* This repository is *only* for issues within the ownCloud desktop client.
|
||||||
Issues in other compontents should be reported in their own repositores:
|
Issues in other compontents should be reported in their own repositores:
|
||||||
@@ -22,7 +22,7 @@ If your issue appears to be a bug, and hasn't been reported, open a new issue.
|
|||||||
Help us to maximize the effort we can spend fixing issues and adding new
|
Help us to maximize the effort we can spend fixing issues and adding new
|
||||||
features, by not reporting duplicate issues.
|
features, by not reporting duplicate issues.
|
||||||
|
|
||||||
[template]: https://raw.github.com/owncloud/mirall/master/issue_template.md
|
[template]: https://raw.github.com/owncloud/client/master/issue_template.md
|
||||||
[mailinglist]: https://mail.kde.org/mailman/listinfo/owncloud
|
[mailinglist]: https://mail.kde.org/mailman/listinfo/owncloud
|
||||||
[forum]: http://forum.owncloud.org/
|
[forum]: http://forum.owncloud.org/
|
||||||
[irc]: http://webchat.freenode.net/?channels=owncloud&uio=d4
|
[irc]: http://webchat.freenode.net/?channels=owncloud&uio=d4
|
||||||
@@ -31,16 +31,16 @@ features, by not reporting duplicate issues.
|
|||||||
|
|
||||||
Thanks for wanting to contribute source code to ownCloud. That's great!
|
Thanks for wanting to contribute source code to ownCloud. That's great!
|
||||||
|
|
||||||
Before we're able to merge your code to mirall, you need to sign
|
Before we're able to merge your code to ownCloud Desktop Client, you need to sign
|
||||||
our [Contributor Agreement][agreement].
|
our [Contributor Agreement][agreement].
|
||||||
|
|
||||||
Please read the [Desktop Client Manual][mirallman] and the [Developer
|
Please read the [Desktop Client Manual][desktopman] and the [Developer
|
||||||
Manuals][devmanual] to get useful infos like how to create your first
|
Manuals][devmanual] to get useful infos like how to create your first
|
||||||
application or how to test the ownCloud code with phpunit.
|
application or how to test the ownCloud code with phpunit.
|
||||||
|
|
||||||
[agreement]: http://owncloud.org/about/contributor-agreement/
|
[agreement]: http://owncloud.org/about/contributor-agreement/
|
||||||
[devmanual]: http://owncloud.org/dev/
|
[devmanual]: http://owncloud.org/dev
|
||||||
[mirallman]: http://doc.owncloud.org/desktop/1.1/
|
[desktopman]: http://doc.owncloud.org/desktop
|
||||||
|
|
||||||
## Translations
|
## Translations
|
||||||
Please submit translations via [Transifex][transifex].
|
Please submit translations via [Transifex][transifex].
|
||||||
|
|||||||
@@ -17,8 +17,10 @@ else ()
|
|||||||
include ( "${CMAKE_SOURCE_DIR}/OWNCLOUD.cmake" )
|
include ( "${CMAKE_SOURCE_DIR}/OWNCLOUD.cmake" )
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
set( CRASHREPORTER_EXECUTABLE @CRASHREPORTER_EXECUTABLE@)
|
||||||
|
|
||||||
set( BUILD_OWNCLOUD_OSX_BUNDLE @BUILD_OWNCLOUD_OSX_BUNDLE@)
|
set( BUILD_OWNCLOUD_OSX_BUNDLE @BUILD_OWNCLOUD_OSX_BUNDLE@)
|
||||||
if(APPLE AND NOT BUILD_OWNCLOUD_OSX_BUNDLE)
|
if(APPLE AND NOT BUILD_OWNCLOUD_OSX_BUNDLE)
|
||||||
message( FATAL_ERROR "You're trying to build a bundle although you haven't built mirall in bundle mode.\n Add -DBUILD_OWNCLOUD_OSX_BUNDLE=ON")
|
message( FATAL_ERROR "You're trying to build a bundle although you haven't built the client in bundle mode.\n Add -DBUILD_OWNCLOUD_OSX_BUNDLE=ON")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|||||||
82
ChangeLog
82
ChangeLog
@@ -1,5 +1,87 @@
|
|||||||
ChangeLog
|
ChangeLog
|
||||||
=========
|
=========
|
||||||
|
version 1.7.1 (release 2014-12-18)
|
||||||
|
* Documentation fixes and updates
|
||||||
|
* Nautilus Python plugin fixed for Python 3
|
||||||
|
* GUI wording fixes plus improved log messages
|
||||||
|
* Fix hidning of the database files in the sync directories
|
||||||
|
* Compare http download size with the header value to avoid broken
|
||||||
|
downloads, bug #2528
|
||||||
|
* Avoid initial ETag fetch job at startup, which is not needed.
|
||||||
|
* Add chunk size http header to PUT requests
|
||||||
|
* Fixed deteteCookie method of our CookieJar, fix for Shibboleth
|
||||||
|
* Added fallback for distros where XDG_RUNTIME_DIR is undefined
|
||||||
|
* Fix the setup wizard, bug #1989, #2264
|
||||||
|
* Fix scheduling of ETag check jobs, bug #2553
|
||||||
|
* Fix to avoid syncing more than one folder at a time, bug #2407
|
||||||
|
* Use fife minutes timeout for all network jobs
|
||||||
|
* Cleanup for Folderwizard wording
|
||||||
|
* Improve journal check: Remove corrupted journal files, bug #2547
|
||||||
|
* Fix item count in progress dialog for deletes, bug #1132
|
||||||
|
* Display correct file count on deletion (#1132)
|
||||||
|
* Fix reinitializing the folder using the wizard in certain cases (#2606)
|
||||||
|
* Mac OS: Fixed branding of the pkg file
|
||||||
|
* Mac OS: Fix display of overlay icons in certain situations (#1132)
|
||||||
|
* Mac OS: Use a bundled version of OpenSSL (#764, #2600, #2510)
|
||||||
|
* Win32: improved filesystem watcher
|
||||||
|
* Win32: Improve threading with shell integration
|
||||||
|
* Win32: Upgraded to OpenSSL 1.0.1j
|
||||||
|
* Win32: Improve reliability of Installer, fix removal of Shell Extensions
|
||||||
|
|
||||||
|
version 1.7.0 (release 2014-11-07)
|
||||||
|
|
||||||
|
* oC7 Sharing: Handle new sharing options of ownCloud 7 correctly.
|
||||||
|
* Added Selective sync: Ability to unselect server folders which are
|
||||||
|
excluded from syncing, plus GUI and setup GUI
|
||||||
|
* Added overlay icons for Windows Explorer, Mac OS Finder and GNOME Nautilus.
|
||||||
|
Information is provided by the client via a local socket / named pipe API
|
||||||
|
which provides information about the sync status of files.
|
||||||
|
* Improved local change detection: consider file size, detect files
|
||||||
|
with ongoing changes and do not upload immediately
|
||||||
|
* Improved HTTP request timeout handler: all successful requests reset
|
||||||
|
the timeout counter
|
||||||
|
* Improvements for syncing command line tool: netrc support, improved
|
||||||
|
SSL support, non interactive mode
|
||||||
|
* Permission system: ownCloud 7 delivers file and folder permissions,
|
||||||
|
added ability to deal with it for shared folders and more.
|
||||||
|
* Ignore handling: Do not recurse into ignored or excluded directories
|
||||||
|
* Major sync journal database improvements for more stability and performance
|
||||||
|
* New library interface to sqlite3
|
||||||
|
* Improve "resync handling" if errors occur
|
||||||
|
* Blacklist improvements
|
||||||
|
* Improved logging: more useful meta info, removed noise
|
||||||
|
* Updated to latest Qt5 versions on Windows and OS X
|
||||||
|
* Fixed data loss when renaming a download temporary fails and there was
|
||||||
|
a conflict at the same time.
|
||||||
|
* Fixed missing warnings about reusing a sync folder when the back button
|
||||||
|
was used in the advanced folder setup wizard.
|
||||||
|
* The 'Retry Sync' button now also restarts all downloads.
|
||||||
|
* Clean up temporary downloads and some extra database files when wiping a
|
||||||
|
folder.
|
||||||
|
* OS X: Sparkle update to provide pkg format properly
|
||||||
|
* OS X: Change distribution format from dmg to pkg with new installer.
|
||||||
|
* Windows: Fix handling of filenames with trailing dot or space
|
||||||
|
* Windows: Don't use the wrong way to get file mtimes in the legacy propagator.
|
||||||
|
|
||||||
|
version 1.6.4 (release 2014-10-22)
|
||||||
|
* Fix startup logic, fixes bug #1989
|
||||||
|
* Fix raise dialog on X11
|
||||||
|
* Win32: fix overflow when computing the size of file > 4GiB
|
||||||
|
* Use a fixed function to get files modification time, the
|
||||||
|
original one was broken for certain timezone issues, see
|
||||||
|
core bug #9781 for details
|
||||||
|
* Added some missing copyright headers
|
||||||
|
* Avoid data corruption due to wrong error handling, bug #2280
|
||||||
|
* Do improved request timeout handling to reduce the number of
|
||||||
|
timed out jobs, bug #2155
|
||||||
|
version 1.6.3 (release 2014-09-03)
|
||||||
|
* Fixed updater on OS X
|
||||||
|
* Fixed memory leak in SSL button that could lead to quick memory draining
|
||||||
|
* Fixed upload problem with files >4 GB
|
||||||
|
* MacOSX, Linux: Bring Settings window to front properly
|
||||||
|
* Branded clients: If no configuration is detected, try to import the data
|
||||||
|
from a previously configured community edition.
|
||||||
|
|
||||||
version 1.6.2 (release 2014-07-28 )
|
version 1.6.2 (release 2014-07-28 )
|
||||||
* Limit the HTTP buffer size when downloading to limit memory consumption.
|
* Limit the HTTP buffer size when downloading to limit memory consumption.
|
||||||
* Another small mem leak fixed in HTTP Credentials.
|
* Another small mem leak fixed in HTTP Credentials.
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
set( APPLICATION_NAME "ownCloud" )
|
set( APPLICATION_NAME "ownCloud" )
|
||||||
#set( APPLICATION_SHORTNAME ${APPLICATION_NAME} )
|
|
||||||
set( APPLICATION_EXECUTABLE "owncloud" )
|
set( APPLICATION_EXECUTABLE "owncloud" )
|
||||||
set( APPLICATION_DOMAIN "owncloud.com" )
|
set( APPLICATION_DOMAIN "owncloud.com" )
|
||||||
set( APPLICATION_VENDOR "ownCloud" )
|
set( APPLICATION_VENDOR "ownCloud" )
|
||||||
@@ -8,5 +7,12 @@ set( APPLICATION_UPDATE_URL "https://updates.owncloud.com/client/" CACHE string
|
|||||||
set( THEME_CLASS "ownCloudTheme" )
|
set( THEME_CLASS "ownCloudTheme" )
|
||||||
set( APPLICATION_REV_DOMAIN "com.owncloud.desktopclient" )
|
set( APPLICATION_REV_DOMAIN "com.owncloud.desktopclient" )
|
||||||
set( WIN_SETUP_BITMAP_PATH "${CMAKE_SOURCE_DIR}/admin/win/nsi" )
|
set( WIN_SETUP_BITMAP_PATH "${CMAKE_SOURCE_DIR}/admin/win/nsi" )
|
||||||
|
|
||||||
|
set( MAC_INSTALLER_BACKGROUND_FILE "${CMAKE_SOURCE_DIR}/admin/osx/installer-background.png" CACHE STRING "The MacOSX installer background image")
|
||||||
|
|
||||||
# set( THEME_INCLUDE "${OEM_THEME_DIR}/mytheme.h" )
|
# set( THEME_INCLUDE "${OEM_THEME_DIR}/mytheme.h" )
|
||||||
# set( APPLICATION_LICENSE "${OEM_THEME_DIR}/license.txt )
|
# set( APPLICATION_LICENSE "${OEM_THEME_DIR}/license.txt )
|
||||||
|
|
||||||
|
option( WITH_CRASHREPORTER "Build crashreporter" OFF )
|
||||||
|
set( CRASHREPORTER_SUBMIT_URL "https://crash-reports.owncloud.org/submit" CACHE string "URL for crash repoter" )
|
||||||
|
set( CRASHREPORTER_ICON ":/owncloud-icon.png" )
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ if(APPLE)
|
|||||||
set( CPACK_GENERATOR "DragNDrop" )
|
set( CPACK_GENERATOR "DragNDrop" )
|
||||||
set( CPACK_SOURCE_GENERATOR "")
|
set( CPACK_SOURCE_GENERATOR "")
|
||||||
set( CPACK_PACKAGE_FILE_NAME ${APPLICATION_NAME}-${CPACK_PACKAGE_VERSION} )
|
set( CPACK_PACKAGE_FILE_NAME ${APPLICATION_NAME}-${CPACK_PACKAGE_VERSION} )
|
||||||
set( CPACK_PACKAGE_ICON ${CMAKE_BINARY_DIR}/src/ownCloud.icns)
|
set( CPACK_PACKAGE_ICON ${CMAKE_BINARY_DIR}/src/gui/ownCloud.icns)
|
||||||
|
|
||||||
set( CPACK_DMG_DS_STORE "${CMAKE_SOURCE_DIR}/admin/osx/DS_Store.in")
|
set( CPACK_DMG_DS_STORE "${CMAKE_SOURCE_DIR}/admin/osx/DS_Store.in")
|
||||||
# set( CPACK_DMG_BACKGROUND_IMAGE "${CMAKE_SOURCE_DIR}/admin/osx/DMGBackground.png" )
|
# set( CPACK_DMG_BACKGROUND_IMAGE "${CMAKE_SOURCE_DIR}/admin/osx/DMGBackground.png" )
|
||||||
|
|||||||
44
README.md
44
README.md
@@ -1,9 +1,9 @@
|
|||||||
# Mirall
|
# ownCloud Desktop Client
|
||||||
|
|
||||||
## Introduction
|
## Introduction
|
||||||
|
|
||||||
Mirall is a tool to synchronize files from ownCloud Server with your computer.
|
The ownCloud Desktop Client is a tool to synchronize files from ownCloud Server
|
||||||
It uses OCSync as its syncing backend.
|
with your computer.
|
||||||
|
|
||||||
## Download
|
## Download
|
||||||
|
|
||||||
@@ -13,19 +13,45 @@ It uses OCSync as its syncing backend.
|
|||||||
|
|
||||||
### Source code
|
### Source code
|
||||||
|
|
||||||
* https://github.com/owncloud/mirall
|
Tehe ownCloud Desktop Client is developed in Git. Since Git makes it easy to
|
||||||
|
fork and improve the source code and to adapt it to your need, many copies
|
||||||
|
can be found on the Internet, in particular on GitHub. However, the
|
||||||
|
authoritative repository maintained by the developers is located at
|
||||||
|
https://github.com/owncloud/client.
|
||||||
|
|
||||||
## Building the source code
|
## Building the source code
|
||||||
|
|
||||||
Please refer to doc/building.rst, or
|
[Building the Client](http://doc.owncloud.org/desktop/1.7/building.html)
|
||||||
[Building the Client](http://doc.owncloud.org/desktop/1.5/building.html)
|
in the ownCloud Desktop Client manual.
|
||||||
in the ownCloud client manual.
|
|
||||||
|
|
||||||
## Authors
|
## Maintainers and Contributors
|
||||||
|
|
||||||
|
The maintainers of this repository are:
|
||||||
|
|
||||||
* Duncan Mac-Vicar P. <duncan@kde.org> (original Mirall author)
|
|
||||||
* Klaas Freitag <freitag@owncloud.com>
|
* Klaas Freitag <freitag@owncloud.com>
|
||||||
* Daniel Molkentin <danimo@owncloud.com>
|
* Daniel Molkentin <danimo@owncloud.com>
|
||||||
|
* Markus Goetz <guruz@owncloud.com>
|
||||||
|
* Olivier Goffart <ogoffart@owncloud.com>
|
||||||
|
|
||||||
|
ownCloud Desktop Client is developed by the ownCloud community and receives
|
||||||
|
patches from a variety of authors.
|
||||||
|
|
||||||
|
## Reporting issues and contributing
|
||||||
|
|
||||||
|
If you find any bugs or have any suggestion for improvement, please
|
||||||
|
file an issue at https://github.com/owncloud/client/issues. Do not
|
||||||
|
contact the authors directly by mail, as this increases the chance
|
||||||
|
of your report being lost.
|
||||||
|
|
||||||
|
If you created a patch, please submit a [Pull
|
||||||
|
Request](https://github.com/owncloud/client/pulls). For non-trivial
|
||||||
|
patches, we need you to sign the [Contributor
|
||||||
|
Agreement](https://owncloud.org/contribute/agreement) before
|
||||||
|
we can accept your patch.
|
||||||
|
|
||||||
|
If you want to contact us, e.g. before starting a more complex feature,
|
||||||
|
you can join us at
|
||||||
|
[#owncloud-client-dev](irc://irc.freenode.net/#owncloud-client-dev).
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
set( MIRALL_VERSION_MAJOR 1 )
|
set( MIRALL_VERSION_MAJOR 1 )
|
||||||
set( MIRALL_VERSION_MINOR 6 )
|
set( MIRALL_VERSION_MINOR 8 )
|
||||||
set( MIRALL_VERSION_PATCH 2 )
|
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 "") #e.g. beta1, beta2, rc1
|
set( MIRALL_VERSION_SUFFIX "beta1") #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 )
|
||||||
|
|||||||
2
admin/CMakeLists.txt
Normal file
2
admin/CMakeLists.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
# traverse into osx subdirectory to install and patch the create-pack script
|
||||||
|
add_subdirectory(osx)
|
||||||
16
admin/osx/CMakeLists.txt
Normal file
16
admin/osx/CMakeLists.txt
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
|
||||||
|
# Check if varialbe MAC_INSTALLER_BACKGROUND_FILE is defined. That might come
|
||||||
|
# from the OEM.cmake for branded clients or from OWNCLOUD.cmake for the non
|
||||||
|
# branded client.
|
||||||
|
# Make sure that the MAC_INSTALLER_BACKGROUND_FILE contains the full path, ie.
|
||||||
|
# includes CMAKE_SOURCE_DIR or so.
|
||||||
|
|
||||||
|
if (DEFINED MAC_INSTALLER_BACKGROUND_FILE )
|
||||||
|
set(MAC_INSTALLER_DO_CUSTOM_BACKGROUND "1")
|
||||||
|
else()
|
||||||
|
set(MAC_INSTALLER_DO_CUSTOM_BACKGROUND "0")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
configure_file(create_mac_pkg.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/create_mac.sh)
|
||||||
|
configure_file(macosx.pkgproj ${CMAKE_CURRENT_BINARY_DIR}/macosx.pkgproj)
|
||||||
|
configure_file(pre_install.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/pre_install.sh)
|
||||||
74
admin/osx/create_mac_pkg.sh.cmake
Executable file
74
admin/osx/create_mac_pkg.sh.cmake
Executable file
@@ -0,0 +1,74 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Script to create the Mac installer using the packages tool from
|
||||||
|
# http://s.sudre.free.fr/Software/Packages/about.html
|
||||||
|
#
|
||||||
|
|
||||||
|
[ "$#" -lt 2 ] && echo "Usage: create_mac_pkg.sh <CMAKE_INSTALL_DIR> <build dir> <installer sign identity>" && exit
|
||||||
|
|
||||||
|
# the path of installation must be given as parameter
|
||||||
|
if [ -z "$1" ]; then
|
||||||
|
echo "ERROR: Provide the path to CMAKE_INSTALL_DIR to this script as first parameter."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$2" ]; then
|
||||||
|
echo "ERROR: Provide the path to build directory as second parameter."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
install_path="$1"
|
||||||
|
build_path="$2"
|
||||||
|
identity="$3"
|
||||||
|
prjfile=$build_path/admin/osx/macosx.pkgproj
|
||||||
|
|
||||||
|
# The name of the installer package
|
||||||
|
installer="@APPLICATION_NAME@-@MIRALL_VERSION_FULL@@MIRALL_VERSION_SUFFIX@"
|
||||||
|
installer_file="$installer.pkg"
|
||||||
|
installer_file_tar="$installer.pkg.tar"
|
||||||
|
installer_file_tar_bz2="$installer.pkg.tar.bz2"
|
||||||
|
installer_file_tbz="$installer.pkg.tbz"
|
||||||
|
|
||||||
|
# set the installer name to the copied prj config file
|
||||||
|
/usr/local/bin/packagesutil --file $prjfile set project name "$installer"
|
||||||
|
|
||||||
|
# The command line tool of the "Packages" tool, see link above.
|
||||||
|
pkgbuild=/usr/local/bin/packagesbuild
|
||||||
|
|
||||||
|
$pkgbuild -F $install_path $prjfile
|
||||||
|
rc=$?
|
||||||
|
|
||||||
|
if [ $rc == 0 ]; then
|
||||||
|
echo "Successfully created $installer_file"
|
||||||
|
else
|
||||||
|
echo "Failed to create $installer_file"
|
||||||
|
exit 3
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Sign the finished package if desired.
|
||||||
|
if [ ! -z "$identity" ]; then
|
||||||
|
echo "Will try to sign the installer"
|
||||||
|
pushd $install_path
|
||||||
|
productsign --sign "$identity" "$installer_file" "$installer_file.new"
|
||||||
|
mv "$installer_file".new $installer_file
|
||||||
|
popd
|
||||||
|
else
|
||||||
|
echo "No certificate given, will not sign the pkg"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# FIXME: OEMs?
|
||||||
|
# they will need to do their own signing..
|
||||||
|
|
||||||
|
|
||||||
|
# Sparkle wants a tbz, it cannot install raw pkg
|
||||||
|
cd $install_path
|
||||||
|
tar cf "$installer_file_tar" "$installer_file"
|
||||||
|
bzip2 -9 "$installer_file_tar"
|
||||||
|
mv "$installer_file_tar_bz2" "$installer_file_tbz"
|
||||||
|
rc=$?
|
||||||
|
if [ $rc == 0 ]; then
|
||||||
|
echo "Successfully created $installer_file"
|
||||||
|
else
|
||||||
|
echo "Failed to create $installer_file"
|
||||||
|
exit 3
|
||||||
|
fi
|
||||||
BIN
admin/osx/installer-background.png
Normal file
BIN
admin/osx/installer-background.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.2 KiB |
51
admin/osx/installer-background.svg
Normal file
51
admin/osx/installer-background.svg
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
enable-background="new 0 0 595.275 311.111"
|
||||||
|
xml:space="preserve"
|
||||||
|
height="200"
|
||||||
|
width="320"
|
||||||
|
version="1.1"
|
||||||
|
y="0px"
|
||||||
|
x="0px"
|
||||||
|
viewBox="0 0 35 0"
|
||||||
|
id="svg2"
|
||||||
|
inkscape:version="0.48.4 r9939"
|
||||||
|
sodipodi:docname="installer-background.svg"><metadata
|
||||||
|
id="metadata12"><rdf:RDF><cc:Work
|
||||||
|
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||||
|
id="defs10" /><sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1002"
|
||||||
|
id="namedview8"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="0.734375"
|
||||||
|
inkscape:cx="-49.141255"
|
||||||
|
inkscape:cy="236.17459"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="34"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg2"
|
||||||
|
fit-margin-top="0"
|
||||||
|
fit-margin-left="0"
|
||||||
|
fit-margin-right="0"
|
||||||
|
fit-margin-bottom="0" /><path
|
||||||
|
style="text-indent:0;text-transform:none;block-progression:tb;color:#000000;fill:#ffffff;fill-opacity:1;enable-background:accumulate"
|
||||||
|
d="m 75.63384,28.421489 c -29.36582,0 -53.09172,23.724901 -53.09172,53.091701 0,12.1047 4.03087,23.2455 10.82647,32.1667 14.74225,-17.0631 36.50138,-27.8988 60.79508,-27.8988 11.88546,0 23.15644,2.6467 33.31219,7.2871 0.82221,-3.7185 1.24924,-7.5856 1.24924,-11.555 0,-29.3658 -23.72491,-53.091701 -53.09172,-53.091701 z M 6.30358,52.98809 c -15.29297,0 -27.58645,12.3977 -27.58645,27.6906 0,4.9515 1.27738,9.6301 3.53933,13.6373 9.22826,-5.206 19.89756,-8.2239 31.23002,-8.2239 1.09366,0 2.14708,0.039 3.22713,0.1052 -0.12231,-1.5502 -0.20806,-3.103 -0.20806,-4.6844 0,-8.5178 1.85002,-16.6223 5.10106,-23.9429 -4.37708,-2.9351 -9.62115,-4.5803 -15.30284,-4.5803 z m 130.95716,19.0502 c -1.12983,0 -2.21885,0.1381 -3.33122,0.2078 0.48121,3.0338 0.83274,6.097 0.83274,9.2651 0,4.9298 -0.62692,9.6869 -1.7697,14.2616 13.39754,7.4144 24.52385,18.5084 31.8547,31.9586 7.60342,-3.9586 16.08566,-6.4754 25.08804,-7.0787 -2.32015,-27.2093 -24.86184,-48.6137 -52.67416,-48.6137 z m -43.09675,19.7789 c -41.09117,0 -74.32775,33.2333 -74.32775,74.3278 0,41.0911 33.23329,74.3277 74.32775,74.3277 41.09447,0 74.32775,-33.2366 74.32775,-74.3277 0,-41.0945 -33.23657,-74.3278 -74.32775,-74.3278 z m -80.67652,0.3117 c -31.87937,0 -57.67166,25.792 -57.67166,57.6717 0,18.7668 8.94156,35.3802 22.79774,45.9078 5.84147,-11.2667 17.57406,-18.9461 31.1258,-18.9461 1.63789,0 3.21,0.1986 4.78871,0.4169 -0.49554,-3.6054 -0.72871,-7.2937 -0.72871,-11.0346 0,-17.8847 5.82174,-34.4234 15.71907,-47.7819 -5.92466,-7.4133 -10.1643,-16.321 -11.97162,-26.025 -1.33935,-0.092 -2.69673,-0.2078 -4.05979,-0.2078 z m 180.71831,34.3544 c -9.68,0 -18.74781,2.4714 -26.75364,6.6625 4.54607,10.0696 7.07867,21.2422 7.07867,32.9998 0,22.0146 -8.85114,42.0052 -23.21431,56.5275 10.5516,11.7145 25.861,19.0503 42.88961,19.0503 31.87937,0 57.67165,-25.7916 57.67165,-57.6717 0,-31.8793 -25.79195,-57.5664 -57.67165,-57.5664 z m -244.00885,7.5998 c -29.3701,0 -53.19693,23.6164 -53.19693,52.9832 0,29.3669 23.82815,53.1937 53.19364,53.1937 11.17727,0 21.53161,-3.4825 30.08487,-9.369 -3.5344,-5.492 -5.62151,-12.0581 -5.62151,-19.0503 0,-3.6291 0.53552,-7.1158 1.56148,-10.4099 -16.01267,-11.5721 -26.44131,-30.4034 -26.44131,-51.6319 0,-5.394 0.71083,-10.6098 1.97792,-15.6152 -0.52591,-0.013 -1.03171,-0.1052 -1.56152,-0.1052 z m 312.19495,45.5955 c -1.56661,0 -3.08252,0.1789 -4.58026,0.4169 0.0829,1.3242 0.1039,2.6108 0.1039,3.9559 0,16.9326 -6.68118,32.3015 -17.4889,43.7214 5.31706,6.1831 13.12695,10.0976 21.96526,10.0976 16.09849,0 29.14785,-12.9451 29.14785,-29.0439 0,-16.0985 -13.04936,-29.1479 -29.14785,-29.1479 z m -252.64924,3.1229 c -16.09783,0 -29.04395,12.9461 -29.04395,29.044 0,16.0978 12.94612,29.1478 29.04395,29.1478 12.33919,0 22.81287,-7.6994 27.06599,-18.5298 -10.378,-10.57 -17.83675,-24.0544 -21.13213,-39.0363 -1.92854,-0.3985 -3.88588,-0.6247 -5.93386,-0.6247 z"
|
||||||
|
id="path6"
|
||||||
|
inkscape:connector-curvature="0" /></svg>
|
||||||
|
After Width: | Height: | Size: 4.6 KiB |
BIN
admin/osx/installer-background_2x.png
Normal file
BIN
admin/osx/installer-background_2x.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
336
admin/osx/macdeployqt.py
Executable file
336
admin/osx/macdeployqt.py
Executable file
@@ -0,0 +1,336 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
# This file is part of ownCloud.
|
||||||
|
# It was inspired in large part by the macdeploy script in Clementine
|
||||||
|
# and Tomahawk
|
||||||
|
#
|
||||||
|
# ownCloud is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; version 2 of the License.
|
||||||
|
#
|
||||||
|
# ownCLoud is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with ownCloud. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import subprocess
|
||||||
|
import commands
|
||||||
|
import sys
|
||||||
|
from glob import glob
|
||||||
|
|
||||||
|
def QueryQMake(attrib):
|
||||||
|
return subprocess.check_output([qmake_path, '-query', attrib]).rstrip('\n')
|
||||||
|
|
||||||
|
FRAMEWORK_SEARCH_PATH=[
|
||||||
|
'/Library/Frameworks',
|
||||||
|
os.path.join(os.environ['HOME'], 'Library/Frameworks')
|
||||||
|
]
|
||||||
|
|
||||||
|
LIBRARY_SEARCH_PATH=['/usr/local/lib', '.']
|
||||||
|
|
||||||
|
QT_PLUGINS = [
|
||||||
|
'sqldrivers/libqsqlite.dylib',
|
||||||
|
'platforms/libqcocoa.dylib',
|
||||||
|
'imageformats/libqgif.dylib',
|
||||||
|
'imageformats/libqico.dylib',
|
||||||
|
'imageformats/libqjpeg.dylib',
|
||||||
|
'imageformats/libqsvg.dylib',
|
||||||
|
'imageformats/libqmng.dylib',
|
||||||
|
]
|
||||||
|
|
||||||
|
QT_PLUGINS_SEARCH_PATH=[
|
||||||
|
# os.path.join(os.environ['QTDIR'], 'plugins'),
|
||||||
|
'/usr/local/Cellar/qt/5.2.1/plugins',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class Error(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class CouldNotFindQtPluginErrorFindFrameworkError(Error):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class InstallNameToolError(Error):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class CouldNotFindQtPluginError(Error):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class CouldNotFindScriptPluginError(Error):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class CouldNotFindFrameworkError(Error):
|
||||||
|
pass
|
||||||
|
|
||||||
|
if len(sys.argv) < 3:
|
||||||
|
print 'Usage: %s <bundle.app> <path-to-qmake>' % sys.argv[0]
|
||||||
|
exit()
|
||||||
|
|
||||||
|
def is_exe(fpath):
|
||||||
|
return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
|
||||||
|
|
||||||
|
bundle_dir = sys.argv[1]
|
||||||
|
qmake_path = sys.argv[2]
|
||||||
|
|
||||||
|
bundle_name = os.path.basename(bundle_dir).split('.')[0]
|
||||||
|
|
||||||
|
commands = []
|
||||||
|
|
||||||
|
binary_dir = os.path.join(bundle_dir, 'Contents', 'MacOS')
|
||||||
|
frameworks_dir = os.path.join(bundle_dir, 'Contents', 'Frameworks')
|
||||||
|
commands.append(['mkdir', '-p', frameworks_dir])
|
||||||
|
resources_dir = os.path.join(bundle_dir, 'Contents', 'Resources')
|
||||||
|
commands.append(['mkdir', '-p', resources_dir])
|
||||||
|
plugins_dir = os.path.join(bundle_dir, 'Contents', 'PlugIns')
|
||||||
|
binaries = [i for i in glob(os.path.join(bundle_dir, 'Contents', 'MacOS', "*")) if is_exe(i)];
|
||||||
|
|
||||||
|
|
||||||
|
fixed_libraries = []
|
||||||
|
fixed_frameworks = []
|
||||||
|
|
||||||
|
def WriteQtConf():
|
||||||
|
print "Writing qt.conf..."
|
||||||
|
with open(os.path.join(resources_dir, 'qt.conf'), 'w') as f:
|
||||||
|
f.write("[Paths]\nPlugins = PlugIns\n");
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
def GetBrokenLibraries(binary):
|
||||||
|
#print "Checking libs for binary: %s" % binary
|
||||||
|
output = subprocess.Popen(['otool', '-L', binary], stdout=subprocess.PIPE).communicate()[0]
|
||||||
|
broken_libs = {
|
||||||
|
'frameworks': [],
|
||||||
|
'libs': []}
|
||||||
|
for line in [x.split(' ')[0].lstrip() for x in output.split('\n')[1:]]:
|
||||||
|
#print "Checking line: %s" % line
|
||||||
|
if not line: # skip empty lines
|
||||||
|
continue
|
||||||
|
if os.path.basename(binary) == os.path.basename(line):
|
||||||
|
#print "mnope %s-%s" % (os.path.basename(binary), os.path.basename(line))
|
||||||
|
continue
|
||||||
|
if re.match(r'^\s*/System/', line):
|
||||||
|
continue # System framework
|
||||||
|
elif re.match(r'^\s*/usr/lib/', line):
|
||||||
|
#print "unix style system lib"
|
||||||
|
continue # unix style system library
|
||||||
|
elif re.match(r'Breakpad', line):
|
||||||
|
continue # Manually added by cmake.
|
||||||
|
elif re.match(r'^\s*@executable_path', line) or re.match(r'^\s*@loader_path', line):
|
||||||
|
# Potentially already fixed library
|
||||||
|
if '.framework' in line:
|
||||||
|
relative_path = os.path.join(*line.split('/')[3:])
|
||||||
|
if not os.path.exists(os.path.join(frameworks_dir, relative_path)):
|
||||||
|
broken_libs['frameworks'].append(relative_path)
|
||||||
|
else:
|
||||||
|
relative_path = os.path.join(*line.split('/')[1:])
|
||||||
|
#print "RELPATH %s %s" % (relative_path, os.path.join(binary_dir, relative_path))
|
||||||
|
if not os.path.exists(os.path.join(binary_dir, relative_path)):
|
||||||
|
broken_libs['libs'].append(relative_path)
|
||||||
|
elif re.search(r'\w+\.framework', line):
|
||||||
|
broken_libs['frameworks'].append(line)
|
||||||
|
else:
|
||||||
|
broken_libs['libs'].append(line)
|
||||||
|
|
||||||
|
return broken_libs
|
||||||
|
|
||||||
|
def FindFramework(path):
|
||||||
|
search_pathes = FRAMEWORK_SEARCH_PATH
|
||||||
|
search_pathes.insert(0, QueryQMake('QT_INSTALL_LIBS'))
|
||||||
|
for search_path in search_pathes:
|
||||||
|
abs_path = os.path.join(search_path, path)
|
||||||
|
if os.path.exists(abs_path):
|
||||||
|
return abs_path
|
||||||
|
|
||||||
|
raise CouldNotFindFrameworkError(path)
|
||||||
|
|
||||||
|
def FindLibrary(path):
|
||||||
|
if os.path.exists(path):
|
||||||
|
return path
|
||||||
|
search_pathes = LIBRARY_SEARCH_PATH
|
||||||
|
search_pathes.insert(0, QueryQMake('QT_INSTALL_LIBS'))
|
||||||
|
for search_path in search_pathes:
|
||||||
|
abs_path = os.path.join(search_path, path)
|
||||||
|
if os.path.exists(abs_path):
|
||||||
|
return abs_path
|
||||||
|
else: # try harder---look for lib name in library folders
|
||||||
|
newpath = os.path.join(search_path,os.path.basename(path))
|
||||||
|
if os.path.exists(newpath):
|
||||||
|
return newpath
|
||||||
|
|
||||||
|
return ""
|
||||||
|
#raise CouldNotFindFrameworkError(path)
|
||||||
|
|
||||||
|
def FixAllLibraries(broken_libs):
|
||||||
|
for framework in broken_libs['frameworks']:
|
||||||
|
FixFramework(framework)
|
||||||
|
for lib in broken_libs['libs']:
|
||||||
|
FixLibrary(lib)
|
||||||
|
|
||||||
|
def FixFramework(path):
|
||||||
|
if path in fixed_libraries:
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
fixed_libraries.append(path)
|
||||||
|
abs_path = FindFramework(path)
|
||||||
|
broken_libs = GetBrokenLibraries(abs_path)
|
||||||
|
FixAllLibraries(broken_libs)
|
||||||
|
|
||||||
|
new_path = CopyFramework(abs_path)
|
||||||
|
id = os.sep.join(new_path.split(os.sep)[3:])
|
||||||
|
FixFrameworkId(new_path, id)
|
||||||
|
for framework in broken_libs['frameworks']:
|
||||||
|
FixFrameworkInstallPath(framework, new_path)
|
||||||
|
for library in broken_libs['libs']:
|
||||||
|
FixLibraryInstallPath(library, new_path)
|
||||||
|
|
||||||
|
def FixLibrary(path):
|
||||||
|
if path in fixed_libraries or FindSystemLibrary(os.path.basename(path)) is not None:
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
fixed_libraries.append(path)
|
||||||
|
abs_path = FindLibrary(path)
|
||||||
|
if abs_path == "":
|
||||||
|
print "Could not resolve %s, not fixing!" % path
|
||||||
|
return
|
||||||
|
broken_libs = GetBrokenLibraries(abs_path)
|
||||||
|
FixAllLibraries(broken_libs)
|
||||||
|
|
||||||
|
new_path = CopyLibrary(abs_path)
|
||||||
|
FixLibraryId(new_path)
|
||||||
|
for framework in broken_libs['frameworks']:
|
||||||
|
FixFrameworkInstallPath(framework, new_path)
|
||||||
|
for library in broken_libs['libs']:
|
||||||
|
FixLibraryInstallPath(library, new_path)
|
||||||
|
|
||||||
|
def FixPlugin(abs_path, subdir):
|
||||||
|
broken_libs = GetBrokenLibraries(abs_path)
|
||||||
|
FixAllLibraries(broken_libs)
|
||||||
|
|
||||||
|
new_path = CopyPlugin(abs_path, subdir)
|
||||||
|
for framework in broken_libs['frameworks']:
|
||||||
|
FixFrameworkInstallPath(framework, new_path)
|
||||||
|
for library in broken_libs['libs']:
|
||||||
|
FixLibraryInstallPath(library, new_path)
|
||||||
|
|
||||||
|
def FixBinary(path):
|
||||||
|
broken_libs = GetBrokenLibraries(path)
|
||||||
|
FixAllLibraries(broken_libs)
|
||||||
|
for framework in broken_libs['frameworks']:
|
||||||
|
FixFrameworkInstallPath(framework, path)
|
||||||
|
for library in broken_libs['libs']:
|
||||||
|
FixLibraryInstallPath(library, path)
|
||||||
|
|
||||||
|
def CopyLibrary(path):
|
||||||
|
new_path = os.path.join(binary_dir, os.path.basename(path))
|
||||||
|
args = ['ditto', '--arch=x86_64', path, new_path]
|
||||||
|
commands.append(args)
|
||||||
|
args = ['chmod', 'u+w', new_path]
|
||||||
|
commands.append(args)
|
||||||
|
return new_path
|
||||||
|
|
||||||
|
def CopyPlugin(path, subdir):
|
||||||
|
new_path = os.path.join(plugins_dir, subdir, os.path.basename(path))
|
||||||
|
args = ['mkdir', '-p', os.path.dirname(new_path)]
|
||||||
|
commands.append(args)
|
||||||
|
args = ['ditto', '--arch=x86_64', path, new_path]
|
||||||
|
commands.append(args)
|
||||||
|
args = ['chmod', 'u+w', new_path]
|
||||||
|
commands.append(args)
|
||||||
|
return new_path
|
||||||
|
|
||||||
|
def CopyFramework(path):
|
||||||
|
parts = path.split(os.sep)
|
||||||
|
print "CopyFramework:", path
|
||||||
|
for i, part in enumerate(parts):
|
||||||
|
matchObj = re.match(r'(\w+\.framework)', part)
|
||||||
|
if matchObj:
|
||||||
|
full_path = os.path.join(frameworks_dir, *parts[i:-1])
|
||||||
|
framework = matchObj.group(1)
|
||||||
|
break
|
||||||
|
args = ['mkdir', '-p', full_path]
|
||||||
|
commands.append(args)
|
||||||
|
args = ['ditto', '--arch=x86_64', path, full_path]
|
||||||
|
commands.append(args)
|
||||||
|
args = ['chmod', 'u+w', os.path.join(full_path, parts[-1])]
|
||||||
|
commands.append(args)
|
||||||
|
args = ['chmod', 'u+w', os.path.join(frameworks_dir, framework, "Resources")]
|
||||||
|
commands.append(args)
|
||||||
|
|
||||||
|
info_plist = os.path.join(os.path.split(path)[0], '..', '..', 'Contents', 'Info.plist')
|
||||||
|
if os.path.exists(info_plist):
|
||||||
|
args = ['cp', '-r', info_plist, os.path.join(frameworks_dir, framework, "Resources")]
|
||||||
|
commands.append(args)
|
||||||
|
return os.path.join(full_path, parts[-1])
|
||||||
|
|
||||||
|
def FixId(path, library_name):
|
||||||
|
id = '@executable_path/../Frameworks/%s' % library_name
|
||||||
|
args = ['install_name_tool', '-id', id, path]
|
||||||
|
commands.append(args)
|
||||||
|
|
||||||
|
def FixLibraryId(path):
|
||||||
|
library_name = os.path.basename(path)
|
||||||
|
FixId(path, library_name)
|
||||||
|
|
||||||
|
def FixFrameworkId(path, id):
|
||||||
|
FixId(path, id)
|
||||||
|
|
||||||
|
def FixInstallPath(library_path, library, new_path):
|
||||||
|
args = ['install_name_tool', '-change', library_path, new_path, library]
|
||||||
|
commands.append(args)
|
||||||
|
|
||||||
|
def FindSystemLibrary(library_name):
|
||||||
|
for path in ['/lib', '/usr/lib']:
|
||||||
|
full_path = os.path.join(path, library_name)
|
||||||
|
if os.path.exists(full_path):
|
||||||
|
return full_path
|
||||||
|
return None
|
||||||
|
|
||||||
|
def FixLibraryInstallPath(library_path, library):
|
||||||
|
system_library = FindSystemLibrary(os.path.basename(library_path))
|
||||||
|
if system_library is None:
|
||||||
|
new_path = '@executable_path/../MacOS/%s' % os.path.basename(library_path)
|
||||||
|
FixInstallPath(library_path, library, new_path)
|
||||||
|
else:
|
||||||
|
FixInstallPath(library_path, library, system_library)
|
||||||
|
|
||||||
|
def FixFrameworkInstallPath(library_path, library):
|
||||||
|
parts = library_path.split(os.sep)
|
||||||
|
for i, part in enumerate(parts):
|
||||||
|
if re.match(r'\w+\.framework', part):
|
||||||
|
full_path = os.path.join(*parts[i:])
|
||||||
|
break
|
||||||
|
new_path = '@executable_path/../Frameworks/%s' % full_path
|
||||||
|
FixInstallPath(library_path, library, new_path)
|
||||||
|
|
||||||
|
def FindQtPlugin(name):
|
||||||
|
search_path = QT_PLUGINS_SEARCH_PATH
|
||||||
|
search_path.insert(0, QueryQMake('QT_INSTALL_PLUGINS'))
|
||||||
|
for path in search_path:
|
||||||
|
if os.path.exists(path):
|
||||||
|
if os.path.exists(os.path.join(path, name)):
|
||||||
|
return os.path.join(path, name)
|
||||||
|
raise CouldNotFindQtPluginError(name)
|
||||||
|
|
||||||
|
for binary in binaries:
|
||||||
|
FixBinary(binary)
|
||||||
|
|
||||||
|
for plugin in QT_PLUGINS:
|
||||||
|
FixPlugin(FindQtPlugin(plugin), os.path.dirname(plugin))
|
||||||
|
|
||||||
|
if len(sys.argv) <= 2:
|
||||||
|
print 'Will run %d commands:' % len(commands)
|
||||||
|
for command in commands:
|
||||||
|
print ' '.join(command)
|
||||||
|
|
||||||
|
for command in commands:
|
||||||
|
p = subprocess.Popen(command)
|
||||||
|
os.waitpid(p.pid, 0)
|
||||||
|
|
||||||
|
WriteQtConf()
|
||||||
1431
admin/osx/macosx.pkgproj
Normal file
1431
admin/osx/macosx.pkgproj
Normal file
File diff suppressed because it is too large
Load Diff
8
admin/osx/pre_install.sh.cmake
Normal file
8
admin/osx/pre_install.sh.cmake
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# kill the old version. see issue #2044
|
||||||
|
killall @APPLICATION_EXECUTABLE@
|
||||||
|
|
||||||
|
# Unload the Finder plugin. see issue #2105
|
||||||
|
killall Finder
|
||||||
|
|
||||||
12
admin/osx/sign_app.sh
Executable file
12
admin/osx/sign_app.sh
Executable file
@@ -0,0 +1,12 @@
|
|||||||
|
#!/bin/sh -x
|
||||||
|
|
||||||
|
[ "$#" -lt 2 ] && echo "Usage: sign_app.sh <app> <identity>" && exit
|
||||||
|
|
||||||
|
src_app="$1"
|
||||||
|
identity="$2"
|
||||||
|
|
||||||
|
codesign -s "$identity" --force --verbose=4 --deep "$src_app"
|
||||||
|
|
||||||
|
# Just for our debug purposes:
|
||||||
|
spctl -a -t exec -vv $src_app
|
||||||
|
codesign -dv $src_app
|
||||||
@@ -22,8 +22,8 @@ SET(QMAKESPEC win32-g++-cross)
|
|||||||
|
|
||||||
# dirs
|
# dirs
|
||||||
SET(QT_LIBRARY_DIR /usr/${MINGW_PREFIX}/bin)
|
SET(QT_LIBRARY_DIR /usr/${MINGW_PREFIX}/bin)
|
||||||
SET(QT_PLUGINS_DIR ${CMAKE_FIND_ROOT_PATH}/lib/qt4/plugins)
|
SET(QT_PLUGINS_DIR ${CMAKE_FIND_ROOT_PATH}/lib/qt5/plugins)
|
||||||
SET(QT_MKSPECS_DIR ${CMAKE_FIND_ROOT_PATH}/share/qt4/mkspecs)
|
SET(QT_MKSPECS_DIR ${CMAKE_FIND_ROOT_PATH}/share/qt5/mkspecs)
|
||||||
SET(QT_QT_INCLUDE_DIR ${CMAKE_FIND_ROOT_PATH}/include)
|
SET(QT_QT_INCLUDE_DIR ${CMAKE_FIND_ROOT_PATH}/include)
|
||||||
|
|
||||||
# qt tools
|
# qt tools
|
||||||
|
|||||||
19
admin/win/download_runtimes.sh
Executable file
19
admin/win/download_runtimes.sh
Executable file
@@ -0,0 +1,19 @@
|
|||||||
|
#!/bin/sh -x
|
||||||
|
|
||||||
|
#VS2013
|
||||||
|
base_url=http://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3
|
||||||
|
tmp_path=/tmp/.vcredist
|
||||||
|
|
||||||
|
mkdir -p $tmp_path
|
||||||
|
|
||||||
|
copy_cached_file() {
|
||||||
|
file=$1
|
||||||
|
if [ ! -e $tmp_path/$file ]; then
|
||||||
|
wget -O $tmp_path/$file $base_url/$file
|
||||||
|
fi
|
||||||
|
cp -a $tmp_path/$file $PWD
|
||||||
|
}
|
||||||
|
|
||||||
|
copy_cached_file "vcredist_x64.exe"
|
||||||
|
copy_cached_file "vcredist_x86.exe"
|
||||||
|
|
||||||
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
## Introduction
|
## Introduction
|
||||||
|
|
||||||
Translations on transifex: http://www.transifex.com/projects/p/owncloud/resource/mirall-wininstaller/
|
Translations on transifex: http://www.transifex.com/projects/p/owncloud/resource/client-nsis/
|
||||||
|
|
||||||
Daily sync job: https://ci.owncloud.org/view/translation-sync/job/translation-sync-mirall-wininstaller/
|
Daily sync job: https://ci.owncloud.org/view/translation-sync/job/translation-sync-client-nsis/
|
||||||
|
|
||||||
## How to add a new translation string?
|
## How to add a new translation string?
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[main]
|
[main]
|
||||||
host = https://www.transifex.com
|
host = https://www.transifex.com
|
||||||
|
|
||||||
[owncloud.mirall-wininstaller]
|
[owncloud.client-nsis]
|
||||||
host = https://www.transifex.com
|
host = https://www.transifex.com
|
||||||
source_file = pofiles/messages.pot
|
source_file = pofiles/messages.pot
|
||||||
source_lang = en
|
source_lang = en
|
||||||
|
|||||||
@@ -1,44 +1,46 @@
|
|||||||
# Auto-generated - do not modify
|
# Auto-generated - do not modify
|
||||||
|
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Erakutsi bertsio-berritze oharrak"
|
||||||
|
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Gelditu beharreko ${APPLICATION_EXECUTABLE} prozesua(k) aurkitu dira.$\nNahi duzu instalatzaileak zure partetik hauek gelditzea?"
|
||||||
|
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "${APPLICATION_EXECUTABLE} prozesuak hiltzen."
|
||||||
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "kill prozesua ez da aurkitu!"
|
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "kill prozesua ez da aurkitu!"
|
||||||
|
StrCpy $PageReinstall_NEW_Field_1 "${APPLICATION_NAME}ren bertsio zaharrago bat instalatuta dago. Aholkatzen da hau desinstalatzea berria instalatu baino lehen. Hautatu nahi duzun aukera eta sakatu Hurrengoa jarraitzeko."
|
||||||
StrCpy $PageReinstall_NEW_Field_2 "Desinstalatu instalatu baino lehen"
|
StrCpy $PageReinstall_NEW_Field_2 "Desinstalatu instalatu baino lehen"
|
||||||
StrCpy $PageReinstall_NEW_Field_3 "Ez desinstalatu"
|
StrCpy $PageReinstall_NEW_Field_3 "Ez desinstalatu"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Dagoeneko Instalatuta"
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Dagoeneko Instalatuta"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Hautatu nola nahi duzun ${APPLICATION_NAME} instalatzea."
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Hautatu nola nahi duzun ${APPLICATION_NAME} instalatzea."
|
||||||
|
StrCpy $PageReinstall_OLD_Field_1 "${APPLICATION_NAME}ren bertsio berriago bat instalatuta dago! Ez da aholkatzen bertsio zaharrago bat instalatzea. Benetan bertsio zaharrago hau instalatu nahi baduzu, hobe da lehenengo bertsio berria desinstalatzea. Hautatu nahi duzun aukera eta sakatu Hurrengoa jarraitzeko."
|
||||||
|
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} dagoeneko instalatuta dago.\nHautatu zer operazio egin nahi duzu eta klikatu Hurrengoa jarraitzeko."
|
||||||
StrCpy $PageReinstall_SAME_Field_2 "Gehitu/Berrinstalatu osagaiak"
|
StrCpy $PageReinstall_SAME_Field_2 "Gehitu/Berrinstalatu osagaiak"
|
||||||
StrCpy $PageReinstall_SAME_Field_3 "Desinstalatu ${APPLICATION_NAME}"
|
StrCpy $PageReinstall_SAME_Field_3 "Desinstalatu ${APPLICATION_NAME}"
|
||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "Desinstalatu ${APPLICATION_NAME}"
|
StrCpy $UNINSTALLER_APPDATA_TITLE "Desinstalatu ${APPLICATION_NAME}"
|
||||||
|
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Hautatu zer mantenu aukera egin nahi duzun."
|
||||||
|
StrCpy $SEC_APPLICATION_DETAILS "${APPLICATION_NAME} ezinbestekoak instalatzen."
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Windows Explorerekin Integrazioa"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Windows Explorerekin Integrazioa Instalatzen"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Hasierako Menuko Lasterbidea"
|
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Hasierako Menuko Lasterbidea"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Hasierako Menuan ${APPLICATION_NAME}rako Abiarazle bizkorra sortzen."
|
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Hasierako Menuan ${APPLICATION_NAME}rako Abiarazle bizkorra sortzen."
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Mahaigaineko Lasterbidea"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Mahaigaineko Lasterbidea"
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Mahaigaineko Lasterbideak Sortzen"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Mahaigaineko Lasterbideak Sortzen"
|
||||||
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Abiarazle Bizkorreko Lasterbidea"
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Abiarazle Bizkorreko Lasterbidea"
|
||||||
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Abiarazle Bizkorreko Lasterbidea Sortzen"
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Abiarazle Bizkorreko Lasterbidea Sortzen"
|
||||||
|
StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} ezinbestekoak."
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_Desc "${APPLICATION_NAME} lasterbidea."
|
StrCpy $OPTION_SECTION_SC_START_MENU_Desc "${APPLICATION_NAME} lasterbidea."
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "${APPLICATION_NAME}rako mahaigaineko lasterbidea."
|
StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "${APPLICATION_NAME}rako mahaigaineko lasterbidea."
|
||||||
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "${APPLICATION_NAME}erako Abiarazle Bizkorreko Lasterbidea."
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "${APPLICATION_NAME}erako Abiarazle Bizkorreko Lasterbidea."
|
||||||
StrCpy $UNINSTALLER_APPDATA_SUBTITLE "Ezabatu ${APPLICATION_NAME}en datuen karpeta zure ordenagailutik."
|
StrCpy $UNINSTALLER_APPDATA_SUBTITLE "Ezabatu ${APPLICATION_NAME}en datuen karpeta zure ordenagailutik."
|
||||||
StrCpy $UNINSTALLER_APPDATA_LABEL_1 "${APPLICATION_NAME}en datuen karpeta ezabatu nahi duzu?"
|
StrCpy $UNINSTALLER_APPDATA_LABEL_1 "${APPLICATION_NAME}en datuen karpeta ezabatu nahi duzu?"
|
||||||
|
StrCpy $UNINSTALLER_APPDATA_LABEL_2 "Utzi markatu gabe datuen karpeta uzteko edo markatu datuen karpeta ezabatzeko."
|
||||||
StrCpy $UNINSTALLER_APPDATA_CHECKBOX "Bai, ezabtu datu karpeta hau."
|
StrCpy $UNINSTALLER_APPDATA_CHECKBOX "Bai, ezabtu datu karpeta hau."
|
||||||
StrCpy $UNINSTALLER_FILE_Detail "Desinstalatzailea idazten"
|
StrCpy $UNINSTALLER_FILE_Detail "Desinstalatzailea idazten"
|
||||||
StrCpy $UNINSTALLER_REGISTRY_Detail "Instalatzaileko Erregistroko Giltzak idazten"
|
StrCpy $UNINSTALLER_REGISTRY_Detail "Instalatzaileko Erregistroko Giltzak idazten"
|
||||||
StrCpy $UNINSTALLER_FINISHED_Detail "Bukatuta"
|
StrCpy $UNINSTALLER_FINISHED_Detail "Bukatuta"
|
||||||
|
StrCpy $UNINSTALL_MESSAGEBOX "Ez dirudi ${APPLICATION_NAME} '$INSTDIR'.$ direktorioan instalatuta dagoenik.\n$\nJarraitu hala ere (ez da aholkatzen)?"
|
||||||
StrCpy $UNINSTALL_ABORT "Desinstalazioak erabiltzaileak bertan behera utzi du"
|
StrCpy $UNINSTALL_ABORT "Desinstalazioak erabiltzaileak bertan behera utzi du"
|
||||||
StrCpy $INIT_NO_QUICK_LAUNCH "Abiarazle Bizkorreko Lasterbidea (E/E)"
|
StrCpy $INIT_NO_QUICK_LAUNCH "Abiarazle Bizkorreko Lasterbidea (E/E)"
|
||||||
|
StrCpy $INIT_NO_DESKTOP "Mahaigaineko Lasterbidea (dagoena berridazten du)"
|
||||||
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Instalatzaileak administratzaile baimenak behar ditu, saiatu berriro"
|
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Instalatzaileak administratzaile baimenak behar ditu, saiatu berriro"
|
||||||
StrCpy $INIT_INSTALLER_RUNNING "Instalatzailea dagoeneko martxan da."
|
StrCpy $INIT_INSTALLER_RUNNING "Instalatzailea dagoeneko martxan da."
|
||||||
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Desinstalatzaile honek administratzaile baimenak behar ditu, saiatu berriro"
|
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Desinstalatzaile honek administratzaile baimenak behar ditu, saiatu berriro"
|
||||||
StrCpy $INIT_UNINSTALLER_RUNNING "Desinstalatzailea dagoeneko martxan da."
|
StrCpy $INIT_UNINSTALLER_RUNNING "Desinstalatzailea dagoeneko martxan da."
|
||||||
StrCpy $SectionGroup_Shortcuts "Lasterbideak"
|
StrCpy $SectionGroup_Shortcuts "Lasterbideak"
|
||||||
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Show release notes"
|
|
||||||
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Found ${APPLICATION_EXECUTABLE} process(s) which need to be stopped.$\nDo you want the installer to stop these for you?"
|
|
||||||
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Killing ${APPLICATION_EXECUTABLE} processes."
|
|
||||||
StrCpy $PageReinstall_NEW_Field_1 "An older version of ${APPLICATION_NAME} is installed on your system. It is recommended that you uninstall the current version before installing. Select the operation you want to perform and click Next to continue."
|
|
||||||
StrCpy $PageReinstall_OLD_Field_1 "A newer version of ${APPLICATION_NAME} is already installed! It is not recommended that you install an older version. If you really want to install this older version, it is better to uninstall the current version first. Select the operation you want to perform and click Next to continue."
|
|
||||||
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} is already installed.\r\nSelect the operation you want to perform and click Next to continue."
|
|
||||||
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Choose the maintenance option to perform."
|
|
||||||
StrCpy $SEC_APPLICATION_DETAILS "Installing ${APPLICATION_NAME} essentials."
|
|
||||||
StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} essentials."
|
|
||||||
StrCpy $UNINSTALLER_APPDATA_LABEL_2 "Leave unchecked to keep the data folder for later use or check to delete the data folder."
|
|
||||||
StrCpy $UNINSTALL_MESSAGEBOX "It does not appear that ${APPLICATION_NAME} is installed in the directory '$INSTDIR'.$\r$\nContinue anyway (not recommended)?"
|
|
||||||
StrCpy $INIT_NO_DESKTOP "Desktop Shortcut (overwrites existing)"
|
|
||||||
StrCpy $UAC_ERROR_ELEVATE "Unable to elevate, error:"
|
StrCpy $UAC_ERROR_ELEVATE "Unable to elevate, error:"
|
||||||
|
|||||||
@@ -1,44 +1,46 @@
|
|||||||
# Auto-generated - do not modify
|
# Auto-generated - do not modify
|
||||||
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Mostrar les notes de versió"
|
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Mostrar les notes de versió"
|
||||||
|
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "S'ha trobat el(s) procés ${APPLICATION_EXECUTABLE} que s'ha d'aturar.$\nVoleu que l'instal·lador l'aturi?"
|
||||||
|
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "S'estan matant els processos ${APPLICATION_EXECUTABLE}."
|
||||||
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Procés per matar no trobat!"
|
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Procés per matar no trobat!"
|
||||||
StrCpy $PageReinstall_NEW_Field_1 "Una versió anterior de ${APPLICATION_NAME} està instal·lada en el vostre sistema. Es recomana desinstal·lar la versió actual abans d'instal·lar. Seleccioneu l'operació que desitjeu realitzar i feu clic a Següent per continuar."
|
StrCpy $PageReinstall_NEW_Field_1 "Una versió anterior de ${APPLICATION_NAME} està instal·lada en el vostre sistema. Es recomana desinstal·lar la versió actual abans d'instal·lar. Seleccioneu l'operació que desitjeu realitzar i feu clic a Següent per continuar."
|
||||||
StrCpy $PageReinstall_NEW_Field_2 "Desinstal·lar abans d'instal·lar"
|
StrCpy $PageReinstall_NEW_Field_2 "Desinstal·lar abans d'instal·lar"
|
||||||
StrCpy $PageReinstall_NEW_Field_3 "No instal·lar"
|
StrCpy $PageReinstall_NEW_Field_3 "No instal·lar"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Ja instal·lat"
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Ja instal·lat"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Trieu la manera com voleu instal·lar ${APPLICATION_NAME}."
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Trieu la manera com voleu instal·lar ${APPLICATION_NAME}."
|
||||||
|
StrCpy $PageReinstall_OLD_Field_1 "Una versió més recent de ${APPLICATION_NAME} ja està instal.lada!! No es recomana instal.lar una versió més antiga. Si realment voleu instal.lar una versió més antiga, és millor primer desinstal.lar la versió actual. Seleccioni l'operació que desitjeu realitzar i feu clic a Següent per a continuar."
|
||||||
|
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} ja està instal.lat.↩\nSeleccioneu l'operació que desitjeu realitzar i feu clic a Següent per continuar."
|
||||||
|
StrCpy $PageReinstall_SAME_Field_2 "Afegir/Reinstal.lar components"
|
||||||
|
StrCpy $PageReinstall_SAME_Field_3 "Desinstal.lar ${APPLICATION_NAME}"
|
||||||
|
StrCpy $UNINSTALLER_APPDATA_TITLE "Desinstal.lar ${APPLICATION_NAME}"
|
||||||
|
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Escolliu l'opció de manteniment per executar-ho."
|
||||||
|
StrCpy $SEC_APPLICATION_DETAILS "Instal·lant ${APPLICATION_NAME} essencial."
|
||||||
|
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Accés directe del programa al menú d'inici"
|
||||||
|
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Afegint la drecera per ${APPLICATION_NAME} al menú d'inici."
|
||||||
|
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Drecera a l'escriptori"
|
||||||
|
StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Creant les dreceres a l'escriptori"
|
||||||
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Drecera d'inici ràpid"
|
||||||
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Creant la drecera per l'inici ràpid"
|
||||||
|
StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} essencial."
|
||||||
|
StrCpy $OPTION_SECTION_SC_START_MENU_Desc "Drecera ${APPLICATION_NAME}."
|
||||||
|
StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Drecera a l'escrptori per ${APPLICATION_NAME}."
|
||||||
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Drecera d'inici ràpid per ${APPLICATION_NAME}."
|
||||||
|
StrCpy $UNINSTALLER_APPDATA_SUBTITLE "Esborra la carpeta de dades de ${APPLICATION_NAME} del vostre equip."
|
||||||
|
StrCpy $UNINSTALLER_APPDATA_LABEL_1 "Voleu esborrar la carpeta de dades de ${APPLICATION_NAME}?"
|
||||||
|
StrCpy $UNINSTALLER_APPDATA_LABEL_2 "Deixeu-ho sense marcar per mantenir la carpeta de dades per un ús posterior o marqueu-ho per esborrar la carpeta de dades."
|
||||||
|
StrCpy $UNINSTALLER_APPDATA_CHECKBOX "Sí, esborra la carpeta de dades."
|
||||||
|
StrCpy $UNINSTALLER_FILE_Detail "Escrivint el desinstal·lador"
|
||||||
|
StrCpy $UNINSTALLER_REGISTRY_Detail "Escrivint les claus del registre de l'instal·lador"
|
||||||
StrCpy $UNINSTALLER_FINISHED_Detail "Acabat"
|
StrCpy $UNINSTALLER_FINISHED_Detail "Acabat"
|
||||||
|
StrCpy $UNINSTALL_MESSAGEBOX "No sembla que ${APPLICATION_NAME} estigui instal·lat en la carpeta '$INSTDIR'.$\n$\nContinuo igualment (no recomanat)?"
|
||||||
|
StrCpy $UNINSTALL_ABORT "La desinstal·lació s'ha cancel·lat."
|
||||||
|
StrCpy $INIT_NO_QUICK_LAUNCH "Drecera d'inici ràpid (N/A)"
|
||||||
|
StrCpy $INIT_NO_DESKTOP "Drecera de l'escrpitori (sobreescriu l'existent)"
|
||||||
|
StrCpy $UAC_ERROR_ELEVATE "No es pot elevar, error:"
|
||||||
|
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Aquest instal·lador requereix accés d'administrador, intenteu-ho de nou"
|
||||||
|
StrCpy $INIT_INSTALLER_RUNNING "L'instal·lador ja s'està executant."
|
||||||
|
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Aquest desinstal·lador requereix accés d'administrador, intenteu-ho de nou."
|
||||||
|
StrCpy $INIT_UNINSTALLER_RUNNING "El desinstal·lador ja s'està executant."
|
||||||
StrCpy $SectionGroup_Shortcuts "Dreceres"
|
StrCpy $SectionGroup_Shortcuts "Dreceres"
|
||||||
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Found ${APPLICATION_EXECUTABLE} process(s) which need to be stopped.$\nDo you want the installer to stop these for you?"
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integration for Windows Explorer"
|
||||||
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Killing ${APPLICATION_EXECUTABLE} processes."
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installing Integration for Windows Explorer"
|
||||||
StrCpy $PageReinstall_OLD_Field_1 "A newer version of ${APPLICATION_NAME} is already installed! It is not recommended that you install an older version. If you really want to install this older version, it is better to uninstall the current version first. Select the operation you want to perform and click Next to continue."
|
|
||||||
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} is already installed.\r\nSelect the operation you want to perform and click Next to continue."
|
|
||||||
StrCpy $PageReinstall_SAME_Field_2 "Add/Reinstall components"
|
|
||||||
StrCpy $PageReinstall_SAME_Field_3 "Uninstall ${APPLICATION_NAME}"
|
|
||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "Uninstall ${APPLICATION_NAME}"
|
|
||||||
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Choose the maintenance option to perform."
|
|
||||||
StrCpy $SEC_APPLICATION_DETAILS "Installing ${APPLICATION_NAME} essentials."
|
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Start Menu Program Shortcut"
|
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Adding shortcut for ${APPLICATION_NAME} to the Start Menu."
|
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Desktop Shortcut"
|
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Creating Desktop Shortcuts"
|
|
||||||
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Quick Launch Shortcut"
|
|
||||||
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Creating Quick Launch Shortcut"
|
|
||||||
StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} essentials."
|
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_Desc "${APPLICATION_NAME} shortcut."
|
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Desktop shortcut for ${APPLICATION_NAME}."
|
|
||||||
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Quick Launch shortcut for ${APPLICATION_NAME}."
|
|
||||||
StrCpy $UNINSTALLER_APPDATA_SUBTITLE "Remove ${APPLICATION_NAME}'s data folder from your computer."
|
|
||||||
StrCpy $UNINSTALLER_APPDATA_LABEL_1 "Do you want to delete ${APPLICATION_NAME}'s data folder?"
|
|
||||||
StrCpy $UNINSTALLER_APPDATA_LABEL_2 "Leave unchecked to keep the data folder for later use or check to delete the data folder."
|
|
||||||
StrCpy $UNINSTALLER_APPDATA_CHECKBOX "Yes, delete this data folder."
|
|
||||||
StrCpy $UNINSTALLER_FILE_Detail "Writing Uninstaller"
|
|
||||||
StrCpy $UNINSTALLER_REGISTRY_Detail "Writing Installer Registry Keys"
|
|
||||||
StrCpy $UNINSTALL_MESSAGEBOX "It does not appear that ${APPLICATION_NAME} is installed in the directory '$INSTDIR'.$\r$\nContinue anyway (not recommended)?"
|
|
||||||
StrCpy $UNINSTALL_ABORT "Uninstall aborted by user"
|
|
||||||
StrCpy $INIT_NO_QUICK_LAUNCH "Quick Launch Shortcut (N/A)"
|
|
||||||
StrCpy $INIT_NO_DESKTOP "Desktop Shortcut (overwrites existing)"
|
|
||||||
StrCpy $UAC_ERROR_ELEVATE "Unable to elevate, error:"
|
|
||||||
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "This installer requires admin access, try again"
|
|
||||||
StrCpy $INIT_INSTALLER_RUNNING "The installer is already running."
|
|
||||||
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "This uninstaller requires admin access, try again"
|
|
||||||
StrCpy $INIT_UNINSTALLER_RUNNING "The uninstaller is already running."
|
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ StrCpy $PageReinstall_SAME_Field_3 "Odinstalovat ${APPLICATION_NAME}"
|
|||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "Odinstalovat ${APPLICATION_NAME}"
|
StrCpy $UNINSTALLER_APPDATA_TITLE "Odinstalovat ${APPLICATION_NAME}"
|
||||||
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Vyberte možnost údržby k provedení."
|
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Vyberte možnost údržby k provedení."
|
||||||
StrCpy $SEC_APPLICATION_DETAILS "Instalují se náležitosti ${APPLICATION_NAME}."
|
StrCpy $SEC_APPLICATION_DETAILS "Instalují se náležitosti ${APPLICATION_NAME}."
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integrace do průzkumníka Windows"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Instalace integrace do průzkumníka Windows"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Zástupce v Nabídce Start"
|
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Zástupce v Nabídce Start"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Přidávám zástupce pro ${APPLICATION_NAME} do Nabídky Start."
|
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Přidávám zástupce pro ${APPLICATION_NAME} do Nabídky Start."
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Zástupce na ploše"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Zástupce na ploše"
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Het te stoppen proces is niet gev
|
|||||||
StrCpy $PageReinstall_NEW_Field_1 "Er is een oudere versie van ${APPLICATION_NAME} geïnstalleerd op uw systeem. geadviseerd wordt om de huidige versie te de-installeren voordat de nieuwe versie wordt geïnstalleerd. Selecteer de uit te voeren actie en klik op Verder om door te gaan."
|
StrCpy $PageReinstall_NEW_Field_1 "Er is een oudere versie van ${APPLICATION_NAME} geïnstalleerd op uw systeem. geadviseerd wordt om de huidige versie te de-installeren voordat de nieuwe versie wordt geïnstalleerd. Selecteer de uit te voeren actie en klik op Verder om door te gaan."
|
||||||
StrCpy $PageReinstall_NEW_Field_2 "De-installeren voor installeren"
|
StrCpy $PageReinstall_NEW_Field_2 "De-installeren voor installeren"
|
||||||
StrCpy $PageReinstall_NEW_Field_3 "Niet de-installeren"
|
StrCpy $PageReinstall_NEW_Field_3 "Niet de-installeren"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Reeds geinstalleerd"
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Al geïnstalleerd"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Kies hoe u ${APPLICATION_NAME} wilt installeren."
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Kies hoe u ${APPLICATION_NAME} wilt installeren."
|
||||||
StrCpy $PageReinstall_OLD_Field_1 "Er is al een recentere versie van ${APPLICATION_NAME} geïnstalleerd! Installeren van een oudere versie wordt niet aangeraden. Als u echt de oudere versie wilt installeren, adviseren we de huidige versie eerst te verwijderen. Kies de actie die u wilt uitvoeren en druk op Verder om door te gaan."
|
StrCpy $PageReinstall_OLD_Field_1 "Er is al een recentere versie van ${APPLICATION_NAME} geïnstalleerd! Installeren van een oudere versie wordt niet aangeraden. Als u echt de oudere versie wilt installeren, adviseren we de huidige versie eerst te verwijderen. Kies de actie die u wilt uitvoeren en druk op Verder om door te gaan."
|
||||||
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} is al geïnstalleerd.\nKies de actie die u wilt uitvoeren en druk op Verder om door te gaan."
|
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} is al geïnstalleerd.\nKies de actie die u wilt uitvoeren en druk op Verder om door te gaan."
|
||||||
@@ -15,6 +15,8 @@ StrCpy $PageReinstall_SAME_Field_3 "De-installeer ${APPLICATION_NAME}"
|
|||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "De-installeer ${APPLICATION_NAME}"
|
StrCpy $UNINSTALLER_APPDATA_TITLE "De-installeer ${APPLICATION_NAME}"
|
||||||
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Kies de uit te voeren onderhoudsoptie."
|
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Kies de uit te voeren onderhoudsoptie."
|
||||||
StrCpy $SEC_APPLICATION_DETAILS "Installeren ${APPLICATION_NAME} basis."
|
StrCpy $SEC_APPLICATION_DETAILS "Installeren ${APPLICATION_NAME} basis."
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integratie binnen Windows Verkenner"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installeren Integratie binnen Windows Verkenner"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Startmenu snelkoppeling"
|
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Startmenu snelkoppeling"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Toevoegen snelkoppeling voor ${APPLICATION_NAME} aan het Startmenu."
|
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Toevoegen snelkoppeling voor ${APPLICATION_NAME} aan het Startmenu."
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Werkblad snelkoppeling"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Werkblad snelkoppeling"
|
||||||
@@ -27,7 +29,7 @@ StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Werkblad snelkoppeling voor ${APPLICATIO
|
|||||||
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Snelstart snelkoppeling voor ${APPLICATION_NAME}."
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Snelstart snelkoppeling voor ${APPLICATION_NAME}."
|
||||||
StrCpy $UNINSTALLER_APPDATA_SUBTITLE "Verwijder ${APPLICATION_NAME}'s data map van uw computer."
|
StrCpy $UNINSTALLER_APPDATA_SUBTITLE "Verwijder ${APPLICATION_NAME}'s data map van uw computer."
|
||||||
StrCpy $UNINSTALLER_APPDATA_LABEL_1 "Wilt u de ${APPLICATION_NAME}'s data map verwijderen?"
|
StrCpy $UNINSTALLER_APPDATA_LABEL_1 "Wilt u de ${APPLICATION_NAME}'s data map verwijderen?"
|
||||||
StrCpy $UNINSTALLER_APPDATA_LABEL_2 "Niet aankruisen om de datamap te bewaren of aankruisen om de datamap te verwijderen."
|
StrCpy $UNINSTALLER_APPDATA_LABEL_2 "Niet aankruisen om de datamap te bewaren, wel aankruisen om de datamap te verwijderen."
|
||||||
StrCpy $UNINSTALLER_APPDATA_CHECKBOX "Ja, verwijder deze data map."
|
StrCpy $UNINSTALLER_APPDATA_CHECKBOX "Ja, verwijder deze data map."
|
||||||
StrCpy $UNINSTALLER_FILE_Detail "Wegschrijven Uninstaller"
|
StrCpy $UNINSTALLER_FILE_Detail "Wegschrijven Uninstaller"
|
||||||
StrCpy $UNINSTALLER_REGISTRY_Detail "Wegschrijven installer Registersleutels"
|
StrCpy $UNINSTALLER_REGISTRY_Detail "Wegschrijven installer Registersleutels"
|
||||||
@@ -35,10 +37,10 @@ StrCpy $UNINSTALLER_FINISHED_Detail "Klaar"
|
|||||||
StrCpy $UNINSTALL_MESSAGEBOX "Het lijkt er niet op dat ${APPLICATION_NAME} is geïnstalleerd in de map '$INSTDIR'.$\n$\nToch doorgaan (niet aangeraden)?"
|
StrCpy $UNINSTALL_MESSAGEBOX "Het lijkt er niet op dat ${APPLICATION_NAME} is geïnstalleerd in de map '$INSTDIR'.$\n$\nToch doorgaan (niet aangeraden)?"
|
||||||
StrCpy $UNINSTALL_ABORT "De-installatie afgebroken door de gebruiker"
|
StrCpy $UNINSTALL_ABORT "De-installatie afgebroken door de gebruiker"
|
||||||
StrCpy $INIT_NO_QUICK_LAUNCH "Snelstart snelkoppeling (N/A)"
|
StrCpy $INIT_NO_QUICK_LAUNCH "Snelstart snelkoppeling (N/A)"
|
||||||
StrCpy $INIT_NO_DESKTOP "Desktop snelkoppeleng (overschrijft huidige)"
|
StrCpy $INIT_NO_DESKTOP "Bureaublad snelkoppeling (overschrijft huidige)"
|
||||||
StrCpy $UAC_ERROR_ELEVATE "Kan niet verhogen, fout:"
|
StrCpy $UAC_ERROR_ELEVATE "Kan niet verhogen, fout:"
|
||||||
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Dit installatieprogramma vereist administrator rechten. Probeer het opnieuw"
|
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Dit installatieprogramma vereist beheerdersrechten. Probeer het opnieuw"
|
||||||
StrCpy $INIT_INSTALLER_RUNNING "De Installer is al gestart."
|
StrCpy $INIT_INSTALLER_RUNNING "De Installer is al gestart."
|
||||||
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Deze uninstaller vereist administrator toegang, probeer opnieuw"
|
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Deze uninstaller vereist Beheerderstoegang, probeer opnieuw"
|
||||||
StrCpy $INIT_UNINSTALLER_RUNNING "De uninstaller is al gestart."
|
StrCpy $INIT_UNINSTALLER_RUNNING "De uninstaller is al gestart."
|
||||||
StrCpy $SectionGroup_Shortcuts "Snelkoppelingen"
|
StrCpy $SectionGroup_Shortcuts "Snelkoppelingen"
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ StrCpy $PageReinstall_SAME_Field_3 "Uninstall ${APPLICATION_NAME}"
|
|||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "Uninstall ${APPLICATION_NAME}"
|
StrCpy $UNINSTALLER_APPDATA_TITLE "Uninstall ${APPLICATION_NAME}"
|
||||||
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Choose the maintenance option to perform."
|
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Choose the maintenance option to perform."
|
||||||
StrCpy $SEC_APPLICATION_DETAILS "Installing ${APPLICATION_NAME} essentials."
|
StrCpy $SEC_APPLICATION_DETAILS "Installing ${APPLICATION_NAME} essentials."
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integration for Windows Explorer"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installing Integration for Windows Explorer"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Start Menu Program Shortcut"
|
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Start Menu Program Shortcut"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Adding shortcut for ${APPLICATION_NAME} to the Start Menu."
|
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Adding shortcut for ${APPLICATION_NAME} to the Start Menu."
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Desktop Shortcut"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Desktop Shortcut"
|
||||||
|
|||||||
@@ -42,3 +42,5 @@ StrCpy $INIT_INSTALLER_RUNNING "Paigaldaja on juba k
|
|||||||
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "See desinstallija vajab admini ligipääsu, proovi uuesti"
|
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "See desinstallija vajab admini ligipääsu, proovi uuesti"
|
||||||
StrCpy $INIT_UNINSTALLER_RUNNING "See desinstallija on juba käimas"
|
StrCpy $INIT_UNINSTALLER_RUNNING "See desinstallija on juba käimas"
|
||||||
StrCpy $SectionGroup_Shortcuts "Viidad"
|
StrCpy $SectionGroup_Shortcuts "Viidad"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integration for Windows Explorer"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installing Integration for Windows Explorer"
|
||||||
|
|||||||
46
admin/win/nsi/l10n/Farsi.nsh
Normal file
46
admin/win/nsi/l10n/Farsi.nsh
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
# Auto-generated - do not modify
|
||||||
|
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "نمایش پادداشت های انتشار نسخه"
|
||||||
|
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "پردازش برای از بین بردن یافت نشد!"
|
||||||
|
StrCpy $PageReinstall_NEW_Field_3 "حذف نکن"
|
||||||
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "از قبل نصب شده است"
|
||||||
|
StrCpy $PageReinstall_SAME_Field_2 "افزودن/نصب مجدد اجزا"
|
||||||
|
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "میانبر دسکتاپ"
|
||||||
|
StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "ایجاد میانبر دسکتاپ"
|
||||||
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "میانبر بازکردن سریع"
|
||||||
|
StrCpy $UNINSTALLER_APPDATA_CHECKBOX "بله، این پوشه داده را حذف کن."
|
||||||
|
StrCpy $UNINSTALLER_FILE_Detail "نوشتن حذف کننده"
|
||||||
|
StrCpy $UNINSTALLER_FINISHED_Detail "اتمام"
|
||||||
|
StrCpy $INIT_INSTALLER_RUNNING "نصاب از قبل در حال اجراست."
|
||||||
|
StrCpy $INIT_UNINSTALLER_RUNNING "حذف کننده از قبل در حال اجراست."
|
||||||
|
StrCpy $SectionGroup_Shortcuts "میانبرها"
|
||||||
|
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Found ${APPLICATION_EXECUTABLE} process(s) which need to be stopped.$\nDo you want the installer to stop these for you?"
|
||||||
|
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Killing ${APPLICATION_EXECUTABLE} processes."
|
||||||
|
StrCpy $PageReinstall_NEW_Field_1 "An older version of ${APPLICATION_NAME} is installed on your system. It is recommended that you uninstall the current version before installing. Select the operation you want to perform and click Next to continue."
|
||||||
|
StrCpy $PageReinstall_NEW_Field_2 "Uninstall before installing"
|
||||||
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Choose how you want to install ${APPLICATION_NAME}."
|
||||||
|
StrCpy $PageReinstall_OLD_Field_1 "A newer version of ${APPLICATION_NAME} is already installed! It is not recommended that you install an older version. If you really want to install this older version, it is better to uninstall the current version first. Select the operation you want to perform and click Next to continue."
|
||||||
|
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} is already installed.\r\nSelect the operation you want to perform and click Next to continue."
|
||||||
|
StrCpy $PageReinstall_SAME_Field_3 "Uninstall ${APPLICATION_NAME}"
|
||||||
|
StrCpy $UNINSTALLER_APPDATA_TITLE "Uninstall ${APPLICATION_NAME}"
|
||||||
|
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Choose the maintenance option to perform."
|
||||||
|
StrCpy $SEC_APPLICATION_DETAILS "Installing ${APPLICATION_NAME} essentials."
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integration for Windows Explorer"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installing Integration for Windows Explorer"
|
||||||
|
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Start Menu Program Shortcut"
|
||||||
|
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Adding shortcut for ${APPLICATION_NAME} to the Start Menu."
|
||||||
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Creating Quick Launch Shortcut"
|
||||||
|
StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} essentials."
|
||||||
|
StrCpy $OPTION_SECTION_SC_START_MENU_Desc "${APPLICATION_NAME} shortcut."
|
||||||
|
StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Desktop shortcut for ${APPLICATION_NAME}."
|
||||||
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Quick Launch shortcut for ${APPLICATION_NAME}."
|
||||||
|
StrCpy $UNINSTALLER_APPDATA_SUBTITLE "Remove ${APPLICATION_NAME}'s data folder from your computer."
|
||||||
|
StrCpy $UNINSTALLER_APPDATA_LABEL_1 "Do you want to delete ${APPLICATION_NAME}'s data folder?"
|
||||||
|
StrCpy $UNINSTALLER_APPDATA_LABEL_2 "Leave unchecked to keep the data folder for later use or check to delete the data folder."
|
||||||
|
StrCpy $UNINSTALLER_REGISTRY_Detail "Writing Installer Registry Keys"
|
||||||
|
StrCpy $UNINSTALL_MESSAGEBOX "It does not appear that ${APPLICATION_NAME} is installed in the directory '$INSTDIR'.$\r$\nContinue anyway (not recommended)?"
|
||||||
|
StrCpy $UNINSTALL_ABORT "Uninstall aborted by user"
|
||||||
|
StrCpy $INIT_NO_QUICK_LAUNCH "Quick Launch Shortcut (N/A)"
|
||||||
|
StrCpy $INIT_NO_DESKTOP "Desktop Shortcut (overwrites existing)"
|
||||||
|
StrCpy $UAC_ERROR_ELEVATE "Unable to elevate, error:"
|
||||||
|
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "This installer requires admin access, try again"
|
||||||
|
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "This uninstaller requires admin access, try again"
|
||||||
@@ -1,44 +1,46 @@
|
|||||||
# Auto-generated - do not modify
|
# Auto-generated - do not modify
|
||||||
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Näytä julkaisutiedot"
|
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Näytä julkaisutiedot"
|
||||||
|
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Havaittiin sovelluksen ${APPLICATION_EXECUTABLE} prosessi (tai prosesseja) jotka pitäisi pysäyttää.\nHaluatko että asennusohjelma pysäyttää nämä puolestasi?"
|
||||||
|
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Pysäytetään sovelluksen ${APPLICATION_EXECUTABLE} prosessit."
|
||||||
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Tapettavaa prosessia ei löytynyt!"
|
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Tapettavaa prosessia ei löytynyt!"
|
||||||
|
StrCpy $PageReinstall_NEW_Field_1 "Vanhempi versio sovelluksesta ${APPLICATION_NAME} on jo asennettu. On suositeltavaa että poistat vanhan asennuksen ensin. Valitse mikä toiminto suoritetaan ja napsauta Seuraava jatkaaksesi."
|
||||||
StrCpy $PageReinstall_NEW_Field_2 "Poista ennen asentamista"
|
StrCpy $PageReinstall_NEW_Field_2 "Poista ennen asentamista"
|
||||||
StrCpy $PageReinstall_NEW_Field_3 "Älä poista"
|
StrCpy $PageReinstall_NEW_Field_3 "Älä poista"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Asennettu jo"
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Asennettu jo"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Valitse miten ${APPLICATION_NAME} asennetaan."
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Valitse miten ${APPLICATION_NAME} asennetaan."
|
||||||
|
StrCpy $PageReinstall_OLD_Field_1 "Uudempi versio sovelluksesta ${APPLICATION_NAME} on jo asennettu! Vanhan version asennus ei ole suositeltavaa. Jos todella haluat asentaa vanhemman version, kannattaa poistaa nykyisen version asennus ensin. Valitse minkä toimenpiteen haluat suorittaa ja paina Seuraava jatkaaksesi."
|
||||||
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} on jo asennettu.\nValitse suoritettava toimenpide ja napsauta Seuraava jatkaaksesi."
|
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} on jo asennettu.\nValitse suoritettava toimenpide ja napsauta Seuraava jatkaaksesi."
|
||||||
|
StrCpy $PageReinstall_SAME_Field_2 "Lisää/uudelleenasenna komponentteja"
|
||||||
StrCpy $PageReinstall_SAME_Field_3 "Poista ${APPLICATION_NAME}"
|
StrCpy $PageReinstall_SAME_Field_3 "Poista ${APPLICATION_NAME}"
|
||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "Poista ${APPLICATION_NAME}"
|
StrCpy $UNINSTALLER_APPDATA_TITLE "Poista ${APPLICATION_NAME}"
|
||||||
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Valitse suoritettava huoltotoimenpide."
|
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Valitse suoritettava huoltotoimenpide."
|
||||||
|
StrCpy $SEC_APPLICATION_DETAILS "Asennetaan sovelluksen ${APPLICATION_NAME} välttämättömyyksiä."
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integraatio Windows Exploreriin"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Asennetaan integraatiota Windows Exploreriin"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Käynnistä-valikon pikakuvake"
|
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Käynnistä-valikon pikakuvake"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Lisätään ${APPLICATION_NAME}-pikakuvake Käynnistä-valikkoon."
|
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Lisätään ${APPLICATION_NAME}-pikakuvake Käynnistä-valikkoon."
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Työpöydän pikakuvake"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Työpöydän pikakuvake"
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Luodaan työpöydän pikakuvakkeet"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Luodaan työpöydän pikakuvakkeet"
|
||||||
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Pikakäynnistyksen pikakuvake"
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Pikakäynnistyksen pikakuvake"
|
||||||
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Luodaan pikakuvaketta pikakäynnistykseen"
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Luodaan pikakuvaketta pikakäynnistykseen"
|
||||||
|
StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} välttämättömyydet."
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_Desc "${APPLICATION_NAME}-pikakuvake."
|
StrCpy $OPTION_SECTION_SC_START_MENU_Desc "${APPLICATION_NAME}-pikakuvake."
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Sovelluksen ${APPLICATION_NAME} työpyötäpikakuvake."
|
StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Sovelluksen ${APPLICATION_NAME} työpyötäpikakuvake."
|
||||||
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Pikakäynnistyksen pikakuvake sovellukselle ${APPLICATION_NAME}."
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Pikakäynnistyksen pikakuvake sovellukselle ${APPLICATION_NAME}."
|
||||||
StrCpy $UNINSTALLER_APPDATA_SUBTITLE "Poista ${APPLICATION_NAME}-datakansio tietokoneelta."
|
StrCpy $UNINSTALLER_APPDATA_SUBTITLE "Poista ${APPLICATION_NAME}-datakansio tietokoneelta."
|
||||||
StrCpy $UNINSTALLER_APPDATA_LABEL_1 "Haluatko varmasti poistaa ${APPLICATION_NAME}-datakansion?"
|
StrCpy $UNINSTALLER_APPDATA_LABEL_1 "Haluatko varmasti poistaa ${APPLICATION_NAME}-datakansion?"
|
||||||
|
StrCpy $UNINSTALLER_APPDATA_LABEL_2 "Jätä valinta ruksimatta säilyttääksesti datakansion myöhempää käyttöä varten tai täytä ruksi jos haluat poistaa datakansion ja siinä olevat tiedostot."
|
||||||
StrCpy $UNINSTALLER_APPDATA_CHECKBOX "Kyllä, poista tämä datakansio."
|
StrCpy $UNINSTALLER_APPDATA_CHECKBOX "Kyllä, poista tämä datakansio."
|
||||||
|
StrCpy $UNINSTALLER_FILE_Detail "Kirjoitetaan poisto-ohjelmaa"
|
||||||
StrCpy $UNINSTALLER_REGISTRY_Detail "Kirjoitetaan asennusohjelman rekisteriavaimia"
|
StrCpy $UNINSTALLER_REGISTRY_Detail "Kirjoitetaan asennusohjelman rekisteriavaimia"
|
||||||
StrCpy $UNINSTALLER_FINISHED_Detail "Valmis"
|
StrCpy $UNINSTALLER_FINISHED_Detail "Valmis"
|
||||||
|
StrCpy $UNINSTALL_MESSAGEBOX "Vaikuttaa siltä että sovellus ${APPLICATION_NAME} on asennettu kansioon '$INSTDIR'.\n\nHaluatko jatkaa tästä huolimatta (ei suositeltavaa)?"
|
||||||
StrCpy $UNINSTALL_ABORT "Poistaminen keskeytettiin käyttäjän toimesta"
|
StrCpy $UNINSTALL_ABORT "Poistaminen keskeytettiin käyttäjän toimesta"
|
||||||
|
StrCpy $INIT_NO_QUICK_LAUNCH "Pikakäynnistyksen pikakuvake (-)"
|
||||||
StrCpy $INIT_NO_DESKTOP "Työpöydän pikakuvake (korvaa nykyinen)"
|
StrCpy $INIT_NO_DESKTOP "Työpöydän pikakuvake (korvaa nykyinen)"
|
||||||
|
StrCpy $UAC_ERROR_ELEVATE "Kohottaminen ei onnistu, virhe:"
|
||||||
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Tämä asennusohjelma vaatii ylläpitäjän oikeudet, yritä uudelleen."
|
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Tämä asennusohjelma vaatii ylläpitäjän oikeudet, yritä uudelleen."
|
||||||
StrCpy $INIT_INSTALLER_RUNNING "Asennusohjelma on jo käynnissä."
|
StrCpy $INIT_INSTALLER_RUNNING "Asennusohjelma on jo käynnissä."
|
||||||
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Tämä poisto-ohjelma vaatii ylläpitäjän oikeudet, yritä uudelleen."
|
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Tämä poisto-ohjelma vaatii ylläpitäjän oikeudet, yritä uudelleen."
|
||||||
StrCpy $INIT_UNINSTALLER_RUNNING "Poisto-ohjelma on jo käynnissä."
|
StrCpy $INIT_UNINSTALLER_RUNNING "Poisto-ohjelma on jo käynnissä."
|
||||||
StrCpy $SectionGroup_Shortcuts "Pikakuvakkeet"
|
StrCpy $SectionGroup_Shortcuts "Pikakuvakkeet"
|
||||||
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Found ${APPLICATION_EXECUTABLE} process(s) which need to be stopped.$\nDo you want the installer to stop these for you?"
|
|
||||||
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Killing ${APPLICATION_EXECUTABLE} processes."
|
|
||||||
StrCpy $PageReinstall_NEW_Field_1 "An older version of ${APPLICATION_NAME} is installed on your system. It is recommended that you uninstall the current version before installing. Select the operation you want to perform and click Next to continue."
|
|
||||||
StrCpy $PageReinstall_OLD_Field_1 "A newer version of ${APPLICATION_NAME} is already installed! It is not recommended that you install an older version. If you really want to install this older version, it is better to uninstall the current version first. Select the operation you want to perform and click Next to continue."
|
|
||||||
StrCpy $PageReinstall_SAME_Field_2 "Add/Reinstall components"
|
|
||||||
StrCpy $SEC_APPLICATION_DETAILS "Installing ${APPLICATION_NAME} essentials."
|
|
||||||
StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} essentials."
|
|
||||||
StrCpy $UNINSTALLER_APPDATA_LABEL_2 "Leave unchecked to keep the data folder for later use or check to delete the data folder."
|
|
||||||
StrCpy $UNINSTALLER_FILE_Detail "Writing Uninstaller"
|
|
||||||
StrCpy $UNINSTALL_MESSAGEBOX "It does not appear that ${APPLICATION_NAME} is installed in the directory '$INSTDIR'.$\r$\nContinue anyway (not recommended)?"
|
|
||||||
StrCpy $INIT_NO_QUICK_LAUNCH "Quick Launch Shortcut (N/A)"
|
|
||||||
StrCpy $UAC_ERROR_ELEVATE "Unable to elevate, error:"
|
|
||||||
|
|||||||
@@ -1,26 +1,28 @@
|
|||||||
# Auto-generated - do not modify
|
# Auto-generated - do not modify
|
||||||
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Montrer les notes de version"
|
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Afficher les notes de version"
|
||||||
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Le(s) processus en cours d’exécution ${APPLICATION_EXECUTABLE} doit être stoppé afin de poursuivre.$\nVoulez-vous que le programme d’installation s’en charge pour vous ?"
|
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Le(s) processus en cours d’exécution ${APPLICATION_EXECUTABLE} doit (doivent) être stoppé(s) afin de poursuivre.$\nVoulez-vous que le programme d’installation s’en charge pour vous ?"
|
||||||
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Fermeture du processus ${APPLICATION_EXECUTABLE}."
|
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Fermeture des processus ${APPLICATION_EXECUTABLE}."
|
||||||
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Les processus à stopper n'ont pas été trouvés."
|
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Le processus à stopper n'a pas été trouvé !"
|
||||||
StrCpy $PageReinstall_NEW_Field_1 "Une vieille version de ${APPLICATION_NAME} est installée sur votre système. Il est recommandé que vous désinstalliez cette version avant l'installation. Sélectionnez l'opération que vous voulez exécuter et cliquez sur Suivant pour continuer."
|
StrCpy $PageReinstall_NEW_Field_1 "Une ancienne version de ${APPLICATION_NAME} est installée sur votre système. Il est recommandé de désinstaller cette version avant de continuer. Sélectionnez l'opération que vous voulez exécuter et cliquez sur Suivant pour continuer."
|
||||||
StrCpy $PageReinstall_NEW_Field_2 "Désinstaller avant d'installer à nouveau"
|
StrCpy $PageReinstall_NEW_Field_2 "Désinstaller avant d'installer à nouveau"
|
||||||
StrCpy $PageReinstall_NEW_Field_3 "Ne pas désinstaller"
|
StrCpy $PageReinstall_NEW_Field_3 "Ne pas désinstaller"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Déjà installée"
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Déjà installé"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Choisissez comment vous voulez installer ${APPLICATION_NAME}."
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Choisissez comment installer ${APPLICATION_NAME}."
|
||||||
StrCpy $PageReinstall_OLD_Field_1 "Une version plus récente de ${APPLICATION_NAME} est déjà installée ! Il n'est pas recommandé d'installer une version plus ancienne. Si vous voulez vraiment installer cette version plus ancienne, il est préférable de d'abord désinstaller la version courante. Sélectionnez l'opération que vous voulez exécuter et cliquez sur Suivant pour continuer."
|
StrCpy $PageReinstall_OLD_Field_1 "Une version plus récente de ${APPLICATION_NAME} est déjà installée ! Il n'est pas recommandé d'installer une version plus ancienne. Si vous voulez vraiment installer cette version plus ancienne, il est préférable de d'abord désinstaller la version courante. Sélectionnez l'opération que vous voulez exécuter et cliquez sur Suivant pour continuer."
|
||||||
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} est déjà installée.\nSélectionnez l'opération que vous voulez exécuter et cliquez sur Suivant pour continuer."
|
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} est déjà installé.\nSélectionnez l'opération que vous voulez exécuter et cliquez sur Suivant pour continuer."
|
||||||
StrCpy $PageReinstall_SAME_Field_2 "Ajouter/Réinstaller des composants"
|
StrCpy $PageReinstall_SAME_Field_2 "Ajouter/Réinstaller des composants"
|
||||||
StrCpy $PageReinstall_SAME_Field_3 "Désinstaller ${APPLICATION_NAME}"
|
StrCpy $PageReinstall_SAME_Field_3 "Désinstaller ${APPLICATION_NAME}"
|
||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "Désinstaller ${APPLICATION_NAME}"
|
StrCpy $UNINSTALLER_APPDATA_TITLE "Désinstaller ${APPLICATION_NAME}"
|
||||||
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Choisir l'option de maintenance à appliquer."
|
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Choisir l'opération de maintenance à effectuer."
|
||||||
StrCpy $SEC_APPLICATION_DETAILS "Installer les essentiels de ${APPLICATION_NAME}."
|
StrCpy $SEC_APPLICATION_DETAILS "Installation des essentiels de ${APPLICATION_NAME}."
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Intégration à l'Explorateur Windows"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installation de l'intégration à l'Explorateur Windows..."
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Raccourci programme du menu Démarrer"
|
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Raccourci programme du menu Démarrer"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Ajouter un raccourci pour ${APPLICATION_NAME} au menu Démarrer."
|
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Ajout d'un raccourci pour ${APPLICATION_NAME} au menu Démarrer."
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Raccourci Bureau"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Raccourci Bureau"
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Créer un raccourci Bureau"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Création d'un raccourci sur le Bureau"
|
||||||
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Raccourci de lancement rapide"
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Raccourci de lancement rapide"
|
||||||
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Créer un raccourci de lancement rapide"
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Création d'un raccourci de lancement rapide"
|
||||||
StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "Essentiels de ${APPLICATION_NAME}."
|
StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "Essentiels de ${APPLICATION_NAME}."
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_Desc "Raccourci de ${APPLICATION_NAME}"
|
StrCpy $OPTION_SECTION_SC_START_MENU_Desc "Raccourci de ${APPLICATION_NAME}"
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Raccourci Bureau de ${APPLICATION_NAME}."
|
StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Raccourci Bureau de ${APPLICATION_NAME}."
|
||||||
@@ -32,11 +34,11 @@ StrCpy $UNINSTALLER_APPDATA_CHECKBOX "Oui, supprimer ce dossier de données."
|
|||||||
StrCpy $UNINSTALLER_FILE_Detail "Écriture du désinstallateur"
|
StrCpy $UNINSTALLER_FILE_Detail "Écriture du désinstallateur"
|
||||||
StrCpy $UNINSTALLER_REGISTRY_Detail "Écriture des clefs de registre du désinstallateur"
|
StrCpy $UNINSTALLER_REGISTRY_Detail "Écriture des clefs de registre du désinstallateur"
|
||||||
StrCpy $UNINSTALLER_FINISHED_Detail "Terminé"
|
StrCpy $UNINSTALLER_FINISHED_Detail "Terminé"
|
||||||
StrCpy $UNINSTALL_MESSAGEBOX "Il semble que ${APPLICATION_NAME} ne soit pas installée dans le dossier '$INSTDIR'.$\n$\nVoulez-vous poursuivre (non recommandé) ?"
|
StrCpy $UNINSTALL_MESSAGEBOX "Il semble que ${APPLICATION_NAME} ne soit pas installé dans le dossier '$INSTDIR'.$\n$\nVoulez-vous poursuivre (non recommandé) ?"
|
||||||
StrCpy $UNINSTALL_ABORT "Désinstallation interrompue par l'utilisateur"
|
StrCpy $UNINSTALL_ABORT "Désinstallation interrompue par l'utilisateur"
|
||||||
StrCpy $INIT_NO_QUICK_LAUNCH "Raccourci de lancement rapide (N/A)"
|
StrCpy $INIT_NO_QUICK_LAUNCH "Raccourci de lancement rapide (non disponible)"
|
||||||
StrCpy $INIT_NO_DESKTOP "Raccourci bureau (remplace l’existant)"
|
StrCpy $INIT_NO_DESKTOP "Raccourci bureau (remplace l’existant)"
|
||||||
StrCpy $UAC_ERROR_ELEVATE "Echec d'élévation, erreur :"
|
StrCpy $UAC_ERROR_ELEVATE "Échec d'élévation, erreur :"
|
||||||
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Cet installateur requiert les droits administrateur, essayez à nouveau"
|
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Cet installateur requiert les droits administrateur, essayez à nouveau"
|
||||||
StrCpy $INIT_INSTALLER_RUNNING "Une installation est déjà en cours."
|
StrCpy $INIT_INSTALLER_RUNNING "Une installation est déjà en cours."
|
||||||
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Ce désinstallateur requiert les droits administrateur, essayez à nouveau"
|
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Ce désinstallateur requiert les droits administrateur, essayez à nouveau"
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ StrCpy $PageReinstall_SAME_Field_3 "Desinstalar ${APPLICATION_NAME}"
|
|||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "Desinstalar ${APPLICATION_NAME}"
|
StrCpy $UNINSTALLER_APPDATA_TITLE "Desinstalar ${APPLICATION_NAME}"
|
||||||
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Escolla a opción de mantemento a realizar."
|
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Escolla a opción de mantemento a realizar."
|
||||||
StrCpy $SEC_APPLICATION_DETAILS "Instalando ${APPLICATION_NAME} esenciais."
|
StrCpy $SEC_APPLICATION_DETAILS "Instalando ${APPLICATION_NAME} esenciais."
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integración con Windows Explorer"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Instalando a integración con Windows Explorer"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Acceso directo ao programa no menú de inicio"
|
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Acceso directo ao programa no menú de inicio"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Engadindo o acceso directo ao ${APPLICATION_NAME} no menú de inicio"
|
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Engadindo o acceso directo ao ${APPLICATION_NAME} no menú de inicio"
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Acceso directo no escritorio"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Acceso directo no escritorio"
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ StrCpy $PageReinstall_SAME_Field_3 "${APPLICATION_NAME} entfernen"
|
|||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "${APPLICATION_NAME} entfernen"
|
StrCpy $UNINSTALLER_APPDATA_TITLE "${APPLICATION_NAME} entfernen"
|
||||||
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Wählen Sie zur Ausführung die Wartungsoption."
|
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Wählen Sie zur Ausführung die Wartungsoption."
|
||||||
StrCpy $SEC_APPLICATION_DETAILS "Installiere ${APPLICATION_NAME} Basis."
|
StrCpy $SEC_APPLICATION_DETAILS "Installiere ${APPLICATION_NAME} Basis."
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integration in den Windows Explorer"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installiere Integration in den Windows Explorer"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Installiere Verknüpfung im Programmmenü"
|
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Installiere Verknüpfung im Programmmenü"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Füge Verknüpfung für ${APPLICATION_NAME} dem Startmenü hinzu."
|
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Füge Verknüpfung für ${APPLICATION_NAME} dem Startmenü hinzu."
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Desktop-Verknüpfung"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Desktop-Verknüpfung"
|
||||||
@@ -36,7 +38,7 @@ StrCpy $UNINSTALL_MESSAGEBOX "Es scheint, als ob ${APPLICATION_NAME} nicht im Ve
|
|||||||
StrCpy $UNINSTALL_ABORT "Deinstallation vom Benutzer abgebrochen"
|
StrCpy $UNINSTALL_ABORT "Deinstallation vom Benutzer abgebrochen"
|
||||||
StrCpy $INIT_NO_QUICK_LAUNCH "Schnellstart-Verknüpfung (Nicht verfügbar)"
|
StrCpy $INIT_NO_QUICK_LAUNCH "Schnellstart-Verknüpfung (Nicht verfügbar)"
|
||||||
StrCpy $INIT_NO_DESKTOP "Desktop-Verknüpfung (überschreibt vorhandene)"
|
StrCpy $INIT_NO_DESKTOP "Desktop-Verknüpfung (überschreibt vorhandene)"
|
||||||
StrCpy $UAC_ERROR_ELEVATE "Kann Rechte nicht erhöhen, Fehler:"
|
StrCpy $UAC_ERROR_ELEVATE "Rechte können nicht erhöht werden, Fehler:"
|
||||||
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Dieses Installationsprogramm erfordert Administrator-Rechte, bitte erneut versuchen"
|
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Dieses Installationsprogramm erfordert Administrator-Rechte, bitte erneut versuchen"
|
||||||
StrCpy $INIT_INSTALLER_RUNNING "Das Installationsprogramm wird bereits ausgeführt."
|
StrCpy $INIT_INSTALLER_RUNNING "Das Installationsprogramm wird bereits ausgeführt."
|
||||||
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Das Deinstallationsprogramm erfordert Administrator-Rechte. Bitte erneut versuchen."
|
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Das Deinstallationsprogramm erfordert Administrator-Rechte. Bitte erneut versuchen."
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ StrCpy $PageReinstall_SAME_Field_3 "
|
|||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "Απεγκατάσταση ${APPLICATION_NAME}"
|
StrCpy $UNINSTALLER_APPDATA_TITLE "Απεγκατάσταση ${APPLICATION_NAME}"
|
||||||
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Επιλέξτε την επιλογή συντήρησης που θα πραγματοποιηθεί."
|
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Επιλέξτε την επιλογή συντήρησης που θα πραγματοποιηθεί."
|
||||||
StrCpy $SEC_APPLICATION_DETAILS "Εγκατάσταση βάσης ${APPLICATION_NAME} σε εξέλιξη."
|
StrCpy $SEC_APPLICATION_DETAILS "Εγκατάσταση βάσης ${APPLICATION_NAME} σε εξέλιξη."
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Ενσωμάτωση στην Εξερεύνηση των Windows"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Εγκατάσταση ενσωμάτωσης στην Εξερεύνηση των Windows"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Συντόμευση στο Αρχικό Μενού"
|
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Συντόμευση στο Αρχικό Μενού"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Προσθήκη συντόμευσης για την ${APPLICATION_NAME} στο Αρχικό Μενού."
|
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Προσθήκη συντόμευσης για την ${APPLICATION_NAME} στο Αρχικό Μενού."
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Συντόμευση επιφάνειας εργασίας"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Συντόμευση επιφάνειας εργασίας"
|
||||||
|
|||||||
@@ -9,6 +9,13 @@ StrCpy $PageReinstall_SAME_Field_3 "${APPLICATION_NAME} eltávolítása"
|
|||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "${APPLICATION_NAME} eltávolítása"
|
StrCpy $UNINSTALLER_APPDATA_TITLE "${APPLICATION_NAME} eltávolítása"
|
||||||
StrCpy $UNINSTALLER_APPDATA_CHECKBOX "Igen, törölje ezt az adatkönyvtárat."
|
StrCpy $UNINSTALLER_APPDATA_CHECKBOX "Igen, törölje ezt az adatkönyvtárat."
|
||||||
StrCpy $UNINSTALLER_FINISHED_Detail "Befejezve"
|
StrCpy $UNINSTALLER_FINISHED_Detail "Befejezve"
|
||||||
|
StrCpy $UNINSTALL_ABORT "Az eltávolítást egy felhasználó megszakította"
|
||||||
|
StrCpy $INIT_NO_QUICK_LAUNCH "Gyorsindító Hivatkozás (N/A)"
|
||||||
|
StrCpy $INIT_NO_DESKTOP "Asztali Hivatkozás (felülírja a meglévőt)"
|
||||||
|
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "A telepítő futtatásához adminisztrátori hozzáférés szükséges, próbáld újra."
|
||||||
|
StrCpy $INIT_INSTALLER_RUNNING "A telepítő már fut."
|
||||||
|
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Az eltávolító futtatásához adminisztrátori hozzáférés szükséges, próbáld újra."
|
||||||
|
StrCpy $INIT_UNINSTALLER_RUNNING "Az eltávolító már fut."
|
||||||
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Found ${APPLICATION_EXECUTABLE} process(s) which need to be stopped.$\nDo you want the installer to stop these for you?"
|
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Found ${APPLICATION_EXECUTABLE} process(s) which need to be stopped.$\nDo you want the installer to stop these for you?"
|
||||||
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Killing ${APPLICATION_EXECUTABLE} processes."
|
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Killing ${APPLICATION_EXECUTABLE} processes."
|
||||||
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Process to kill not found!"
|
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Process to kill not found!"
|
||||||
@@ -17,6 +24,8 @@ StrCpy $PageReinstall_OLD_Field_1 "A newer version of ${APPLICATION_NAME} is alr
|
|||||||
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} is already installed.\r\nSelect the operation you want to perform and click Next to continue."
|
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} is already installed.\r\nSelect the operation you want to perform and click Next to continue."
|
||||||
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Choose the maintenance option to perform."
|
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Choose the maintenance option to perform."
|
||||||
StrCpy $SEC_APPLICATION_DETAILS "Installing ${APPLICATION_NAME} essentials."
|
StrCpy $SEC_APPLICATION_DETAILS "Installing ${APPLICATION_NAME} essentials."
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integration for Windows Explorer"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installing Integration for Windows Explorer"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Start Menu Program Shortcut"
|
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Start Menu Program Shortcut"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Adding shortcut for ${APPLICATION_NAME} to the Start Menu."
|
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Adding shortcut for ${APPLICATION_NAME} to the Start Menu."
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Desktop Shortcut"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Desktop Shortcut"
|
||||||
@@ -33,12 +42,5 @@ StrCpy $UNINSTALLER_APPDATA_LABEL_2 "Leave unchecked to keep the data folder for
|
|||||||
StrCpy $UNINSTALLER_FILE_Detail "Writing Uninstaller"
|
StrCpy $UNINSTALLER_FILE_Detail "Writing Uninstaller"
|
||||||
StrCpy $UNINSTALLER_REGISTRY_Detail "Writing Installer Registry Keys"
|
StrCpy $UNINSTALLER_REGISTRY_Detail "Writing Installer Registry Keys"
|
||||||
StrCpy $UNINSTALL_MESSAGEBOX "It does not appear that ${APPLICATION_NAME} is installed in the directory '$INSTDIR'.$\r$\nContinue anyway (not recommended)?"
|
StrCpy $UNINSTALL_MESSAGEBOX "It does not appear that ${APPLICATION_NAME} is installed in the directory '$INSTDIR'.$\r$\nContinue anyway (not recommended)?"
|
||||||
StrCpy $UNINSTALL_ABORT "Uninstall aborted by user"
|
|
||||||
StrCpy $INIT_NO_QUICK_LAUNCH "Quick Launch Shortcut (N/A)"
|
|
||||||
StrCpy $INIT_NO_DESKTOP "Desktop Shortcut (overwrites existing)"
|
|
||||||
StrCpy $UAC_ERROR_ELEVATE "Unable to elevate, error:"
|
StrCpy $UAC_ERROR_ELEVATE "Unable to elevate, error:"
|
||||||
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "This installer requires admin access, try again"
|
|
||||||
StrCpy $INIT_INSTALLER_RUNNING "The installer is already running."
|
|
||||||
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "This uninstaller requires admin access, try again"
|
|
||||||
StrCpy $INIT_UNINSTALLER_RUNNING "The uninstaller is already running."
|
|
||||||
StrCpy $SectionGroup_Shortcuts "Shortcuts"
|
StrCpy $SectionGroup_Shortcuts "Shortcuts"
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ StrCpy $PageReinstall_SAME_Field_3 "Disinstalla ${APPLICATION_NAME}"
|
|||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "Disinstalla ${APPLICATION_NAME}"
|
StrCpy $UNINSTALLER_APPDATA_TITLE "Disinstalla ${APPLICATION_NAME}"
|
||||||
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Scegli l'opzione di manutenzione da eseguire."
|
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Scegli l'opzione di manutenzione da eseguire."
|
||||||
StrCpy $SEC_APPLICATION_DETAILS "Installazione degli elementi fondamentali di ${APPLICATION_NAME}."
|
StrCpy $SEC_APPLICATION_DETAILS "Installazione degli elementi fondamentali di ${APPLICATION_NAME}."
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integrazione con Windows Explorer"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installazione dell'integrazione con Windows Explorer"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Scorciatoia di programma menu Start"
|
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Scorciatoia di programma menu Start"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Aggiunta della scorciatoia per ${APPLICATION_NAME} al menu Start."
|
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Aggiunta della scorciatoia per ${APPLICATION_NAME} al menu Start."
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Scorciatoia del desktop"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Scorciatoia del desktop"
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ StrCpy $PageReinstall_SAME_Field_3 "${APPLICATION_NAME}
|
|||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "${APPLICATION_NAME} をアンインストール"
|
StrCpy $UNINSTALLER_APPDATA_TITLE "${APPLICATION_NAME} をアンインストール"
|
||||||
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "実行するには、メンテナンスオプションを選択してください。"
|
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "実行するには、メンテナンスオプションを選択してください。"
|
||||||
StrCpy $SEC_APPLICATION_DETAILS "${APPLICATION_NAME} の重要なパッケージをインストール中"
|
StrCpy $SEC_APPLICATION_DETAILS "${APPLICATION_NAME} の重要なパッケージをインストール中"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Windows エクスプローラーへの統合"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Windows エクスプローラーへの統合をインストールしています。"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "スタートメニューショートカット"
|
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "スタートメニューショートカット"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "スタートメニューに${APPLICATION_NAME} のショートカットの追加"
|
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "スタートメニューに${APPLICATION_NAME} のショートカットの追加"
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "デスクトップショートカット"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "デスクトップショートカット"
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ StrCpy $PageReinstall_SAME_Field_3 "Odinstaluj ${APPLICATION_NAME}"
|
|||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "Odinstaluj ${APPLICATION_NAME}"
|
StrCpy $UNINSTALLER_APPDATA_TITLE "Odinstaluj ${APPLICATION_NAME}"
|
||||||
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Wybierz sposób utrzymywania."
|
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Wybierz sposób utrzymywania."
|
||||||
StrCpy $SEC_APPLICATION_DETAILS "Instaluje niezbędne pliki ${APPLICATION_NAME}."
|
StrCpy $SEC_APPLICATION_DETAILS "Instaluje niezbędne pliki ${APPLICATION_NAME}."
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "integracja z Eksploratorem Windows"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Instalowanie Integracji z Eksploratorem Windows"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Skrót w Menu Start"
|
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Skrót w Menu Start"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Dodaję skrót ${APPLICATION_NAME} w Menu Start."
|
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Dodaję skrót ${APPLICATION_NAME} w Menu Start."
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Skrót na Pulpicie"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Skrót na Pulpicie"
|
||||||
|
|||||||
@@ -1,20 +1,22 @@
|
|||||||
# Auto-generated - do not modify
|
# Auto-generated - do not modify
|
||||||
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Mostrar notas de lançamento"
|
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Mostrar notas de lançamento"
|
||||||
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Encontrados processos ${APPLICATION_EXECUTABLE} que precisam de ser parados.$\nDeseja que o instalador os pare ?"
|
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Processos(s) ${APPLICATION_EXECUTABLE} em execução. Estes processos precisam de ser interrompidos.$\\nDeseja que o instalador os termine automaticamente?"
|
||||||
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "A terminar processos ${APPLICATION_EXECUTABLE}."
|
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "A terminar os processos ${APPLICATION_EXECUTABLE}."
|
||||||
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Processo para terminar não foi encontrado!"
|
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Não foi encontrado o processo a terminar!"
|
||||||
StrCpy $PageReinstall_NEW_Field_1 "Está instalada uma versão anterior de ${APPLICATION_NAME} no seu sistema. Recomenda-se que desinstale primeiro a versão atual antes de instalar. Selecione a operação que pretende fazer, e clique Seguinte para continuar."
|
StrCpy $PageReinstall_NEW_Field_1 "Uma versão antiga de ${APPLICATION_NAME} está instalada no sistema. É recomendado que você desinstale a versão atual antes de instalar. Selecione a operação que deseja executar e clique em $\"Avançar$\" para continuar."
|
||||||
StrCpy $PageReinstall_NEW_Field_2 "Desinstalar antes de instalar"
|
StrCpy $PageReinstall_NEW_Field_2 "Desinstalar antes de instalar"
|
||||||
StrCpy $PageReinstall_NEW_Field_3 "Não desinstalar"
|
StrCpy $PageReinstall_NEW_Field_3 "Não desinstale"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Já instalado"
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Já instalado"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Escolha como pretende instalar ${APPLICATION_NAME}."
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Escolha como pretende instalar ${APPLICATION_NAME}."
|
||||||
StrCpy $PageReinstall_OLD_Field_1 "Já esta instalada uma nova versão dfe ${APPLICATION_NAME}! Não se recomenda instalar uma versão anterior. Se quer mesmo instalar esta versão mais antiga, é melhor desinstalar primeiro a versão atual. Selecione a operação que pretende fazer e clique Seguinte para continuar."
|
StrCpy $PageReinstall_OLD_Field_1 "Uma versão mais recente do ${APPLICATION_NAME} já está instalada! Não é recomendada a instalação de uma versão mais antiga. Se realmente deseja instalar esta versão, aconselha-se a desinstalação da versão atual primeiro. Selecione a operação que deseja executar e clique em Avançar para continuar."
|
||||||
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} já está instalado.\nSelecione a operação que deseja fazer, e clique Seguinte para continuar."
|
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} já está instalado.\nSelecione a operação que deseja fazer, e clique Seguinte para continuar."
|
||||||
StrCpy $PageReinstall_SAME_Field_2 "Adicionar/Reinstalar Componentes"
|
StrCpy $PageReinstall_SAME_Field_2 "Adicionar/Reinstalar Componentes"
|
||||||
StrCpy $PageReinstall_SAME_Field_3 "Desinstalar ${APPLICATION_NAME}"
|
StrCpy $PageReinstall_SAME_Field_3 "Desinstalar ${APPLICATION_NAME}"
|
||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "Desinstalar ${APPLICATION_NAME}"
|
StrCpy $UNINSTALLER_APPDATA_TITLE "Desinstalar ${APPLICATION_NAME}"
|
||||||
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Escolha a opção de manutenção a fazer."
|
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Escolha a opção de manutenção a realizar."
|
||||||
StrCpy $SEC_APPLICATION_DETAILS "A instalar o essencial de ${APPLICATION_NAME}."
|
StrCpy $SEC_APPLICATION_DETAILS "A instalar o essencial de ${APPLICATION_NAME}."
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integração para Windows Explorer"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "A instalar integração para Windows Explorer"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Atalho do progama no Menu Inicial"
|
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Atalho do progama no Menu Inicial"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "A adicionar o atalho de ${APPLICATION_NAME} ao Menu Inicial."
|
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "A adicionar o atalho de ${APPLICATION_NAME} ao Menu Inicial."
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Atalho da área de trabalho"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Atalho da área de trabalho"
|
||||||
@@ -38,7 +40,7 @@ StrCpy $INIT_NO_QUICK_LAUNCH "Atalho de Início Rápido (N/A)"
|
|||||||
StrCpy $INIT_NO_DESKTOP "Atalho do Ambiente de Trabalho (sobrepõe o existente)"
|
StrCpy $INIT_NO_DESKTOP "Atalho do Ambiente de Trabalho (sobrepõe o existente)"
|
||||||
StrCpy $UAC_ERROR_ELEVATE "Incapaz de elevar, erro:"
|
StrCpy $UAC_ERROR_ELEVATE "Incapaz de elevar, erro:"
|
||||||
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Este instalador precisa de permissões de administrador, tente novamente"
|
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Este instalador precisa de permissões de administrador, tente novamente"
|
||||||
StrCpy $INIT_INSTALLER_RUNNING "O instalador já está a correr."
|
StrCpy $INIT_INSTALLER_RUNNING "O instalador já está em execução."
|
||||||
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Este desinstalador precisa de acesso de administrador; tente novamente"
|
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Este desinstalador requer permissões de administrador, tente novamente"
|
||||||
StrCpy $INIT_UNINSTALLER_RUNNING "O desinstalador já está a correr."
|
StrCpy $INIT_UNINSTALLER_RUNNING "O desinstalador já está em execução."
|
||||||
StrCpy $SectionGroup_Shortcuts "Atalhos"
|
StrCpy $SectionGroup_Shortcuts "Atalhos"
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Processo para eliminar n
|
|||||||
StrCpy $PageReinstall_NEW_Field_1 "Uma versão mais antiga de ${APPLICATION_NAME} está instalado em seu sistema. É recomendado que você desinstale a versão atual antes de instalar. Selecione a operação que deseja executar e clique em Avançar para continuar."
|
StrCpy $PageReinstall_NEW_Field_1 "Uma versão mais antiga de ${APPLICATION_NAME} está instalado em seu sistema. É recomendado que você desinstale a versão atual antes de instalar. Selecione a operação que deseja executar e clique em Avançar para continuar."
|
||||||
StrCpy $PageReinstall_NEW_Field_2 "Desinstalar antes de instalar"
|
StrCpy $PageReinstall_NEW_Field_2 "Desinstalar antes de instalar"
|
||||||
StrCpy $PageReinstall_NEW_Field_3 "Não desinstale"
|
StrCpy $PageReinstall_NEW_Field_3 "Não desinstale"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Já instalado"
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Já Instalado"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Escolha como você deseja instalar ${APPLICATION_NAME}."
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Escolha como você deseja instalar ${APPLICATION_NAME}."
|
||||||
StrCpy $PageReinstall_OLD_Field_1 "A versão mais recente do ${APPLICATION_NAME} já está instalado! Não é recomendado que você instale uma versão mais antiga. Se você realmente deseja instalar esta versão mais antiga, é melhor desinstalar a versão atual primeiro. Selecione a operação que deseja executar e clique em Avançar para continuar."
|
StrCpy $PageReinstall_OLD_Field_1 "A versão mais recente do ${APPLICATION_NAME} já está instalado! Não é recomendado que você instale uma versão mais antiga. Se você realmente deseja instalar esta versão mais antiga, é melhor desinstalar a versão atual primeiro. Selecione a operação que deseja executar e clique em Avançar para continuar."
|
||||||
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${version} já está instalado. \nSelecione a operação que deseja executar e clique em Avançar para continuar."
|
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${version} já está instalado. \nSelecione a operação que deseja executar e clique em Avançar para continuar."
|
||||||
@@ -15,8 +15,10 @@ StrCpy $PageReinstall_SAME_Field_3 "Desinstalar ${APPLICATION_NAME}"
|
|||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "Desinstalar ${APPLICATION_NAME}"
|
StrCpy $UNINSTALLER_APPDATA_TITLE "Desinstalar ${APPLICATION_NAME}"
|
||||||
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Escolha a opção de realizar manutenção."
|
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Escolha a opção de realizar manutenção."
|
||||||
StrCpy $SEC_APPLICATION_DETAILS "Instalando ${APPLICATION_NAME} fundamentos."
|
StrCpy $SEC_APPLICATION_DETAILS "Instalando ${APPLICATION_NAME} fundamentos."
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integração para Windows Explorer"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Instalação de Integração para Windows Explorer"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Menu Iniciar Programa Atalho"
|
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Menu Iniciar Programa Atalho"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Adicionando atalho para ${APPLICATION_NAME} para o Menu Iniciar."
|
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Adicionando atalho para ${APPLICATION_NAME} ao Menu Iniciar."
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Atalho Desktop"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Atalho Desktop"
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Criando Atalhos de Desktop"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Criando Atalhos de Desktop"
|
||||||
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Atalho Rápido"
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Atalho Rápido"
|
||||||
@@ -29,13 +31,13 @@ StrCpy $UNINSTALLER_APPDATA_SUBTITLE "Remover ${APPLICATION_NAME} pasta de dado
|
|||||||
StrCpy $UNINSTALLER_APPDATA_LABEL_1 "Você quer apagar ${APPLICATION_NAME} 's pasta de dados?"
|
StrCpy $UNINSTALLER_APPDATA_LABEL_1 "Você quer apagar ${APPLICATION_NAME} 's pasta de dados?"
|
||||||
StrCpy $UNINSTALLER_APPDATA_LABEL_2 "Deixe desmarcada para manter a pasta de dados para uso posterior ou cheque para excluir a pasta de dados."
|
StrCpy $UNINSTALLER_APPDATA_LABEL_2 "Deixe desmarcada para manter a pasta de dados para uso posterior ou cheque para excluir a pasta de dados."
|
||||||
StrCpy $UNINSTALLER_APPDATA_CHECKBOX "Sim, excluir essa pasta de dados."
|
StrCpy $UNINSTALLER_APPDATA_CHECKBOX "Sim, excluir essa pasta de dados."
|
||||||
StrCpy $UNINSTALLER_FILE_Detail "Escrevendo Desinstalador"
|
StrCpy $UNINSTALLER_FILE_Detail "Gravando Desinstalador"
|
||||||
StrCpy $UNINSTALLER_REGISTRY_Detail "Escrevendo Chaves de Registro do Inslalador"
|
StrCpy $UNINSTALLER_REGISTRY_Detail "Gravando Chaves de Registro do Inslalador"
|
||||||
StrCpy $UNINSTALLER_FINISHED_Detail "Finalizado"
|
StrCpy $UNINSTALLER_FINISHED_Detail "Finalizado"
|
||||||
StrCpy $UNINSTALL_MESSAGEBOX "Não parece que ${APPLICATION_NAME} está instalado no diretório '$INSTDIR'.$\n$\nContinuar assim mesmo (não recomendado)?"
|
StrCpy $UNINSTALL_MESSAGEBOX "Não parece que ${APPLICATION_NAME} está instalado no diretório '$INSTDIR'.$\n$\nContinuar assim mesmo (não recomendado)?"
|
||||||
StrCpy $UNINSTALL_ABORT "Desinstalação abortada pelo usuário"
|
StrCpy $UNINSTALL_ABORT "Desinstalação abortada pelo usuário"
|
||||||
StrCpy $INIT_NO_QUICK_LAUNCH "Atalho de Inicialização Rápida (N/A)"
|
StrCpy $INIT_NO_QUICK_LAUNCH "Atalho de Inicialização Rápida (N/A)"
|
||||||
StrCpy $INIT_NO_DESKTOP "Atalho Desktop (substituições existente)"
|
StrCpy $INIT_NO_DESKTOP "Atalho Desktop (substitui os existente)"
|
||||||
StrCpy $UAC_ERROR_ELEVATE "Incapaz de elevar, erro:"
|
StrCpy $UAC_ERROR_ELEVATE "Incapaz de elevar, erro:"
|
||||||
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Este programa de instalação requer acesso de administrador, tente novamente"
|
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Este programa de instalação requer acesso de administrador, tente novamente"
|
||||||
StrCpy $INIT_INSTALLER_RUNNING "O instalador já está em execução."
|
StrCpy $INIT_INSTALLER_RUNNING "O instalador já está em execução."
|
||||||
|
|||||||
@@ -1,44 +1,46 @@
|
|||||||
# Auto-generated - do not modify
|
# Auto-generated - do not modify
|
||||||
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Показать примечания к выпуску"
|
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Показать примечания к выпуску"
|
||||||
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Обнаружены процес(сы) ${APPLICATION_EXECUTABLE}, которые должны быть остановлены.$\nХотите программа установки сделает это самостоятельно?"
|
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Обнаружен процесс ${APPLICATION_EXECUTABLE}, который требуется остановить.$\nВы хотите чтобы программа установки сделала это самостоятельно?"
|
||||||
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Завершение процессов ${APPLICATION_EXECUTABLE}."
|
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Завершение процессов ${APPLICATION_EXECUTABLE}."
|
||||||
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Не найдены процессы, которые нужно завершить!"
|
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Процессы для завершения не найдены!"
|
||||||
StrCpy $PageReinstall_NEW_Field_1 "Обнаружена более старая версия ${APPLICATION_NAME}. Рекомендуется удалить её перед установкой. Выберите желаемое действие и нажмите $\"Далее$\"."
|
StrCpy $PageReinstall_NEW_Field_1 "Обнаружена более старая версия ${APPLICATION_NAME}. Рекомендуется удалить её перед установкой. Выберите желаемое действие и нажмите Далее для продолжения."
|
||||||
StrCpy $PageReinstall_NEW_Field_2 "Удалить перед установкой"
|
StrCpy $PageReinstall_NEW_Field_2 "Удалить перед установкой"
|
||||||
StrCpy $PageReinstall_NEW_Field_3 "Не устанавливать"
|
StrCpy $PageReinstall_NEW_Field_3 "Не устанавливать"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Уже установлено"
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Уже установлено"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Выберите, как вы хотите установить ${APPLICATION_NAME}."
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Выберите, как вы хотите установить ${APPLICATION_NAME}."
|
||||||
StrCpy $PageReinstall_OLD_Field_1 "Новая версия ${APPLICATION_NAME} уже установлена! Не рекомендуется устанавливать старую версию. Если вы действительно хотите, чтобы устанавливать старую версию, лучше удалить текущую версию. Выберите операцию, которую необходимо выполнить, и нажмите Далее, чтобы продолжить."
|
StrCpy $PageReinstall_OLD_Field_1 "Новая версия ${APPLICATION_NAME} уже установлена! Не рекомендуется устанавливать старую версию. Если вы действительно хотите установить эту старую версию, то сначала лучше удалить текущую версию. Выберите желаемое действие и нажмите Далее для продолжения."
|
||||||
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} уже установлена.\nВыберите операцию, которую необходимо выполнить, и нажмите Далее, чтобы продолжить."
|
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} уже установлена.\nВыберите желаемое действие и нажмите Далее для продолжения."
|
||||||
StrCpy $PageReinstall_SAME_Field_2 "Добавить/Переустановить компоненты"
|
StrCpy $PageReinstall_SAME_Field_2 "Добавить/Переустановить компоненты"
|
||||||
StrCpy $PageReinstall_SAME_Field_3 "Удалить ${APPLICATION_NAME}"
|
StrCpy $PageReinstall_SAME_Field_3 "Удалить ${APPLICATION_NAME}"
|
||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "Удалить ${APPLICATION_NAME}"
|
StrCpy $UNINSTALLER_APPDATA_TITLE "Удалить ${APPLICATION_NAME}"
|
||||||
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Выберите опцию обслуживания для исполнения."
|
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Выберите опцию обслуживания для исполнения."
|
||||||
StrCpy $SEC_APPLICATION_DETAILS "Установка зависимостей приложения ${APPLICATION_NAME}"
|
StrCpy $SEC_APPLICATION_DETAILS "Установка базовых компонентов ${APPLICATION_NAME}"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Интеграция для проводника Windows"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Установка интеграции с проводником Windows"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Ярлык в меню Пуск"
|
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Ярлык в меню Пуск"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Добавление ярлыка ${APPLICATION_NAME} в меню Пуск"
|
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Добавление ярлыка ${APPLICATION_NAME} в меню Пуск"
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Ярлык на рабочем столе"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Ярлык на рабочем столе"
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Создание ярлыков на рабочем столе"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Создание ярлыков на рабочем столе"
|
||||||
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Ярлык в меню быстрого запуска"
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Ярлык в меню быстрого запуска"
|
||||||
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Создание ярлыка в меню быстрого запуска"
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Создание ярлыка в меню быстрого запуска"
|
||||||
StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "Зависимости приложения ${APPLICATION_NAME}."
|
StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "Базовые компоненты ${APPLICATION_NAME}."
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_Desc "Ярлык приложения ${APPLICATION_NAME}."
|
StrCpy $OPTION_SECTION_SC_START_MENU_Desc "Ярлык приложения ${APPLICATION_NAME}."
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Ярлык на рабочем столе для ${APPLICATION_NAME}."
|
StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Ярлык на рабочем столе для ${APPLICATION_NAME}."
|
||||||
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Ярлык в меню быстрого запуска для ${APPLICATION_NAME}."
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Ярлык в меню быстрого запуска для ${APPLICATION_NAME}."
|
||||||
StrCpy $UNINSTALLER_APPDATA_SUBTITLE "Удалить папку данных ${APPLICATION_NAME} с вашего компьютера."
|
StrCpy $UNINSTALLER_APPDATA_SUBTITLE "Удалить каталог данных ${APPLICATION_NAME} с вашего компьютера."
|
||||||
StrCpy $UNINSTALLER_APPDATA_LABEL_1 "Вы хотите удалить папку с данными ${APPLICATION_NAME} ?"
|
StrCpy $UNINSTALLER_APPDATA_LABEL_1 "Вы действительно хотите удалить каталог с данными ${APPLICATION_NAME} ?"
|
||||||
StrCpy $UNINSTALLER_APPDATA_LABEL_2 "Оставьте неактивным, для сохранения папки с данными приложения, для последующего их использования."
|
StrCpy $UNINSTALLER_APPDATA_LABEL_2 "Оставьте неактивным для сохранения каталога с данными для последующего использования или отметьте для удаления."
|
||||||
StrCpy $UNINSTALLER_APPDATA_CHECKBOX "Да, удалить эту папку с данными."
|
StrCpy $UNINSTALLER_APPDATA_CHECKBOX "Да, удалить этот каталог с данными."
|
||||||
StrCpy $UNINSTALLER_FILE_Detail "Сохранение деинсталятора"
|
StrCpy $UNINSTALLER_FILE_Detail "Сохранение деинсталлятора"
|
||||||
StrCpy $UNINSTALLER_REGISTRY_Detail "Запись ключей реестра"
|
StrCpy $UNINSTALLER_REGISTRY_Detail "Запись ключей реестра установщика"
|
||||||
StrCpy $UNINSTALLER_FINISHED_Detail "Завершено"
|
StrCpy $UNINSTALLER_FINISHED_Detail "Завершено"
|
||||||
StrCpy $UNINSTALL_MESSAGEBOX "Скорее всего, приложение ${APPLICATION_NAME} уже установлено в директорию '$INSTDIR'.\nВсе равно продолжить (не рекомендуется)?"
|
StrCpy $UNINSTALL_MESSAGEBOX "Похоже, что приложение ${APPLICATION_NAME} не установлено в каталог '$INSTDIR'.\nВсе равно продолжить (не рекомендуется)?"
|
||||||
StrCpy $UNINSTALL_ABORT "Удаление отменено пользователем"
|
StrCpy $UNINSTALL_ABORT "Удаление отменено пользователем"
|
||||||
StrCpy $INIT_NO_QUICK_LAUNCH "Ярлык быстрого запуска (недоступен)"
|
StrCpy $INIT_NO_QUICK_LAUNCH "Ярлык быстрого запуска (не доступен)"
|
||||||
StrCpy $INIT_NO_DESKTOP "Ярлык на рабочем столе (перезаписать существующий)"
|
StrCpy $INIT_NO_DESKTOP "Ярлык на рабочем столе (перезапись существующего)"
|
||||||
StrCpy $UAC_ERROR_ELEVATE "Невозможно поднять, ошибка:"
|
StrCpy $UAC_ERROR_ELEVATE "Невозможно повысить привилегии, ошибка:"
|
||||||
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Для установки необходимы права администратора, попробуйте ещё раз."
|
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Этому установщику требуются права администратора, попробуйте ещё раз"
|
||||||
StrCpy $INIT_INSTALLER_RUNNING "Установщик уже запущен."
|
StrCpy $INIT_INSTALLER_RUNNING "Установщик уже запущен."
|
||||||
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Этот деинсталятор требует права администратора, попытайтесь ещё"
|
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Этому деинсталлятору требуются права администратора, попробуйте ещё раз"
|
||||||
StrCpy $INIT_UNINSTALLER_RUNNING "Программа удаления уже выполняется."
|
StrCpy $INIT_UNINSTALLER_RUNNING "Программа удаления уже выполняется."
|
||||||
StrCpy $SectionGroup_Shortcuts "Ярлыки"
|
StrCpy $SectionGroup_Shortcuts "Ярлыки"
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
# Auto-generated - do not modify
|
# Auto-generated - do not modify
|
||||||
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "查看版本日志"
|
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "查看版本日志"
|
||||||
|
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "有 ${APPLICATION_EXECUTABLE} 项进程需要关闭。$\n您想让安装程序关闭这些进程吗?"
|
||||||
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "杀死${APPLICATION_EXECUTABLE}进程。"
|
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "杀死${APPLICATION_EXECUTABLE}进程。"
|
||||||
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "未找到要杀死的进程!"
|
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "未找到要杀死的进程!"
|
||||||
StrCpy $PageReinstall_NEW_Field_1 "您的系统已经安装${APPLICATION_NAME}较老版本。建议安装前卸载当前版本。选择将要执行的操作,点击下一步继续。"
|
StrCpy $PageReinstall_NEW_Field_1 "您的系统已经安装${APPLICATION_NAME}较老版本。建议安装前卸载当前版本。选择将要执行的操作,点击下一步继续。"
|
||||||
@@ -7,11 +8,15 @@ StrCpy $PageReinstall_NEW_Field_2 "在安装前先卸载"
|
|||||||
StrCpy $PageReinstall_NEW_Field_3 "不要卸载"
|
StrCpy $PageReinstall_NEW_Field_3 "不要卸载"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "已经安装"
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "已经安装"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "选择如何安装${APPLICATION_NAME}。"
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "选择如何安装${APPLICATION_NAME}。"
|
||||||
StrCpy $PageReinstall_SAME_Field_2 "添加/重装组件"
|
StrCpy $PageReinstall_OLD_Field_1 "较新版本的 ${APPLICATION_NAME} 已经安装!安装较旧版本的程序是不推荐的。如果您希望继续安装较旧版本,建议先卸载较新版本。选择您想要执行的操作并点击下一步以继续。"
|
||||||
|
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} 已经安装。\n请选择想要执行的操作并点击下一步。"
|
||||||
|
StrCpy $PageReinstall_SAME_Field_2 "增加/重装组件"
|
||||||
StrCpy $PageReinstall_SAME_Field_3 "卸载${APPLICATION_NAME}"
|
StrCpy $PageReinstall_SAME_Field_3 "卸载${APPLICATION_NAME}"
|
||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "卸载${APPLICATION_NAME}"
|
StrCpy $UNINSTALLER_APPDATA_TITLE "卸载${APPLICATION_NAME}"
|
||||||
|
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "选择需要执行的维护选项。"
|
||||||
StrCpy $SEC_APPLICATION_DETAILS "安装${APPLICATION_NAME}基本组件。"
|
StrCpy $SEC_APPLICATION_DETAILS "安装${APPLICATION_NAME}基本组件。"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "开始菜单程序快捷方式"
|
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "开始菜单程序快捷方式"
|
||||||
|
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "添加 ${APPLICATION_NAME} 快捷方式到开始菜单。"
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "桌面快捷方式"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "桌面快捷方式"
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "创建桌面快捷方式"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "创建桌面快捷方式"
|
||||||
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "快速启动栏快捷方式"
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "快速启动栏快捷方式"
|
||||||
@@ -20,25 +25,22 @@ StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME}基本组件。"
|
|||||||
StrCpy $OPTION_SECTION_SC_START_MENU_Desc "${APPLICATION_NAME}快捷方式。"
|
StrCpy $OPTION_SECTION_SC_START_MENU_Desc "${APPLICATION_NAME}快捷方式。"
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "${APPLICATION_NAME}桌面快捷方式。"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "${APPLICATION_NAME}桌面快捷方式。"
|
||||||
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "${APPLICATION_NAME}快速启动栏快捷方式。"
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "${APPLICATION_NAME}快速启动栏快捷方式。"
|
||||||
|
StrCpy $UNINSTALLER_APPDATA_SUBTITLE "从电脑中移除 ${APPLICATION_NAME} 数据文件夹。"
|
||||||
|
StrCpy $UNINSTALLER_APPDATA_LABEL_1 "移除 ${APPLICATION_NAME} 数据文件夹?"
|
||||||
|
StrCpy $UNINSTALLER_APPDATA_LABEL_2 "选择以删除数据文件夹,不选择以保留数据文件夹内容供后续使用。"
|
||||||
StrCpy $UNINSTALLER_APPDATA_CHECKBOX "删除数据文件。"
|
StrCpy $UNINSTALLER_APPDATA_CHECKBOX "删除数据文件。"
|
||||||
StrCpy $UNINSTALLER_FILE_Detail "覆盖卸载器"
|
StrCpy $UNINSTALLER_FILE_Detail "覆盖卸载器"
|
||||||
|
StrCpy $UNINSTALLER_REGISTRY_Detail "正在写入注册表"
|
||||||
StrCpy $UNINSTALLER_FINISHED_Detail "完成"
|
StrCpy $UNINSTALLER_FINISHED_Detail "完成"
|
||||||
|
StrCpy $UNINSTALL_MESSAGEBOX "${APPLICATION_NAME} 可能并没有安装在 $INSTDIR。$\n$\n仍然继续吗?(不推荐)"
|
||||||
|
StrCpy $UNINSTALL_ABORT "用户取消了卸载"
|
||||||
StrCpy $INIT_NO_QUICK_LAUNCH "快速启动栏快捷方式(N/A)"
|
StrCpy $INIT_NO_QUICK_LAUNCH "快速启动栏快捷方式(N/A)"
|
||||||
StrCpy $INIT_NO_DESKTOP "桌面快捷方式(覆盖)"
|
StrCpy $INIT_NO_DESKTOP "桌面快捷方式(覆盖)"
|
||||||
|
StrCpy $UAC_ERROR_ELEVATE "无法获得权限,错误:"
|
||||||
|
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "安装程序需要管理员权限,请重试"
|
||||||
|
StrCpy $INIT_INSTALLER_RUNNING "安装程序已经运行。"
|
||||||
|
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "卸载程序需要管理员权限,请重试"
|
||||||
|
StrCpy $INIT_UNINSTALLER_RUNNING "卸载程序已经运行。"
|
||||||
StrCpy $SectionGroup_Shortcuts "快捷方式"
|
StrCpy $SectionGroup_Shortcuts "快捷方式"
|
||||||
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Found ${APPLICATION_EXECUTABLE} process(s) which need to be stopped.$\nDo you want the installer to stop these for you?"
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integration for Windows Explorer"
|
||||||
StrCpy $PageReinstall_OLD_Field_1 "A newer version of ${APPLICATION_NAME} is already installed! It is not recommended that you install an older version. If you really want to install this older version, it is better to uninstall the current version first. Select the operation you want to perform and click Next to continue."
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installing Integration for Windows Explorer"
|
||||||
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} is already installed.\r\nSelect the operation you want to perform and click Next to continue."
|
|
||||||
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Choose the maintenance option to perform."
|
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Adding shortcut for ${APPLICATION_NAME} to the Start Menu."
|
|
||||||
StrCpy $UNINSTALLER_APPDATA_SUBTITLE "Remove ${APPLICATION_NAME}'s data folder from your computer."
|
|
||||||
StrCpy $UNINSTALLER_APPDATA_LABEL_1 "Do you want to delete ${APPLICATION_NAME}'s data folder?"
|
|
||||||
StrCpy $UNINSTALLER_APPDATA_LABEL_2 "Leave unchecked to keep the data folder for later use or check to delete the data folder."
|
|
||||||
StrCpy $UNINSTALLER_REGISTRY_Detail "Writing Installer Registry Keys"
|
|
||||||
StrCpy $UNINSTALL_MESSAGEBOX "It does not appear that ${APPLICATION_NAME} is installed in the directory '$INSTDIR'.$\r$\nContinue anyway (not recommended)?"
|
|
||||||
StrCpy $UNINSTALL_ABORT "Uninstall aborted by user"
|
|
||||||
StrCpy $UAC_ERROR_ELEVATE "Unable to elevate, error:"
|
|
||||||
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "This installer requires admin access, try again"
|
|
||||||
StrCpy $INIT_INSTALLER_RUNNING "The installer is already running."
|
|
||||||
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "This uninstaller requires admin access, try again"
|
|
||||||
StrCpy $INIT_UNINSTALLER_RUNNING "The uninstaller is already running."
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Zobrazi
|
|||||||
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Našli sa ${APPLICATION_EXECUTABLE} proces (y), ktoré je potrebné zastavi<76>.$\nChcete, aby ich inštalátor zastavil?"
|
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Našli sa ${APPLICATION_EXECUTABLE} proces (y), ktoré je potrebné zastavi<76>.$\nChcete, aby ich inštalátor zastavil?"
|
||||||
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Ukonèujem ${APPLICATION_EXECUTABLE} procesy."
|
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Ukonèujem ${APPLICATION_EXECUTABLE} procesy."
|
||||||
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Proces ukonèenia nebol nájdený!"
|
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Proces ukonèenia nebol nájdený!"
|
||||||
StrCpy $PageReinstall_NEW_Field_1 "Staršia verzia ${APPLICATION_NAME} je nainštalovaná vo vašom systéme. Odporúèam vám odinštalova<76> aktuálnu verziu pred inštaláciou. Vyberte operáciu, ktorú chcete vykona<6E>, a kliknite na tlaèidlo Ïalej pre pokraèovanie."
|
StrCpy $PageReinstall_NEW_Field_1 "Staršia verzia ${APPLICATION_NAME} je nainštalovaná vo vašom poèítaèi. Odporúèam vám odinštalova<76> aktuálnu verziu pred inštaláciou. Vyberte operáciu, ktorú chcete vykona<6E>, a kliknite na tlaèidlo Ïalej pre pokraèovanie."
|
||||||
StrCpy $PageReinstall_NEW_Field_2 "Odinštalova<EFBFBD> pred inštaláciou"
|
StrCpy $PageReinstall_NEW_Field_2 "Odinštalova<EFBFBD> pred inštaláciou"
|
||||||
StrCpy $PageReinstall_NEW_Field_3 "Neodinštalova<EFBFBD>"
|
StrCpy $PageReinstall_NEW_Field_3 "Neodinštalova<EFBFBD>"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Už je nainštalovaný"
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Už je nainštalovaný"
|
||||||
@@ -15,6 +15,8 @@ StrCpy $PageReinstall_SAME_Field_3 "Odin
|
|||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "Odinštalova<EFBFBD> ${APPLICATION_NAME}"
|
StrCpy $UNINSTALLER_APPDATA_TITLE "Odinštalova<EFBFBD> ${APPLICATION_NAME}"
|
||||||
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Vyberte možnos<6F> vykona<6E> údržbu."
|
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Vyberte možnos<6F> vykona<6E> údržbu."
|
||||||
StrCpy $SEC_APPLICATION_DETAILS "Inštalujú sa náležitosti ${APPLICATION_NAME}."
|
StrCpy $SEC_APPLICATION_DETAILS "Inštalujú sa náležitosti ${APPLICATION_NAME}."
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integrácia do Windows Explorera"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Inštalaácia integrácie do Windows Explorera"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Zástupca programu v menu Štart"
|
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Zástupca programu v menu Štart"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Prida<EFBFBD> zástupcu pre ${APPLICATION_NAME} do menu Štart."
|
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Prida<EFBFBD> zástupcu pre ${APPLICATION_NAME} do menu Štart."
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Zástupca na ploche"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Zástupca na ploche"
|
||||||
|
|||||||
@@ -42,3 +42,5 @@ StrCpy $INIT_INSTALLER_RUNNING "Namestilnik je
|
|||||||
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Program za odstranjevanje namestitve zahteva skrbniška dovoljenja."
|
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Program za odstranjevanje namestitve zahteva skrbniška dovoljenja."
|
||||||
StrCpy $INIT_UNINSTALLER_RUNNING "Program za odstranjevanje namestitve je že zagnan."
|
StrCpy $INIT_UNINSTALLER_RUNNING "Program za odstranjevanje namestitve je že zagnan."
|
||||||
StrCpy $SectionGroup_Shortcuts "Bližnjice"
|
StrCpy $SectionGroup_Shortcuts "Bližnjice"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integration for Windows Explorer"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installing Integration for Windows Explorer"
|
||||||
|
|||||||
@@ -2,12 +2,12 @@
|
|||||||
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Mostrar las notas de la versión"
|
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Mostrar las notas de la versión"
|
||||||
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "El/los proceso/s ${APPLICATION_EXECUTABLE} debe/n ser detenidos.$\n¿Quiere que el instalador lo haga por usted?"
|
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "El/los proceso/s ${APPLICATION_EXECUTABLE} debe/n ser detenidos.$\n¿Quiere que el instalador lo haga por usted?"
|
||||||
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Deteniendo el/los proceso/s ${APPLICATION_EXECUTABLE}."
|
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Deteniendo el/los proceso/s ${APPLICATION_EXECUTABLE}."
|
||||||
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "¡Proceso a detener no encontrado!"
|
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "¡Proceso para detener no encontrado!"
|
||||||
StrCpy $PageReinstall_NEW_Field_1 "Una versión anterior de ${APPLICATION_NAME} se encuentra instalada en el sistema. Se recomienda de instalar la versión actual antes de instalar la nueva. Seleccione la operacion deseada y haga click en Siguiente para continuar."
|
StrCpy $PageReinstall_NEW_Field_1 "Una versión anterior de ${APPLICATION_NAME} se encuentra instalada en el sistema. Se recomienda de instalar la versión actual antes de instalar la nueva. Seleccione la operacion deseada y haga click en Siguiente para continuar."
|
||||||
StrCpy $PageReinstall_NEW_Field_2 "Desinstalar antes de instalar"
|
StrCpy $PageReinstall_NEW_Field_2 "Desinstalar antes de instalar"
|
||||||
StrCpy $PageReinstall_NEW_Field_3 "No desinstalar"
|
StrCpy $PageReinstall_NEW_Field_3 "No desinstalar"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Ya está instalado"
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Ya está instalado"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Elija como quiere instalar ${APPLICATION_NAME}."
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Elija cómo quiere instalar ${APPLICATION_NAME}."
|
||||||
StrCpy $PageReinstall_OLD_Field_1 "Una nueva versión de ${APPLICATION_NAME} ya está instalada. No es recomendable instalar una versión anterior. Si realmente quiere instalar esta versión anterior, es mejor que desinstale la versión actual primero. Seleccione la operación que desea realizar y pulse Next para continuar."
|
StrCpy $PageReinstall_OLD_Field_1 "Una nueva versión de ${APPLICATION_NAME} ya está instalada. No es recomendable instalar una versión anterior. Si realmente quiere instalar esta versión anterior, es mejor que desinstale la versión actual primero. Seleccione la operación que desea realizar y pulse Next para continuar."
|
||||||
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} ya está instalada.\nSeleccione la operación que desea realizar y pulse Next para continuar."
|
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} ya está instalada.\nSeleccione la operación que desea realizar y pulse Next para continuar."
|
||||||
StrCpy $PageReinstall_SAME_Field_2 "Añadir/Reinstalar componentes"
|
StrCpy $PageReinstall_SAME_Field_2 "Añadir/Reinstalar componentes"
|
||||||
@@ -15,7 +15,9 @@ StrCpy $PageReinstall_SAME_Field_3 "Desinstalar ${APPLICATION_NAME}"
|
|||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "Desinstalar ${APPLICATION_NAME}"
|
StrCpy $UNINSTALLER_APPDATA_TITLE "Desinstalar ${APPLICATION_NAME}"
|
||||||
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Elija la opcion de mantenimiento a realizar."
|
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Elija la opcion de mantenimiento a realizar."
|
||||||
StrCpy $SEC_APPLICATION_DETAILS "Instalando ${APPLICATION_NAME} esenciales."
|
StrCpy $SEC_APPLICATION_DETAILS "Instalando ${APPLICATION_NAME} esenciales."
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Acceso Directo al Programa Menú de Inicio"
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integración para Windows Explorer"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Instalando la integración para Windows Explorer"
|
||||||
|
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Acceso directo al programa Menú de Inicio"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Añadiendo accesos directos para ${APPLICATION_NAME} en el Menú de Inicio."
|
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Añadiendo accesos directos para ${APPLICATION_NAME} en el Menú de Inicio."
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Acceso directo de Escritorio"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Acceso directo de Escritorio"
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Creando Accesos Directos de Escritorio"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Creando Accesos Directos de Escritorio"
|
||||||
@@ -25,20 +27,20 @@ StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} esencial."
|
|||||||
StrCpy $OPTION_SECTION_SC_START_MENU_Desc "Acceso Directo de ${APPLICATION_NAME}"
|
StrCpy $OPTION_SECTION_SC_START_MENU_Desc "Acceso Directo de ${APPLICATION_NAME}"
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Acceso Directo de Escritorio para ${APPLICATION_NAME}"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Acceso Directo de Escritorio para ${APPLICATION_NAME}"
|
||||||
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Lanzador Rápido de Accesos Director para ${APPLICATION_NAME}."
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Lanzador Rápido de Accesos Director para ${APPLICATION_NAME}."
|
||||||
StrCpy $UNINSTALLER_APPDATA_SUBTITLE "Remueva la carpeta de datos de ${APPLICATION_NAME} del computador."
|
StrCpy $UNINSTALLER_APPDATA_SUBTITLE "Elimine la carpeta de datos de ${APPLICATION_NAME} del computador."
|
||||||
StrCpy $UNINSTALLER_APPDATA_LABEL_1 "¿Desea eliminar la carpeta de datos de ${APPLICATION_NAME}?"
|
StrCpy $UNINSTALLER_APPDATA_LABEL_1 "¿Desea eliminar la carpeta de datos de ${APPLICATION_NAME}?"
|
||||||
StrCpy $UNINSTALLER_APPDATA_LABEL_2 "Deja sin marcar para mantener la carpeta de datos para uso posterior, o del marque para eliminar la carpeta de datos."
|
StrCpy $UNINSTALLER_APPDATA_LABEL_2 "Déjelo sin marcar para mantener la carpeta de datos para uso posterior o márquelo para eliminar la carpeta de datos."
|
||||||
StrCpy $UNINSTALLER_APPDATA_CHECKBOX "Si, Elimine esta carpeta de datos."
|
StrCpy $UNINSTALLER_APPDATA_CHECKBOX "Sí, elimine esta carpeta de datos."
|
||||||
StrCpy $UNINSTALLER_FILE_Detail "Escribiendo Desinstalador"
|
StrCpy $UNINSTALLER_FILE_Detail "Escribiendo desinstalador"
|
||||||
StrCpy $UNINSTALLER_REGISTRY_Detail "Escribiendo Llaves en el Registro del Instalador"
|
StrCpy $UNINSTALLER_REGISTRY_Detail "Escribiendo claves en el registro del instalador"
|
||||||
StrCpy $UNINSTALLER_FINISHED_Detail "Terminado"
|
StrCpy $UNINSTALLER_FINISHED_Detail "Terminado"
|
||||||
StrCpy $UNINSTALL_MESSAGEBOX "Parece que ${APPLICATION_NAME} no está instalado en el directorio '$INSTDIR'.$$ ¿Continuar de todos modos? (No Recomendado)"
|
StrCpy $UNINSTALL_MESSAGEBOX "Parece que ${APPLICATION_NAME} no está instalado en el directorio '$INSTDIR'.$$ ¿Continuar de todos modos? (No Recomendado)"
|
||||||
StrCpy $UNINSTALL_ABORT "Desinstalación cancelada por el usuario"
|
StrCpy $UNINSTALL_ABORT "Desinstalación cancelada por el usuario"
|
||||||
StrCpy $INIT_NO_QUICK_LAUNCH "Acceso Directo al Lanzador Rápido (N/A)"
|
StrCpy $INIT_NO_QUICK_LAUNCH "Acceso Directo al Lanzador Rápido (N/A)"
|
||||||
StrCpy $INIT_NO_DESKTOP "Atajo de escritorio (sobreescribe el existente)"
|
StrCpy $INIT_NO_DESKTOP "Atajo de escritorio (sobreescribe el existente)"
|
||||||
StrCpy $UAC_ERROR_ELEVATE "No se ha podido elevar, Error:"
|
StrCpy $UAC_ERROR_ELEVATE "No se ha podido elevar, error:"
|
||||||
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "El instalador requiere acceso administrativo, intente de nuevo"
|
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "El instalador requiere acceso administrativo, inténtelo de nuevo"
|
||||||
StrCpy $INIT_INSTALLER_RUNNING "El instalador ya se encuentra en ejecución"
|
StrCpy $INIT_INSTALLER_RUNNING "El instalador ya se encuentra en ejecución"
|
||||||
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "El desinstalador requiere acceso administrativo, intente de nuevo"
|
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "El desinstalador requiere acceso administrativo, inténtelo de nuevo"
|
||||||
StrCpy $INIT_UNINSTALLER_RUNNING "El desinstalador ya se encuentra en ejecución."
|
StrCpy $INIT_UNINSTALLER_RUNNING "El desinstalador ya se encuentra en ejecución."
|
||||||
StrCpy $SectionGroup_Shortcuts "Accesos Directos"
|
StrCpy $SectionGroup_Shortcuts "Accesos directos"
|
||||||
|
|||||||
@@ -35,6 +35,8 @@ StrCpy $INIT_UNINSTALLER_RUNNING "El des-instalador ya esta corriendo"
|
|||||||
StrCpy $SectionGroup_Shortcuts "Accesos Directos"
|
StrCpy $SectionGroup_Shortcuts "Accesos Directos"
|
||||||
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Found ${APPLICATION_EXECUTABLE} process(s) which need to be stopped.$\nDo you want the installer to stop these for you?"
|
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Found ${APPLICATION_EXECUTABLE} process(s) which need to be stopped.$\nDo you want the installer to stop these for you?"
|
||||||
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} is already installed.\r\nSelect the operation you want to perform and click Next to continue."
|
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} is already installed.\r\nSelect the operation you want to perform and click Next to continue."
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integration for Windows Explorer"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installing Integration for Windows Explorer"
|
||||||
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Quick Launch Shortcut"
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Quick Launch Shortcut"
|
||||||
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Creating Quick Launch Shortcut"
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Creating Quick Launch Shortcut"
|
||||||
StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} essentials."
|
StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} essentials."
|
||||||
|
|||||||
@@ -39,6 +39,8 @@ StrCpy $INIT_NO_DESKTOP "Skrivbordsgenväg (skriver över nuvarande)"
|
|||||||
StrCpy $UAC_ERROR_ELEVATE "Kunde inte få förhöjda rättigheter, fel:"
|
StrCpy $UAC_ERROR_ELEVATE "Kunde inte få förhöjda rättigheter, fel:"
|
||||||
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Detta installationsprogram kräver adminstratörs rättigheter, försök igen"
|
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Detta installationsprogram kräver adminstratörs rättigheter, försök igen"
|
||||||
StrCpy $INIT_INSTALLER_RUNNING "Installationsprogrammet körs redan."
|
StrCpy $INIT_INSTALLER_RUNNING "Installationsprogrammet körs redan."
|
||||||
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Detta avinstallationsprogram kräver administratörs rättigheter, försök igen"
|
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Detta avinstallationsprogram kräver administratörsrättigheter, försök igen"
|
||||||
StrCpy $INIT_UNINSTALLER_RUNNING "Avinstallationsprogrammet körs redan."
|
StrCpy $INIT_UNINSTALLER_RUNNING "Avinstallationsprogrammet körs redan."
|
||||||
StrCpy $SectionGroup_Shortcuts "Genvägar"
|
StrCpy $SectionGroup_Shortcuts "Genvägar"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integration for Windows Explorer"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installing Integration for Windows Explorer"
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ StrCpy $PageReinstall_SAME_Field_3 "${APPLICATION_NAME} uygulamas
|
|||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "${APPLICATION_NAME} uygulamasını kaldır"
|
StrCpy $UNINSTALLER_APPDATA_TITLE "${APPLICATION_NAME} uygulamasını kaldır"
|
||||||
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Yapmak istediğiniz bakım işlemini seçin."
|
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Yapmak istediğiniz bakım işlemini seçin."
|
||||||
StrCpy $SEC_APPLICATION_DETAILS "${APPLICATION_NAME} gereklilikleri yükleniyor."
|
StrCpy $SEC_APPLICATION_DETAILS "${APPLICATION_NAME} gereklilikleri yükleniyor."
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Windows Gezgini için tümleştirme"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Windows Gezgini için Tümleştirme Yükleme"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Başlat Menüsü Program Kısayolu"
|
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Başlat Menüsü Program Kısayolu"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "${APPLICATION_NAME} için Başlat Menüsü'ne kısayol ekleniyor."
|
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "${APPLICATION_NAME} için Başlat Menüsü'ne kısayol ekleniyor."
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Masaüstü Kısayolu"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Masaüstü Kısayolu"
|
||||||
|
|||||||
46
admin/win/nsi/l10n/Ukrainian.nsh
Normal file
46
admin/win/nsi/l10n/Ukrainian.nsh
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
# Auto-generated - do not modify
|
||||||
|
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Показати примітки до випуску"
|
||||||
|
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Знайдено процес(и) ${APPLICATION_EXECUTABLE}, які необхідно зупинити.$\nХочете щоб програма установки зробила це самостійно?"
|
||||||
|
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Завершення процесів ${APPLICATION_EXECUTABLE}."
|
||||||
|
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Не знайдено процеси, які необхідно зупинити!"
|
||||||
|
StrCpy $PageReinstall_NEW_Field_1 "Знайдено застарілу версію програми ${APPLICATION_NAME}. Рекомендуємо її спочатку видалити. Оберіть подальшу дію та натисніть $\"Далі$\"."
|
||||||
|
StrCpy $PageReinstall_NEW_Field_2 "Видалити перед установкою"
|
||||||
|
StrCpy $PageReinstall_NEW_Field_3 "Не видаляти"
|
||||||
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Установлено"
|
||||||
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Оберіть, як ви хочете установити ${APPLICATION_NAME}."
|
||||||
|
StrCpy $PageReinstall_OLD_Field_1 "Знайдено новішу версію ${APPLICATION_NAME}! Ми не рекомендуємо встановлювати стару версію. Якщо ви все ж бажаєте встановити цю версію, спочатку видаліть поточну версію. Оберіть подальшу дію та натисніть $\"Далі$\"."
|
||||||
|
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} вже встановлено.↩\nОберіть подальшу дію та натисніть $\"Далі$\"."
|
||||||
|
StrCpy $PageReinstall_SAME_Field_2 "Додати/Перевстановити компоненти"
|
||||||
|
StrCpy $PageReinstall_SAME_Field_3 "Видалити ${APPLICATION_NAME}"
|
||||||
|
StrCpy $UNINSTALLER_APPDATA_TITLE "Видалити ${APPLICATION_NAME}"
|
||||||
|
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Оберіть опцію обслуговування для виконання."
|
||||||
|
StrCpy $SEC_APPLICATION_DETAILS "Установка залежностей ${APPLICATION_NAME}."
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Інтеграція з провідником Windows"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Встановлення інтеграції з провідником Windows"
|
||||||
|
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Ярлик в меню Пуск"
|
||||||
|
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Створення ярлика ${APPLICATION_NAME} в меню Пуск."
|
||||||
|
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Ярлик на Робочому столі"
|
||||||
|
StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Створення ярлика на Робочому столі"
|
||||||
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Ярлик на панелі швидкого запуску"
|
||||||
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Створення ярлика на панелі швидкого запуску"
|
||||||
|
StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} залежності."
|
||||||
|
StrCpy $OPTION_SECTION_SC_START_MENU_Desc "${APPLICATION_NAME} ярлик."
|
||||||
|
StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Ярлик ${APPLICATION_NAME} на Робочому столі."
|
||||||
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Ярлик ${APPLICATION_NAME} на панелі швидкого запуску."
|
||||||
|
StrCpy $UNINSTALLER_APPDATA_SUBTITLE "Видалити теку даних ${APPLICATION_NAME} з вашого комп'ютера."
|
||||||
|
StrCpy $UNINSTALLER_APPDATA_LABEL_1 "Ви дійсно бажаєте видалити теку даних ${APPLICATION_NAME}?"
|
||||||
|
StrCpy $UNINSTALLER_APPDATA_LABEL_2 "Залиште неактивним, для збереження теки з даними програми, для подальшого використання."
|
||||||
|
StrCpy $UNINSTALLER_APPDATA_CHECKBOX "Так, видалити теку даних."
|
||||||
|
StrCpy $UNINSTALLER_FILE_Detail "Збереження Програми видалення"
|
||||||
|
StrCpy $UNINSTALLER_REGISTRY_Detail "Запис ключів реєстру"
|
||||||
|
StrCpy $UNINSTALLER_FINISHED_Detail "Завершено"
|
||||||
|
StrCpy $UNINSTALL_MESSAGEBOX "Скоріш за все ${APPLICATION_NAME} вже встановлено в теку '$INSTDIR'.$↩$\nВсе одно продовжити (не рекомендується)?"
|
||||||
|
StrCpy $UNINSTALL_ABORT "Видалення перервано користувачем."
|
||||||
|
StrCpy $INIT_NO_QUICK_LAUNCH "Ярлик в області швидкого запуску (недоступний)"
|
||||||
|
StrCpy $INIT_NO_DESKTOP "Ярлик на Робочому столі (перезаписати існуючий)"
|
||||||
|
StrCpy $UAC_ERROR_ELEVATE "Неможливо підняти, помилка:"
|
||||||
|
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Для установки потрібні права адміністратора, спробуйте ще раз"
|
||||||
|
StrCpy $INIT_INSTALLER_RUNNING "Установка вже запущена."
|
||||||
|
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Для видалення потрібні права адміністратора, спробуйте ще раз"
|
||||||
|
StrCpy $INIT_UNINSTALLER_RUNNING "Програма видалення вже запущено."
|
||||||
|
StrCpy $SectionGroup_Shortcuts "Ярлики"
|
||||||
@@ -15,6 +15,8 @@ Var PageReinstall_SAME_Field_3
|
|||||||
Var UNINSTALLER_APPDATA_TITLE
|
Var UNINSTALLER_APPDATA_TITLE
|
||||||
Var PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE
|
Var PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE
|
||||||
Var SEC_APPLICATION_DETAILS
|
Var SEC_APPLICATION_DETAILS
|
||||||
|
Var OPTION_SECTION_SC_SHELL_EXT_SECTION
|
||||||
|
Var OPTION_SECTION_SC_SHELL_EXT_DetailPrint
|
||||||
Var OPTION_SECTION_SC_START_MENU_SECTION
|
Var OPTION_SECTION_SC_START_MENU_SECTION
|
||||||
Var OPTION_SECTION_SC_START_MENU_DetailPrint
|
Var OPTION_SECTION_SC_START_MENU_DetailPrint
|
||||||
Var OPTION_SECTION_SC_DESKTOP_SECTION
|
Var OPTION_SECTION_SC_DESKTOP_SECTION
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
!insertmacro MUI_LANGUAGE "SpanishInternational"
|
!insertmacro MUI_LANGUAGE "SpanishInternational"
|
||||||
!insertmacro MUI_LANGUAGE "Dutch"
|
!insertmacro MUI_LANGUAGE "Dutch"
|
||||||
!insertmacro MUI_LANGUAGE "Hungarian"
|
!insertmacro MUI_LANGUAGE "Hungarian"
|
||||||
|
!insertmacro MUI_LANGUAGE "Ukrainian"
|
||||||
!insertmacro MUI_LANGUAGE "French"
|
!insertmacro MUI_LANGUAGE "French"
|
||||||
!insertmacro MUI_LANGUAGE "Catalan"
|
!insertmacro MUI_LANGUAGE "Catalan"
|
||||||
!insertmacro MUI_LANGUAGE "Russian"
|
!insertmacro MUI_LANGUAGE "Russian"
|
||||||
@@ -23,3 +24,4 @@
|
|||||||
!insertmacro MUI_LANGUAGE "Slovak"
|
!insertmacro MUI_LANGUAGE "Slovak"
|
||||||
!insertmacro MUI_LANGUAGE "Spanish"
|
!insertmacro MUI_LANGUAGE "Spanish"
|
||||||
!insertmacro MUI_LANGUAGE "Polish"
|
!insertmacro MUI_LANGUAGE "Polish"
|
||||||
|
!insertmacro MUI_LANGUAGE "Farsi"
|
||||||
|
|||||||
@@ -85,6 +85,14 @@ msgstr "Choose the maintenance option to perform."
|
|||||||
msgid "Installing ${APPLICATION_NAME} essentials."
|
msgid "Installing ${APPLICATION_NAME} essentials."
|
||||||
msgstr "Installing ${APPLICATION_NAME} essentials."
|
msgstr "Installing ${APPLICATION_NAME} essentials."
|
||||||
|
|
||||||
|
#. OPTION_SECTION_SC_SHELL_EXT_SECTION
|
||||||
|
msgid "Integration for Windows Explorer"
|
||||||
|
msgstr "Integration for Windows Explorer"
|
||||||
|
|
||||||
|
#. OPTION_SECTION_SC_SHELL_EXT_DetailPrint
|
||||||
|
msgid "Installing Integration for Windows Explorer"
|
||||||
|
msgstr "Installing Integration for Windows Explorer"
|
||||||
|
|
||||||
#. OPTION_SECTION_SC_START_MENU_SECTION
|
#. OPTION_SECTION_SC_START_MENU_SECTION
|
||||||
msgid "Start Menu Program Shortcut"
|
msgid "Start Menu Program Shortcut"
|
||||||
msgstr "Start Menu Program Shortcut"
|
msgstr "Start Menu Program Shortcut"
|
||||||
|
|||||||
1
binary
Submodule
1
binary
Submodule
Submodule binary added at 96dd38811b
@@ -1,20 +1,21 @@
|
|||||||
<RCC>
|
<RCC>
|
||||||
<qresource prefix="/mirall">
|
<qresource prefix="/client">
|
||||||
<file>resources/dialog-close.png</file>
|
<file>resources/dialog-close.png</file>
|
||||||
<file>resources/dialog-ok.png</file>
|
<file>resources/dialog-ok.png</file>
|
||||||
<file>resources/dialog-cancel.png</file>
|
<file>resources/dialog-cancel.png</file>
|
||||||
<file>resources/folder-remote-32.png</file>
|
|
||||||
<file>resources/folder-remote.png</file>
|
|
||||||
<file>resources/folder-sync.png</file>
|
<file>resources/folder-sync.png</file>
|
||||||
<file>resources/folder-grey.png</file>
|
<file>resources/folder-sync@2x.png</file>
|
||||||
<file>resources/task-ongoing.png</file>
|
<file>resources/task-ongoing.png</file>
|
||||||
<file>resources/view-refresh.png</file>
|
<file>resources/view-refresh.png</file>
|
||||||
<file>resources/warning-16.png</file>
|
<file>resources/warning.png</file>
|
||||||
|
<file>resources/warning@2x.png</file>
|
||||||
<file>resources/settings.png</file>
|
<file>resources/settings.png</file>
|
||||||
<file>resources/activity.png</file>
|
<file>resources/activity.png</file>
|
||||||
<file>resources/network.png</file>
|
<file>resources/network.png</file>
|
||||||
<file>resources/owncloud_logo_blue.png</file>
|
<file>resources/lock-http.png</file>
|
||||||
<file>resources/lock-http.png</file>
|
<file>resources/lock-http@2x.png</file>
|
||||||
<file>resources/lock-https.png</file>
|
<file>resources/lock-https.png</file>
|
||||||
|
<file>resources/lock-https@2x.png</file>
|
||||||
|
<file>resources/accounts.png</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
SET(WINDRES_EXECUTABLE ${CMAKE_RC_COMPILER})
|
SET(WINDRES_EXECUTABLE_BASE ${CMAKE_RC_COMPILER})
|
||||||
|
|
||||||
# This macro is taken from kdelibs/cmake/modules/KDE4Macros.cmake.
|
# This macro is taken from kdelibs/cmake/modules/KDE4Macros.cmake.
|
||||||
#
|
#
|
||||||
@@ -21,7 +21,7 @@ macro (KDE4_ADD_APP_ICON appsources pattern)
|
|||||||
else(NOT WINCE)
|
else(NOT WINCE)
|
||||||
find_program(PNG2ICO_EXECUTABLE NAMES png2ico PATHS ${HOST_BINDIR} NO_DEFAULT_PATH )
|
find_program(PNG2ICO_EXECUTABLE NAMES png2ico PATHS ${HOST_BINDIR} NO_DEFAULT_PATH )
|
||||||
endif(NOT WINCE)
|
endif(NOT WINCE)
|
||||||
find_program(WINDRES_EXECUTABLE NAMES windres)
|
find_program(WINDRES_EXECUTABLE NAMES ${WINDRES_EXECUTABLE_BASE})
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
set(WINDRES_EXECUTABLE TRUE)
|
set(WINDRES_EXECUTABLE TRUE)
|
||||||
endif(MSVC)
|
endif(MSVC)
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
# (c) 2014 Copyright ownCloud, Inc.
|
||||||
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
|
# For details see the accompanying COPYING* file.
|
||||||
|
|
||||||
# Always include srcdir and builddir in include path
|
# Always include srcdir and builddir in include path
|
||||||
# This saves typing ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY} in
|
# This saves typing ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY} in
|
||||||
# about every subdir
|
# about every subdir
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
# (c) 2014 Copyright ownCloud, Inc.
|
||||||
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
|
# For details see the accompanying COPYING* file.
|
||||||
|
|
||||||
# define system dependent compiler flags
|
# define system dependent compiler flags
|
||||||
|
|
||||||
include(CheckCCompilerFlag)
|
include(CheckCCompilerFlag)
|
||||||
@@ -10,10 +14,11 @@ if (${CMAKE_C_COMPILER_ID} MATCHES "(GNU|Clang)")
|
|||||||
|
|
||||||
# add -Wconversion ?
|
# add -Wconversion ?
|
||||||
# cannot be pedantic with sqlite3 directly linked
|
# cannot be pedantic with sqlite3 directly linked
|
||||||
if (NOT CSYNC_STATIC_COMPILE_DIR)
|
# FIXME Can we somehow not use those flags for sqlite3.* but use them for the rest of csync?
|
||||||
|
if (NOT USE_OUR_OWN_SQLITE3)
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -pedantic -pedantic-errors")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -pedantic -pedantic-errors")
|
||||||
endif()
|
endif()
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wshadow -Wmissing-prototypes -Wdeclaration-after-statement")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wshadow -Wmissing-prototypes")
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wunused -Wfloat-equal -Wpointer-arith -Wwrite-strings -Wformat-security")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wunused -Wfloat-equal -Wpointer-arith -Wwrite-strings -Wformat-security")
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-format-attribute")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-format-attribute")
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-format-attribute -D_GNU_SOURCE")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-format-attribute -D_GNU_SOURCE")
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
# (c) 2014 Copyright ownCloud, Inc.
|
||||||
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
|
# For details see the accompanying COPYING* file.
|
||||||
|
|
||||||
if (UNIX)
|
if (UNIX)
|
||||||
# Suffix for Linux
|
# Suffix for Linux
|
||||||
SET(LIB_SUFFIX
|
SET(LIB_SUFFIX
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
# (c) 2014 Copyright ownCloud, Inc.
|
||||||
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
|
# For details see the accompanying COPYING* file.
|
||||||
|
|
||||||
# Set system vars
|
# Set system vars
|
||||||
|
|
||||||
if (CMAKE_SYSTEM_NAME MATCHES "Linux")
|
if (CMAKE_SYSTEM_NAME MATCHES "Linux")
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
# (c) 2014 Copyright ownCloud, Inc.
|
||||||
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
|
# For details see the accompanying COPYING* file.
|
||||||
|
|
||||||
# This module defines
|
# This module defines
|
||||||
# INOTIFY_INCLUDE_DIR, where to find inotify.h, etc.
|
# INOTIFY_INCLUDE_DIR, where to find inotify.h, etc.
|
||||||
# INOTIFY_FOUND, If false, do not try to use inotify.
|
# INOTIFY_FOUND, If false, do not try to use inotify.
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
# (c) 2014 Copyright ownCloud, Inc.
|
||||||
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
|
# For details see the accompanying COPYING* file.
|
||||||
|
|
||||||
# FIND_PACKAGE_VERSION_CHECK(NAME (DEFAULT_MSG|"Custom failure message"))
|
# FIND_PACKAGE_VERSION_CHECK(NAME (DEFAULT_MSG|"Custom failure message"))
|
||||||
# This function is intended to be used in FindXXX.cmake modules files.
|
# This function is intended to be used in FindXXX.cmake modules files.
|
||||||
# It handles NAME_FIND_VERSION and NAME_VERSION variables in a Module.
|
# It handles NAME_FIND_VERSION and NAME_VERSION variables in a Module.
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
# (c) 2014 Copyright ownCloud, Inc.
|
||||||
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
|
# For details see the accompanying COPYING* file.
|
||||||
|
|
||||||
find_program(PDFLATEX_EXECUTABLE NAMES pdflatex
|
find_program(PDFLATEX_EXECUTABLE NAMES pdflatex
|
||||||
HINTS
|
HINTS
|
||||||
$ENV{PDFLATEX_DIR}
|
$ENV{PDFLATEX_DIR}
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
# (c) 2014 Copyright ownCloud, Inc.
|
||||||
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
|
# For details see the accompanying COPYING* file.
|
||||||
|
|
||||||
# - Try to find QtKeychain
|
# - Try to find QtKeychain
|
||||||
# Once done this will define
|
# Once done this will define
|
||||||
# QTKEYCHAIN_FOUND - System has QtKeychain
|
# QTKEYCHAIN_FOUND - System has QtKeychain
|
||||||
@@ -5,7 +9,12 @@
|
|||||||
# QTKEYCHAIN_LIBRARIES - The libraries needed to use QtKeychain
|
# QTKEYCHAIN_LIBRARIES - The libraries needed to use QtKeychain
|
||||||
# QTKEYCHAIN_DEFINITIONS - Compiler switches required for using LibXml2
|
# QTKEYCHAIN_DEFINITIONS - Compiler switches required for using LibXml2
|
||||||
|
|
||||||
find_path(QTKEYCHAIN_INCLUDE_DIR qt5keychain/keychain.h)
|
find_path(QTKEYCHAIN_INCLUDE_DIR
|
||||||
|
NAMES
|
||||||
|
keychain.h
|
||||||
|
PATH_SUFFIXES
|
||||||
|
qt5keychain
|
||||||
|
)
|
||||||
|
|
||||||
find_library(QTKEYCHAIN_LIBRARY
|
find_library(QTKEYCHAIN_LIBRARY
|
||||||
NAMES
|
NAMES
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
# (c) 2014 Copyright ownCloud, Inc.
|
||||||
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
|
# For details see the accompanying COPYING* file.
|
||||||
|
|
||||||
# - Try to find QtKeychain
|
# - Try to find QtKeychain
|
||||||
# Once done this will define
|
# Once done this will define
|
||||||
# QTKEYCHAIN_FOUND - System has QtKeychain
|
# QTKEYCHAIN_FOUND - System has QtKeychain
|
||||||
@@ -5,7 +9,13 @@
|
|||||||
# QTKEYCHAIN_LIBRARIES - The libraries needed to use QtKeychain
|
# QTKEYCHAIN_LIBRARIES - The libraries needed to use QtKeychain
|
||||||
# QTKEYCHAIN_DEFINITIONS - Compiler switches required for using LibXml2
|
# QTKEYCHAIN_DEFINITIONS - Compiler switches required for using LibXml2
|
||||||
|
|
||||||
find_path(QTKEYCHAIN_INCLUDE_DIR qtkeychain/keychain.h)
|
find_path(QTKEYCHAIN_INCLUDE_DIR
|
||||||
|
NAMES
|
||||||
|
keychain.h
|
||||||
|
PATH_SUFFIXES
|
||||||
|
qtkeychain
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
find_library(QTKEYCHAIN_LIBRARY
|
find_library(QTKEYCHAIN_LIBRARY
|
||||||
NAMES
|
NAMES
|
||||||
|
|||||||
@@ -50,8 +50,18 @@ if (SQLite3_FIND_VERSION AND _SQLITE3_VERSION)
|
|||||||
set(SQLite3_VERSION _SQLITE3_VERSION)
|
set(SQLite3_VERSION _SQLITE3_VERSION)
|
||||||
endif (SQLite3_FIND_VERSION AND _SQLITE3_VERSION)
|
endif (SQLite3_FIND_VERSION AND _SQLITE3_VERSION)
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
if (APPLE OR WIN32)
|
||||||
find_package_handle_standard_args(SQLite3 DEFAULT_MSG SQLITE3_LIBRARIES SQLITE3_INCLUDE_DIRS)
|
set(USE_OUR_OWN_SQLITE3 TRUE)
|
||||||
|
set(SQLITE3_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/src/3rdparty/sqlite3)
|
||||||
|
set(SQLITE3_LIBRARIES "")
|
||||||
|
set(SQLITE3_SOURCE ${SQLITE3_INCLUDE_DIR}/sqlite3.c)
|
||||||
|
MESSAGE(STATUS "Using own sqlite3 from " ${SQLITE3_INCLUDE_DIR})
|
||||||
|
else()
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(SQLite3 DEFAULT_MSG SQLITE3_LIBRARIES SQLITE3_INCLUDE_DIRS)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# show the SQLITE3_INCLUDE_DIRS and SQLITE3_LIBRARIES variables only in the advanced view
|
# show the SQLITE3_INCLUDE_DIRS and SQLITE3_LIBRARIES variables only in the advanced view
|
||||||
mark_as_advanced(SQLITE3_INCLUDE_DIRS SQLITE3_LIBRARIES)
|
mark_as_advanced(SQLITE3_INCLUDE_DIRS SQLITE3_LIBRARIES)
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
# (c) 2014 Copyright ownCloud, Inc.
|
||||||
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
|
# For details see the accompanying COPYING* file.
|
||||||
|
|
||||||
find_program(SPHINX_EXECUTABLE NAMES sphinx-build
|
find_program(SPHINX_EXECUTABLE NAMES sphinx-build
|
||||||
HINTS
|
HINTS
|
||||||
$ENV{SPHINX_DIR}
|
$ENV{SPHINX_DIR}
|
||||||
|
|||||||
@@ -30,6 +30,8 @@
|
|||||||
<string>(C) 2014 @APPLICATION_VENDOR@</string>
|
<string>(C) 2014 @APPLICATION_VENDOR@</string>
|
||||||
<key>SUShowReleaseNotes</key>
|
<key>SUShowReleaseNotes</key>
|
||||||
<false/>
|
<false/>
|
||||||
|
<key>LSMinimumBundleVersion</key>
|
||||||
|
<string>10.7.0</string>
|
||||||
<key>SUPublicDSAKeyFile</key>
|
<key>SUPublicDSAKeyFile</key>
|
||||||
<string>dsa_pub.pem</string>
|
<string>dsa_pub.pem</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
# (c) 2014 Copyright ownCloud, Inc.
|
||||||
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
|
# For details see the accompanying COPYING* file.
|
||||||
|
|
||||||
# - macro_copy_file(_src _dst)
|
# - macro_copy_file(_src _dst)
|
||||||
# Copies a file to ${_dst} only if ${_src} is different (newer) than ${_dst}
|
# Copies a file to ${_dst} only if ${_src} is different (newer) than ${_dst}
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -9,6 +9,8 @@
|
|||||||
!define APPLICATION_LICENSE "@APPLICATION_LICENSE@"
|
!define APPLICATION_LICENSE "@APPLICATION_LICENSE@"
|
||||||
!define WIN_SETUP_BITMAP_PATH "@WIN_SETUP_BITMAP_PATH@"
|
!define WIN_SETUP_BITMAP_PATH "@WIN_SETUP_BITMAP_PATH@"
|
||||||
|
|
||||||
|
!define CRASHREPORTER_EXECUTABLE "@CRASHREPORTER_EXECUTABLE@"
|
||||||
|
|
||||||
;-----------------------------------------------------------------------------
|
;-----------------------------------------------------------------------------
|
||||||
; Some installer script options (comment-out options not required)
|
; Some installer script options (comment-out options not required)
|
||||||
;-----------------------------------------------------------------------------
|
;-----------------------------------------------------------------------------
|
||||||
@@ -16,6 +18,7 @@
|
|||||||
!define OPTION_LICENSE_AGREEMENT
|
!define OPTION_LICENSE_AGREEMENT
|
||||||
!endif
|
!endif
|
||||||
!define OPTION_UAC_PLUGIN_ENHANCED
|
!define OPTION_UAC_PLUGIN_ENHANCED
|
||||||
|
!define OPTION_SECTION_SC_SHELL_EXT
|
||||||
!define OPTION_SECTION_SC_START_MENU
|
!define OPTION_SECTION_SC_START_MENU
|
||||||
!define OPTION_SECTION_SC_DESKTOP
|
!define OPTION_SECTION_SC_DESKTOP
|
||||||
!define OPTION_SECTION_SC_QUICK_LAUNCH
|
!define OPTION_SECTION_SC_QUICK_LAUNCH
|
||||||
@@ -94,6 +97,8 @@ ReserveFile "${NSISDIR}\Plugins\InstallOptions.dll"
|
|||||||
!include WordFunc.nsh ;Used by VersionCompare macro function.
|
!include WordFunc.nsh ;Used by VersionCompare macro function.
|
||||||
!include FileFunc.nsh ;Used to read out parameters
|
!include FileFunc.nsh ;Used to read out parameters
|
||||||
!include UAC.nsh ;Used by the UAC elevation to install as user or admin.
|
!include UAC.nsh ;Used by the UAC elevation to install as user or admin.
|
||||||
|
!include Library.nsh ;Used by the COM registration for shell extensions
|
||||||
|
!include x64.nsh ;Used to determine the right arch for the shell extensions
|
||||||
|
|
||||||
;-----------------------------------------------------------------------------
|
;-----------------------------------------------------------------------------
|
||||||
; Memento selections stored in registry.
|
; Memento selections stored in registry.
|
||||||
@@ -279,6 +284,16 @@ Function EnsureOwncloudShutdown
|
|||||||
!insertmacro CheckAndConfirmEndProcess "${APPLICATION_EXECUTABLE}"
|
!insertmacro CheckAndConfirmEndProcess "${APPLICATION_EXECUTABLE}"
|
||||||
FunctionEnd
|
FunctionEnd
|
||||||
|
|
||||||
|
Function InstallRedistributables
|
||||||
|
${If} ${RunningX64}
|
||||||
|
ExecWait '"$OUTDIR\vcredist_x64.exe" /install /quiet'
|
||||||
|
${Else}
|
||||||
|
ExecWait '"$OUTDIR\vcredist_x86.exe" /install /quiet'
|
||||||
|
${EndIf}
|
||||||
|
Delete "$OUTDIR\vcredist_x86.exe"
|
||||||
|
Delete "$OUTDIR\vcredist_x64.exe"
|
||||||
|
FunctionEnd
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
# #
|
# #
|
||||||
# RE-INSTALLER FUNCTIONS #
|
# RE-INSTALLER FUNCTIONS #
|
||||||
@@ -370,20 +385,21 @@ Section "${APPLICATION_NAME}" SEC_APPLICATION
|
|||||||
;Main executable & csync
|
;Main executable & csync
|
||||||
File "${BUILD_PATH}\bin\${APPLICATION_EXECUTABLE}"
|
File "${BUILD_PATH}\bin\${APPLICATION_EXECUTABLE}"
|
||||||
File "${BUILD_PATH}\bin\${APPLICATION_CMD_EXECUTABLE}"
|
File "${BUILD_PATH}\bin\${APPLICATION_CMD_EXECUTABLE}"
|
||||||
File "${BUILD_PATH}\src\lib${APPLICATION_SHORTNAME}sync.dll"
|
File "${BUILD_PATH}\bin\lib${APPLICATION_SHORTNAME}sync.dll"
|
||||||
File "${BUILD_PATH}\csync\src\libocsync.dll"
|
File "${BUILD_PATH}\bin\libocsync.dll"
|
||||||
|
|
||||||
|
File "${BUILD_PATH}\src\gui\client*.qm"
|
||||||
File "${BUILD_PATH}\src\mirall_*.qm"
|
|
||||||
; Make sure only to copy qt, not qt_help, etc
|
; Make sure only to copy qt, not qt_help, etc
|
||||||
File "${MING_SHARE}\qt5\translations\qt_??.qm"
|
File "${MING_SHARE}\qt5\translations\qt_??.qm"
|
||||||
File "${MING_SHARE}\qt5\translations\qt_??_??.qm"
|
File "${MING_SHARE}\qt5\translations\qt_??_??.qm"
|
||||||
|
File "${MING_SHARE}\qt5\translations\qtbase_*.qm"
|
||||||
File "${MING_SHARE}\qt5\translations\qtkeychain_*.qm"
|
File "${MING_SHARE}\qt5\translations\qtkeychain_*.qm"
|
||||||
|
|
||||||
|
;Add crash reporter if it was built
|
||||||
|
File /nonfatal "${BUILD_PATH}/bin/${CRASHREPORTER_EXECUTABLE}.exe"
|
||||||
|
|
||||||
SetOutPath "$INSTDIR\platforms"
|
SetOutPath "$INSTDIR\platforms"
|
||||||
File "${PLATFORMS_DLL_PATH}\qwindows.dll"
|
File "${PLATFORMS_DLL_PATH}\qwindows.dll"
|
||||||
SetOutPath "$INSTDIR\accessible"
|
|
||||||
File "${ACCESSIBLE_DLL_PATH}\qtaccessiblewidgets.dll"
|
|
||||||
SetOutPath "$INSTDIR\imageformats"
|
SetOutPath "$INSTDIR\imageformats"
|
||||||
File "${IMAGEFORMATS_DLL_PATH}\qgif.dll"
|
File "${IMAGEFORMATS_DLL_PATH}\qgif.dll"
|
||||||
File "${IMAGEFORMATS_DLL_PATH}\qjpeg.dll"
|
File "${IMAGEFORMATS_DLL_PATH}\qjpeg.dll"
|
||||||
@@ -405,13 +421,17 @@ Section "${APPLICATION_NAME}" SEC_APPLICATION
|
|||||||
File "${QT_DLL_PATH}\Qt5PrintSupport.dll"
|
File "${QT_DLL_PATH}\Qt5PrintSupport.dll"
|
||||||
File "${QT_DLL_PATH}\Qt5Qml.dll"
|
File "${QT_DLL_PATH}\Qt5Qml.dll"
|
||||||
File "${QT_DLL_PATH}\Qt5Quick.dll"
|
File "${QT_DLL_PATH}\Qt5Quick.dll"
|
||||||
File "${QT_DLL_PATH}\Qt5Sensors.dll"
|
|
||||||
File "${QT_DLL_PATH}\Qt5Sql.dll"
|
File "${QT_DLL_PATH}\Qt5Sql.dll"
|
||||||
File "${QT_DLL_PATH}\Qt5WebKit.dll"
|
File "${QT_DLL_PATH}\Qt5WebKit.dll"
|
||||||
File "${QT_DLL_PATH}\Qt5WebKitWidgets.dll"
|
File "${QT_DLL_PATH}\Qt5WebKitWidgets.dll"
|
||||||
File "${QT_DLL_PATH}\Qt5Widgets.dll"
|
File "${QT_DLL_PATH}\Qt5Widgets.dll"
|
||||||
File "${QT_DLL_PATH}\Qt5Xml.dll"
|
File "${QT_DLL_PATH}\Qt5Xml.dll"
|
||||||
|
|
||||||
|
;QtWebKit dependencies
|
||||||
|
File "${QT_DLL_PATH}\Qt5Multimedia.dll"
|
||||||
|
File "${QT_DLL_PATH}\Qt5MultimediaWidgets.dll"
|
||||||
|
File "${QT_DLL_PATH}\Qt5Sensors.dll"
|
||||||
|
|
||||||
;Qt deps
|
;Qt deps
|
||||||
File "${MING_BIN}\libpng16-16.dll"
|
File "${MING_BIN}\libpng16-16.dll"
|
||||||
File "${MING_BIN}\icudata53.dll"
|
File "${MING_BIN}\icudata53.dll"
|
||||||
@@ -422,38 +442,56 @@ Section "${APPLICATION_NAME}" SEC_APPLICATION
|
|||||||
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}\libproxy.dll"
|
||||||
File "${MING_BIN}\libqt5keychain.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"
|
||||||
File "${MING_BIN}\libstdc++-6.dll"
|
File "${MING_BIN}\libstdc++-6.dll"
|
||||||
File "${MING_BIN}\libwebp-4.dll"
|
File "${MING_BIN}\libwebp-4.dll"
|
||||||
File "${MING_BIN}\libxslt-1.dll"
|
File "${MING_BIN}\libxslt-1.dll"
|
||||||
|
File "${MING_BIN}\libxml2-2.dll"
|
||||||
File "${MING_BIN}\zlib1.dll"
|
File "${MING_BIN}\zlib1.dll"
|
||||||
|
|
||||||
;QtSql and csync dep
|
|
||||||
File "${MING_BIN}\libsqlite3-0.dll"
|
File "${MING_BIN}\libsqlite3-0.dll"
|
||||||
|
|
||||||
;QtKeyChain stuff
|
;QtKeyChain stuff
|
||||||
File "${MING_BIN}\libqtkeychain.dll"
|
File "${MING_BIN}\libqt5keychain.dll"
|
||||||
|
|
||||||
; ownCloud plugin
|
|
||||||
File "${MING_BIN}\libintl-8.dll"
|
|
||||||
File "${MING_BIN}\libneon-27.dll"
|
|
||||||
File "${MING_BIN}\libproxy.dll"
|
|
||||||
File "${MING_BIN}\libmodman.dll"
|
|
||||||
File "${MING_BIN}\libxml2-2.dll"
|
|
||||||
|
|
||||||
;MinGW stuff
|
;MinGW stuff
|
||||||
File "${MING_BIN}\libgcc_s_sjlj-1.dll"
|
File "${MING_BIN}\libgcc_s_sjlj-1.dll"
|
||||||
File "${MING_BIN}\libstdc++-6.dll"
|
File "${MING_BIN}\libstdc++-6.dll"
|
||||||
File "${MING_BIN}\libwinpthread-1.dll"
|
File "${MING_BIN}\libwinpthread-1.dll"
|
||||||
|
|
||||||
; CSync configs
|
;CSync configs
|
||||||
File "${SOURCE_PATH}/sync-exclude.lst"
|
File "${SOURCE_PATH}/sync-exclude.lst"
|
||||||
|
|
||||||
SectionEnd
|
SectionEnd
|
||||||
|
|
||||||
|
!ifdef OPTION_SECTION_SC_SHELL_EXT
|
||||||
|
${MementoSection} $OPTION_SECTION_SC_SHELL_EXT_SECTION SEC_SHELL_EXT
|
||||||
|
SectionIn 1 2
|
||||||
|
SetDetailsPrint textonly
|
||||||
|
DetailPrint $OPTION_SECTION_SC_SHELL_EXT_DetailPrint
|
||||||
|
File "${BUILD_PATH}\vcredist_x86.exe"
|
||||||
|
File "${BUILD_PATH}\vcredist_x64.exe"
|
||||||
|
Call InstallRedistributables
|
||||||
|
CreateDirectory "$INSTDIR\shellext"
|
||||||
|
!define LIBRARY_COM
|
||||||
|
!define LIBRARY_SHELL_EXTENSION
|
||||||
|
${If} ${RunningX64}
|
||||||
|
!define LIBRARY_X64
|
||||||
|
!insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED "${SOURCE_PATH}\binary\shell_integration\windows\Release\x64\OCUtil_x64.dll" "$INSTDIR\shellext\OCUtil_x64.dll" "$INSTDIR\shellext"
|
||||||
|
!insertmacro InstallLib REGDLL NOTSHARED REBOOT_PROTECTED "${SOURCE_PATH}\binary\shell_integration\windows\Release\x64\OCOverlays_x64.dll" "$INSTDIR\shellext\OCOverlays_x64.dll" "$INSTDIR\shellext"
|
||||||
|
!insertmacro InstallLib REGDLL NOTSHARED REBOOT_PROTECTED "${SOURCE_PATH}\binary\shell_integration\windows\Release\x64\OCContextMenu_x64.dll" "$INSTDIR\shellext\OCContextMenu_x64.dll" "$INSTDIR\shellext"
|
||||||
|
!undef LIBRARY_X64
|
||||||
|
${Else}
|
||||||
|
!insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED "${SOURCE_PATH}\binary\shell_integration\windows\Release\Win32\OCUtil_x86.dll" "$INSTDIR\shellext\OCUtil_x86.dll" "$INSTDIR\shellext"
|
||||||
|
!insertmacro InstallLib REGDLL NOTSHARED REBOOT_PROTECTED "${SOURCE_PATH}\binary\shell_integration\windows\Release\Win32\OCOverlays_x86.dll" "$INSTDIR\shellext\OCOverlays_x86.dll" "$INSTDIR\shellext"
|
||||||
|
!insertmacro InstallLib REGDLL NOTSHARED REBOOT_PROTECTED "${SOURCE_PATH}\binary\shell_integration\windows\Release\Win32\OCContextMenu_x86.dll" "$INSTDIR\shellext\OCContextMenu_x86.dll" "$INSTDIR\shellext"
|
||||||
|
${Endif}
|
||||||
|
!undef LIBRARY_COM
|
||||||
|
!undef LIBRARY_SHELL_EXTENSION
|
||||||
|
${MementoSectionEnd}
|
||||||
|
!endif
|
||||||
|
|
||||||
SectionGroup $SectionGroup_Shortcuts
|
SectionGroup $SectionGroup_Shortcuts
|
||||||
|
|
||||||
!ifdef OPTION_SECTION_SC_START_MENU
|
!ifdef OPTION_SECTION_SC_START_MENU
|
||||||
@@ -601,6 +639,27 @@ Section Uninstall
|
|||||||
|
|
||||||
DeleteRegKey HKCR "${APPLICATION_NAME}"
|
DeleteRegKey HKCR "${APPLICATION_NAME}"
|
||||||
|
|
||||||
|
;Shell extension
|
||||||
|
!ifdef OPTION_SECTION_SC_SHELL_EXT
|
||||||
|
!define LIBRARY_COM
|
||||||
|
!define LIBRARY_SHELL_EXTENSION
|
||||||
|
${If} ${HasSection} SEC_SHELL_EXT
|
||||||
|
DetailPrint "Uninstalling x64 overlay DLLs"
|
||||||
|
!define LIBRARY_X64
|
||||||
|
!insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\shellext\OCContextMenu_x64.dll"
|
||||||
|
!insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\shellext\OCOverlays_x64.dll"
|
||||||
|
!insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\shellext\OCUtil_x64.dll"
|
||||||
|
!undef LIBRARY_X64
|
||||||
|
${Else}
|
||||||
|
DetailPrint "Uninstalling x86 overlay DLLs"
|
||||||
|
!insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\shellext\OCContextMenu_x86.dll"
|
||||||
|
!insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\shellext\OCOverlays_x86.dll"
|
||||||
|
!insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\shellext\OCUtil_x86.dll"
|
||||||
|
${EndIf}
|
||||||
|
!undef LIBRARY_COM
|
||||||
|
!undef LIBRARY_SHELL_EXTENSION
|
||||||
|
!endif
|
||||||
|
|
||||||
;Start menu shortcut
|
;Start menu shortcut
|
||||||
!ifdef OPTION_SECTION_SC_START_MENU
|
!ifdef OPTION_SECTION_SC_START_MENU
|
||||||
SetShellVarContext all
|
SetShellVarContext all
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
|
# (c) 2014 Copyright ownCloud, Inc.
|
||||||
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
|
# For details see the accompanying COPYING* file.
|
||||||
|
|
||||||
include (MacroOptionalFindPackage)
|
include (MacroOptionalFindPackage)
|
||||||
include (MacroLogFeature)
|
include (MacroLogFeature)
|
||||||
|
|
||||||
option(BUILD_WITH_QT4 "Build with Qt4 no matter if Qt5 was found" OFF)
|
option(BUILD_WITH_QT4 "Build with Qt4 no matter if Qt5 was found" OFF)
|
||||||
|
|
||||||
if( BUILD_WITH_QT4 )
|
if( BUILD_WITH_QT4 )
|
||||||
message(STATUS "Search for Qt5 was disalbed by option BUILD_WITH_QT4")
|
message(STATUS "Search for Qt5 was disabled by option BUILD_WITH_QT4")
|
||||||
else( BUILD_WITH_QT4 )
|
else( BUILD_WITH_QT4 )
|
||||||
find_package(Qt5Core QUIET)
|
find_package(Qt5Core QUIET)
|
||||||
endif( BUILD_WITH_QT4 )
|
endif( BUILD_WITH_QT4 )
|
||||||
@@ -19,10 +23,11 @@ if( Qt5Core_FOUND )
|
|||||||
find_package(Qt5PrintSupport REQUIRED)
|
find_package(Qt5PrintSupport REQUIRED)
|
||||||
find_package(Qt5Quick REQUIRED)
|
find_package(Qt5Quick REQUIRED)
|
||||||
find_package(Qt5Widgets REQUIRED)
|
find_package(Qt5Widgets REQUIRED)
|
||||||
|
if(APPLE)
|
||||||
|
find_package(Qt5MacExtras REQUIRED)
|
||||||
|
endif(APPLE)
|
||||||
endif()
|
endif()
|
||||||
if(APPLE)
|
|
||||||
find_package(Qt5MacExtras REQUIRED)
|
|
||||||
endif(APPLE)
|
|
||||||
else( Qt5Core_FOUND )
|
else( Qt5Core_FOUND )
|
||||||
if(WIN32 OR APPLE)
|
if(WIN32 OR APPLE)
|
||||||
message(FATAL_ERROR "Qt 5 not found, but application depends on Qt5 on Windows and Mac OS X")
|
message(FATAL_ERROR "Qt 5 not found, but application depends on Qt5 on Windows and Mac OS X")
|
||||||
@@ -65,10 +70,15 @@ endif()
|
|||||||
qt5_add_resources(${ARGN})
|
qt5_add_resources(${ARGN})
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
|
if(NOT TOKEN_AUTH_ONLY)
|
||||||
find_package(Qt5LinguistTools REQUIRED)
|
find_package(Qt5LinguistTools REQUIRED)
|
||||||
macro(qt_add_translation)
|
macro(qt_add_translation)
|
||||||
qt5_add_translation(${ARGN})
|
qt5_add_translation(${ARGN})
|
||||||
endmacro()
|
endmacro()
|
||||||
|
else()
|
||||||
|
macro(qt_add_translation)
|
||||||
|
endmacro()
|
||||||
|
endif()
|
||||||
|
|
||||||
macro(qt_add_dbus_interface)
|
macro(qt_add_dbus_interface)
|
||||||
qt5_add_dbus_interface(${ARGN})
|
qt5_add_dbus_interface(${ARGN})
|
||||||
@@ -93,6 +103,9 @@ endif()
|
|||||||
|
|
||||||
#Enable deprecated symbols
|
#Enable deprecated symbols
|
||||||
add_definitions("-DQT_DISABLE_DEPRECATED_BEFORE=0")
|
add_definitions("-DQT_DISABLE_DEPRECATED_BEFORE=0")
|
||||||
|
|
||||||
|
add_definitions("-DQT_USE_QSTRINGBUILDER") #optimize string concatenation
|
||||||
|
add_definitions("-DQT_MESSAGELOGCONTEXT") #enable function name and line number in debug output
|
||||||
endif( Qt5Core_FOUND )
|
endif( Qt5Core_FOUND )
|
||||||
|
|
||||||
if(NOT Qt5Core_FOUND)
|
if(NOT Qt5Core_FOUND)
|
||||||
@@ -147,6 +160,19 @@ if(NOT Qt5Core_FOUND)
|
|||||||
|
|
||||||
include( ${QT_USE_FILE} )
|
include( ${QT_USE_FILE} )
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
|
if (CMAKE_COMPILER_IS_GNUCC)
|
||||||
|
execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion
|
||||||
|
OUTPUT_VARIABLE GCC_VERSION)
|
||||||
|
if (GCC_VERSION VERSION_GREATER 4.7 OR GCC_VERSION VERSION_EQUAL 4.7)
|
||||||
|
add_definitions("-DQ_DECL_OVERRIDE=override")
|
||||||
|
else()
|
||||||
|
add_definitions("-DQ_DECL_OVERRIDE=")
|
||||||
|
endif()
|
||||||
|
else() #clang or others
|
||||||
|
add_definitions("-DQ_DECL_OVERRIDE=override")
|
||||||
|
endif()
|
||||||
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if( Qt5Core_DIR )
|
if( Qt5Core_DIR )
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
# (c) 2014 Copyright ownCloud, Inc.
|
||||||
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
|
# For details see the accompanying COPYING* file.
|
||||||
|
|
||||||
# -helper macro to add a "doc" target with CMake build system.
|
# -helper macro to add a "doc" target with CMake build system.
|
||||||
# and configure doxy.config.in to doxy.config
|
# and configure doxy.config.in to doxy.config
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
# (c) 2014 Copyright ownCloud, Inc.
|
||||||
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
|
# For details see the accompanying COPYING* file.
|
||||||
|
|
||||||
if(CMAKE_COMPILER_IS_GNUCXX)
|
if(CMAKE_COMPILER_IS_GNUCXX)
|
||||||
execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion
|
execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion
|
||||||
OUTPUT_VARIABLE GCC_VERSION)
|
OUTPUT_VARIABLE GCC_VERSION)
|
||||||
@@ -6,9 +10,11 @@ if(CMAKE_COMPILER_IS_GNUCXX)
|
|||||||
else(GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8)
|
else(GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pedantic -Wno-long-long")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pedantic -Wno-long-long")
|
||||||
endif(GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8)
|
endif(GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8)
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
|
||||||
endif(CMAKE_COMPILER_IS_GNUCXX)
|
endif(CMAKE_COMPILER_IS_GNUCXX)
|
||||||
if(CMAKE_CXX_COMPILER MATCHES "clang")
|
if(CMAKE_CXX_COMPILER MATCHES "clang")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pedantic -Wno-long-long")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pedantic -Wno-long-long")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
|
||||||
endif(CMAKE_CXX_COMPILER MATCHES "clang")
|
endif(CMAKE_CXX_COMPILER MATCHES "clang")
|
||||||
# TODO: handle msvc compilers warnings?
|
# TODO: handle msvc compilers warnings?
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,9 @@
|
|||||||
|
|
||||||
#cmakedefine USE_INOTIFY 1
|
#cmakedefine USE_INOTIFY 1
|
||||||
#cmakedefine WITH_QTKEYCHAIN 1
|
#cmakedefine WITH_QTKEYCHAIN 1
|
||||||
|
#cmakedefine WITH_CRASHREPORTER
|
||||||
|
#cmakedefine CRASHREPORTER_EXECUTABLE "@CRASHREPORTER_EXECUTABLE@"
|
||||||
|
|
||||||
|
|
||||||
#cmakedefine GIT_SHA1 "@GIT_SHA1@"
|
#cmakedefine GIT_SHA1 "@GIT_SHA1@"
|
||||||
#cmakedefine APPLICATION_DOMAIN @APPLICATION_DOMAIN@
|
#cmakedefine APPLICATION_DOMAIN @APPLICATION_DOMAIN@
|
||||||
|
|||||||
@@ -27,15 +27,14 @@ include(MacroCopyFile)
|
|||||||
if (NOT WIN32)
|
if (NOT WIN32)
|
||||||
find_package(Iconv)
|
find_package(Iconv)
|
||||||
endif (NOT WIN32)
|
endif (NOT WIN32)
|
||||||
find_package(CMocka)
|
|
||||||
if (CMOCKA_FOUND AND UNIT_TESTING)
|
find_package(SQLite3 3.8.0 REQUIRED)
|
||||||
include(AddCMockaTest)
|
|
||||||
endif (CMOCKA_FOUND AND UNIT_TESTING)
|
|
||||||
|
|
||||||
include(ConfigureChecks.cmake)
|
include(ConfigureChecks.cmake)
|
||||||
|
|
||||||
|
|
||||||
set(SOURCE_DIR ${CMAKE_SOURCE_DIR})
|
set(SOURCE_DIR ${CMAKE_SOURCE_DIR})
|
||||||
|
set(BIN_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
|
||||||
|
|
||||||
include_directories(${CMAKE_CURRENT_BINARY_DIR})
|
include_directories(${CMAKE_CURRENT_BINARY_DIR})
|
||||||
|
|
||||||
@@ -47,9 +46,13 @@ endif (MEM_NULL_TESTS)
|
|||||||
|
|
||||||
add_subdirectory(src)
|
add_subdirectory(src)
|
||||||
|
|
||||||
if (CMOCKA_FOUND AND UNIT_TESTING)
|
if (UNIT_TESTING)
|
||||||
add_subdirectory(tests)
|
find_package(CMocka)
|
||||||
endif (CMOCKA_FOUND AND UNIT_TESTING)
|
if (CMOCKA_FOUND)
|
||||||
|
include(AddCMockaTest)
|
||||||
|
add_subdirectory(tests)
|
||||||
|
endif (CMOCKA_FOUND)
|
||||||
|
endif (UNIT_TESTING)
|
||||||
|
|
||||||
configure_file(config_csync.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config_csync.h)
|
configure_file(config_csync.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config_csync.h)
|
||||||
configure_file(config_test.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config_test.h)
|
configure_file(config_test.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config_test.h)
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ version 0.90.1 (released 2013-09-24, ownCloud Client 1.4.1)
|
|||||||
* detect if server does not send an etag after an upload
|
* detect if server does not send an etag after an upload
|
||||||
completed.
|
completed.
|
||||||
* fix crash in case of network timeout, reported as
|
* fix crash in case of network timeout, reported as
|
||||||
https://github.com/owncloud/mirall/issues/1010
|
https://github.comowncloud/client/issues/1010
|
||||||
* compile and cmake fixes for win32
|
* compile and cmake fixes for win32
|
||||||
* fixed behaviour of csync_exclude
|
* fixed behaviour of csync_exclude
|
||||||
* documentation and spelling fixes.
|
* documentation and spelling fixes.
|
||||||
|
|||||||
@@ -1,16 +1,11 @@
|
|||||||
project(libcsync)
|
project(libcsync)
|
||||||
|
|
||||||
add_subdirectory(std)
|
add_subdirectory(std)
|
||||||
add_subdirectory(httpbf)
|
if(USE_NEON)
|
||||||
|
add_subdirectory(httpbf)
|
||||||
|
endif()
|
||||||
|
|
||||||
# Statically include sqlite
|
# Statically include sqlite
|
||||||
if (CSYNC_STATIC_COMPILE_DIR)
|
|
||||||
set(SQLITE3_INCLUDE_DIRS "")
|
|
||||||
set(SQLITE3_LIBRARIES "")
|
|
||||||
include_directories(${CSYNC_STATIC_COMPILE_DIR})
|
|
||||||
else (CSYNC_STATIC_COMPILE_DIR)
|
|
||||||
find_package(SQLite3 3.3.9 REQUIRED)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(CSYNC_PUBLIC_INCLUDE_DIRS
|
set(CSYNC_PUBLIC_INCLUDE_DIRS
|
||||||
${CMAKE_CURRENT_BINARY_DIR}
|
${CMAKE_CURRENT_BINARY_DIR}
|
||||||
@@ -22,7 +17,6 @@ set(CSYNC_PUBLIC_INCLUDE_DIRS
|
|||||||
set(CSYNC_PRIVATE_INCLUDE_DIRS
|
set(CSYNC_PRIVATE_INCLUDE_DIRS
|
||||||
${SQLITE3_INCLUDE_DIRS}
|
${SQLITE3_INCLUDE_DIRS}
|
||||||
${CSTDLIB_PUBLIC_INCLUDE_DIRS}
|
${CSTDLIB_PUBLIC_INCLUDE_DIRS}
|
||||||
${HTTPBF_PUBLIC_INCLUDE_DIRS}
|
|
||||||
${CMAKE_BINARY_DIR}
|
${CMAKE_BINARY_DIR}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -35,8 +29,6 @@ set(CSYNC_LINK_LIBRARIES
|
|||||||
${CSTDLIB_LIBRARY}
|
${CSTDLIB_LIBRARY}
|
||||||
${CSYNC_REQUIRED_LIBRARIES}
|
${CSYNC_REQUIRED_LIBRARIES}
|
||||||
${SQLITE3_LIBRARIES}
|
${SQLITE3_LIBRARIES}
|
||||||
${NEON_LIBRARIES}
|
|
||||||
${HTTPBF_LIBRARY}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if(HAVE_ICONV AND WITH_ICONV)
|
if(HAVE_ICONV AND WITH_ICONV)
|
||||||
@@ -67,27 +59,34 @@ set(csync_SRCS
|
|||||||
vio/csync_vio.c
|
vio/csync_vio.c
|
||||||
vio/csync_vio_file_stat.c
|
vio/csync_vio_file_stat.c
|
||||||
vio/csync_vio_local.c
|
vio/csync_vio_local.c
|
||||||
|
|
||||||
csync_owncloud.c
|
|
||||||
csync_owncloud_recursive_propfind.c
|
|
||||||
csync_owncloud_util.c
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if(USE_NEON)
|
||||||
|
list(APPEND csync_SRCS
|
||||||
|
csync_owncloud.c
|
||||||
|
csync_owncloud_util.c
|
||||||
|
)
|
||||||
|
list(APPEND CSYNC_LINK_LIBRARIES
|
||||||
|
${NEON_LIBRARIES}
|
||||||
|
)
|
||||||
|
include_directories(${NEON_INCLUDE_DIRS})
|
||||||
|
add_definitions(-DUSE_NEON)
|
||||||
|
endif(USE_NEON)
|
||||||
|
|
||||||
|
|
||||||
configure_file(csync_version.h.in ${CMAKE_CURRENT_BINARY_DIR}/csync_version.h)
|
configure_file(csync_version.h.in ${CMAKE_CURRENT_BINARY_DIR}/csync_version.h)
|
||||||
|
|
||||||
set(csync_HDRS
|
set(csync_HDRS
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/csync_version.h
|
${CMAKE_CURRENT_BINARY_DIR}/csync_version.h
|
||||||
csync.h
|
csync.h
|
||||||
vio/csync_vio.h
|
vio/csync_vio.h
|
||||||
vio/csync_vio_file_stat.h
|
|
||||||
vio/csync_vio_handle.h
|
|
||||||
vio/csync_vio_method.h
|
vio/csync_vio_method.h
|
||||||
vio/csync_vio_module.h
|
vio/csync_vio_module.h
|
||||||
)
|
)
|
||||||
|
|
||||||
# Statically include sqlite
|
# Statically include sqlite
|
||||||
if (CSYNC_STATIC_COMPILE_DIR)
|
if (USE_OUR_OWN_SQLITE3)
|
||||||
list(APPEND csync_SRCS ${CSYNC_STATIC_COMPILE_DIR}/dictionary.c ${CSYNC_STATIC_COMPILE_DIR}/sqlite3.c)
|
list(APPEND csync_SRCS ${SQLITE3_SOURCE})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
include_directories(
|
include_directories(
|
||||||
@@ -96,10 +95,10 @@ include_directories(
|
|||||||
)
|
)
|
||||||
|
|
||||||
add_library(${CSYNC_LIBRARY} SHARED ${csync_SRCS})
|
add_library(${CSYNC_LIBRARY} SHARED ${csync_SRCS})
|
||||||
add_library(${CSYNC_LIBRARY}_static STATIC ${csync_SRCS})
|
#add_library(${CSYNC_LIBRARY}_static STATIC ${csync_SRCS})
|
||||||
|
|
||||||
target_link_libraries(${CSYNC_LIBRARY} ${CSYNC_LINK_LIBRARIES})
|
target_link_libraries(${CSYNC_LIBRARY} ${CSYNC_LINK_LIBRARIES})
|
||||||
target_link_libraries(${CSYNC_LIBRARY}_static ${CSYNC_LINK_LIBRARIES})
|
#target_link_libraries(${CSYNC_LIBRARY}_static ${CSYNC_LINK_LIBRARIES})
|
||||||
|
|
||||||
set_target_properties(
|
set_target_properties(
|
||||||
${CSYNC_LIBRARY}
|
${CSYNC_LIBRARY}
|
||||||
@@ -108,6 +107,8 @@ set_target_properties(
|
|||||||
${LIBRARY_VERSION}
|
${LIBRARY_VERSION}
|
||||||
SOVERSION
|
SOVERSION
|
||||||
${LIBRARY_SOVERSION}
|
${LIBRARY_SOVERSION}
|
||||||
|
RUNTIME_OUTPUT_DIRECTORY
|
||||||
|
${BIN_OUTPUT_DIRECTORY}
|
||||||
)
|
)
|
||||||
if(BUILD_OWNCLOUD_OSX_BUNDLE)
|
if(BUILD_OWNCLOUD_OSX_BUNDLE)
|
||||||
INSTALL(
|
INSTALL(
|
||||||
|
|||||||
@@ -59,8 +59,10 @@
|
|||||||
#include "c_jhash.h"
|
#include "c_jhash.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef USE_NEON
|
||||||
// Breaking the abstraction for fun and profit.
|
// Breaking the abstraction for fun and profit.
|
||||||
#include "csync_owncloud.h"
|
#include "csync_owncloud.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
static int _key_cmp(const void *key, const void *data) {
|
static int _key_cmp(const void *key, const void *data) {
|
||||||
uint64_t a;
|
uint64_t a;
|
||||||
@@ -96,8 +98,6 @@ static int _data_cmp(const void *key, const void *data) {
|
|||||||
int csync_create(CSYNC **csync, const char *local, const char *remote) {
|
int csync_create(CSYNC **csync, const char *local, const char *remote) {
|
||||||
CSYNC *ctx;
|
CSYNC *ctx;
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
char *home;
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
ctx = c_malloc(sizeof(CSYNC));
|
ctx = c_malloc(sizeof(CSYNC));
|
||||||
if (ctx == NULL) {
|
if (ctx == NULL) {
|
||||||
@@ -111,52 +111,15 @@ int csync_create(CSYNC **csync, const char *local, const char *remote) {
|
|||||||
while(len > 0 && local[len - 1] == '/') --len;
|
while(len > 0 && local[len - 1] == '/') --len;
|
||||||
|
|
||||||
ctx->local.uri = c_strndup(local, len);
|
ctx->local.uri = c_strndup(local, len);
|
||||||
if (ctx->local.uri == NULL) {
|
|
||||||
ctx->status_code = CSYNC_STATUS_MEMORY_ERROR;
|
|
||||||
free(ctx);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* remove trailing slashes */
|
/* remove trailing slashes */
|
||||||
len = strlen(remote);
|
len = strlen(remote);
|
||||||
while(len > 0 && remote[len - 1] == '/') --len;
|
while(len > 0 && remote[len - 1] == '/') --len;
|
||||||
|
|
||||||
ctx->remote.uri = c_strndup(remote, len);
|
ctx->remote.uri = c_strndup(remote, len);
|
||||||
if (ctx->remote.uri == NULL) {
|
|
||||||
ctx->status_code = CSYNC_STATUS_MEMORY_ERROR;
|
|
||||||
free(ctx);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx->status_code = CSYNC_STATUS_OK;
|
ctx->status_code = CSYNC_STATUS_OK;
|
||||||
ctx->options.local_only_mode = false;
|
|
||||||
|
|
||||||
ctx->pwd.uid = getuid();
|
|
||||||
ctx->pwd.euid = geteuid();
|
|
||||||
|
|
||||||
home = csync_get_user_home_dir();
|
|
||||||
if (home == NULL) {
|
|
||||||
SAFE_FREE(ctx->local.uri);
|
|
||||||
SAFE_FREE(ctx->remote.uri);
|
|
||||||
SAFE_FREE(ctx);
|
|
||||||
errno = ENOMEM;
|
|
||||||
ctx->status_code = CSYNC_STATUS_MEMORY_ERROR;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = asprintf(&ctx->options.config_dir, "%s/%s", home, CSYNC_CONF_DIR);
|
|
||||||
SAFE_FREE(home);
|
|
||||||
if (rc < 0) {
|
|
||||||
SAFE_FREE(ctx->local.uri);
|
|
||||||
SAFE_FREE(ctx->remote.uri);
|
|
||||||
SAFE_FREE(ctx);
|
|
||||||
errno = ENOMEM;
|
|
||||||
ctx->status_code = CSYNC_STATUS_MEMORY_ERROR;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx->local.list = 0;
|
|
||||||
ctx->remote.list = 0;
|
|
||||||
ctx->current_fs = NULL;
|
ctx->current_fs = NULL;
|
||||||
|
|
||||||
ctx->abort = false;
|
ctx->abort = false;
|
||||||
@@ -167,7 +130,6 @@ int csync_create(CSYNC **csync, const char *local, const char *remote) {
|
|||||||
|
|
||||||
int csync_init(CSYNC *ctx) {
|
int csync_init(CSYNC *ctx) {
|
||||||
int rc;
|
int rc;
|
||||||
char *config = NULL;
|
|
||||||
|
|
||||||
if (ctx == NULL) {
|
if (ctx == NULL) {
|
||||||
errno = EBADF;
|
errno = EBADF;
|
||||||
@@ -190,12 +152,10 @@ int csync_init(CSYNC *ctx) {
|
|||||||
|
|
||||||
ctx->local.type = LOCAL_REPLICA;
|
ctx->local.type = LOCAL_REPLICA;
|
||||||
|
|
||||||
if ( !ctx->options.local_only_mode) {
|
#ifdef USE_NEON
|
||||||
owncloud_init(csync_get_userdata(ctx));
|
owncloud_init(ctx);
|
||||||
ctx->remote.type = REMOTE_REPLICA;
|
#endif
|
||||||
} else {
|
ctx->remote.type = REMOTE_REPLICA;
|
||||||
ctx->remote.type = LOCAL_REPLICA;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (c_rbtree_create(&ctx->local.tree, _key_cmp, _data_cmp) < 0) {
|
if (c_rbtree_create(&ctx->local.tree, _key_cmp, _data_cmp) < 0) {
|
||||||
ctx->status_code = CSYNC_STATUS_TREE_ERROR;
|
ctx->status_code = CSYNC_STATUS_TREE_ERROR;
|
||||||
@@ -209,9 +169,9 @@ int csync_init(CSYNC *ctx) {
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx->status = CSYNC_STATUS_INIT;
|
ctx->remote.root_perms = 0;
|
||||||
|
|
||||||
csync_set_module_property(ctx, "csync_context", ctx);
|
ctx->status = CSYNC_STATUS_INIT;
|
||||||
|
|
||||||
/* initialize random generator */
|
/* initialize random generator */
|
||||||
srand(time(NULL));
|
srand(time(NULL));
|
||||||
@@ -219,7 +179,6 @@ int csync_init(CSYNC *ctx) {
|
|||||||
rc = 0;
|
rc = 0;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
SAFE_FREE(config);
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -234,7 +193,6 @@ int csync_update(CSYNC *ctx) {
|
|||||||
ctx->status_code = CSYNC_STATUS_OK;
|
ctx->status_code = CSYNC_STATUS_OK;
|
||||||
|
|
||||||
/* create/load statedb */
|
/* create/load statedb */
|
||||||
if (! csync_is_statedb_disabled(ctx)) {
|
|
||||||
rc = asprintf(&ctx->statedb.file, "%s/.csync_journal.db",
|
rc = asprintf(&ctx->statedb.file, "%s/.csync_journal.db",
|
||||||
ctx->local.uri);
|
ctx->local.uri);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
@@ -244,11 +202,9 @@ int csync_update(CSYNC *ctx) {
|
|||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Journal: %s", ctx->statedb.file);
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Journal: %s", ctx->statedb.file);
|
||||||
|
|
||||||
if (csync_statedb_load(ctx, ctx->statedb.file, &ctx->statedb.db) < 0) {
|
if (csync_statedb_load(ctx, ctx->statedb.file, &ctx->statedb.db) < 0) {
|
||||||
ctx->status_code = CSYNC_STATUS_STATEDB_LOAD_ERROR;
|
|
||||||
rc = -1;
|
rc = -1;
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
ctx->status_code = CSYNC_STATUS_OK;
|
ctx->status_code = CSYNC_STATUS_OK;
|
||||||
|
|
||||||
@@ -258,6 +214,14 @@ int csync_update(CSYNC *ctx) {
|
|||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "No exclude file loaded or defined!");
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "No exclude file loaded or defined!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef USE_NEON
|
||||||
|
/* This is not actually connecting, just setting the info for neon. The legacy propagator can use it.. */
|
||||||
|
if (dav_connect( ctx, ctx->remote.uri ) < 0) {
|
||||||
|
ctx->status_code = CSYNC_STATUS_CONNECT_ERROR;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* update detection for local replica */
|
/* update detection for local replica */
|
||||||
csync_gettime(&start);
|
csync_gettime(&start);
|
||||||
ctx->current = LOCAL_REPLICA;
|
ctx->current = LOCAL_REPLICA;
|
||||||
@@ -265,9 +229,10 @@ int csync_update(CSYNC *ctx) {
|
|||||||
|
|
||||||
rc = csync_ftw(ctx, ctx->local.uri, csync_walker, MAX_DEPTH);
|
rc = csync_ftw(ctx, ctx->local.uri, csync_walker, MAX_DEPTH);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
if(ctx->status_code == CSYNC_STATUS_OK)
|
if(ctx->status_code == CSYNC_STATUS_OK) {
|
||||||
ctx->status_code = csync_errno_to_status(errno, CSYNC_STATUS_UPDATE_ERROR);
|
ctx->status_code = csync_errno_to_status(errno, CSYNC_STATUS_UPDATE_ERROR);
|
||||||
return -1;
|
}
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
csync_gettime(&finish);
|
csync_gettime(&finish);
|
||||||
@@ -278,30 +243,33 @@ int csync_update(CSYNC *ctx) {
|
|||||||
csync_memstat_check();
|
csync_memstat_check();
|
||||||
|
|
||||||
/* update detection for remote replica */
|
/* update detection for remote replica */
|
||||||
if( ! ctx->options.local_only_mode ) {
|
csync_gettime(&start);
|
||||||
csync_gettime(&start);
|
ctx->current = REMOTE_REPLICA;
|
||||||
ctx->current = REMOTE_REPLICA;
|
ctx->replica = ctx->remote.type;
|
||||||
ctx->replica = ctx->remote.type;
|
|
||||||
|
|
||||||
rc = csync_ftw(ctx, ctx->remote.uri, csync_walker, MAX_DEPTH);
|
rc = csync_ftw(ctx, ctx->remote.uri, csync_walker, MAX_DEPTH);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
if(ctx->status_code == CSYNC_STATUS_OK)
|
if(ctx->status_code == CSYNC_STATUS_OK) {
|
||||||
ctx->status_code = csync_errno_to_status(errno, CSYNC_STATUS_UPDATE_ERROR);
|
ctx->status_code = csync_errno_to_status(errno, CSYNC_STATUS_UPDATE_ERROR);
|
||||||
return -1;
|
}
|
||||||
}
|
goto out;
|
||||||
|
|
||||||
|
|
||||||
csync_gettime(&finish);
|
|
||||||
|
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG,
|
|
||||||
"Update detection for remote replica took %.2f seconds "
|
|
||||||
"walking %zu files.",
|
|
||||||
c_secdiff(finish, start), c_rbtree_size(ctx->remote.tree));
|
|
||||||
csync_memstat_check();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
csync_gettime(&finish);
|
||||||
|
|
||||||
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG,
|
||||||
|
"Update detection for remote replica took %.2f seconds "
|
||||||
|
"walking %zu files.",
|
||||||
|
c_secdiff(finish, start), c_rbtree_size(ctx->remote.tree));
|
||||||
|
csync_memstat_check();
|
||||||
|
|
||||||
ctx->status |= CSYNC_STATUS_UPDATE;
|
ctx->status |= CSYNC_STATUS_UPDATE;
|
||||||
|
|
||||||
return 0;
|
rc = 0;
|
||||||
|
|
||||||
|
out:
|
||||||
|
csync_statedb_close(ctx);
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int csync_reconcile(CSYNC *ctx) {
|
int csync_reconcile(CSYNC *ctx) {
|
||||||
@@ -317,6 +285,11 @@ int csync_reconcile(CSYNC *ctx) {
|
|||||||
/* Reconciliation for local replica */
|
/* Reconciliation for local replica */
|
||||||
csync_gettime(&start);
|
csync_gettime(&start);
|
||||||
|
|
||||||
|
if (csync_statedb_load(ctx, ctx->statedb.file, &ctx->statedb.db) < 0) {
|
||||||
|
rc = -1;
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
ctx->current = LOCAL_REPLICA;
|
ctx->current = LOCAL_REPLICA;
|
||||||
ctx->replica = ctx->local.type;
|
ctx->replica = ctx->local.type;
|
||||||
|
|
||||||
@@ -332,7 +305,7 @@ int csync_reconcile(CSYNC *ctx) {
|
|||||||
if (!CSYNC_STATUS_IS_OK(ctx->status_code)) {
|
if (!CSYNC_STATUS_IS_OK(ctx->status_code)) {
|
||||||
ctx->status_code = csync_errno_to_status( errno, CSYNC_STATUS_RECONCILE_ERROR );
|
ctx->status_code = csync_errno_to_status( errno, CSYNC_STATUS_RECONCILE_ERROR );
|
||||||
}
|
}
|
||||||
return -1;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reconciliation for remote replica */
|
/* Reconciliation for remote replica */
|
||||||
@@ -353,11 +326,15 @@ int csync_reconcile(CSYNC *ctx) {
|
|||||||
if (!CSYNC_STATUS_IS_OK(ctx->status_code)) {
|
if (!CSYNC_STATUS_IS_OK(ctx->status_code)) {
|
||||||
ctx->status_code = csync_errno_to_status(errno, CSYNC_STATUS_RECONCILE_ERROR );
|
ctx->status_code = csync_errno_to_status(errno, CSYNC_STATUS_RECONCILE_ERROR );
|
||||||
}
|
}
|
||||||
return -1;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx->status |= CSYNC_STATUS_RECONCILE;
|
ctx->status |= CSYNC_STATUS_RECONCILE;
|
||||||
|
|
||||||
|
rc = 0;
|
||||||
|
|
||||||
|
out:
|
||||||
|
csync_statedb_close(ctx);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -431,14 +408,15 @@ static int _csync_treewalk_visitor(void *obj, void *data) {
|
|||||||
trav.path = cur->path;
|
trav.path = cur->path;
|
||||||
trav.size = cur->size;
|
trav.size = cur->size;
|
||||||
trav.modtime = cur->modtime;
|
trav.modtime = cur->modtime;
|
||||||
trav.uid = cur->uid;
|
|
||||||
trav.gid = cur->gid;
|
|
||||||
trav.mode = cur->mode;
|
trav.mode = cur->mode;
|
||||||
trav.type = cur->type;
|
trav.type = cur->type;
|
||||||
trav.instruction = cur->instruction;
|
trav.instruction = cur->instruction;
|
||||||
trav.rename_path = cur->destpath;
|
trav.rename_path = cur->destpath;
|
||||||
trav.etag = cur->etag;
|
trav.etag = cur->etag;
|
||||||
trav.file_id = cur->file_id;
|
trav.file_id = cur->file_id;
|
||||||
|
trav.remotePerm = cur->remotePerm;
|
||||||
|
trav.directDownloadUrl = cur->directDownloadUrl;
|
||||||
|
trav.directDownloadCookies = cur->directDownloadCookies;
|
||||||
trav.inode = cur->inode;
|
trav.inode = cur->inode;
|
||||||
|
|
||||||
trav.error_status = cur->error_status;
|
trav.error_status = cur->error_status;
|
||||||
@@ -461,7 +439,7 @@ static int _csync_treewalk_visitor(void *obj, void *data) {
|
|||||||
|
|
||||||
rc = (*visitor)(&trav, twctx->userdata);
|
rc = (*visitor)(&trav, twctx->userdata);
|
||||||
cur->instruction = trav.instruction;
|
cur->instruction = trav.instruction;
|
||||||
if (trav.etag != cur->etag) {
|
if (trav.etag != cur->etag) { // FIXME It would be nice to have this documented
|
||||||
SAFE_FREE(cur->etag);
|
SAFE_FREE(cur->etag);
|
||||||
cur->etag = c_strdup(trav.etag);
|
cur->etag = c_strdup(trav.etag);
|
||||||
}
|
}
|
||||||
@@ -560,8 +538,6 @@ static void _tree_destructor(void *data) {
|
|||||||
* used by csync_commit and csync_destroy */
|
* used by csync_commit and csync_destroy */
|
||||||
static void _csync_clean_ctx(CSYNC *ctx)
|
static void _csync_clean_ctx(CSYNC *ctx)
|
||||||
{
|
{
|
||||||
c_list_t * walk;
|
|
||||||
|
|
||||||
/* destroy the rbtrees */
|
/* destroy the rbtrees */
|
||||||
if (c_rbtree_size(ctx->local.tree) > 0) {
|
if (c_rbtree_size(ctx->local.tree) > 0) {
|
||||||
c_rbtree_destroy(ctx->local.tree, _tree_destructor);
|
c_rbtree_destroy(ctx->local.tree, _tree_destructor);
|
||||||
@@ -573,27 +549,12 @@ static void _csync_clean_ctx(CSYNC *ctx)
|
|||||||
|
|
||||||
csync_rename_destroy(ctx);
|
csync_rename_destroy(ctx);
|
||||||
|
|
||||||
for (walk = c_list_last(ctx->local.ignored_cleanup); walk != NULL; walk = c_list_prev(walk)) {
|
|
||||||
SAFE_FREE(walk->data);
|
|
||||||
}
|
|
||||||
for (walk = c_list_last(ctx->remote.ignored_cleanup); walk != NULL; walk = c_list_prev(walk)) {
|
|
||||||
SAFE_FREE(walk->data);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* free memory */
|
/* free memory */
|
||||||
c_rbtree_free(ctx->local.tree);
|
c_rbtree_free(ctx->local.tree);
|
||||||
c_list_free(ctx->local.list);
|
|
||||||
c_list_free(ctx->local.ignored_cleanup);
|
|
||||||
c_rbtree_free(ctx->remote.tree);
|
c_rbtree_free(ctx->remote.tree);
|
||||||
c_list_free(ctx->remote.list);
|
|
||||||
c_list_free(ctx->remote.ignored_cleanup);
|
|
||||||
|
|
||||||
ctx->remote.list = 0;
|
|
||||||
ctx->local.list = 0;
|
|
||||||
ctx->remote.ignored_cleanup = 0;
|
|
||||||
ctx->local.ignored_cleanup = 0;
|
|
||||||
|
|
||||||
SAFE_FREE(ctx->statedb.file);
|
SAFE_FREE(ctx->statedb.file);
|
||||||
|
SAFE_FREE(ctx->remote.root_perms);
|
||||||
}
|
}
|
||||||
|
|
||||||
int csync_commit(CSYNC *ctx) {
|
int csync_commit(CSYNC *ctx) {
|
||||||
@@ -612,12 +573,14 @@ int csync_commit(CSYNC *ctx) {
|
|||||||
}
|
}
|
||||||
ctx->statedb.db = NULL;
|
ctx->statedb.db = NULL;
|
||||||
|
|
||||||
rc = csync_vio_commit(ctx);
|
#ifdef USE_NEON
|
||||||
|
rc = owncloud_commit(ctx);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "commit failed: %s",
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "commit failed: %s",
|
||||||
ctx->error_string ? ctx->error_string : "");
|
ctx->error_string ? ctx->error_string : "");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
_csync_clean_ctx(ctx);
|
_csync_clean_ctx(ctx);
|
||||||
|
|
||||||
@@ -671,9 +634,12 @@ int csync_destroy(CSYNC *ctx) {
|
|||||||
|
|
||||||
SAFE_FREE(ctx->local.uri);
|
SAFE_FREE(ctx->local.uri);
|
||||||
SAFE_FREE(ctx->remote.uri);
|
SAFE_FREE(ctx->remote.uri);
|
||||||
SAFE_FREE(ctx->options.config_dir);
|
|
||||||
SAFE_FREE(ctx->error_string);
|
SAFE_FREE(ctx->error_string);
|
||||||
|
|
||||||
|
#ifdef USE_NEON
|
||||||
|
owncloud_destroy(ctx);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef WITH_ICONV
|
#ifdef WITH_ICONV
|
||||||
c_close_iconv();
|
c_close_iconv();
|
||||||
#endif
|
#endif
|
||||||
@@ -683,21 +649,12 @@ int csync_destroy(CSYNC *ctx) {
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if csync is the required version or get the version string. */
|
|
||||||
const char *csync_version(int req_version) {
|
|
||||||
if (req_version <= LIBCSYNC_VERSION_INT) {
|
|
||||||
return CSYNC_STRINGIFY(LIBCSYNC_VERSION);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
int csync_add_exclude_list(CSYNC *ctx, const char *path) {
|
int csync_add_exclude_list(CSYNC *ctx, const char *path) {
|
||||||
if (ctx == NULL || path == NULL) {
|
if (ctx == NULL || path == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return csync_exclude_load(ctx, path);
|
return csync_exclude_load(path, &ctx->excludes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void csync_clear_exclude_list(CSYNC *ctx)
|
void csync_clear_exclude_list(CSYNC *ctx)
|
||||||
@@ -705,70 +662,6 @@ void csync_clear_exclude_list(CSYNC *ctx)
|
|||||||
csync_exclude_clear(ctx);
|
csync_exclude_clear(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *csync_get_config_dir(CSYNC *ctx) {
|
|
||||||
if (ctx == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ctx->options.config_dir;
|
|
||||||
}
|
|
||||||
|
|
||||||
int csync_set_config_dir(CSYNC *ctx, const char *path) {
|
|
||||||
if (ctx == NULL || path == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
SAFE_FREE(ctx->options.config_dir);
|
|
||||||
ctx->options.config_dir = c_strdup(path);
|
|
||||||
if (ctx->options.config_dir == NULL) {
|
|
||||||
ctx->status_code = CSYNC_STATUS_MEMORY_ERROR;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int csync_enable_statedb(CSYNC *ctx) {
|
|
||||||
if (ctx == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
ctx->status_code = CSYNC_STATUS_OK;
|
|
||||||
|
|
||||||
if (ctx->status & CSYNC_STATUS_INIT) {
|
|
||||||
fprintf(stderr, "This function must be called before initialization.");
|
|
||||||
ctx->status_code = CSYNC_STATUS_CSYNC_STATUS_ERROR;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx->statedb.disabled = 0;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int csync_disable_statedb(CSYNC *ctx) {
|
|
||||||
if (ctx == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
ctx->status_code = CSYNC_STATUS_OK;
|
|
||||||
|
|
||||||
if (ctx->status & CSYNC_STATUS_INIT) {
|
|
||||||
fprintf(stderr, "This function must be called before initialization.");
|
|
||||||
ctx->status_code = CSYNC_STATUS_CSYNC_STATUS_ERROR;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx->statedb.disabled = 1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int csync_is_statedb_disabled(CSYNC *ctx) {
|
|
||||||
if (ctx == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return ctx->statedb.disabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
int csync_set_auth_callback(CSYNC *ctx, csync_auth_callback cb) {
|
int csync_set_auth_callback(CSYNC *ctx, csync_auth_callback cb) {
|
||||||
if (ctx == NULL || cb == NULL) {
|
if (ctx == NULL || cb == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
@@ -784,15 +677,6 @@ int csync_set_auth_callback(CSYNC *ctx, csync_auth_callback cb) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *csync_get_statedb_file(CSYNC *ctx) {
|
|
||||||
if (ctx == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
ctx->status_code = CSYNC_STATUS_OK;
|
|
||||||
|
|
||||||
return c_strdup(ctx->statedb.file);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *csync_get_userdata(CSYNC *ctx) {
|
void *csync_get_userdata(CSYNC *ctx) {
|
||||||
if (ctx == NULL) {
|
if (ctx == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -836,33 +720,6 @@ CSYNC_STATUS csync_get_status(CSYNC *ctx) {
|
|||||||
return ctx->status_code;
|
return ctx->status_code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int csync_set_local_only(CSYNC *ctx, bool local_only) {
|
|
||||||
if (ctx == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx->status_code = CSYNC_STATUS_OK;
|
|
||||||
|
|
||||||
if (ctx->status & CSYNC_STATUS_INIT) {
|
|
||||||
fprintf(stderr, "csync_set_local_only: This function must be called before initialization.");
|
|
||||||
ctx->status_code = CSYNC_STATUS_CSYNC_STATUS_ERROR;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx->options.local_only_mode=local_only;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool csync_get_local_only(CSYNC *ctx) {
|
|
||||||
if (ctx == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
ctx->status_code = CSYNC_STATUS_OK;
|
|
||||||
|
|
||||||
return ctx->options.local_only_mode;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *csync_get_status_string(CSYNC *ctx)
|
const char *csync_get_status_string(CSYNC *ctx)
|
||||||
{
|
{
|
||||||
return csync_vio_get_status_string(ctx);
|
return csync_vio_get_status_string(ctx);
|
||||||
@@ -907,6 +764,8 @@ int csync_abort_requested(CSYNC *ctx)
|
|||||||
void csync_file_stat_free(csync_file_stat_t *st)
|
void csync_file_stat_free(csync_file_stat_t *st)
|
||||||
{
|
{
|
||||||
if (st) {
|
if (st) {
|
||||||
|
SAFE_FREE(st->directDownloadUrl);
|
||||||
|
SAFE_FREE(st->directDownloadCookies);
|
||||||
SAFE_FREE(st->etag);
|
SAFE_FREE(st->etag);
|
||||||
SAFE_FREE(st->destpath);
|
SAFE_FREE(st->destpath);
|
||||||
SAFE_FREE(st);
|
SAFE_FREE(st);
|
||||||
@@ -915,7 +774,12 @@ void csync_file_stat_free(csync_file_stat_t *st)
|
|||||||
|
|
||||||
int csync_set_module_property(CSYNC* ctx, const char* key, void* value)
|
int csync_set_module_property(CSYNC* ctx, const char* key, void* value)
|
||||||
{
|
{
|
||||||
return csync_vio_set_property(ctx, key, value);
|
#ifdef USE_NEON
|
||||||
|
return owncloud_set_property(ctx, key, value);
|
||||||
|
#else
|
||||||
|
(void)ctx, (void)key, (void)value;
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,8 @@
|
|||||||
#ifndef _CSYNC_H
|
#ifndef _CSYNC_H
|
||||||
#define _CSYNC_H
|
#define _CSYNC_H
|
||||||
|
|
||||||
|
#include "std/c_private.h"
|
||||||
|
#include <sys/stat.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@@ -44,13 +46,11 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
struct csync_client_certs_s {
|
||||||
* csync file declarations
|
char *certificatePath;
|
||||||
*/
|
char *certificatePasswd;
|
||||||
#define CSYNC_CONF_DIR ".ocsync"
|
};
|
||||||
#define CSYNC_CONF_FILE "ocsync.conf"
|
|
||||||
#define CSYNC_EXCLUDE_FILE "ocsync_exclude.conf"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instruction enum. In the file traversal structure, it describes
|
* Instruction enum. In the file traversal structure, it describes
|
||||||
* the csync state of a file.
|
* the csync state of a file.
|
||||||
@@ -59,26 +59,26 @@ enum csync_status_codes_e {
|
|||||||
CSYNC_STATUS_OK = 0,
|
CSYNC_STATUS_OK = 0,
|
||||||
|
|
||||||
CSYNC_STATUS_ERROR = 1024, /* don't use this code,
|
CSYNC_STATUS_ERROR = 1024, /* don't use this code,
|
||||||
just use in csync_status_ok */
|
*/
|
||||||
CSYNC_STATUS_UNSUCCESSFUL,
|
CSYNC_STATUS_UNSUCCESSFUL,
|
||||||
CSYNC_STATUS_NO_LOCK, /* OBSOLETE does not happen anymore */
|
CSYNC_STATUS_NO_LOCK, /* OBSOLETE does not happen anymore */
|
||||||
CSYNC_STATUS_STATEDB_LOAD_ERROR,
|
CSYNC_STATUS_STATEDB_LOAD_ERROR,
|
||||||
CSYNC_STATUS_STATEDB_WRITE_ERROR,
|
CSYNC_STATUS_STATEDB_CORRUPTED,
|
||||||
CSYNC_STATUS_NO_MODULE,
|
CSYNC_STATUS_NO_MODULE,
|
||||||
CSYNC_STATUS_TIMESKEW,
|
CSYNC_STATUS_TIMESKEW, /* OBSOLETE */
|
||||||
CSYNC_STATUS_FILESYSTEM_UNKNOWN,
|
CSYNC_STATUS_FILESYSTEM_UNKNOWN, /* UNUSED */
|
||||||
CSYNC_STATUS_TREE_ERROR,
|
CSYNC_STATUS_TREE_ERROR,
|
||||||
CSYNC_STATUS_MEMORY_ERROR,
|
CSYNC_STATUS_MEMORY_ERROR,
|
||||||
CSYNC_STATUS_PARAM_ERROR,
|
CSYNC_STATUS_PARAM_ERROR,
|
||||||
CSYNC_STATUS_UPDATE_ERROR,
|
CSYNC_STATUS_UPDATE_ERROR,
|
||||||
CSYNC_STATUS_RECONCILE_ERROR,
|
CSYNC_STATUS_RECONCILE_ERROR,
|
||||||
CSYNC_STATUS_PROPAGATE_ERROR,
|
CSYNC_STATUS_PROPAGATE_ERROR, /* OBSOLETE */
|
||||||
CSYNC_STATUS_REMOTE_ACCESS_ERROR,
|
CSYNC_STATUS_REMOTE_ACCESS_ERROR, /* UNUSED */
|
||||||
CSYNC_STATUS_REMOTE_CREATE_ERROR,
|
CSYNC_STATUS_REMOTE_CREATE_ERROR, /* UNUSED */
|
||||||
CSYNC_STATUS_REMOTE_STAT_ERROR,
|
CSYNC_STATUS_REMOTE_STAT_ERROR, /* UNUSED */
|
||||||
CSYNC_STATUS_LOCAL_CREATE_ERROR,
|
CSYNC_STATUS_LOCAL_CREATE_ERROR, /* UNUSED */
|
||||||
CSYNC_STATUS_LOCAL_STAT_ERROR,
|
CSYNC_STATUS_LOCAL_STAT_ERROR, /* UNUSED */
|
||||||
CSYNC_STATUS_PROXY_ERROR,
|
CSYNC_STATUS_PROXY_ERROR, /* UNUSED */
|
||||||
CSYNC_STATUS_LOOKUP_ERROR,
|
CSYNC_STATUS_LOOKUP_ERROR,
|
||||||
CSYNC_STATUS_SERVER_AUTH_ERROR,
|
CSYNC_STATUS_SERVER_AUTH_ERROR,
|
||||||
CSYNC_STATUS_PROXY_AUTH_ERROR,
|
CSYNC_STATUS_PROXY_AUTH_ERROR,
|
||||||
@@ -89,7 +89,7 @@ enum csync_status_codes_e {
|
|||||||
CSYNC_STATUS_NOT_FOUND,
|
CSYNC_STATUS_NOT_FOUND,
|
||||||
CSYNC_STATUS_FILE_EXISTS,
|
CSYNC_STATUS_FILE_EXISTS,
|
||||||
CSYNC_STATUS_OUT_OF_SPACE,
|
CSYNC_STATUS_OUT_OF_SPACE,
|
||||||
CSYNC_STATUS_QUOTA_EXCEEDED,
|
CSYNC_STATUS_QUOTA_EXCEEDED, /* UNUSED */
|
||||||
CSYNC_STATUS_SERVICE_UNAVAILABLE,
|
CSYNC_STATUS_SERVICE_UNAVAILABLE,
|
||||||
CSYNC_STATUS_FILE_SIZE_ERROR,
|
CSYNC_STATUS_FILE_SIZE_ERROR,
|
||||||
CSYNC_STATUS_CONTEXT_LOST,
|
CSYNC_STATUS_CONTEXT_LOST,
|
||||||
@@ -101,6 +101,7 @@ enum csync_status_codes_e {
|
|||||||
CSYNC_STATUS_ABORTED,
|
CSYNC_STATUS_ABORTED,
|
||||||
/* Codes for file individual status: */
|
/* Codes for file individual status: */
|
||||||
CSYNC_STATUS_INDIVIDUAL_IS_SYMLINK,
|
CSYNC_STATUS_INDIVIDUAL_IS_SYMLINK,
|
||||||
|
CSYNC_STATUS_INDIVIDUAL_IS_HARDLINK,
|
||||||
CSYNC_STATUS_INDIVIDUAL_IGNORE_LIST,
|
CSYNC_STATUS_INDIVIDUAL_IGNORE_LIST,
|
||||||
CSYNC_STATUS_INDIVIDUAL_IS_INVALID_CHARS,
|
CSYNC_STATUS_INDIVIDUAL_IS_INVALID_CHARS,
|
||||||
CYSNC_STATUS_FILE_LOCKED_OR_OPEN
|
CYSNC_STATUS_FILE_LOCKED_OR_OPEN
|
||||||
@@ -141,24 +142,95 @@ enum csync_ftw_type_e {
|
|||||||
CSYNC_FTW_TYPE_SKIP
|
CSYNC_FTW_TYPE_SKIP
|
||||||
};
|
};
|
||||||
|
|
||||||
enum csync_notify_type_e {
|
|
||||||
CSYNC_NOTIFY_INVALID,
|
#define FILE_ID_BUF_SIZE 21
|
||||||
CSYNC_NOTIFY_START_SYNC_SEQUENCE,
|
|
||||||
CSYNC_NOTIFY_START_DOWNLOAD,
|
// currently specified at https://github.com/owncloud/core/issues/8322 are 9 to 10
|
||||||
CSYNC_NOTIFY_START_UPLOAD,
|
#define REMOTE_PERM_BUF_SIZE 15
|
||||||
CSYNC_NOTIFY_PROGRESS,
|
|
||||||
CSYNC_NOTIFY_FINISHED_DOWNLOAD,
|
typedef struct csync_vio_file_stat_s csync_vio_file_stat_t;
|
||||||
CSYNC_NOTIFY_FINISHED_UPLOAD,
|
|
||||||
CSYNC_NOTIFY_FINISHED_SYNC_SEQUENCE,
|
enum csync_vio_file_flags_e {
|
||||||
CSYNC_NOTIFY_START_DELETE,
|
CSYNC_VIO_FILE_FLAGS_NONE = 0,
|
||||||
CSYNC_NOTIFY_END_DELETE,
|
CSYNC_VIO_FILE_FLAGS_SYMLINK = 1 << 0,
|
||||||
CSYNC_NOTIFY_ERROR,
|
CSYNC_VIO_FILE_FLAGS_HIDDEN = 1 << 1
|
||||||
CSYNC_NOTIFY_START_LOCAL_UPDATE,
|
|
||||||
CSYNC_NOTIFY_FINISHED_LOCAL_UPDATE,
|
|
||||||
CSYNC_NOTIFY_START_REMOTE_UPDATE,
|
|
||||||
CSYNC_NOTIFY_FINISHED_REMOTE_UPDATE
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum csync_vio_file_type_e {
|
||||||
|
CSYNC_VIO_FILE_TYPE_UNKNOWN,
|
||||||
|
CSYNC_VIO_FILE_TYPE_REGULAR,
|
||||||
|
CSYNC_VIO_FILE_TYPE_DIRECTORY,
|
||||||
|
CSYNC_VIO_FILE_TYPE_FIFO,
|
||||||
|
CSYNC_VIO_FILE_TYPE_SOCKET,
|
||||||
|
CSYNC_VIO_FILE_TYPE_CHARACTER_DEVICE,
|
||||||
|
CSYNC_VIO_FILE_TYPE_BLOCK_DEVICE,
|
||||||
|
CSYNC_VIO_FILE_TYPE_SYMBOLIC_LINK
|
||||||
|
};
|
||||||
|
|
||||||
|
enum csync_vio_file_stat_fields_e {
|
||||||
|
CSYNC_VIO_FILE_STAT_FIELDS_NONE = 0,
|
||||||
|
CSYNC_VIO_FILE_STAT_FIELDS_TYPE = 1 << 0,
|
||||||
|
CSYNC_VIO_FILE_STAT_FIELDS_MODE = 1 << 1, // local POSIX mode
|
||||||
|
CSYNC_VIO_FILE_STAT_FIELDS_FLAGS = 1 << 2,
|
||||||
|
CSYNC_VIO_FILE_STAT_FIELDS_DEVICE = 1 << 3,
|
||||||
|
CSYNC_VIO_FILE_STAT_FIELDS_INODE = 1 << 4,
|
||||||
|
CSYNC_VIO_FILE_STAT_FIELDS_LINK_COUNT = 1 << 5,
|
||||||
|
CSYNC_VIO_FILE_STAT_FIELDS_SIZE = 1 << 6,
|
||||||
|
// CSYNC_VIO_FILE_STAT_FIELDS_BLOCK_COUNT = 1 << 7, /* will be removed */
|
||||||
|
// CSYNC_VIO_FILE_STAT_FIELDS_BLOCK_SIZE = 1 << 8, /* will be removed */
|
||||||
|
CSYNC_VIO_FILE_STAT_FIELDS_ATIME = 1 << 9,
|
||||||
|
CSYNC_VIO_FILE_STAT_FIELDS_MTIME = 1 << 10,
|
||||||
|
CSYNC_VIO_FILE_STAT_FIELDS_CTIME = 1 << 11,
|
||||||
|
// CSYNC_VIO_FILE_STAT_FIELDS_SYMLINK_NAME = 1 << 12,
|
||||||
|
// CSYNC_VIO_FILE_STAT_FIELDS_CHECKSUM = 1 << 13,
|
||||||
|
// CSYNC_VIO_FILE_STAT_FIELDS_ACL = 1 << 14,
|
||||||
|
// CSYNC_VIO_FILE_STAT_FIELDS_UID = 1 << 15,
|
||||||
|
// CSYNC_VIO_FILE_STAT_FIELDS_GID = 1 << 16,
|
||||||
|
CSYNC_VIO_FILE_STAT_FIELDS_ETAG = 1 << 17,
|
||||||
|
CSYNC_VIO_FILE_STAT_FIELDS_FILE_ID = 1 << 18,
|
||||||
|
CSYNC_VIO_FILE_STAT_FIELDS_DIRECTDOWNLOADURL = 1 << 19,
|
||||||
|
CSYNC_VIO_FILE_STAT_FIELDS_DIRECTDOWNLOADCOOKIES = 1 << 20,
|
||||||
|
CSYNC_VIO_FILE_STAT_FIELDS_PERM = 1 << 21 // remote oC perm
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct csync_vio_file_stat_s {
|
||||||
|
char *name;
|
||||||
|
char *etag; // FIXME: Should this be inlined like file_id and perm?
|
||||||
|
char file_id[FILE_ID_BUF_SIZE+1];
|
||||||
|
char *directDownloadUrl;
|
||||||
|
char *directDownloadCookies;
|
||||||
|
char remotePerm[REMOTE_PERM_BUF_SIZE+1];
|
||||||
|
|
||||||
|
time_t atime;
|
||||||
|
time_t mtime;
|
||||||
|
time_t ctime;
|
||||||
|
|
||||||
|
int64_t size;
|
||||||
|
|
||||||
|
mode_t mode;
|
||||||
|
|
||||||
|
dev_t device;
|
||||||
|
uint64_t inode;
|
||||||
|
nlink_t nlink;
|
||||||
|
|
||||||
|
int fields; // actually enum csync_vio_file_stat_fields_e fields;
|
||||||
|
enum csync_vio_file_type_e type;
|
||||||
|
|
||||||
|
enum csync_vio_file_flags_e flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
csync_vio_file_stat_t *csync_vio_file_stat_new(void);
|
||||||
|
csync_vio_file_stat_t *csync_vio_file_stat_copy(csync_vio_file_stat_t *file_stat);
|
||||||
|
|
||||||
|
void csync_vio_file_stat_destroy(csync_vio_file_stat_t *fstat);
|
||||||
|
|
||||||
|
void csync_vio_file_stat_set_file_id( csync_vio_file_stat_t* dst, const char* src );
|
||||||
|
|
||||||
|
void csync_vio_set_file_id(char* dst, const char *src );
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CSync File Traversal structure.
|
* CSync File Traversal structure.
|
||||||
*
|
*
|
||||||
@@ -172,13 +244,6 @@ struct csync_tree_walk_file_s {
|
|||||||
int64_t size;
|
int64_t size;
|
||||||
int64_t inode;
|
int64_t inode;
|
||||||
time_t modtime;
|
time_t modtime;
|
||||||
#ifdef _WIN32
|
|
||||||
uint32_t uid;
|
|
||||||
uint32_t gid;
|
|
||||||
#else
|
|
||||||
uid_t uid;
|
|
||||||
gid_t gid;
|
|
||||||
#endif
|
|
||||||
mode_t mode;
|
mode_t mode;
|
||||||
enum csync_ftw_type_e type;
|
enum csync_ftw_type_e type;
|
||||||
enum csync_instructions_e instruction;
|
enum csync_instructions_e instruction;
|
||||||
@@ -189,6 +254,9 @@ struct csync_tree_walk_file_s {
|
|||||||
const char *rename_path;
|
const char *rename_path;
|
||||||
const char *etag;
|
const char *etag;
|
||||||
const char *file_id;
|
const char *file_id;
|
||||||
|
const char *remotePerm;
|
||||||
|
char *directDownloadUrl;
|
||||||
|
char *directDownloadCookies;
|
||||||
struct {
|
struct {
|
||||||
int64_t size;
|
int64_t size;
|
||||||
time_t modtime;
|
time_t modtime;
|
||||||
@@ -214,14 +282,19 @@ typedef void (*csync_log_callback) (int verbosity,
|
|||||||
const char *buffer,
|
const char *buffer,
|
||||||
void *userdata);
|
void *userdata);
|
||||||
|
|
||||||
/**
|
typedef void (*csync_update_callback) (bool local,
|
||||||
* @brief Check internal csync status.
|
const char *dirUrl,
|
||||||
*
|
void *userdata);
|
||||||
* @param csync The context to check.
|
|
||||||
*
|
typedef void csync_vio_handle_t;
|
||||||
* @return true if status is error free, false for error states.
|
typedef csync_vio_handle_t* (*csync_vio_opendir_hook) (const char *url,
|
||||||
*/
|
void *userdata);
|
||||||
bool csync_status_ok(CSYNC *ctx);
|
typedef csync_vio_file_stat_t* (*csync_vio_readdir_hook) (csync_vio_handle_t *dhhandle,
|
||||||
|
void *userdata);
|
||||||
|
typedef void (*csync_vio_closedir_hook) (csync_vio_handle_t *dhhandle,
|
||||||
|
void *userdata);
|
||||||
|
typedef int (*csync_vio_stat_hook) (csync_vio_handle_t *dhhandle,
|
||||||
|
void *userdata);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Allocate a csync context.
|
* @brief Allocate a csync context.
|
||||||
@@ -261,15 +334,6 @@ int csync_update(CSYNC *ctx);
|
|||||||
*/
|
*/
|
||||||
int csync_reconcile(CSYNC *ctx);
|
int csync_reconcile(CSYNC *ctx);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Propagation
|
|
||||||
*
|
|
||||||
* @param ctx The context to run the propagation on.
|
|
||||||
*
|
|
||||||
* @return 0 on success, less than 0 if an error occured.
|
|
||||||
*/
|
|
||||||
int csync_propagate(CSYNC *ctx);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Commit the sync results to journal
|
* @brief Commit the sync results to journal
|
||||||
*
|
*
|
||||||
@@ -290,31 +354,6 @@ int csync_commit(CSYNC *ctx);
|
|||||||
*/
|
*/
|
||||||
int csync_destroy(CSYNC *ctx);
|
int csync_destroy(CSYNC *ctx);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Check if csync is the required version or get the version
|
|
||||||
* string.
|
|
||||||
*
|
|
||||||
* @param req_version The version required.
|
|
||||||
*
|
|
||||||
* @return If the version of csync is newer than the version
|
|
||||||
* required it will return a version string.
|
|
||||||
* NULL if the version is older.
|
|
||||||
*
|
|
||||||
* Example:
|
|
||||||
*
|
|
||||||
* @code
|
|
||||||
* if (csync_version(CSYNC_VERSION_INT(0,42,1)) == NULL) {
|
|
||||||
* fprintf(stderr, "libcsync version is too old!\n");
|
|
||||||
* exit(1);
|
|
||||||
* }
|
|
||||||
*
|
|
||||||
* if (debug) {
|
|
||||||
* printf("csync %s\n", csync_version(0));
|
|
||||||
* }
|
|
||||||
* @endcode
|
|
||||||
*/
|
|
||||||
const char *csync_version(int req_version);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Add an additional exclude list.
|
* @brief Add an additional exclude list.
|
||||||
*
|
*
|
||||||
@@ -333,62 +372,6 @@ int csync_add_exclude_list(CSYNC *ctx, const char *path);
|
|||||||
*/
|
*/
|
||||||
void csync_clear_exclude_list(CSYNC *ctx);
|
void csync_clear_exclude_list(CSYNC *ctx);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Get the config directory.
|
|
||||||
*
|
|
||||||
* @param ctx The csync context.
|
|
||||||
*
|
|
||||||
* @return The path of the config directory or NULL on error.
|
|
||||||
*/
|
|
||||||
const char *csync_get_config_dir(CSYNC *ctx);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Change the config directory.
|
|
||||||
*
|
|
||||||
* @param ctx The csync context.
|
|
||||||
*
|
|
||||||
* @param path The path to the new config directory.
|
|
||||||
*
|
|
||||||
* @return 0 on success, less than 0 if an error occured.
|
|
||||||
*/
|
|
||||||
int csync_set_config_dir(CSYNC *ctx, const char *path);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Remove the complete config directory.
|
|
||||||
*
|
|
||||||
* @param ctx The csync context.
|
|
||||||
*
|
|
||||||
* @return 0 on success, less than 0 if an error occured.
|
|
||||||
*/
|
|
||||||
int csync_remove_config_dir(CSYNC *ctx);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Enable the usage of the statedb. It is enabled by default.
|
|
||||||
*
|
|
||||||
* @param ctx The csync context.
|
|
||||||
*
|
|
||||||
* @return 0 on success, less than 0 if an error occured.
|
|
||||||
*/
|
|
||||||
int csync_enable_statedb(CSYNC *ctx);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Disable the usage of the statedb. It is enabled by default.
|
|
||||||
*
|
|
||||||
* @param ctx The csync context.
|
|
||||||
*
|
|
||||||
* @return 0 on success, less than 0 if an error occured.
|
|
||||||
*/
|
|
||||||
int csync_disable_statedb(CSYNC *ctx);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Check if the statedb usage is enabled.
|
|
||||||
*
|
|
||||||
* @param ctx The csync context.
|
|
||||||
*
|
|
||||||
* @return 1 if it is enabled, 0 if it is disabled.
|
|
||||||
*/
|
|
||||||
int csync_is_statedb_disabled(CSYNC *ctx);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get the userdata saved in the context.
|
* @brief Get the userdata saved in the context.
|
||||||
*
|
*
|
||||||
@@ -481,31 +464,6 @@ void *csync_get_log_userdata(void);
|
|||||||
*/
|
*/
|
||||||
int csync_set_log_userdata(void *data);
|
int csync_set_log_userdata(void *data);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Get the path of the statedb file used.
|
|
||||||
*
|
|
||||||
* @param ctx The csync context.
|
|
||||||
*
|
|
||||||
* @return The path to the statedb file, NULL if an error occured.
|
|
||||||
*/
|
|
||||||
const char *csync_get_statedb_file(CSYNC *ctx);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Flag to tell csync that only a local run is intended. Call before csync_init
|
|
||||||
*
|
|
||||||
* @param local_only Bool flag to indicate local only mode.
|
|
||||||
*
|
|
||||||
* @return 0 on success, less than 0 if an error occured.
|
|
||||||
*/
|
|
||||||
int csync_set_local_only( CSYNC *ctx, bool local_only );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Retrieve the flag to tell csync that only a local run is intended.
|
|
||||||
*
|
|
||||||
* @return 1: stay local only, 0: local and remote mode
|
|
||||||
*/
|
|
||||||
bool csync_get_local_only( CSYNC *ctx );
|
|
||||||
|
|
||||||
/* Used for special modes or debugging */
|
/* Used for special modes or debugging */
|
||||||
CSYNC_STATUS csync_get_status(CSYNC *ctx);
|
CSYNC_STATUS csync_get_status(CSYNC *ctx);
|
||||||
|
|
||||||
@@ -595,6 +553,9 @@ int csync_abort_requested(CSYNC *ctx);
|
|||||||
*/
|
*/
|
||||||
int csync_set_read_from_db(CSYNC* ctx, int enabled);
|
int csync_set_read_from_db(CSYNC* ctx, int enabled);
|
||||||
|
|
||||||
|
char *csync_normalize_etag(const char *);
|
||||||
|
time_t oc_httpdate_parse( const char *date );
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -20,12 +20,18 @@
|
|||||||
|
|
||||||
#include "config_csync.h"
|
#include "config_csync.h"
|
||||||
|
|
||||||
|
#ifndef _GNU_SOURCE
|
||||||
|
#define _GNU_SOURCE
|
||||||
|
#endif
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "c_lib.h"
|
#include "c_lib.h"
|
||||||
|
#include "c_private.h"
|
||||||
|
|
||||||
#include "csync_private.h"
|
#include "csync_private.h"
|
||||||
#include "csync_exclude.h"
|
#include "csync_exclude.h"
|
||||||
@@ -34,28 +40,31 @@
|
|||||||
#define CSYNC_LOG_CATEGORY_NAME "csync.exclude"
|
#define CSYNC_LOG_CATEGORY_NAME "csync.exclude"
|
||||||
#include "csync_log.h"
|
#include "csync_log.h"
|
||||||
|
|
||||||
static int _csync_exclude_add(CSYNC *ctx, const char *string) {
|
#ifndef NDEBUG
|
||||||
|
static
|
||||||
|
#endif
|
||||||
|
int _csync_exclude_add(c_strlist_t **inList, const char *string) {
|
||||||
c_strlist_t *list;
|
c_strlist_t *list;
|
||||||
|
|
||||||
if (ctx->excludes == NULL) {
|
if (*inList == NULL) {
|
||||||
ctx->excludes = c_strlist_new(32);
|
*inList = c_strlist_new(32);
|
||||||
if (ctx->excludes == NULL) {
|
if (*inList == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctx->excludes->count == ctx->excludes->size) {
|
if ((*inList)->count == (*inList)->size) {
|
||||||
list = c_strlist_expand(ctx->excludes, 2 * ctx->excludes->size);
|
list = c_strlist_expand(*inList, 2 * (*inList)->size);
|
||||||
if (list == NULL) {
|
if (list == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
ctx->excludes = list;
|
*inList = list;
|
||||||
}
|
}
|
||||||
|
|
||||||
return c_strlist_add(ctx->excludes, string);
|
return c_strlist_add(*inList, string);
|
||||||
}
|
}
|
||||||
|
|
||||||
int csync_exclude_load(CSYNC *ctx, const char *fname) {
|
int csync_exclude_load(const char *fname, c_strlist_t **list) {
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
int rc = -1;
|
int rc = -1;
|
||||||
@@ -64,7 +73,7 @@ int csync_exclude_load(CSYNC *ctx, const char *fname) {
|
|||||||
char *entry = NULL;
|
char *entry = NULL;
|
||||||
mbchar_t *w_fname;
|
mbchar_t *w_fname;
|
||||||
|
|
||||||
if (ctx == NULL || fname == NULL) {
|
if (fname == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,11 +103,6 @@ int csync_exclude_load(CSYNC *ctx, const char *fname) {
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
buf = c_malloc(size + 1);
|
buf = c_malloc(size + 1);
|
||||||
if (buf == NULL) {
|
|
||||||
rc = -1;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (read(fd, buf, size) != size) {
|
if (read(fd, buf, size) != size) {
|
||||||
rc = -1;
|
rc = -1;
|
||||||
goto out;
|
goto out;
|
||||||
@@ -113,7 +117,7 @@ int csync_exclude_load(CSYNC *ctx, const char *fname) {
|
|||||||
buf[i] = '\0';
|
buf[i] = '\0';
|
||||||
if (*entry != '#') {
|
if (*entry != '#') {
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Adding entry: %s", entry);
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Adding entry: %s", entry);
|
||||||
rc = _csync_exclude_add(ctx, entry);
|
rc = _csync_exclude_add(list, entry);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@@ -139,6 +143,49 @@ void csync_exclude_destroy(CSYNC *ctx) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
CSYNC_EXCLUDE_TYPE csync_excluded(CSYNC *ctx, const char *path, int filetype) {
|
CSYNC_EXCLUDE_TYPE csync_excluded(CSYNC *ctx, const char *path, int filetype) {
|
||||||
|
|
||||||
|
CSYNC_EXCLUDE_TYPE match = CSYNC_NOT_EXCLUDED;
|
||||||
|
|
||||||
|
match = csync_excluded_no_ctx( ctx->excludes, path, filetype );
|
||||||
|
|
||||||
|
return match;
|
||||||
|
}
|
||||||
|
|
||||||
|
// See http://support.microsoft.com/kb/74496
|
||||||
|
static const char *win_reserved_words[] = {"CON","PRN","AUX", "NUL",
|
||||||
|
"COM1", "COM2", "COM3", "COM4",
|
||||||
|
"LPT1", "LPT2", "LPT3", "CLOCK$" };
|
||||||
|
|
||||||
|
|
||||||
|
bool csync_is_windows_reserved_word(const char* filename) {
|
||||||
|
|
||||||
|
size_t win_reserve_words_len = sizeof(win_reserved_words) / sizeof(char*);
|
||||||
|
size_t j;
|
||||||
|
|
||||||
|
for (j = 0; j < win_reserve_words_len; j++) {
|
||||||
|
int len_reserved_word = strlen(win_reserved_words[j]);
|
||||||
|
int len_filename = strlen(filename);
|
||||||
|
if (len_filename == 2 && filename[1] == ':') {
|
||||||
|
if (filename[0] >= 'a' && filename[0] <= 'z') {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (filename[0] >= 'A' && filename[0] <= 'Z') {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (c_strncasecmp(filename, win_reserved_words[j], len_reserved_word) == 0) {
|
||||||
|
if (len_filename == len_reserved_word) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if ((len_filename > len_reserved_word) && (filename[len_reserved_word] == '.')) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
CSYNC_EXCLUDE_TYPE csync_excluded_no_ctx(c_strlist_t *excludes, const char *path, int filetype) {
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
const char *p = NULL;
|
const char *p = NULL;
|
||||||
char *bname = NULL;
|
char *bname = NULL;
|
||||||
@@ -184,6 +231,27 @@ CSYNC_EXCLUDE_TYPE csync_excluded(CSYNC *ctx, const char *path, int filetype) {
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
// Windows cannot sync files ending in spaces (#2176). It also cannot
|
||||||
|
// distinguish files ending in '.' from files without an ending,
|
||||||
|
// as '.' is a separator that is not stored internally, so let's
|
||||||
|
// not allow to sync those to avoid file loss/ambiguities (#416)
|
||||||
|
size_t blen = strlen(bname);
|
||||||
|
if (blen > 1 && (bname[blen-1]== ' ' || bname[blen-1]== '.' )) {
|
||||||
|
match = CSYNC_FILE_EXCLUDE_INVALID_CHAR;
|
||||||
|
SAFE_FREE(bname);
|
||||||
|
SAFE_FREE(dname);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (csync_is_windows_reserved_word(bname)) {
|
||||||
|
match = CSYNC_FILE_EXCLUDE_INVALID_CHAR;
|
||||||
|
SAFE_FREE(bname);
|
||||||
|
SAFE_FREE(dname);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
rc = csync_fnmatch(".owncloudsync.log*", bname, 0);
|
rc = csync_fnmatch(".owncloudsync.log*", bname, 0);
|
||||||
if (rc == 0) {
|
if (rc == 0) {
|
||||||
match = CSYNC_FILE_SILENTLY_EXCLUDED;
|
match = CSYNC_FILE_SILENTLY_EXCLUDED;
|
||||||
@@ -202,7 +270,10 @@ CSYNC_EXCLUDE_TYPE csync_excluded(CSYNC *ctx, const char *path, int filetype) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (getenv("CSYNC_CONFLICT_FILE_USERNAME")) {
|
if (getenv("CSYNC_CONFLICT_FILE_USERNAME")) {
|
||||||
asprintf(&conflict, "*_conflict_%s-*", getenv("CSYNC_CONFLICT_FILE_USERNAME"));
|
rc = asprintf(&conflict, "*_conflict_%s-*", getenv("CSYNC_CONFLICT_FILE_USERNAME"));
|
||||||
|
if (rc < 0) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
rc = csync_fnmatch(conflict, path, 0);
|
rc = csync_fnmatch(conflict, path, 0);
|
||||||
if (rc == 0) {
|
if (rc == 0) {
|
||||||
match = CSYNC_FILE_SILENTLY_EXCLUDED;
|
match = CSYNC_FILE_SILENTLY_EXCLUDED;
|
||||||
@@ -217,14 +288,14 @@ CSYNC_EXCLUDE_TYPE csync_excluded(CSYNC *ctx, const char *path, int filetype) {
|
|||||||
SAFE_FREE(bname);
|
SAFE_FREE(bname);
|
||||||
SAFE_FREE(dname);
|
SAFE_FREE(dname);
|
||||||
|
|
||||||
if (ctx->excludes == NULL) {
|
if( ! excludes ) {
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Loop over all exclude patterns and evaluate the given path */
|
/* Loop over all exclude patterns and evaluate the given path */
|
||||||
for (i = 0; match == CSYNC_NOT_EXCLUDED && i < ctx->excludes->count; i++) {
|
for (i = 0; match == CSYNC_NOT_EXCLUDED && i < excludes->count; i++) {
|
||||||
bool match_dirs_only = false;
|
bool match_dirs_only = false;
|
||||||
char *pattern_stored = c_strdup(ctx->excludes->vector[i]);
|
char *pattern_stored = c_strdup(excludes->vector[i]);
|
||||||
char* pattern = pattern_stored;
|
char* pattern = pattern_stored;
|
||||||
|
|
||||||
type = CSYNC_FILE_EXCLUDE_LIST;
|
type = CSYNC_FILE_EXCLUDE_LIST;
|
||||||
@@ -304,6 +375,7 @@ CSYNC_EXCLUDE_TYPE csync_excluded(CSYNC *ctx, const char *path, int filetype) {
|
|||||||
SAFE_FREE(dname);
|
SAFE_FREE(dname);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
||||||
return match;
|
return match;
|
||||||
|
|||||||
@@ -29,6 +29,11 @@ enum csync_exclude_type_e {
|
|||||||
CSYNC_FILE_EXCLUDE_INVALID_CHAR
|
CSYNC_FILE_EXCLUDE_INVALID_CHAR
|
||||||
};
|
};
|
||||||
typedef enum csync_exclude_type_e CSYNC_EXCLUDE_TYPE;
|
typedef enum csync_exclude_type_e CSYNC_EXCLUDE_TYPE;
|
||||||
|
|
||||||
|
#ifdef NDEBUG
|
||||||
|
int _csync_exclude_add(c_strlist_t **inList, const char *string);
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Load exclude list
|
* @brief Load exclude list
|
||||||
*
|
*
|
||||||
@@ -37,7 +42,7 @@ typedef enum csync_exclude_type_e CSYNC_EXCLUDE_TYPE;
|
|||||||
*
|
*
|
||||||
* @return 0 on success, -1 if an error occured with errno set.
|
* @return 0 on success, -1 if an error occured with errno set.
|
||||||
*/
|
*/
|
||||||
int csync_exclude_load(CSYNC *ctx, const char *fname);
|
int csync_exclude_load(const char *fname, c_strlist_t **list);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Clear the exclude list in memory.
|
* @brief Clear the exclude list in memory.
|
||||||
@@ -65,6 +70,22 @@ void csync_exclude_destroy(CSYNC *ctx);
|
|||||||
*/
|
*/
|
||||||
CSYNC_EXCLUDE_TYPE csync_excluded(CSYNC *ctx, const char *path, int filetype);
|
CSYNC_EXCLUDE_TYPE csync_excluded(CSYNC *ctx, const char *path, int filetype);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief csync_excluded_no_ctx
|
||||||
|
* @param excludes
|
||||||
|
* @param path
|
||||||
|
* @param filetype
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
CSYNC_EXCLUDE_TYPE csync_excluded_no_ctx(c_strlist_t *excludes, const char *path, int filetype);
|
||||||
#endif /* _CSYNC_EXCLUDE_H */
|
#endif /* _CSYNC_EXCLUDE_H */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Checks if filename is considered reserved by Windows
|
||||||
|
* @param file_name filename
|
||||||
|
* @return true if file is reserved, false otherwise
|
||||||
|
*/
|
||||||
|
bool csync_is_windows_reserved_word(const char *file_name);
|
||||||
|
|
||||||
|
|
||||||
/* vim: set ft=c.doxygen ts=8 sw=2 et cindent: */
|
/* vim: set ft=c.doxygen ts=8 sw=2 et cindent: */
|
||||||
|
|||||||
@@ -42,10 +42,8 @@
|
|||||||
#define ERRNO_RETRY CSYNC_CUSTOM_ERRNO_BASE+9
|
#define ERRNO_RETRY CSYNC_CUSTOM_ERRNO_BASE+9
|
||||||
#define ERRNO_REDIRECT CSYNC_CUSTOM_ERRNO_BASE+10
|
#define ERRNO_REDIRECT CSYNC_CUSTOM_ERRNO_BASE+10
|
||||||
#define ERRNO_WRONG_CONTENT CSYNC_CUSTOM_ERRNO_BASE+11
|
#define ERRNO_WRONG_CONTENT CSYNC_CUSTOM_ERRNO_BASE+11
|
||||||
#define ERRNO_TIMEDELTA CSYNC_CUSTOM_ERRNO_BASE+12
|
|
||||||
#define ERRNO_ERROR_STRING CSYNC_CUSTOM_ERRNO_BASE+13
|
#define ERRNO_ERROR_STRING CSYNC_CUSTOM_ERRNO_BASE+13
|
||||||
#define ERRNO_SERVICE_UNAVAILABLE CSYNC_CUSTOM_ERRNO_BASE+14
|
#define ERRNO_SERVICE_UNAVAILABLE CSYNC_CUSTOM_ERRNO_BASE+14
|
||||||
#define ERRNO_QUOTA_EXCEEDED CSYNC_CUSTOM_ERRNO_BASE+15
|
|
||||||
#define ERRNO_USER_ABORT CSYNC_CUSTOM_ERRNO_BASE+16
|
#define ERRNO_USER_ABORT CSYNC_CUSTOM_ERRNO_BASE+16
|
||||||
|
|
||||||
#endif /* _CSYNC_MACROS_H */
|
#endif /* _CSYNC_MACROS_H */
|
||||||
|
|||||||
@@ -47,52 +47,6 @@
|
|||||||
#include "csync_macros.h"
|
#include "csync_macros.h"
|
||||||
#include "csync_log.h"
|
#include "csync_log.h"
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
char *csync_get_user_home_dir(void) {
|
|
||||||
wchar_t tmp[MAX_PATH];
|
|
||||||
char *szPath = NULL;
|
|
||||||
|
|
||||||
if( SHGetFolderPathW( NULL,
|
|
||||||
CSIDL_PROFILE|CSIDL_FLAG_CREATE,
|
|
||||||
NULL,
|
|
||||||
0,
|
|
||||||
tmp) == S_OK ) {
|
|
||||||
szPath = c_utf8_from_locale(tmp);
|
|
||||||
return szPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else /* ************* !WIN32 ************ */
|
|
||||||
|
|
||||||
#ifndef NSS_BUFLEN_PASSWD
|
|
||||||
#define NSS_BUFLEN_PASSWD 4096
|
|
||||||
#endif /* NSS_BUFLEN_PASSWD */
|
|
||||||
|
|
||||||
char *csync_get_user_home_dir(void) {
|
|
||||||
const char *envp;
|
|
||||||
struct passwd pwd;
|
|
||||||
struct passwd *pwdbuf;
|
|
||||||
char buf[NSS_BUFLEN_PASSWD];
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
envp = getenv("HOME");
|
|
||||||
if (envp != NULL && envp[0] != '\0') {
|
|
||||||
return c_strdup(envp);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Still nothing found, read the password file */
|
|
||||||
rc = getpwuid_r(getuid(), &pwd, buf, NSS_BUFLEN_PASSWD, &pwdbuf);
|
|
||||||
if (rc != 0) {
|
|
||||||
return c_strdup(pwd.pw_dir);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* ************* WIN32 ************ */
|
|
||||||
|
|
||||||
#ifdef HAVE_FNMATCH
|
#ifdef HAVE_FNMATCH
|
||||||
#include <fnmatch.h>
|
#include <fnmatch.h>
|
||||||
|
|
||||||
@@ -151,9 +105,6 @@ CSYNC_STATUS csync_errno_to_status(int error, CSYNC_STATUS default_status)
|
|||||||
case ERRNO_TIMEOUT:
|
case ERRNO_TIMEOUT:
|
||||||
status = CSYNC_STATUS_TIMEOUT; /* Network: Timeout error */
|
status = CSYNC_STATUS_TIMEOUT; /* Network: Timeout error */
|
||||||
break;
|
break;
|
||||||
case ERRNO_QUOTA_EXCEEDED:
|
|
||||||
status = CSYNC_STATUS_QUOTA_EXCEEDED; /* Quota exceeded */
|
|
||||||
break;
|
|
||||||
case ERRNO_SERVICE_UNAVAILABLE:
|
case ERRNO_SERVICE_UNAVAILABLE:
|
||||||
status = CSYNC_STATUS_SERVICE_UNAVAILABLE; /* Service temporarily down */
|
status = CSYNC_STATUS_SERVICE_UNAVAILABLE; /* Service temporarily down */
|
||||||
break;
|
break;
|
||||||
@@ -167,9 +118,6 @@ CSYNC_STATUS csync_errno_to_status(int error, CSYNC_STATUS default_status)
|
|||||||
status = CSYNC_STATUS_HTTP_ERROR;
|
status = CSYNC_STATUS_HTTP_ERROR;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ERRNO_TIMEDELTA:
|
|
||||||
status = CSYNC_STATUS_TIMESKEW;
|
|
||||||
break;
|
|
||||||
case EPERM: /* Operation not permitted */
|
case EPERM: /* Operation not permitted */
|
||||||
case EACCES: /* Permission denied */
|
case EACCES: /* Permission denied */
|
||||||
status = CSYNC_STATUS_PERMISSION_DENIED;
|
status = CSYNC_STATUS_PERMISSION_DENIED;
|
||||||
@@ -229,7 +177,7 @@ CSYNC_STATUS csync_errno_to_status(int error, CSYNC_STATUS default_status)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Remove possible quotes, and also the -gzip at the end
|
/* Remove possible quotes, and also the -gzip at the end
|
||||||
* Remove "-gzip" at the end (cf. https://github.com/owncloud/mirall/issues/1195)
|
* Remove "-gzip" at the end (cf. https://github.comowncloud/client/issues/1195)
|
||||||
* The caller must take ownership of the resulting string.
|
* The caller must take ownership of the resulting string.
|
||||||
*/
|
*/
|
||||||
char *csync_normalize_etag(const char *etag)
|
char *csync_normalize_etag(const char *etag)
|
||||||
|
|||||||
@@ -35,8 +35,6 @@
|
|||||||
#define FNM_PATHNAME (1 << 0) /* No wildcard can ever match `/'. */
|
#define FNM_PATHNAME (1 << 0) /* No wildcard can ever match `/'. */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
char *csync_get_user_home_dir(void);
|
|
||||||
|
|
||||||
int csync_fnmatch(__const char *__pattern, __const char *__name, int __flags);
|
int csync_fnmatch(__const char *__pattern, __const char *__name, int __flags);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -49,6 +47,4 @@ int csync_fnmatch(__const char *__pattern, __const char *__name, int __flags);
|
|||||||
*/
|
*/
|
||||||
CSYNC_STATUS csync_errno_to_status(int error, CSYNC_STATUS default_status);
|
CSYNC_STATUS csync_errno_to_status(int error, CSYNC_STATUS default_status);
|
||||||
|
|
||||||
char *csync_normalize_etag(const char *);
|
|
||||||
|
|
||||||
#endif /* _CSYNC_MISC_H */
|
#endif /* _CSYNC_MISC_H */
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -21,159 +21,16 @@
|
|||||||
#ifndef CSYNC_OWNCLOUD_H
|
#ifndef CSYNC_OWNCLOUD_H
|
||||||
#define CSYNC_OWNCLOUD_H
|
#define CSYNC_OWNCLOUD_H
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
|
|
||||||
#include "config_csync.h"
|
|
||||||
#ifdef NEON_WITH_LFS /* Switch on LFS in libneon. Never remove the NE_LFS! */
|
|
||||||
#define NE_LFS
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <neon/ne_basic.h>
|
|
||||||
#include <neon/ne_socket.h>
|
|
||||||
#include <neon/ne_session.h>
|
|
||||||
#include <neon/ne_request.h>
|
|
||||||
#include <neon/ne_props.h>
|
|
||||||
#include <neon/ne_auth.h>
|
|
||||||
#include <neon/ne_dates.h>
|
|
||||||
#include <neon/ne_compress.h>
|
|
||||||
#include <neon/ne_redirect.h>
|
|
||||||
|
|
||||||
|
|
||||||
#include "c_rbtree.h"
|
|
||||||
|
|
||||||
#include "c_lib.h"
|
|
||||||
#include "csync.h"
|
#include "csync.h"
|
||||||
#include "csync_misc.h"
|
|
||||||
#include "csync_macros.h"
|
|
||||||
#include "c_private.h"
|
|
||||||
#include "httpbf.h"
|
|
||||||
|
|
||||||
#include "vio/csync_vio_file_stat.h"
|
|
||||||
#include "vio/csync_vio.h"
|
#include "vio/csync_vio.h"
|
||||||
|
|
||||||
#include "csync_log.h"
|
// Public API used by csync
|
||||||
|
int owncloud_commit(CSYNC* ctx);
|
||||||
|
void owncloud_destroy(CSYNC* ctx);
|
||||||
|
char *owncloud_error_string(CSYNC* ctx);
|
||||||
|
int owncloud_set_property(CSYNC* ctx, const char *key, void *data);
|
||||||
|
void owncloud_init(CSYNC* ctx);
|
||||||
|
|
||||||
|
int dav_connect(CSYNC* ctx, const char *base_url);
|
||||||
#define DEBUG_WEBDAV(...) csync_log( 9, "oc_module", __VA_ARGS__);
|
|
||||||
|
|
||||||
enum resource_type {
|
|
||||||
resr_normal = 0,
|
|
||||||
resr_collection,
|
|
||||||
resr_reference,
|
|
||||||
resr_error
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Struct to store data for each resource found during an opendir operation.
|
|
||||||
* It represents a single file entry.
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct resource {
|
|
||||||
char *uri; /* The complete uri */
|
|
||||||
char *name; /* The filename only */
|
|
||||||
|
|
||||||
enum resource_type type;
|
|
||||||
int64_t size;
|
|
||||||
time_t modtime;
|
|
||||||
char* md5;
|
|
||||||
char file_id[FILE_ID_BUF_SIZE+1];
|
|
||||||
|
|
||||||
struct resource *next;
|
|
||||||
} resource;
|
|
||||||
|
|
||||||
/* Struct to hold the context of a WebDAV PropFind operation to fetch
|
|
||||||
* a directory listing from the server.
|
|
||||||
*/
|
|
||||||
struct listdir_context {
|
|
||||||
struct resource *list; /* The list of result resources */
|
|
||||||
struct resource *currResource; /* A pointer to the current resource */
|
|
||||||
char *target; /* Request-URI of the PROPFIND */
|
|
||||||
unsigned int result_count; /* number of elements stored in list */
|
|
||||||
int ref; /* reference count, only destroy when it reaches 0 */
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/* Our cache, key is a char* */
|
|
||||||
extern c_rbtree_t *propfind_recursive_cache;
|
|
||||||
/* Values are propfind_recursive_element: */
|
|
||||||
struct propfind_recursive_element {
|
|
||||||
struct resource *self;
|
|
||||||
struct resource *children;
|
|
||||||
struct propfind_recursive_element *parent;
|
|
||||||
};
|
|
||||||
typedef struct propfind_recursive_element propfind_recursive_element_t;
|
|
||||||
void clear_propfind_recursive_cache(void);
|
|
||||||
struct listdir_context *get_listdir_context_from_recursive_cache(const char *curi);
|
|
||||||
void fill_recursive_propfind_cache(const char *uri, const char *curi);
|
|
||||||
struct listdir_context *get_listdir_context_from_cache(const char *curi);
|
|
||||||
void fetch_resource_list_recursive(const char *uri, const char *curi);
|
|
||||||
|
|
||||||
typedef int (*csync_owncloud_redirect_callback_t)(CSYNC* ctx, const char* uri);
|
|
||||||
|
|
||||||
/* Struct with the WebDAV session */
|
|
||||||
struct dav_session_s {
|
|
||||||
ne_session *ctx;
|
|
||||||
char *user;
|
|
||||||
char *pwd;
|
|
||||||
|
|
||||||
char *proxy_type;
|
|
||||||
char *proxy_host;
|
|
||||||
int proxy_port;
|
|
||||||
char *proxy_user;
|
|
||||||
char *proxy_pwd;
|
|
||||||
|
|
||||||
char *session_key;
|
|
||||||
|
|
||||||
char *error_string;
|
|
||||||
|
|
||||||
int read_timeout;
|
|
||||||
|
|
||||||
CSYNC *csync_ctx;
|
|
||||||
|
|
||||||
bool no_recursive_propfind;
|
|
||||||
|
|
||||||
csync_owncloud_redirect_callback_t redir_callback;
|
|
||||||
};
|
|
||||||
extern struct dav_session_s dav_session;
|
|
||||||
|
|
||||||
/* The list of properties that is fetched in PropFind on a collection */
|
|
||||||
static const ne_propname ls_props[] = {
|
|
||||||
{ "DAV:", "getlastmodified" },
|
|
||||||
{ "DAV:", "getcontentlength" },
|
|
||||||
{ "DAV:", "resourcetype" },
|
|
||||||
{ "DAV:", "getetag"},
|
|
||||||
{ "http://owncloud.org/ns", "id"},
|
|
||||||
{ NULL, NULL }
|
|
||||||
};
|
|
||||||
|
|
||||||
void set_errno_from_http_errcode( int err );
|
|
||||||
void set_error_message( const char *msg );
|
|
||||||
void set_errno_from_neon_errcode( int neon_code );
|
|
||||||
int http_result_code_from_session(void);
|
|
||||||
void set_errno_from_session(void);
|
|
||||||
|
|
||||||
time_t oc_httpdate_parse( const char *date );
|
|
||||||
|
|
||||||
char *_cleanPath( const char* uri );
|
|
||||||
|
|
||||||
int _stat_perms( int type );
|
|
||||||
csync_vio_file_stat_t *resourceToFileStat( struct resource *res );
|
|
||||||
|
|
||||||
// Public API from vio
|
|
||||||
csync_vio_handle_t *owncloud_opendir(const char *uri);
|
|
||||||
csync_vio_file_stat_t *owncloud_readdir(csync_vio_handle_t *dhandle);
|
|
||||||
int owncloud_closedir(csync_vio_handle_t *dhandle);
|
|
||||||
int owncloud_stat(const char *uri, csync_vio_file_stat_t *buf);
|
|
||||||
int owncloud_commit(void);
|
|
||||||
char *owncloud_error_string(void);
|
|
||||||
void owncloud_init(void *userdata);
|
|
||||||
int owncloud_set_property(const char *key, void *data);
|
|
||||||
|
|
||||||
#endif /* CSYNC_OWNCLOUD_H */
|
#endif /* CSYNC_OWNCLOUD_H */
|
||||||
|
|||||||
115
csync/src/csync_owncloud_private.h
Normal file
115
csync/src/csync_owncloud_private.h
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
/*
|
||||||
|
* libcsync -- a library to sync a directory with another
|
||||||
|
*
|
||||||
|
* Copyright (c) 2011 by Andreas Schneider <asn@cryptomilk.org>
|
||||||
|
* Copyright (c) 2012 by Klaas Freitag <freitag@owncloud.com>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CSYNC_OWNCLOUD_PRIVATE_H
|
||||||
|
#define CSYNC_OWNCLOUD_PRIVATE_H
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
#include "config_csync.h"
|
||||||
|
#ifdef NEON_WITH_LFS /* Switch on LFS in libneon. Never remove the NE_LFS! */
|
||||||
|
#define NE_LFS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <neon/ne_basic.h>
|
||||||
|
#include <neon/ne_socket.h>
|
||||||
|
#include <neon/ne_session.h>
|
||||||
|
#include <neon/ne_request.h>
|
||||||
|
#include <neon/ne_props.h>
|
||||||
|
#include <neon/ne_auth.h>
|
||||||
|
#include <neon/ne_dates.h>
|
||||||
|
#include <neon/ne_compress.h>
|
||||||
|
#include <neon/ne_redirect.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "c_rbtree.h"
|
||||||
|
|
||||||
|
#include "c_lib.h"
|
||||||
|
#include "csync.h"
|
||||||
|
#include "csync_misc.h"
|
||||||
|
#include "csync_macros.h"
|
||||||
|
#include "c_private.h"
|
||||||
|
|
||||||
|
#include "vio/csync_vio.h"
|
||||||
|
|
||||||
|
#include "csync_log.h"
|
||||||
|
|
||||||
|
#include "csync_owncloud.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define DEBUG_WEBDAV(...) csync_log( 9, "oc_module", __VA_ARGS__);
|
||||||
|
|
||||||
|
typedef int (*csync_owncloud_redirect_callback_t)(CSYNC* ctx, const char* uri);
|
||||||
|
|
||||||
|
/* Struct with the WebDAV session */
|
||||||
|
struct dav_session_s {
|
||||||
|
ne_session *ctx;
|
||||||
|
char *user;
|
||||||
|
char *pwd;
|
||||||
|
|
||||||
|
char *proxy_type;
|
||||||
|
char *proxy_host;
|
||||||
|
int proxy_port;
|
||||||
|
char *proxy_user;
|
||||||
|
char *proxy_pwd;
|
||||||
|
|
||||||
|
char *session_key;
|
||||||
|
|
||||||
|
char *error_string;
|
||||||
|
|
||||||
|
int read_timeout;
|
||||||
|
|
||||||
|
csync_owncloud_redirect_callback_t redir_callback;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct csync_owncloud_ctx_s {
|
||||||
|
CSYNC *csync_ctx;
|
||||||
|
|
||||||
|
// For the WebDAV connection
|
||||||
|
struct dav_session_s dav_session; /* The DAV Session, initialised in dav_connect */
|
||||||
|
int _connected; /* flag to indicate if a connection exists, ie.
|
||||||
|
the dav_session is valid */
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct csync_owncloud_ctx_s csync_owncloud_ctx_t;
|
||||||
|
//typedef csync_owncloud_ctx_t* csync_owncloud_ctx_p;
|
||||||
|
|
||||||
|
void set_errno_from_http_errcode( int err );
|
||||||
|
void set_error_message( csync_owncloud_ctx_t *ctx, const char *msg );
|
||||||
|
void set_errno_from_neon_errcode(csync_owncloud_ctx_t *ctx, int neon_code );
|
||||||
|
int http_result_code_from_session(csync_owncloud_ctx_t *ctx);
|
||||||
|
void set_errno_from_session(csync_owncloud_ctx_t *ctx);
|
||||||
|
|
||||||
|
time_t oc_httpdate_parse( const char *date );
|
||||||
|
|
||||||
|
const char* csync_owncloud_get_platform(void);
|
||||||
|
|
||||||
|
char *_cleanPath( const char* uri );
|
||||||
|
|
||||||
|
#endif // CSYNC_OWNCLOUD_PRIVATE_H
|
||||||
@@ -1,337 +0,0 @@
|
|||||||
/*
|
|
||||||
* libcsync -- a library to sync a directory with another
|
|
||||||
*
|
|
||||||
* Copyright (c) 2011 by Andreas Schneider <asn@cryptomilk.org>
|
|
||||||
* Copyright (c) 2012 by Klaas Freitag <freitag@owncloud.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "csync_owncloud.h"
|
|
||||||
|
|
||||||
c_rbtree_t *propfind_recursive_cache = NULL;
|
|
||||||
int propfind_recursive_cache_depth = 0;
|
|
||||||
int propfind_recursive_cache_file_count = 0;
|
|
||||||
int propfind_recursive_cache_folder_count = 0;
|
|
||||||
|
|
||||||
|
|
||||||
static struct resource* resource_dup(struct resource* o) {
|
|
||||||
struct resource *r = c_malloc (sizeof( struct resource ));
|
|
||||||
ZERO_STRUCTP(r);
|
|
||||||
|
|
||||||
r->uri = c_strdup(o->uri);
|
|
||||||
r->name = c_strdup(o->name);
|
|
||||||
r->type = o->type;
|
|
||||||
r->size = o->size;
|
|
||||||
r->modtime = o->modtime;
|
|
||||||
if( o->md5 ) {
|
|
||||||
r->md5 = c_strdup(o->md5);
|
|
||||||
}
|
|
||||||
r->next = o->next;
|
|
||||||
csync_vio_set_file_id(r->file_id, o->file_id);
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
static void resource_free(struct resource* o) {
|
|
||||||
struct resource* old = NULL;
|
|
||||||
while (o)
|
|
||||||
{
|
|
||||||
old = o;
|
|
||||||
o = o->next;
|
|
||||||
SAFE_FREE(old->uri);
|
|
||||||
SAFE_FREE(old->name);
|
|
||||||
SAFE_FREE(old->md5);
|
|
||||||
SAFE_FREE(old);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void _tree_destructor(void *data) {
|
|
||||||
propfind_recursive_element_t *element = data;
|
|
||||||
resource_free(element->self);
|
|
||||||
resource_free(element->children);
|
|
||||||
SAFE_FREE(element);
|
|
||||||
}
|
|
||||||
|
|
||||||
void clear_propfind_recursive_cache(void)
|
|
||||||
{
|
|
||||||
if (propfind_recursive_cache) {
|
|
||||||
DEBUG_WEBDAV("clear_propfind_recursive_cache Invalidating..");
|
|
||||||
c_rbtree_destroy(propfind_recursive_cache, _tree_destructor);
|
|
||||||
propfind_recursive_cache = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct listdir_context *get_listdir_context_from_recursive_cache(const char *curi)
|
|
||||||
{
|
|
||||||
propfind_recursive_element_t *element = NULL;
|
|
||||||
struct listdir_context *fetchCtx = NULL;
|
|
||||||
struct resource *iterator, *r;
|
|
||||||
|
|
||||||
if (!propfind_recursive_cache) {
|
|
||||||
DEBUG_WEBDAV("get_listdir_context_from_recursive_cache No cache");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
element = c_rbtree_node_data(c_rbtree_find(propfind_recursive_cache, curi));
|
|
||||||
if (!element) {
|
|
||||||
DEBUG_WEBDAV("get_listdir_context_from_recursive_cache No element %s in cache found", curi);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Out of the element, create a listdir_context.. if we could be sure that it is immutable, we could ref instead.. need to investigate */
|
|
||||||
fetchCtx = c_malloc( sizeof( struct listdir_context ));
|
|
||||||
ZERO_STRUCTP(fetchCtx);
|
|
||||||
fetchCtx->list = NULL;
|
|
||||||
fetchCtx->target = c_strdup(curi);
|
|
||||||
fetchCtx->currResource = NULL;
|
|
||||||
fetchCtx->ref = 1;
|
|
||||||
|
|
||||||
iterator = element->children;
|
|
||||||
r = NULL;
|
|
||||||
while (iterator) {
|
|
||||||
r = resource_dup(iterator);
|
|
||||||
r->next = fetchCtx->list;
|
|
||||||
fetchCtx->list = r;
|
|
||||||
iterator = iterator->next;
|
|
||||||
fetchCtx->result_count++;
|
|
||||||
/* DEBUG_WEBDAV("get_listdir_context_from_cache Returning cache for %s element %s", fetchCtx->target, fetchCtx->list->uri); */
|
|
||||||
}
|
|
||||||
|
|
||||||
r = resource_dup(element->self);
|
|
||||||
r->next = fetchCtx->list;
|
|
||||||
fetchCtx->result_count++;
|
|
||||||
fetchCtx->list = r;
|
|
||||||
fetchCtx->currResource = fetchCtx->list;
|
|
||||||
DEBUG_WEBDAV("get_listdir_context_from_cache Returning cache for %s (%d elements)", fetchCtx->target, fetchCtx->result_count);
|
|
||||||
return fetchCtx;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int _key_cmp(const void *key, const void *b) {
|
|
||||||
const char *elementAUri = (char*)key;
|
|
||||||
const propfind_recursive_element_t *elementB = b;
|
|
||||||
return ne_path_compare(elementAUri, elementB->self->uri);
|
|
||||||
}
|
|
||||||
static int _data_cmp(const void *a, const void *b) {
|
|
||||||
const propfind_recursive_element_t *elementA = a;
|
|
||||||
const propfind_recursive_element_t *elementB = b;
|
|
||||||
return ne_path_compare(elementA->self->uri, elementB->self->uri);
|
|
||||||
}
|
|
||||||
static void propfind_results_recursive(void *userdata,
|
|
||||||
const ne_uri *uri,
|
|
||||||
const ne_prop_result_set *set)
|
|
||||||
{
|
|
||||||
struct resource *newres = 0;
|
|
||||||
const char *clength, *modtime, *file_id = NULL;
|
|
||||||
const char *resourcetype = NULL;
|
|
||||||
const char *md5sum = NULL;
|
|
||||||
const ne_status *status = NULL;
|
|
||||||
char *path = ne_path_unescape( uri->path );
|
|
||||||
char *parentPath;
|
|
||||||
char *propfindRootUri = (char*) userdata;
|
|
||||||
propfind_recursive_element_t *element = NULL;
|
|
||||||
propfind_recursive_element_t *pElement = NULL;
|
|
||||||
int depth = 0;
|
|
||||||
|
|
||||||
(void) status;
|
|
||||||
(void) propfindRootUri;
|
|
||||||
|
|
||||||
if (!propfind_recursive_cache) {
|
|
||||||
c_rbtree_create(&propfind_recursive_cache, _key_cmp, _data_cmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Fill the resource structure with the data about the file */
|
|
||||||
newres = c_malloc(sizeof(struct resource));
|
|
||||||
ZERO_STRUCTP(newres);
|
|
||||||
|
|
||||||
newres->uri = path; /* no need to strdup because ne_path_unescape already allocates */
|
|
||||||
newres->name = c_basename( path );
|
|
||||||
|
|
||||||
modtime = ne_propset_value( set, &ls_props[0] );
|
|
||||||
clength = ne_propset_value( set, &ls_props[1] );
|
|
||||||
resourcetype = ne_propset_value( set, &ls_props[2] );
|
|
||||||
md5sum = ne_propset_value( set, &ls_props[3] );
|
|
||||||
file_id = ne_propset_value( set, &ls_props[4] );
|
|
||||||
|
|
||||||
newres->type = resr_normal;
|
|
||||||
if( resourcetype && strncmp( resourcetype, "<DAV:collection>", 16 ) == 0) {
|
|
||||||
newres->type = resr_collection;
|
|
||||||
propfind_recursive_cache_folder_count++;
|
|
||||||
} else {
|
|
||||||
/* DEBUG_WEBDAV("propfind_results_recursive %s [%d]", newres->uri, newres->type); */
|
|
||||||
propfind_recursive_cache_file_count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (modtime) {
|
|
||||||
newres->modtime = oc_httpdate_parse(modtime);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* DEBUG_WEBDAV("Parsing Modtime: %s -> %llu", modtime, (unsigned long long) newres->modtime ); */
|
|
||||||
newres->size = 0;
|
|
||||||
if (clength) {
|
|
||||||
newres->size = atoll(clength);
|
|
||||||
/* DEBUG_WEBDAV("Parsed File size for %s from %s: %lld", newres->name, clength, (long long)newres->size ); */
|
|
||||||
}
|
|
||||||
|
|
||||||
if( md5sum ) {
|
|
||||||
newres->md5 = csync_normalize_etag(md5sum);
|
|
||||||
}
|
|
||||||
|
|
||||||
csync_vio_set_file_id(newres->file_id, file_id);
|
|
||||||
/*
|
|
||||||
DEBUG_WEBDAV("propfind_results_recursive %s [%s] %s", newres->uri, newres->type == resr_collection ? "collection" : "file", newres->md5);
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Create new item in rb tree */
|
|
||||||
if (newres->type == resr_collection) {
|
|
||||||
DEBUG_WEBDAV("propfind_results_recursive %s is a folder", newres->uri);
|
|
||||||
/* Check if in rb tree */
|
|
||||||
element = c_rbtree_node_data(c_rbtree_find(propfind_recursive_cache,uri->path));
|
|
||||||
/* If not, create a new item and insert it */
|
|
||||||
if (!element) {
|
|
||||||
element = c_malloc(sizeof(propfind_recursive_element_t));
|
|
||||||
element->self = resource_dup(newres);
|
|
||||||
element->children = NULL;
|
|
||||||
element->parent = NULL;
|
|
||||||
c_rbtree_insert(propfind_recursive_cache, element);
|
|
||||||
/* DEBUG_WEBDAV("results_recursive Added collection %s", newres->uri); */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check for parent in tree. If exists: Insert it into the children elements there */
|
|
||||||
parentPath = ne_path_parent(uri->path);
|
|
||||||
if (parentPath) {
|
|
||||||
propfind_recursive_element_t *parentElement = NULL;
|
|
||||||
|
|
||||||
parentElement = c_rbtree_node_data(c_rbtree_find(propfind_recursive_cache,parentPath));
|
|
||||||
free(parentPath);
|
|
||||||
|
|
||||||
if (parentElement) {
|
|
||||||
newres->next = parentElement->children;
|
|
||||||
parentElement->children = newres;
|
|
||||||
|
|
||||||
/* If the current result is a collection we also need to set its parent */
|
|
||||||
if (element)
|
|
||||||
element->parent = parentElement;
|
|
||||||
|
|
||||||
pElement = element;
|
|
||||||
while (pElement) {
|
|
||||||
depth++;
|
|
||||||
pElement = pElement->parent;
|
|
||||||
}
|
|
||||||
if (depth > propfind_recursive_cache_depth) {
|
|
||||||
DEBUG_WEBDAV("propfind_results_recursive %s new maximum tree depth %d", newres->uri, depth);
|
|
||||||
propfind_recursive_cache_depth = depth;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* DEBUG_WEBDAV("results_recursive Added child %s to collection %s", newres->uri, element->self->uri); */
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
resource_free(newres);
|
|
||||||
newres = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void fetch_resource_list_recursive(const char *uri, const char *curi)
|
|
||||||
{
|
|
||||||
int ret = 0;
|
|
||||||
ne_propfind_handler *hdl = NULL;
|
|
||||||
ne_request *request = NULL;
|
|
||||||
const char *content_type = NULL;
|
|
||||||
const ne_status *req_status = NULL;
|
|
||||||
int depth = NE_DEPTH_INFINITE;
|
|
||||||
|
|
||||||
DEBUG_WEBDAV("fetch_resource_list_recursive Starting recursive propfind %s %s", uri, curi);
|
|
||||||
|
|
||||||
/* do a propfind request and parse the results in the results function, set as callback */
|
|
||||||
hdl = ne_propfind_create(dav_session.ctx, curi, depth);
|
|
||||||
|
|
||||||
if(hdl) {
|
|
||||||
ret = ne_propfind_named(hdl, ls_props, propfind_results_recursive, (void*)curi);
|
|
||||||
request = ne_propfind_get_request( hdl );
|
|
||||||
req_status = ne_get_status( request );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( ret == NE_OK ) {
|
|
||||||
/* Check the request status. */
|
|
||||||
if( req_status && req_status->klass != 2 ) {
|
|
||||||
set_errno_from_http_errcode(req_status->code);
|
|
||||||
DEBUG_WEBDAV("ERROR: Request failed: status %d (%s)", req_status->code,
|
|
||||||
req_status->reason_phrase);
|
|
||||||
ret = NE_CONNECT;
|
|
||||||
set_error_message(req_status->reason_phrase);
|
|
||||||
}
|
|
||||||
DEBUG_WEBDAV("Recursive propfind result code %d.", req_status ? req_status->code : 0);
|
|
||||||
} else {
|
|
||||||
if( ret == NE_ERROR && req_status->code == 404) {
|
|
||||||
errno = ENOENT;
|
|
||||||
} else {
|
|
||||||
set_errno_from_neon_errcode(ret);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( ret == NE_OK ) {
|
|
||||||
/* Check the content type. If the server has a problem, ie. database is gone or such,
|
|
||||||
* the content type is not xml but a html error message. Stop on processing if it's
|
|
||||||
* not XML.
|
|
||||||
* FIXME: Generate user error message from the reply content.
|
|
||||||
*/
|
|
||||||
content_type = ne_get_response_header( request, "Content-Type" );
|
|
||||||
if( !(content_type && c_streq(content_type, "application/xml; charset=utf-8") ) ) {
|
|
||||||
DEBUG_WEBDAV("ERROR: Content type of propfind request not XML: %s.",
|
|
||||||
content_type ? content_type: "<empty>");
|
|
||||||
errno = ERRNO_WRONG_CONTENT;
|
|
||||||
set_error_message("Server error: PROPFIND reply is not XML formatted!");
|
|
||||||
ret = NE_CONNECT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( ret != NE_OK ) {
|
|
||||||
const char *err = NULL;
|
|
||||||
|
|
||||||
err = ne_get_error( dav_session.ctx );
|
|
||||||
DEBUG_WEBDAV("WRN: propfind named failed with %d, request error: %s", ret, err ? err : "<nil>");
|
|
||||||
}
|
|
||||||
|
|
||||||
if( hdl )
|
|
||||||
ne_propfind_destroy(hdl);
|
|
||||||
|
|
||||||
if( ret != NE_OK ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Called by owncloud_opendir()->fetch_resource_list() to fill the cache */
|
|
||||||
extern struct listdir_context *propfind_cache;
|
|
||||||
void fill_recursive_propfind_cache(const char *uri, const char *curi) {
|
|
||||||
fetch_resource_list_recursive(uri, curi);
|
|
||||||
|
|
||||||
if (propfind_recursive_cache_depth <= 2) {
|
|
||||||
DEBUG_WEBDAV("fill_recursive_propfind_cache %s Server maybe did not give us an 'infinity' depth result", curi);
|
|
||||||
/* transform the cache to the normal cache in propfind_cache */
|
|
||||||
propfind_cache = get_listdir_context_from_recursive_cache(curi);
|
|
||||||
/* clear the cache, it is bogus since the server returned only results for Depth 1 */
|
|
||||||
clear_propfind_recursive_cache();
|
|
||||||
} else {
|
|
||||||
DEBUG_WEBDAV("fill_recursive_propfind_cache %s We received %d elements deep for 'infinity' depth (%d folders, %d files)",
|
|
||||||
curi,
|
|
||||||
propfind_recursive_cache_depth,
|
|
||||||
propfind_recursive_cache_folder_count,
|
|
||||||
propfind_recursive_cache_file_count);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -20,14 +20,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "csync_owncloud.h"
|
#include "csync_owncloud.h"
|
||||||
#include "csync_misc.h"
|
#include "csync_owncloud_private.h"
|
||||||
|
|
||||||
void set_error_message( const char *msg )
|
#include "csync_misc.h"
|
||||||
{
|
|
||||||
SAFE_FREE(dav_session.error_string);
|
|
||||||
if( msg )
|
|
||||||
dav_session.error_string = c_strdup(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_errno_from_http_errcode( int err ) {
|
void set_errno_from_http_errcode( int err ) {
|
||||||
int new_errno = 0;
|
int new_errno = 0;
|
||||||
@@ -104,238 +99,27 @@ void set_errno_from_http_errcode( int err ) {
|
|||||||
errno = new_errno;
|
errno = new_errno;
|
||||||
}
|
}
|
||||||
|
|
||||||
int http_result_code_from_session() {
|
// as per http://sourceforge.net/p/predef/wiki/OperatingSystems/
|
||||||
const char *p = ne_get_error( dav_session.ctx );
|
// extend as required
|
||||||
char *q;
|
const char* csync_owncloud_get_platform() {
|
||||||
int err;
|
#if defined (_WIN32)
|
||||||
|
return "Windows";
|
||||||
set_error_message(p); /* remember the error message */
|
#elif defined(__APPLE__)
|
||||||
|
return "Macintosh";
|
||||||
err = strtol(p, &q, 10);
|
#elif defined(__gnu_linux__)
|
||||||
if (p == q) {
|
return "Linux";
|
||||||
err = ERRNO_ERROR_STRING;
|
#elif defined(__DragonFly__)
|
||||||
}
|
/* might also define __FreeBSD__ */
|
||||||
return err;
|
return "DragonFlyBSD";
|
||||||
}
|
#elif defined(__FreeBSD__)
|
||||||
|
return "FreeBSD";
|
||||||
void set_errno_from_session() {
|
#elif defined(__NetBSD__)
|
||||||
int err = http_result_code_from_session();
|
return "NetBSD";
|
||||||
|
#elif defined(__OpenBSD__)
|
||||||
if( err == EIO || err == ERRNO_ERROR_STRING) {
|
return "OpenBSD";
|
||||||
errno = err;
|
#elif defined(sun) || defined(__sun)
|
||||||
} else {
|
return "Solaris";
|
||||||
set_errno_from_http_errcode(err);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_errno_from_neon_errcode( int neon_code ) {
|
|
||||||
|
|
||||||
if( neon_code != NE_OK ) {
|
|
||||||
DEBUG_WEBDAV("Neon error code was %d", neon_code);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(neon_code) {
|
|
||||||
case NE_OK: /* Success, but still the possiblity of problems */
|
|
||||||
case NE_ERROR: /* Generic error; use ne_get_error(session) for message */
|
|
||||||
set_errno_from_session(); /* Something wrong with http communication */
|
|
||||||
break;
|
|
||||||
case NE_LOOKUP: /* Server or proxy hostname lookup failed */
|
|
||||||
errno = ERRNO_LOOKUP_ERROR;
|
|
||||||
break;
|
|
||||||
case NE_AUTH: /* User authentication failed on server */
|
|
||||||
errno = ERRNO_USER_UNKNOWN_ON_SERVER;
|
|
||||||
break;
|
|
||||||
case NE_PROXYAUTH: /* User authentication failed on proxy */
|
|
||||||
errno = ERRNO_PROXY_AUTH;
|
|
||||||
break;
|
|
||||||
case NE_CONNECT: /* Could not connect to server */
|
|
||||||
errno = ERRNO_CONNECT;
|
|
||||||
break;
|
|
||||||
case NE_TIMEOUT: /* Connection timed out */
|
|
||||||
errno = ERRNO_TIMEOUT;
|
|
||||||
break;
|
|
||||||
case NE_FAILED: /* The precondition failed */
|
|
||||||
errno = ERRNO_PRECONDITION;
|
|
||||||
break;
|
|
||||||
case NE_RETRY: /* Retry request (ne_end_request ONLY) */
|
|
||||||
errno = ERRNO_RETRY;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NE_REDIRECT: /* See ne_redirect.h */
|
|
||||||
errno = ERRNO_REDIRECT;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
errno = ERRNO_GENERAL_ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* cleanPath to return an escaped path of an uri */
|
|
||||||
char *_cleanPath( const char* uri ) {
|
|
||||||
int rc = 0;
|
|
||||||
char *path = NULL;
|
|
||||||
char *re = NULL;
|
|
||||||
|
|
||||||
rc = c_parse_uri( uri, NULL, NULL, NULL, NULL, NULL, &path );
|
|
||||||
if( rc < 0 ) {
|
|
||||||
DEBUG_WEBDAV("Unable to cleanPath %s", uri ? uri: "<zero>" );
|
|
||||||
re = NULL;
|
|
||||||
} else {
|
|
||||||
if(path) {
|
|
||||||
re = ne_path_escape( path );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SAFE_FREE( path );
|
|
||||||
return re;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef HAVE_TIMEGM
|
|
||||||
#ifdef _WIN32
|
|
||||||
static int is_leap(unsigned y) {
|
|
||||||
y += 1900;
|
|
||||||
return (y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static time_t timegm(struct tm *tm) {
|
|
||||||
static const unsigned ndays[2][12] = {
|
|
||||||
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
|
|
||||||
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} };
|
|
||||||
|
|
||||||
time_t res = 0;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 70; i < tm->tm_year; ++i)
|
|
||||||
res += is_leap(i) ? 366 : 365;
|
|
||||||
|
|
||||||
for (i = 0; i < tm->tm_mon; ++i)
|
|
||||||
res += ndays[is_leap(tm->tm_year)][i];
|
|
||||||
res += tm->tm_mday - 1;
|
|
||||||
res *= 24;
|
|
||||||
res += tm->tm_hour;
|
|
||||||
res *= 60;
|
|
||||||
res += tm->tm_min;
|
|
||||||
res *= 60;
|
|
||||||
res += tm->tm_sec;
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
/* A hopefully portable version of timegm */
|
return "Unknown OS";
|
||||||
static time_t timegm(struct tm *tm ) {
|
#endif
|
||||||
time_t ret;
|
|
||||||
char *tz;
|
|
||||||
|
|
||||||
tz = getenv("TZ");
|
|
||||||
setenv("TZ", "", 1);
|
|
||||||
tzset();
|
|
||||||
ret = mktime(tm);
|
|
||||||
if (tz)
|
|
||||||
setenv("TZ", tz, 1);
|
|
||||||
else
|
|
||||||
unsetenv("TZ");
|
|
||||||
tzset();
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
#endif /* Platform switch */
|
|
||||||
#endif /* HAVE_TIMEGM */
|
|
||||||
|
|
||||||
#define RFC1123_FORMAT "%3s, %02d %3s %4d %02d:%02d:%02d GMT"
|
|
||||||
static const char short_months[12][4] = {
|
|
||||||
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
|
||||||
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
|
|
||||||
};
|
|
||||||
/*
|
|
||||||
* This function is borrowed from libneon's ne_httpdate_parse.
|
|
||||||
* Unfortunately that one converts to local time but here UTC is
|
|
||||||
* needed.
|
|
||||||
* This one uses timegm instead, which returns UTC.
|
|
||||||
*/
|
|
||||||
time_t oc_httpdate_parse( const char *date ) {
|
|
||||||
struct tm gmt;
|
|
||||||
char wkday[4], mon[4];
|
|
||||||
int n;
|
|
||||||
time_t result = 0;
|
|
||||||
|
|
||||||
memset(&gmt, 0, sizeof(struct tm));
|
|
||||||
|
|
||||||
/* it goes: Sun, 06 Nov 1994 08:49:37 GMT */
|
|
||||||
n = sscanf(date, RFC1123_FORMAT,
|
|
||||||
wkday, &gmt.tm_mday, mon, &gmt.tm_year, &gmt.tm_hour,
|
|
||||||
&gmt.tm_min, &gmt.tm_sec);
|
|
||||||
/* Is it portable to check n==7 here? */
|
|
||||||
gmt.tm_year -= 1900;
|
|
||||||
for (n=0; n<12; n++)
|
|
||||||
if (strcmp(mon, short_months[n]) == 0)
|
|
||||||
break;
|
|
||||||
/* tm_mon comes out as 12 if the month is corrupt, which is desired,
|
|
||||||
* since the mktime will then fail */
|
|
||||||
gmt.tm_mon = n;
|
|
||||||
gmt.tm_isdst = -1;
|
|
||||||
result = timegm(&gmt);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* helper: convert a resource struct to file_stat struct.
|
|
||||||
*/
|
|
||||||
csync_vio_file_stat_t *resourceToFileStat( struct resource *res )
|
|
||||||
{
|
|
||||||
csync_vio_file_stat_t *lfs = NULL;
|
|
||||||
|
|
||||||
if( ! res ) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
lfs = c_malloc(sizeof(csync_vio_file_stat_t));
|
|
||||||
if (lfs == NULL) {
|
|
||||||
errno = ENOMEM;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
lfs->name = c_strdup( res->name );
|
|
||||||
|
|
||||||
lfs->fields = CSYNC_VIO_FILE_STAT_FIELDS_NONE;
|
|
||||||
if( res->type == resr_normal ) {
|
|
||||||
lfs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_TYPE;
|
|
||||||
lfs->type = CSYNC_VIO_FILE_TYPE_REGULAR;
|
|
||||||
} else if( res->type == resr_collection ) {
|
|
||||||
lfs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_TYPE;
|
|
||||||
lfs->type = CSYNC_VIO_FILE_TYPE_DIRECTORY;
|
|
||||||
} else {
|
|
||||||
DEBUG_WEBDAV("ERROR: Unknown resource type %d", res->type);
|
|
||||||
}
|
|
||||||
|
|
||||||
lfs->mtime = res->modtime;
|
|
||||||
lfs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MTIME;
|
|
||||||
lfs->size = res->size;
|
|
||||||
lfs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_SIZE;
|
|
||||||
if( res->md5 ) {
|
|
||||||
lfs->etag = c_strdup(res->md5);
|
|
||||||
}
|
|
||||||
lfs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_ETAG;
|
|
||||||
csync_vio_file_stat_set_file_id(lfs, res->file_id);
|
|
||||||
|
|
||||||
return lfs;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* WebDAV does not deliver permissions. Set a default here. */
|
|
||||||
int _stat_perms( int type ) {
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
if( type == CSYNC_VIO_FILE_TYPE_DIRECTORY ) {
|
|
||||||
/* DEBUG_WEBDAV("Setting mode in stat (dir)"); */
|
|
||||||
/* directory permissions */
|
|
||||||
ret = S_IFDIR | S_IRUSR | S_IWUSR | S_IXUSR /* directory, rwx for user */
|
|
||||||
| S_IRGRP | S_IXGRP /* rx for group */
|
|
||||||
| S_IROTH | S_IXOTH; /* rx for others */
|
|
||||||
} else {
|
|
||||||
/* regualar file permissions */
|
|
||||||
/* DEBUG_WEBDAV("Setting mode in stat (file)"); */
|
|
||||||
ret = S_IFREG | S_IRUSR | S_IWUSR /* regular file, user read & write */
|
|
||||||
| S_IRGRP /* group read perm */
|
|
||||||
| S_IROTH; /* others read perm */
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,6 @@
|
|||||||
#include "std/c_private.h"
|
#include "std/c_private.h"
|
||||||
#include "csync.h"
|
#include "csync.h"
|
||||||
#include "csync_misc.h"
|
#include "csync_misc.h"
|
||||||
#include "vio/csync_vio_file_stat.h"
|
|
||||||
|
|
||||||
#ifdef WITH_ICONV
|
#ifdef WITH_ICONV
|
||||||
#include <iconv.h>
|
#include <iconv.h>
|
||||||
@@ -61,18 +60,6 @@
|
|||||||
*/
|
*/
|
||||||
#define MAX_DEPTH 50
|
#define MAX_DEPTH 50
|
||||||
|
|
||||||
/**
|
|
||||||
* Maximum time difference between two replicas in seconds
|
|
||||||
*/
|
|
||||||
#define MAX_TIME_DIFFERENCE 10
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Maximum size of a buffer for transfer
|
|
||||||
*/
|
|
||||||
#ifndef MAX_XFER_BUF_SIZE
|
|
||||||
#define MAX_XFER_BUF_SIZE (16 * 1024)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define CSYNC_STATUS_INIT 1 << 0
|
#define CSYNC_STATUS_INIT 1 << 0
|
||||||
#define CSYNC_STATUS_UPDATE 1 << 1
|
#define CSYNC_STATUS_UPDATE 1 << 1
|
||||||
#define CSYNC_STATUS_RECONCILE 1 << 2
|
#define CSYNC_STATUS_RECONCILE 1 << 2
|
||||||
@@ -90,6 +77,9 @@ enum csync_replica_e {
|
|||||||
|
|
||||||
typedef struct csync_file_stat_s csync_file_stat_t;
|
typedef struct csync_file_stat_s csync_file_stat_t;
|
||||||
|
|
||||||
|
struct csync_owncloud_ctx_s; // csync_owncloud.c
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief csync public structure
|
* @brief csync public structure
|
||||||
*/
|
*/
|
||||||
@@ -97,51 +87,51 @@ struct csync_s {
|
|||||||
struct {
|
struct {
|
||||||
csync_auth_callback auth_function;
|
csync_auth_callback auth_function;
|
||||||
void *userdata;
|
void *userdata;
|
||||||
|
csync_update_callback update_callback;
|
||||||
|
void *update_callback_userdata;
|
||||||
|
|
||||||
|
csync_vio_opendir_hook remote_opendir_hook;
|
||||||
|
csync_vio_readdir_hook remote_readdir_hook;
|
||||||
|
csync_vio_closedir_hook remote_closedir_hook;
|
||||||
|
void *vio_userdata;
|
||||||
} callbacks;
|
} callbacks;
|
||||||
c_strlist_t *excludes;
|
c_strlist_t *excludes;
|
||||||
|
|
||||||
|
// needed for SSL client certificate support
|
||||||
|
struct csync_client_certs_s *clientCerts;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
char *file;
|
char *file;
|
||||||
sqlite3 *db;
|
sqlite3 *db;
|
||||||
int exists;
|
int exists;
|
||||||
int disabled;
|
|
||||||
|
|
||||||
sqlite3_stmt* by_hash_stmt;
|
sqlite3_stmt* by_hash_stmt;
|
||||||
sqlite3_stmt* by_fileid_stmt;
|
sqlite3_stmt* by_fileid_stmt;
|
||||||
sqlite3_stmt* by_inode_stmt;
|
sqlite3_stmt* by_inode_stmt;
|
||||||
|
|
||||||
|
int lastReturnValue;
|
||||||
} statedb;
|
} statedb;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
char *uri;
|
char *uri;
|
||||||
c_rbtree_t *tree;
|
c_rbtree_t *tree;
|
||||||
c_list_t *list;
|
|
||||||
enum csync_replica_e type;
|
enum csync_replica_e type;
|
||||||
c_list_t *ignored_cleanup;
|
|
||||||
} local;
|
} local;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
char *uri;
|
char *uri;
|
||||||
c_rbtree_t *tree;
|
c_rbtree_t *tree;
|
||||||
c_list_t *list;
|
|
||||||
enum csync_replica_e type;
|
enum csync_replica_e type;
|
||||||
int read_from_db;
|
int read_from_db;
|
||||||
c_list_t *ignored_cleanup;
|
const char *root_perms; /* Permission of the root folder. (Since the root folder is not in the db tree, we need to keep a separate entry.) */
|
||||||
} remote;
|
} remote;
|
||||||
|
|
||||||
struct {
|
|
||||||
int sync_symbolic_links;
|
|
||||||
char *config_dir;
|
|
||||||
bool local_only_mode;
|
|
||||||
int timeout;
|
|
||||||
#if defined(HAVE_ICONV) && defined(WITH_ICONV)
|
|
||||||
iconv_t iconv_cd;
|
|
||||||
#endif
|
|
||||||
} options;
|
|
||||||
|
|
||||||
|
#if defined(HAVE_ICONV) && defined(WITH_ICONV)
|
||||||
struct {
|
struct {
|
||||||
uid_t uid;
|
iconv_t iconv_cd;
|
||||||
uid_t euid;
|
} options;
|
||||||
} pwd;
|
#endif
|
||||||
|
|
||||||
/* replica we are currently walking */
|
/* replica we are currently walking */
|
||||||
enum csync_replica_e current;
|
enum csync_replica_e current;
|
||||||
@@ -162,6 +152,12 @@ struct csync_s {
|
|||||||
volatile int abort;
|
volatile int abort;
|
||||||
void *rename_info;
|
void *rename_info;
|
||||||
int read_from_db_disabled;
|
int read_from_db_disabled;
|
||||||
|
|
||||||
|
struct csync_owncloud_ctx_s *owncloud_context;
|
||||||
|
|
||||||
|
/* hooks for checking the white list */
|
||||||
|
void *checkSelectiveSyncBlackListData;
|
||||||
|
int (*checkSelectiveSyncBlackListHook)(void*, const char*);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -174,17 +170,20 @@ struct csync_file_stat_s {
|
|||||||
int64_t size; /* u64 */
|
int64_t size; /* u64 */
|
||||||
size_t pathlen; /* u64 */
|
size_t pathlen; /* u64 */
|
||||||
uint64_t inode; /* u64 */
|
uint64_t inode; /* u64 */
|
||||||
uid_t uid; /* u32 */
|
|
||||||
gid_t gid; /* u32 */
|
|
||||||
mode_t mode; /* u32 */
|
mode_t mode; /* u32 */
|
||||||
int nlink; /* u32 */
|
int nlink; /* u32 */
|
||||||
int type; /* u32 */
|
int type; /* u32 */
|
||||||
int child_modified;/*bool*/
|
int child_modified;/*bool*/
|
||||||
int should_update_etag; /*bool */
|
int should_update_etag; /*bool */
|
||||||
|
int has_ignored_files; /*bool: specify that a directory, or child directory contains ignored files */
|
||||||
|
|
||||||
char *destpath; /* for renames */
|
char *destpath; /* for renames */
|
||||||
const char *etag;
|
const char *etag;
|
||||||
char file_id[FILE_ID_BUF_SIZE+1]; /* the ownCloud file id is fixed width of 21 byte. */
|
char file_id[FILE_ID_BUF_SIZE+1]; /* the ownCloud file id is fixed width of 21 byte. */
|
||||||
|
char *directDownloadUrl;
|
||||||
|
char *directDownloadCookies;
|
||||||
|
char remotePerm[REMOTE_PERM_BUF_SIZE+1];
|
||||||
|
|
||||||
CSYNC_STATUS error_status;
|
CSYNC_STATUS error_status;
|
||||||
|
|
||||||
enum csync_instructions_e instruction; /* u32 */
|
enum csync_instructions_e instruction; /* u32 */
|
||||||
@@ -212,6 +211,10 @@ struct _csync_treewalk_context_s
|
|||||||
typedef struct _csync_treewalk_context_s _csync_treewalk_context;
|
typedef struct _csync_treewalk_context_s _csync_treewalk_context;
|
||||||
|
|
||||||
|
|
||||||
|
time_t oc_httpdate_parse( const char *date );
|
||||||
|
|
||||||
|
void set_errno_from_http_errcode( int err );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* }@
|
* }@
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -32,10 +32,6 @@
|
|||||||
|
|
||||||
#include "inttypes.h"
|
#include "inttypes.h"
|
||||||
|
|
||||||
#define ACCEPTED_TIME_DIFF 5
|
|
||||||
#define ONE_HOUR 3600
|
|
||||||
|
|
||||||
|
|
||||||
/* Check if a file is ignored because one parent is ignored.
|
/* Check if a file is ignored because one parent is ignored.
|
||||||
* return the node of the ignored directoy if it's the case, or NULL if it is not ignored */
|
* return the node of the ignored directoy if it's the case, or NULL if it is not ignored */
|
||||||
static c_rbnode_t *_csync_check_ignored(c_rbtree_t *tree, const char *path, int pathlen) {
|
static c_rbnode_t *_csync_check_ignored(c_rbtree_t *tree, const char *path, int pathlen) {
|
||||||
@@ -134,6 +130,15 @@ static int _csync_merge_algorithm_visitor(void *obj, void *data) {
|
|||||||
break;
|
break;
|
||||||
/* file has been removed on the opposite replica */
|
/* file has been removed on the opposite replica */
|
||||||
case CSYNC_INSTRUCTION_NONE:
|
case CSYNC_INSTRUCTION_NONE:
|
||||||
|
if (cur->has_ignored_files) {
|
||||||
|
/* Do not remove a directory that has ignored files */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (cur->child_modified) {
|
||||||
|
/* re-create directory that has modified contents */
|
||||||
|
cur->instruction = CSYNC_INSTRUCTION_NEW;
|
||||||
|
break;
|
||||||
|
}
|
||||||
cur->instruction = CSYNC_INSTRUCTION_REMOVE;
|
cur->instruction = CSYNC_INSTRUCTION_REMOVE;
|
||||||
break;
|
break;
|
||||||
case CSYNC_INSTRUCTION_EVAL_RENAME:
|
case CSYNC_INSTRUCTION_EVAL_RENAME:
|
||||||
@@ -184,6 +189,7 @@ static int _csync_merge_algorithm_visitor(void *obj, void *data) {
|
|||||||
csync_vio_set_file_id( other->file_id, cur->file_id );
|
csync_vio_set_file_id( other->file_id, cur->file_id );
|
||||||
}
|
}
|
||||||
other->inode = cur->inode;
|
other->inode = cur->inode;
|
||||||
|
other->should_update_etag = true;
|
||||||
cur->instruction = CSYNC_INSTRUCTION_NONE;
|
cur->instruction = CSYNC_INSTRUCTION_NONE;
|
||||||
} else if (other->instruction == CSYNC_INSTRUCTION_REMOVE) {
|
} else if (other->instruction == CSYNC_INSTRUCTION_REMOVE) {
|
||||||
other->instruction = CSYNC_INSTRUCTION_RENAME;
|
other->instruction = CSYNC_INSTRUCTION_RENAME;
|
||||||
@@ -193,6 +199,7 @@ static int _csync_merge_algorithm_visitor(void *obj, void *data) {
|
|||||||
csync_vio_set_file_id( other->file_id, cur->file_id );
|
csync_vio_set_file_id( other->file_id, cur->file_id );
|
||||||
}
|
}
|
||||||
other->inode = cur->inode;
|
other->inode = cur->inode;
|
||||||
|
other->should_update_etag = true;
|
||||||
cur->instruction = CSYNC_INSTRUCTION_NONE;
|
cur->instruction = CSYNC_INSTRUCTION_NONE;
|
||||||
} else if (other->instruction == CSYNC_INSTRUCTION_NEW) {
|
} else if (other->instruction == CSYNC_INSTRUCTION_NEW) {
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "OOOO=> NEW detected in other tree!");
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "OOOO=> NEW detected in other tree!");
|
||||||
@@ -243,6 +250,10 @@ static int _csync_merge_algorithm_visitor(void *obj, void *data) {
|
|||||||
is_equal_files = (other->modtime == cur->modtime);
|
is_equal_files = (other->modtime == cur->modtime);
|
||||||
} else {
|
} else {
|
||||||
is_equal_files = ((other->size == cur->size) && (other->modtime == cur->modtime));
|
is_equal_files = ((other->size == cur->size) && (other->modtime == cur->modtime));
|
||||||
|
// FIXME: do a binary comparision of the file here because of the following
|
||||||
|
// edge case:
|
||||||
|
// The files could still have different content, even though the mtime
|
||||||
|
// and size are the same.
|
||||||
}
|
}
|
||||||
if (is_equal_files) {
|
if (is_equal_files) {
|
||||||
/* The files are considered equal. */
|
/* The files are considered equal. */
|
||||||
|
|||||||
@@ -50,6 +50,22 @@
|
|||||||
|
|
||||||
#define BUF_SIZE 16
|
#define BUF_SIZE 16
|
||||||
|
|
||||||
|
#define sqlite_open(A, B) sqlite3_open_v2(A,B, SQLITE_OPEN_READONLY+SQLITE_OPEN_NOMUTEX, NULL)
|
||||||
|
|
||||||
|
#define SQLTM_TIME 150000
|
||||||
|
#define SQLTM_COUNT 10
|
||||||
|
|
||||||
|
#define SQLITE_BUSY_HANDLED(F) if(1) { \
|
||||||
|
int n = 0; \
|
||||||
|
do { rc = F ; \
|
||||||
|
if( (rc == SQLITE_BUSY) || (rc == SQLITE_LOCKED) ) { \
|
||||||
|
n++; \
|
||||||
|
usleep(SQLTM_TIME); \
|
||||||
|
} \
|
||||||
|
}while( (n < SQLTM_COUNT) && ((rc == SQLITE_BUSY) || (rc == SQLITE_LOCKED))); \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void csync_set_statedb_exists(CSYNC *ctx, int val) {
|
void csync_set_statedb_exists(CSYNC *ctx, int val) {
|
||||||
ctx->statedb.exists = val;
|
ctx->statedb.exists = val;
|
||||||
}
|
}
|
||||||
@@ -58,28 +74,6 @@ int csync_get_statedb_exists(CSYNC *ctx) {
|
|||||||
return ctx->statedb.exists;
|
return ctx->statedb.exists;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the hide attribute in win32. That makes it invisible in normal explorers */
|
|
||||||
static void _csync_win32_hide_file( const char *file ) {
|
|
||||||
#ifdef _WIN32
|
|
||||||
mbchar_t *fileName;
|
|
||||||
DWORD dwAttrs;
|
|
||||||
|
|
||||||
if( !file ) return;
|
|
||||||
|
|
||||||
fileName = c_utf8_to_locale( file );
|
|
||||||
dwAttrs = GetFileAttributesW(fileName);
|
|
||||||
|
|
||||||
if (dwAttrs != INVALID_FILE_ATTRIBUTES) {
|
|
||||||
if (!(dwAttrs & FILE_ATTRIBUTE_HIDDEN)) {
|
|
||||||
SetFileAttributesW(fileName, dwAttrs | FILE_ATTRIBUTE_HIDDEN );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
c_free_locale_string(fileName);
|
|
||||||
#else
|
|
||||||
(void) file;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static int _csync_check_db_integrity(sqlite3 *db) {
|
static int _csync_check_db_integrity(sqlite3 *db) {
|
||||||
c_strlist_t *result = NULL;
|
c_strlist_t *result = NULL;
|
||||||
int rc = -1;
|
int rc = -1;
|
||||||
@@ -95,85 +89,12 @@ static int _csync_check_db_integrity(sqlite3 *db) {
|
|||||||
c_strlist_destroy(result);
|
c_strlist_destroy(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
if( sqlite3_threadsafe() == 0 ) {
|
||||||
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_WARN, "* WARNING: SQLite module is not threadsafe!");
|
||||||
}
|
rc = -1;
|
||||||
|
|
||||||
static int _csync_statedb_check(const char *statedb) {
|
|
||||||
int fd = -1, rc;
|
|
||||||
ssize_t r;
|
|
||||||
char buf[BUF_SIZE] = {0};
|
|
||||||
sqlite3 *db = NULL;
|
|
||||||
csync_stat_t sb;
|
|
||||||
|
|
||||||
mbchar_t *wstatedb = c_utf8_to_locale(statedb);
|
|
||||||
|
|
||||||
if (wstatedb == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check db version */
|
|
||||||
#ifdef _WIN32
|
|
||||||
_fmode = _O_BINARY;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
fd = _topen(wstatedb, O_RDONLY);
|
|
||||||
|
|
||||||
if (fd >= 0) {
|
|
||||||
/* Check size. Size of zero is a valid database actually. */
|
|
||||||
rc = _tfstat(fd, &sb);
|
|
||||||
|
|
||||||
if (rc == 0) {
|
|
||||||
if (sb.st_size == 0) {
|
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "Database size is zero byte!");
|
|
||||||
close(fd);
|
|
||||||
} else {
|
|
||||||
r = read(fd, (void *) buf, sizeof(buf) - 1);
|
|
||||||
close(fd);
|
|
||||||
if (r >= 0) {
|
|
||||||
buf[BUF_SIZE - 1] = '\0';
|
|
||||||
if (c_streq(buf, "SQLite format 3")) {
|
|
||||||
if (sqlite3_open(statedb, &db ) == SQLITE_OK) {
|
|
||||||
rc = _csync_check_db_integrity(db);
|
|
||||||
if( sqlite3_close(db) != 0 ) {
|
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_NOTICE, "WARN: sqlite3_close error!");
|
|
||||||
}
|
|
||||||
|
|
||||||
if( rc >= 0 ) {
|
|
||||||
/* everything is fine */
|
|
||||||
c_free_locale_string(wstatedb);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "Integrity check failed!");
|
|
||||||
} else {
|
|
||||||
/* resources need to be freed even when open failed */
|
|
||||||
sqlite3_close(db);
|
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_WARN, "database corrupted, removing!");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_WARN, "sqlite version mismatch");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
close(fd);
|
|
||||||
}
|
|
||||||
/* if it comes here, the database is broken and should be recreated. */
|
|
||||||
_tunlink(wstatedb);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
c_free_locale_string(wstatedb);
|
return rc;
|
||||||
|
|
||||||
/* create database */
|
|
||||||
rc = sqlite3_open(statedb, &db);
|
|
||||||
if (rc == SQLITE_OK) {
|
|
||||||
sqlite3_close(db);
|
|
||||||
_csync_win32_hide_file(statedb);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
sqlite3_close(db);
|
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "sqlite3_open failed: %s %s", sqlite3_errmsg(db), statedb);
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _csync_statedb_is_empty(sqlite3 *db) {
|
static int _csync_statedb_is_empty(sqlite3 *db) {
|
||||||
@@ -201,7 +122,6 @@ static void sqlite_profile( void *x, const char* sql, sqlite3_uint64 time)
|
|||||||
|
|
||||||
int csync_statedb_load(CSYNC *ctx, const char *statedb, sqlite3 **pdb) {
|
int csync_statedb_load(CSYNC *ctx, const char *statedb, sqlite3 **pdb) {
|
||||||
int rc = -1;
|
int rc = -1;
|
||||||
int check_rc = -1;
|
|
||||||
c_strlist_t *result = NULL;
|
c_strlist_t *result = NULL;
|
||||||
sqlite3 *db = NULL;
|
sqlite3 *db = NULL;
|
||||||
|
|
||||||
@@ -209,46 +129,65 @@ int csync_statedb_load(CSYNC *ctx, const char *statedb, sqlite3 **pdb) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* csync_statedb_check tries to open the statedb and creates it in case
|
if (ctx->statedb.db) {
|
||||||
* its not there.
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_NOTICE, "ERR: DB already open");
|
||||||
*/
|
ctx->status_code = CSYNC_STATUS_PARAM_ERROR;
|
||||||
check_rc = _csync_statedb_check(statedb);
|
return -1;
|
||||||
if (check_rc < 0) {
|
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_NOTICE, "ERR: checking csync database failed - bail out.");
|
|
||||||
|
|
||||||
rc = -1;
|
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Open or create the temporary database */
|
ctx->statedb.lastReturnValue = SQLITE_OK;
|
||||||
if (sqlite3_open(statedb, &db) != SQLITE_OK) {
|
|
||||||
|
/* Openthe database */
|
||||||
|
if (sqlite_open(statedb, &db) != SQLITE_OK) {
|
||||||
const char *errmsg= sqlite3_errmsg(ctx->statedb.db);
|
const char *errmsg= sqlite3_errmsg(ctx->statedb.db);
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_NOTICE, "ERR: Failed to sqlite3 open statedb - bail out: %s.",
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_NOTICE, "ERR: Failed to sqlite3 open statedb - bail out: %s.",
|
||||||
errmsg ? errmsg : "<no sqlite3 errormsg>");
|
errmsg ? errmsg : "<no sqlite3 errormsg>");
|
||||||
|
|
||||||
rc = -1;
|
rc = -1;
|
||||||
|
ctx->status_code = CSYNC_STATUS_STATEDB_LOAD_ERROR;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If check_rc == 1 the database is new and empty as a result. */
|
if (_csync_check_db_integrity(db) != 0) {
|
||||||
if ((check_rc == 1) || _csync_statedb_is_empty(db)) {
|
const char *errmsg= sqlite3_errmsg(db);
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_NOTICE, "statedb doesn't exist");
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_NOTICE, "ERR: sqlite3 integrity check failed - bail out: %s.",
|
||||||
|
errmsg ? errmsg : "<no sqlite3 errormsg>");
|
||||||
|
rc = -1;
|
||||||
|
ctx->status_code = CSYNC_STATUS_STATEDB_CORRUPTED;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_csync_statedb_is_empty(db)) {
|
||||||
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_NOTICE, "statedb contents doesn't exist");
|
||||||
csync_set_statedb_exists(ctx, 0);
|
csync_set_statedb_exists(ctx, 0);
|
||||||
} else {
|
} else {
|
||||||
csync_set_statedb_exists(ctx, 1);
|
csync_set_statedb_exists(ctx, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Print out the version */
|
||||||
|
//
|
||||||
|
result = csync_statedb_query(db, "SELECT sqlite_version();");
|
||||||
|
if (result && result->count >= 1) {
|
||||||
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_NOTICE, "sqlite3 version \"%s\"", *result->vector);
|
||||||
|
}
|
||||||
|
c_strlist_destroy(result);
|
||||||
|
|
||||||
/* optimization for speeding up SQLite */
|
/* optimization for speeding up SQLite */
|
||||||
result = csync_statedb_query(db, "PRAGMA synchronous = FULL;");
|
result = csync_statedb_query(db, "PRAGMA synchronous = NORMAL;");
|
||||||
c_strlist_destroy(result);
|
c_strlist_destroy(result);
|
||||||
result = csync_statedb_query(db, "PRAGMA case_sensitive_like = ON;");
|
result = csync_statedb_query(db, "PRAGMA case_sensitive_like = ON;");
|
||||||
c_strlist_destroy(result);
|
c_strlist_destroy(result);
|
||||||
|
|
||||||
|
/* set a busy handler with 5 seconds timeout */
|
||||||
|
sqlite3_busy_timeout(db, 5000);
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
sqlite3_profile(db, sqlite_profile, 0 );
|
sqlite3_profile(db, sqlite_profile, 0 );
|
||||||
#endif
|
#endif
|
||||||
*pdb = db;
|
*pdb = db;
|
||||||
|
|
||||||
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_NOTICE, "Success");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
out:
|
out:
|
||||||
sqlite3_close(db);
|
sqlite3_close(db);
|
||||||
@@ -263,22 +202,25 @@ int csync_statedb_close(CSYNC *ctx) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* deallocate query resources */
|
/* deallocate query resources */
|
||||||
if( ctx->statedb.by_hash_stmt ) {
|
|
||||||
rc = sqlite3_finalize(ctx->statedb.by_hash_stmt);
|
|
||||||
ctx->statedb.by_hash_stmt = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( ctx->statedb.by_fileid_stmt ) {
|
if( ctx->statedb.by_fileid_stmt ) {
|
||||||
rc = sqlite3_finalize(ctx->statedb.by_fileid_stmt);
|
sqlite3_finalize(ctx->statedb.by_fileid_stmt);
|
||||||
ctx->statedb.by_fileid_stmt = NULL;
|
ctx->statedb.by_fileid_stmt = NULL;
|
||||||
}
|
}
|
||||||
|
if( ctx->statedb.by_hash_stmt ) {
|
||||||
if( ctx->statedb.by_inode_stmt ) {
|
sqlite3_finalize(ctx->statedb.by_hash_stmt);
|
||||||
rc = sqlite3_finalize(ctx->statedb.by_inode_stmt);
|
ctx->statedb.by_hash_stmt = NULL;
|
||||||
|
}
|
||||||
|
if( ctx->statedb.by_inode_stmt) {
|
||||||
|
sqlite3_finalize(ctx->statedb.by_inode_stmt);
|
||||||
ctx->statedb.by_inode_stmt = NULL;
|
ctx->statedb.by_inode_stmt = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
sqlite3_close(ctx->statedb.db);
|
ctx->statedb.lastReturnValue = SQLITE_OK;
|
||||||
|
|
||||||
|
int sr = sqlite3_close(ctx->statedb.db);
|
||||||
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_NOTICE, "sqlite3_close=%d", sr);
|
||||||
|
|
||||||
|
ctx->statedb.db = 0;
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@@ -300,7 +242,7 @@ static int _csync_file_stat_from_metadata_table( csync_file_stat_t **st, sqlite3
|
|||||||
|
|
||||||
column_count = sqlite3_column_count(stmt);
|
column_count = sqlite3_column_count(stmt);
|
||||||
|
|
||||||
rc = sqlite3_step(stmt);
|
SQLITE_BUSY_HANDLED( sqlite3_step(stmt) );
|
||||||
|
|
||||||
if( rc == SQLITE_ROW ) {
|
if( rc == SQLITE_ROW ) {
|
||||||
if(column_count > 7) {
|
if(column_count > 7) {
|
||||||
@@ -309,9 +251,6 @@ static int _csync_file_stat_from_metadata_table( csync_file_stat_t **st, sqlite3
|
|||||||
/* phash, pathlen, path, inode, uid, gid, mode, modtime */
|
/* phash, pathlen, path, inode, uid, gid, mode, modtime */
|
||||||
len = sqlite3_column_int(stmt, 1);
|
len = sqlite3_column_int(stmt, 1);
|
||||||
*st = c_malloc(sizeof(csync_file_stat_t) + len + 1);
|
*st = c_malloc(sizeof(csync_file_stat_t) + len + 1);
|
||||||
if (*st == NULL) {
|
|
||||||
return SQLITE_NOMEM;
|
|
||||||
}
|
|
||||||
/* clear the whole structure */
|
/* clear the whole structure */
|
||||||
ZERO_STRUCTP(*st);
|
ZERO_STRUCTP(*st);
|
||||||
|
|
||||||
@@ -322,8 +261,6 @@ static int _csync_file_stat_from_metadata_table( csync_file_stat_t **st, sqlite3
|
|||||||
name = (const char*) sqlite3_column_text(stmt, 2);
|
name = (const char*) sqlite3_column_text(stmt, 2);
|
||||||
memcpy((*st)->path, (len ? name : ""), len + 1);
|
memcpy((*st)->path, (len ? name : ""), len + 1);
|
||||||
(*st)->inode = sqlite3_column_int64(stmt,3);
|
(*st)->inode = sqlite3_column_int64(stmt,3);
|
||||||
(*st)->uid = sqlite3_column_int(stmt, 4);
|
|
||||||
(*st)->gid = sqlite3_column_int(stmt, 5);
|
|
||||||
(*st)->mode = sqlite3_column_int(stmt, 6);
|
(*st)->mode = sqlite3_column_int(stmt, 6);
|
||||||
(*st)->modtime = strtoul((char*)sqlite3_column_text(stmt, 7), NULL, 10);
|
(*st)->modtime = strtoul((char*)sqlite3_column_text(stmt, 7), NULL, 10);
|
||||||
|
|
||||||
@@ -337,6 +274,18 @@ static int _csync_file_stat_from_metadata_table( csync_file_stat_t **st, sqlite3
|
|||||||
if(column_count > 10 && sqlite3_column_text(stmt,10)) {
|
if(column_count > 10 && sqlite3_column_text(stmt,10)) {
|
||||||
csync_vio_set_file_id((*st)->file_id, (char*) sqlite3_column_text(stmt, 10));
|
csync_vio_set_file_id((*st)->file_id, (char*) sqlite3_column_text(stmt, 10));
|
||||||
}
|
}
|
||||||
|
if(column_count > 11 && sqlite3_column_text(stmt,11)) {
|
||||||
|
strncpy((*st)->remotePerm,
|
||||||
|
(char*) sqlite3_column_text(stmt, 11),
|
||||||
|
REMOTE_PERM_BUF_SIZE);
|
||||||
|
}
|
||||||
|
if(column_count > 12 && sqlite3_column_int64(stmt,12)) {
|
||||||
|
(*st)->size = sqlite3_column_int64(stmt, 12);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if( rc != SQLITE_DONE ) {
|
||||||
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "WARN: Query results in %d", rc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return rc;
|
return rc;
|
||||||
@@ -356,7 +305,8 @@ csync_file_stat_t *csync_statedb_get_stat_by_hash(CSYNC *ctx,
|
|||||||
if( ctx->statedb.by_hash_stmt == NULL ) {
|
if( ctx->statedb.by_hash_stmt == NULL ) {
|
||||||
const char *hash_query = "SELECT * FROM metadata WHERE phash=?1";
|
const char *hash_query = "SELECT * FROM metadata WHERE phash=?1";
|
||||||
|
|
||||||
rc = sqlite3_prepare_v2(ctx->statedb.db, hash_query, strlen(hash_query), &ctx->statedb.by_hash_stmt, NULL);
|
SQLITE_BUSY_HANDLED(sqlite3_prepare_v2(ctx->statedb.db, hash_query, strlen(hash_query), &ctx->statedb.by_hash_stmt, NULL));
|
||||||
|
ctx->statedb.lastReturnValue = rc;
|
||||||
if( rc != SQLITE_OK ) {
|
if( rc != SQLITE_OK ) {
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "WRN: Unable to create stmt for hash query.");
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "WRN: Unable to create stmt for hash query.");
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -369,8 +319,10 @@ csync_file_stat_t *csync_statedb_get_stat_by_hash(CSYNC *ctx,
|
|||||||
|
|
||||||
sqlite3_bind_int64(ctx->statedb.by_hash_stmt, 1, (long long signed int)phash);
|
sqlite3_bind_int64(ctx->statedb.by_hash_stmt, 1, (long long signed int)phash);
|
||||||
|
|
||||||
if( _csync_file_stat_from_metadata_table(&st, ctx->statedb.by_hash_stmt) < 0 ) {
|
rc = _csync_file_stat_from_metadata_table(&st, ctx->statedb.by_hash_stmt);
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "WRN: Could not get line from metadata!");
|
ctx->statedb.lastReturnValue = rc;
|
||||||
|
if( !(rc == SQLITE_ROW || rc == SQLITE_DONE) ) {
|
||||||
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "WRN: Could not get line from metadata: %d!", rc);
|
||||||
}
|
}
|
||||||
sqlite3_reset(ctx->statedb.by_hash_stmt);
|
sqlite3_reset(ctx->statedb.by_hash_stmt);
|
||||||
|
|
||||||
@@ -396,7 +348,8 @@ csync_file_stat_t *csync_statedb_get_stat_by_file_id(CSYNC *ctx,
|
|||||||
if( ctx->statedb.by_fileid_stmt == NULL ) {
|
if( ctx->statedb.by_fileid_stmt == NULL ) {
|
||||||
const char *query = "SELECT * FROM metadata WHERE fileid=?1";
|
const char *query = "SELECT * FROM metadata WHERE fileid=?1";
|
||||||
|
|
||||||
rc = sqlite3_prepare_v2(ctx->statedb.db, query, strlen(query), &ctx->statedb.by_fileid_stmt, NULL);
|
SQLITE_BUSY_HANDLED(sqlite3_prepare_v2(ctx->statedb.db, query, strlen(query), &ctx->statedb.by_fileid_stmt, NULL));
|
||||||
|
ctx->statedb.lastReturnValue = rc;
|
||||||
if( rc != SQLITE_OK ) {
|
if( rc != SQLITE_OK ) {
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "WRN: Unable to create stmt for file id query.");
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "WRN: Unable to create stmt for file id query.");
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -406,8 +359,10 @@ csync_file_stat_t *csync_statedb_get_stat_by_file_id(CSYNC *ctx,
|
|||||||
/* bind the query value */
|
/* bind the query value */
|
||||||
sqlite3_bind_text(ctx->statedb.by_fileid_stmt, 1, file_id, -1, SQLITE_STATIC);
|
sqlite3_bind_text(ctx->statedb.by_fileid_stmt, 1, file_id, -1, SQLITE_STATIC);
|
||||||
|
|
||||||
if( _csync_file_stat_from_metadata_table(&st, ctx->statedb.by_fileid_stmt) < 0 ) {
|
rc = _csync_file_stat_from_metadata_table(&st, ctx->statedb.by_fileid_stmt);
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "WRN: Could not get line from metadata!");
|
ctx->statedb.lastReturnValue = rc;
|
||||||
|
if( !(rc == SQLITE_ROW || rc == SQLITE_DONE) ) {
|
||||||
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "WRN: Could not get line from metadata: %d!", rc);
|
||||||
}
|
}
|
||||||
// clear the resources used by the statement.
|
// clear the resources used by the statement.
|
||||||
sqlite3_reset(ctx->statedb.by_fileid_stmt);
|
sqlite3_reset(ctx->statedb.by_fileid_stmt);
|
||||||
@@ -433,7 +388,8 @@ csync_file_stat_t *csync_statedb_get_stat_by_inode(CSYNC *ctx,
|
|||||||
if( ctx->statedb.by_inode_stmt == NULL ) {
|
if( ctx->statedb.by_inode_stmt == NULL ) {
|
||||||
const char *inode_query = "SELECT * FROM metadata WHERE inode=?1";
|
const char *inode_query = "SELECT * FROM metadata WHERE inode=?1";
|
||||||
|
|
||||||
rc = sqlite3_prepare_v2(ctx->statedb.db, inode_query, strlen(inode_query), &ctx->statedb.by_inode_stmt, NULL);
|
SQLITE_BUSY_HANDLED(sqlite3_prepare_v2(ctx->statedb.db, inode_query, strlen(inode_query), &ctx->statedb.by_inode_stmt, NULL));
|
||||||
|
ctx->statedb.lastReturnValue = rc;
|
||||||
if( rc != SQLITE_OK ) {
|
if( rc != SQLITE_OK ) {
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "WRN: Unable to create stmt for inode query.");
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "WRN: Unable to create stmt for inode query.");
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -446,8 +402,10 @@ csync_file_stat_t *csync_statedb_get_stat_by_inode(CSYNC *ctx,
|
|||||||
|
|
||||||
sqlite3_bind_int64(ctx->statedb.by_inode_stmt, 1, (long long signed int)inode);
|
sqlite3_bind_int64(ctx->statedb.by_inode_stmt, 1, (long long signed int)inode);
|
||||||
|
|
||||||
if( _csync_file_stat_from_metadata_table(&st, ctx->statedb.by_inode_stmt) < 0 ) {
|
rc = _csync_file_stat_from_metadata_table(&st, ctx->statedb.by_inode_stmt);
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "WRN: Could not get line from metadata by inode!");
|
ctx->statedb.lastReturnValue = rc;
|
||||||
|
if( !(rc == SQLITE_ROW || rc == SQLITE_DONE) ) {
|
||||||
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "WRN: Could not get line from metadata by inode: %d!", rc);
|
||||||
}
|
}
|
||||||
sqlite3_reset(ctx->statedb.by_inode_stmt);
|
sqlite3_reset(ctx->statedb.by_inode_stmt);
|
||||||
|
|
||||||
@@ -476,7 +434,7 @@ char *csync_statedb_get_etag( CSYNC *ctx, uint64_t jHash ) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define BELOW_PATH_QUERY "SELECT phash, pathlen, path, inode, uid, gid, mode, modtime, type, md5, fileid FROM metadata WHERE path LIKE(?)"
|
#define BELOW_PATH_QUERY "SELECT phash, pathlen, path, inode, uid, gid, mode, modtime, type, md5, fileid, remotePerm, filesize FROM metadata WHERE pathlen>? AND path LIKE(?)"
|
||||||
|
|
||||||
int csync_statedb_get_below_path( CSYNC *ctx, const char *path ) {
|
int csync_statedb_get_below_path( CSYNC *ctx, const char *path ) {
|
||||||
int rc;
|
int rc;
|
||||||
@@ -484,6 +442,7 @@ int csync_statedb_get_below_path( CSYNC *ctx, const char *path ) {
|
|||||||
int64_t cnt = 0;
|
int64_t cnt = 0;
|
||||||
char *likepath;
|
char *likepath;
|
||||||
int asp;
|
int asp;
|
||||||
|
int min_path_len;
|
||||||
|
|
||||||
if( !path ) {
|
if( !path ) {
|
||||||
return -1;
|
return -1;
|
||||||
@@ -493,9 +452,10 @@ int csync_statedb_get_below_path( CSYNC *ctx, const char *path ) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = sqlite3_prepare_v2(ctx->statedb.db, BELOW_PATH_QUERY, -1, &stmt, NULL);
|
SQLITE_BUSY_HANDLED(sqlite3_prepare_v2(ctx->statedb.db, BELOW_PATH_QUERY, -1, &stmt, NULL));
|
||||||
|
ctx->statedb.lastReturnValue = rc;
|
||||||
if( rc != SQLITE_OK ) {
|
if( rc != SQLITE_OK ) {
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "WRN: Unable to create stmt for hash query.");
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "WRN: Unable to create stmt for below path query.");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -509,10 +469,13 @@ int csync_statedb_get_below_path( CSYNC *ctx, const char *path ) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
sqlite3_bind_text(stmt, 1, likepath, -1, SQLITE_STATIC);
|
min_path_len = strlen(path);
|
||||||
|
sqlite3_bind_int(stmt, 1, min_path_len);
|
||||||
|
sqlite3_bind_text(stmt, 2, likepath, -1, SQLITE_STATIC);
|
||||||
|
|
||||||
cnt = 0;
|
cnt = 0;
|
||||||
|
|
||||||
|
ctx->statedb.lastReturnValue = rc;
|
||||||
do {
|
do {
|
||||||
csync_file_stat_t *st = NULL;
|
csync_file_stat_t *st = NULL;
|
||||||
|
|
||||||
@@ -528,6 +491,7 @@ int csync_statedb_get_below_path( CSYNC *ctx, const char *path ) {
|
|||||||
}
|
}
|
||||||
} while( rc == SQLITE_ROW );
|
} while( rc == SQLITE_ROW );
|
||||||
|
|
||||||
|
ctx->statedb.lastReturnValue = rc;
|
||||||
if( rc != SQLITE_DONE ) {
|
if( rc != SQLITE_DONE ) {
|
||||||
ctx->status_code = CSYNC_STATUS_TREE_ERROR;
|
ctx->status_code = CSYNC_STATUS_TREE_ERROR;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -98,27 +98,6 @@ int csync_statedb_get_below_path(CSYNC *ctx, const char *path);
|
|||||||
*/
|
*/
|
||||||
c_strlist_t *csync_statedb_query(sqlite3 *db, const char *statement);
|
c_strlist_t *csync_statedb_query(sqlite3 *db, const char *statement);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Insert function for the statedb.
|
|
||||||
*
|
|
||||||
* @param ctx The csync context.
|
|
||||||
* @param statement The SQL statement to insert into the statedb.
|
|
||||||
*
|
|
||||||
* @return The rowid of the most recent INSERT on success, 0 if the query
|
|
||||||
* wasn't successful.
|
|
||||||
*/
|
|
||||||
typedef struct csync_progressinfo_s {
|
|
||||||
struct csync_progressinfo_s *next;
|
|
||||||
uint64_t phash;
|
|
||||||
uint64_t modtime;
|
|
||||||
char *md5;
|
|
||||||
int error;
|
|
||||||
int chunk;
|
|
||||||
int transferId;
|
|
||||||
char *tmpfile;
|
|
||||||
char *error_string;
|
|
||||||
} csync_progressinfo_t;
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -29,6 +29,8 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
#include "c_lib.h"
|
#include "c_lib.h"
|
||||||
#include "c_jhash.h"
|
#include "c_jhash.h"
|
||||||
@@ -100,6 +102,27 @@ static bool _csync_sameextension(const char *p1, const char *p2) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static bool _last_db_return_error(CSYNC* ctx) {
|
||||||
|
return ctx->statedb.lastReturnValue != SQLITE_OK && ctx->statedb.lastReturnValue != SQLITE_DONE && ctx->statedb.lastReturnValue != SQLITE_ROW;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Return true if two mtime are considered equal
|
||||||
|
* We consider mtime that are one hour difference to be equal if they are one hour appart
|
||||||
|
* because on some system (FAT) the date is changing when the daylight saving is changing */
|
||||||
|
static bool _csync_mtime_equal(time_t a, time_t b)
|
||||||
|
{
|
||||||
|
if (a == b)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
/* 1h of difference +- 1 second because the accuracy of FAT is 2 seconds (#2438) */
|
||||||
|
if (fabs(3600 - fabs(difftime(a, b))) < 2)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int _csync_detect_update(CSYNC *ctx, const char *file,
|
static int _csync_detect_update(CSYNC *ctx, const char *file,
|
||||||
const csync_vio_file_stat_t *fs, const int type) {
|
const csync_vio_file_stat_t *fs, const int type) {
|
||||||
uint64_t h = 0;
|
uint64_t h = 0;
|
||||||
@@ -140,27 +163,35 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
|
|||||||
|
|
||||||
len = strlen(path);
|
len = strlen(path);
|
||||||
|
|
||||||
|
/* This code should probably be in csync_exclude, but it does not have the fs parameter.
|
||||||
|
Keep it here for now and TODO also find out if we want this for Windows
|
||||||
|
https://github.com/owncloud/mirall/issues/2086 */
|
||||||
|
if (fs->flags & CSYNC_VIO_FILE_FLAGS_HIDDEN) {
|
||||||
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file excluded because it is a hidden file: %s", path);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Check if file is excluded */
|
/* Check if file is excluded */
|
||||||
excluded = csync_excluded(ctx, path,type);
|
excluded = csync_excluded(ctx, path,type);
|
||||||
|
|
||||||
if (excluded != CSYNC_NOT_EXCLUDED) {
|
if (excluded != CSYNC_NOT_EXCLUDED) {
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "%s excluded (%d)", path, excluded);
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "%s excluded (%d)", path, excluded);
|
||||||
if (excluded == CSYNC_FILE_EXCLUDE_AND_REMOVE) {
|
if (excluded == CSYNC_FILE_EXCLUDE_AND_REMOVE) {
|
||||||
switch (ctx->current) {
|
return 1;
|
||||||
case LOCAL_REPLICA:
|
|
||||||
ctx->local.ignored_cleanup = c_list_append(ctx->local.ignored_cleanup, c_strdup(path));
|
|
||||||
break;
|
|
||||||
case REMOTE_REPLICA:
|
|
||||||
ctx->remote.ignored_cleanup = c_list_append(ctx->remote.ignored_cleanup, c_strdup(path));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
if (excluded == CSYNC_FILE_SILENTLY_EXCLUDED) {
|
if (excluded == CSYNC_FILE_SILENTLY_EXCLUDED) {
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ctx->current_fs) {
|
||||||
|
ctx->current_fs->has_ignored_files = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ctx->current == REMOTE_REPLICA && ctx->checkSelectiveSyncBlackListHook) {
|
||||||
|
if (ctx->checkSelectiveSyncBlackListHook(ctx->checkSelectiveSyncBlackListData, path)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
h = _hash_of_file(ctx, file );
|
h = _hash_of_file(ctx, file );
|
||||||
@@ -170,26 +201,31 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
|
|||||||
size = sizeof(csync_file_stat_t) + len + 1;
|
size = sizeof(csync_file_stat_t) + len + 1;
|
||||||
|
|
||||||
st = c_malloc(size);
|
st = c_malloc(size);
|
||||||
if (st == NULL) {
|
|
||||||
ctx->status_code = CSYNC_STATUS_MEMORY_ERROR;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set instruction by default to none */
|
/* Set instruction by default to none */
|
||||||
st->instruction = CSYNC_INSTRUCTION_NONE;
|
st->instruction = CSYNC_INSTRUCTION_NONE;
|
||||||
st->etag = NULL;
|
st->etag = NULL;
|
||||||
st->child_modified = 0;
|
st->child_modified = 0;
|
||||||
|
st->has_ignored_files = 0;
|
||||||
|
|
||||||
/* check hardlink count */
|
/* check hardlink count */
|
||||||
if (type == CSYNC_FTW_TYPE_FILE ) {
|
if (type == CSYNC_FTW_TYPE_FILE ) {
|
||||||
if( fs->nlink > 1) {
|
if( fs->nlink > 1) {
|
||||||
st->instruction = CSYNC_INSTRUCTION_IGNORE;
|
st->instruction = CSYNC_INSTRUCTION_IGNORE;
|
||||||
|
st->error_status = CSYNC_STATUS_INDIVIDUAL_IS_HARDLINK;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fs->mtime == 0) {
|
if (fs->mtime == 0) {
|
||||||
tmp = csync_statedb_get_stat_by_hash(ctx, h);
|
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s - mtime is zero!", path);
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s - mtime is zero!", path);
|
||||||
|
|
||||||
|
tmp = csync_statedb_get_stat_by_hash(ctx, h);
|
||||||
|
if(_last_db_return_error(ctx)) {
|
||||||
|
SAFE_FREE(st);
|
||||||
|
ctx->status_code = CSYNC_STATUS_UNSUCCESSFUL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (tmp == NULL) {
|
if (tmp == NULL) {
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s - not found in db, IGNORE!", path);
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s - not found in db, IGNORE!", path);
|
||||||
st->instruction = CSYNC_INSTRUCTION_IGNORE;
|
st->instruction = CSYNC_INSTRUCTION_IGNORE;
|
||||||
@@ -226,16 +262,28 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
|
|||||||
if (csync_get_statedb_exists(ctx)) {
|
if (csync_get_statedb_exists(ctx)) {
|
||||||
tmp = csync_statedb_get_stat_by_hash(ctx, h);
|
tmp = csync_statedb_get_stat_by_hash(ctx, h);
|
||||||
|
|
||||||
|
if(_last_db_return_error(ctx)) {
|
||||||
|
SAFE_FREE(st);
|
||||||
|
ctx->status_code = CSYNC_STATUS_UNSUCCESSFUL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if(tmp && tmp->phash == h ) { /* there is an entry in the database */
|
if(tmp && tmp->phash == h ) { /* there is an entry in the database */
|
||||||
/* we have an update! */
|
/* we have an update! */
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Database entry found, compare: %" PRId64 " <-> %" PRId64 ", etag: %s <-> %s, inode: %" PRId64 " <-> %" PRId64,
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Database entry found, compare: %" PRId64 " <-> %" PRId64
|
||||||
((int64_t) fs->mtime), ((int64_t) tmp->modtime), fs->etag, tmp->etag, (uint64_t) fs->inode, (uint64_t) tmp->inode);
|
", etag: %s <-> %s, inode: %" PRId64 " <-> %" PRId64
|
||||||
|
", size: %" PRId64 " <-> %" PRId64 ", perms: %s <-> %s",
|
||||||
|
((int64_t) fs->mtime), ((int64_t) tmp->modtime),
|
||||||
|
fs->etag, tmp->etag, (uint64_t) fs->inode, (uint64_t) tmp->inode,
|
||||||
|
(uint64_t) fs->size, (uint64_t) tmp->size, fs->remotePerm, tmp->remotePerm );
|
||||||
if( !fs->etag) {
|
if( !fs->etag) {
|
||||||
st->instruction = CSYNC_INSTRUCTION_EVAL;
|
st->instruction = CSYNC_INSTRUCTION_EVAL;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
if((ctx->current == REMOTE_REPLICA && !c_streq(fs->etag, tmp->etag ))
|
if((ctx->current == REMOTE_REPLICA && !c_streq(fs->etag, tmp->etag ))
|
||||||
|| (ctx->current == LOCAL_REPLICA && (fs->mtime != tmp->modtime
|
|| (ctx->current == LOCAL_REPLICA && (!_csync_mtime_equal(fs->mtime, tmp->modtime)
|
||||||
|
// zero size in statedb can happen during migration
|
||||||
|
|| (tmp->size != 0 && fs->size != tmp->size)
|
||||||
#if 0
|
#if 0
|
||||||
|| fs->inode != tmp->inode
|
|| fs->inode != tmp->inode
|
||||||
#endif
|
#endif
|
||||||
@@ -254,20 +302,22 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
|
|||||||
st->instruction = CSYNC_INSTRUCTION_EVAL;
|
st->instruction = CSYNC_INSTRUCTION_EVAL;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
bool metadata_differ = (ctx->current == REMOTE_REPLICA && (!c_streq(fs->file_id, tmp->file_id)
|
||||||
|
|| !c_streq(fs->remotePerm, tmp->remotePerm)))
|
||||||
|
|| (ctx->current == LOCAL_REPLICA && fs->inode != tmp->inode);
|
||||||
if (type == CSYNC_FTW_TYPE_DIR && ctx->current == REMOTE_REPLICA
|
if (type == CSYNC_FTW_TYPE_DIR && ctx->current == REMOTE_REPLICA
|
||||||
&& c_streq(fs->file_id, tmp->file_id) && !ctx->read_from_db_disabled) {
|
&& !metadata_differ && !ctx->read_from_db_disabled) {
|
||||||
/* If both etag and file id are equal for a directory, read all contents from
|
/* If both etag and file id are equal for a directory, read all contents from
|
||||||
* the database.
|
* the database.
|
||||||
* The comparison of file id ensure that we fetch all the file id when upgrading from
|
* The metadata comparison ensure that we fetch all the file id or permission when
|
||||||
* owncloud 5 to owncloud 6.
|
* upgrading owncloud
|
||||||
*/
|
*/
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Reading from database: %s", path);
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Reading from database: %s", path);
|
||||||
ctx->remote.read_from_db = true;
|
ctx->remote.read_from_db = true;
|
||||||
}
|
}
|
||||||
|
if (metadata_differ) {
|
||||||
if (!c_streq(fs->file_id, tmp->file_id) && ctx->current == REMOTE_REPLICA) {
|
/* file id or permissions has changed. Which means we need to update them in the DB. */
|
||||||
/* file id has changed. Which means we need to update the DB.
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Need to update metadata for: %s", path);
|
||||||
* (upgrade from owncloud 5 to owncloud 6 for instence) */
|
|
||||||
st->should_update_etag = true;
|
st->should_update_etag = true;
|
||||||
}
|
}
|
||||||
st->instruction = CSYNC_INSTRUCTION_NONE;
|
st->instruction = CSYNC_INSTRUCTION_NONE;
|
||||||
@@ -283,6 +333,12 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
|
|||||||
|
|
||||||
tmp = csync_statedb_get_stat_by_inode(ctx, fs->inode);
|
tmp = csync_statedb_get_stat_by_inode(ctx, fs->inode);
|
||||||
|
|
||||||
|
if(_last_db_return_error(ctx)) {
|
||||||
|
SAFE_FREE(st);
|
||||||
|
ctx->status_code = CSYNC_STATUS_UNSUCCESSFUL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/* translate the file type between the two stat types csync has. */
|
/* translate the file type between the two stat types csync has. */
|
||||||
if( tmp && tmp->type == 0 ) {
|
if( tmp && tmp->type == 0 ) {
|
||||||
tmp_vio_type = CSYNC_VIO_FILE_TYPE_REGULAR;
|
tmp_vio_type = CSYNC_VIO_FILE_TYPE_REGULAR;
|
||||||
@@ -313,6 +369,12 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
|
|||||||
} else {
|
} else {
|
||||||
/* Remote Replica Rename check */
|
/* Remote Replica Rename check */
|
||||||
tmp = csync_statedb_get_stat_by_file_id(ctx, fs->file_id);
|
tmp = csync_statedb_get_stat_by_file_id(ctx, fs->file_id);
|
||||||
|
|
||||||
|
if(_last_db_return_error(ctx)) {
|
||||||
|
SAFE_FREE(st);
|
||||||
|
ctx->status_code = CSYNC_STATUS_UNSUCCESSFUL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
if(tmp ) { /* tmp existing at all */
|
if(tmp ) { /* tmp existing at all */
|
||||||
if ((tmp->type == CSYNC_FTW_TYPE_DIR && fs->type != CSYNC_VIO_FILE_TYPE_DIRECTORY) ||
|
if ((tmp->type == CSYNC_FTW_TYPE_DIR && fs->type != CSYNC_VIO_FILE_TYPE_DIRECTORY) ||
|
||||||
(tmp->type == CSYNC_FTW_TYPE_FILE && fs->type != CSYNC_VIO_FILE_TYPE_REGULAR)) {
|
(tmp->type == CSYNC_FTW_TYPE_FILE && fs->type != CSYNC_VIO_FILE_TYPE_REGULAR)) {
|
||||||
@@ -320,6 +382,7 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
|
|||||||
st->instruction = CSYNC_INSTRUCTION_NEW;
|
st->instruction = CSYNC_INSTRUCTION_NEW;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "remote rename detected based on fileid %s %s", tmp->path, file);
|
||||||
st->instruction = CSYNC_INSTRUCTION_EVAL_RENAME;
|
st->instruction = CSYNC_INSTRUCTION_EVAL_RENAME;
|
||||||
if (fs->type == CSYNC_VIO_FILE_TYPE_DIRECTORY) {
|
if (fs->type == CSYNC_VIO_FILE_TYPE_DIRECTORY) {
|
||||||
csync_rename_record(ctx, tmp->path, path);
|
csync_rename_record(ctx, tmp->path, path);
|
||||||
@@ -340,7 +403,9 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
st->instruction = CSYNC_INSTRUCTION_NEW;
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Unable to open statedb" );
|
||||||
|
ctx->status_code = CSYNC_STATUS_UNSUCCESSFUL;
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
@@ -364,8 +429,6 @@ out:
|
|||||||
st->mode = fs->mode;
|
st->mode = fs->mode;
|
||||||
st->size = fs->size;
|
st->size = fs->size;
|
||||||
st->modtime = fs->mtime;
|
st->modtime = fs->mtime;
|
||||||
st->uid = fs->uid;
|
|
||||||
st->gid = fs->gid;
|
|
||||||
st->nlink = fs->nlink;
|
st->nlink = fs->nlink;
|
||||||
st->type = type;
|
st->type = type;
|
||||||
st->etag = NULL;
|
st->etag = NULL;
|
||||||
@@ -374,6 +437,17 @@ out:
|
|||||||
st->etag = c_strdup(fs->etag);
|
st->etag = c_strdup(fs->etag);
|
||||||
}
|
}
|
||||||
csync_vio_set_file_id(st->file_id, fs->file_id);
|
csync_vio_set_file_id(st->file_id, fs->file_id);
|
||||||
|
if (fs->fields & CSYNC_VIO_FILE_STAT_FIELDS_DIRECTDOWNLOADURL) {
|
||||||
|
SAFE_FREE(st->directDownloadUrl);
|
||||||
|
st->directDownloadUrl = c_strdup(fs->directDownloadUrl);
|
||||||
|
}
|
||||||
|
if (fs->fields & CSYNC_VIO_FILE_STAT_FIELDS_DIRECTDOWNLOADCOOKIES) {
|
||||||
|
SAFE_FREE(st->directDownloadCookies);
|
||||||
|
st->directDownloadCookies = c_strdup(fs->directDownloadCookies);
|
||||||
|
}
|
||||||
|
if (fs->fields & CSYNC_VIO_FILE_STAT_FIELDS_PERM) {
|
||||||
|
strncpy(st->remotePerm, fs->remotePerm, REMOTE_PERM_BUF_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
fastout: /* target if the file information is read from database into st */
|
fastout: /* target if the file information is read from database into st */
|
||||||
st->phash = h;
|
st->phash = h;
|
||||||
@@ -419,11 +493,19 @@ int csync_walker(CSYNC *ctx, const char *file, const csync_vio_file_stat_t *fs,
|
|||||||
|
|
||||||
switch (flag) {
|
switch (flag) {
|
||||||
case CSYNC_FTW_FLAG_FILE:
|
case CSYNC_FTW_FLAG_FILE:
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s [file_id=%s]", file, fs->file_id);
|
if (ctx->current == REMOTE_REPLICA) {
|
||||||
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s [file_id=%s size=%" PRIu64 "]", file, fs->file_id, fs->size);
|
||||||
|
} else {
|
||||||
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s [inode=%" PRIu64 " size=%" PRIu64 "]", file, fs->inode, fs->size);
|
||||||
|
}
|
||||||
type = CSYNC_FTW_TYPE_FILE;
|
type = CSYNC_FTW_TYPE_FILE;
|
||||||
break;
|
break;
|
||||||
case CSYNC_FTW_FLAG_DIR: /* enter directory */
|
case CSYNC_FTW_FLAG_DIR: /* enter directory */
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "directory: %s [file_id=%s]", file, fs->file_id);
|
if (ctx->current == REMOTE_REPLICA) {
|
||||||
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "directory: %s [file_id=%s]", file, fs->file_id);
|
||||||
|
} else {
|
||||||
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "directory: %s [inode=%" PRIu64 "]", file, fs->inode);
|
||||||
|
}
|
||||||
type = CSYNC_FTW_TYPE_DIR;
|
type = CSYNC_FTW_TYPE_DIR;
|
||||||
break;
|
break;
|
||||||
case CSYNC_FTW_FLAG_NSTAT: /* not statable file */
|
case CSYNC_FTW_FLAG_NSTAT: /* not statable file */
|
||||||
@@ -512,7 +594,21 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((dh = csync_vio_opendir(ctx, uri)) == NULL) {
|
const char *uri_for_vio = uri;
|
||||||
|
if (ctx->current == REMOTE_REPLICA) {
|
||||||
|
uri_for_vio += strlen(ctx->remote.uri);
|
||||||
|
if (strlen(uri_for_vio) > 0 && uri_for_vio[0] == '/') {
|
||||||
|
uri_for_vio++; // cut leading slash
|
||||||
|
}
|
||||||
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "URI without fuzz for %s is \"%s\"", uri, uri_for_vio);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((dh = csync_vio_opendir(ctx, uri_for_vio)) == NULL) {
|
||||||
|
if (ctx->abort) {
|
||||||
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Aborted!");
|
||||||
|
ctx->status_code = CSYNC_STATUS_ABORTED;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
int asp = 0;
|
int asp = 0;
|
||||||
/* permission denied */
|
/* permission denied */
|
||||||
ctx->status_code = csync_errno_to_status(errno, CSYNC_STATUS_OPENDIR_ERROR);
|
ctx->status_code = csync_errno_to_status(errno, CSYNC_STATUS_OPENDIR_ERROR);
|
||||||
@@ -523,6 +619,17 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
|
|||||||
if (asp < 0) {
|
if (asp < 0) {
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "asprintf failed!");
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "asprintf failed!");
|
||||||
}
|
}
|
||||||
|
} else if(errno == ERRNO_SERVICE_UNAVAILABLE) {
|
||||||
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_WARN, "Service was not available!");
|
||||||
|
if (ctx->current_fs) {
|
||||||
|
ctx->current_fs->instruction = CSYNC_INSTRUCTION_IGNORE;
|
||||||
|
ctx->current_fs->error_status = CSYNC_STATUS_SERVICE_UNAVAILABLE;
|
||||||
|
/* If a directory has ignored files, put the flag on the parent directory as well */
|
||||||
|
if( previous_fs ) {
|
||||||
|
previous_fs->has_ignored_files = true;
|
||||||
|
}
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "opendir failed for %s - errno %d", uri, errno);
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "opendir failed for %s - errno %d", uri, errno);
|
||||||
}
|
}
|
||||||
@@ -579,19 +686,28 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
|
|||||||
path = filename + ulen;
|
path = filename + ulen;
|
||||||
|
|
||||||
/* skip ".csync_journal.db" and ".csync_journal.db.ctmp" */
|
/* skip ".csync_journal.db" and ".csync_journal.db.ctmp" */
|
||||||
|
/* Isn't this done via csync_exclude already? */
|
||||||
if (c_streq(path, ".csync_journal.db")
|
if (c_streq(path, ".csync_journal.db")
|
||||||
|| c_streq(path, ".csync_journal.db.ctmp")
|
|| c_streq(path, ".csync_journal.db.ctmp")
|
||||||
|| c_streq(path, ".csync_journal.db.ctmp-journal")
|
|| c_streq(path, ".csync_journal.db.ctmp-journal")
|
||||||
|| c_streq(path, ".csync-progressdatabase")) {
|
|| c_streq(path, ".csync-progressdatabase")
|
||||||
|
|| c_streq(path, ".csync_journal.db-shm")
|
||||||
|
|| c_streq(path, ".csync_journal.db-wal")
|
||||||
|
|| c_streq(path, ".csync_journal.db-journal")) {
|
||||||
csync_vio_file_stat_destroy(dirent);
|
csync_vio_file_stat_destroy(dirent);
|
||||||
dirent = NULL;
|
dirent = NULL;
|
||||||
SAFE_FREE(filename);
|
SAFE_FREE(filename);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* == see if really stat has to be called. */
|
/* Only for the local replica we have to stat(), for the remote one we have all data already */
|
||||||
fs = csync_vio_file_stat_new();
|
if (ctx->replica == LOCAL_REPLICA) {
|
||||||
res = csync_vio_stat(ctx, filename, fs);
|
fs = csync_vio_file_stat_new();
|
||||||
|
res = csync_vio_stat(ctx, filename, fs);
|
||||||
|
} else {
|
||||||
|
fs = dirent;
|
||||||
|
res = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if( res == 0) {
|
if( res == 0) {
|
||||||
switch (fs->type) {
|
switch (fs->type) {
|
||||||
@@ -623,6 +739,11 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
|
|||||||
uint64_t h = c_jhash64((uint8_t *) path, len, 0);
|
uint64_t h = c_jhash64((uint8_t *) path, len, 0);
|
||||||
etag = csync_statedb_get_etag( ctx, h );
|
etag = csync_statedb_get_etag( ctx, h );
|
||||||
|
|
||||||
|
if(_last_db_return_error(ctx)) {
|
||||||
|
ctx->status_code = CSYNC_STATUS_UNSUCCESSFUL;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
if( etag ) {
|
if( etag ) {
|
||||||
SAFE_FREE(fs->etag);
|
SAFE_FREE(fs->etag);
|
||||||
fs->etag = etag;
|
fs->etag = etag;
|
||||||
@@ -642,12 +763,11 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
|
|||||||
rc = fn(ctx, filename, fs, flag);
|
rc = fn(ctx, filename, fs, flag);
|
||||||
/* this function may update ctx->current and ctx->read_from_db */
|
/* this function may update ctx->current and ctx->read_from_db */
|
||||||
|
|
||||||
if (ctx->current_fs && previous_fs && ctx->current_fs->child_modified) {
|
/* Only for the local replica we have to destroy stat(), for the remote one it is a pointer to dirent */
|
||||||
previous_fs->child_modified = ctx->current_fs->child_modified;
|
if (ctx->replica == LOCAL_REPLICA) {
|
||||||
|
csync_vio_file_stat_destroy(fs);
|
||||||
}
|
}
|
||||||
|
|
||||||
csync_vio_file_stat_destroy(fs);
|
|
||||||
|
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
if (CSYNC_STATUS_IS_OK(ctx->status_code)) {
|
if (CSYNC_STATUS_IS_OK(ctx->status_code)) {
|
||||||
ctx->status_code = CSYNC_STATUS_UPDATE_ERROR;
|
ctx->status_code = CSYNC_STATUS_UPDATE_ERROR;
|
||||||
@@ -657,7 +777,7 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flag == CSYNC_FTW_FLAG_DIR && depth
|
if (flag == CSYNC_FTW_FLAG_DIR && depth && rc == 0
|
||||||
&& (!ctx->current_fs || ctx->current_fs->instruction != CSYNC_INSTRUCTION_IGNORE)) {
|
&& (!ctx->current_fs || ctx->current_fs->instruction != CSYNC_INSTRUCTION_IGNORE)) {
|
||||||
rc = csync_ftw(ctx, filename, fn, depth - 1);
|
rc = csync_ftw(ctx, filename, fn, depth - 1);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
@@ -668,14 +788,25 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
|
|||||||
if (ctx->current_fs && !ctx->current_fs->child_modified
|
if (ctx->current_fs && !ctx->current_fs->child_modified
|
||||||
&& ctx->current_fs->instruction == CSYNC_INSTRUCTION_EVAL) {
|
&& ctx->current_fs->instruction == CSYNC_INSTRUCTION_EVAL) {
|
||||||
ctx->current_fs->instruction = CSYNC_INSTRUCTION_NONE;
|
ctx->current_fs->instruction = CSYNC_INSTRUCTION_NONE;
|
||||||
ctx->current_fs->should_update_etag = true;
|
if (ctx->current == REMOTE_REPLICA) {
|
||||||
|
ctx->current_fs->should_update_etag = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ctx->current_fs && previous_fs && ctx->current_fs->has_ignored_files) {
|
||||||
|
/* If a directory has ignored files, put the flag on the parent directory as well */
|
||||||
|
previous_fs->has_ignored_files = ctx->current_fs->has_ignored_files;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ctx->current_fs && previous_fs && ctx->current_fs->child_modified) {
|
||||||
|
/* If a directory has modified files, put the flag on the parent directory as well */
|
||||||
|
previous_fs->child_modified = ctx->current_fs->child_modified;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flag == CSYNC_FTW_FLAG_DIR && ctx->current_fs
|
if (flag == CSYNC_FTW_FLAG_DIR && ctx->current_fs
|
||||||
&& (ctx->current_fs->instruction == CSYNC_INSTRUCTION_EVAL ||
|
&& (ctx->current_fs->instruction == CSYNC_INSTRUCTION_EVAL ||
|
||||||
ctx->current_fs->instruction == CSYNC_INSTRUCTION_NEW ||
|
ctx->current_fs->instruction == CSYNC_INSTRUCTION_NEW)) {
|
||||||
ctx->current_fs->instruction == CSYNC_INSTRUCTION_EVAL_RENAME)) {
|
|
||||||
ctx->current_fs->should_update_etag = true;
|
ctx->current_fs->should_update_etag = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#define _CSYNC_UPDATE_H
|
#define _CSYNC_UPDATE_H
|
||||||
|
|
||||||
#include "csync.h"
|
#include "csync.h"
|
||||||
#include "vio/csync_vio_file_stat.h"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file csync_update.h
|
* @file csync_update.h
|
||||||
|
|||||||
@@ -128,59 +128,6 @@ void csync_win32_set_file_hidden( const char *file, bool h ) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
csync_vio_file_stat_t *csync_vio_convert_file_stat(csync_file_stat_t *st) {
|
|
||||||
csync_vio_file_stat_t *vfs = NULL;
|
|
||||||
|
|
||||||
if (st == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
vfs = csync_vio_file_stat_new();
|
|
||||||
if (vfs == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
vfs->acl = NULL;
|
|
||||||
if (st->pathlen > 0) {
|
|
||||||
vfs->name = c_strdup(st->path);
|
|
||||||
}
|
|
||||||
vfs->uid = st->uid;
|
|
||||||
vfs->gid = st->gid;
|
|
||||||
|
|
||||||
vfs->atime = 0;
|
|
||||||
vfs->mtime = st->modtime;
|
|
||||||
vfs->ctime = 0;
|
|
||||||
|
|
||||||
vfs->size = st->size;
|
|
||||||
vfs->blksize = 0; /* Depricated. */
|
|
||||||
vfs->blkcount = 0;
|
|
||||||
|
|
||||||
vfs->mode = st->mode;
|
|
||||||
vfs->device = 0;
|
|
||||||
vfs->inode = st->inode;
|
|
||||||
vfs->nlink = st->nlink;
|
|
||||||
|
|
||||||
/* fields. */
|
|
||||||
vfs->fields = CSYNC_VIO_FILE_STAT_FIELDS_TYPE
|
|
||||||
+ CSYNC_VIO_FILE_STAT_FIELDS_PERMISSIONS
|
|
||||||
+ CSYNC_VIO_FILE_STAT_FIELDS_INODE
|
|
||||||
+ CSYNC_VIO_FILE_STAT_FIELDS_LINK_COUNT
|
|
||||||
+ CSYNC_VIO_FILE_STAT_FIELDS_SIZE
|
|
||||||
+ CSYNC_VIO_FILE_STAT_FIELDS_MTIME
|
|
||||||
+ CSYNC_VIO_FILE_STAT_FIELDS_UID
|
|
||||||
+ CSYNC_VIO_FILE_STAT_FIELDS_GID;
|
|
||||||
|
|
||||||
if (st->type == CSYNC_FTW_TYPE_DIR)
|
|
||||||
vfs->type = CSYNC_VIO_FILE_TYPE_DIRECTORY;
|
|
||||||
else if (st->type == CSYNC_FTW_TYPE_FILE)
|
|
||||||
vfs->type = CSYNC_VIO_FILE_TYPE_REGULAR;
|
|
||||||
else if (st->type == CSYNC_FTW_TYPE_SLINK)
|
|
||||||
vfs->type = CSYNC_VIO_FILE_TYPE_SYMBOLIC_LINK;
|
|
||||||
else
|
|
||||||
vfs->type = CSYNC_VIO_FILE_TYPE_UNKNOWN;
|
|
||||||
|
|
||||||
return vfs;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool (*csync_file_locked_or_open_ext) (const char*) = 0; // filled in by library user
|
bool (*csync_file_locked_or_open_ext) (const char*) = 0; // filled in by library user
|
||||||
void set_csync_file_locked_or_open_ext(bool (*f) (const char*));
|
void set_csync_file_locked_or_open_ext(bool (*f) (const char*));
|
||||||
void set_csync_file_locked_or_open_ext(bool (*f) (const char*)) {
|
void set_csync_file_locked_or_open_ext(bool (*f) (const char*)) {
|
||||||
@@ -193,9 +140,96 @@ bool csync_file_locked_or_open( const char *dir, const char *fname) {
|
|||||||
if (!csync_file_locked_or_open_ext) {
|
if (!csync_file_locked_or_open_ext) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
asprintf(&tmp_uri, "%s/%s", dir, fname);
|
if (asprintf(&tmp_uri, "%s/%s", dir, fname) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "csync_file_locked_or_open %s", tmp_uri);
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "csync_file_locked_or_open %s", tmp_uri);
|
||||||
ret = csync_file_locked_or_open_ext(tmp_uri);
|
ret = csync_file_locked_or_open_ext(tmp_uri);
|
||||||
SAFE_FREE(tmp_uri);
|
SAFE_FREE(tmp_uri);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef HAVE_TIMEGM
|
||||||
|
#ifdef _WIN32
|
||||||
|
static int is_leap(unsigned y) {
|
||||||
|
y += 1900;
|
||||||
|
return (y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static time_t timegm(struct tm *tm) {
|
||||||
|
static const unsigned ndays[2][12] = {
|
||||||
|
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
|
||||||
|
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} };
|
||||||
|
|
||||||
|
time_t res = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 70; i < tm->tm_year; ++i)
|
||||||
|
res += is_leap(i) ? 366 : 365;
|
||||||
|
|
||||||
|
for (i = 0; i < tm->tm_mon; ++i)
|
||||||
|
res += ndays[is_leap(tm->tm_year)][i];
|
||||||
|
res += tm->tm_mday - 1;
|
||||||
|
res *= 24;
|
||||||
|
res += tm->tm_hour;
|
||||||
|
res *= 60;
|
||||||
|
res += tm->tm_min;
|
||||||
|
res *= 60;
|
||||||
|
res += tm->tm_sec;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
/* A hopefully portable version of timegm */
|
||||||
|
static time_t timegm(struct tm *tm ) {
|
||||||
|
time_t ret;
|
||||||
|
char *tz;
|
||||||
|
|
||||||
|
tz = getenv("TZ");
|
||||||
|
setenv("TZ", "", 1);
|
||||||
|
tzset();
|
||||||
|
ret = mktime(tm);
|
||||||
|
if (tz)
|
||||||
|
setenv("TZ", tz, 1);
|
||||||
|
else
|
||||||
|
unsetenv("TZ");
|
||||||
|
tzset();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif /* Platform switch */
|
||||||
|
#endif /* HAVE_TIMEGM */
|
||||||
|
|
||||||
|
#define RFC1123_FORMAT "%3s, %02d %3s %4d %02d:%02d:%02d GMT"
|
||||||
|
static const char short_months[12][4] = {
|
||||||
|
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
||||||
|
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
|
||||||
|
};
|
||||||
|
/*
|
||||||
|
* This function is borrowed from libneon's ne_httpdate_parse.
|
||||||
|
* Unfortunately that one converts to local time but here UTC is
|
||||||
|
* needed.
|
||||||
|
* This one uses timegm instead, which returns UTC.
|
||||||
|
*/
|
||||||
|
time_t oc_httpdate_parse( const char *date ) {
|
||||||
|
struct tm gmt;
|
||||||
|
char wkday[4], mon[4];
|
||||||
|
int n;
|
||||||
|
time_t result = 0;
|
||||||
|
|
||||||
|
memset(&gmt, 0, sizeof(struct tm));
|
||||||
|
|
||||||
|
/* it goes: Sun, 06 Nov 1994 08:49:37 GMT */
|
||||||
|
n = sscanf(date, RFC1123_FORMAT,
|
||||||
|
wkday, &gmt.tm_mday, mon, &gmt.tm_year, &gmt.tm_hour,
|
||||||
|
&gmt.tm_min, &gmt.tm_sec);
|
||||||
|
/* Is it portable to check n==7 here? */
|
||||||
|
gmt.tm_year -= 1900;
|
||||||
|
for (n=0; n<12; n++)
|
||||||
|
if (strcmp(mon, short_months[n]) == 0)
|
||||||
|
break;
|
||||||
|
/* tm_mon comes out as 12 if the month is corrupt, which is desired,
|
||||||
|
* since the mktime will then fail */
|
||||||
|
gmt.tm_mon = n;
|
||||||
|
gmt.tm_isdst = -1;
|
||||||
|
result = timegm(&gmt);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|||||||
@@ -32,8 +32,5 @@ void csync_memstat_check(void);
|
|||||||
|
|
||||||
void csync_win32_set_file_hidden( const char *file, bool hidden );
|
void csync_win32_set_file_hidden( const char *file, bool hidden );
|
||||||
|
|
||||||
/* Convert a csync_file_stat_t to csync_vio_file_stat_t */
|
|
||||||
csync_vio_file_stat_t *csync_vio_convert_file_stat(csync_file_stat_t *st);
|
|
||||||
|
|
||||||
bool csync_file_locked_or_open( const char *dir, const char *fname);
|
bool csync_file_locked_or_open( const char *dir, const char *fname);
|
||||||
#endif /* _CSYNC_UTIL_H */
|
#endif /* _CSYNC_UTIL_H */
|
||||||
|
|||||||
@@ -96,6 +96,7 @@ hbf_transfer_t *hbf_init_transfer( const char *dest_uri ) {
|
|||||||
transfer->block_size = DEFAULT_BLOCK_SIZE;
|
transfer->block_size = DEFAULT_BLOCK_SIZE;
|
||||||
transfer->threshold = transfer->block_size;
|
transfer->threshold = transfer->block_size;
|
||||||
transfer->modtime_accepted = 0;
|
transfer->modtime_accepted = 0;
|
||||||
|
transfer->oc_header_modtime = 0;
|
||||||
|
|
||||||
return transfer;
|
return transfer;
|
||||||
}
|
}
|
||||||
@@ -259,9 +260,6 @@ static char* get_transfer_url( hbf_transfer_t *transfer, int indx ) {
|
|||||||
len += strlen("-chunking---");
|
len += strlen("-chunking---");
|
||||||
|
|
||||||
res = malloc(len);
|
res = malloc(len);
|
||||||
if( res == NULL ) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Note: must be %u for unsigned because one does not want '--' */
|
/* Note: must be %u for unsigned because one does not want '--' */
|
||||||
if( sprintf(res, "%s-chunking-%u-%u-%u", transfer->url, transfer->transfer_id,
|
if( sprintf(res, "%s-chunking-%u-%u-%u", transfer->url, transfer->transfer_id,
|
||||||
@@ -491,8 +489,8 @@ Hbf_State hbf_transfer( ne_session *session, hbf_transfer_t *transfer, const cha
|
|||||||
|
|
||||||
snprintf(buf, sizeof(buf), "%"PRId64, transfer->stat_size);
|
snprintf(buf, sizeof(buf), "%"PRId64, transfer->stat_size);
|
||||||
ne_add_request_header(req, "OC-Total-Length", buf);
|
ne_add_request_header(req, "OC-Total-Length", buf);
|
||||||
if( transfer->modtime > 0 ) {
|
if( transfer->oc_header_modtime > 0 ) {
|
||||||
snprintf(buf, sizeof(buf), "%"PRId64, transfer->modtime);
|
snprintf(buf, sizeof(buf), "%"PRId64, transfer->oc_header_modtime);
|
||||||
ne_add_request_header(req, "X-OC-Mtime", buf);
|
ne_add_request_header(req, "X-OC-Mtime", buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -502,6 +500,8 @@ Hbf_State hbf_transfer( ne_session *session, hbf_transfer_t *transfer, const cha
|
|||||||
|
|
||||||
if( transfer->block_cnt > 1 ) {
|
if( transfer->block_cnt > 1 ) {
|
||||||
ne_add_request_header(req, "OC-Chunked", "1");
|
ne_add_request_header(req, "OC-Chunked", "1");
|
||||||
|
snprintf(buf, sizeof(buf), "%"PRId64, transfer->threshold);
|
||||||
|
ne_add_request_header(req, "OC-Chunk-Size", buf);
|
||||||
}
|
}
|
||||||
ne_add_request_header( req, "Content-Type", "application/octet-stream");
|
ne_add_request_header( req, "Content-Type", "application/octet-stream");
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user