Compare commits
830
Commits
SOGo-3.2.7
...
SOGo-4.0.3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5de5e9e068 | ||
|
|
0e731452ee | ||
|
|
181aedd611 | ||
|
|
abd7d2614f | ||
|
|
8525e6fd2b | ||
|
|
1ab1735481 | ||
|
|
0643071d5b | ||
|
|
7cae529ee4 | ||
|
|
c8f7df402c | ||
|
|
659df2d10e | ||
|
|
af68a647b8 | ||
|
|
6613c44765 | ||
|
|
995ccb2b73 | ||
|
|
8120a48b95 | ||
|
|
fbdd0b82bb | ||
|
|
e4f6be243e | ||
|
|
93bb95d256 | ||
|
|
be7f07a7ba | ||
|
|
03b45899c1 | ||
|
|
74df75e5d5 | ||
|
|
78c1244975 | ||
|
|
12cbebec07 | ||
|
|
f49ad93b3b | ||
|
|
fc3224b802 | ||
|
|
3d9fe30373 | ||
|
|
ba9960b97a | ||
|
|
7eac7db618 | ||
|
|
b90d312f43 | ||
|
|
d05e1fed5d | ||
|
|
398ef4dcde | ||
|
|
a7c88597c6 | ||
|
|
563a2cd9df | ||
|
|
194b7f208a | ||
|
|
3906e19176 | ||
|
|
ec4d93a845 | ||
|
|
ff7e8cb2a3 | ||
|
|
ecb7679621 | ||
|
|
38c733bf8b | ||
|
|
8f4a24fb67 | ||
|
|
9310d5b02d | ||
|
|
9ddb65a07a | ||
|
|
2be5edde94 | ||
|
|
9838c369b2 | ||
|
|
e3f928b0c3 | ||
|
|
10485f8943 | ||
|
|
6d9de5859e | ||
|
|
7aa3e1f160 | ||
|
|
3881bc408d | ||
|
|
3b9835095f | ||
|
|
19c02914ba | ||
|
|
699fe537e1 | ||
|
|
35cd2591d6 | ||
|
|
679a12be19 | ||
|
|
3394018604 | ||
|
|
2d63bd0bb4 | ||
|
|
155114c8fb | ||
|
|
1e784e4590 | ||
|
|
eeec8328c0 | ||
|
|
87df69163f | ||
|
|
3bdd90e2be | ||
|
|
18df3bafb5 | ||
|
|
bad8efca47 | ||
|
|
2fa3b4d5b0 | ||
|
|
b658faa8f2 | ||
|
|
bd8dec0e15 | ||
|
|
bac1a59555 | ||
|
|
0e2c93864b | ||
|
|
dfcc14356a | ||
|
|
1551b3deab | ||
|
|
4542163241 | ||
|
|
1144965660 | ||
|
|
b9b753579d | ||
|
|
ef172b36bb | ||
|
|
7e0f0c2c95 | ||
|
|
442ff4648c | ||
|
|
666c54851b | ||
|
|
326fa87176 | ||
|
|
db567d90cc | ||
|
|
c3271dd2a5 | ||
|
|
df78658621 | ||
|
|
838e1ac213 | ||
|
|
3e5a486a1b | ||
|
|
9f654d223b | ||
|
|
90187876bf | ||
|
|
71fa451856 | ||
|
|
828d773b49 | ||
|
|
69c03e7479 | ||
|
|
e81cf29e4c | ||
|
|
bfd2481a9c | ||
|
|
3fb60ae002 | ||
|
|
f32e27f4f2 | ||
|
|
996e05f701 | ||
|
|
429d1fb2a8 | ||
|
|
949edaa94d | ||
|
|
fc8f57f55d | ||
|
|
d52a981440 | ||
|
|
f0b4e1b719 | ||
|
|
e5d3c5fa33 | ||
|
|
6a45bb2917 | ||
|
|
0dc0ae4164 | ||
|
|
38fcc242e2 | ||
|
|
038f93dc0e | ||
|
|
9f2bcf3ec4 | ||
|
|
fccbdb3076 | ||
|
|
30a81528a2 | ||
|
|
5a48fca43d | ||
|
|
b98ec5c630 | ||
|
|
cac93c2e8a | ||
|
|
7f135e5323 | ||
|
|
0feddfc7af | ||
|
|
6020f6ae83 | ||
|
|
540edc0c25 | ||
|
|
9fc5c7d52a | ||
|
|
894769ef6f | ||
|
|
7e75c8be45 | ||
|
|
396755fffb | ||
|
|
dc50bd2296 | ||
|
|
5b9ab00bda | ||
|
|
ffac0a9c13 | ||
|
|
639ef53600 | ||
|
|
05e033ccb5 | ||
|
|
90d03aa81d | ||
|
|
cb2d66498f | ||
|
|
03ef3d0338 | ||
|
|
c72868c6a4 | ||
|
|
192957a5d7 | ||
|
|
08341c1ce6 | ||
|
|
f66fc7a4ad | ||
|
|
120f1280a4 | ||
|
|
d6f85efa8a | ||
|
|
d8b91bf08e | ||
|
|
a5ec3cb3ab | ||
|
|
d60fdb8732 | ||
|
|
3ea80065dd | ||
|
|
1892aafae4 | ||
|
|
c4c1de771c | ||
|
|
f23b97fa28 | ||
|
|
45af5ef230 | ||
|
|
3eb01aef71 | ||
|
|
1039f13f55 | ||
|
|
50ccf58ba4 | ||
|
|
f0636d17fe | ||
|
|
e494dbc57c | ||
|
|
a25e0f73be | ||
|
|
7519a5c234 | ||
|
|
a9a751f869 | ||
|
|
97e168cab1 | ||
|
|
af1e03e335 | ||
|
|
1e18b36c5a | ||
|
|
c4109a0f9c | ||
|
|
b75593e99a | ||
|
|
69ae9d752a | ||
|
|
1786ae70da | ||
|
|
7bd4173388 | ||
|
|
213ef0efb5 | ||
|
|
5fe44b2029 | ||
|
|
b6ee4ee0db | ||
|
|
aa41e6d868 | ||
|
|
821c846864 | ||
|
|
f8cd3fb29c | ||
|
|
2b80d62a77 | ||
|
|
a257607a06 | ||
|
|
00be330915 | ||
|
|
f4cc8450a3 | ||
|
|
95376ca7dd | ||
|
|
05c798cce7 | ||
|
|
93629c7751 | ||
|
|
4c1879f36a | ||
|
|
a69a5b77be | ||
|
|
70d0408230 | ||
|
|
976556d402 | ||
|
|
fe362b9f49 | ||
|
|
702426404d | ||
|
|
10ea78b0cf | ||
|
|
84286ac1ef | ||
|
|
660a2a4b24 | ||
|
|
0af459abf7 | ||
|
|
5bd4ae8a4f | ||
|
|
c875012215 | ||
|
|
addc231d23 | ||
|
|
aca2c1b9e8 | ||
|
|
4084375003 | ||
|
|
ef000c2ed1 | ||
|
|
0149d7400d | ||
|
|
e33ec4e396 | ||
|
|
c6e11606e9 | ||
|
|
fc6aafe4a6 | ||
|
|
82d992fc67 | ||
|
|
2cbc1ac6eb | ||
|
|
03b36e0bcd | ||
|
|
a0582c7e1e | ||
|
|
e6508e77a9 | ||
|
|
458b724864 | ||
|
|
c966ad60e7 | ||
|
|
0c5b5446dd | ||
|
|
452083e767 | ||
|
|
563a4c7d1e | ||
|
|
3cadcaf4eb | ||
|
|
d1a4a0d152 | ||
|
|
f1b741c2e6 | ||
|
|
a9c5b7b292 | ||
|
|
5084fd15fd | ||
|
|
bbfa2fa7f9 | ||
|
|
65812424d6 | ||
|
|
31d7926304 | ||
|
|
6f042ca7d2 | ||
|
|
371504e997 | ||
|
|
119591e8dd | ||
|
|
4bb407ad8d | ||
|
|
12b2ecca72 | ||
|
|
71d48dd6b5 | ||
|
|
8b29d90515 | ||
|
|
7222e5a36a | ||
|
|
a2ef0b41f3 | ||
|
|
c95d6d0d8e | ||
|
|
f31892044b | ||
|
|
b8958b931e | ||
|
|
f0c8e41820 | ||
|
|
6405567886 | ||
|
|
e375575436 | ||
|
|
b0e59f9ac9 | ||
|
|
3ac952fd58 | ||
|
|
1d731ebb77 | ||
|
|
c59e429346 | ||
|
|
162206b934 | ||
|
|
e6e1fddb3e | ||
|
|
a4876798bc | ||
|
|
3659470936 | ||
|
|
e64049c05c | ||
|
|
fbed929402 | ||
|
|
dff85ae1d7 | ||
|
|
982cbed7cc | ||
|
|
a601ed47d8 | ||
|
|
a0bf8b6f4d | ||
|
|
c495e14cd7 | ||
|
|
f799716b25 | ||
|
|
c1e9e355ec | ||
|
|
5545c9f26e | ||
|
|
5d1a6508d0 | ||
|
|
d57c46a401 | ||
|
|
f27a71e07e | ||
|
|
df2926e872 | ||
|
|
e3ba7c8cab | ||
|
|
1d7bc666d6 | ||
|
|
190fa0c77e | ||
|
|
0667c12db4 | ||
|
|
a911a3b78c | ||
|
|
2301ae2c75 | ||
|
|
5493855b2f | ||
|
|
4a5446d8ad | ||
|
|
bf34f4f552 | ||
|
|
d49219ceec | ||
|
|
0dc3ed3202 | ||
|
|
a75ae84953 | ||
|
|
d00db81d08 | ||
|
|
44ea5a29d4 | ||
|
|
218d8aa5fa | ||
|
|
d02a97468e | ||
|
|
518e6a56fd | ||
|
|
da52b0bf82 | ||
|
|
e10dc4af11 | ||
|
|
b8a02d6ce9 | ||
|
|
e50e112a96 | ||
|
|
9776e9d217 | ||
|
|
e7c56e86d4 | ||
|
|
26095d6361 | ||
|
|
2faf0411e4 | ||
|
|
d3b10730e9 | ||
|
|
a5adb2f952 | ||
|
|
3bf55a5edf | ||
|
|
b120669747 | ||
|
|
bccce4022e | ||
|
|
32fd61c8f4 | ||
|
|
7cd040fb6b | ||
|
|
9310a289f6 | ||
|
|
006859cee1 | ||
|
|
9fddc66007 | ||
|
|
ed6e191f66 | ||
|
|
099f6b42dc | ||
|
|
c5a324ae86 | ||
|
|
e265ecfe1b | ||
|
|
faed42094f | ||
|
|
40b0704812 | ||
|
|
e29ce4acec | ||
|
|
29047c4692 | ||
|
|
86b896e532 | ||
|
|
8ae8d67c0c | ||
|
|
ad943bf2aa | ||
|
|
1be0808a16 | ||
|
|
2fceae86dd | ||
|
|
750c720a73 | ||
|
|
24123e78da | ||
|
|
e2ee90f2ef | ||
|
|
e47640a06d | ||
|
|
b2703f4ddc | ||
|
|
19753f56f7 | ||
|
|
8305d30cb7 | ||
|
|
23d0b68e57 | ||
|
|
f88b46c78f | ||
|
|
e93727d3f0 | ||
|
|
2ccf7a5514 | ||
|
|
1528dc4dd0 | ||
|
|
d05477499f | ||
|
|
7897ea58fe | ||
|
|
a35138c0b8 | ||
|
|
8e35becd93 | ||
|
|
7ebdac5525 | ||
|
|
511aa63a34 | ||
|
|
341e5cbab0 | ||
|
|
0e673beb22 | ||
|
|
d80f2462f0 | ||
|
|
b8812d64e8 | ||
|
|
b8c20b24e5 | ||
|
|
e1cb7f385f | ||
|
|
c2169a1f72 | ||
|
|
2fc8018b52 | ||
|
|
bca655ffdd | ||
|
|
d4c8f5089b | ||
|
|
5b711dea8f | ||
|
|
4133a0b954 | ||
|
|
b39d3db674 | ||
|
|
30817079f2 | ||
|
|
a33df49331 | ||
|
|
e86efe59fd | ||
|
|
c29e0a1a3d | ||
|
|
5ba683d4b1 | ||
|
|
15de264967 | ||
|
|
5767419554 | ||
|
|
8d0f419acf | ||
|
|
451133f226 | ||
|
|
ed3fe1ecc2 | ||
|
|
da4e2e92bd | ||
|
|
b73e65ebeb | ||
|
|
d6c1fad2fc | ||
|
|
6cc96301f8 | ||
|
|
02d1aa12f9 | ||
|
|
a44118d68f | ||
|
|
c875302a86 | ||
|
|
2f1c8cdbc8 | ||
|
|
7824c35d95 | ||
|
|
48d94980b4 | ||
|
|
20e8fd852c | ||
|
|
8ab73fa76b | ||
|
|
2d6246d635 | ||
|
|
0287f34bca | ||
|
|
879e7a6cd5 | ||
|
|
0ec60788d8 | ||
|
|
ada9c57ef7 | ||
|
|
643c6b7ebf | ||
|
|
35c7f483d9 | ||
|
|
c80f016c18 | ||
|
|
8727024857 | ||
|
|
a73b20fa02 | ||
|
|
502b59bc08 | ||
|
|
3f95d53de8 | ||
|
|
72273bf454 | ||
|
|
496b402d17 | ||
|
|
695afc670f | ||
|
|
54d04741fa | ||
|
|
74d41ecb34 | ||
|
|
2a272f0aa7 | ||
|
|
95bf606bf2 | ||
|
|
6ce1fa42a2 | ||
|
|
793fc9024f | ||
|
|
71dd9d7d91 | ||
|
|
e27e558cb2 | ||
|
|
96d62c432b | ||
|
|
6294d91180 | ||
|
|
64a7b8a797 | ||
|
|
f880d1aa54 | ||
|
|
915fad335a | ||
|
|
5e26ff6d1d | ||
|
|
94f7050cb8 | ||
|
|
f95170e043 | ||
|
|
81e07f0105 | ||
|
|
8f2bcb6055 | ||
|
|
42bf30d05e | ||
|
|
8a4ebe2c60 | ||
|
|
979ec2c3a1 | ||
|
|
58f4c72c47 | ||
|
|
af641bbead | ||
|
|
873faf468f | ||
|
|
f5db41584b | ||
|
|
2952a69785 | ||
|
|
394e7e7e88 | ||
|
|
f662781312 | ||
|
|
6c993be9f1 | ||
|
|
8afa87e953 | ||
|
|
4b355f532d | ||
|
|
429a3bedb9 | ||
|
|
b89752cd39 | ||
|
|
9ed23c32f2 | ||
|
|
28a37de613 | ||
|
|
60bbe26289 | ||
|
|
37074086cf | ||
|
|
c9c5f8bba9 | ||
|
|
97147e261b | ||
|
|
732f81b44b | ||
|
|
3b411101cd | ||
|
|
8d38be1e43 | ||
|
|
de91b57825 | ||
|
|
e6e5e077bd | ||
|
|
e590aec64f | ||
|
|
3816d25a44 | ||
|
|
7f99514744 | ||
|
|
e61a55f30e | ||
|
|
e7a4384f28 | ||
|
|
b3f2fba4da | ||
|
|
d526efa501 | ||
|
|
38790af774 | ||
|
|
c45c691bf9 | ||
|
|
73201a0314 | ||
|
|
fc7706abd0 | ||
|
|
8e1a19dca2 | ||
|
|
7ddecd4006 | ||
|
|
c9c6b0dc9f | ||
|
|
2c86f68fb9 | ||
|
|
27ce401e6b | ||
|
|
39e579e656 | ||
|
|
30c361a56b | ||
|
|
1d90aa748d | ||
|
|
7874b0a74c | ||
|
|
6ab4688812 | ||
|
|
12fa8ef65a | ||
|
|
0608a0bec8 | ||
|
|
a7b32e8c6d | ||
|
|
d6e74cf9cb | ||
|
|
e8b29add3a | ||
|
|
e04b281864 | ||
|
|
eb90760b39 | ||
|
|
aed62cab26 | ||
|
|
d665f4b251 | ||
|
|
e588becf79 | ||
|
|
a2129f3e4a | ||
|
|
08ec68c07c | ||
|
|
3c30997bf5 | ||
|
|
80886afadd | ||
|
|
4a40230f23 | ||
|
|
00af2613b6 | ||
|
|
9335ee67c1 | ||
|
|
c5e2a6bcb9 | ||
|
|
5ff28a37e2 | ||
|
|
2b9cc20689 | ||
|
|
e7c15a697d | ||
|
|
38d4a26827 | ||
|
|
650faa4d22 | ||
|
|
c68d7204a1 | ||
|
|
ae0fff23b5 | ||
|
|
ccb1439c84 | ||
|
|
c7e9b0e3a6 | ||
|
|
9d45d57cb2 | ||
|
|
70dbba877a | ||
|
|
fe75cb3940 | ||
|
|
141af57e61 | ||
|
|
f5aeed444d | ||
|
|
b56df72992 | ||
|
|
e3505808dc | ||
|
|
1fd4657de7 | ||
|
|
2d61be8ff6 | ||
|
|
2b5bfff06d | ||
|
|
b6d657d001 | ||
|
|
38e898dc5d | ||
|
|
9b434bb859 | ||
|
|
aa7193d722 | ||
|
|
8df50f9ab7 | ||
|
|
92c96bc04c | ||
|
|
8b6aa7fb88 | ||
|
|
e59a8e12ba | ||
|
|
8b02db7b8c | ||
|
|
e5f9f3383a | ||
|
|
6a661264f6 | ||
|
|
f34937d92c | ||
|
|
888adc9396 | ||
|
|
c4be6a2114 | ||
|
|
7b1e7e2e7b | ||
|
|
a7529ecabf | ||
|
|
9b20a8377a | ||
|
|
b3f4a8f8c3 | ||
|
|
a313068595 | ||
|
|
861ce9ac53 | ||
|
|
7f8693948f | ||
|
|
24a41f20d2 | ||
|
|
1e0b71bbda | ||
|
|
5ed99af021 | ||
|
|
fe8f08c807 | ||
|
|
2ea7cefa3e | ||
|
|
6b6f70ce9d | ||
|
|
6730db74e6 | ||
|
|
aa7febe15b | ||
|
|
9e2f22d331 | ||
|
|
104ac2db33 | ||
|
|
789398bd27 | ||
|
|
391410a4ec | ||
|
|
106ae7a078 | ||
|
|
d02f0db0b4 | ||
|
|
8c5977088f | ||
|
|
3fa0baa396 | ||
|
|
b896897c3e | ||
|
|
2f89c5d4a7 | ||
|
|
e73c42ada3 | ||
|
|
77f9f60276 | ||
|
|
614a137128 | ||
|
|
aa3c02be93 | ||
|
|
24382a4318 | ||
|
|
3189e0e13a | ||
|
|
e0b0c9c2c1 | ||
|
|
7e4e2863b6 | ||
|
|
649337c3e5 | ||
|
|
ac376bbba9 | ||
|
|
7a76675864 | ||
|
|
752323fb7d | ||
|
|
141b3af83b | ||
|
|
8697b6c835 | ||
|
|
536b02b9fd | ||
|
|
02cbe23e78 | ||
|
|
84edeb85cd | ||
|
|
dff30d61fb | ||
|
|
933649c299 | ||
|
|
cb2ab9152f | ||
|
|
1ac910bdd1 | ||
|
|
f3a766d8b0 | ||
|
|
a65e96bdb5 | ||
|
|
ee7fdcba9f | ||
|
|
491e090fb4 | ||
|
|
5e5e52e3f1 | ||
|
|
c277c397e7 | ||
|
|
ccf9ceb729 | ||
|
|
2a046557ac | ||
|
|
debe1f41f8 | ||
|
|
5b19c8bf8b | ||
|
|
c29c6dc621 | ||
|
|
399397bd79 | ||
|
|
9495c43b4b | ||
|
|
37ffe889b5 | ||
|
|
c6dbb88dc1 | ||
|
|
1ac2ec7ad6 | ||
|
|
8df0896028 | ||
|
|
e35988e669 | ||
|
|
4d271a6d85 | ||
|
|
fdf755dbee | ||
|
|
fb1e00be81 | ||
|
|
c35e54e4fc | ||
|
|
66685d9f7f | ||
|
|
b7c8f43bcc | ||
|
|
45a5b533a3 | ||
|
|
c810e60a04 | ||
|
|
03887cb395 | ||
|
|
9b64a1bddf | ||
|
|
893873db22 | ||
|
|
8221a8de66 | ||
|
|
217525cf10 | ||
|
|
c975cf6c78 | ||
|
|
68adf8969a | ||
|
|
589c5f8ae0 | ||
|
|
1a76ade0ec | ||
|
|
032b2fbbd4 | ||
|
|
277342dced | ||
|
|
2adc11bcd6 | ||
|
|
5b84ee0c09 | ||
|
|
2c9c1e0d01 | ||
|
|
f6d79712e2 | ||
|
|
c0db64e0f2 | ||
|
|
43d85f8bc4 | ||
|
|
5aa74ca0ad | ||
|
|
5d98112a7a | ||
|
|
c48750c6f2 | ||
|
|
b7dac4db9f | ||
|
|
579ab68e19 | ||
|
|
0c82ad5944 | ||
|
|
22c078ee76 | ||
|
|
721428c88f | ||
|
|
07fa202523 | ||
|
|
919d1ef6be | ||
|
|
3927494393 | ||
|
|
14b902241d | ||
|
|
fa7aba89c2 | ||
|
|
7785c1c142 | ||
|
|
d9dafd3d14 | ||
|
|
df8c00089b | ||
|
|
741e639960 | ||
|
|
9f96639e6f | ||
|
|
ee68cf6ed5 | ||
|
|
8662dd199d | ||
|
|
2d1c2b2239 | ||
|
|
863510e707 | ||
|
|
3ce28b7316 | ||
|
|
b0e0950d12 | ||
|
|
e8ec8180a8 | ||
|
|
9bde9b66ef | ||
|
|
7f00afcef5 | ||
|
|
362d6d521f | ||
|
|
e1bc458d46 | ||
|
|
ade945219f | ||
|
|
6c654e0f90 | ||
|
|
ca43e7d9ca | ||
|
|
0a155d6f67 | ||
|
|
c9dded0947 | ||
|
|
d72c614d29 | ||
|
|
157d3050bf | ||
|
|
8a50ccdab4 | ||
|
|
99fff30489 | ||
|
|
ef122b0f39 | ||
|
|
b6b8f7a0fb | ||
|
|
8701d2c26c | ||
|
|
5080482507 | ||
|
|
392cad1cbb | ||
|
|
248cea87e8 | ||
|
|
7464c2e680 | ||
|
|
67b9ef0b8b | ||
|
|
9b2527ce6d | ||
|
|
67d4896bc7 | ||
|
|
a86f8a8a0a | ||
|
|
5fd8c9d2d0 | ||
|
|
aff5d53b1c | ||
|
|
b3f541b87e | ||
|
|
2604e2bf59 | ||
|
|
dc9eaa164d | ||
|
|
b8f54dd8e8 | ||
|
|
15ab809c38 | ||
|
|
bb04f97570 | ||
|
|
6f56522f89 | ||
|
|
6e04a2d99c | ||
|
|
e8e0df8b53 | ||
|
|
72d2152b20 | ||
|
|
89bfa0c536 | ||
|
|
1fa056bb25 | ||
|
|
a19d1573d3 | ||
|
|
c8e90b4abd | ||
|
|
e4d0ce6090 | ||
|
|
a33bd62343 | ||
|
|
0738896540 | ||
|
|
34a6a8960a | ||
|
|
02684127dd | ||
|
|
6a8345c2c8 | ||
|
|
9dae52a719 | ||
|
|
f87797d61e | ||
|
|
29dfc75fe9 | ||
|
|
af2507a689 | ||
|
|
2b90ff70fa | ||
|
|
43141a48cf | ||
|
|
0355f66e96 | ||
|
|
3049af066b | ||
|
|
b00fc756e6 | ||
|
|
555b7303d1 | ||
|
|
0a990ff66b | ||
|
|
e591c9b3cf | ||
|
|
acc6da4c15 | ||
|
|
3f3f58dc9f | ||
|
|
e30358aeaa | ||
|
|
28e0db4adf | ||
|
|
92137de325 | ||
|
|
ad90d666ca | ||
|
|
8678949c87 | ||
|
|
8f005b90f5 | ||
|
|
49183bd1fb | ||
|
|
a26970b33b | ||
|
|
f2af5e9f87 | ||
|
|
c24474b197 | ||
|
|
ec02efe873 | ||
|
|
8dc2cfc2dc | ||
|
|
ce5db84996 | ||
|
|
41967d3eec | ||
|
|
aee42f76f0 | ||
|
|
28ae2fd58a | ||
|
|
083be7e89f | ||
|
|
99510f4646 | ||
|
|
334765c977 | ||
|
|
7207925362 | ||
|
|
c9b9150b96 | ||
|
|
4d490d0f1e | ||
|
|
bc23130f9b | ||
|
|
28bc489c1a | ||
|
|
650f337c41 | ||
|
|
8de9b8ff53 | ||
|
|
8b812ba4f0 | ||
|
|
836700fb7e | ||
|
|
ba583f41b1 | ||
|
|
0e82550f6b | ||
|
|
0185ba9d46 | ||
|
|
9700b93ad1 | ||
|
|
63cb80142b | ||
|
|
c3ef225a02 | ||
|
|
b42876bb0a | ||
|
|
da4033eeab | ||
|
|
f1329a3d36 | ||
|
|
b46781c693 | ||
|
|
ef5728dcaf | ||
|
|
663a0b60dd | ||
|
|
59dbef5ee7 | ||
|
|
4caff58918 | ||
|
|
634cbe3d1b | ||
|
|
3d0c958a19 | ||
|
|
da44afdcf5 | ||
|
|
11f847cdfb | ||
|
|
5f71ee4d52 | ||
|
|
68eae92d2d | ||
|
|
9459185059 | ||
|
|
a9763e94a4 | ||
|
|
5c573b9a76 | ||
|
|
513d81eb59 | ||
|
|
2b4e357da6 | ||
|
|
ab50a41a86 | ||
|
|
7582ec8462 | ||
|
|
dd6b77a25b | ||
|
|
0091ff749a | ||
|
|
c09dff3fc8 | ||
|
|
8a59180c0e | ||
|
|
d87dc6cdf2 | ||
|
|
0af81b0831 | ||
|
|
6fd9927092 | ||
|
|
8bcda19799 | ||
|
|
5570d28d12 | ||
|
|
b8369ddb37 | ||
|
|
e1ea6392c2 | ||
|
|
011e112a1a | ||
|
|
7d396a51f5 | ||
|
|
dbf5039011 | ||
|
|
76e6c064f7 | ||
|
|
04f930dba5 | ||
|
|
08fcee67bd | ||
|
|
cc9602fbc8 | ||
|
|
c92d489017 | ||
|
|
4cf59cd92e | ||
|
|
c4ad338aed | ||
|
|
c8708d9164 | ||
|
|
9bf7247835 | ||
|
|
ed3f794226 | ||
|
|
b9f4947f8a | ||
|
|
f83d6a20a1 | ||
|
|
8ff189229b | ||
|
|
4c1de4cecc | ||
|
|
a7254fe4dd | ||
|
|
308938dcfa | ||
|
|
c11d961bf3 | ||
|
|
4e82820db7 | ||
|
|
26dac618d0 | ||
|
|
f1cc36b533 | ||
|
|
cf07f5746c | ||
|
|
a328f022cb | ||
|
|
46c7af5fdd | ||
|
|
7065c4f765 | ||
|
|
2c8d1d0a26 | ||
|
|
dab48bfc60 | ||
|
|
b0cc012849 | ||
|
|
1d028e4cf5 | ||
|
|
4dcc1af46a | ||
|
|
c57f42b44b | ||
|
|
736921bdf7 | ||
|
|
0cc7c6be3d | ||
|
|
b7bc59d599 | ||
|
|
2f92484064 | ||
|
|
b463fd4eda | ||
|
|
75aaef0f3d | ||
|
|
e7a06c42a4 | ||
|
|
5ff8463fba | ||
|
|
400dd26b7d | ||
|
|
bc8146ef5d | ||
|
|
b25480f228 | ||
|
|
585cda36d1 | ||
|
|
b6d9c3e8e0 | ||
|
|
ce8f2e9481 | ||
|
|
cb532de83a | ||
|
|
1aebad854b | ||
|
|
9f6bc8a749 | ||
|
|
d24ff75ecf | ||
|
|
f60ffa923e | ||
|
|
19512a85d2 | ||
|
|
baa6d39e28 | ||
|
|
5d9673415a | ||
|
|
50f25b0597 | ||
|
|
0a0f8a8d89 | ||
|
|
489e35158c | ||
|
|
11d9df6e6a | ||
|
|
e5dc76cc19 | ||
|
|
ab7ec63f4b | ||
|
|
1964fdebcb | ||
|
|
5b6807b78c | ||
|
|
9603971c1f | ||
|
|
4ae8961947 | ||
|
|
0ffbc13376 | ||
|
|
a02fa44dc7 | ||
|
|
682f699e2f | ||
|
|
f3b098da75 | ||
|
|
6a963bf84b | ||
|
|
270ff1bd29 | ||
|
|
74c2926bca | ||
|
|
75aa6e90a2 | ||
|
|
3c35c16bf3 | ||
|
|
e95e8e9eac | ||
|
|
588ec2b005 | ||
|
|
0627c2f58b | ||
|
|
f6ed816243 | ||
|
|
25430a8128 | ||
|
|
79a0d5e133 | ||
|
|
018b7b7ab9 | ||
|
|
c8539dffa1 | ||
|
|
c995c6e9d7 | ||
|
|
8322d318aa | ||
|
|
4d88eab13b | ||
|
|
a3d7ae3a6b | ||
|
|
a29ced853a | ||
|
|
5047aed6ed | ||
|
|
3c46a6ef14 | ||
|
|
af3a35169a | ||
|
|
6b471994ef | ||
|
|
23ff62a9e0 | ||
|
|
2a820bd780 | ||
|
|
125178e526 | ||
|
|
e1979976a6 | ||
|
|
d87cf6980a | ||
|
|
dfce966e79 | ||
|
|
4002650748 | ||
|
|
0fa8cbf9cb | ||
|
|
7a4dbcb364 | ||
|
|
784503bdbc | ||
|
|
91b32faac2 | ||
|
|
f24d9ae389 | ||
|
|
b501014935 | ||
|
|
cc52e82524 | ||
|
|
fe42180bc0 | ||
|
|
7f67e90c53 | ||
|
|
bf001b1af6 | ||
|
|
3c65973cd5 | ||
|
|
48b2008da4 | ||
|
|
fd13fd632c | ||
|
|
b1e8f30138 | ||
|
|
fc68709956 | ||
|
|
06238a39b1 | ||
|
|
9f84162c5d | ||
|
|
6ffc9a3552 |
No files matched your search
@@ -19,8 +19,6 @@ UI/WebServerResources/.bowerrc
|
||||
UI/WebServerResources/.sass-cache/
|
||||
UI/WebServerResources/bower_components/
|
||||
UI/WebServerResources/css/
|
||||
UI/WebServerResources/css/styles.css
|
||||
UI/WebServerResources/css/styles.css.map
|
||||
UI/WebServerResources/js/*.js
|
||||
UI/WebServerResources/js/*.js.map
|
||||
UI/WebServerResources/js/vendor/*.js
|
||||
|
||||
+44
@@ -20,7 +20,9 @@ trans.hr_HR = UI/MailerUI/Croatian.lproj/Localizable.strings
|
||||
trans.hu = UI/MailerUI/Hungarian.lproj/Localizable.strings
|
||||
trans.is = UI/MailerUI/Icelandic.lproj/Localizable.strings
|
||||
trans.it = UI/MailerUI/Italian.lproj/Localizable.strings
|
||||
trans.ja = UI/MailerUI/Japanese.lproj/Localizable.strings
|
||||
trans.lt = UI/MailerUI/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = UI/MailerUI/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = UI/MailerUI/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = UI/MailerUI/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = UI/MailerUI/Dutch.lproj/Localizable.strings
|
||||
@@ -28,6 +30,7 @@ trans.nn_NO = UI/MailerUI/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = UI/MailerUI/Polish.lproj/Localizable.strings
|
||||
trans.pt = UI/MailerUI/Portuguese.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ro_RO = UI/MailerUI/Romanian.lproj/Localizable.strings
|
||||
trans.ru = UI/MailerUI/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/MailerUI/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = UI/MailerUI/Slovenian.lproj/Localizable.strings
|
||||
@@ -35,6 +38,7 @@ trans.sr = UI/MailerUI/Serbian.lproj/Localizable.strings
|
||||
trans.sv = UI/MailerUI/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = UI/MailerUI/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = UI/MailerUI/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = UI/MailerUI/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/MailerUI/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-preferencesui]
|
||||
@@ -56,7 +60,9 @@ trans.hr_HR = UI/PreferencesUI/Croatian.lproj/Localizable.strings
|
||||
trans.hu = UI/PreferencesUI/Hungarian.lproj/Localizable.strings
|
||||
trans.is = UI/PreferencesUI/Icelandic.lproj/Localizable.strings
|
||||
trans.it = UI/PreferencesUI/Italian.lproj/Localizable.strings
|
||||
trans.ja = UI/PreferencesUI/Japanese.lproj/Localizable.strings
|
||||
trans.lt = UI/PreferencesUI/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = UI/PreferencesUI/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = UI/PreferencesUI/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = UI/PreferencesUI/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = UI/PreferencesUI/Dutch.lproj/Localizable.strings
|
||||
@@ -64,6 +70,7 @@ trans.nn_NO = UI/PreferencesUI/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = UI/PreferencesUI/Polish.lproj/Localizable.strings
|
||||
trans.pt = UI/PreferencesUI/Portuguese.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ro_RO = UI/PreferencesUI/Romanian.lproj/Localizable.strings
|
||||
trans.ru = UI/PreferencesUI/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/PreferencesUI/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = UI/PreferencesUI/Slovenian.lproj/Localizable.strings
|
||||
@@ -71,6 +78,7 @@ trans.sr = UI/PreferencesUI/Serbian.lproj/Localizable.strings
|
||||
trans.sv = UI/PreferencesUI/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = UI/PreferencesUI/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = UI/PreferencesUI/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = UI/PreferencesUI/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/PreferencesUI/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-scheduler]
|
||||
@@ -92,7 +100,9 @@ trans.hr_HR = UI/Scheduler/Croatian.lproj/Localizable.strings
|
||||
trans.hu = UI/Scheduler/Hungarian.lproj/Localizable.strings
|
||||
trans.is = UI/Scheduler/Icelandic.lproj/Localizable.strings
|
||||
trans.it = UI/Scheduler/Italian.lproj/Localizable.strings
|
||||
trans.ja = UI/Scheduler/Japanese.lproj/Localizable.strings
|
||||
trans.lt = UI/Scheduler/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = UI/Scheduler/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = UI/Scheduler/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = UI/Scheduler/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = UI/Scheduler/Dutch.lproj/Localizable.strings
|
||||
@@ -100,6 +110,7 @@ trans.nn_NO = UI/Scheduler/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = UI/Scheduler/Polish.lproj/Localizable.strings
|
||||
trans.pt = UI/Scheduler/Portuguese.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ro_RO = UI/Scheduler/Romanian.lproj/Localizable.strings
|
||||
trans.ru = UI/Scheduler/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/Scheduler/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = UI/Scheduler/Slovenian.lproj/Localizable.strings
|
||||
@@ -107,6 +118,7 @@ trans.sr = UI/Scheduler/Serbian.lproj/Localizable.strings
|
||||
trans.sv = UI/Scheduler/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = UI/Scheduler/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = UI/Scheduler/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = UI/Scheduler/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/Scheduler/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-contacts]
|
||||
@@ -128,7 +140,9 @@ trans.hr_HR = UI/Contacts/Croatian.lproj/Localizable.strings
|
||||
trans.hu = UI/Contacts/Hungarian.lproj/Localizable.strings
|
||||
trans.is = UI/Contacts/Icelandic.lproj/Localizable.strings
|
||||
trans.it = UI/Contacts/Italian.lproj/Localizable.strings
|
||||
trans.ja = UI/Contacts/Japanese.lproj/Localizable.strings
|
||||
trans.lt = UI/Contacts/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = UI/Contacts/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = UI/Contacts/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = UI/Contacts/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = UI/Contacts/Dutch.lproj/Localizable.strings
|
||||
@@ -136,6 +150,7 @@ trans.nn_NO = UI/Contacts/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = UI/Contacts/Polish.lproj/Localizable.strings
|
||||
trans.pt = UI/Contacts/Portuguese.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ro_RO = UI/Contacts/Romanian.lproj/Localizable.strings
|
||||
trans.ru = UI/Contacts/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/Contacts/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = UI/Contacts/Slovenian.lproj/Localizable.strings
|
||||
@@ -143,6 +158,7 @@ trans.sr = UI/Contacts/Serbian.lproj/Localizable.strings
|
||||
trans.sv = UI/Contacts/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = UI/Contacts/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = UI/Contacts/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = UI/Contacts/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/Contacts/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-mainui]
|
||||
@@ -164,7 +180,9 @@ trans.hr_HR = UI/MainUI/Croatian.lproj/Localizable.strings
|
||||
trans.hu = UI/MainUI/Hungarian.lproj/Localizable.strings
|
||||
trans.is = UI/MainUI/Icelandic.lproj/Localizable.strings
|
||||
trans.it = UI/MainUI/Italian.lproj/Localizable.strings
|
||||
trans.ja = UI/MainUI/Japanese.lproj/Localizable.strings
|
||||
trans.lt = UI/MainUI/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = UI/MainUI/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = UI/MainUI/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = UI/MainUI/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = UI/MainUI/Dutch.lproj/Localizable.strings
|
||||
@@ -172,6 +190,7 @@ trans.nn_NO = UI/MainUI/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = UI/MainUI/Polish.lproj/Localizable.strings
|
||||
trans.pt = UI/MainUI/Portuguese.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ro_RO = UI/MainUI/Romanian.lproj/Localizable.strings
|
||||
trans.ru = UI/MainUI/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/MainUI/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = UI/MainUI/Slovenian.lproj/Localizable.strings
|
||||
@@ -179,6 +198,7 @@ trans.sr = UI/MainUI/Serbian.lproj/Localizable.strings
|
||||
trans.sv = UI/MainUI/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = UI/MainUI/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = UI/MainUI/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = UI/MainUI/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/MainUI/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-common]
|
||||
@@ -200,7 +220,9 @@ trans.hr_HR = UI/Common/Croatian.lproj/Localizable.strings
|
||||
trans.hu = UI/Common/Hungarian.lproj/Localizable.strings
|
||||
trans.is = UI/Common/Icelandic.lproj/Localizable.strings
|
||||
trans.it = UI/Common/Italian.lproj/Localizable.strings
|
||||
trans.ja = UI/Common/Japanese.lproj/Localizable.strings
|
||||
trans.lt = UI/Common/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = UI/Common/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = UI/Common/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = UI/Common/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = UI/Common/Dutch.lproj/Localizable.strings
|
||||
@@ -208,6 +230,7 @@ trans.nn_NO = UI/Common/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = UI/Common/Polish.lproj/Localizable.strings
|
||||
trans.pt = UI/Common/Portuguese.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/Common/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ro_RO = UI/Common/Romanian.lproj/Localizable.strings
|
||||
trans.ru = UI/Common/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/Common/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = UI/Common/Slovenian.lproj/Localizable.strings
|
||||
@@ -215,6 +238,7 @@ trans.sr = UI/Common/Serbian.lproj/Localizable.strings
|
||||
trans.sv = UI/Common/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = UI/Common/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = UI/Common/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = UI/Common/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/Common/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-administrationui]
|
||||
@@ -236,7 +260,9 @@ trans.hr_HR = UI/AdministrationUI/Croatian.lproj/Localizable.strings
|
||||
trans.hu = UI/AdministrationUI/Hungarian.lproj/Localizable.strings
|
||||
trans.is = UI/AdministrationUI/Icelandic.lproj/Localizable.strings
|
||||
trans.it = UI/AdministrationUI/Italian.lproj/Localizable.strings
|
||||
trans.ja = UI/AdministrationUI/Japanese.lproj/Localizable.strings
|
||||
trans.lt = UI/AdministrationUI/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = UI/AdministrationUI/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = UI/AdministrationUI/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = UI/AdministrationUI/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = UI/AdministrationUI/Dutch.lproj/Localizable.strings
|
||||
@@ -244,6 +270,7 @@ trans.nn_NO = UI/AdministrationUI/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = UI/AdministrationUI/Polish.lproj/Localizable.strings
|
||||
trans.pt = UI/AdministrationUI/Portuguese.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/AdministrationUI/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ro_RO = UI/AdministrationUI/Romanian.lproj/Localizable.strings
|
||||
trans.ru = UI/AdministrationUI/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/AdministrationUI/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = UI/AdministrationUI/Slovenian.lproj/Localizable.strings
|
||||
@@ -251,6 +278,7 @@ trans.sr = UI/AdministrationUI/Serbian.lproj/Localizable.strings
|
||||
trans.sv = UI/AdministrationUI/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = UI/AdministrationUI/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = UI/AdministrationUI/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = UI/AdministrationUI/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/AdministrationUI/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.soobjects-appointments]
|
||||
@@ -272,7 +300,9 @@ trans.hr_HR = SoObjects/Appointments/Croatian.lproj/Localizable.strings
|
||||
trans.hu = SoObjects/Appointments/Hungarian.lproj/Localizable.strings
|
||||
trans.is = SoObjects/Appointments/Icelandic.lproj/Localizable.strings
|
||||
trans.it = SoObjects/Appointments/Italian.lproj/Localizable.strings
|
||||
trans.ja = SoObjects/Appointments/Japanese.lproj/Localizable.strings
|
||||
trans.lt = SoObjects/Appointments/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = SoObjects/Appointments/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = SoObjects/Appointments/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = SoObjects/Appointments/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = SoObjects/Appointments/Dutch.lproj/Localizable.strings
|
||||
@@ -280,6 +310,7 @@ trans.nn_NO = SoObjects/Appointments/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = SoObjects/Appointments/Polish.lproj/Localizable.strings
|
||||
trans.pt = SoObjects/Appointments/Portuguese.lproj/Localizable.strings
|
||||
trans.pt_BR = SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ro_RO = SoObjects/Appointments/Romanian.lproj/Localizable.strings
|
||||
trans.ru = SoObjects/Appointments/Russian.lproj/Localizable.strings
|
||||
trans.sk = SoObjects/Appointments/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = SoObjects/Appointments/Slovenian.lproj/Localizable.strings
|
||||
@@ -287,6 +318,7 @@ trans.sr = SoObjects/Appointments/Serbian.lproj/Localizable.strings
|
||||
trans.sv = SoObjects/Appointments/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = SoObjects/Appointments/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = SoObjects/Appointments/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = SoObjects/Appointments/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = SoObjects/Appointments/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.soobjects-contacts]
|
||||
@@ -308,7 +340,9 @@ trans.hr_HR = SoObjects/Contacts/Croatian.lproj/Localizable.strings
|
||||
trans.hu = SoObjects/Contacts/Hungarian.lproj/Localizable.strings
|
||||
trans.is = SoObjects/Contacts/Icelandic.lproj/Localizable.strings
|
||||
trans.it = SoObjects/Contacts/Italian.lproj/Localizable.strings
|
||||
trans.ja = SoObjects/Contacts/Japanese.lproj/Localizable.strings
|
||||
trans.lt = SoObjects/Contacts/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = SoObjects/Contacts/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = SoObjects/Contacts/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = SoObjects/Contacts/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = SoObjects/Contacts/Dutch.lproj/Localizable.strings
|
||||
@@ -316,6 +350,7 @@ trans.nn_NO = SoObjects/Contacts/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = SoObjects/Contacts/Polish.lproj/Localizable.strings
|
||||
trans.pt = SoObjects/Contacts/Portuguese.lproj/Localizable.strings
|
||||
trans.pt_BR = SoObjects/Contacts/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ro_RO = SoObjects/Contacts/Romanian.lproj/Localizable.strings
|
||||
trans.ru = SoObjects/Contacts/Russian.lproj/Localizable.strings
|
||||
trans.sk = SoObjects/Contacts/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = SoObjects/Contacts/Slovenian.lproj/Localizable.strings
|
||||
@@ -323,6 +358,7 @@ trans.sr = SoObjects/Contacts/Serbian.lproj/Localizable.strings
|
||||
trans.sv = SoObjects/Contacts/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = SoObjects/Contacts/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = SoObjects/Contacts/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = SoObjects/Contacts/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = SoObjects/Contacts/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.soobjects-mailer]
|
||||
@@ -344,7 +380,9 @@ trans.hr_HR = SoObjects/Mailer/Croatian.lproj/Localizable.strings
|
||||
trans.hu = SoObjects/Mailer/Hungarian.lproj/Localizable.strings
|
||||
trans.is = SoObjects/Mailer/Icelandic.lproj/Localizable.strings
|
||||
trans.it = SoObjects/Mailer/Italian.lproj/Localizable.strings
|
||||
trans.ja = SoObjects/Mailer/Japanese.lproj/Localizable.strings
|
||||
trans.lt = SoObjects/Mailer/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = SoObjects/Mailer/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = SoObjects/Mailer/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = SoObjects/Mailer/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = SoObjects/Mailer/Dutch.lproj/Localizable.strings
|
||||
@@ -352,6 +390,7 @@ trans.nn_NO = SoObjects/Mailer/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = SoObjects/Mailer/Polish.lproj/Localizable.strings
|
||||
trans.pt = SoObjects/Mailer/Portuguese.lproj/Localizable.strings
|
||||
trans.pt_BR = SoObjects/Mailer/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ro_RO = SoObjects/Mailer/Romanian.lproj/Localizable.strings
|
||||
trans.ru = SoObjects/Mailer/Russian.lproj/Localizable.strings
|
||||
trans.sk = SoObjects/Mailer/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = SoObjects/Mailer/Slovenian.lproj/Localizable.strings
|
||||
@@ -359,6 +398,7 @@ trans.sr = SoObjects/Mailer/Serbian.lproj/Localizable.strings
|
||||
trans.sv = SoObjects/Mailer/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = SoObjects/Mailer/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = SoObjects/Mailer/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = SoObjects/Mailer/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = SoObjects/Mailer/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-mailpartviewers]
|
||||
@@ -380,7 +420,9 @@ trans.hr_HR = UI/MailPartViewers/Croatian.lproj/Localizable.strings
|
||||
trans.hu = UI/MailPartViewers/Hungarian.lproj/Localizable.strings
|
||||
trans.is = UI/MailPartViewers/Icelandic.lproj/Localizable.strings
|
||||
trans.it = UI/MailPartViewers/Italian.lproj/Localizable.strings
|
||||
trans.ja = UI/MailPartViewers/Japanese.lproj/Localizable.strings
|
||||
trans.lt = UI/MailPartViewers/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = UI/MailPartViewers/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = UI/MailPartViewers/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = UI/MailPartViewers/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = UI/MailPartViewers/Dutch.lproj/Localizable.strings
|
||||
@@ -388,6 +430,7 @@ trans.nn_NO = UI/MailPartViewers/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = UI/MailPartViewers/Polish.lproj/Localizable.strings
|
||||
trans.pt = UI/MailPartViewers/Portuguese.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ro_RO = UI/MailPartViewers/Romanian.lproj/Localizable.strings
|
||||
trans.ru = UI/MailPartViewers/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/MailPartViewers/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = UI/MailPartViewers/Slovenian.lproj/Localizable.strings
|
||||
@@ -395,4 +438,5 @@ trans.sr = UI/MailPartViewers/Serbian.lproj/Localizable.strings
|
||||
trans.sv = UI/MailPartViewers/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = UI/MailPartViewers/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = UI/MailPartViewers/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = UI/MailPartViewers/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/MailPartViewers/ChineseTaiwan.lproj/Localizable.strings
|
||||
@@ -34,6 +34,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
static NSArray *asElementArray = nil;
|
||||
static NSArray *considerAsSameArray = nil;
|
||||
|
||||
@implementation NGDOMElement (ActiveSync)
|
||||
|
||||
@@ -101,7 +102,44 @@ static NSArray *asElementArray = nil;
|
||||
int i, count;
|
||||
|
||||
if (!asElementArray)
|
||||
asElementArray = [[NSArray alloc] initWithObjects: @"Attendee", @"Category", @"Exception", nil];
|
||||
asElementArray = [[NSArray alloc] initWithObjects: @"Attendee", @"Category", @"Exception", @"Add", @"Delete", nil];
|
||||
|
||||
// FIXME
|
||||
/* if the client sends
|
||||
<attachments>
|
||||
<add>
|
||||
...
|
||||
</add>
|
||||
<add>
|
||||
...
|
||||
</add>
|
||||
</attachments>
|
||||
|
||||
the result is a NSarray i.e. {add1; add2; ...}
|
||||
|
||||
if the client sends
|
||||
|
||||
<attachments>
|
||||
<add>
|
||||
...
|
||||
</add>
|
||||
<add>
|
||||
...
|
||||
</add>
|
||||
<delete>
|
||||
...
|
||||
</delete>
|
||||
<delete>
|
||||
...
|
||||
</delete>
|
||||
</attachments>
|
||||
|
||||
|
||||
the result is a NSDictionary ie. Add = { }; Delete = { }; the dictionary would contain only one entry for add
|
||||
*/
|
||||
if (!considerAsSameArray)
|
||||
considerAsSameArray = [[NSArray alloc] initWithObjects: @"Add", @"Delete", nil];
|
||||
|
||||
|
||||
data = [NSMutableDictionary dictionary];
|
||||
|
||||
@@ -151,7 +189,7 @@ static NSArray *asElementArray = nil;
|
||||
if (!innerTag)
|
||||
innerTag = [innerElement tagName];
|
||||
|
||||
if ([innerTag isEqualToString: [innerElement tagName]])
|
||||
if ([innerTag isEqualToString: [innerElement tagName]] || [considerAsSameArray containsObject: innerTag])
|
||||
{
|
||||
if ([(id)innerElement isTextNode])
|
||||
[innerElements addObject: [(NGDOMElement *)innerElement textValue]];
|
||||
|
||||
@@ -53,9 +53,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import <SOGo/SOGoCacheGCSObject.h>
|
||||
#import <SOGo/SOGoPermissions.h>
|
||||
|
||||
#import <NGCards/iCalCalendar.h>
|
||||
|
||||
#import <Appointments/iCalEntityObject+SOGo.h>
|
||||
#import <Appointments/SOGoAppointmentObject.h>
|
||||
#import <Appointments/SOGoTaskObject.h>
|
||||
#import <Appointments/SOGoAppointmentFolder.h>
|
||||
|
||||
#import <Contacts/SOGoContactGCSEntry.h>
|
||||
|
||||
@@ -149,7 +152,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
processIdentifierInCache = [[self globalMetadataForDevice] objectForKey: key];
|
||||
|
||||
// Don't update the cache if another request is processing the same collection.
|
||||
// I case of a merged folder we have to check personal folder's lock.
|
||||
// In case of a merged folder we have to check personal folder's lock.
|
||||
a = [key componentsSeparatedByString: @"/"];
|
||||
pkey = [NSString stringWithFormat: @"%@/personal", [a objectAtIndex:0]];
|
||||
|
||||
@@ -227,7 +230,26 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
return nameInCache;
|
||||
}
|
||||
|
||||
- (void) _removeAllAlarmsFromCalendar: (iCalCalendar *) theCalendar
|
||||
{
|
||||
NSArray *allComponents;
|
||||
iCalEntityObject *currentComponent;
|
||||
NSUInteger count, max;
|
||||
|
||||
if (debugOn)
|
||||
[self logWithFormat: @"EAS - Remove all alarms"];
|
||||
|
||||
allComponents = [theCalendar allObjects];
|
||||
|
||||
max = [allComponents count];
|
||||
for (count = 0; count < max; count++)
|
||||
{
|
||||
currentComponent = [allComponents objectAtIndex: count];
|
||||
if ([currentComponent isKindOfClass: [iCalEvent class]] ||
|
||||
[currentComponent isKindOfClass: [iCalToDo class]])
|
||||
[currentComponent removeAllAlarms];
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// <?xml version="1.0"?>
|
||||
@@ -289,8 +311,34 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
anAddition = [additions objectAtIndex: i];
|
||||
is_new = YES;
|
||||
|
||||
clientId = [[(id)[anAddition getElementsByTagName: @"ClientId"] lastObject] textValue];
|
||||
|
||||
/*
|
||||
FIXME
|
||||
<Add>
|
||||
<ClientId>338</ClientId>
|
||||
<ApplicationData>
|
||||
<To xmlns="Email:"><foot@bar.com></To>
|
||||
<Cc xmlns="Email:"/>
|
||||
<Subject xmlns="Email:">test</Subject>
|
||||
<Reply-To xmlns="Email:">foo@bar.com</Reply-To>
|
||||
<Importance xmlns="Email:">1</Importance>
|
||||
<Read xmlns="Email:">1</Read>
|
||||
<Attachments xmlns="AirSyncBase:">
|
||||
<Add>
|
||||
<ClientId>152-ab557915-8451-49a7-a9c6-a9ac153021ad</ClientId>
|
||||
|
||||
|
||||
-> lastObject returns the ClientId in Attachments element -> try with objectAtIndex: 0 -> is this correct?
|
||||
*/
|
||||
//clientId = [[(id)[anAddition getElementsByTagName: @"ClientId"] lastObject] textValue];
|
||||
clientId = [[(id)[anAddition getElementsByTagName: @"ClientId"] objectAtIndex: 0] textValue];
|
||||
|
||||
allValues = [NSMutableDictionary dictionaryWithDictionary: [[(id)[anAddition getElementsByTagName: @"ApplicationData"] lastObject] applicationData]];
|
||||
|
||||
// FIXME: ignore the <Add> elements of Attachemnts - above (id)[theDocumentElement getElementsByTagName: @"Add"]; return any <Add> elements instead of only the direct childs of the <commands> element ..
|
||||
if (![allValues count])
|
||||
continue;
|
||||
|
||||
|
||||
switch (theFolderType)
|
||||
{
|
||||
@@ -309,8 +357,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
// the case, let's just update it. This can happen if for example, an iOS based device receives the
|
||||
// invitation email and choses "Add to calendar" BEFORE actually syncing the calendar. That would
|
||||
// create a duplicate on the server.
|
||||
if ([allValues objectForKey: @"UID"])
|
||||
serverId = [allValues objectForKey: @"UID"];
|
||||
if ([allValues objectForKey: ([[context objectForKey: @"ASProtocolVersion"] floatValue] >= 16.0) ? @"ClientUid" : @"UID"])
|
||||
serverId = [allValues objectForKey: ([[context objectForKey: @"ASProtocolVersion"] floatValue] >= 16.0) ? @"ClientUid" : @"UID"];
|
||||
else
|
||||
serverId = [theCollection globallyUniqueObjectId];
|
||||
|
||||
@@ -345,9 +393,49 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
case ActiveSyncMailFolder:
|
||||
default:
|
||||
{
|
||||
// FIXME - what to do?
|
||||
[self errorWithFormat: @"Fatal error occured - tried to call -processSyncAddCommand: ... on a mail folder. We abort."];
|
||||
abort();
|
||||
// Support Draft Mail/SMS to Exchange eMail sync.
|
||||
NSString *serverId;
|
||||
NSMutableString *s;
|
||||
NSDictionary *result;
|
||||
NSNumber *modseq;
|
||||
|
||||
serverId = nil;
|
||||
s = [NSMutableString string];
|
||||
|
||||
sogoObject = [SOGoMailObject objectWithName: @"Mail" inContainer: theCollection];
|
||||
serverId = [sogoObject storeMail: allValues inBuffer: s inContext: context];
|
||||
if (serverId)
|
||||
{
|
||||
sogoObject = [theCollection lookupName: serverId inContext: context acquire: 0];
|
||||
[sogoObject takeActiveSyncValues: allValues inContext: context];
|
||||
|
||||
// Everything is fine, lets generate our response
|
||||
[theBuffer appendString: @"<Add>"];
|
||||
[theBuffer appendFormat: @"<ClientId>%@</ClientId>", clientId];
|
||||
[theBuffer appendFormat: @"<ServerId>%@</ServerId>", serverId];
|
||||
[theBuffer appendFormat: @"<Status>%d</Status>", 1];
|
||||
[theBuffer appendString: s];
|
||||
[theBuffer appendString: @"</Add>"];
|
||||
|
||||
|
||||
folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: theCollection withType: theFolderType]];
|
||||
syncCache = [folderMetadata objectForKey: @"SyncCache"];
|
||||
|
||||
result = [sogoObject fetchParts: [NSArray arrayWithObject: @"MODSEQ"]];
|
||||
modseq = [[[result objectForKey: @"RawResponse"] objectForKey: @"fetch"] objectForKey: @"modseq"];
|
||||
|
||||
[syncCache setObject: [modseq stringValue] forKey: serverId];
|
||||
|
||||
[self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]];
|
||||
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
// FIXME - what to do?
|
||||
[self errorWithFormat: @"Fatal error occured - tried to call -processSyncAddCommand: ... on a mail folder. We abort."];
|
||||
abort();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -624,6 +712,24 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
NSDictionary *result;
|
||||
NSNumber *modseq;
|
||||
|
||||
// Process an update to a Draft Mail.
|
||||
if ([allChanges objectForKey: @"Body"])
|
||||
{
|
||||
NSString *serverId;
|
||||
NSMutableString *s;
|
||||
|
||||
serverId = nil;
|
||||
s = [NSMutableString string];
|
||||
|
||||
serverId = [sogoObject storeMail: allChanges inBuffer: s inContext: context];
|
||||
if (serverId)
|
||||
{
|
||||
// we delete the original email - next sync will update the client with the new mail
|
||||
[sogoObject delete];
|
||||
sogoObject = [theCollection lookupName: serverId inContext: context acquire: 0];
|
||||
}
|
||||
}
|
||||
|
||||
[sogoObject takeActiveSyncValues: allChanges inContext: context];
|
||||
|
||||
result = [sogoObject fetchParts: [NSArray arrayWithObject: @"MODSEQ"]];
|
||||
@@ -638,7 +744,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
[theBuffer appendString: @"<Change>"];
|
||||
[theBuffer appendFormat: @"<ServerId>%@</ServerId>", origServerId];
|
||||
[theBuffer appendFormat: @"<Status>%d</Status>", 1];
|
||||
|
||||
// A body element is sent only for draft mails - status 8 will delete the mail on the client - the next sync update fetch the new mail
|
||||
if ([allChanges objectForKey: @"Body"] && theFolderType == ActiveSyncMailFolder)
|
||||
[theBuffer appendFormat: @"<Status>%d</Status>", 8];
|
||||
else
|
||||
[theBuffer appendFormat: @"<Status>%d</Status>", 1];
|
||||
|
||||
[theBuffer appendString: @"</Change>"];
|
||||
}
|
||||
}
|
||||
@@ -760,7 +872,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
// FIXME: handle errors here
|
||||
if (deletesAsMoves && theFolderType == ActiveSyncMailFolder)
|
||||
{
|
||||
[(SOGoMailFolder *)[sogoObject container] deleteUIDs: [NSArray arrayWithObjects: serverId, nil] useTrashFolder: &useTrash inContext: context];
|
||||
[(SOGoMailFolder *)[sogoObject container] deleteUIDs: [NSArray arrayWithObjects: serverId, nil]
|
||||
useTrashFolder: &useTrash
|
||||
inContext: context];
|
||||
}
|
||||
else if (theFolderType == ActiveSyncEventFolder || theFolderType == ActiveSyncTaskFolder || theFolderType == ActiveSyncContactFolder)
|
||||
{
|
||||
@@ -1221,6 +1335,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
d = [NSCalendarDate distantFuture];
|
||||
|
||||
[dateCache setObject: d forKey: uid];
|
||||
|
||||
if (!([theCollection showCalendarAlarms]))
|
||||
[self _removeAllAlarmsFromCalendar: [componentObject parent]];
|
||||
}
|
||||
|
||||
if (updated)
|
||||
@@ -1334,7 +1451,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
}
|
||||
}
|
||||
|
||||
allMessages = [theCollection syncTokenFieldsWithProperties: nil matchingSyncToken: theSyncKey fromDate: theFilterType initialLoad: initialLoadInProgress];
|
||||
allMessages = [theCollection syncTokenFieldsWithProperties: nil
|
||||
matchingSyncToken: theSyncKey
|
||||
fromDate: theFilterType
|
||||
initialLoad: initialLoadInProgress];
|
||||
max = [allMessages count];
|
||||
|
||||
allCacheObjects = [NSMutableArray array];
|
||||
@@ -1581,7 +1701,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
[s appendString: [mailObject activeSyncRepresentationInContext: context]];
|
||||
[s appendString: @"</ApplicationData>"];
|
||||
[s appendString: @"</Add>"];
|
||||
|
||||
|
||||
[syncCache setObject: [aCacheObject sequence] forKey: [aCacheObject uid]];
|
||||
[dateCache setObject: [NSCalendarDate date] forKey: [aCacheObject uid]];
|
||||
|
||||
@@ -2479,9 +2599,36 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
// We enter our loop detection change
|
||||
for (i = 0; i < (heartbeatInterval/internalInterval); i++)
|
||||
{
|
||||
// Terminate the process if we need to
|
||||
if ([self easShouldTerminate])
|
||||
break;
|
||||
|
||||
// We first check of any of the collections we want to sync are already
|
||||
// in an other sync process. If that's the case, we do not do anything
|
||||
// and we return immediately. So we'll let the other sync process terminate
|
||||
for (j = 0; j < [allCollections count]; j++)
|
||||
{
|
||||
aCollection = [allCollections objectAtIndex: j];
|
||||
globalMetadata = [self globalMetadataForDevice];
|
||||
|
||||
key = [NSString stringWithFormat: @"SyncRequest+%@", [[[(id)[aCollection getElementsByTagName: @"CollectionId"] lastObject] textValue] stringByUnescapingURL]];
|
||||
|
||||
if (!([[globalMetadata objectForKey: key] isEqual: processIdentifier]))
|
||||
{
|
||||
if (debugOn)
|
||||
[self logWithFormat: @"EAS - Discard response %@", [self globalMetadataForDevice]];
|
||||
|
||||
[output appendString: @"<Status>13</Status>"];
|
||||
[output appendString: @"</Sync>"];
|
||||
d = [[output dataUsingEncoding: NSUTF8StringEncoding] xml2wbxml];
|
||||
[theResponse setContent: d];
|
||||
RELEASE(output);
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// We're good to go to sync the collections
|
||||
s = [NSMutableString string];
|
||||
|
||||
for (j = 0; j < [allCollections count]; j++)
|
||||
@@ -2493,21 +2640,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
changeDetected: &changeDetected
|
||||
maxSyncResponseSize: maxSyncResponseSize];
|
||||
|
||||
// Don't return a response if another Sync is waiting.
|
||||
globalMetadata = [self globalMetadataForDevice];
|
||||
key = [NSString stringWithFormat: @"SyncRequest+%@", [[[(id)[aCollection getElementsByTagName: @"CollectionId"] lastObject] textValue] stringByUnescapingURL]];
|
||||
|
||||
if (!([[globalMetadata objectForKey: key] isEqual: processIdentifier]))
|
||||
{
|
||||
if (debugOn)
|
||||
[self logWithFormat: @"EAS - Discard response %@", [self globalMetadataForDevice]];
|
||||
|
||||
[theResponse setStatus: 503];
|
||||
|
||||
RELEASE(output);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((maxSyncResponseSize > 0 && [s length] >= maxSyncResponseSize))
|
||||
break;
|
||||
}
|
||||
@@ -2540,7 +2672,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
{
|
||||
int t;
|
||||
|
||||
[self logWithFormat: @"Sleeping %d seconds while detecting changes in Sync...", internalInterval-total_sleep];
|
||||
[self logWithFormat: @"Sleeping %d seconds while detecting changes for user %@ in Sync...", internalInterval-total_sleep, [[context activeUser] login]];
|
||||
|
||||
for (t = 0; t < sleepInterval; t++)
|
||||
{
|
||||
|
||||
@@ -271,6 +271,39 @@ void handle_eas_terminate(int signum)
|
||||
return theIdToTranslate;
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
- (SOGoAppointmentObject *) _eventObjectWithUID: (NSString *) uid
|
||||
{
|
||||
SOGoAppointmentFolder *folder;
|
||||
SOGoAppointmentObject *eventObject;
|
||||
NSArray *folders;
|
||||
NSEnumerator *e;
|
||||
NSString *cname;
|
||||
|
||||
eventObject = nil;
|
||||
|
||||
folders = [[[context activeUser] calendarsFolderInContext: context] subFolders];
|
||||
e = [folders objectEnumerator];
|
||||
while (eventObject == nil && (folder = [e nextObject]))
|
||||
{
|
||||
cname = [folder resourceNameForEventUID: uid];
|
||||
if (cname)
|
||||
{
|
||||
eventObject = [folder lookupName: cname inContext: context
|
||||
acquire: NO];
|
||||
if ([eventObject isKindOfClass: [NSException class]])
|
||||
eventObject = nil;
|
||||
}
|
||||
}
|
||||
|
||||
if (eventObject)
|
||||
return eventObject;
|
||||
else
|
||||
return [NSException exceptionWithHTTPStatus:404 /* Not Found */];
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
@@ -741,14 +774,14 @@ void handle_eas_terminate(int signum)
|
||||
{
|
||||
[[theFolders objectAtIndex: i] setObject: theExistingParent forKey: @"parent"];
|
||||
[[theFolders objectAtIndex: i] setObject:
|
||||
[[[[theFolders objectAtIndex: i] objectForKey: @"path"] substringFromIndex: [theExistingParent length]+1]stringByReplacingOccurrencesOfString:@"/" withString:@"."]
|
||||
[[[[[theFolders objectAtIndex: i] objectForKey: @"path"] substringFromIndex: [theExistingParent length]+1]stringByReplacingOccurrencesOfString:@"/" withString:@"."] stringByDecodingImap4FolderName]
|
||||
forKey: @"name"];
|
||||
}
|
||||
else if (![[[theFolders objectAtIndex: i] objectForKey: @"type"] isEqualToString: @"otherUsers"] &&
|
||||
![[[theFolders objectAtIndex: i] objectForKey: @"type"] isEqualToString: @"shared"])
|
||||
{
|
||||
[[theFolders objectAtIndex: i] setObject:
|
||||
[[[theFolders objectAtIndex: i] objectForKey: @"path"] stringByReplacingOccurrencesOfString:@"/" withString:@"."]
|
||||
[[[[theFolders objectAtIndex: i] objectForKey: @"path"] stringByReplacingOccurrencesOfString:@"/" withString:@"."] stringByDecodingImap4FolderName]
|
||||
forKey: @"name"];
|
||||
}
|
||||
|
||||
@@ -1151,38 +1184,45 @@ void handle_eas_terminate(int signum)
|
||||
|
||||
name = [NSString stringWithFormat: @"vtodo/%@", [[folders objectAtIndex:fi] nameInContainer]];
|
||||
type = ([[[folders objectAtIndex:fi] nameInContainer] isEqualToString: personalFolderName] ? 7 : 15);
|
||||
[commands appendFormat: @"<%@><ServerId>%@</ServerId><ParentId>%@</ParentId><DisplayName>%@</DisplayName><Type>%d</Type></%@>", operation,
|
||||
[name stringByEscapingURL], @"0", [[[folders objectAtIndex:fi] displayName] activeSyncRepresentationInContext: context], type, operation];
|
||||
|
||||
command_count++;
|
||||
key = [NSString stringWithFormat: @"%@+%@", [context objectForKey: @"DeviceId"], name];
|
||||
|
||||
o = [SOGoCacheGCSObject objectWithName: key inContainer: nil];
|
||||
[o setObjectType: ActiveSyncFolderCacheObject];
|
||||
[o setTableUrl: [self folderTableURL]];
|
||||
[o reloadIfNeeded];
|
||||
[[o properties ] setObject: [[folders objectAtIndex:fi] displayName] forKey: @"displayName"];
|
||||
|
||||
if ([operation isEqualToString: @"Add"])
|
||||
// We always sync the "Default Tasks folder" (7). For "User-created Tasks folder" (15), we check if we include it in
|
||||
// the sync process by checking if "Show tasks" is enabled. If not, we skip the folder entirely.
|
||||
if (type == 7 ||
|
||||
(type == 15 && [[folders objectAtIndex: fi] showCalendarTasks]))
|
||||
{
|
||||
// clean cache content to avoid stale data
|
||||
[[o properties] removeObjectForKey: @"SyncKey"];
|
||||
[[o properties] removeObjectForKey: @"SyncCache"];
|
||||
[[o properties] removeObjectForKey: @"DateCache"];
|
||||
[[o properties] removeObjectForKey: @"UidCache"];
|
||||
[[o properties] removeObjectForKey: @"MoreAvailable"];
|
||||
[[o properties] removeObjectForKey: @"BodyPreferenceType"];
|
||||
[[o properties] removeObjectForKey: @"SupportedElements"];
|
||||
[[o properties] removeObjectForKey: @"SuccessfulMoveItemsOps"];
|
||||
[[o properties] removeObjectForKey: @"InitialLoadSequence"];
|
||||
[[o properties] removeObjectForKey: @"FirstIdInCache"];
|
||||
[[o properties] removeObjectForKey: @"LastIdInCache"];
|
||||
[[o properties] removeObjectForKey: @"MergedFoldersSyncKeys"];
|
||||
[[o properties] removeObjectForKey: @"MergedFolder"];
|
||||
[[o properties] removeObjectForKey: @"CleanoutDate"];
|
||||
}
|
||||
[commands appendFormat: @"<%@><ServerId>%@</ServerId><ParentId>%@</ParentId><DisplayName>%@</DisplayName><Type>%d</Type></%@>", operation,
|
||||
[name stringByEscapingURL], @"0", [[[folders objectAtIndex:fi] displayName] activeSyncRepresentationInContext: context], type, operation];
|
||||
|
||||
[o save];
|
||||
command_count++;
|
||||
|
||||
key = [NSString stringWithFormat: @"%@+%@", [context objectForKey: @"DeviceId"], name];
|
||||
o = [SOGoCacheGCSObject objectWithName: key inContainer: nil];
|
||||
[o setObjectType: ActiveSyncFolderCacheObject];
|
||||
[o setTableUrl: [self folderTableURL]];
|
||||
[o reloadIfNeeded];
|
||||
[[o properties ] setObject: [[folders objectAtIndex:fi] displayName] forKey: @"displayName"];
|
||||
|
||||
if ([operation isEqualToString: @"Add"])
|
||||
{
|
||||
// clean cache content to avoid stale data
|
||||
[[o properties] removeObjectForKey: @"SyncKey"];
|
||||
[[o properties] removeObjectForKey: @"SyncCache"];
|
||||
[[o properties] removeObjectForKey: @"DateCache"];
|
||||
[[o properties] removeObjectForKey: @"UidCache"];
|
||||
[[o properties] removeObjectForKey: @"MoreAvailable"];
|
||||
[[o properties] removeObjectForKey: @"BodyPreferenceType"];
|
||||
[[o properties] removeObjectForKey: @"SupportedElements"];
|
||||
[[o properties] removeObjectForKey: @"SuccessfulMoveItemsOps"];
|
||||
[[o properties] removeObjectForKey: @"InitialLoadSequence"];
|
||||
[[o properties] removeObjectForKey: @"FirstIdInCache"];
|
||||
[[o properties] removeObjectForKey: @"LastIdInCache"];
|
||||
[[o properties] removeObjectForKey: @"MergedFoldersSyncKeys"];
|
||||
[[o properties] removeObjectForKey: @"MergedFolder"];
|
||||
[[o properties] removeObjectForKey: @"CleanoutDate"];
|
||||
}
|
||||
|
||||
[o save];
|
||||
}
|
||||
}
|
||||
else if ([[folders objectAtIndex:fi] isKindOfClass: [SOGoContactGCSFolder class]])
|
||||
{
|
||||
@@ -1215,8 +1255,8 @@ void handle_eas_terminate(int signum)
|
||||
|
||||
[o save];
|
||||
}
|
||||
}
|
||||
}
|
||||
} // if (operation)
|
||||
} // for (fi = 0; fi <= count ; fi++)
|
||||
|
||||
|
||||
// set a new syncKey if there are folder changes
|
||||
@@ -1815,6 +1855,9 @@ void handle_eas_terminate(int signum)
|
||||
inContext: context
|
||||
acquire: NO];
|
||||
|
||||
if ([appointmentObject isKindOfClass: [NSException class]])
|
||||
appointmentObject = [self _eventObjectWithUID:[event uid]];
|
||||
|
||||
// Create the appointment if it is not added to calendar yet
|
||||
if ([appointmentObject isKindOfClass: [NSException class]])
|
||||
{
|
||||
@@ -2383,6 +2426,11 @@ void handle_eas_terminate(int signum)
|
||||
realCollectionId = [collectionId realCollectionIdWithFolderType: &folderType];
|
||||
realCollectionId = [self globallyUniqueIDToIMAPFolderName: realCollectionId type: folderType];
|
||||
|
||||
// We avoid loading the cache metadata if we can't get the real connection. This can happen
|
||||
// for example if the IMAP server is down. We just skip the folder for now.
|
||||
if (!realCollectionId)
|
||||
continue;
|
||||
|
||||
if (folderType == ActiveSyncMailFolder)
|
||||
folderMetadata = [self _folderMetadataForKey: [NSString stringWithFormat: @"folder%@", [[collectionId stringByUnescapingURL] substringFromIndex:5]]];
|
||||
else
|
||||
@@ -2432,7 +2480,7 @@ void handle_eas_terminate(int signum)
|
||||
{
|
||||
int t;
|
||||
|
||||
[self logWithFormat: @"Sleeping %d seconds while detecting changes in Ping...", internalInterval-total_sleep];
|
||||
[self logWithFormat: @"Sleeping %d seconds while detecting changes for user %@ in Ping...", internalInterval-total_sleep, [[context activeUser] login]];
|
||||
|
||||
for (t = 0; t < sleepInterval; t++)
|
||||
{
|
||||
@@ -2759,7 +2807,7 @@ void handle_eas_terminate(int signum)
|
||||
inResponse: (WOResponse *) theResponse
|
||||
{
|
||||
SOGoContactSourceFolder *currentFolder;
|
||||
NSArray *allKeys, *allContacts, *mails;
|
||||
NSArray *allKeys, *allContacts, *mails, *a;
|
||||
NSDictionary *systemSources, *contact;
|
||||
SOGoContactFolders *contactFolders;
|
||||
NSString *current_mail, *query;
|
||||
@@ -2769,7 +2817,10 @@ void handle_eas_terminate(int signum)
|
||||
NSData *d;
|
||||
id o;
|
||||
|
||||
int i, j, total;
|
||||
int i, j, t, v, total, minResult, maxResult, maxSize, maxPictures;
|
||||
BOOL withPhoto;
|
||||
|
||||
withPhoto = NO;
|
||||
|
||||
query = [[(id)[theDocumentElement getElementsByTagName: @"Query"] lastObject] textValue];
|
||||
|
||||
@@ -2778,6 +2829,33 @@ void handle_eas_terminate(int signum)
|
||||
systemSources = [contactFolders systemSources];
|
||||
allKeys = [systemSources allKeys];
|
||||
|
||||
// We check for the maximum number of results to return.
|
||||
a = [[[(id)[theDocumentElement getElementsByTagName: @"Range"] lastObject] textValue] componentsSeparatedByString: @"-"];
|
||||
minResult = [[a objectAtIndex: 0] intValue];
|
||||
maxResult = [[a objectAtIndex: 1] intValue];
|
||||
|
||||
if (maxResult == 0)
|
||||
maxResult = 99;
|
||||
|
||||
if ((o = [(id)[[(id)[theDocumentElement getElementsByTagName: @"Options"] lastObject] getElementsByTagName: @"Picture"] lastObject]))
|
||||
{
|
||||
withPhoto = YES;
|
||||
|
||||
// We check for a MaxSize, default to 102400.
|
||||
maxSize = [[[(id)[o getElementsByTagName: @"MaxSize"] lastObject] textValue] intValue];
|
||||
|
||||
// We check if we must overwrite the maxSize with a system preference. This can be useful
|
||||
// if we don't want to have pictures in the response.
|
||||
if ((v = [[SOGoSystemDefaults sharedSystemDefaults] maximumPictureSize]))
|
||||
maxSize = v;
|
||||
|
||||
// We check for a MaxPictures, default to 99.
|
||||
maxPictures = [[[(id)[o getElementsByTagName: @"MaxPictures"] lastObject] textValue] intValue];
|
||||
|
||||
if (maxPictures == 0)
|
||||
maxPictures = 99;
|
||||
}
|
||||
|
||||
s = [NSMutableString string];
|
||||
|
||||
[s appendString: @"<?xml version=\"1.0\" encoding=\"utf-8\"?>"];
|
||||
@@ -2794,12 +2872,12 @@ void handle_eas_terminate(int signum)
|
||||
{
|
||||
currentFolder = [systemSources objectForKey: [allKeys objectAtIndex: i]];
|
||||
allContacts = [currentFolder lookupContactsWithFilter: query
|
||||
onCriteria: @"name_or_address"
|
||||
onCriteria: nil
|
||||
sortBy: @"c_cn"
|
||||
ordering: NSOrderedAscending
|
||||
inDomain: [[context activeUser] domain]];
|
||||
|
||||
for (j = 0; j < [allContacts count]; j++)
|
||||
for (j = minResult; (j < [allContacts count] && j < maxResult) ; j++)
|
||||
{
|
||||
contact = [allContacts objectAtIndex: j];
|
||||
|
||||
@@ -2817,9 +2895,9 @@ void handle_eas_terminate(int signum)
|
||||
else
|
||||
mails = [NSArray arrayWithObjects: o ? o : @"", nil];
|
||||
|
||||
for (total = 0; total < [mails count]; total++)
|
||||
for (t = 0; t < [mails count]; t++)
|
||||
{
|
||||
current_mail = [mails objectAtIndex: total];
|
||||
current_mail = [mails objectAtIndex: t];
|
||||
|
||||
[s appendString: @"<Result xmlns=\"Search:\">"];
|
||||
[s appendString: @"<Properties>"];
|
||||
@@ -2837,7 +2915,7 @@ void handle_eas_terminate(int signum)
|
||||
[s appendFormat: @"<LastName xmlns=\"Gal:\">%@</LastName>", [o activeSyncRepresentationInContext: context]];
|
||||
|
||||
if ([current_mail length] > 0)
|
||||
[s appendFormat: @"<EmailAddress xmlns=\"Gal:\">%@</EmailAddress>", current_mail];
|
||||
[s appendFormat: @"<EmailAddress xmlns=\"Gal:\">%@</EmailAddress>", [current_mail activeSyncRepresentationInContext: context]];
|
||||
|
||||
if ((o = [contact objectForKey: @"telephonenumber"]))
|
||||
[s appendFormat: @"<Phone xmlns=\"Gal:\">%@</Phone>", [o activeSyncRepresentationInContext: context]];
|
||||
@@ -2850,9 +2928,27 @@ void handle_eas_terminate(int signum)
|
||||
|
||||
if ((o = [contact objectForKey: @"o"]))
|
||||
[s appendFormat: @"<Company xmlns=\"Gal:\">%@</Company>", [o activeSyncRepresentationInContext: context]];
|
||||
|
||||
|
||||
if ([[context objectForKey: @"ASProtocolVersion"] floatValue] >= 14.1 && withPhoto)
|
||||
{
|
||||
o = [contact objectForKey: @"photo"];
|
||||
if (o && [o length] <= maxSize && total < maxPictures)
|
||||
{
|
||||
[s appendString: @"<Picture xmlns=\"Gal:\"><Status>1</Status><Data>"];
|
||||
[s appendString: [o activeSyncRepresentationInContext: context]];
|
||||
[s appendString: @"</Data></Picture>"];
|
||||
}
|
||||
else if (!o)
|
||||
[s appendString: @"<Picture xmlns=\"Gal:\"><Status>173</Status></Picture>"];
|
||||
else if ([o length] > maxSize)
|
||||
[s appendString: @"<Picture xmlns=\"Gal:\"><Status>174</Status></Picture>"];
|
||||
else if (total >= maxPictures)
|
||||
[s appendString: @"<Picture xmlns=\"Gal:\"><Status>175</Status></Picture>"];
|
||||
}
|
||||
|
||||
[s appendString: @"</Properties>"];
|
||||
[s appendString: @"</Result>"];
|
||||
total++;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2945,7 +3041,7 @@ void handle_eas_terminate(int signum)
|
||||
- (void) processSearchMailbox: (id <DOMElement>) theDocumentElement
|
||||
inResponse: (WOResponse *) theResponse
|
||||
{
|
||||
NSString *folderId, *realCollectionId, *itemId;
|
||||
NSString *folderId, *realCollectionId, *itemId, *bodyPreferenceType, *mimeSupport;
|
||||
NSMutableArray *folderIdentifiers;
|
||||
SOGoMailAccounts *accountsFolder;
|
||||
SOGoMailAccount *accountFolder;
|
||||
@@ -2969,6 +3065,13 @@ void handle_eas_terminate(int signum)
|
||||
return;
|
||||
}
|
||||
|
||||
bodyPreferenceType = [[(id)[[(id)[theDocumentElement getElementsByTagName: @"BodyPreference"] lastObject] getElementsByTagName: @"Type"] lastObject] textValue];
|
||||
[context setObject: bodyPreferenceType forKey: @"BodyPreferenceType"];
|
||||
mimeSupport = [[(id)[theDocumentElement getElementsByTagName: @"MIMESupport"] lastObject] textValue];
|
||||
[context setObject: mimeSupport forKey: @"MIMESupport"];
|
||||
|
||||
[context setObject: @"8" forKey: @"MIMETruncation"];
|
||||
|
||||
// FIXME: support more than one CollectionId tag + DeepTraversal
|
||||
folderId = [[(id)[[(id)[theDocumentElement getElementsByTagName: @"Query"] lastObject] getElementsByTagName: @"CollectionId"] lastObject] textValue];
|
||||
folderIdentifiers = [NSMutableArray array];
|
||||
@@ -3541,10 +3644,14 @@ void handle_eas_terminate(int signum)
|
||||
{
|
||||
NSString *folderId, *itemId, *realCollectionId;
|
||||
SOGoMicrosoftActiveSyncFolderType folderType;
|
||||
SOGoMailAccounts *accountsFolder;
|
||||
SOGoMailFolder *currentFolder;
|
||||
SOGoUserFolder *userFolder;
|
||||
SOGoMailObject *mailObject;
|
||||
SOGoUserDefaults *ud;
|
||||
|
||||
BOOL htmlComposition, isHTML;
|
||||
id value;
|
||||
id value, currentCollection;
|
||||
|
||||
isHTML = NO;
|
||||
ud = [[context activeUser] userDefaults];
|
||||
@@ -3570,23 +3677,31 @@ void handle_eas_terminate(int signum)
|
||||
|
||||
value = [theDocumentElement getElementsByTagName: @"ReplaceMime"];
|
||||
|
||||
// We fetch the mail object from the server
|
||||
userFolder = [[context activeUser] homeFolderInContext: context];
|
||||
accountsFolder = [userFolder lookupName: @"Mail" inContext: context acquire: NO];
|
||||
currentFolder = [accountsFolder lookupName: @"0" inContext: context acquire: NO];
|
||||
|
||||
currentCollection = [currentFolder lookupName: [NSString stringWithFormat: @"folder%@", realCollectionId]
|
||||
inContext: context
|
||||
acquire: NO];
|
||||
|
||||
mailObject = [currentCollection lookupName: itemId inContext: context acquire: NO];
|
||||
|
||||
// ReplaceMime IS specified so we must NOT use the server copy
|
||||
// but rather take the data as-is from the client.
|
||||
if ([value count])
|
||||
{
|
||||
[self processSendMail: theDocumentElement
|
||||
inResponse: theResponse];
|
||||
[self processSendMail: theDocumentElement inResponse: theResponse];
|
||||
if (!isSmartForward)
|
||||
[mailObject addFlags: @"Answered"];
|
||||
else
|
||||
[mailObject addFlags: @"$Forwarded"];
|
||||
return;
|
||||
}
|
||||
|
||||
if (folderType == ActiveSyncMailFolder)
|
||||
{
|
||||
SOGoMailAccounts *accountsFolder;
|
||||
SOGoMailFolder *currentFolder;
|
||||
SOGoUserFolder *userFolder;
|
||||
SOGoMailObject *mailObject;
|
||||
id currentCollection;
|
||||
|
||||
NGMimeMessage *messageFromSmartForward, *messageToSend;
|
||||
NGMimeMessageParser *parser;
|
||||
NSData *data;
|
||||
@@ -3605,16 +3720,6 @@ void handle_eas_terminate(int signum)
|
||||
|
||||
int a;
|
||||
|
||||
userFolder = [[context activeUser] homeFolderInContext: context];
|
||||
accountsFolder = [userFolder lookupName: @"Mail" inContext: context acquire: NO];
|
||||
currentFolder = [accountsFolder lookupName: @"0" inContext: context acquire: NO];
|
||||
|
||||
currentCollection = [currentFolder lookupName: [NSString stringWithFormat: @"folder%@", realCollectionId]
|
||||
inContext: context
|
||||
acquire: NO];
|
||||
|
||||
mailObject = [currentCollection lookupName: itemId inContext: context acquire: NO];
|
||||
|
||||
parser = [[NGMimeMessageParser alloc] init];
|
||||
data = [[[[(id)[theDocumentElement getElementsByTagName: @"MIME"] lastObject] textValue] stringByDecodingBase64] dataUsingEncoding: NSUTF8StringEncoding];
|
||||
messageFromSmartForward = [parser parsePartFromData: data];
|
||||
|
||||
@@ -42,6 +42,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
- (NSString *) activeSyncRepresentationInContext: (WOContext *) context;
|
||||
- (void) takeActiveSyncValues: (NSDictionary *) theValues
|
||||
inContext: (WOContext *) context;
|
||||
- (NSString *) storeMail: (NSDictionary *) theValues
|
||||
inBuffer: (NSMutableString *) theBuffer
|
||||
inContext: (WOContext *) _context;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@@ -34,6 +34,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import <Foundation/NSException.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSCharacterSet.h>
|
||||
#import <Foundation/NSTimeZone.h>
|
||||
|
||||
#import <NGCards/iCalCalendar.h>
|
||||
#import <NGCards/iCalDateTime.h>
|
||||
@@ -44,9 +45,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#import <NGExtensions/NSString+misc.h>
|
||||
#import <NGExtensions/NSString+Encoding.h>
|
||||
#import <NGExtensions/NGHashMap.h>
|
||||
#import <NGImap4/NGImap4Envelope.h>
|
||||
#import <NGImap4/NGImap4EnvelopeAddress.h>
|
||||
#import <NGImap4/NSString+Imap4.h>
|
||||
#import <NGImap4/NGImap4Connection.h>
|
||||
#import <NGImap4/NGImap4Client.h>
|
||||
#import <NGObjWeb/WOContext+SoObjects.h>
|
||||
#import <NGObjWeb/WOApplication.h>
|
||||
#import <NGObjWeb/WORequest.h>
|
||||
@@ -60,6 +64,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import <NGMail/NGMimeMessageGenerator.h>
|
||||
|
||||
#import <SOGo/SOGoUserDefaults.h>
|
||||
#import <SOGo/SOGoUserFolder.h>
|
||||
#import <SOGo/NSArray+Utilities.h>
|
||||
|
||||
#include "iCalTimeZone+ActiveSync.h"
|
||||
#include "NSData+ActiveSync.h"
|
||||
@@ -71,6 +77,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#include <Mailer/SOGoMailBodyPart.h>
|
||||
#include <Mailer/NSString+Mail.h>
|
||||
|
||||
#import <Mailer/SOGoMailLabel.h>
|
||||
#import <Mailer/SOGoMailFolder.h>
|
||||
#import <Mailer/SOGoMailObject.h>
|
||||
#import <Mailer/SOGoMailAccount.h>
|
||||
#import <Mailer/SOGoMailAccounts.h>
|
||||
|
||||
#include <SOGo/SOGoUser.h>
|
||||
#include <SOGo/NSString+Utilities.h>
|
||||
|
||||
@@ -972,7 +984,12 @@ struct GlobalObjectId {
|
||||
|
||||
// Location
|
||||
if ([[event location] length])
|
||||
[s appendFormat: @"<Location xmlns=\"Email:\">%@</Location>", [[event location] activeSyncRepresentationInContext: context]];
|
||||
{
|
||||
if ([[context objectForKey: @"ASProtocolVersion"] floatValue] >= 16.0)
|
||||
[s appendFormat: @"<Location xmlns=\"AirSyncBase:\"><DisplayName>%@</DisplayName></Location>", [[event location] activeSyncRepresentationInContext: context]];
|
||||
else
|
||||
[s appendFormat: @"<Location xmlns=\"Email:\">%@</Location>", [[event location] activeSyncRepresentationInContext: context]];
|
||||
}
|
||||
|
||||
[s appendFormat: @"<Organizer xmlns=\"Email:\">%@</Organizer>", [[[event organizer] mailAddress] activeSyncRepresentationInContext: context]];
|
||||
|
||||
@@ -1432,4 +1449,239 @@ struct GlobalObjectId {
|
||||
}
|
||||
}
|
||||
|
||||
- (NSString *) storeMail: (NSDictionary *) theValues
|
||||
inBuffer: (NSMutableString *) theBuffer
|
||||
inContext: (WOContext *) _context
|
||||
{
|
||||
NSString *dateReceived, *folder, *s, *serverId, *messageId;
|
||||
NGMimeMessageGenerator *generator;
|
||||
NGMimeMessage *draftMessage;
|
||||
NGMimeBodyPart *bodyPart;
|
||||
NGMimeMultipartBody *body;
|
||||
NSDictionary *identity;
|
||||
NGMutableHashMap *map;
|
||||
NGImap4Client *client;
|
||||
NSData *message_data;
|
||||
NSArray *attachmentKeys;
|
||||
|
||||
id o, a, result, attachments;
|
||||
int bodyType, i;
|
||||
|
||||
identity = [[context activeUser] primaryIdentity];
|
||||
message_data = nil;
|
||||
bodyType = 1;
|
||||
|
||||
if ((o = [[theValues objectForKey: @"Body"] objectForKey: @"Type"]))
|
||||
bodyType = [o intValue];
|
||||
|
||||
if (bodyType == 4)
|
||||
{
|
||||
s = [[theValues objectForKey: @"Body"] objectForKey: @"Data"];
|
||||
message_data = [s dataUsingEncoding: NSUTF8StringEncoding];
|
||||
}
|
||||
|
||||
if (bodyType == 1 || bodyType == 2)
|
||||
{
|
||||
map = [[[NGMutableHashMap alloc] initWithCapacity: 1] autorelease];
|
||||
|
||||
[map setObject: [NSString stringWithFormat: @"%@ <%@>", [identity objectForKey: @"fullName"], [identity objectForKey: @"email"]] forKey: @"from"];
|
||||
|
||||
if ((o = [theValues objectForKey: @"To"]))
|
||||
[map setObject: o forKey: @"to"];
|
||||
|
||||
if ((o = [theValues objectForKey: @"Cc"]))
|
||||
[map setObject: o forKey: @"cc"];
|
||||
|
||||
if ((o = [theValues objectForKey: @"Bcc"]))
|
||||
[map setObject: o forKey: @"bcc"];
|
||||
|
||||
if ((o = [theValues objectForKey: @"Reply-To"]))
|
||||
[map setObject: o forKey: @"Reply-To"];
|
||||
|
||||
if ((o = [theValues objectForKey: @"Subject"]))
|
||||
[map setObject: o forKey: @"subject"];
|
||||
|
||||
o = [[theValues objectForKey: @"DateReceived"] calendarDate];
|
||||
|
||||
if (!o)
|
||||
o = [NSCalendarDate date];
|
||||
|
||||
#if GNUSTEP_BASE_MINOR_VERSION < 21
|
||||
dateReceived = [o descriptionWithCalendarFormat: @"%a, %d %b %Y %H:%M:%S %z"
|
||||
timeZone: [NSTimeZone timeZoneWithName: @"GMT"]
|
||||
locale: nil];
|
||||
#else
|
||||
dateReceived = [o descriptionWithCalendarFormat: @"%a, %d %b %Y %H:%M:%S %z"
|
||||
timeZone: [NSTimeZone timeZoneWithName: @"GMT"]
|
||||
locale: [NSDictionary dictionaryWithObjectsAndKeys:
|
||||
[NSArray arrayWithObjects: @"Jan", @"Feb", @"Mar", @"Apr",
|
||||
@"May", @"Jun", @"Jul", @"Aug",
|
||||
@"Sep", @"Oct", @"Nov", @"Dec", nil],
|
||||
@"NSShortMonthNameArray",
|
||||
[NSArray arrayWithObjects: @"Sun", @"Mon", @"Tue", @"Wed", @"Thu",
|
||||
@"Fri", @"Sat", nil],
|
||||
@"NSShortWeekDayNameArray",
|
||||
nil]];
|
||||
#endif
|
||||
|
||||
[map setObject: dateReceived forKey: @"date"];
|
||||
|
||||
messageId = [NSString generateMessageID];
|
||||
[map setObject: messageId forKey: @"message-id"];
|
||||
|
||||
attachmentKeys = [self fetchFileAttachmentKeys];
|
||||
|
||||
if ((attachments = [theValues objectForKey: @"Attachments"]) || [attachmentKeys count])
|
||||
{
|
||||
[map setObject: @"multipart/mixed" forKey: @"content-type"];
|
||||
draftMessage = [[[NGMimeMessage alloc] initWithHeader: map] autorelease];
|
||||
body = [[[NGMimeMultipartBody alloc] initWithPart: draftMessage] autorelease];
|
||||
|
||||
map = [[[NGMutableHashMap alloc] initWithCapacity: 1] autorelease];
|
||||
|
||||
[map setObject: (bodyType == 1 ? @"text/plain; charset=utf-8" : @"text/html; charset=utf-8")
|
||||
forKey: @"content-type"];
|
||||
[map setObject: @"quoted-printable" forKey: @"content-transfer-encoding"];
|
||||
|
||||
bodyPart = [[[NGMimeBodyPart alloc] initWithHeader:map] autorelease];
|
||||
|
||||
[bodyPart setBody: [[NSString stringWithFormat: @"%@", [[theValues objectForKey: @"Body"] objectForKey: @"Data"] ] dataUsingEncoding: NSUTF8StringEncoding]];
|
||||
|
||||
[body addBodyPart: bodyPart];
|
||||
|
||||
// Add attachments from the original mail - skip deletions
|
||||
if ([attachmentKeys count])
|
||||
{
|
||||
id currentAttachment;
|
||||
NGHashMap *response;
|
||||
NSData *bodydata;
|
||||
NSArray *paths;
|
||||
NGMimeFileData *fdata;
|
||||
int i, ii;
|
||||
BOOL found;
|
||||
|
||||
paths = [attachmentKeys keysWithFormat: @"BODY[%{path}]"];
|
||||
response = [[self fetchParts: paths] objectForKey: @"RawResponse"];
|
||||
|
||||
for (i = 0; i < [attachmentKeys count]; i++)
|
||||
{
|
||||
currentAttachment = [attachmentKeys objectAtIndex: i];
|
||||
found = NO;
|
||||
for (ii = 0; ii < [attachments count]; ii++)
|
||||
{
|
||||
// no ClientId means its a deletio
|
||||
if (![[attachments objectAtIndex: ii] objectForKey: @"ClientId"] &&
|
||||
[[[[attachments objectAtIndex: ii] objectForKey: @"FileReference"] lastPathComponent] isEqualToString: [currentAttachment objectForKey: @"path"]])
|
||||
{
|
||||
found = YES;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// skip deletions
|
||||
if (found)
|
||||
continue;
|
||||
|
||||
bodydata = [[[response objectForKey: @"fetch"] objectForKey: [NSString stringWithFormat: @"body[%@]", [currentAttachment objectForKey: @"path"]]] valueForKey: @"data"];
|
||||
|
||||
map = [[[NGMutableHashMap alloc] initWithCapacity: 1] autorelease];
|
||||
[map setObject: [currentAttachment objectForKey: @"mimetype"] forKey: @"content-type"];
|
||||
[map setObject: [currentAttachment objectForKey: @"encoding"] forKey: @"content-transfer-encoding"];
|
||||
[map addObject: [NSString stringWithFormat: @"attachment; filename=\"%@\"", [currentAttachment objectForKey: @"filename"]] forKey: @"content-disposition"];
|
||||
bodyPart = [[[NGMimeBodyPart alloc] initWithHeader: map] autorelease];
|
||||
|
||||
fdata = [[NGMimeFileData alloc] initWithBytes:[bodydata bytes] length:[bodydata length]];
|
||||
[bodyPart setBody: fdata];
|
||||
RELEASE(fdata);
|
||||
[body addBodyPart: bodyPart];
|
||||
}
|
||||
}
|
||||
|
||||
// add new attachments
|
||||
for (i = 0; i < [attachments count]; i++)
|
||||
{
|
||||
|
||||
map = [[[NGMutableHashMap alloc] initWithCapacity: 1] autorelease];
|
||||
a = [attachments objectAtIndex: i];
|
||||
|
||||
// no ClientId means its a deletion
|
||||
if (![a objectForKey: @"ClientId"])
|
||||
continue;
|
||||
|
||||
[map setObject: @"application/octet-stream" forKey: @"content-type"]; // FIXME ?? can we guess the right content-type
|
||||
[map setObject: @"base64" forKey: @"content-transfer-encoding"];
|
||||
[map setObject: [NSString stringWithFormat: @"attachment; filename=\"%@\"", [a objectForKey: @"DisplayName"]] forKey: @"content-disposition"];
|
||||
|
||||
bodyPart = [[[NGMimeBodyPart alloc] initWithHeader:map] autorelease];
|
||||
[bodyPart setBody: [[a objectForKey: @"Content"] stringByDecodingBase64]];
|
||||
[body addBodyPart: bodyPart];
|
||||
}
|
||||
|
||||
|
||||
[draftMessage setBody: body];
|
||||
}
|
||||
else
|
||||
{
|
||||
[map setObject: (bodyType == 1 ? @"text/plain; charset=utf-8" : @"text/html; charset=utf-8")
|
||||
forKey: @"content-type"];
|
||||
[map setObject: @"quoted-printable" forKey: @"content-transfer-encoding"];
|
||||
|
||||
draftMessage = [[[NGMimeMessage alloc] initWithHeader: map] autorelease];
|
||||
|
||||
[draftMessage setBody: [[NSString stringWithFormat: @"%@", [[theValues objectForKey: @"Body"] objectForKey: @"Data"] ] dataUsingEncoding: NSUTF8StringEncoding]];
|
||||
}
|
||||
|
||||
generator = [[[NGMimeMessageGenerator alloc] init] autorelease];
|
||||
message_data = [generator generateMimeFromPart: draftMessage];
|
||||
}
|
||||
|
||||
if (message_data)
|
||||
{
|
||||
client = [[self imap4Connection] client];
|
||||
|
||||
if (![imap4 doesMailboxExistAtURL: [container imap4URL]])
|
||||
{
|
||||
[[self imap4Connection] createMailbox: [[self imap4Connection] imap4FolderNameForURL: [container imap4URL]]
|
||||
atURL: [[self mailAccountFolder] imap4URL]];
|
||||
[imap4 flushFolderHierarchyCache];
|
||||
}
|
||||
|
||||
folder = [imap4 imap4FolderNameForURL: [container imap4URL]];
|
||||
|
||||
result = [client append: message_data
|
||||
toFolder: folder
|
||||
withFlags: [NSArray arrayWithObjects: @"draft", nil]];
|
||||
|
||||
serverId = [NSString stringWithFormat: @"%d", [self IMAP4IDFromAppendResult: result]];
|
||||
|
||||
[theBuffer appendString: @"<ApplicationData>"];
|
||||
[theBuffer appendFormat: @"<ConversationId xmlns=\"Email2:\">%@</ConversationId>", [[messageId dataUsingEncoding: NSUTF8StringEncoding] activeSyncRepresentationInContext: context]];
|
||||
|
||||
if ([attachments count])
|
||||
{
|
||||
[theBuffer appendString: @"<Attachments xmlns=\"AirSyncBase:\">"];
|
||||
|
||||
for (i = 0; i < [attachments count]; i++)
|
||||
{
|
||||
a = [attachments objectAtIndex: i];
|
||||
|
||||
[theBuffer appendString: @"<Attachment>"];
|
||||
[theBuffer appendFormat: @"<ClientId xmlns=\"AirSyncBase:\">%@</ClientId>", [a objectForKey: @"ClientId"]];
|
||||
[theBuffer appendFormat: @"<FileReference xmlns=\"AirSyncBase:\">mail/%@/%@/%d</FileReference>", [[[self container] relativeImap4Name] stringByEscapingURL], serverId, i+2];
|
||||
[theBuffer appendString: @"</Attachment>"];
|
||||
}
|
||||
|
||||
[theBuffer appendString: @"</Attachments>"];
|
||||
}
|
||||
|
||||
[theBuffer appendString: @"</ApplicationData>"];
|
||||
|
||||
if ([[result objectForKey: @"result"] boolValue])
|
||||
return serverId;
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
@@ -45,27 +45,23 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
- (NSString *) activeSyncRepresentationInContext: (WOContext *) context
|
||||
{
|
||||
NSMutableString *s;
|
||||
NSCalendarDate *nextAlarmDate;
|
||||
NSInteger delta;
|
||||
|
||||
s = [NSMutableString string];
|
||||
|
||||
nextAlarmDate = [self nextAlarmDate];
|
||||
delta = (int)(([[(iCalEvent *)parent startDate] timeIntervalSince1970] - [nextAlarmDate timeIntervalSince1970])/60);
|
||||
|
||||
if ([[self action] caseInsensitiveCompare: @"DISPLAY"] == NSOrderedSame)
|
||||
if ([parent isKindOfClass: [iCalEvent class]])
|
||||
{
|
||||
NSCalendarDate *nextAlarmDate;
|
||||
NSInteger delta;
|
||||
|
||||
nextAlarmDate = [self nextAlarmDate];
|
||||
delta = (int)(([[(iCalEvent *)parent startDate] timeIntervalSince1970] - [nextAlarmDate timeIntervalSince1970])/60);
|
||||
|
||||
if ([parent isKindOfClass: [iCalEvent class]])
|
||||
{
|
||||
// don't send negative reminder - not supported
|
||||
if (delta > 0)
|
||||
[s appendFormat: @"<Reminder xmlns=\"Calendar:\">%d</Reminder>", (int)delta];
|
||||
}
|
||||
else
|
||||
{
|
||||
[s appendFormat: @"<ReminderTime xmlns=\"Task:\">%@</ReminderTime>", [nextAlarmDate activeSyncRepresentationInContext: context]];
|
||||
}
|
||||
// don't send negative reminder - not supported
|
||||
if (delta > 0)
|
||||
[s appendFormat: @"<Reminder xmlns=\"Calendar:\">%d</Reminder>", (int)delta];
|
||||
}
|
||||
else
|
||||
{
|
||||
[s appendFormat: @"<ReminderTime xmlns=\"Task:\">%@</ReminderTime>", [nextAlarmDate activeSyncRepresentationInContext: context]];
|
||||
}
|
||||
|
||||
return s;
|
||||
@@ -86,7 +82,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
trigger = [iCalTrigger elementWithTag: @"TRIGGER"];
|
||||
[trigger setValueType: @"DURATION"];
|
||||
[self setTrigger: trigger];
|
||||
[self setAction: @"DISPLAY"];
|
||||
if (![[self action] length])
|
||||
[self setAction: @"DISPLAY"];
|
||||
|
||||
// SOGo web ui only supports 1w but not 2w (custom reminder only supports min/hours/days)
|
||||
// 1week = -P1W
|
||||
@@ -115,8 +112,16 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
trigger = [iCalTrigger elementWithTag: @"TRIGGER"];
|
||||
[trigger setValueType: @"DATE-TIME"];
|
||||
[trigger setSingleValue: [NSString stringWithFormat: @"%@Z", [o iCalFormattedDateTimeString]] forKey: @""];
|
||||
|
||||
if ((o = [theValues objectForKey: @"ReminderSet"]))
|
||||
{
|
||||
if ([o intValue] == 0)
|
||||
[trigger setValue: 0 ofAttribute: @"x-webstatus" to: @"triggered"];
|
||||
}
|
||||
|
||||
[self setTrigger: trigger];
|
||||
[self setAction: @"DISPLAY"];
|
||||
if (![[self action] length])
|
||||
[self setAction: @"DISPLAY"];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -128,7 +128,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
// StartTime -- http://msdn.microsoft.com/en-us/library/ee157132(v=exchg.80).aspx
|
||||
if ([self startDate])
|
||||
{
|
||||
if ([self isAllDay] && !tz)
|
||||
if ([self isAllDay] && !tz && [[context objectForKey: @"ASProtocolVersion"] floatValue] < 16.0)
|
||||
[s appendFormat: @"<StartTime xmlns=\"Calendar:\">%@</StartTime>",
|
||||
[[[self startDate] dateByAddingYears: 0 months: 0 days: 0
|
||||
hours: 0 minutes: 0
|
||||
@@ -141,7 +141,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
// EndTime -- http://msdn.microsoft.com/en-us/library/ee157945(v=exchg.80).aspx
|
||||
if ([self endDate])
|
||||
{
|
||||
if ([self isAllDay] && !tz)
|
||||
if ([self isAllDay] && !tz && [[context objectForKey: @"ASProtocolVersion"] floatValue] < 16.0)
|
||||
[s appendFormat: @"<EndTime xmlns=\"Calendar:\">%@</EndTime>",
|
||||
[[[self endDate] dateByAddingYears: 0 months: 0 days: 0
|
||||
hours: 0 minutes: 0
|
||||
@@ -231,9 +231,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
}
|
||||
else
|
||||
{
|
||||
// If it's a normal event (ie, with no organizer/attendee) or we are the organizer to an event
|
||||
// invitation, we set the busy status to 2 (Busy)
|
||||
[s appendFormat: @"<BusyStatus xmlns=\"Calendar:\">%d</BusyStatus>", 2];
|
||||
// If it's a normal event (i.e. with no organizer/attendee) or we are the organizer of an event
|
||||
// invitation, we set the busy status depending on TRANSP.
|
||||
[s appendFormat: @"<BusyStatus xmlns=\"Calendar:\">%d</BusyStatus>", (([self isOpaque]) ? 2 : 0)];
|
||||
}
|
||||
|
||||
[s appendFormat: @"<MeetingStatus xmlns=\"Calendar:\">%d</MeetingStatus>", meetingStatus];
|
||||
@@ -244,7 +244,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// Location
|
||||
if ([[self location] length])
|
||||
[s appendFormat: @"<Location xmlns=\"Calendar:\">%@</Location>", [[self location] activeSyncRepresentationInContext: context]];
|
||||
{
|
||||
if ([[context objectForKey: @"ASProtocolVersion"] floatValue] >= 16.0)
|
||||
[s appendFormat: @"<Location xmlns=\"AirSyncBase:\"><DisplayName>%@</DisplayName></Location>", [[self location] activeSyncRepresentationInContext: context]];
|
||||
else
|
||||
[s appendFormat: @"<Location xmlns=\"Calendar:\">%@</Location>", [[self location] activeSyncRepresentationInContext: context]];
|
||||
}
|
||||
|
||||
// Importance - NOT SUPPORTED - DO NOT ENABLE
|
||||
//o = [self priority];
|
||||
@@ -316,7 +321,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
{
|
||||
iCalAlarm *alarm;
|
||||
|
||||
alarm = [self firstDisplayOrAudioAlarm];
|
||||
alarm = [self firstSupportedAlarm];
|
||||
[s appendString: [alarm activeSyncRepresentationInContext: context]];
|
||||
}
|
||||
|
||||
@@ -442,6 +447,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
NSCalendarDate *oldstart;
|
||||
NSTimeZone *userTimeZone;
|
||||
iCalTimeZone *tz;
|
||||
iCalAlarm *alarm;
|
||||
id o;
|
||||
int deltasecs;
|
||||
|
||||
@@ -451,7 +457,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
occurences = [NSMutableArray arrayWithArray: [[self parent] events]];
|
||||
|
||||
if ((o = [theValues objectForKey: @"UID"]))
|
||||
if ((o = [theValues objectForKey: ([[context objectForKey: @"ASProtocolVersion"] floatValue] >= 16.0) ? @"ClientUid" : @"UID"]))
|
||||
[self setUid: o];
|
||||
|
||||
// FIXME: merge with iCalToDo
|
||||
@@ -474,7 +480,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
if ((o = [theValues objectForKey: @"BusyStatus"]))
|
||||
{
|
||||
[o intValue];
|
||||
if ([o boolValue])
|
||||
[self setTransparency: @"OPAQUE"];
|
||||
else
|
||||
[self setTransparency: @"TRANSPARENT"];
|
||||
}
|
||||
|
||||
//
|
||||
@@ -527,8 +536,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
[self setComment: o];
|
||||
}
|
||||
|
||||
if ((o = [theValues objectForKey: @"Location"]))
|
||||
if ([[context objectForKey: @"ASProtocolVersion"] floatValue] < 16.0 && (o = [theValues objectForKey: @"Location"]))
|
||||
[self setLocation: o];
|
||||
else if ([[context objectForKey: @"ASProtocolVersion"] floatValue] >= 16.0 && (o = [theValues objectForKey: @"Location"]) && [o isKindOfClass: [NSDictionary class]])
|
||||
[self setLocation: [o objectForKey: @"DisplayName"]];
|
||||
|
||||
deltasecs = 0;
|
||||
start = nil;
|
||||
@@ -572,23 +583,19 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// If an alarm is deinfed with an action != DISPLAY, we ignore the alarm - don't want to overwrite.
|
||||
//
|
||||
if ([self hasAlarms] && [[[[self alarms] objectAtIndex: 0] action] caseInsensitiveCompare: @"DISPLAY"] != NSOrderedSame)
|
||||
{
|
||||
// Ignore the alarm for now
|
||||
}
|
||||
else if ((o = [theValues objectForKey: @"Reminder"]))
|
||||
if ((o = [theValues objectForKey: @"Reminder"]) && [o length])
|
||||
{
|
||||
if ([self hasAlarms])
|
||||
alarm = [[self firstSupportedAlarm] mutableCopy];
|
||||
else
|
||||
alarm = [[iCalAlarm alloc] init];
|
||||
|
||||
// NOTE: Outlook sends a 15 min reminder (18 hour for allday) if no reminder is specified
|
||||
// although no default reminder is defined (File -> Options -> Clendar -> Calendar Options - > Default Reminders)
|
||||
//
|
||||
// http://answers.microsoft.com/en-us/office/forum/office_2013_release-outlook/desktop-outlook-calendar-creates-entries-with/9aef72d8-81bb-4a32-a6ab-bf7d216fb811?page=5&tm=1395690285088
|
||||
//
|
||||
iCalAlarm *alarm;
|
||||
|
||||
alarm = [[iCalAlarm alloc] init];
|
||||
[alarm takeActiveSyncValues: theValues inContext: context];
|
||||
|
||||
[self removeAllAlarms];
|
||||
@@ -830,7 +837,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Attendees - we don't touch the values if we're an attendee. This is gonna
|
||||
// be done automatically by the ActiveSync client when invoking MeetingResponse.
|
||||
if (![self userIsAttendee: [context activeUser]])
|
||||
@@ -852,10 +858,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
// { "Attendee_Email" = "sogo3@example.com"; "Attendee_Name" = "Wolfgang Fritz"; "Attendee_Status" = 5; "Attendee_Type" = 1; }
|
||||
attendee = [o objectAtIndex: i];
|
||||
|
||||
if ([self isOrganizer: [attendee objectForKey: @"Attendee_Email"]])
|
||||
continue;
|
||||
|
||||
person = [iCalPerson elementWithTag: @"attendee"];
|
||||
[person setCn: [attendee objectForKey: @"Attendee_Name"]];
|
||||
[person setEmail: [attendee objectForKey: @"Attendee_Email"]];
|
||||
|
||||
|
||||
status = [[attendee objectForKey: @"Attendee_Status"] intValue];
|
||||
|
||||
switch (status)
|
||||
@@ -872,7 +881,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
case 0:
|
||||
case 5:
|
||||
default:
|
||||
[person setPartStat: @"NEEDS-ACTION"];
|
||||
{
|
||||
[person setPartStat: @"NEEDS-ACTION"];
|
||||
[person setRsvp: @"TRUE"];
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -102,10 +102,22 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
if ([self hasAlarms])
|
||||
{
|
||||
iCalAlarm *alarm;
|
||||
NSString *webstatus;
|
||||
|
||||
alarm = [self firstDisplayOrAudioAlarm];
|
||||
[s appendFormat: @"<ReminderSet xmlns=\"Tasks:\">%d</ReminderSet>", 1];
|
||||
[s appendString: [alarm activeSyncRepresentationInContext: context]];
|
||||
if ((alarm = [self firstSupportedAlarm]))
|
||||
{
|
||||
webstatus = [[alarm trigger] value: 0 ofAttribute: @"x-webstatus"];
|
||||
if (!webstatus || ([webstatus caseInsensitiveCompare: @"TRIGGERED"] != NSOrderedSame))
|
||||
[s appendFormat: @"<ReminderSet xmlns=\"Tasks:\">%d</ReminderSet>", 1];
|
||||
else
|
||||
[s appendFormat: @"<ReminderSet xmlns=\"Tasks:\">%d</ReminderSet>", 0];
|
||||
|
||||
[s appendString: [alarm activeSyncRepresentationInContext: context]];
|
||||
}
|
||||
else
|
||||
{
|
||||
[s appendFormat: @"<ReminderSet xmlns=\"Tasks:\">%d</ReminderSet>", 0];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
+6
-2
@@ -57,6 +57,9 @@ ProxyPreserveHost On
|
||||
# Allow from your-cas-host-addr
|
||||
# </Proxy>
|
||||
|
||||
# Redirect / to /SOGo
|
||||
#RedirectMatch ^/$ https://mail.yourdomain.com/SOGo
|
||||
|
||||
# Enable to use Microsoft ActiveSync support
|
||||
# Note that you MUST have many sogod workers to use ActiveSync.
|
||||
# See the SOGo Installation and Configuration guide for more details.
|
||||
@@ -68,10 +71,11 @@ ProxyPreserveHost On
|
||||
ProxyPass /SOGo http://127.0.0.1:20000/SOGo retry=0
|
||||
|
||||
<Proxy http://127.0.0.1:20000/SOGo>
|
||||
## adjust the following to your configuration
|
||||
## and do not forget to enable the headers module
|
||||
## Adjust the following to your configuration
|
||||
## and make sure to enable the headers module
|
||||
<IfModule headers_module>
|
||||
RequestHeader set "x-webobjects-server-port" "443"
|
||||
SetEnvIf Host (.*) HTTP_HOST=$1
|
||||
RequestHeader set "x-webobjects-server-name" "%{HTTP_HOST}e" env=HTTP_HOST
|
||||
RequestHeader set "x-webobjects-server-url" "https://%{HTTP_HOST}e" env=HTTP_HOST
|
||||
|
||||
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Loaded 100 of 1409 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user