Compare commits
734
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2fbe6e8429 | ||
|
|
ac6b60c4c9 | ||
|
|
76eeef2541 | ||
|
|
086b905215 | ||
|
|
713e0d5ecb | ||
|
|
58732e316b | ||
|
|
9199d42e51 | ||
|
|
8c217103f8 | ||
|
|
ab5fd9fef1 | ||
|
|
165d866cfc | ||
|
|
8ba6c6d9f5 | ||
|
|
960962f92f | ||
|
|
cbb23bd536 | ||
|
|
196e36acb2 | ||
|
|
6c05576e53 | ||
|
|
9449b0df27 | ||
|
|
9ecee32d08 | ||
|
|
199c9d9237 | ||
|
|
d95b90281b | ||
|
|
8545f89b2f | ||
|
|
c827b62f7f | ||
|
|
16356aaf36 | ||
|
|
4c4d3e4c25 | ||
|
|
f638113d53 | ||
|
|
09bda83bc8 | ||
|
|
04bba82d2e | ||
|
|
0655e9d76e | ||
|
|
4b4846b0a3 | ||
|
|
d73148a440 | ||
|
|
23a5274881 | ||
|
|
1586180ebb | ||
|
|
43f669b6d9 | ||
|
|
12314c8bd0 | ||
|
|
c44f90cff0 | ||
|
|
3c35ecbd66 | ||
|
|
f41e30af3a | ||
|
|
99ca9d7046 | ||
|
|
ac69de19d0 | ||
|
|
9eda80b5fd | ||
|
|
bdeb127bb5 | ||
|
|
e4ab4d4ff4 | ||
|
|
ea87ffd95b | ||
|
|
f223b745ad | ||
|
|
c0bfb42c12 | ||
|
|
b09bdab3ca | ||
|
|
b4d51391ed | ||
|
|
92aab1fd1f | ||
|
|
c59b4e5189 | ||
|
|
95cf877b49 | ||
|
|
a14ba4855f | ||
|
|
738a34822a | ||
|
|
eab6502d5a | ||
|
|
dab18608c7 | ||
|
|
2b8dbff9ec | ||
|
|
78b5548d20 | ||
|
|
7434cc4cf5 | ||
|
|
ab72066ad6 | ||
|
|
99a4bd3515 | ||
|
|
b2ee1294be | ||
|
|
48628e293f | ||
|
|
618e20edb0 | ||
|
|
4ff1007052 | ||
|
|
49a60469c7 | ||
|
|
b51d866a09 | ||
|
|
e703758b73 | ||
|
|
7422c25d5a | ||
|
|
636af7da5a | ||
|
|
827d1d72c8 | ||
|
|
53a5561173 | ||
|
|
04e804e62f | ||
|
|
5e210e6fea | ||
|
|
0721b92315 | ||
|
|
dd2f6f8cb1 | ||
|
|
520286e500 | ||
|
|
40bc512318 | ||
|
|
908e47a25a | ||
|
|
d9d8ed37f9 | ||
|
|
e5bebf87a8 | ||
|
|
804ebaf8b9 | ||
|
|
c773717f05 | ||
|
|
0111b9de92 | ||
|
|
717f45f640 | ||
|
|
c9c08c14de | ||
|
|
e4ac2c7603 | ||
|
|
87c7e64c89 | ||
|
|
f1bb581dcc | ||
|
|
e3c7bdd5d8 | ||
|
|
96b36861f2 | ||
|
|
98c5f77945 | ||
|
|
c5526bb70a | ||
|
|
0f9dce8bb2 | ||
|
|
e35f9c4fad | ||
|
|
e830900a5f | ||
|
|
9438685299 | ||
|
|
a8574d8e75 | ||
|
|
11844283d1 | ||
|
|
af85f4dd92 | ||
|
|
d601608024 | ||
|
|
f425d61dc7 | ||
|
|
a4c69215db | ||
|
|
a26b2ec9ef | ||
|
|
fbd2f1511b | ||
|
|
2fb2485b12 | ||
|
|
4ac2811caf | ||
|
|
83c464f051 | ||
|
|
da489c6499 | ||
|
|
c1c44b8996 | ||
|
|
92a7cc6b95 | ||
|
|
20d8fde945 | ||
|
|
3c11c6ac4e | ||
|
|
a2cec25543 | ||
|
|
04f2002feb | ||
|
|
2c01cb7a0a | ||
|
|
05505eb3e5 | ||
|
|
b064f94f03 | ||
|
|
012ac98b31 | ||
|
|
8d166dd80c | ||
|
|
065f8478e6 | ||
|
|
e6ed07879c | ||
|
|
3ab9fb481c | ||
|
|
431fe3406f | ||
|
|
33565bce6a | ||
|
|
181f1ec22d | ||
|
|
fc86e60acc | ||
|
|
c091c05185 | ||
|
|
7432145347 | ||
|
|
57fc2082b2 | ||
|
|
7f6211ae4a | ||
|
|
f9d2acded7 | ||
|
|
2115c46fbb | ||
|
|
1615545584 | ||
|
|
76d39f21f2 | ||
|
|
2b137d6bc0 | ||
|
|
5ac42d79a8 | ||
|
|
40b040f26e | ||
|
|
e931b141bf | ||
|
|
1e491d45a5 | ||
|
|
5fbb40a8ae | ||
|
|
2b13db1d0e | ||
|
|
35ed24511d | ||
|
|
afa71a186c | ||
|
|
a9dc1c03ce | ||
|
|
aade18eec2 | ||
|
|
38ddc0b69a | ||
|
|
afc4552cb0 | ||
|
|
f2086b76c7 | ||
|
|
aaf3e292be | ||
|
|
33583ea872 | ||
|
|
1d56a9256a | ||
|
|
920b1aea32 | ||
|
|
44d8b63136 | ||
|
|
5a2676f91b | ||
|
|
821b9d1f3c | ||
|
|
feca4ca3a5 | ||
|
|
7c814add25 | ||
|
|
663c4a44a2 | ||
|
|
c885aaeb88 | ||
|
|
d047822eb5 | ||
|
|
50cb8772c4 | ||
|
|
a13a72aff1 | ||
|
|
cfddf147c4 | ||
|
|
44ee450fd7 | ||
|
|
dcf246ab54 | ||
|
|
3a75491e0f | ||
|
|
b115f26834 | ||
|
|
69d90e1fad | ||
|
|
9621527414 | ||
|
|
01499a9315 | ||
|
|
f16cc609ea | ||
|
|
a87c276b6b | ||
|
|
599f00a571 | ||
|
|
5ae40a02ec | ||
|
|
7d383639b9 | ||
|
|
766d0ff64e | ||
|
|
30b08941f6 | ||
|
|
e5b42c5e98 | ||
|
|
ed5d922ea4 | ||
|
|
82b919e7ee | ||
|
|
821b7c19ce | ||
|
|
bed5175a74 | ||
|
|
188328d5d7 | ||
|
|
17afe7c077 | ||
|
|
bfb7fa2e14 | ||
|
|
e8ff3dc539 | ||
|
|
20b1d3c0e9 | ||
|
|
3a66e54bd0 | ||
|
|
d1c3327d47 | ||
|
|
100841efbd | ||
|
|
9ddc5eb49b | ||
|
|
8617ddc05e | ||
|
|
7f0c5a86f8 | ||
|
|
573de4900c | ||
|
|
9784995d41 | ||
|
|
698918abf9 | ||
|
|
12e952eb55 | ||
|
|
f388d180ae | ||
|
|
36d257e1c7 | ||
|
|
8e94c33a0f | ||
|
|
8d04a83731 | ||
|
|
d2e7fdf4d2 | ||
|
|
e1b1812364 | ||
|
|
32bb1456e2 | ||
|
|
d01f5d36fa | ||
|
|
17b2e3946c | ||
|
|
51408bbde0 | ||
|
|
9d461d646f | ||
|
|
dd32c659f6 | ||
|
|
12ac1d30de | ||
|
|
8b45ee886b | ||
|
|
1ca1a273d9 | ||
|
|
76e586deca | ||
|
|
a9f336c69d | ||
|
|
b92ca092ed | ||
|
|
dcb1d2f574 | ||
|
|
bcf94c5b43 | ||
|
|
8c8ad301b4 | ||
|
|
026c37709a | ||
|
|
c45baad188 | ||
|
|
e86e3b2481 | ||
|
|
6de15edb9c | ||
|
|
967cc29c4e | ||
|
|
a2078da5f0 | ||
|
|
2193dbb678 | ||
|
|
cb9f26cc1f | ||
|
|
0e49f7ed87 | ||
|
|
b62d58d4d7 | ||
|
|
c99fd1d93c | ||
|
|
e08ee9a265 | ||
|
|
e4473a656b | ||
|
|
7cbf019742 | ||
|
|
456ff7d5a3 | ||
|
|
5f0061205f | ||
|
|
11a2bcfffd | ||
|
|
15779c2cfb | ||
|
|
3b0cfa00f7 | ||
|
|
0b1fbf0dee | ||
|
|
499dbf68ae | ||
|
|
4c6c0a3644 | ||
|
|
1c65424242 | ||
|
|
08bf6d528b | ||
|
|
a9083004ef | ||
|
|
ec02c41d9b | ||
|
|
07e3c48ed0 | ||
|
|
920bfba8b8 | ||
|
|
bc2e46cda7 | ||
|
|
e9d24fe0e6 | ||
|
|
24d32ae220 | ||
|
|
8baf8731b7 | ||
|
|
0de07acb16 | ||
|
|
27fb035f34 | ||
|
|
8749028e1d | ||
|
|
e5f15f69df | ||
|
|
8e80b57d31 | ||
|
|
75ffdd2ee1 | ||
|
|
46bffaa449 | ||
|
|
b9cdc437eb | ||
|
|
061244a0a5 | ||
|
|
dee7b4be1a | ||
|
|
a451a1120b | ||
|
|
6cfed4eb67 | ||
|
|
a55c98b98d | ||
|
|
7c0649efcf | ||
|
|
0ca6512617 | ||
|
|
13a82826f8 | ||
|
|
3d9466df45 | ||
|
|
3ee29c0b71 | ||
|
|
7b4c6346f8 | ||
|
|
aac9cd7c07 | ||
|
|
d5fd719212 | ||
|
|
be7971ceef | ||
|
|
3f0c2b647c | ||
|
|
155acfa9a6 | ||
|
|
57901b8469 | ||
|
|
a7c04187a2 | ||
|
|
359da78d81 | ||
|
|
5ba476789c | ||
|
|
49d5a72d65 | ||
|
|
f34aa2996d | ||
|
|
5686e086cd | ||
|
|
ed9ec04669 | ||
|
|
737d2ffccc | ||
|
|
7ca66b4078 | ||
|
|
04c68e0674 | ||
|
|
bf7f5e8be7 | ||
|
|
f1d0f770df | ||
|
|
1bae41e127 | ||
|
|
6b2ec7a2e7 | ||
|
|
169356b8a0 | ||
|
|
bad7fd4532 | ||
|
|
cb3959d991 | ||
|
|
596c22d828 | ||
|
|
e223d064d9 | ||
|
|
dbf6426449 | ||
|
|
7fc6eec157 | ||
|
|
f48b3405d7 | ||
|
|
52bc589ab8 | ||
|
|
03f879433b | ||
|
|
ad141295ed | ||
|
|
5fef815191 | ||
|
|
ec28fdc8d0 | ||
|
|
b1590f6b2e | ||
|
|
800d143a35 | ||
|
|
a503b34d7a | ||
|
|
65670027cb | ||
|
|
d5bf661cf1 | ||
|
|
dc2878b5e2 | ||
|
|
f9aab0de75 | ||
|
|
5c58299458 | ||
|
|
57fad470fb | ||
|
|
e0b7efbbbf | ||
|
|
4278e417a7 | ||
|
|
230688bf4e | ||
|
|
1a1f74b5d0 | ||
|
|
93d1c3d4e7 | ||
|
|
ea37a9cd29 | ||
|
|
8e8e19666a | ||
|
|
76b4563b2f | ||
|
|
4ce3947e60 | ||
|
|
0a8f52ce7d | ||
|
|
9bb2473c8e | ||
|
|
2d5995a8f4 | ||
|
|
cee83df085 | ||
|
|
0c5f4edb36 | ||
|
|
90378b76eb | ||
|
|
6aeb13ba65 | ||
|
|
216371fd80 | ||
|
|
5927d3303c | ||
|
|
6a3e64f849 | ||
|
|
490043b2e1 | ||
|
|
210d6908b8 | ||
|
|
ca7f093155 | ||
|
|
2ad00f8cef | ||
|
|
b5780357cb | ||
|
|
67f38e1127 | ||
|
|
36985a19e9 | ||
|
|
06cbe527e8 | ||
|
|
51dbfaba15 | ||
|
|
3d55396661 | ||
|
|
2c97b680a8 | ||
|
|
f9cb896f92 | ||
|
|
46edcce1d5 | ||
|
|
1b14fee96e | ||
|
|
0777e9fe67 | ||
|
|
8b078817e2 | ||
|
|
dd56d5e85c | ||
|
|
e009af6864 | ||
|
|
673db179b1 | ||
|
|
fd0f1499b1 | ||
|
|
20575226b8 | ||
|
|
8b04a468c2 | ||
|
|
ccd9e385a0 | ||
|
|
376e717f45 | ||
|
|
5b25f85c02 | ||
|
|
63b8c3ed5e | ||
|
|
c76c48fb0c | ||
|
|
7fe1b5f046 | ||
|
|
2a25675b3a | ||
|
|
dbfd86db04 | ||
|
|
135535e00e | ||
|
|
e386404b0a | ||
|
|
966d13c5b6 | ||
|
|
4ae5feb131 | ||
|
|
db213c2b73 | ||
|
|
c2922e2a26 | ||
|
|
1529e7ec4e | ||
|
|
332508e2db | ||
|
|
d2ea6fef2e | ||
|
|
75ff4af7cc | ||
|
|
916c04387b | ||
|
|
7c460b694e | ||
|
|
29f2d960a7 | ||
|
|
225fe847a7 | ||
|
|
720b1d5ab5 | ||
|
|
28bd4ca318 | ||
|
|
c6dbcb2f7c | ||
|
|
5dfbfe827d | ||
|
|
6ddb40fd2b | ||
|
|
37f29c06ea | ||
|
|
248892c394 | ||
|
|
b4e4b9c29f | ||
|
|
e94b4416f8 | ||
|
|
8d19ec4aff | ||
|
|
aeeeeea802 | ||
|
|
41e388c5f6 | ||
|
|
db17872dd6 | ||
|
|
73e86bb8e5 | ||
|
|
c3bce410f1 | ||
|
|
980db7a980 | ||
|
|
c5c6ff33d8 | ||
|
|
7e1bbe34dc | ||
|
|
a618386d5e | ||
|
|
5993fe97c3 | ||
|
|
7cdf48335b | ||
|
|
3dff73636c | ||
|
|
2fc21e48d8 | ||
|
|
98ed9c3b17 | ||
|
|
f9884e3f55 | ||
|
|
10cabca57e | ||
|
|
2e1ed274c8 | ||
|
|
e4cd451be8 | ||
|
|
603da75818 | ||
|
|
9ed3812795 | ||
|
|
a0b15d0c8c | ||
|
|
7e4571874e | ||
|
|
b076801e1b | ||
|
|
0316e441fc | ||
|
|
75208428dd | ||
|
|
942f48c9a0 | ||
|
|
24a7515bb5 | ||
|
|
a8e5a3c025 | ||
|
|
0b69727a49 | ||
|
|
2a2d141629 | ||
|
|
b98d112738 | ||
|
|
1c8b693656 | ||
|
|
15ab0f851d | ||
|
|
1f98d7cced | ||
|
|
2755a83e65 | ||
|
|
9936477f07 | ||
|
|
2e1bfb25d5 | ||
|
|
25dbce42cd | ||
|
|
a9fe80c367 | ||
|
|
bc5aa3cacb | ||
|
|
0ddbd79fad | ||
|
|
2a3367a13b | ||
|
|
4b7cbba0c8 | ||
|
|
2deda01e5c | ||
|
|
8c0ef9cf50 | ||
|
|
8456d49686 | ||
|
|
5a3cafbbb0 | ||
|
|
dc085789e7 | ||
|
|
f6973d8aa4 | ||
|
|
94d4da6e1e | ||
|
|
2f63542e07 | ||
|
|
3155bd0172 | ||
|
|
2518b37e32 | ||
|
|
8e3e4a5445 | ||
|
|
01dcf3d6c8 | ||
|
|
fa4d3a0e20 | ||
|
|
bbdb27e75e | ||
|
|
1279629e86 | ||
|
|
f7d748ea98 | ||
|
|
2d1a4b320c | ||
|
|
e8e610c7b3 | ||
|
|
8df311547f | ||
|
|
f42d6f5f4a | ||
|
|
01642eca3e | ||
|
|
9554e92c8b | ||
|
|
2ae8c6f8b2 | ||
|
|
f64b324133 | ||
|
|
31deae11b4 | ||
|
|
19676593ea | ||
|
|
4a27beabdd | ||
|
|
8dae5faaa1 | ||
|
|
85ce41dc68 | ||
|
|
0622980f38 | ||
|
|
a73df96b78 | ||
|
|
7015713741 | ||
|
|
7644d6fb4d | ||
|
|
9dcf459827 | ||
|
|
4c7bd6dd76 | ||
|
|
ec598321c4 | ||
|
|
4b8a9bcc3b | ||
|
|
a9984d9487 | ||
|
|
88a74bcb5c | ||
|
|
2a90102a81 | ||
|
|
fbc73dc3bc | ||
|
|
1d78b2df96 | ||
|
|
6aef713d28 | ||
|
|
71db3945cb | ||
|
|
da230410be | ||
|
|
82114f75aa | ||
|
|
f8d31a6413 | ||
|
|
707aabde15 | ||
|
|
ceec497aec | ||
|
|
46f93d8629 | ||
|
|
f2347e13d7 | ||
|
|
106f8ec314 | ||
|
|
f58554a700 | ||
|
|
76b8de1805 | ||
|
|
0751c51b89 | ||
|
|
64456c10e5 | ||
|
|
5f5b5d9273 | ||
|
|
194c415631 | ||
|
|
08f05ac2ef | ||
|
|
af413f2b32 | ||
|
|
77bba8e5ea | ||
|
|
946665ff49 | ||
|
|
ef7de7c10d | ||
|
|
106c6a24ae | ||
|
|
863f182e84 | ||
|
|
ba37353e42 | ||
|
|
1915748e33 | ||
|
|
b170ae866f | ||
|
|
7c69e37449 | ||
|
|
7f26d47cd1 | ||
|
|
b55ec52bfe | ||
|
|
f919df050a | ||
|
|
c2e4f7441d | ||
|
|
ca27464984 | ||
|
|
6cbc5573a1 | ||
|
|
e4fae417b9 | ||
|
|
a6bbe13f9b | ||
|
|
8cfb0f0d44 | ||
|
|
08f57f6ad5 | ||
|
|
30a94161af | ||
|
|
ec533809aa | ||
|
|
0d05e3579c | ||
|
|
bf4a581d0f | ||
|
|
9d3f3c619d | ||
|
|
7d49674d9d | ||
|
|
48832a4878 | ||
|
|
eda84c7b5d | ||
|
|
9d31023724 | ||
|
|
41e80bb105 | ||
|
|
e428e74e6c | ||
|
|
7a5e550510 | ||
|
|
0605fdf02a | ||
|
|
d3290dbb8d | ||
|
|
34f626b84c | ||
|
|
e173c6d621 | ||
|
|
1425bb1c75 | ||
|
|
5b65eaa572 | ||
|
|
892bd693d7 | ||
|
|
6812cb08dc | ||
|
|
b62167dd00 | ||
|
|
e0d49d2407 | ||
|
|
c8d05d41a5 | ||
|
|
1013c473cd | ||
|
|
b8d77259cd | ||
|
|
40cb81fd0b | ||
|
|
2937ba7f30 | ||
|
|
3c6fb10d9f | ||
|
|
b378d258cb | ||
|
|
3ba1e33eb6 | ||
|
|
40a1d5fdbf | ||
|
|
1b44218a35 | ||
|
|
df211af604 | ||
|
|
2c723070c6 | ||
|
|
6f5bb3882c | ||
|
|
fc9b175f25 | ||
|
|
1716e46210 | ||
|
|
8800cdf641 | ||
|
|
d998786ea6 | ||
|
|
a50758cc06 | ||
|
|
498cec767b | ||
|
|
8cb580633d | ||
|
|
2b1e060881 | ||
|
|
3702e79a00 | ||
|
|
beb484da10 | ||
|
|
a54cc22da8 | ||
|
|
7f92aca0bd | ||
|
|
8d85ca13df | ||
|
|
fb7e044bd3 | ||
|
|
c08abdb32f | ||
|
|
c55eab6404 | ||
|
|
7680c4091e | ||
|
|
5911563b0f | ||
|
|
eebf878e89 | ||
|
|
a8e02b94d4 | ||
|
|
6ada034c33 | ||
|
|
c01b21e402 | ||
|
|
c8c7aaa459 | ||
|
|
5409cb2927 | ||
|
|
b329513845 | ||
|
|
0ca6e7c6d3 | ||
|
|
bea2415fad | ||
|
|
180269e39e | ||
|
|
8a3adeadd2 | ||
|
|
fc8eedf494 | ||
|
|
c8acba8f5a | ||
|
|
deca6e383a | ||
|
|
f3ac7b8334 | ||
|
|
ad8941ba56 | ||
|
|
2bccfcb725 | ||
|
|
4d174b4c6c | ||
|
|
3b15a79c0a | ||
|
|
b4c2857bb5 | ||
|
|
6f2eae5d67 | ||
|
|
9a7ea26b80 | ||
|
|
38c9a229c0 | ||
|
|
e75ec09445 | ||
|
|
58d03eedc3 | ||
|
|
98ad8f1c0b | ||
|
|
37b817cd68 | ||
|
|
9fd8f3edef | ||
|
|
ce11aca2bd | ||
|
|
861057f22f | ||
|
|
b910501afa | ||
|
|
ba68bd8935 | ||
|
|
063f878199 | ||
|
|
6bccd2eea0 | ||
|
|
652ae763d4 | ||
|
|
734aba5ddb | ||
|
|
3da6c90bbe | ||
|
|
21a6480834 | ||
|
|
42f10e1929 | ||
|
|
03b706e1d8 | ||
|
|
2be556299e | ||
|
|
b075a306c6 | ||
|
|
36d8fa12d3 | ||
|
|
07092828fe | ||
|
|
7c0ba7b72b | ||
|
|
750a629df8 | ||
|
|
33a1d2c397 | ||
|
|
2e75972df6 | ||
|
|
1fdb44b0a7 | ||
|
|
3868ce0fb1 | ||
|
|
fc82eb79f6 | ||
|
|
9425868365 | ||
|
|
6280e4ded6 | ||
|
|
f19074334c | ||
|
|
b702e40ebb | ||
|
|
190f27ed7c | ||
|
|
cbc3e3e97d | ||
|
|
361d5ea3a6 | ||
|
|
24e3071e24 | ||
|
|
1f29198495 | ||
|
|
916442f9cf | ||
|
|
47859b76d6 | ||
|
|
3a60b6e38e | ||
|
|
ae3ac0a09a | ||
|
|
27a19ac956 | ||
|
|
27b9b7bfa7 | ||
|
|
18f758cb0a | ||
|
|
321672e2c3 | ||
|
|
8d9b54815c | ||
|
|
1dbfc18379 | ||
|
|
05b330e11b | ||
|
|
307876e6c7 | ||
|
|
ac6b299988 | ||
|
|
234db671ad | ||
|
|
2d33b01f31 | ||
|
|
490354427d | ||
|
|
22ce38808a | ||
|
|
82aca2cfe5 | ||
|
|
b17488ff25 | ||
|
|
ff3557598f | ||
|
|
26bd1b30fa | ||
|
|
0ce04fd4b6 | ||
|
|
f3656f7571 | ||
|
|
2aba083147 | ||
|
|
9414df26c5 | ||
|
|
7496b92da5 | ||
|
|
e38b0ac64f | ||
|
|
1404dbdb88 | ||
|
|
3dc8cc78ea | ||
|
|
72cbd9a45f | ||
|
|
10ac445f7c | ||
|
|
c5b5a4243d | ||
|
|
304ffa2099 | ||
|
|
e4ad255fc2 | ||
|
|
390a853471 | ||
|
|
dd9b5e18b6 | ||
|
|
5c017c19fc | ||
|
|
dec152e8e5 | ||
|
|
4922e6004d | ||
|
|
b91972d1dc | ||
|
|
5c3cdda186 | ||
|
|
4b19e64071 | ||
|
|
b6dee056ca | ||
|
|
372247a643 | ||
|
|
6830d6d930 | ||
|
|
366ad44cd1 | ||
|
|
9430f40101 | ||
|
|
b7c2d8ae95 | ||
|
|
f03e7a6604 | ||
|
|
4e7a3ce5fa | ||
|
|
61c542cb95 | ||
|
|
d2640e1501 | ||
|
|
20b91cc7bf | ||
|
|
b05f7a5beb | ||
|
|
3a61b7bae4 | ||
|
|
7bde181d3f | ||
|
|
1336a1d5a8 | ||
|
|
cf606e3224 | ||
|
|
c9f2fe2f85 | ||
|
|
10bc15d41d | ||
|
|
393b6d5128 | ||
|
|
68ae978b13 | ||
|
|
f4e3b98042 | ||
|
|
cfab18e1b8 | ||
|
|
959b4e015d | ||
|
|
7c6c78d13b | ||
|
|
7db109525d | ||
|
|
2ce85f6c5c | ||
|
|
7d2f96e96b | ||
|
|
3bf7afdfb7 | ||
|
|
503a70118f | ||
|
|
928b6b596e | ||
|
|
d0d93a297b | ||
|
|
936c38c43e | ||
|
|
7da7bdc1bf | ||
|
|
1e101ef01a | ||
|
|
3171257ef4 | ||
|
|
2c8d65843f | ||
|
|
62b16f4ef3 | ||
|
|
b86b1afdb9 | ||
|
|
8e047aaa9c | ||
|
|
dc2cc14d25 | ||
|
|
3f1a43cc13 | ||
|
|
67d0d95869 | ||
|
|
d16bf7c1a7 | ||
|
|
b527099907 | ||
|
|
72aab7f83f | ||
|
|
dfecce7381 | ||
|
|
82798ccb99 | ||
|
|
3809c002ed | ||
|
|
d9b4abc2f1 | ||
|
|
c1b0fd53dc | ||
|
|
c0a22ead1d | ||
|
|
d8e37cd7d8 | ||
|
|
7540cc3e33 | ||
|
|
d92b0341fb | ||
|
|
5e84f2817f | ||
|
|
c61eca27a1 | ||
|
|
96d88de564 | ||
|
|
90e11d76f6 | ||
|
|
3dd8bddc0e | ||
|
|
95f11f6d0d | ||
|
|
1ec53a063c | ||
|
|
cab5846e37 | ||
|
|
76f80c507c | ||
|
|
afed233131 | ||
|
|
b04b66fd79 | ||
|
|
13f2ac9cbb | ||
|
|
7dc333e790 | ||
|
|
cc62576fef | ||
|
|
a1d07c59af | ||
|
|
0a37652dd6 | ||
|
|
725dea5f6f | ||
|
|
76dd53b461 | ||
|
|
020c895925 | ||
|
|
f4963df50f | ||
|
|
7160d94e91 |
No files matched your search
+13
-27
@@ -1,32 +1,18 @@
|
||||
config.make
|
||||
tags
|
||||
*._*
|
||||
*.css
|
||||
*.pyc
|
||||
*.sax
|
||||
*.swp
|
||||
*.wox/
|
||||
*/*/*.SOGo/
|
||||
*/*/*/obj/
|
||||
*/*/obj/
|
||||
*/obj/
|
||||
.scss-lint-config.yml_
|
||||
ActiveSync/ActiveSync.SOGo
|
||||
Documentation/*.docbook
|
||||
Documentation/*.pdf
|
||||
*._*
|
||||
*/*/obj/
|
||||
*/*/*/obj/
|
||||
*/*/*.SOGo/
|
||||
*.sax
|
||||
*.wox/
|
||||
*.swp
|
||||
SoObjects/SOGo/SOGo.framework/
|
||||
SoObjects/SOGo/derived_src/
|
||||
Tests/*/config.py
|
||||
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
|
||||
UI/WebServerResources/js/vendor/*.js.map
|
||||
UI/WebServerResources/node_modules/
|
||||
UI/WebServerResources/scss/.sass-cache/
|
||||
config.make
|
||||
doc
|
||||
tags
|
||||
*.pyc
|
||||
._*
|
||||
Documentation/*.docbook
|
||||
Documentation/*.pdf
|
||||
@@ -1,3 +0,0 @@
|
||||
[submodule "UI/WebServerResources/angular-material"]
|
||||
path = UI/WebServerResources/angular-material
|
||||
url = https://github.com/angular/material
|
||||
-11
@@ -30,7 +30,6 @@ trans.pt_BR = UI/MailerUI/BrazilianPortuguese.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
|
||||
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
|
||||
@@ -65,7 +64,6 @@ trans.pt_BR = UI/PreferencesUI/BrazilianPortuguese.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
|
||||
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
|
||||
@@ -100,7 +98,6 @@ trans.pt_BR = UI/Scheduler/BrazilianPortuguese.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
|
||||
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
|
||||
@@ -135,7 +132,6 @@ trans.pt_BR = UI/Contacts/BrazilianPortuguese.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
|
||||
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
|
||||
@@ -170,7 +166,6 @@ trans.pt_BR = UI/MainUI/BrazilianPortuguese.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
|
||||
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
|
||||
@@ -205,7 +200,6 @@ trans.pt_BR = UI/Common/BrazilianPortuguese.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
|
||||
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
|
||||
@@ -240,7 +234,6 @@ trans.pt_BR = UI/AdministrationUI/BrazilianPortuguese.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
|
||||
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
|
||||
@@ -275,7 +268,6 @@ trans.pt_BR = SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strin
|
||||
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
|
||||
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
|
||||
@@ -310,7 +302,6 @@ trans.pt_BR = SoObjects/Contacts/BrazilianPortuguese.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
|
||||
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
|
||||
@@ -345,7 +336,6 @@ trans.pt_BR = SoObjects/Mailer/BrazilianPortuguese.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
|
||||
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
|
||||
@@ -380,7 +370,6 @@ trans.pt_BR = UI/MailPartViewers/BrazilianPortuguese.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
|
||||
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
|
||||
|
||||
@@ -31,6 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#define __NGDOMELEMENTACTIVESYNC_H__
|
||||
|
||||
#import <DOM/DOMElement.h>
|
||||
#import <DOM/DOMProtocols.h>
|
||||
|
||||
@class NSDictionary;
|
||||
|
||||
|
||||
@@ -30,6 +30,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import "NGMimeMessage+ActiveSync.h"
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSEnumerator.h>
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
#import <NGMail/NGMailAddress.h>
|
||||
#import <NGMail/NGMailAddressParser.h>
|
||||
|
||||
@@ -29,12 +29,16 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#import "NGVCard+ActiveSync.h"
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSCalendarDate.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSTimeZone.h>
|
||||
|
||||
#import <NGExtensions/NSString+misc.h>
|
||||
|
||||
#import <NGCards/CardElement.h>
|
||||
|
||||
#import <Contacts/NGVCard+SOGo.h>
|
||||
|
||||
#import <SOGo/NSString+Utilities.h>
|
||||
@@ -138,7 +142,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
[s appendFormat: @"<JobTitle xmlns=\"Contacts:\">%@</JobTitle>", [o activeSyncRepresentationInContext: context]];
|
||||
|
||||
if ((o = [self preferredEMail]))
|
||||
[s appendFormat: @"<Email1Address xmlns=\"Contacts:\">%@</Email1Address>", [o activeSyncRepresentationInContext: context]];
|
||||
[s appendFormat: @"<Email1Address xmlns=\"Contacts:\">%@</Email1Address>", o];
|
||||
|
||||
|
||||
// Secondary email addresses (2 and 3)
|
||||
@@ -148,7 +152,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
{
|
||||
o = [[emails objectAtIndex: i] flattenedValuesForKey: @""];
|
||||
|
||||
[s appendFormat: @"<Email%dAddress xmlns=\"Contacts:\">%@</Email%dAddress>", i+2, [o activeSyncRepresentationInContext: context], i+2];
|
||||
[s appendFormat: @"<Email%dAddress xmlns=\"Contacts:\">%@</Email%dAddress>", i+2, o, i+2];
|
||||
|
||||
if (i == 1)
|
||||
break;
|
||||
@@ -181,10 +185,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
a = [NSMutableString string];
|
||||
|
||||
if ((o = [homeAdr flattenedValueAtIndex: 2 forKey: @""]))
|
||||
[a appendString: [o activeSyncRepresentationInContext: context]];
|
||||
[a appendString: o];
|
||||
|
||||
if ((o = [homeAdr flattenedValueAtIndex: 1 forKey: @""]) && [o length])
|
||||
[a appendFormat: @"\n%@", [o activeSyncRepresentationInContext: context]];
|
||||
[a appendFormat: @"\n%@", o];
|
||||
|
||||
[s appendFormat: @"<HomeStreet xmlns=\"Contacts:\">%@</HomeStreet>", [a activeSyncRepresentationInContext: context]];
|
||||
|
||||
@@ -212,10 +216,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
a = [NSMutableString string];
|
||||
|
||||
if ((o = [workAdr flattenedValueAtIndex: 2 forKey: @""]))
|
||||
[a appendString: [o activeSyncRepresentationInContext: context]];
|
||||
[a appendString: o];
|
||||
|
||||
if ((o = [workAdr flattenedValueAtIndex: 1 forKey: @""]) && [o length])
|
||||
[a appendFormat: @"\n%@", [o activeSyncRepresentationInContext: context]];
|
||||
[a appendFormat: @"\n%@", o];
|
||||
|
||||
[s appendFormat: @"<BusinessStreet xmlns=\"Contacts:\">%@</BusinessStreet>", [a activeSyncRepresentationInContext: context]];
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import "NSCalendarDate+ActiveSync.h"
|
||||
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSTimeZone.h>
|
||||
|
||||
#define ONE_DAY 86400
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import "NSData+ActiveSync.h"
|
||||
|
||||
#import <Foundation/NSProcessInfo.h>
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
#import <SOGo/SOGoSystemDefaults.h>
|
||||
|
||||
@@ -37,6 +38,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import <NGExtensions/NSObject+Logs.h>
|
||||
|
||||
#include <wbxml/wbxml.h>
|
||||
#include <wbxml/wbxml_conv.h>
|
||||
#include <wbxml/wbxml_errors.h>
|
||||
|
||||
#define WBXMLDEBUG 0
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#define __NSSTRINGACTIVESYNC_H__
|
||||
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
#include "SOGoActiveSyncConstants.h"
|
||||
|
||||
@class NSCalendarDate;
|
||||
|
||||
@@ -31,6 +31,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#include <Foundation/NSArray.h>
|
||||
#include <Foundation/NSCalendarDate.h>
|
||||
#include <Foundation/NSData.h>
|
||||
#include <Foundation/NSDate.h>
|
||||
#include <Foundation/NSTimeZone.h>
|
||||
|
||||
#include <SOGo/NSString+Utilities.h>
|
||||
#include <SOGo/NSData+Crypto.h>
|
||||
|
||||
@@ -33,6 +33,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import "SOGoActiveSyncDispatcher.h"
|
||||
|
||||
#import <DOM/DOMElement.h>
|
||||
#import <DOM/DOMProtocols.h>
|
||||
|
||||
@class WOResponse;
|
||||
|
||||
|
||||
@@ -29,15 +29,32 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#import "SOGoActiveSyncDispatcher+Sync.h"
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSAutoreleasePool.h>
|
||||
#import <Foundation/NSCalendarDate.h>
|
||||
#import <Foundation/NSNull.h>
|
||||
#import <Foundation/NSProcessInfo.h>
|
||||
#import <Foundation/NSSortDescriptor.h>
|
||||
#import <Foundation/NSTimeZone.h>
|
||||
#import <Foundation/NSURL.h>
|
||||
#import <Foundation/NSValue.h>
|
||||
|
||||
#import <NGObjWeb/NSException+HTTP.h>
|
||||
#import <NGObjWeb/SoApplication.h>
|
||||
#import <NGObjWeb/SoObject.h>
|
||||
#import <NGObjWeb/WOContext.h>
|
||||
#import <NGObjWeb/WOContext+SoObjects.h>
|
||||
#import <NGObjWeb/WOCookie.h>
|
||||
#import <NGObjWeb/WODirectAction.h>
|
||||
#import <NGObjWeb/WORequest.h>
|
||||
#import <NGObjWeb/WOResponse.h>
|
||||
|
||||
#import <NGCards/iCalCalendar.h>
|
||||
#import <NGCards/iCalEntityObject.h>
|
||||
#import <NGCards/iCalEvent.h>
|
||||
#import <NGCards/iCalPerson.h>
|
||||
#import <NGCards/iCalToDo.h>
|
||||
#import <NGCards/NGVCard.h>
|
||||
|
||||
#import <NGExtensions/NSCalendarDate+misc.h>
|
||||
#import <NGExtensions/NSObject+Logs.h>
|
||||
@@ -45,21 +62,40 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#import <NGImap4/NSString+Imap4.h>
|
||||
|
||||
#import <DOM/DOMElement.h>
|
||||
#import <DOM/DOMProtocols.h>
|
||||
|
||||
#import <EOControl/EOQualifier.h>
|
||||
|
||||
#import <SOGo/NSArray+DAV.h>
|
||||
#import <SOGo/SOGoCache.h>
|
||||
#import <SOGo/NSDictionary+DAV.h>
|
||||
#import <SOGo/SOGoDAVAuthenticator.h>
|
||||
#import <SOGo/SOGoDomainDefaults.h>
|
||||
#import <SOGo/SOGoMailer.h>
|
||||
#import <SOGo/SOGoSystemDefaults.h>
|
||||
#import <SOGo/SOGoUser.h>
|
||||
#import <SOGo/SOGoUserSettings.h>
|
||||
#import <SOGo/SOGoCacheGCSObject.h>
|
||||
#import <SOGo/SOGoPermissions.h>
|
||||
|
||||
#import <Appointments/iCalEntityObject+SOGo.h>
|
||||
#import <Appointments/SOGoAppointmentObject.h>
|
||||
#import <Appointments/SOGoAppointmentFolder.h>
|
||||
#import <Appointments/SOGoAppointmentFolders.h>
|
||||
#import <Appointments/SOGoTaskObject.h>
|
||||
|
||||
#import <Contacts/SOGoContactGCSEntry.h>
|
||||
#import <Contacts/SOGoContactGCSFolder.h>
|
||||
#import <Contacts/SOGoContactFolders.h>
|
||||
#import <Contacts/SOGoContactSourceFolder.h>
|
||||
|
||||
#import <Mailer/SOGoMailAccount.h>
|
||||
#import <Mailer/SOGoMailAccounts.h>
|
||||
#import <Mailer/SOGoMailFolder.h>
|
||||
#import <Mailer/SOGoMailObject.h>
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Mailer/SOGoMailNamespace.h>
|
||||
|
||||
#include "iCalEvent+ActiveSync.h"
|
||||
@@ -70,6 +106,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#include "NSDate+ActiveSync.h"
|
||||
#include "NSData+ActiveSync.h"
|
||||
#include "NSString+ActiveSync.h"
|
||||
#include "SOGoActiveSyncConstants.h"
|
||||
#include "SOGoMailObject+ActiveSync.h"
|
||||
#include "SOGoSyncCacheObject.h"
|
||||
|
||||
@@ -78,7 +115,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
@implementation SOGoActiveSyncDispatcher (Sync)
|
||||
|
||||
- (void) _setOrUnsetSyncRequest: (BOOL) set
|
||||
collections: (NSArray *) collections
|
||||
collections: (NSArray *) collections
|
||||
{
|
||||
SOGoCacheGCSObject *o;
|
||||
NSNumber *processIdentifier;
|
||||
@@ -273,7 +310,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
{
|
||||
NSMutableDictionary *folderMetadata, *dateCache, *syncCache, *uidCache, *allValues;
|
||||
NSString *clientId, *serverId, *easId;
|
||||
NSArray *additions, *roles;
|
||||
NSArray *additions;
|
||||
|
||||
id anAddition, sogoObject, o;
|
||||
BOOL is_new;
|
||||
@@ -297,7 +334,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
serverId = [NSString stringWithFormat: @"%@.vcf", [theCollection globallyUniqueObjectId]];
|
||||
sogoObject = [[SOGoContactGCSEntry alloc] initWithName: serverId
|
||||
inContainer: theCollection];
|
||||
[sogoObject autorelease];
|
||||
o = [sogoObject vCard];
|
||||
}
|
||||
break;
|
||||
@@ -321,7 +357,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
{
|
||||
sogoObject = [[SOGoAppointmentObject alloc] initWithName: [serverId sanitizedServerIdWithType: theFolderType]
|
||||
inContainer: theCollection];
|
||||
[sogoObject autorelease];
|
||||
o = [sogoObject component: YES secure: NO];
|
||||
}
|
||||
else
|
||||
@@ -336,7 +371,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
serverId = [NSString stringWithFormat: @"%@.ics", [theCollection globallyUniqueObjectId]];
|
||||
sogoObject = [[SOGoTaskObject alloc] initWithName: serverId
|
||||
inContainer: theCollection];
|
||||
[sogoObject autorelease];
|
||||
o = [sogoObject component: YES secure: NO];
|
||||
}
|
||||
break;
|
||||
@@ -348,28 +382,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
roles = [theCollection aclsForUser: [[context activeUser] login]];
|
||||
|
||||
if (![roles containsObject: SOGoRole_ObjectCreator] && ![[sogoObject ownerInContext: context] isEqualToString: [[context activeUser] login]])
|
||||
{
|
||||
// This will trigger a delete-command to remove the component without proper permission.
|
||||
// FIXME: ultimately, we need to find a better way to create a phantom object in the user's calendar
|
||||
// and delete it to keep the transactional process in shape. We could also create a deleted one right way
|
||||
// We strip any attendees from the values as we don't want to send bogus invitation emails
|
||||
[allValues removeObjectForKey: @"Attendees"];
|
||||
[o takeActiveSyncValues: allValues inContext: context];
|
||||
[sogoObject setIsNew: YES];
|
||||
[sogoObject saveComponent: o];
|
||||
[sogoObject delete];
|
||||
}
|
||||
else
|
||||
{
|
||||
[o takeActiveSyncValues: allValues inContext: context];
|
||||
[sogoObject setIsNew: is_new];
|
||||
[sogoObject saveComponent: o];
|
||||
}
|
||||
|
||||
|
||||
[o takeActiveSyncValues: allValues inContext: context];
|
||||
[sogoObject setIsNew: is_new];
|
||||
[sogoObject saveComponent: o];
|
||||
|
||||
// Update syncCache
|
||||
folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: theCollection withType: theFolderType]];
|
||||
|
||||
@@ -409,10 +426,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
[syncCache setObject: [NSString stringWithFormat:@"%f", [[sogoObject lastModified] timeIntervalSince1970]] forKey: serverId];
|
||||
[dateCache setObject: [NSCalendarDate date] forKey: serverId];
|
||||
|
||||
// make sure to pickup the delete immediately if we don't have proper permission to add
|
||||
if (![roles containsObject: SOGoRole_ObjectCreator] && ![[sogoObject ownerInContext: context] isEqualToString: [[context activeUser] login]])
|
||||
[folderMetadata setObject: [NSNumber numberWithBool: YES] forKey: @"MoreAvailable"];
|
||||
|
||||
[self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]];
|
||||
|
||||
// Everything is fine, lets generate our response
|
||||
@@ -469,7 +482,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
{
|
||||
NSDictionary *allChanges;
|
||||
NSString *serverId, *easId, *origServerId, *mergedFolder;
|
||||
NSArray *changes, *a, *roles;
|
||||
NSArray *changes, *a;
|
||||
id aChange, o, sogoObject;
|
||||
NSMutableDictionary *folderMetadata, *syncCache, *uidCache;
|
||||
|
||||
@@ -520,6 +533,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
{
|
||||
if (debugOn)
|
||||
[self logWithFormat: @"EAS - Found serverId: %@ for easId: %@", serverId, easId];
|
||||
|
||||
}
|
||||
else
|
||||
serverId = easId;
|
||||
@@ -543,60 +557,32 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
{
|
||||
case ActiveSyncContactFolder:
|
||||
{
|
||||
roles = [sogoObject aclsForUser:[[context activeUser] login]];
|
||||
o = [sogoObject vCard];
|
||||
o = [sogoObject vCard];
|
||||
[o takeActiveSyncValues: allChanges inContext: context];
|
||||
[sogoObject saveComponent: o];
|
||||
|
||||
// Don't update the component without proper permission
|
||||
if (([roles containsObject: SOGoRole_ObjectEditor] || [[sogoObject ownerInContext: context] isEqualToString: [[context activeUser] login]]))
|
||||
{
|
||||
[o takeActiveSyncValues: allChanges inContext: context];
|
||||
[sogoObject saveComponent: o];
|
||||
|
||||
if ([syncCache objectForKey: serverId])
|
||||
[syncCache setObject: [NSString stringWithFormat: @"%f", [[sogoObject lastModified] timeIntervalSince1970]] forKey: serverId];
|
||||
}
|
||||
// Trigger a change-command to override client changes since we don't have permissions
|
||||
else
|
||||
[sogoObject touch];
|
||||
if ([syncCache objectForKey: serverId])
|
||||
[syncCache setObject: [NSString stringWithFormat:@"%f", [[sogoObject lastModified] timeIntervalSince1970]] forKey: serverId];
|
||||
}
|
||||
break;
|
||||
case ActiveSyncEventFolder:
|
||||
case ActiveSyncTaskFolder:
|
||||
{
|
||||
roles = [sogoObject aclsForUser:[[context activeUser] login]];
|
||||
|
||||
o = [sogoObject component: NO secure: NO];
|
||||
|
||||
if (theFolderType == ActiveSyncEventFolder &&
|
||||
[(iCalEvent *)o userIsAttendee: [context activeUser]])
|
||||
{
|
||||
// Don't update the component without proper permission
|
||||
if ([roles containsObject: SOGoCalendarRole_ComponentResponder] || [[sogoObject ownerInContext: context] isEqualToString: [[context activeUser] login]])
|
||||
{
|
||||
[o changeParticipationStatus: allChanges inContext: context component: sogoObject];
|
||||
|
||||
if ([syncCache objectForKey: serverId])
|
||||
[syncCache setObject: [NSString stringWithFormat: @"%f", [[sogoObject lastModified] timeIntervalSince1970]] forKey: serverId];
|
||||
}
|
||||
// Trigger a change-command to override client changes since we don't have permissions
|
||||
else
|
||||
[sogoObject touch];
|
||||
[o changeParticipationStatus: allChanges inContext: context component: sogoObject];
|
||||
}
|
||||
else
|
||||
{
|
||||
// Don't update the component without proper permission
|
||||
if ([roles containsObject: SOGoCalendarRole_ComponentModifier] || [[sogoObject ownerInContext: context] isEqualToString: [[context activeUser] login]])
|
||||
{
|
||||
[o takeActiveSyncValues: allChanges inContext: context];
|
||||
[sogoObject saveComponent: o];
|
||||
[o takeActiveSyncValues: allChanges inContext: context];
|
||||
[sogoObject saveComponent: o];
|
||||
}
|
||||
|
||||
if ([syncCache objectForKey: serverId])
|
||||
[syncCache setObject: [NSString stringWithFormat: @"%f", [[sogoObject lastModified] timeIntervalSince1970]] forKey: serverId];
|
||||
}
|
||||
// Trigger a change-command to override client changes since we don't have permissions
|
||||
else
|
||||
[sogoObject touch];
|
||||
}
|
||||
if ([syncCache objectForKey: serverId])
|
||||
[syncCache setObject: [NSString stringWithFormat:@"%f", [[sogoObject lastModified] timeIntervalSince1970]] forKey: serverId];
|
||||
}
|
||||
break;
|
||||
case ActiveSyncMailFolder:
|
||||
@@ -611,12 +597,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
modseq = [[[result objectForKey: @"RawResponse"] objectForKey: @"fetch"] objectForKey: @"modseq"];
|
||||
|
||||
if (modseq && [syncCache objectForKey: serverId])
|
||||
[syncCache setObject: [modseq stringValue] forKey: serverId];
|
||||
[syncCache setObject: [modseq stringValue] forKey: serverId];
|
||||
}
|
||||
}
|
||||
|
||||
[self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]];
|
||||
|
||||
|
||||
[theBuffer appendString: @"<Change>"];
|
||||
[theBuffer appendFormat: @"<ServerId>%@</ServerId>", origServerId];
|
||||
[theBuffer appendFormat: @"<Status>%d</Status>", 1];
|
||||
@@ -655,9 +642,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
withType: (SOGoMicrosoftActiveSyncFolderType) theFolderType
|
||||
inBuffer: (NSMutableString *) theBuffer
|
||||
{
|
||||
NSString *serverId, *easId, *origServerId, *mergedFolder;
|
||||
NSArray *deletions, *a, *roles;
|
||||
|
||||
id aDelete, sogoObject, value;
|
||||
NSArray *deletions, *a;
|
||||
NSString *serverId, *easId, *origServerId, *mergedFolder;
|
||||
|
||||
BOOL deletesAsMoves, useTrash;
|
||||
int i;
|
||||
@@ -666,9 +654,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
if ([deletions count])
|
||||
{
|
||||
NSMutableDictionary *folderMetadata, *uidCache;
|
||||
NSMutableDictionary *folderMetadata, *dateCache, *syncCache, *uidCache;
|
||||
folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: theCollection withType: theFolderType]];
|
||||
|
||||
syncCache = [folderMetadata objectForKey: @"SyncCache"];
|
||||
dateCache = [folderMetadata objectForKey: @"DateCache"];
|
||||
uidCache = [folderMetadata objectForKey: @"UidCache"];
|
||||
|
||||
// From the documention, if DeletesAsMoves is missing, we must assume it's a YES.
|
||||
@@ -725,44 +715,22 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
if (![sogoObject isKindOfClass: [NSException class]])
|
||||
{
|
||||
// Remove the cache entry. If the delete fails due to permission issues we do a fake update to trigger
|
||||
// an add-command.
|
||||
NSMutableDictionary *folderMetadata, *dateCache, *syncCache;
|
||||
folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: theCollection withType: theFolderType]];
|
||||
|
||||
syncCache = [folderMetadata objectForKey: @"SyncCache"];
|
||||
dateCache = [folderMetadata objectForKey: @"DateCache"];
|
||||
|
||||
[syncCache removeObjectForKey: serverId];
|
||||
[dateCache removeObjectForKey: serverId];
|
||||
|
||||
[self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]];
|
||||
|
||||
// FIXME: handle errors here
|
||||
if (deletesAsMoves && theFolderType == ActiveSyncMailFolder)
|
||||
{
|
||||
[(SOGoMailFolder *)[sogoObject container] deleteUIDs: [NSArray arrayWithObjects: serverId, nil] useTrashFolder: &useTrash inContext: context];
|
||||
}
|
||||
else if (theFolderType == ActiveSyncEventFolder || theFolderType == ActiveSyncTaskFolder || theFolderType == ActiveSyncContactFolder)
|
||||
[(SOGoMailFolder *)[sogoObject container] deleteUIDs: [NSArray arrayWithObjects: serverId, nil] useTrashFolder: &useTrash inContext: context];
|
||||
else if (theFolderType == ActiveSyncEventFolder || theFolderType == ActiveSyncTaskFolder)
|
||||
{
|
||||
roles = [theCollection aclsForUser:[[context activeUser] login]];
|
||||
|
||||
// We check ACLs on the collection and not on the SOGo object itself, as the add/delete rights are on the collection itself
|
||||
if (![roles containsObject: SOGoRole_ObjectEraser] || ![[sogoObject ownerInContext: context] isEqualToString: [[context activeUser] login]])
|
||||
{
|
||||
// This will trigger an add-command to re-add the component to the client
|
||||
[sogoObject touch];
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!(theFolderType == ActiveSyncContactFolder))
|
||||
[sogoObject prepareDelete];
|
||||
[sogoObject delete];
|
||||
}
|
||||
[sogoObject prepareDelete];
|
||||
[sogoObject delete];
|
||||
}
|
||||
else
|
||||
[sogoObject delete];
|
||||
|
||||
[syncCache removeObjectForKey: serverId];
|
||||
[dateCache removeObjectForKey: serverId];
|
||||
//[uidCache removeObjectForKey: serverId];
|
||||
[self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]];
|
||||
|
||||
[theBuffer appendString: @"<Delete>"];
|
||||
[theBuffer appendFormat: @"<ServerId>%@</ServerId>", origServerId];
|
||||
[theBuffer appendFormat: @"<Status>%d</Status>", 1];
|
||||
@@ -1061,7 +1029,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
}
|
||||
}
|
||||
}
|
||||
} // if (cleanup_needed) ...
|
||||
}
|
||||
|
||||
return_count = 0;
|
||||
component = nil;
|
||||
@@ -1154,6 +1122,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
continue;
|
||||
}
|
||||
|
||||
return_count++;
|
||||
|
||||
sogoObject = [theCollection lookupName: [uid sanitizedServerIdWithType: theFolderType]
|
||||
inContext: context
|
||||
acquire: 0];
|
||||
@@ -1161,34 +1131,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
if (theFolderType == ActiveSyncContactFolder)
|
||||
componentObject = [sogoObject vCard];
|
||||
else
|
||||
componentObject = [sogoObject component: NO secure: YES];
|
||||
componentObject = [sogoObject component: NO secure: NO];
|
||||
|
||||
[syncCache setObject: [component objectForKey: @"c_lastmodified"] forKey: uid];
|
||||
|
||||
// We have got a null componentObject, i.e. we have no permission to view the calendar entry.
|
||||
// For updated calendar entries we have to remove it from the client and for new entries we just ignore them.
|
||||
if (!componentObject)
|
||||
{
|
||||
if (updated)
|
||||
{
|
||||
[s appendString: @"<Delete xmlns=\"AirSync:\">"];
|
||||
|
||||
if (![[theCollection nameInContainer] isEqualToString: @"personal"] && theMergeFolder)
|
||||
[s appendFormat: @"<ServerId xmlns=\"AirSync:\">%@{+}%@</ServerId>", [theCollection nameInContainer], easId];
|
||||
else
|
||||
[s appendFormat: @"<ServerId xmlns=\"AirSync:\">%@</ServerId>", easId];
|
||||
|
||||
[s appendString: @"</Delete>"];
|
||||
|
||||
[syncCache removeObjectForKey: uid];
|
||||
[dateCache removeObjectForKey: uid];
|
||||
return_count++;
|
||||
}
|
||||
|
||||
DESTROY(pool);
|
||||
continue;
|
||||
}
|
||||
|
||||
// No need to set dateCache for Contacts
|
||||
if ((theFolderType == ActiveSyncEventFolder || theFolderType == ActiveSyncTaskFolder))
|
||||
{
|
||||
@@ -1795,31 +1741,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
first_sync = NO;
|
||||
|
||||
// We check if the folder permissions have changed since the last sync. If so, we simply clear the cached data
|
||||
// and a "full sync" will be issued by the EAS client as it'll repull all elements from the collection.
|
||||
// We don't need to check for contact folder. Either it has View_object or it will be removed by FolderSync.
|
||||
if ((folderType == ActiveSyncEventFolder || folderType == ActiveSyncTaskFolder) && ![[collection ownerInContext: context] isEqualToString: [[context activeUser] login]])
|
||||
{
|
||||
NSArray *folderRoles, *folderRolesInCache;
|
||||
|
||||
folderRoles = [collection aclsForUser: [[context activeUser] login]];
|
||||
folderRolesInCache = [folderMetadata objectForKey: @"FolderPermissions"];
|
||||
if (![folderRoles isEqualToArray: folderRolesInCache])
|
||||
{
|
||||
if (debugOn)
|
||||
[self logWithFormat: @"EAS - Folder permission change: %@ (%@ <> %@). Refresh folder", [collection nameInContainer], folderRoles, folderRolesInCache];
|
||||
|
||||
// Cleanup metadata
|
||||
[folderMetadata removeObjectForKey: @"SyncKey"];
|
||||
[folderMetadata removeObjectForKey: @"SyncCache"];
|
||||
[folderMetadata removeObjectForKey: @"DateCache"];
|
||||
[folderMetadata removeObjectForKey: @"MoreAvailable"];
|
||||
|
||||
[folderMetadata setObject: folderRoles forKey: @"FolderPermissions"];
|
||||
[self _setFolderMetadata: folderMetadata forKey: folderKey];
|
||||
}
|
||||
}
|
||||
|
||||
if ([syncKey isEqualToString: @"0"])
|
||||
{
|
||||
davCollectionTag = @"-1";
|
||||
@@ -1958,10 +1879,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
// Windows phones don't like empty Responses tags - such as: <Responses></Responses>.
|
||||
// We only generate this tag when there is a response
|
||||
if (processed && [s length])
|
||||
{
|
||||
[commandsBuffer appendFormat: @"<Responses>%@</Responses>", s];
|
||||
getChanges = NO;
|
||||
}
|
||||
[commandsBuffer appendFormat: @"<Responses>%@</Responses>", s];
|
||||
}
|
||||
|
||||
|
||||
@@ -2104,7 +2022,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
if (!(mfCollection && [mfCollection synchronize]))
|
||||
{
|
||||
if (debugOn)
|
||||
[self logWithFormat: @"EAS - Folder %@ not found. Reset personal folder to cleanup", folderName];
|
||||
[self logWithFormat: @"EAS - Folder %@ not found. Reset peronal folder to cleanup", folderName];
|
||||
|
||||
davCollectionTag = @"0";
|
||||
*changeDetected = YES;
|
||||
@@ -2122,35 +2040,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
break;
|
||||
}
|
||||
|
||||
// Here we don't need to check for contact folder. Either it has View_object or it will be removed by folersync.
|
||||
if ((folderType == ActiveSyncEventFolder || folderType == ActiveSyncTaskFolder) && ![[mfCollection ownerInContext: context] isEqualToString: [[context activeUser] login]])
|
||||
{
|
||||
NSArray *folderRoles, *folderRolesInCache;
|
||||
|
||||
folderRoles = [mfCollection aclsForUser: [[context activeUser] login]];
|
||||
folderRolesInCache = [folderMetadata objectForKey: @"FolderPermissions"];
|
||||
|
||||
if (![folderRoles isEqualToArray: folderRolesInCache])
|
||||
{
|
||||
if (debugOn)
|
||||
[self logWithFormat: @"EAS - Folder permission change: %@ (%@ <> %@). Refresh folder", [collection nameInContainer], folderRoles, folderRolesInCache];
|
||||
|
||||
davCollectionTag = @"0";
|
||||
*changeDetected = YES;
|
||||
|
||||
status = 3;
|
||||
// Cleanup metadata
|
||||
[folderMetadata removeObjectForKey: @"SyncKey"];
|
||||
[folderMetadata removeObjectForKey: @"SyncCache"];
|
||||
[folderMetadata removeObjectForKey: @"DateCache"];
|
||||
[folderMetadata removeObjectForKey: @"MoreAvailable"];
|
||||
|
||||
[folderMetadata setObject: folderRoles forKey: @"FolderPermissions"];
|
||||
[self _setFolderMetadata: folderMetadata forKey: folderKey];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (debugOn)
|
||||
[self logWithFormat: @"EAS - Merging folder %@ into personal folder", folderName];
|
||||
|
||||
@@ -2211,7 +2100,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
cacheUpdateNeeded = YES;
|
||||
}
|
||||
}
|
||||
} // if (![changeBuffer length]) ...
|
||||
} // end if
|
||||
|
||||
if (*changeDetected || cacheUpdateNeeded)
|
||||
[self _setFolderMetadata: folderMetadata forKey: folderKey];
|
||||
@@ -2504,16 +2393,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
}
|
||||
else
|
||||
{
|
||||
int t;
|
||||
|
||||
[self logWithFormat: @"Sleeping %d seconds while detecting changes in Sync...", internalInterval-total_sleep];
|
||||
|
||||
for (t = 0; t < sleepInterval; t++)
|
||||
{
|
||||
if ([self easShouldTerminate])
|
||||
break;
|
||||
sleep(1);
|
||||
}
|
||||
sleep(sleepInterval);
|
||||
total_sleep += sleepInterval;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,7 +27,6 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
*/
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
|
||||
#include "SOGoActiveSyncConstants.h"
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -29,6 +29,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#include "SOGoMailObject+ActiveSync.h"
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSCalendarDate.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSException.h>
|
||||
@@ -38,10 +39,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import <NGCards/iCalCalendar.h>
|
||||
#import <NGCards/iCalDateTime.h>
|
||||
#import <NGCards/iCalEvent.h>
|
||||
#import <NGCards/iCalPerson.h>
|
||||
#import <NGCards/iCalTimeZone.h>
|
||||
|
||||
#import <NGExtensions/NGBase64Coding.h>
|
||||
#import <NGExtensions/NGQuotedPrintableCoding.h>
|
||||
|
||||
#import <NGExtensions/NSString+misc.h>
|
||||
#import <NGExtensions/NSString+Encoding.h>
|
||||
#import <NGImap4/NGImap4Envelope.h>
|
||||
@@ -49,7 +51,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import <NGImap4/NSString+Imap4.h>
|
||||
#import <NGObjWeb/WOContext+SoObjects.h>
|
||||
#import <NGObjWeb/WOApplication.h>
|
||||
#import <NGObjWeb/WORequest.h>
|
||||
|
||||
#import <NGMime/NGMimeBodyPart.h>
|
||||
#import <NGMime/NGMimeFileData.h>
|
||||
@@ -59,6 +60,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import <NGMail/NGMimeMessage.h>
|
||||
#import <NGMail/NGMimeMessageGenerator.h>
|
||||
|
||||
#import <Mailer/SOGoMailLabel.h>
|
||||
|
||||
#import <SOGo/SOGoUserDefaults.h>
|
||||
|
||||
#include "iCalTimeZone+ActiveSync.h"
|
||||
@@ -68,16 +71,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#include <Appointments/iCalEntityObject+SOGo.h>
|
||||
#include <Appointments/iCalPerson+SOGo.h>
|
||||
#include <Mailer/SOGoMailBodyPart.h>
|
||||
#include <Mailer/NSString+Mail.h>
|
||||
|
||||
#include <Mailer/SOGoMailBodyPart.h>
|
||||
#include <SOGo/SOGoUser.h>
|
||||
#include <SOGo/NSString+Utilities.h>
|
||||
|
||||
#import <Appointments/SOGoAptMailNotification.h>
|
||||
|
||||
|
||||
|
||||
unsigned char strToChar(char a, char b) {
|
||||
char encoder[3] = {'\0','\0','\0'};
|
||||
encoder[0] = a;
|
||||
@@ -424,7 +424,7 @@ struct GlobalObjectId {
|
||||
mimeType = [NGMimeType mimeType: [[thePart contentType] type]
|
||||
subType: [[thePart contentType] subType]
|
||||
parameters: [NSDictionary dictionaryWithObject: @"utf-8" forKey: @"charset"]];
|
||||
[(NGMimeBodyPart *)thePart setHeader: mimeType forKey: @"content-type"];
|
||||
[thePart setHeader: mimeType forKey: @"content-type"];
|
||||
|
||||
fdata = [[NGMimeFileData alloc] initWithBytes: [body bytes]
|
||||
length: [body length]];
|
||||
@@ -1003,7 +1003,7 @@ struct GlobalObjectId {
|
||||
[s appendFormat: @"<GlobalObjId xmlns=\"Email:\">%@</GlobalObjId>", [globalObjId activeSyncRepresentationInContext: context]];
|
||||
|
||||
// We set the right message type - we must set AS version to 14.1 for this
|
||||
if ([[context objectForKey: @"ASProtocolVersion"] floatValue] >= 14.1)
|
||||
if ([[context valueForKey: @"ASProtocolVersion"] floatValue] >= 14.1)
|
||||
[s appendFormat: @"<MeetingMessageType xmlns=\"Email2:\">%d</MeetingMessageType>", 1];
|
||||
|
||||
[s appendString: @"</MeetingRequest>"];
|
||||
@@ -1169,7 +1169,7 @@ struct GlobalObjectId {
|
||||
truncated = 0;
|
||||
}
|
||||
|
||||
if ([[context objectForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"])
|
||||
if ([[context valueForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"])
|
||||
{
|
||||
[s appendFormat: @"<Body xmlns=\"Email:\">%@</Body>", content];
|
||||
[s appendFormat: @"<BodyTruncated xmlns=\"Email:\">%d</BodyTruncated>", truncated];
|
||||
@@ -1204,7 +1204,7 @@ struct GlobalObjectId {
|
||||
{
|
||||
int i;
|
||||
|
||||
if ([[context objectForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"])
|
||||
if ([[context valueForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"])
|
||||
[s appendString: @"<Attachments xmlns=\"Email:\">"];
|
||||
else
|
||||
[s appendString: @"<Attachments xmlns=\"AirSyncBase:\">"];
|
||||
@@ -1219,12 +1219,12 @@ struct GlobalObjectId {
|
||||
// FileReference must be a unique identifier across the whole store. We use the following structure:
|
||||
// mail/<foldername>/<message UID/<pathofpart>
|
||||
// mail/INBOX/2
|
||||
if ([[context objectForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"])
|
||||
if ([[context valueForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"])
|
||||
[s appendFormat: @"<AttName>mail/%@/%@/%@</AttName>", [[[self container] relativeImap4Name] stringByEscapingURL], [self nameInContainer], [value objectForKey: @"path"]];
|
||||
else
|
||||
[s appendFormat: @"<FileReference>mail/%@/%@/%@</FileReference>", [[[self container] relativeImap4Name] stringByEscapingURL], [self nameInContainer], [value objectForKey: @"path"]];
|
||||
|
||||
if ([[context objectForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"])
|
||||
if ([[context valueForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"])
|
||||
{
|
||||
[s appendFormat: @"<AttMethod>%d</AttMethod>", 1];
|
||||
[s appendFormat: @"<AttSize>%d</AttSize>", [[value objectForKey: @"size"] intValue]];
|
||||
@@ -1273,7 +1273,7 @@ struct GlobalObjectId {
|
||||
[s appendFormat: @"</Categories>"];
|
||||
}
|
||||
|
||||
if ([[context objectForKey: @"ASProtocolVersion"] floatValue] >= 14.0)
|
||||
if ([[context valueForKey: @"ASProtocolVersion"] floatValue] >= 14.0)
|
||||
{
|
||||
id value;
|
||||
NSString *reference;
|
||||
@@ -1291,13 +1291,6 @@ struct GlobalObjectId {
|
||||
[s appendFormat: @"<ConversationId xmlns=\"Email2:\">%@</ConversationId>", [[[self inReplyTo] dataUsingEncoding: NSUTF8StringEncoding] activeSyncRepresentationInContext: context]];
|
||||
else if ([[self messageId] length] > 0)
|
||||
[s appendFormat: @"<ConversationId xmlns=\"Email2:\">%@</ConversationId>", [[[self messageId] dataUsingEncoding: NSUTF8StringEncoding] activeSyncRepresentationInContext: context]];
|
||||
|
||||
if ([self replied])
|
||||
[s appendFormat: @"<LastVerbExecuted xmlns=\"Email2:\">%d</LastVerbExecuted>", 1];
|
||||
else if ([self forwarded])
|
||||
[s appendFormat: @"<LastVerbExecuted xmlns=\"Email2:\">%d</LastVerbExecuted>", 3];
|
||||
else
|
||||
[s appendFormat: @"<LastVerbExecuted xmlns=\"Email2:\">%d</LastVerbExecuted>", 0];
|
||||
}
|
||||
|
||||
// FIXME - support these in the future
|
||||
|
||||
@@ -27,11 +27,9 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
*/
|
||||
|
||||
#import <NGObjWeb/SoObjectWebDAVDispatcher.h>
|
||||
|
||||
#include <NGObjWeb/SoObject+SoDAV.h>
|
||||
|
||||
#include <NGObjWeb/WEClientCapabilities.h>
|
||||
#include <NGObjWeb/WOContext.h>
|
||||
#include <NGObjWeb/WORequest.h>
|
||||
@@ -39,7 +37,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
|
||||
|
||||
@interface SoObjectWebDAVDispatcher (ActiveSync)
|
||||
|
||||
- (id)_callObjectMethod:(NSString *)_method inContext:(WOContext *)_ctx;
|
||||
|
||||
@@ -30,9 +30,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import "iCalAlarm+ActiveSync.h"
|
||||
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <NGExtensions/NSCalendarDate+misc.h>
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
#import <NGExtensions/NSString+misc.h>
|
||||
#import <NGObjWeb/WOContext.h>
|
||||
#import <NGObjWeb/WOContext+SoObjects.h>
|
||||
|
||||
#import <NGCards/iCalAlarm.h>
|
||||
#import <NGCards/iCalEvent.h>
|
||||
#import <NGCards/iCalTrigger.h>
|
||||
|
||||
@@ -30,19 +30,26 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#import "iCalEvent+ActiveSync.h"
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSCalendarDate.h>
|
||||
#import <Foundation/NSDate.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSTimeZone.h>
|
||||
|
||||
#import <NGExtensions/NSString+misc.h>
|
||||
#import <NGExtensions/NSCalendarDate+misc.h>
|
||||
#import <NGExtensions/NSObject+Logs.h>
|
||||
#import <NGObjWeb/WOContext.h>
|
||||
#import <NGObjWeb/WOContext+SoObjects.h>
|
||||
#import <NGObjWeb/WORequest.h>
|
||||
|
||||
#import <NGCards/iCalCalendar.h>
|
||||
#import <NGCards/iCalDateTime.h>
|
||||
#import <NGCards/iCalPerson.h>
|
||||
#import <NGCards/NSCalendarDate+NGCards.h>
|
||||
#import <NGCards/NSString+NGCards.h>
|
||||
#import <NGCards/iCalCalendar.h>
|
||||
|
||||
#import <SOGo/SOGoUser.h>
|
||||
#import <SOGo/SOGoUserDefaults.h>
|
||||
@@ -63,7 +70,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
- (int) _attendeeStatus: (iCalPerson *) attendee
|
||||
{
|
||||
int attendee_status;
|
||||
|
||||
|
||||
attendee_status = 5;
|
||||
if ([[attendee partStat] caseInsensitiveCompare: @"ACCEPTED"] == NSOrderedSame)
|
||||
attendee_status = 3;
|
||||
@@ -75,29 +82,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
return attendee_status;
|
||||
}
|
||||
|
||||
//
|
||||
// Possible values are:
|
||||
// 0 Free
|
||||
// 1 Tentative
|
||||
// 2 Busy
|
||||
// 3 Out of Office
|
||||
// 4 Working elsewhere
|
||||
//
|
||||
- (int) _busyStatus: (iCalPerson *) attendee
|
||||
{
|
||||
int attendee_status;
|
||||
|
||||
attendee_status = 2;
|
||||
|
||||
if ([[attendee partStat] caseInsensitiveCompare: @"DECLINED"] == NSOrderedSame)
|
||||
attendee_status = 0;
|
||||
else if ([[attendee partStat] caseInsensitiveCompare: @"TENTATIVE"] == NSOrderedSame)
|
||||
attendee_status = 1;
|
||||
|
||||
return attendee_status;
|
||||
}
|
||||
|
||||
|
||||
- (NSString *) activeSyncRepresentationInContext: (WOContext *) context
|
||||
{
|
||||
NSMutableString *s;
|
||||
@@ -206,7 +190,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
}
|
||||
else
|
||||
{
|
||||
meetingStatus = 0; // The event is an appointment, which has no attendees.
|
||||
meetingStatus = 0; // appointment
|
||||
}
|
||||
|
||||
// This depends on the 'NEEDS-ACTION' parameter.
|
||||
@@ -227,12 +211,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
[s appendFormat: @"<DisallowNewTimeProposal xmlns=\"Calendar:\">%d</DisallowNewTimeProposal>", 1];
|
||||
|
||||
// BusyStatus -- http://msdn.microsoft.com/en-us/library/ee202290(v=exchg.80).aspx
|
||||
[s appendFormat: @"<BusyStatus xmlns=\"Calendar:\">%d</BusyStatus>", [self _busyStatus: attendee]];
|
||||
}
|
||||
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];
|
||||
}
|
||||
|
||||
@@ -273,7 +251,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
// otherwise it'll prevent WP8 phones from sync'ing. See #3028 for details.
|
||||
o = [o activeSyncRepresentationInContext: context];
|
||||
|
||||
if ([[context objectForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"])
|
||||
if ([[context valueForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"])
|
||||
{
|
||||
[s appendFormat: @"<Body xmlns=\"Calendar:\">%@</Body>", o];
|
||||
[s appendString: @"<BodyTruncated xmlns=\"Calendar:\">0</BodyTruncated>"];
|
||||
@@ -516,7 +494,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
}
|
||||
|
||||
// FIXME: merge with iCalToDo
|
||||
if ([[context objectForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"])
|
||||
if ([[context valueForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"])
|
||||
{
|
||||
if ((o = [theValues objectForKey: @"Body"]))
|
||||
[self setComment: o];
|
||||
|
||||
@@ -35,42 +35,21 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
#import <NGCards/iCalEvent.h>
|
||||
#import <NGCards/iCalToDo.h>
|
||||
#import <NGCards/iCalByDayMask.h>
|
||||
|
||||
#import <NGCards/iCalDateTime.h>
|
||||
#import <NGCards/iCalTimeZone.h>
|
||||
|
||||
#import "NSCalendarDate+ActiveSync.h"
|
||||
#import "NSDate+ActiveSync.h"
|
||||
|
||||
@implementation iCalRecurrenceRule (ActiveSync)
|
||||
|
||||
- (NSCalendarDate *) _adjustedStartDate
|
||||
{
|
||||
iCalTimeZone *timeZone;
|
||||
|
||||
timeZone = [(iCalDateTime *)[[self parent] firstChildWithTag: @"dtstart"] timeZone];
|
||||
if (timeZone)
|
||||
return [timeZone computedDateForDate: [[self parent] startDate]];
|
||||
else
|
||||
return [[self parent] startDate];
|
||||
}
|
||||
|
||||
- (NSString *) activeSyncRepresentationInContext: (WOContext *) context
|
||||
{
|
||||
NSMutableString *s;
|
||||
NSString *t;
|
||||
int type;
|
||||
|
||||
s = [NSMutableString string];
|
||||
|
||||
if ([[self parent] isKindOfClass: [iCalToDo class]])
|
||||
t = @"Tasks";
|
||||
else
|
||||
t = @"Calendar";
|
||||
|
||||
[s appendFormat: @"<Recurrence xmlns=\"%@:\">", t];
|
||||
|
||||
[s appendString: @"<Recurrence xmlns=\"Calendar:\">"];
|
||||
|
||||
// 0 -> daily, 1 -> weekly, 2 -> montly, 5 -> yearly
|
||||
type = 0;
|
||||
@@ -82,11 +61,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
// 1 -> sunday, 2 -> monday, 4 -> tuesday, 8 -> wednesday, 16 -> thursday, 32 -> friday, 64 -> saturday, 127 -> last day of month (montly or yearl recurrences only)
|
||||
if ([[self byDayMask] isWeekDays])
|
||||
{
|
||||
[s appendFormat: @"<Recurrence_DayOfWeek xmlns=\"%@:\">%d</Recurrence_DayOfWeek>", t, (2|4|8|16|32)];
|
||||
[s appendFormat: @"<Recurrence_DayOfWeek xmlns=\"Calendar:\">%d</Recurrence_DayOfWeek>", (2|4|8|16|32)];
|
||||
}
|
||||
else
|
||||
{
|
||||
[s appendFormat: @"<Recurrence_Interval xmlns=\"%@:\">%d</Recurrence_Interval>", t, [self repeatInterval]];
|
||||
[s appendFormat: @"<Recurrence_Interval xmlns=\"Calendar:\">%d</Recurrence_Interval>", [self repeatInterval]];
|
||||
}
|
||||
}
|
||||
else if ([self frequency] == iCalRecurrenceFrequenceWeekly)
|
||||
@@ -111,11 +90,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
{
|
||||
// No byDayMask, we take the event's start date to compute the DayOfWeek
|
||||
// 0 == Sunday, 6 == Saturday
|
||||
v = (1 << [[self _adjustedStartDate] dayOfWeek]);
|
||||
v = (1 << [[[self parent] startDate] dayOfWeek]);
|
||||
}
|
||||
|
||||
[s appendFormat: @"<Recurrence_DayOfWeek xmlns=\"%@:\">%d</Recurrence_DayOfWeek>", t, v];
|
||||
[s appendFormat: @"<Recurrence_Interval xmlns=\"%@:\">%d</Recurrence_Interval>", t, [self repeatInterval]];
|
||||
[s appendFormat: @"<Recurrence_DayOfWeek xmlns=\"Calendar:\">%d</Recurrence_DayOfWeek>", v];
|
||||
[s appendFormat: @"<Recurrence_Interval xmlns=\"Calendar:\">%d</Recurrence_Interval>", [self repeatInterval]];
|
||||
}
|
||||
else if ([self frequency] == iCalRecurrenceFrequenceMonthly)
|
||||
{
|
||||
@@ -132,8 +111,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
if (firstOccurrence < 0)
|
||||
firstOccurrence = 5;
|
||||
|
||||
[s appendFormat: @"<Recurrence_DayOfWeek xmlns=\"%@:\">%d</Recurrence_DayOfWeek>", t, (1 << [dm firstDay])];
|
||||
[s appendFormat: @"<Recurrence_WeekOfMonth xmlns=\"%@:\">%d</Recurrence_WeekOfMonth>", t, firstOccurrence];
|
||||
[s appendFormat: @"<Recurrence_DayOfWeek xmlns=\"Calendar:\">%d</Recurrence_DayOfWeek>", (1 << [dm firstDay])];
|
||||
[s appendFormat: @"<Recurrence_WeekOfMonth xmlns=\"Calendar:\">%d</Recurrence_WeekOfMonth>", firstOccurrence];
|
||||
}
|
||||
else if ([[self byMonthDay] count])
|
||||
{
|
||||
@@ -147,8 +126,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
iCalByDayMask *dm;
|
||||
|
||||
dm = [self byDayMask];
|
||||
[s appendFormat: @"<Recurrence_DayOfWeek xmlns=\"%@:\">%d</Recurrence_DayOfWeek>", t, (1 << [dm firstDay])];
|
||||
[s appendFormat: @"<Recurrence_WeekOfMonth xmlns=\"%@:\">%d</Recurrence_WeekOfMonth>", t, 5];
|
||||
[s appendFormat: @"<Recurrence_DayOfWeek xmlns=\"Calendar:\">%d</Recurrence_DayOfWeek>", (1 << [dm firstDay])];
|
||||
[s appendFormat: @"<Recurrence_WeekOfMonth xmlns=\"Calendar:\">%d</Recurrence_WeekOfMonth>", 5];
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -160,7 +139,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
{
|
||||
// Simple reccurrence rule of type "Monthly"
|
||||
type = 2;
|
||||
[s appendFormat: @"<Recurrence_DayOfMonth xmlns=\"%@:\">%d</Recurrence_DayOfMonth>", t, [[self _adjustedStartDate] dayOfMonth]];
|
||||
[s appendFormat: @"<Recurrence_DayOfMonth xmlns=\"Calendar:\">%d</Recurrence_DayOfMonth>",
|
||||
(int)[[[self parent] startDate] dayOfMonth]];
|
||||
}
|
||||
}
|
||||
else if ([self frequency] == iCalRecurrenceFrequenceYearly)
|
||||
@@ -179,39 +159,33 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
if (firstOccurrence < 0)
|
||||
firstOccurrence = 5;
|
||||
|
||||
[s appendFormat: @"<Recurrence_DayOfWeek xmlns=\"%@:\">%d</Recurrence_DayOfWeek>", t, (1 << [dm firstDay])];
|
||||
[s appendFormat: @"<Recurrence_WeekOfMonth xmlns=\"%@:\">%d</Recurrence_WeekOfMonth>", t, firstOccurrence];
|
||||
[s appendFormat: @"<Recurrence_MonthOfYear xmlns=\"%@:\">%@</Recurrence_MonthOfYear>", t,
|
||||
[s appendFormat: @"<Recurrence_DayOfWeek xmlns=\"Calendar:\">%d</Recurrence_DayOfWeek>", (1 << [dm firstDay])];
|
||||
[s appendFormat: @"<Recurrence_WeekOfMonth xmlns=\"Calendar:\">%d</Recurrence_WeekOfMonth>", firstOccurrence];
|
||||
[s appendFormat: @"<Recurrence_MonthOfYear xmlns=\"Calendar:\">%@</Recurrence_MonthOfYear>",
|
||||
[self flattenedValuesForKey: @"bymonth"]];
|
||||
}
|
||||
else
|
||||
{
|
||||
type = 5; // Yearly
|
||||
|
||||
[s appendFormat: @"<Recurrence_DayOfMonth xmlns=\"%@:\">%@</Recurrence_DayOfMonth>", t,
|
||||
[s appendFormat: @"<Recurrence_DayOfMonth xmlns=\"Calendar:\">%@</Recurrence_DayOfMonth>",
|
||||
[self flattenedValuesForKey: @"bymonthday"]];
|
||||
|
||||
[s appendFormat: @"<Recurrence_MonthOfYear xmlns=\"%@:\">%@</Recurrence_MonthOfYear>", t,
|
||||
[s appendFormat: @"<Recurrence_MonthOfYear xmlns=\"Calendar:\">%@</Recurrence_MonthOfYear>",
|
||||
[self flattenedValuesForKey: @"bymonth"]];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
type = 5;
|
||||
[s appendFormat: @"<Recurrence_DayOfMonth xmlns=\"%@:\">%d</Recurrence_DayOfMonth>", t, [[self _adjustedStartDate] dayOfMonth]];
|
||||
[s appendFormat: @"<Recurrence_MonthOfYear xmlns=\"%@:\">%d</Recurrence_MonthOfYear>", t, [[self _adjustedStartDate] monthOfYear]];
|
||||
}
|
||||
type = 5;
|
||||
}
|
||||
|
||||
[s appendFormat: @"<Recurrence_Type xmlns=\"%@:\">%d</Recurrence_Type>", t, type];
|
||||
|
||||
if ([[self parent] isKindOfClass: [iCalToDo class]])
|
||||
[s appendFormat: @"<Recurrence_Start xmlns=\"%@:\">%@</Recurrence_Start>", t, [[[self parent] startDate] activeSyncRepresentationInContext: context]];
|
||||
[s appendFormat: @"<Recurrence_Type xmlns=\"Calendar:\">%d</Recurrence_Type>", type];
|
||||
|
||||
// Occurrences / Until
|
||||
//[s appendFormat: @"<Recurrence_Occurrences xmlns=\"Calendar:\">%d</Recurrence_Occurrences>", 5];
|
||||
if ([self repeatCount])
|
||||
{
|
||||
[s appendFormat: @"<Recurrence_Occurrences xmlns=\"%@:\">%@</Recurrence_Occurrences>", t,
|
||||
[s appendFormat: @"<Recurrence_Occurrences xmlns=\"Calendar:\">%@</Recurrence_Occurrences>",
|
||||
[self flattenedValuesForKey: @"count"]];
|
||||
}
|
||||
else if ([self untilDate])
|
||||
@@ -222,10 +196,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//ud = [[context activeUser] userDefaults];
|
||||
//[date setTimeZone: [ud timeZone]];
|
||||
|
||||
[s appendFormat: @"<Recurrence_Until xmlns=\"%@:\">%@</Recurrence_Until>", t,
|
||||
[s appendFormat: @"<Recurrence_Until xmlns=\"Calendar:\">%@</Recurrence_Until>",
|
||||
[date activeSyncRepresentationWithoutSeparatorsInContext: context]];
|
||||
}
|
||||
|
||||
|
||||
[s appendString: @"</Recurrence>"];
|
||||
|
||||
return s;
|
||||
|
||||
@@ -31,10 +31,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#include <Foundation/NSArray.h>
|
||||
#include <Foundation/NSCalendarDate.h>
|
||||
#include <Foundation/NSData.h>
|
||||
#include <Foundation/NSDate.h>
|
||||
#include <Foundation/NSString.h>
|
||||
|
||||
#import <NGCards/iCalByDayMask.h>
|
||||
#import <NGCards/iCalTimeZonePeriod.h>
|
||||
#import <NGCards/iCalRecurrenceRule.h>
|
||||
|
||||
#import <NGExtensions/NGBase64Coding.h>
|
||||
|
||||
#include "NSData+ActiveSync.h"
|
||||
|
||||
@@ -123,7 +128,7 @@ struct SYSTEMTIME {
|
||||
//uint16_t wStandardYear;
|
||||
struct SYSTEMTIME stStandardDate;
|
||||
//uint16_t wDaylightYear;
|
||||
struct SYSTEMTIME stDaylightDate = {0,0,0,0,0,0,0,0};
|
||||
struct SYSTEMTIME stDaylightDate;
|
||||
|
||||
char standardName[64], daylightName[64];
|
||||
|
||||
@@ -139,17 +144,13 @@ struct SYSTEMTIME {
|
||||
|
||||
period = [self _mostRecentPeriodWithName: @"DAYLIGHT"];
|
||||
if (!period)
|
||||
{
|
||||
stStandardDate.wMonth = 0;
|
||||
lDaylightBias = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
lDaylightBias = (uint32_t) -([period secondsOffsetFromGMT] / 60) - lBias;
|
||||
[period _fillTZDate: &stDaylightDate];
|
||||
//wStandardYear = stStandardDate.wYear;
|
||||
//wDaylightYear = stDaylightDate.wYear;
|
||||
}
|
||||
stStandardDate.wMonth = 0;
|
||||
|
||||
lDaylightBias = (uint32_t) -([period secondsOffsetFromGMT] / 60) - lBias;
|
||||
[period _fillTZDate: &stDaylightDate];
|
||||
//wStandardYear = stStandardDate.wYear;
|
||||
//wDaylightYear = stDaylightDate.wYear;
|
||||
|
||||
|
||||
// We build the timezone
|
||||
[bytes appendBytes: &lBias length: 4];
|
||||
|
||||
@@ -29,10 +29,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#import "iCalToDo+ActiveSync.h"
|
||||
|
||||
#import <Foundation/NSCalendarDate.h>
|
||||
#import <Foundation/NSDate.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSTimeZone.h>
|
||||
|
||||
#import <NGExtensions/NSString+misc.h>
|
||||
#import <NGObjWeb/WOContext.h>
|
||||
#import <NGObjWeb/WOContext+SoObjects.h>
|
||||
#import <NGObjWeb/WORequest.h>
|
||||
|
||||
@@ -45,7 +49,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#include "NSDate+ActiveSync.h"
|
||||
#include "NSString+ActiveSync.h"
|
||||
#include "iCalRecurrenceRule+ActiveSync.h"
|
||||
|
||||
|
||||
@implementation iCalToDo (ActiveSync)
|
||||
|
||||
@@ -80,10 +84,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
[s appendFormat: @"<DueDate xmlns=\"Tasks:\">%@</DueDate>", [o activeSyncRepresentationInContext: context]];
|
||||
[s appendFormat: @"<UTCDueDate xmlns=\"Tasks:\">%@</UTCDueDate>", [o activeSyncRepresentationInContext: context]];
|
||||
}
|
||||
|
||||
// Recurrence rules
|
||||
if ([self isRecurrent])
|
||||
[s appendString: [[[self recurrenceRules] lastObject] activeSyncRepresentationInContext: context]];
|
||||
|
||||
// Importance
|
||||
o = [self priority];
|
||||
@@ -131,7 +131,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
// otherwise it'll prevent WP8 phones from sync'ing. See #3028 for details.
|
||||
o = [o activeSyncRepresentationInContext: context];
|
||||
|
||||
if ([[context objectForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"])
|
||||
if ([[context valueForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"])
|
||||
{
|
||||
[s appendFormat: @"<Body xmlns=\"Tasks:\">%@</Body>", o];
|
||||
[s appendString: @"<BodyTruncated xmlns=\"Tasks:\">0</BodyTruncated>"];
|
||||
@@ -165,7 +165,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
[self setSummary: o];
|
||||
|
||||
// FIXME: merge with iCalEvent
|
||||
if ([[context objectForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"])
|
||||
if ([[context valueForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"])
|
||||
{
|
||||
if ((o = [theValues objectForKey: @"Body"]))
|
||||
[self setComment: o];
|
||||
@@ -251,29 +251,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
// Recurrence
|
||||
if ((o = [theValues objectForKey: @"Recurrence"]) && !([[o objectForKey: @"Recurrence_DeadOccur"] intValue]))
|
||||
{
|
||||
iCalRecurrenceRule *rule;
|
||||
|
||||
rule = [[iCalRecurrenceRule alloc] init];
|
||||
[self setRecurrenceRules: [NSArray arrayWithObject: rule]];
|
||||
RELEASE(rule);
|
||||
|
||||
[rule takeActiveSyncValues: o inContext: context];
|
||||
|
||||
if (!([theValues objectForKey: @"StartDate"]))
|
||||
{
|
||||
iCalDateTime *start;
|
||||
|
||||
start = (iCalDateTime *) [self uniqueChildWithTag: @"dtstart"];
|
||||
|
||||
[start setTimeZone: tz];
|
||||
[start setDate: [[o objectForKey: @"Recurrence_Start"] calendarDate]];
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@end
|
||||
+5655
File diff suppressed because it is too large.
Load diff
@@ -1,189 +0,0 @@
|
||||
Developer's Guide
|
||||
=================
|
||||
:toc: left
|
||||
:icons: font
|
||||
|
||||
////
|
||||
|
||||
This file is part of the SOGo project.
|
||||
|
||||
See docinfo.xml for authors, copyright and license information.
|
||||
|
||||
////
|
||||
|
||||
include::includes/global-attributes.asciidoc[]
|
||||
|
||||
UI and UX
|
||||
---------
|
||||
|
||||
* http://www.google.com/design/spec/material-design/
|
||||
* http://goodui.org/
|
||||
- Try Repeating Your Primary Action instead of showing it just once.
|
||||
- Try Distinct Clickable/Selected Styles instead of blurring them.
|
||||
- Try Undos instead of prompting for confirmation.
|
||||
- Try More Contrast instead of similarity.
|
||||
- Try Exposing Options instead of hiding them.
|
||||
- Try Showing State instead of being state agnostic.
|
||||
- Try Direct Manipulation instead of contextless menus.
|
||||
- Try Exposing Fields instead of creating extra pages.
|
||||
- Try Transitions instead of showing changes instantly.
|
||||
- Try Fewer Borders instead of wasting attention.
|
||||
- Try Designing For Zero Data instead of just data heavy cases.
|
||||
- Try Consistency instead of making people relearn.
|
||||
- Try Conventions instead of reinventing the wheel.
|
||||
- Try Visual Hierarchy instead of dullness.
|
||||
- Try Grouping Related Items instead of disordering.
|
||||
- Try Inline Validation instead of delaying errors.
|
||||
- Try Forgiving Inputs instead of being strict with data.
|
||||
- Try Bigger Click Areas instead of tiny ones.
|
||||
- Try Faster Load Times instead of making people wait.
|
||||
- Try Keyboard Shortcuts instead of buttons only.
|
||||
- Try Upfront Progress instead of starting with a blank.
|
||||
- Try Softer Prompts instead of modal windows.
|
||||
- Try Multifunctional Controls instead of more parts.
|
||||
- Try Icon Labels instead of opening for interpretation.
|
||||
* http://designmodo.com/create-style-guides/
|
||||
* http://uxmyths.com/
|
||||
|
||||
Frameworks & Tools
|
||||
------------------
|
||||
|
||||
GNUstep
|
||||
~~~~~~~
|
||||
|
||||
SOPE
|
||||
~~~~
|
||||
|
||||
JavaScript libraries
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* https://angularjs.org/
|
||||
* http://angular-ui.github.io/ui-router/
|
||||
* https://material.angularjs.org/
|
||||
* http://lodash.com/
|
||||
* https://github.com/nervgh/angular-file-upload
|
||||
|
||||
Code Style
|
||||
----------
|
||||
|
||||
Objective-C
|
||||
~~~~~~~~~~~
|
||||
|
||||
* To document the Web APIs, we follow the http://apidocjs.com/[APIDOC] standards.
|
||||
|
||||
apidoc -f ".*\\.m" -i UI -o Documentation/JSON-API
|
||||
|
||||
* When returning JSON from an object extending UIxComponent, use the following method:
|
||||
|
||||
- (WOResponse *) responseWithStatus: (unsigned int) status
|
||||
andJSONRepresentation: (NSObject *) contentObject;
|
||||
|
||||
HTML
|
||||
~~~~
|
||||
|
||||
* Localize your strings:
|
||||
|
||||
<var:string label:value="I'm localized!"/>
|
||||
|
||||
* Localize your attributes:
|
||||
|
||||
<input type="text" label:placeholder="I'm localized!"/>
|
||||
|
||||
* Reuse existing localized strings as much as possible. Otherwise don't forget to update the English Localizable.strings file of the appropriate module.
|
||||
|
||||
JavaScript
|
||||
~~~~~~~~~~
|
||||
|
||||
* http://eslint.org/
|
||||
* http://standardjs.com
|
||||
* https://github.com/toddmotto/angularjs-styleguide
|
||||
* https://github.com/angular/material/blob/master/docs/guides/CODING.md
|
||||
* http://jshint.com/
|
||||
* https://github.com/angular/material/tree/master/docs/guides
|
||||
|
||||
* We conform to https://github.com/airbnb/javascript[Airbnb coding standards]. Use https://github.com/jscs-dev/node-jscs[jscs] with the 'airbnb' preset to validate your code style:
|
||||
|
||||
jscs -p airbnb *.js
|
||||
|
||||
* For documentation, we follow the http://usejsdoc.org/[JSDoc3] standards:
|
||||
|
||||
jsdoc UI/WebServerResources/js/{Common,Contacts,Mailer,Preferences,Scheduler}/*.js -d Documentation/JavaScript-API
|
||||
|
||||
Models (facades)
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
////
|
||||
http://trochette.github.io/Angular-Design-Patterns-Best-Practices/
|
||||
////
|
||||
* Move business logic into models and share them.
|
||||
* Keep it simple, separate server interaction and error handling from the model. That way model only handle data processing and code is easier to maintain.
|
||||
|
||||
SASS/CSS
|
||||
~~~~~~~~
|
||||
|
||||
* http://componentcss.com/
|
||||
* https://github.com/styleguide/css
|
||||
* https://smacss.com/
|
||||
* http://cssguidelin.es/
|
||||
* http://sixrevisions.com/css/css-methodologies/
|
||||
* https://css-tricks.com/what-a-css-code-review-might-look-like/
|
||||
* http://una.im/classy-css/
|
||||
* http://stylelint.io/
|
||||
|
||||
A `@mixin` is like a stamp: it creates a duplicated version of the property block (optionally) with arguments provided. An `@extend` appends the element you are extending to the property block. It is your "yes, and ___" statement.
|
||||
|
||||
* For documentation, we follow http://sassdoc.com/[SassDoc] annotations.
|
||||
* We need the SASS files of Angular Material to build our CSS. The git repository of Angular Material is included as a submodule of SOGo:
|
||||
|
||||
git submodule init
|
||||
git submodule update
|
||||
|
||||
* FlexBox compatibility http://caniuse.com/#feat=flexbox
|
||||
|
||||
Fonts
|
||||
^^^^^
|
||||
|
||||
* http://mozilla.github.io/Fira/[Mozilla Fira]
|
||||
* https://www.google.com/design/icons/[Material icons]
|
||||
|
||||
Building frontend
|
||||
-----------------
|
||||
|
||||
* Install the latest stable release of https://nodejs.org[Node.js]
|
||||
* Install grunt
|
||||
|
||||
npm install -g grunt-cli
|
||||
npm install -g bower
|
||||
|
||||
* Generate JavaScript files
|
||||
|
||||
cd UI/WebServerResources
|
||||
npm install
|
||||
grunt build
|
||||
|
||||
Version Control
|
||||
---------------
|
||||
|
||||
* https://devcharm.com/articles/46/improve-your-git-workflow/
|
||||
* https://github.com/angular/material/blob/master/docs/guides/CONTRIBUTING.md#-commit-message-format
|
||||
* Each commit should cover only one thing;
|
||||
* Begin the commit message with a single short (less than 50 characters) line summarizing the change, followed by a blank line and then a more thorough description;
|
||||
* When fixing a bug, commit to the devel branch as well as the maintenance branch of the latest release version (named maintenance/x.y). When a ticket is associated to the bug, add to the description a line saying *Fixes #1234*.
|
||||
* `git pull` may introduce http://stackoverflow.com/questions/15316601/in-what-cases-could-git-pull-be-harmful[inconsistencies and problems]. Replace it with the following alias:
|
||||
|
||||
git config --global alias.up '!git remote update -p; git merge --ff-only @{u}'
|
||||
|
||||
Testing
|
||||
-------
|
||||
|
||||
* https://github.com/angular/protractor
|
||||
* http://karma-runner.github.io/
|
||||
|
||||
JSON API
|
||||
~~~~~~~~
|
||||
|
||||
One practical way to test the JSON API is to use `curl`. To do so, you need to enable `SOGoTrustProxyAuthentication` and configure HTTP authentifcation in Apache. You can pipe the result to http://stedolan.github.io/jq/[jq] to nicely format and filter the output:
|
||||
|
||||
curl -u username:password http://localhost/SOGo/so/username/Calendar/calendarslist | jq '.'
|
||||
|
||||
curl -u username:password -H 'Content-Type: application/json' -d '{}' http://localhost/SOGo/so/francis/Calendar/personal/71B6-54904400-1-7C308500.ics/save
|
||||
@@ -18,13 +18,13 @@ About this Guide
|
||||
|
||||
This guide will walk you through the installation and configuration of
|
||||
the SOGo solution. It also covers the installation and configuration of
|
||||
SOGo ActiveSync support - the solution used to synchronize mobile
|
||||
SOGo ActiveSync support – the solution used to synchronize mobile
|
||||
devices with SOGo.
|
||||
|
||||
The instructions are based on version {release_version} of SOGo.
|
||||
|
||||
The latest version of this guide is available
|
||||
at http://sogo.nu/downloads/documentation.html.
|
||||
at http://www.sogo.nu/downloads/documentation.html.
|
||||
|
||||
Introduction
|
||||
------------
|
||||
@@ -50,7 +50,8 @@ the SOGo Connector and the SOGo Integrator
|
||||
device, or Outlook 2013
|
||||
|
||||
SOGo is developed by a community of developers located mainly in North
|
||||
America and Europe. More information can be found at http://sogo.nu/
|
||||
America and Europe. More information can be found
|
||||
at http://www.sogo.nu/
|
||||
|
||||
Architecture and Compatibility
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
@@ -170,21 +171,21 @@ supported by SOGo:
|
||||
|
||||
* Red Hat Enterprise Linux (RHEL) Server 5, 6 and 7
|
||||
* Community ENTerprise Operating System (CentOS) 5, 6 and 7
|
||||
* Debian GNU/Linux 6.0 (Squeeze), 7.0 (Wheezy) and 8.0 (Jessie)
|
||||
* Ubuntu 12.04 (Precise), 14.04 (Trusty) and 16.04 (Xenial)
|
||||
* Debian GNU/Linux 6.0 (Squeeze) to 8.0 (Jessie)
|
||||
* Ubuntu 12.04 (Precise) to 14.04 (Trusty)
|
||||
|
||||
Make sure the required components are started automatically at boot time
|
||||
and that they are running before proceeding with the SOGo configuration.
|
||||
Also make sure that you can install additional packages from your
|
||||
standard distribution. For example, if you are using Red Hat Enterprise
|
||||
Linux 7, you have to be subscribed to the Red Hat Network before
|
||||
Linux 5, you have to be subscribed to the Red Hat Network before
|
||||
continuing with the SOGo software installation.
|
||||
|
||||
NOTE: This document covers the installation of SOGo under RHEL 7.
|
||||
NOTE: This document covers the installation of SOGo under RHEL 6.
|
||||
|
||||
For installation instructions on Debian and Ubuntu, please refer
|
||||
directly to the SOGo website at http://sogo.nu/.
|
||||
Under the _Support_ section, you will find links for installation steps
|
||||
directly to the SOGo website at http://www.sogo.nu/.
|
||||
Under the downloads section, you will find links for installation steps
|
||||
for Debian and Ubuntu.
|
||||
|
||||
Note that once the SOGo packages are installed under Debian and Ubuntu,
|
||||
@@ -195,17 +196,12 @@ Installation
|
||||
|
||||
This section will guide you through the installation of SOGo together
|
||||
with its dependencies. The steps described here apply to an RPM-based
|
||||
installation for a Red Hat or CentOS 7 distribution. Most of these steps
|
||||
installation for a Red Hat or CentOS 6 distribution. Most of these steps
|
||||
should apply to all supported operating systems.
|
||||
|
||||
Software Downloads
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
[NOTE]
|
||||
In order to access the production builds, you need a proper support contract
|
||||
from https://sogo.nu/support/index_new.html#support-plans[Inverse]. Continue
|
||||
with the configuration once you received your username and password.
|
||||
|
||||
SOGo can be installed using the `yum` utility. To do so, first create
|
||||
the `/etc/yum.repos.d/inverse.repo` configuration file with the following
|
||||
content:
|
||||
@@ -213,32 +209,17 @@ content:
|
||||
----
|
||||
[SOGo]
|
||||
name=Inverse SOGo Repository
|
||||
baseurl=https://<username>:<password>@packages.inverse.ca/SOGo/release/3/rhel/7/$basearch
|
||||
gpgcheck=1
|
||||
baseurl=http://inverse.ca/downloads/SOGo/RHEL6/$basearch
|
||||
gpgcheck=0
|
||||
----
|
||||
|
||||
[NOTE]
|
||||
Any non-URL safe characters in username/password must be URL-encoded. For
|
||||
example, if your password is `so%go`, you must set the value in your
|
||||
configuration file to `so%25go` - where `%` is encoded to `%25`.
|
||||
Some of the softwares on which SOGo depends are available from the
|
||||
repository of RepoForge (previously known as RPMforge). To add RepoForge
|
||||
to your packages sources, download and install the appropriate RPM
|
||||
package from http://packages.sw.be/rpmforge-release/.
|
||||
Also make sure you enabled the "rpmforge-extras" repository.
|
||||
|
||||
Inverse signs its RPM packages with its GPG key. Integrity verification happens
|
||||
all by itself on package installation, all you need to do is first import the
|
||||
key into your rpm keychain:
|
||||
|
||||
----
|
||||
rpm --import "https://pgp.mit.edu/pks/lookup?op=get&search=0xCB2D3A2AA0030E2C"
|
||||
----
|
||||
|
||||
Some of the softwares on which SOGo depends are available from the repository
|
||||
"Extra Packages for Enterprise Linux" (EPEL). To add EPEL to your packages
|
||||
sources, install the following package:
|
||||
|
||||
----
|
||||
rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
|
||||
----
|
||||
|
||||
For more information on EPEL, visit http://fedoraproject.org/wiki/EPEL/.
|
||||
For more information on using RepoForge, visit http://repoforge.org/use/.
|
||||
|
||||
Software Installation
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
@@ -523,8 +504,8 @@ In our example, we set the default domain to `acme.com`.
|
||||
meeting participants. Possible values are:
|
||||
|
||||
[options="compact"]
|
||||
* `YES` - to send notifications
|
||||
* `NO` - to not send notifications
|
||||
* `YES` – to send notifications
|
||||
* `NO` – to not send notifications
|
||||
|
||||
Defaults to `NO` when unset.
|
||||
|
||||
@@ -597,8 +578,6 @@ for SOGo. Possible values are:
|
||||
* `Basque`
|
||||
* `BrazilianPortuguese`
|
||||
* `Catalan`
|
||||
* `ChineseTaiwan`
|
||||
* `Croatian`
|
||||
* `Czech`
|
||||
* `Danish`
|
||||
* `Dutch`
|
||||
@@ -609,19 +588,14 @@ for SOGo. Possible values are:
|
||||
* `Hungarian`
|
||||
* `Icelandic`
|
||||
* `Italian`
|
||||
* `Lithuanian`
|
||||
* `Macedonian`
|
||||
* `NorwegianBokmal`
|
||||
* `NorwegianNynorsk`
|
||||
* `Polish`
|
||||
* `Portuguese`
|
||||
* `Russian`
|
||||
* `Slovak`
|
||||
* `Slovenian`
|
||||
* `SpanishArgentina`
|
||||
* `SpanishSpain`
|
||||
* `SpanishArgentina`
|
||||
* `Swedish`
|
||||
* `TurkishTurkey`
|
||||
* `Ukrainian`
|
||||
* `Welsh`
|
||||
|
||||
@@ -630,8 +604,8 @@ for SOGo. Possible values are:
|
||||
someone changes his/her own calendar. Possible values are:
|
||||
|
||||
[options="compact"]
|
||||
- `YES` - to send notifications
|
||||
- `NO` - to not send notifications
|
||||
- `YES` – to send notifications
|
||||
- `NO` – to not send notifications
|
||||
|
||||
Defaults to `NO` when unset. User can overwrite this from the calendar
|
||||
properties window.
|
||||
@@ -642,8 +616,8 @@ modification is being done to his/her own calendar by someone else.
|
||||
Possible values are:
|
||||
|
||||
[options="compact"]
|
||||
* `YES` - to send notifications
|
||||
* `NO` - to not send notifications
|
||||
* `YES` – to send notifications
|
||||
* `NO` – to not send notifications
|
||||
|
||||
Defaults to `NO` when unset. User can overwrite this from the calendar
|
||||
properties window.
|
||||
@@ -666,8 +640,8 @@ requiring not authentication) their calendars and address books.
|
||||
Possible values are:
|
||||
|
||||
[options="compact"]
|
||||
* `YES` - to allow them
|
||||
* `NO` - to prevent them from doing so
|
||||
* `YES` – to allow them
|
||||
* `NO` – to prevent them from doing so
|
||||
|
||||
Defaults to `NO` when unset.
|
||||
|
||||
@@ -678,8 +652,8 @@ SOGo.
|
||||
Possible values are:
|
||||
|
||||
[options="compact"]
|
||||
* `YES` - to allow them
|
||||
* `NO` - to prevent them from doing so
|
||||
* `YES` – to allow them
|
||||
* `NO` – to prevent them from doing so
|
||||
|
||||
Defaults to `NO` when unset.
|
||||
|
||||
@@ -709,7 +683,7 @@ Defaults to `NO` when unset.
|
||||
string (attendee completion, address book search, etc.) prior triggering
|
||||
the server-side search operation.
|
||||
|
||||
Defaults to `2` when unset - which means a search operation will be
|
||||
Defaults to `2` when unset – which means a search operation will be
|
||||
triggered on the 3rd typed character.
|
||||
|
||||
|S |SOGoMaximumFailedLoginCount
|
||||
@@ -762,10 +736,6 @@ any requests being made. Default value is 0, or disabled
|
||||
|Number of seconds, defaults to 300 (or 5 minutes). Note that _SOGoCacheCleanupInterval_
|
||||
must be set to a value equal or higher than _SOGoRequestBlockInterval_.
|
||||
|
||||
|D |SOGoXSRFValidationEnabled
|
||||
|Parameter used to enable or not XSRF (also known as CSRF) protection in SOGo.
|
||||
Default value is `NO`, or disabled.
|
||||
|
||||
|=======================================================================
|
||||
|
||||
Authentication using LDAP
|
||||
@@ -892,11 +862,11 @@ would be:
|
||||
CNFieldName = cn;
|
||||
IDFieldName = cn;
|
||||
UIDFieldName = cn;
|
||||
baseDN = "ou=groups,dc=inverse,dc=ca";
|
||||
baseDN = "ou=groups,dc=inverse,dc=ca”;
|
||||
bindDN = "cn=sogo,ou=services,dc=inverse,dc=ca";
|
||||
bindPassword = zot;
|
||||
canAuthenticate = YES;
|
||||
displayName = "Inverse Groups";
|
||||
displayName = “Inverse Groups”;
|
||||
hostname = ldap://127.0.0.1:389;
|
||||
id = inverse_groups;
|
||||
isAddressBook = YES;
|
||||
@@ -908,7 +878,7 @@ source:
|
||||
|
||||
[cols="^3,>47,50a"]
|
||||
|=======================================================================
|
||||
.36+|D <|SOGoUserSources
|
||||
.34+|D <|SOGoUserSources
|
||||
|Parameter used to set the LDAP and/or SQL sources used for
|
||||
authentication and global address books. Multiple sources can be
|
||||
specified as an array of dictionaries. A dictionary that defines an LDAP
|
||||
@@ -918,7 +888,7 @@ source can contain the following values:
|
||||
|The type of this user source, set to ldap` for an LDAP source.
|
||||
|
||||
|id
|
||||
|The identification name of the LDAP repository. This must be unique -
|
||||
|The identification name of the LDAP repository. This must be unique –
|
||||
even when using multiple domains.
|
||||
|
||||
|CNFieldName
|
||||
@@ -937,8 +907,7 @@ table.
|
||||
|
||||
|MailFieldNames
|
||||
|An array of fields that returns the user's email addresses (defaults to
|
||||
`mail` when unset). Note that SOGo will always automatically strip the
|
||||
protocol value from the attribute if the attribute name is `proxyAddresses`.
|
||||
`mail` when unset).
|
||||
|
||||
|SearchFieldNames
|
||||
|An array of fields to to match against the search string when filtering
|
||||
@@ -985,8 +954,8 @@ be marked as busy the first time it is booked.
|
||||
EOQualifier. The following operators are supported:
|
||||
|
||||
[options="compact"]
|
||||
* `<>` - inequality operator
|
||||
* `=` - equality operator
|
||||
* `<>` – inequality operator
|
||||
* `=` – equality operator
|
||||
|
||||
Multiple qualifiers can be joined by using `OR` and `AND`, they can also
|
||||
be grouped together by using parenthesis. Attribute values should be
|
||||
@@ -1048,9 +1017,9 @@ be specified as a LDAP Extension in the LDAP URL (e.g.
|
||||
without Password Policies enabled.
|
||||
|
||||
Possible values are: `none`, `plain`, `crypt`, `md5`, `md5-crypt`,
|
||||
`sha256-crypt` and `sha512-crypt`, `smd5`, `cram-md5` and `sha`, `sha256`,
|
||||
`sha512` and its ssha (e.g. `ssha` or `ssha256`) variants
|
||||
(plus setting of the encoding with `.b64` or `.hex`).
|
||||
`smd5`, `cram-md5` and `sha`, `sha256`, `sha512` and its ssha (e.g.
|
||||
`ssha` or `ssha256`) variants (plus setting of the encoding with `.b64`
|
||||
or `.hex`).
|
||||
|
||||
For a more detailed description see
|
||||
http://wiki.dovecot.org/Authentication/PasswordSchemes.
|
||||
@@ -1059,9 +1028,6 @@ Note that `cram-md5` is not actually using cram-md5 (due to the lack of
|
||||
challenge-response mechanism), its just saving the intermediate MD5
|
||||
context as Dovecot stores in its database.
|
||||
|
||||
Also note that `sha256-crypt` and `sha512-crypt` requires that your
|
||||
operating system supports glibc 2.7 or more recent.
|
||||
|
||||
|canAuthenticate
|
||||
|If set to `YES`, this LDAP source is used for authentication
|
||||
|
||||
@@ -1089,10 +1055,6 @@ not work for entries in this source and thus, freebusy lookups.
|
||||
|If set as an address book, the human identification name of the LDAP
|
||||
repository
|
||||
|
||||
|listRequiresDot (optional)
|
||||
|If set to `YES`, listing of this LDAP source is only possible when performing a search (respecting the SOGoSearchMinimumWordLength parameter) or when explicitely typing a single dot.
|
||||
Defaults to `YES` when unset.
|
||||
|
||||
|ModulesConstraints (optional)
|
||||
|Limits the access of any module through a constraint based on an LDAP
|
||||
attribute; must be a dictionary with keys `Mail`, and/or `Calendar`,
|
||||
@@ -1165,7 +1127,6 @@ LDAP Attributes Indexing
|
||||
To ensure proper performance of the SOGo application, the following LDAP
|
||||
attributes must be fully indexed:
|
||||
|
||||
[options="compact"]
|
||||
* givenName
|
||||
* cn
|
||||
* mail
|
||||
@@ -1361,7 +1322,7 @@ If you want to test the IdP-initiated logout using SimpleSAMLphp, you can do so
|
||||
the following URL:
|
||||
|
||||
----
|
||||
https://idp.example.org/simplesaml/saml2/idp/SingleLogoutService.php?ReturnTo=sogo.nu
|
||||
https://idp.example.org/simplesaml/saml2/idp/SingleLogoutService.php?ReturnTo=www.sogo.nu
|
||||
----
|
||||
|
||||
In order to relay authentication information to your IMAP server and if
|
||||
@@ -1409,9 +1370,9 @@ SOGoProfileURL =
|
||||
Create the database user and schema using the following commands:
|
||||
|
||||
----
|
||||
su - postgres
|
||||
createuser --no-superuser --no-createdb --no-createrole \
|
||||
--encrypted --pwprompt sogo
|
||||
su – postgres
|
||||
createuser --no-superuser --no-createdb –-no-createrole \
|
||||
–-encrypted --pwprompt sogo
|
||||
(specify “sogo” as password)
|
||||
createdb -O sogo sogo
|
||||
----
|
||||
@@ -1466,32 +1427,6 @@ _SOGoEnableEMailAlarms_ is set to `YES`. For PostgreSQL, the database
|
||||
URL could be set to something like:
|
||||
`postgresql://sogo:sogo@localhost:5432/sogo/sogo_alarms_folder`
|
||||
|
||||
|S |OCSStoreURL
|
||||
|Parameter used to set the database URL so that SOGo can use to store
|
||||
all content data. You must also set `OCSAclURL` and `OCSCacheFolderURL`
|
||||
if you set this parameter. Using these parameters will allow SOGo to use
|
||||
a total of nine database tables - and prevent SOGo from creating three
|
||||
database tables per collection.
|
||||
|
||||
For PostgresSQL, set the database URL to something like:
|
||||
`postgresql://sogo:@localhost:5432/sogo/sogo_store`.
|
||||
|
||||
|S |OCSAclURL
|
||||
|Parameter used to set the database URL so that SOGo can use to store
|
||||
all ACL data. You must also set `OCSStoreURL` and `OCSCacheFolderURL`
|
||||
if you set this parameter.
|
||||
|
||||
For PostgresSQL, set the database URL to something like:
|
||||
`postgresql://sogo:@localhost:5432/sogo/sogo_acl`.
|
||||
|
||||
|S |OCSCacheFolderURL
|
||||
|Parameter used to set the database URL so that SOGo can use to store
|
||||
all cache data. You must also set `OCSStoreURL` and `OCSAclURL`
|
||||
if you set this parameter.
|
||||
|
||||
For PostgresSQL, set the database URL to something like:
|
||||
`postgresql://sogo:@localhost:5432/sogo/sogo_cache_folder`.
|
||||
|
||||
See the "EMail reminders" section in this document for more information.
|
||||
|=======================================================================
|
||||
|
||||
@@ -1502,10 +1437,6 @@ For example, if your SOGo database password is `so%go`, you must set
|
||||
the value in your preferences to `so%25go` - where `%` is encoded
|
||||
to `%25`.
|
||||
|
||||
In addition to the seven tables described above, two other tables get
|
||||
created in the database: `sogo_quick_appointment` and `sogo_quick_contact`
|
||||
which store calendar and contact information.
|
||||
|
||||
If you're using MySQL, make sure in your `my.cnf` file you have:
|
||||
|
||||
----
|
||||
@@ -1521,72 +1452,6 @@ default-character-set=utf8
|
||||
default-character-set=utf8
|
||||
----
|
||||
|
||||
MySQL complete Unicode compliance
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
By default MySQL only supports a subset of UTF-8, meaning that characters such
|
||||
as emoji are not handled properly. Some extra steps at installation can be
|
||||
undertaken to leverage full Unicode support under MySQL.
|
||||
|
||||
IMPORTANT: Switching to complete Unicode compliance on an already-deployed SOGo
|
||||
is out of scope of this document, as it would typically involve delicate manual
|
||||
operations on the database system.
|
||||
|
||||
Requirements:
|
||||
|
||||
* MySQL >= 5.5
|
||||
* SOGo >= 3.1.0
|
||||
|
||||
Strongly suggested MySQL configuration settings (innodb* parameters are
|
||||
mandatory):
|
||||
|
||||
----
|
||||
[client]
|
||||
default-character-set = utf8mb4
|
||||
|
||||
[mysql]
|
||||
default-character-set = utf8mb4
|
||||
|
||||
[mysqld]
|
||||
character-set-client-handshake = FALSE
|
||||
character-set-server = utf8mb4
|
||||
collation-server = utf8mb4_unicode_ci
|
||||
innodb_file_per_table = TRUE
|
||||
innodb_file_format = barracuda
|
||||
innodb_large_prefix = TRUE
|
||||
----
|
||||
|
||||
CAUTION: Changing InnoDB parameters on an already deployed database server can
|
||||
cause severe data loss. Do not blindly edit MySQL parameters without reading
|
||||
and understanding the implication of such changes.
|
||||
|
||||
A parameter must be added to `sogo.conf` to turn on complete Unicode
|
||||
compliance:
|
||||
|
||||
----
|
||||
MySQL4Encoding = "utf8mb4";
|
||||
----
|
||||
|
||||
SOGo automatically creates missing database tables on start but slightly
|
||||
different table creation parameters are needed for complete Unicode compliance;
|
||||
meaning that before SOGo runs for the first time, all database tables must
|
||||
already exist. A MySQL script to achieve just that is provided in the SOGo
|
||||
distribution under `Scripts/mysql-utf8mb4.sql` and you can deploy it with
|
||||
a command such as:
|
||||
|
||||
----
|
||||
mysql -hHOST -uUSER -p -D SOGO < Scripts/mysql-utf8mb4.sql
|
||||
----
|
||||
|
||||
Where `HOST`, `USER` and `SOGO` are your MySQL host, username and database name
|
||||
respectively.
|
||||
|
||||
Once SOGo is running, you can test correctness by creating an event such as
|
||||
“Lunch with 🍕 and fries” and seeing it properly displayed in the SOGo
|
||||
calendar.
|
||||
|
||||
Ensure the computer used for the test has emoji fonts installed.
|
||||
|
||||
Authentication using SQL
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
@@ -1608,7 +1473,7 @@ source can contain the following values:
|
||||
|The type of this user source, set to `sql` for a SQL source.
|
||||
|
||||
|id
|
||||
|The identification name of the SQL repository. This must be unique -
|
||||
|The identification name of the SQL repository. This must be unique –
|
||||
even when using multiple domains.
|
||||
|
||||
|viewURL
|
||||
@@ -1616,14 +1481,14 @@ even when using multiple domains.
|
||||
present. Required columns are:
|
||||
|
||||
[options="compact"]
|
||||
* `c_uid`: will be used for authentication - it's a username or
|
||||
* `c_uid`: will be used for authentication – it's a username or
|
||||
username@domain.tld
|
||||
* `c_name`: will be used to uniquely identify entries - which can be
|
||||
* `c_name`: will be used to uniquely identify entries – which can be
|
||||
identical to `c_uid`
|
||||
* `c_password`: password of the user, plain text, crypt, md5 or sha
|
||||
encoded
|
||||
* `c_cn`: the user's common name
|
||||
* `mail`: the user's email address
|
||||
* mail : the user's email address
|
||||
|
||||
Other columns can exist and will actually be mapped automatically if
|
||||
they have the same name as popular LDAP attributes (such as `givenName`,
|
||||
@@ -1669,10 +1534,8 @@ repository.
|
||||
authentication usernames (defaults to `c_uid` when unset).
|
||||
|
||||
|MailFieldNames (optional)
|
||||
|An array of fields that specifies the column names that hold
|
||||
|Aan array of fields that specifies the column names that hold
|
||||
additional email addresses (beside the `mail` column) for each user.
|
||||
Values must be unique and not appear in more than one column.
|
||||
Space-separated values allowed in all *additional* columns (besides in `mail`).
|
||||
|
||||
|IMAPHostFieldName (optional)
|
||||
|The field that returns the IMAP hostname for the user.
|
||||
@@ -1726,14 +1589,14 @@ SOGoUserSources =
|
||||
|
||||
Certain database columns must be present in the view/table, such as:
|
||||
|
||||
* `c_uid` - will be used for authentication - it's the username
|
||||
* `c_uid` – will be used for authentication – it's the username
|
||||
or username@domain.tld
|
||||
* `c_name` - which can be identical to `c_uid` - will be used to
|
||||
* `c_name` – which can be identical to `c_uid` – will be used to
|
||||
uniquely identify entries
|
||||
* `c_password` - password of the user, plain-text, md5 or sha encoded
|
||||
* `c_password` – password of the user, plain-text, md5 or sha encoded
|
||||
for now
|
||||
* `c_cn` - the user's common name - such as "John Doe"
|
||||
* `mail` - the user's mail address
|
||||
* `c_cn` – the user's common name – such as "John Doe"
|
||||
* `mail` – the user's mail address
|
||||
|
||||
Note that groups are currently not supported for SQL-based
|
||||
authentication sources.
|
||||
@@ -1753,8 +1616,8 @@ The following table describes the related parameters.
|
||||
are:
|
||||
|
||||
[options="compact"]
|
||||
* `sendmail` - to use the sendmail binary
|
||||
* `smtp` - to use the SMTP protocol
|
||||
* `sendmail` – to use the sendmail binary
|
||||
* `smtp` – to use the SMTP protocol
|
||||
|
||||
|D |SOGoSMTPServer
|
||||
|The DNS name or IP address of the SMTP server used when
|
||||
@@ -1954,11 +1817,6 @@ behaviour of SOGo.
|
||||
|
||||
Defaults to `SOGo` when unset.
|
||||
|
||||
|S |SOGoHelpURL
|
||||
|Parameter used to define the URL to online help for SOGo. When set,
|
||||
an additional icon will appear near the logout button in SOGo's
|
||||
web interface. The URL will always be open in a separate page.
|
||||
|
||||
|U |SOGoLoginModule
|
||||
|Parameter used to specify which module to show after login. Possible
|
||||
values are:
|
||||
@@ -1997,17 +1855,7 @@ interface)
|
||||
|Parameter used to specify the default order of the columns from the
|
||||
SOGo webmail interface. The parameter is an array, for example:
|
||||
|
||||
`SOGoMailListViewColumnsOrder = (Flagged, Attachment, Priority, From, Subject, Unread, Date, Size);`
|
||||
|
||||
|D |SOGoExternalAvatarsEnabled
|
||||
|Parameter used to enable fetching of avatars from remote services.
|
||||
|
||||
Defaults to `YES` when unset.
|
||||
|
||||
|U |SOGoGravatarEnabled
|
||||
|Parameter used to activate fetching of avatars from http://gravatar.com/[Gravatar].
|
||||
|
||||
Defaults to `YES` when unset.
|
||||
SOGoMailListViewColumnsOrder = (Flagged, Attachment, Priority, From, Subject, Unread, Date, Size);
|
||||
|
||||
|D |SOGoVacationEnabled
|
||||
|Parameter used to activate the edition from the preferences window of a
|
||||
@@ -2024,33 +1872,6 @@ message expiration.
|
||||
See the _Cronjob — Vacation messages expiration_ section below for
|
||||
details.
|
||||
|
||||
|D |SOGoVacationDefaultSubject
|
||||
|Parameter used to define a default vacation subject if user don't specify a
|
||||
custom subject.
|
||||
|
||||
Defaults to the characters "Auto: " followed by the original subject when unset,
|
||||
as stated by RFC 5230.
|
||||
|
||||
|D |SOGoVacationHeaderTemplateFile
|
||||
|Parameter used to specify the path of a text file whose content must be
|
||||
prepended to the user's vacation message. For example:
|
||||
|
||||
`SOGoVacationHeaderTemplateFile = /etc/sogo/autoresponder.header.txt;`
|
||||
|
||||
The following template variables can appear in the content:
|
||||
|
||||
[options="compact"]
|
||||
* `%{username}`
|
||||
* `%{daysBetweenResponse}`
|
||||
|
||||
|D |SOGoVacationFooterTemplateFile
|
||||
|Parameter used to specify the path of a text file whose content must be
|
||||
appended to the user's vacation message. For example:
|
||||
|
||||
`SOGoVacationFooterTemplateFile = /etc/sogo/autoresponder.footer.txt;`
|
||||
|
||||
See `SOGoVacationHeaderTemplateFile` for available template variables.
|
||||
|
||||
|D |SOGoForwardEnabled
|
||||
|Parameter used to activate the edition from the preferences window of a
|
||||
forwarding email address. Requires Sieve script support on the IMAP
|
||||
@@ -2333,7 +2154,7 @@ be put under `~sogo/GNUstep/Library/SOGo/Templates/PreferencesUI/`.
|
||||
and the follow keys are supported: `vendor` (which must be set to "generic"
|
||||
for now), `junkEmailAddress` which sets the email address to whom SOGo will
|
||||
send junk mails to, `notJunkEmailAddress` which sets the email address to
|
||||
whom SOGo will send non-junk mails to and `limit`, which is an integer value
|
||||
whome SOGo will send non-junk mails to and `limit`, which is an integer value
|
||||
and sets the maximum number of mails that will be attached to a
|
||||
junk/not junk report sent by SOGo. Example: `SOGoMailJunkSettings = {
|
||||
vendor = "generic"; junkEmailAddress = "spam@foo.com";
|
||||
@@ -2485,7 +2306,7 @@ as keys for the the `domains` dictionary.
|
||||
|Parameter used to set domains visible among themselves. This parameter
|
||||
is an array of arrays.
|
||||
|
||||
Example: `SOGoDomainsVisibility = ( (acme, coyote) );`
|
||||
Example: `SOGoDomainsVisibility = ((acme, coyote));`
|
||||
|
||||
Defaults to an empty array, which means domains are isolated from each
|
||||
other.
|
||||
@@ -2512,7 +2333,7 @@ RequestHeader set "x-webobjects-server-url" "http://yourhostname"
|
||||
You may consider enabling SSL on top of this current installation to
|
||||
secure access to your SOGo installation.
|
||||
|
||||
See http://httpd.apache.org/docs/2.4/ssl/ for details.
|
||||
See http://httpd.apache.org/docs/2.2/ssl/ for details.
|
||||
|
||||
You might also have to adjust the configuration if you have SELinux
|
||||
enabled.
|
||||
@@ -2527,13 +2348,13 @@ Starting Services
|
||||
Once SOGo if fully installed and configured, start the services using
|
||||
the following command:
|
||||
|
||||
systemctl start sogod.service
|
||||
service sogod start
|
||||
|
||||
You may verify using the `systemctl is-enabled sogod` command that the SOGo
|
||||
service is automatically started at boot time. Restart the Apache service since
|
||||
You may verify using thechkconfigcommand that the SOGo service is
|
||||
automatically started at boot time. Restart the Apache service since
|
||||
modules and configuration files were added:
|
||||
|
||||
systemctl restart httpd.service
|
||||
service httpd restart
|
||||
|
||||
Finally, you should also make sure that the `memcached` service is
|
||||
started and that it is also automatically started at boot time.
|
||||
@@ -2562,11 +2383,11 @@ If your mail server requires use of SMTP AUTH, specify a credential file
|
||||
using `-p /path/to/credFile`. This file should contain the username and
|
||||
password, separated by a colon (`username:password`)
|
||||
|
||||
_Cronjob_ — Vacation messages activation and expiration
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
_Cronjob_ — Vacation messages expiration
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
When vacation messages are enabled (see the parameter
|
||||
_SOGoVacationEnabled_), users can set an activation or expiration date to messages
|
||||
_SOGoVacationEnabled_), users can set an expiration date to messages
|
||||
auto-reply. For this feature to work, you must run a _cronjob_ under the
|
||||
"sogo" user.
|
||||
|
||||
@@ -2580,7 +2401,7 @@ contain the username and password, separated by a colon
|
||||
The _cronjob_ should look like this:
|
||||
|
||||
----
|
||||
0 0 * * * sogo /usr/sbin/sogo-tool update-autoreply -p /etc/sogo/sieve.creds
|
||||
0 0 * * * sogo /usr/sbin/sogo-tool expire-autoreply -p /etc/sogo/sieve.creds
|
||||
----
|
||||
|
||||
Managing User Accounts
|
||||
@@ -2877,7 +2698,7 @@ your site. However, be aware that in order to use the SOGo Integrator
|
||||
plug in, you will need to repackage it with specific modifications.
|
||||
Please refer to the documentation published online:
|
||||
|
||||
http://sogo.nu/downloads/documentation.html
|
||||
http://www.sogo.nu/downloads/documentation.html
|
||||
|
||||
If you only use the SOGo Connector plug in, you can still easily access
|
||||
your data.
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
Mobile Devices Configuration Guide
|
||||
==================================
|
||||
:toc: left
|
||||
:icons: font
|
||||
|
||||
////
|
||||
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
Mozilla Thunderbird Configuration Guide
|
||||
=======================================
|
||||
:toc: left
|
||||
:icons: font
|
||||
|
||||
////
|
||||
|
||||
@@ -63,8 +61,9 @@ Mozilla Thunderbird
|
||||
|
||||
Mozilla Thunderbird is the official front end client of SOGo.
|
||||
|
||||
Mozilla Thunderbird versions 31, 38, 45 and above are supported
|
||||
and it is recommended to use the latest version of Thunderbird.
|
||||
Mozilla Thunderbird version 2, 3.1, 10 ESR (Extended Support Release),
|
||||
17 ESR, 24 and 31 are supported and it is recommended to use version 31 of
|
||||
Thunderbird.
|
||||
|
||||
In order to download and install Mozilla Thunderbird, please visit:
|
||||
|
||||
@@ -73,16 +72,33 @@ https://www.mozilla.org/en-US/thunderbird/organizations/all-esr.html
|
||||
Mozilla Lightning
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
When using Thunderbird, you can use the latest version of Mozilla
|
||||
Lightning. Use the Add-ons manager of Thunderbird or visit:
|
||||
When using version 24 or 31 of Thunderbird, you can use the latest version of
|
||||
Mozilla Lightning. Use the Add-ons manager of Thunderbird or visit:
|
||||
|
||||
https://addons.mozilla.org/en-US/thunderbird/addon/lightning/
|
||||
|
||||
When using version 17 ESR of Thunderbird, you can use Mozilla Lightning
|
||||
version 1.9.1. In order to download the extension, please visit:
|
||||
|
||||
https://addons.mozilla.org/en-US/thunderbird/addon/lightning/versions/1.9.1
|
||||
|
||||
For Thunderbird 2 and 3.1, you need the _Inverse Edition_of Mozilla
|
||||
Lightning. It provides back ported features, bug fixes and security
|
||||
fixes from the current development version of Mozilla Lightning. For
|
||||
Thunderbird 2, it is based on release version 0.9 of Lightning. For
|
||||
Thunderbird 3.1, it is based on 1.0b2.
|
||||
|
||||
In order to download and install Mozilla Lightning – Inverse Edition for
|
||||
Thunderbird 2 or 3.1, please visit:
|
||||
|
||||
http://www.sogo.nu/downloads/frontends.html
|
||||
|
||||
SOGo Connector and SOGo Integrator
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The SOGo Connector and Integrator extensions are provided to perfect the
|
||||
integration of Mozilla Thunderbird with the SOGo groupware solution.
|
||||
integration of Mozilla Thunderbird 2, 3.1, 10 ESR, 17 ESR, 24 and 31 with
|
||||
the SOGo groupware solution.
|
||||
|
||||
First of all, the SOGo Connector extension transforms Thunderbird into a
|
||||
full DAV client for groupware servers such as SOGo, eGroupware or
|
||||
@@ -120,7 +136,7 @@ extensions, please visit:
|
||||
http://www.sogo.nu/downloads/frontends.html
|
||||
|
||||
Prior to installing the SOGo Integrator extension, you should read the
|
||||
following chapter - _SOGo Integrator Customization_.
|
||||
following chapter – _SOGo Integrator Customization_.
|
||||
|
||||
SOGo Integrator Customization
|
||||
-----------------------------
|
||||
@@ -141,7 +157,7 @@ the same user name used to connect to the first email server configured
|
||||
in Thunderbird. It is a current limitation but it will fit nearly all
|
||||
configurations out there.
|
||||
|
||||
For testing purpose, it is strongly recommended to create and
|
||||
For testing purpose, you are strongly recommended to create and
|
||||
configure an additional user profile for Thunderbird. This is for two
|
||||
reasons. The first is because of the limitation mentioned above. The
|
||||
second is because the Integrator will synchronize your personal address
|
||||
@@ -152,7 +168,7 @@ you may want to make a copy of that address book beforehand.
|
||||
The second part requires editing one file in the extension file sub tree
|
||||
to specify where the SOGo server is located. This is done by hand. In an
|
||||
enterprise environment, this step is only required once per release
|
||||
since the updates are expected to propagate automatically.
|
||||
since the updates are expected to propagate automatically.
|
||||
|
||||
Uncompress (using a ZIP or jar tool) the SOGo Integrator XPI and locate
|
||||
the following file:
|
||||
@@ -179,7 +195,7 @@ if the SOGo server is accessible from the following URL:
|
||||
|
||||
Note that if you changed the `x-webobjects-server-url` configuration
|
||||
setting from your HTTP server configuration file for SOGo, the
|
||||
value *must* match the one you specify in `isi:updateURL` - even the
|
||||
value *must* match the one you specify in `isi:updateURL` – even the
|
||||
port number.
|
||||
|
||||
Moreover, you *must* change the value of the
|
||||
@@ -200,7 +216,7 @@ In this section, you will learn how to install and configure the SOGo
|
||||
Update Server.
|
||||
|
||||
The SOGo Update Server can be used to automatically install or uninstall
|
||||
Mozilla Thunderbird extensions, push user settings and more - all from a
|
||||
Mozilla Thunderbird extensions, push user settings and more – all from a
|
||||
central place managed by system administrators.
|
||||
|
||||
Installation
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
Native Microsoft Outlook Configuration Guide
|
||||
============================================
|
||||
:toc: left
|
||||
:icons: font
|
||||
|
||||
////
|
||||
|
||||
@@ -144,7 +142,7 @@ to authenticate users. A SOGoUserSources entry to achieve this wold look
|
||||
like this:
|
||||
|
||||
----
|
||||
su - sogo
|
||||
su – sogo
|
||||
defaults write sogod SOGoUserSources '(
|
||||
{
|
||||
CNFieldName = displayName;
|
||||
@@ -247,7 +245,7 @@ http://www.sogo.nu/english/downloads/backend.html.
|
||||
In order to satisfy certain dependencies, you should also add the EPEL
|
||||
source corresponding to your distribution and architecture. More
|
||||
information on this is available here:
|
||||
http://fedoraproject.org/wiki/EPEL - or more specifically,
|
||||
http://fedoraproject.org/wiki/EPEL – or more specifically,
|
||||
http://fedoraproject.org/wiki/EPEL/FAQ#How_can_I_install_the_packages_from_the_EPEL_software_repository.3F.
|
||||
|
||||
Once ready, install the OpenChange packages on top of an existing SOGo
|
||||
@@ -321,11 +319,11 @@ disable the upstart check. For more details, refer to:
|
||||
https://wiki.samba.org/index.php/Samba4/InitScript
|
||||
////
|
||||
|
||||
Ubuntu 16.04 (Xenial Xerus)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Debian 8 (Jessie) and Ubuntu 14.04 (Trusty Tahr)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Please follow the instructions from
|
||||
https://sogo.nu/download.html to setup your
|
||||
http://www.sogo.nu/english/downloads/backend.html to setup your
|
||||
apt sources.
|
||||
|
||||
Then install Samba 4 on top of an existing SOGo
|
||||
@@ -722,7 +720,7 @@ Adding Users
|
||||
------------
|
||||
|
||||
Users that wish to connect natively to SOGo must be provisioned in
|
||||
Samba 4 and in OpenChange - even if they already exist in your current
|
||||
Samba 4 and in OpenChange – even if they already exist in your current
|
||||
LDAP or Microsoft Active Directory server.
|
||||
|
||||
To add a user, execute the following commands:
|
||||
@@ -805,6 +803,10 @@ contact Inverse by sending an email to support@inverse.ca.
|
||||
General
|
||||
^^^^^^^
|
||||
|
||||
* If you can't see any email's content with Microsoft Outlook 2007,
|
||||
install the latest Service Pack available from Microsoft's website for
|
||||
this specific version. Microsoft Outlook 2007 (12.0.6423.100) SP2 MSO
|
||||
(12.0.6425.1000) is known to work.
|
||||
* When you create a new Microsoft Outlook profile, not all folders might
|
||||
be synchronized during the first start. Simply select the appropriate
|
||||
folder and click "Send and Receive". Synchronizing a folder may take
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<!-- TODO have the build system take care of this -->
|
||||
<releaseinfo>Version 3.2.2 - November 2016</releaseinfo>
|
||||
<subtitle>for version 3.2.2</subtitle>
|
||||
<date>2016-11-23</date>
|
||||
<releaseinfo>Version 2.3.14 - August 2016</releaseinfo>
|
||||
<subtitle>for version 2.3.14</subtitle>
|
||||
<date>2016-08-017</date>
|
||||
|
||||
<legalnotice>
|
||||
<para>Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".</para>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
Authors:
|
||||
- Inverse inc. <info@inverse.ca>
|
||||
|
||||
Copyright (C) 2008-2016 Inverse inc.
|
||||
Copyright (C) 2008-2014 Inverse inc.
|
||||
License: GFDL 1.2 or later. http://www.gnu.org/licenses/fdl.html
|
||||
|
||||
////
|
||||
@@ -17,7 +17,7 @@ Additional Information
|
||||
For more information, please consult the online FAQs (Frequently Asked
|
||||
Questions) :
|
||||
|
||||
http://sogo.nu/support/faq.html
|
||||
http://www.sogo.nu/english/support/faq.html
|
||||
|
||||
You can also read the mailing archives or post your questions to it. For
|
||||
details, see :
|
||||
|
||||
@@ -13,6 +13,6 @@
|
||||
|
||||
// TODO have the build system take care of this
|
||||
|
||||
:release_version: 3.2.2
|
||||
:release_version: 2.3.14
|
||||
|
||||
// vim: set syntax=asciidoc tabstop=2 shiftwidth=2 expandtab:
|
||||
@@ -19,6 +19,7 @@
|
||||
02111-1307, USA.
|
||||
*/
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
|
||||
@interface MainUIProduct : NSObject
|
||||
{
|
||||
@@ -26,6 +27,7 @@
|
||||
|
||||
@end
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@implementation MainUIProduct
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#import <Foundation/NSException.h>
|
||||
|
||||
@interface NSException (SOGoExtensions)
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include <execinfo.h>
|
||||
|
||||
#import "NSException+Stacktrace.h"
|
||||
|
||||
|
||||
+4
-1
@@ -1,6 +1,8 @@
|
||||
/* SOGo+DAV.h - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2010-2016 Inverse inc.
|
||||
* Copyright (C) 2010 Inverse inc.
|
||||
*
|
||||
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
*
|
||||
* This file is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -29,6 +31,7 @@
|
||||
@interface SOGo (SOGoWebDAVExtensions)
|
||||
|
||||
- (WOResponse *) davPrincipalMatch: (WOContext *) localContext;
|
||||
// - (WOResponse *) davPrincipalPropertySearch: (WOContext *) localContext;
|
||||
- (WOResponse *) davPrincipalSearchPropertySet: (WOContext *) localContext;
|
||||
|
||||
@end
|
||||
|
||||
+29
-17
@@ -1,6 +1,6 @@
|
||||
/* SOGo+DAV.m - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2010-2016 Inverse inc.
|
||||
* Copyright (C) 2010-2013 Inverse inc.
|
||||
*
|
||||
* This file is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -18,12 +18,18 @@
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSEnumerator.h>
|
||||
|
||||
#import <NGObjWeb/NSException+HTTP.h>
|
||||
#import <NGObjWeb/SoObject+SoDAV.h>
|
||||
#import <NGObjWeb/WOContext+SoObjects.h>
|
||||
#import <NGObjWeb/WORequest.h>
|
||||
#import <NGExtensions/NSObject+Logs.h>
|
||||
|
||||
#import <DOM/DOMDocument.h>
|
||||
#import <DOM/DOMNode.h>
|
||||
#import <DOM/DOMProtocols.h>
|
||||
#import <SaxObjC/XMLNamespaces.h>
|
||||
|
||||
#import <SOGo/NSArray+Utilities.h>
|
||||
@@ -36,7 +42,6 @@
|
||||
#import <SOGo/SOGoPermissions.h>
|
||||
#import <SOGo/SOGoUser.h>
|
||||
#import <SOGo/SOGoUserFolder.h>
|
||||
#import <SOGo/SOGoUserManager.h>
|
||||
|
||||
#import "SOGo+DAV.h"
|
||||
|
||||
@@ -179,8 +184,9 @@
|
||||
[hrefs addObject: [self davURLAsString]];
|
||||
}
|
||||
|
||||
- (NSDictionary *) _handlePrincipalMatchPrincipalProperty: (id <DOMElement>) child
|
||||
inContext: (WOContext *) localContext
|
||||
- (NSDictionary *)
|
||||
_handlePrincipalMatchPrincipalProperty: (id <DOMElement>) child
|
||||
inContext: (WOContext *) localContext
|
||||
{
|
||||
NSMutableArray *hrefs;
|
||||
NSDictionary *response;
|
||||
@@ -359,26 +365,31 @@
|
||||
withEmailAddressSetMatching: (NSString *) value
|
||||
inContext: (WOContext *) localContext
|
||||
{
|
||||
SOGoUserManager *um;
|
||||
id <SOGoSource> authenticationSource;
|
||||
SOGoUser *activeUser;
|
||||
NSArray *records;
|
||||
NSUInteger count, max;
|
||||
NSString *uid;
|
||||
SOGoUserFolder *collection;
|
||||
|
||||
um = [SOGoUserManager sharedUserManager];
|
||||
records = [um fetchUsersMatching: value
|
||||
inDomain: [[localContext activeUser] domain]];
|
||||
|
||||
max = [records count];
|
||||
for (count = 0; count < max; count++)
|
||||
activeUser = [localContext activeUser];
|
||||
if ([activeUser respondsToSelector: @selector (authenticationSource)])
|
||||
{
|
||||
uid = [[records objectAtIndex: count] objectForKey: @"c_uid"];
|
||||
if ([uid length] > 0)
|
||||
{
|
||||
collection = [[SOGoUser userWithLogin: uid]
|
||||
authenticationSource = [[localContext activeUser] authenticationSource];
|
||||
records = [authenticationSource
|
||||
fetchContactsMatching: value
|
||||
inDomain: [activeUser domain]];
|
||||
max = [records count];
|
||||
for (count = 0; count < max; count++)
|
||||
{
|
||||
uid = [[records objectAtIndex: count] objectForKey: @"c_uid"];
|
||||
if ([uid length] > 0)
|
||||
{
|
||||
collection = [[SOGoUser userWithLogin: uid]
|
||||
homeFolderInContext: localContext];
|
||||
[collections addObject: collection];
|
||||
}
|
||||
[collections addObject: collection];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -574,6 +585,7 @@
|
||||
@"addressbook", @"calendar-access",
|
||||
@"calendar-schedule", @"calendar-auto-schedule",
|
||||
@"calendar-proxy",
|
||||
|
||||
@"calendar-query-extended",
|
||||
@"extended-mkcol",
|
||||
@"calendarserver-principal-property-search",
|
||||
|
||||
+3
-1
@@ -1,5 +1,6 @@
|
||||
/*
|
||||
Copyright (C) 2005-2016 Inverse inc.
|
||||
Copyright (C) 2005-2010 Inverse inc.
|
||||
Copyright (C) 2004-2005 SKYRIX Software AG
|
||||
|
||||
This file is part of SOGo.
|
||||
|
||||
@@ -26,6 +27,7 @@
|
||||
|
||||
@class NSArray;
|
||||
@class NSDictionary;
|
||||
@class NSMutableDictionary;
|
||||
|
||||
@class SOGoCache;
|
||||
|
||||
|
||||
+23
-72
@@ -1,5 +1,6 @@
|
||||
/*
|
||||
Copyright (C) 2005-2016 Inverse inc.
|
||||
Copyright (C) 2005-2014 Inverse inc.
|
||||
Copyright (C) 2004-2005 SKYRIX Software AG
|
||||
|
||||
This file is part of SOGo
|
||||
|
||||
@@ -19,11 +20,18 @@
|
||||
02111-1307, USA.
|
||||
*/
|
||||
|
||||
#import <Foundation/NSAutoreleasePool.h>
|
||||
#import <Foundation/NSDebug.h>
|
||||
#import <Foundation/NSData.h>
|
||||
#import <Foundation/NSDate.h>
|
||||
#import <Foundation/NSEnumerator.h>
|
||||
#import <Foundation/NSProcessInfo.h>
|
||||
#import <Foundation/NSRunLoop.h>
|
||||
#import <Foundation/NSURL.h>
|
||||
|
||||
#import <GDLAccess/EOAdaptorChannel.h>
|
||||
#import <GDLContentStore/GCSChannelManager.h>
|
||||
#import <GDLContentStore/GCSFolderManager.h>
|
||||
#import <GDLContentStore/GCSFolderType.h>
|
||||
#import <GDLContentStore/GCSAlarmsFolder.h>
|
||||
#import <GDLContentStore/GCSSessionsFolder.h>
|
||||
|
||||
@@ -50,6 +58,7 @@
|
||||
#import <SOGo/SOGoPublicBaseFolder.h>
|
||||
#import <SOGo/SOGoProductLoader.h>
|
||||
#import <SOGo/SOGoProxyAuthenticator.h>
|
||||
#import <SOGo/SOGoUserFolder.h>
|
||||
#import <SOGo/SOGoUser.h>
|
||||
#import <SOGo/SOGoSystemDefaults.h>
|
||||
#import <SOGo/SOGoWebAuthenticator.h>
|
||||
@@ -211,94 +220,36 @@ static BOOL debugLeaks;
|
||||
[cm releaseChannel: tc];
|
||||
}
|
||||
|
||||
- (void) _checkQuickTableWithTypeName: typeName
|
||||
withCm: (GCSChannelManager *) cm
|
||||
tableURL: (NSString *) url
|
||||
{
|
||||
GCSFolderType *type;
|
||||
NSString *sql;
|
||||
NSString *tableName;
|
||||
EOAdaptorChannel *channel;
|
||||
|
||||
channel = [cm acquireOpenChannelForURL: [NSURL URLWithString: url]];
|
||||
|
||||
tableName = [NSString stringWithFormat: @"sogo_quick_%@", typeName];
|
||||
sql = [NSString stringWithFormat: @"SELECT count(*) FROM %@",
|
||||
tableName];
|
||||
if ([channel evaluateExpressionX: sql])
|
||||
{
|
||||
type = [GCSFolderType folderTypeWithName: typeName];
|
||||
if (type)
|
||||
{
|
||||
sql = [type sqlQuickCreateWithTableName: tableName];
|
||||
if (![channel evaluateExpressionX: sql])
|
||||
[self logWithFormat: @"sogo quick table %@ successfully created!",
|
||||
tableName];
|
||||
}
|
||||
}
|
||||
else
|
||||
[channel cancelFetch];
|
||||
|
||||
[cm releaseChannel:channel];
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// If OCSStoreURL is defined, we also check for OCSAclURL, OCSCacheFolderURL
|
||||
// and we create the combined quick tables.
|
||||
//
|
||||
- (BOOL) _checkMandatoryTables
|
||||
{
|
||||
GCSChannelManager *cm;
|
||||
GCSFolderManager *fm;
|
||||
NSArray *urlStrings;
|
||||
NSArray *quickTypeStrings;
|
||||
NSString *tmp, *value;
|
||||
NSString *urlStrings[] = {@"SOGoProfileURL", @"OCSFolderInfoURL", nil};
|
||||
NSString **urlString;
|
||||
NSString *value;
|
||||
SOGoSystemDefaults *defaults;
|
||||
NSEnumerator *e;
|
||||
BOOL ok, combined;
|
||||
BOOL ok;
|
||||
|
||||
defaults = [SOGoSystemDefaults sharedSystemDefaults];
|
||||
ok = YES;
|
||||
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
{
|
||||
urlStrings = [NSArray arrayWithObjects: @"SOGoProfileURL", @"OCSFolderInfoURL", @"OCSStoreURL", @"OCSAclURL", @"OCSCacheFolderURL", nil];
|
||||
quickTypeStrings = [NSArray arrayWithObjects: @"contact", @"appointment", nil];
|
||||
combined = YES;
|
||||
}
|
||||
else
|
||||
{
|
||||
urlStrings = [NSArray arrayWithObjects: @"SOGoProfileURL", @"OCSFolderInfoURL", nil];
|
||||
combined = NO;
|
||||
}
|
||||
|
||||
cm = [GCSChannelManager defaultChannelManager];
|
||||
|
||||
e = [urlStrings objectEnumerator];
|
||||
while (ok && (tmp = [e nextObject]))
|
||||
urlString = urlStrings;
|
||||
while (ok && *urlString)
|
||||
{
|
||||
value = [defaults stringForKey: tmp];
|
||||
value = [defaults stringForKey: *urlString];
|
||||
if (value)
|
||||
[self _checkTableWithCM: cm tableURL: value andType: tmp];
|
||||
{
|
||||
[self _checkTableWithCM: cm tableURL: value andType: *urlString];
|
||||
urlString++;
|
||||
}
|
||||
else
|
||||
{
|
||||
[self errorWithFormat: @"No value specified for '%@'", tmp];
|
||||
[self errorWithFormat: @"No value specified for '%@'", *urlString];
|
||||
ok = NO;
|
||||
}
|
||||
}
|
||||
|
||||
if (combined)
|
||||
{
|
||||
e = [quickTypeStrings objectEnumerator];
|
||||
while ((tmp = [e nextObject]))
|
||||
{
|
||||
[self _checkQuickTableWithTypeName: tmp
|
||||
withCm: cm
|
||||
tableURL: [defaults stringForKey: @"OCSFolderInfoURL"]];
|
||||
}
|
||||
}
|
||||
|
||||
if (ok)
|
||||
{
|
||||
fm = [GCSFolderManager defaultFolderManager];
|
||||
|
||||
@@ -21,8 +21,10 @@
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#import <Foundation/NSAutoreleasePool.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSTimeZone.h>
|
||||
|
||||
#import <NGObjWeb/SoApplication.h>
|
||||
|
||||
@@ -1,412 +1,131 @@
|
||||
3.2.2 (2016-11-23)
|
||||
------------------
|
||||
2.3.14 (2016-08-17)
|
||||
-------------------
|
||||
|
||||
New features
|
||||
- [core] support repetitive email alarms on tasks and events (#1053)
|
||||
- [web] allow to hide center column on large screens (#3861)
|
||||
- [eas] relaxed permission requirements for subscription synchronizations (#3118 and #3180)
|
||||
|
||||
Enhancements
|
||||
- [core] added sha256-crypt and sha512-crypt password support
|
||||
- [core] updated time zones to version 2016i
|
||||
- [eas] now also search on senders when using EAS Search ops
|
||||
- [web] allow multiple messages to be marked as seen (#3873)
|
||||
- [web] use switches instead of checkboxes in Calendars module
|
||||
|
||||
Bug fixes
|
||||
- [core] fixed condition in weekly recurrence calculator
|
||||
- [core] always send IMIP messages using UTF-8
|
||||
- [web] fixed mail settings persistence when sorting by arrival date
|
||||
- [web] disable submit button while saving an event or a task (#3880)
|
||||
- [web] disable submit button while saving a contact
|
||||
- [web] fixed computation of week number
|
||||
- [web] fixed and improved IMAP folder subscriptions manager (#3865)
|
||||
- [web] fixed Sieve script activation when vacation start date is in the future (#3885)
|
||||
- [web] fixed moving a component without the proper rights (#3889)
|
||||
- [web] restored Sieve folder encoding support (#3904)
|
||||
- [web] allow edition of a mailbox rights when user can administer mailbox
|
||||
|
||||
3.2.1 (2016-11-02)
|
||||
------------------
|
||||
|
||||
Enhancements
|
||||
- [web] add constraints to start/end dates of automatic responder (#3841)
|
||||
- [web] allow a mailbox to be deleted immediately (#3875)
|
||||
- [web] updated Angular to version 1.5.8
|
||||
- [eas] initial support for recurring tasks EAS
|
||||
- [eas] now support replied/forwarded flags using EAS (#3796)
|
||||
- [core] updated time zones to version 2016h
|
||||
|
||||
Bug fixes
|
||||
- [web] fixed tasks list when some weekdays are disabled
|
||||
- [web] fixed automatic refresh of calendar view
|
||||
- [web] respect SOGoSearchMinimumWordLength in contacts list editor
|
||||
- [web] improved memory usage when importing very large address books
|
||||
- [web] fixed progress indicator while importing cards or events and tasks
|
||||
- [web] improved detection of changes in CKEditor (#3839)
|
||||
- [web] fixed vCard generation for tags with no type (#3826)
|
||||
- [web] only show the organizer field of an IMIP REPLY if one is defined
|
||||
- [web] fixed saving the note of a card (#3849)
|
||||
- [web] fixed support for recurrent tasks (#3864)
|
||||
- [web] restored support for alarms in tasks
|
||||
- [web] improved validation of mail account delegators
|
||||
- [web] fixed auto-completion of list members (#3870)
|
||||
- [web] added missing options to subscribed addressbooks (#3850)
|
||||
- [web] added missing options to subscribed calendars (#3863)
|
||||
- [web] fixed resource conflict error handling (403 vs 409 HTTP code) (#3837)
|
||||
- [web] restored immediate deletion of messages (without moving them to the trash)
|
||||
- [web] avoid mail notifications on superfluous event changes (#3790)
|
||||
- [web] CKEditor: added the pastefromexcel plugin (#3854)
|
||||
- [eas] improve handling of email folders without a parent
|
||||
- [eas] never send IMIP reply when the "initiator" is Outlook 2013/2016
|
||||
- [core] only consider SMTP addresses for AD's proxyAddresses (#3842)
|
||||
- [core] sogo-tool manage-eas now works with single store mode
|
||||
|
||||
|
||||
3.2.0 (2016-10-03)
|
||||
------------------
|
||||
|
||||
New features
|
||||
- [web] added IMAP folder subscriptions management (#255)
|
||||
- [web] keyboard hotkeys (#1711, #1467, #3817)
|
||||
- [eas] initial support for server-side mailbox search operations
|
||||
|
||||
Enhancements
|
||||
- [web] don't allow a recurrence rule to end before the first occurrence
|
||||
- [web] updated Angular Material to version 1.1.1
|
||||
- [web] show user's name upon successful login
|
||||
- [web] inserted unseen messages count and mailbox name in browser's window title
|
||||
- [web] disable JavaScript theme generation when SOGoUIxDebugEnabled is set to NO
|
||||
- [web] added Serbian (sr) translation - thanks to Bogdanović Bojan
|
||||
- [web] added sort by arrival date in Mail module (#708)
|
||||
- [web] restored "now" line in Calendar module
|
||||
- [web] updated CKEditor to version 4.5.11
|
||||
- [web] allow custom email address to be one of the user's profile (#3551)
|
||||
- [eas] propagate message submission errors to EAS clients (#3774)
|
||||
|
||||
Bug fixes
|
||||
- [eas] properly generate the BusyStatus for normal events
|
||||
- [eas] properly escape all email and address fields
|
||||
- [eas] properly generate yearly rrule
|
||||
- [eas] make sure we don't sleep for too long when EAS processes need interruption
|
||||
- [eas] fixed recurring events with timezones for EAS (#3822)
|
||||
- [web] restored functionality to save unknown recipient emails to address book on send
|
||||
- [web] fixed ripple blocking the form when submitting no values (#3808)
|
||||
- [web] fixed error handling when renaming a mailbox
|
||||
- [web] handle binary content transfer encoding when displaying mails
|
||||
- [web] removed resize grips to short events (#3771)
|
||||
- [core] strip protocol value from proxyAddresses attribute (#3182)
|
||||
- [core] we now search in all domain sources for Apple Calendar
|
||||
- [core] properly handle groups in Apple Calendar's delegation
|
||||
- [core] fixed caching expiration of ACLs assigned to LDAP groups (#2867)
|
||||
- [core] make sure new cards always have a UID (#3819)
|
||||
- [core] fixed default TRANSP value when creating event
|
||||
|
||||
3.1.5 (2016-08-10)
|
||||
------------------
|
||||
|
||||
New features
|
||||
- [web] drag'n'drop of messages in the Mail module (#3497, #3586, #3734, #3788)
|
||||
- [web] drag'n'drop of cards in the AddressBook module
|
||||
- [eas] added folder merging capabilities
|
||||
|
||||
Enhancements
|
||||
- [web] improve action progress when login in or sending a message (#3765, #3761)
|
||||
- [web] don't allow to send the message while an upload is in progress
|
||||
- [web] notify when successfully copied or moved some messages
|
||||
- [web] restored indicator in the top banner when a vacation message (auto-reply) is active
|
||||
- [web] removed animation when dragging an event to speed up rendering
|
||||
- [web] expunge drafts mailbox when a draft is sent and deleted
|
||||
- [web] actions of Sieve filters are now sortable
|
||||
- [web] show progress indicator when refreshing events/tasks lists
|
||||
- [web] style cancelled events in Calendar module (#2800)
|
||||
- [web] updated CKEditor to version 4.5.10
|
||||
|
||||
Bug fixes
|
||||
- [web] fixed refresh of addressbook when deleting one or many cards
|
||||
- [web] reset multiple-selection mode after deleting cards, events or tasks
|
||||
- [web] fixed exception when moving tasks to a different calendar
|
||||
- [web] fixed printing of long mail (#3731)
|
||||
- [web] fixed position of ghost block when creating an event from DnD
|
||||
- [web] fixed avatar image in autocompletion
|
||||
- [web] restored expunge of current mailbox when leaving the Mail module
|
||||
- [web] added support for multiple description values in LDAP entries (#3750)
|
||||
- [web] don't allow drag'n'drop of invitations
|
||||
- [eas] fixed long GUID issue preventing sometimes synchronisation (#3460)
|
||||
- [web] improved extraction of HTML signature in Preferences module
|
||||
- [web] really delete mailboxes being deleted from the Trash folder (#595, #1189, #641)
|
||||
- [core] fixing sogo-tool backup with multi-domain configuration but domain-less logins
|
||||
- [core] during event scheduling, use 409 instead of 403 so Lightning doesn't fail silently
|
||||
- [core] correctly calculate recurrence exceptions when not overlapping the recurrence id
|
||||
- [core] prevent invalid SENT-BY handling during event invitations (#3759)
|
||||
|
||||
3.1.4 (2016-07-12)
|
||||
------------------
|
||||
2.3.13 (2016-07-06)
|
||||
-------------------
|
||||
|
||||
New features
|
||||
- [core] now possible to set default Sieve script (#2949)
|
||||
- [core] new sogo-tool truncate-calendar feature (#1513, #3141)
|
||||
- [eas] initial Out-of-Office support in EAS
|
||||
- [oc] initial support for calendar and address book sharing with OpenChange
|
||||
|
||||
Enhancements
|
||||
- [core] avoid showing bundle loading info when not needed (#3726)
|
||||
- [core] when restoring data using sogo-tool, regenerate Sieve script (#3029)
|
||||
- [eas] use the preferred email identity in EAS if valid (#3698)
|
||||
- [eas] handle inline attachments during EAS content generation
|
||||
- [web] all batch operations can now be performed on selected messages in advanced search mode
|
||||
- [web] add date picker to change date, week, or month of current Calendar view
|
||||
- [web] style cancelled events in Calendar module
|
||||
- [web] replace sortable library for better support with Firefox
|
||||
- [web] stage-1 tuning of sgColorPicker directive
|
||||
- [oc] better handling of nested attachments with OpenChange
|
||||
- [web] update jQuery File Upload library to 9.12.5
|
||||
|
||||
Bug fixes
|
||||
- [web] fixed crash when an attachment filename has no extension
|
||||
- [web] fixed selection of transparent all-day events (#3744)
|
||||
- [web] leaving the dropping area while dragging a file was blocking the mail editor
|
||||
- [web] fixed scrolling of all-day events (#3190)
|
||||
- [web] dragging a toolbar button was blocking the mail editor in Firefox
|
||||
- [eas] handle base64 EAS protocol version
|
||||
- [eas] handle missing IMAP folders from a hierarchy using EAS
|
||||
|
||||
3.1.3 (2016-06-22)
|
||||
------------------
|
||||
|
||||
New features
|
||||
- [core] now possible to define default Sieve filters (#2949)
|
||||
- [core] now possible to set vacation message start date (#3679)
|
||||
- [web] add a header and/or footer to the vacation message (#1961)
|
||||
- [web] specify a custom subject for the vacation message (#685, #1447)
|
||||
2.3.12 (2016-06-10)
|
||||
-------------------
|
||||
|
||||
Enhancements
|
||||
- [core] when restoring data using sogo-tool, regenerate Sieve script (#3029)
|
||||
- [web] always display name of month in week view (#3724)
|
||||
- [web] use a speed dial (instead of a dialog) for card/list creation
|
||||
- [web] use a speed dial for event/task creation
|
||||
- [web] CSS is now minified using clean-css
|
||||
|
||||
Bug fixes
|
||||
- [core] properly handle sorted/deleted calendars (#3723)
|
||||
- [core] properly handle flattened timezone definitions (#2690)
|
||||
- [web] fixed generic avatar in lists (#3719)
|
||||
- [web] fixed validation in Sieve filter editor
|
||||
- [web] properly encode rawsource of events and tasks to avoid XSS issues (#3718)
|
||||
- [web] properly encode rawsource of cards to avoid XSS issues
|
||||
- [web] fixed all-day events covering a timezone change (#3457)
|
||||
- [web] sgTimePicker parser now respects the user's time format and language
|
||||
- [web] fixed time format when user chooses the default one
|
||||
- [web] added missing delegators identities in mail editor (#3720)
|
||||
- [web] honour the domain default SOGoAppointmentSendEMailNotifications (#3729)
|
||||
- [web] the login module parameter is now properly restored when set as "Last used"
|
||||
- [web] if cn isn't found for shared mailboxes, use email address (#3733)
|
||||
- [web] fixed handling of attendees when updating an event
|
||||
- [web] show tooltips over long calendar/ab names (#232)
|
||||
- [web] one-click option to give all permissions for user (#1637)
|
||||
- [web] never query gravatar.com when disabled
|
||||
|
||||
3.1.2 (2016-06-06)
|
||||
------------------
|
||||
|
||||
Enhancements
|
||||
- [web] updated Angular Material to version 1.1.0rc5
|
||||
|
||||
Bug fixes
|
||||
- [web] fixed error handling when renaming a mailbox
|
||||
- [web] fixed user removal from ACLs in Administration module (#3713)
|
||||
- [web] fixed event classification icon (private/confidential) in month view (#3711)
|
||||
- [web] CKEditor: added the pastefromword plugin (#2295, #3313)
|
||||
- [web] fixed loading of card from global addressbooks
|
||||
- [web] fixed negative offset when saving an all-day event (#3717)
|
||||
|
||||
3.1.1 (2016-06-02)
|
||||
------------------
|
||||
|
||||
Enhancements
|
||||
- [web] expose all email addresses in autocompletion of message editor (#3443)
|
||||
- [web] Gravatar service can now be disabled (#3600)
|
||||
- [web] collapsable mail accounts (#3493)
|
||||
- [web] show progress indicator when loading messages and cards
|
||||
- [web] display messages sizes in list of Mail module
|
||||
- [web] link event's attendees email addresses to mail composer
|
||||
- [web] respect SOGoSearchMinimumWordLength when searching for events or tasks
|
||||
- [web] updated CKEditor to version 4.5.9
|
||||
- [web] CKEditor: switched to the minimalist skin
|
||||
- [web] CKEditor: added the base64image plugin
|
||||
|
||||
Bug fixes
|
||||
- [core] strip X- tags when securing content (#3695)
|
||||
- [web] fixed creation of chip on blur (sgTransformOnBlur directive)
|
||||
- [web] fixed composition of new messages from Contacts module
|
||||
- [web] fixed autocompletion of LDAP-based groups (#3673)
|
||||
- [web] fixed month view when current month covers six weeks (#3663)
|
||||
- [web] fixed negative offset when converting a regular event to an all-day event (#3655)
|
||||
- [web] fixed event classification icon (private/confidential) in day/week/multicolumn views
|
||||
- [web] fixed display of mailboxes list on mobiles (#3654)
|
||||
- [web] restored Catalan and Slovak translations (#3687)
|
||||
- [web] fixed restore of mailboxes expansion state when multiple IMAP accounts are configured
|
||||
- [web] improved CSS sanitizer for HTML messages (#3700)
|
||||
- [web] fixed toolbar of mail editor when sender address was too long (#3705)
|
||||
- [web] fixed decoding of filename in attachments (quotes and Cyrillic characters) (#2272)
|
||||
- [web] fixed recipients when replying from a message in the Sent mailbox (#2625)
|
||||
- [eas] when using EAS/ItemOperations, use IMAP PEEK operation
|
||||
|
||||
3.1.0 (2016-05-18)
|
||||
------------------
|
||||
|
||||
New features
|
||||
- [core] new database structure options to make SOGo use a total of nine tables
|
||||
- [core] new user-based rate-limiting support for all SOGo requests (#3188)
|
||||
- [web] toolbar of all-day events can be expanded to display all events
|
||||
- [web] added AngularJS's XSRF support (#3246)
|
||||
- [web] calendars list can be reordered and filtered
|
||||
- [web] user can limit the calendars view to specific week days (#1841)
|
||||
|
||||
Enhancements
|
||||
- [web] updated Angular Material to version 1.1.0rc4
|
||||
- [web] added Lithuanan (lt) translation - thanks to Mantas Liobė
|
||||
- [web] CKEditor: added the pastefromword plugin (#2295, #3313)
|
||||
- [web] added Turkish (Turkey) (tr_TR) translation - thanks to Sinan Kurşunoğlu
|
||||
- [web] we now "cc" delegates during invitation updates (#3195)
|
||||
- [web] new SOGoHelpURL preference to set a custom URL for SOGo help (#2768)
|
||||
- [web] now able to copy/move events and also duplicate them (#3196)
|
||||
- [web] improved preferences validation and now check for unsaved changes
|
||||
- [web] display events and tasks priorities in list and day/week views (#3162)
|
||||
- [web] style events depending on the user participation state
|
||||
- [web] style transparent events (show time as free) (#3192)
|
||||
- [web] improved input parsing of time picker (#3659)
|
||||
- [web] restored support for Web calendars that require authentication
|
||||
|
||||
Bug fixes
|
||||
- [core] properly escape wide characters (#3616)
|
||||
- [core] avoid double-appending domains in cache for multi-domain configurations (#3614)
|
||||
- [core] fixed multidomain issue with non-unique ID accross domains (#3625)
|
||||
- [core] fixed bogus headers generation when stripping folded bcc header (#3664)
|
||||
- [core] fixed issue with multi-value org units (#3630)
|
||||
- [core] sanity checks for events with bogus timezone offsets
|
||||
- [web] fixed missing columns in SELECT statements (PostgreSQL)
|
||||
- [web] fixed display of ghosts when dragging events
|
||||
- [web] fixed management of mail labels in Preferences module
|
||||
- [web] respect super user privileges to create in any calendar and addressbook (#3533)
|
||||
- [web] properly null-terminate IS8601-formatted dates (#3539)
|
||||
- [web] display CC/BCC fields in message editor when initialized with values
|
||||
- [web] fixed message initialization in popup window (#3583)
|
||||
- [web] create chip (recipient) on blur (#3470)
|
||||
- [web] fixed position of warning when JavaScript is disabled (#3449)
|
||||
- [web] respect the LDAP attributes mapping in the list view
|
||||
- [web] handle empty body data when forwarding mails (#3581)
|
||||
- [web] show repeating events when we ask for "All" or "Future" events (#69)
|
||||
- [web] show the To instead of From when we are in the Sent folder (#3547)
|
||||
- [web] fixed handling of mail tags in mail viewer
|
||||
- [web] avoid marking mails as read when archiving a folder (#2792)
|
||||
- [web] fixed crash when sending a message with a special priority
|
||||
- [web] fixed saving of a custom weekly recurrence definition
|
||||
- [web] properly escape the user's display name (#3617)
|
||||
- [web] avoid returning search results on objects without read permissions (#3619)
|
||||
- [web] restore priority of event or task in component editor
|
||||
- [web] fixed menu content visibility when printing an email (#3584)
|
||||
- [web] retired CSS reset so the style of HTML messages is respected (#3582)
|
||||
- [web] fixed messages archiving as zip file
|
||||
- [web] adapted time picker to match changes of md calendar picker
|
||||
- [web] fixed sender addresses of draft when using multiple IMAP accounts (#3577)
|
||||
- [web] create a new message when clicking on a "mailto" link (#3588)
|
||||
- [web] fixed handling of Web calendars option "reload on login"
|
||||
- [web] add recipient chip when leaving an input field (to/cc/bcc) (#3470)
|
||||
- [dav] we now handle the default classifications for tasks (#3541)
|
||||
- [eas] properly unfold long mail headers (#3152)
|
||||
- [eas] correctly set EAS message class for S/MIME messages (#3576)
|
||||
- [eas] handle FilterType changes using EAS (#3543)
|
||||
- [eas] handle Dovecot's mail_shared_explicit_inbox parameter
|
||||
- [eas] prevent concurrent Sync ops from same device (#3603)
|
||||
- [eas] handle EAS loop termination when SOGo is being shutdown (#3604)
|
||||
- [eas] now cache heartbeat interval and folders list during Ping ops (#3606)
|
||||
- [eas] sanitize non-us-ascii 7bit emails (#3592)
|
||||
- [eas] properly escape organizer name (#3615)
|
||||
- [eas] correctly set answered/forwarded flags during smart operations
|
||||
- [eas] don't mark calendar invitations as read when fetching messages
|
||||
- [core] strip X- tags when securing content (#3695)
|
||||
- [core] properly handle flattened timezone definitions (#2690)
|
||||
- [eas] when using EAS/ItemOperations, use IMAP PEEK operation
|
||||
- [web] fixed recipients when replying from a message in the Sent mailbox (#2625)
|
||||
- [web] fixed localizable strings in Card viewer
|
||||
- [web] properly encode HTML attributes in Contacts module to avoid XSS issues
|
||||
- [web] handle c_mail field format of quick record of contacts of v3 (#3443)
|
||||
- [web] fixed all-day events covering a timezone change (#3457)
|
||||
- [web] fixed display of invitation with a category (#3590)
|
||||
|
||||
3.0.2 (2016-03-04)
|
||||
2.3.11 (2016-05-12)
|
||||
-------------------
|
||||
|
||||
Bug fixes
|
||||
- properly escape organizer name when using EAS (#3615)
|
||||
- properly escape wide characters (#3616)
|
||||
- calendars list when creating a new component in a calendar in which the user
|
||||
can't delete components
|
||||
- avoid double-appending domains in cache for multi-domain configurations (#3614)
|
||||
- encode CR in EAS payload (#3626)
|
||||
- password change during login process when using ppolicy
|
||||
- correctly set answered/forwarded flags during EAS smart operations
|
||||
- don't mark calendar invitations as read when fetching messages using EAS
|
||||
- fixed messages archiving as zip file
|
||||
- fixed multi-domain issue with non-unique ID across domains (#3625)
|
||||
- fixed bogus headers generation when stripping folded bcc header (#3664)
|
||||
- fixed issue with multi-value org units (#3630)
|
||||
- fixed sensitive range of checkboxes in appointment editor (#3665)
|
||||
|
||||
2.3.10 (2016-04-05)
|
||||
-------------------
|
||||
|
||||
New features
|
||||
- new user-based rate-limiting support for all SOGo requests (#3188)
|
||||
|
||||
Bug fixes
|
||||
- respect the LDAP attributes mapping in the list view
|
||||
- handle empty body data when forwarding mails (#3581)
|
||||
- correctly set EAS message class for S/MIME messages (#3576)
|
||||
- we now handle the default classifications for tasks (#3541)
|
||||
- handle FilterType changes using EAS (#3543)
|
||||
- handle Dovecot's mail_shared_explicit_inbox parameter when using EAS
|
||||
- prevent concurrent Sync ops from same EAS device (#3603)
|
||||
- handle EAS loop termination when SOGo is being shutdown (#3604)
|
||||
- avoid marking mails as read when archiving a folder (#2792)
|
||||
- now cache heartbeat interval and folders list during EAS Ping ops (#3606)
|
||||
- sanitize non-us-ascii 7bit emails when using EAS (#3592)
|
||||
|
||||
2.3.9 (2016-03-16)
|
||||
------------------
|
||||
|
||||
New features
|
||||
- [web] show all/only this calendar
|
||||
- [web] convert a message to an appointment or a task (#1722)
|
||||
- [web] customizable base font size for HTML messages
|
||||
- [web you can now limit the file upload size using the WOMaxUploadSize
|
||||
- you can now limit the file upload size using the WOMaxUploadSize
|
||||
configuration parameter (integer value in kilobytes) (#3510, #3135)
|
||||
|
||||
Enhancements
|
||||
- [web] added Junk handling feature from v2
|
||||
- [web] updated Material Icons font to version 2.1.3
|
||||
- [web] don't offer forward/vacation options in filters if not enabled
|
||||
- [web] mail filters are now sortable
|
||||
- [web] now supports RFC6154 and NoInferiors IMAP flag
|
||||
- [web] improved confirm dialogs for deletions
|
||||
- [web] allow resources to prevent invitations (#3410)
|
||||
- [web] warn when double-booking attendees and offer force save option
|
||||
- [web] list search now displays a warning regarding the minlength constraint
|
||||
- [web] loading an LDAP-based addressbook is now instantaneous when listRequiresDot is disabled (#438, #3464)
|
||||
- [web] improve display of messages with many recipients
|
||||
- [web] colorize categories chips in event and task viewers
|
||||
- [web] initial stylesheet for printing (#3484)
|
||||
- [web] updated lodash to version 4.6.1
|
||||
- [i18n] updated French and Finnish translations
|
||||
- [eas] now support EAS MIME truncation
|
||||
- allow resources to prevent invitations (#3410)
|
||||
- now support EAS MIME truncation
|
||||
- added Lithuanan (lt) translation - thanks to Mantas Liobė
|
||||
|
||||
Bug fixes
|
||||
- [web] handle birthday dates before 1970 (#3567)
|
||||
- [web] safe-guarding against bogus value coming from the quick tables
|
||||
- [web] apply search filters when automatically reloading current mailbox (#3507)
|
||||
- [web] fixed virtual repeater when moving up in messages list
|
||||
- [web] really delete mailboxes being deleted from the Trash folder (#595, #1189, #641)
|
||||
- [web] fixed address autocompletion of mail editor affecting cards list of active addressbook
|
||||
- [web] fixed batched delete of components (#3516)
|
||||
- [web] fixed mail draft autosave in preferences (#3519)
|
||||
- [web] fixed password change (#3496)
|
||||
- [web] fixed saving of notification email for calendar changes (#3522)
|
||||
- [web] fixed ACL editor for authenticated users in Mail module
|
||||
- [web] fixed fab button position in Calendar module (#3462)
|
||||
- [web] fixed default priority of sent messages (#3542)
|
||||
- [web] removed double-quotes from Chinese (Taiwan) translations that were breaking templates
|
||||
- [web] fixed unseen count retrieval of nested IMAP folders
|
||||
- [web] properly extract the mail column values from an SQL contacts source (#3544)
|
||||
- [web] fixed incorrect date formatting when timezone was after UTC+0 (#3481, #3494)
|
||||
- [web] replaced checkboxes in menu by a custom checkmark (#3557)
|
||||
- [web] fixed attachments display when forwarding a message (#3560)
|
||||
- [web] activate new calendar subscriptions by default
|
||||
- [web] keep specified task status when not completed (#3499)
|
||||
- [eas] allow EAS attachments get on 2nd-level mailboxes (#3505)
|
||||
- [eas] fix EAS bday shift (#3518)
|
||||
- [eas] encode CR in EAS payload (#3626)
|
||||
- allow EAS attachments get on 2nd-level mailboxes (#3505)
|
||||
- fixed EAS bday shift (#3518)
|
||||
- prefer SOGoRefreshViewCheck to SOGoMailMessageCheck (#3465)
|
||||
- properly unfold long mail headers (#3152)
|
||||
|
||||
3.0.1 (2016-02-05)
|
||||
2.3.8 (2016-02-05)
|
||||
------------------
|
||||
|
||||
Enhancements
|
||||
- [web] improved scrolling behavior when deleting a single message (#3489)
|
||||
- [web] added "Move To" option for selected messages (#3477)
|
||||
- [web] updated CKEditor to version 4.5.7
|
||||
- [web] updated Angular Material to 1.0.5
|
||||
- [web/eas] add shared/public namespaces in the list or returned folders
|
||||
- updated CKEditor to version 4.5.7
|
||||
|
||||
Bug fixes
|
||||
- [web] safeguard against mailboxes with no quota (#3468)
|
||||
- [web] fixed blank calendar view when selecting "Descending Order" in the sort menu
|
||||
- [web] show active user's default email address instead of system email address (#3473)
|
||||
- [web] fixed display of HTML tags when viewing a message raw source (#3490)
|
||||
- [web] fixed IMIP accept/decline when there is only one MIME part
|
||||
- [web] improved handling of IMAP connection problem in Web interface
|
||||
- [web] fixed frequency parsing of recurrence rule when saving new appointment (#3472)
|
||||
- [web] added support for %p in date formatting (#3480)
|
||||
- [web] make sure an email is defined before trying to use it (#3488)
|
||||
- [web] handle broken messages that have no date (#3498)
|
||||
- [web] fixed virtual-repeater display in Webmail when a search is performed (#3500)
|
||||
- [web] fixed drag'n'drop of all-day events in multicolumn view
|
||||
- [eas] correctly encode filename of attachments over EAS (#3491)
|
||||
|
||||
3.0.0 (2016-01-27)
|
||||
------------------
|
||||
|
||||
New features
|
||||
- complete rewrite of the JavaScript frontend using Angular and AngularMaterial
|
||||
- responsive design and accessible options focused on mobile devices
|
||||
- horizontal 3-pane view for a better experience on large desktop screens
|
||||
- new color palette and better contrast ratio as recommended by the W3C
|
||||
- improved accessibility to persons with disabilities by enabling common ARIA attributes
|
||||
- use of Mozilla's Fira Sans typeface
|
||||
- and many more!
|
||||
- correctly encode filename of attachments over EAS (#3491)
|
||||
- correctly encode square brackets for IMAP folder names (#3321)
|
||||
- add shared/public namespaces in the list or returned folders
|
||||
|
||||
2.3.7 (2016-01-25)
|
||||
------------------
|
||||
@@ -430,7 +149,7 @@ New features
|
||||
- now able to sync only default mail folders when using EAS
|
||||
|
||||
Enhancements
|
||||
- Unit testing for RTFHandler
|
||||
- unit testing for RTFHandler
|
||||
- JUnit output for sogo-tests
|
||||
|
||||
Bug fixes
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
/* MAPIStoreUserContext.m - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2012-2016 Inverse inc
|
||||
* Copyright (C) 2012 Inverse inc
|
||||
*
|
||||
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
*
|
||||
* This file is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -33,7 +35,6 @@
|
||||
#import <NGImap4/NGImap4Connection.h>
|
||||
|
||||
#import <GDLContentStore/GCSChannelManager.h>
|
||||
#import <GDLContentStore/GCSFolderManager.h>
|
||||
#import <SOGo/SOGoDomainDefaults.h>
|
||||
#import <SOGo/SOGoUser.h>
|
||||
#import <SOGo/SOGoUserFolder.h>
|
||||
@@ -338,9 +339,6 @@ static NSMapTable *contextsTable = nil;
|
||||
NSString *tableName, *query;
|
||||
GCSSpecialQueries *queries;
|
||||
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
return;
|
||||
|
||||
[self folderTableURL];
|
||||
|
||||
cm = [GCSChannelManager defaultChannelManager];
|
||||
|
||||
@@ -1,68 +0,0 @@
|
||||
## Contribute
|
||||
|
||||
SOGo is a collaborative effort in order to create the best Free and Open Source groupware solution.
|
||||
|
||||
There are multiple ways you can contribute to the project
|
||||
|
||||
* Documentation reviews, enhancements and translations
|
||||
* Feature requests or by sharing your ideas (see the roadmap)
|
||||
* Participate in the discussion on mailing lists
|
||||
* Patches for bugs or enhancements
|
||||
* Provide new translations
|
||||
|
||||
## Source Code
|
||||
|
||||
You can browse the lastest version of the source code online from Inverse's github repository:
|
||||
|
||||
* [https://github.com/inverse-inc](https://github.com/inverse-inc)
|
||||
|
||||
To compile SOGo, you first need to obtain the source code of both SOGo and SOPE. The source code of SOPE and SOGo can be obtained from Inverse's github repository:
|
||||
|
||||
* [https://github.com/inverse-inc/sope](https://github.com/inverse-inc/sope)
|
||||
* [https://github.com/inverse-inc/sogo](https://github.com/inverse-inc/sogo)
|
||||
|
||||
The source code of the SOGo Connector and SOGo Integrator extensions for Thunderbird 31+ can be obtained from Inverse's github repository:
|
||||
|
||||
* [https://github.com/inverse-inc/sogo-connector.tb31](https://github.com/inverse-inc/sogo-connector.tb31)
|
||||
* [https://github.com/inverse-inc/sogo-integrator.tb31](https://github.com/inverse-inc/sogo-integrator.tb31)
|
||||
|
||||
Please refer to the [FAQ](http://sogo.nu/support/faq.html) for [compilation instructions](http://sogo.nu/support/faq/article/how-do-i-compile-sogo-2.html).
|
||||
|
||||
## Translations
|
||||
|
||||
SOGo and its associated components are available in various languages. The following list describes the official translations alongside their maintainers :
|
||||
|
||||
* [en] English - [Inverse inc.](http://www.inverse.ca/)
|
||||
* [ar] Arabic - Anass Ahmed
|
||||
* [eu] Basque - Gorka Gonzalez
|
||||
* [pr_BR] Brazilian Portuguese - Alexandre Marcilio
|
||||
* [ca] Catalan - Hector M. Rulot Segovia
|
||||
* [zh_TW] Chinese (Taiwan)
|
||||
* [hr_HR] Croatian - Jens Riecken
|
||||
* [cs] Czech - Šimon Halamásek
|
||||
* [da_DK] Danish (Denmark) - Altibox
|
||||
* [nl] Dutch - Roel van Os
|
||||
* [fi] Finnish - Kari Salmu
|
||||
* [fr] French - [Inverse](http://www.inverse.ca/)
|
||||
* [de] German - Alexander Greiner-Baer
|
||||
* [hu] Hungarian - Sándor Kuti
|
||||
* [is] Icelandic - Anna Jonna Armannsdottir
|
||||
* [it] Italian - Alessio Fattorini
|
||||
* [lt] Lithuanian - Mantas Liobė
|
||||
* [mk_MK] Macedonian - Miroslav Jovanovic
|
||||
* [nb_NO] Norwegian (Bokmål) - Jan Ivar Karlsen
|
||||
* [nn_NO] Norwegian (Nynorsk) - Altibox
|
||||
* [pl] Polish - Paweł Bogusławski
|
||||
* [pt] Portuguese - Eduardo Crispim
|
||||
* [ru] Russian - Alex Kabakaev
|
||||
* [sr] Serbian - Bogdanović Bojan
|
||||
* [sk] Slovak - Martin Pastor
|
||||
* [sl_SI] Slovenian - Jens Riecken
|
||||
* [es_AR] Spanish (Argentina) - Federico Alberto Sayd
|
||||
* [es_ES] Spanish (Spain) - Dominique Couot
|
||||
* [sv] Swedish - Peter Johansson
|
||||
* [tr_TR] Turkish (Turkey) - Sinan Kurşunoğlu
|
||||
* [uk] Ukrainian - Oleksa Stasevych
|
||||
* [cy] Welsh - Iona Bailey
|
||||
|
||||
If you would like to translate the software in an other language, please consult the [FAQ](http://sogo.nu/support/faq/article/how-to-translate-sogo-in-another-language-2.html). You can also subscribe to the SOGo i18n mailing list to follow string additions or changes. To subscribe to i18n@sogo.nu, send an email to i18n-request@sogo.nu with SUBSCRIBE i18n as the subject. Archived posts are [available online](https://inverse.ca/sogo/lists/arc/i18n).
|
||||
@@ -20,6 +20,7 @@
|
||||
*/
|
||||
|
||||
#import <Foundation/NSValue.h>
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
#import <NGExtensions/NSNull+misc.h>
|
||||
#import <NGExtensions/NSObject+Logs.h>
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
/* GCSAlarmsFolder.h - this file is part of $PROJECT_NAME_HERE$
|
||||
*
|
||||
* Copyright (C) 2010-2016 Inverse inc.
|
||||
* Copyright (C) 2010 Inverse inc.
|
||||
*
|
||||
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
*
|
||||
* This file is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -21,6 +23,7 @@
|
||||
#ifndef GCSALARMSFOLDER_H
|
||||
#define GCSALARMSFOLDER_H
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
|
||||
@class NSCalendarDate;
|
||||
@class NSException;
|
||||
@@ -58,6 +61,8 @@
|
||||
- (void) deleteRecordForEntryWithCName: (NSString *) cname
|
||||
inCalendarAtPath: (NSString *) path;
|
||||
|
||||
- (void) deleteRecordsForEntriesUntilDate: (NSCalendarDate *) date;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* GCSALARMSFOLDER_H */
|
||||
@@ -1,6 +1,6 @@
|
||||
/* GCSAlarmsFolder.m - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2010-2016 Inverse inc.
|
||||
* Copyright (C) 2010-2014 Inverse inc.
|
||||
*
|
||||
* This file is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -18,10 +18,16 @@
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSURL.h>
|
||||
#import <Foundation/NSUserDefaults.h>
|
||||
#import <Foundation/NSValue.h>
|
||||
|
||||
#import <NGExtensions/NSObject+Logs.h>
|
||||
#import <NGExtensions/NSNull+misc.h>
|
||||
|
||||
#import <GDLAccess/EOAdaptorChannel.h>
|
||||
#import <GDLAccess/EOAdaptorContext.h>
|
||||
#import <GDLAccess/EOAttribute.h>
|
||||
#import <GDLAccess/EOEntity.h>
|
||||
@@ -31,6 +37,7 @@
|
||||
#import "GCSChannelManager.h"
|
||||
#import "GCSFolderManager.h"
|
||||
#import "GCSSpecialQueries.h"
|
||||
#import "GCSStringFormatter.h"
|
||||
#import "NSURL+GCS.h"
|
||||
|
||||
#import "GCSAlarmsFolder.h"
|
||||
@@ -409,4 +416,36 @@ static NSString *alarmsFolderURLString = nil;
|
||||
}
|
||||
}
|
||||
|
||||
- (void) deleteRecordsForEntriesUntilDate: (NSCalendarDate *) date
|
||||
{
|
||||
EOAdaptorChannel *tc;
|
||||
EOAdaptorContext *context;
|
||||
EOEntity *entity;
|
||||
EOSQLQualifier *qualifier;
|
||||
NSException *error;
|
||||
|
||||
tc = [self _acquireStoreChannel];
|
||||
if (tc)
|
||||
{
|
||||
context = [tc adaptorContext];
|
||||
entity = [self _storeTableEntityForChannel: tc];
|
||||
qualifier = [[EOSQLQualifier alloc] initWithEntity: entity
|
||||
qualifierFormat:
|
||||
@"c_alarm_date <= %d",
|
||||
(int) [date timeIntervalSince1970]];
|
||||
[qualifier autorelease];
|
||||
[context beginTransaction];
|
||||
error = [tc deleteRowsDescribedByQualifierX: qualifier];
|
||||
if (error)
|
||||
{
|
||||
[context rollbackTransaction];
|
||||
[self errorWithFormat:@"%s: cannot delete record: %@",
|
||||
__PRETTY_FUNCTION__, error];
|
||||
}
|
||||
else
|
||||
[context commitTransaction];
|
||||
[self _releaseChannel: tc];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -22,6 +22,7 @@
|
||||
#ifndef __GDLContentStore_GCSChannelManager_H__
|
||||
#define __GDLContentStore_GCSChannelManager_H__
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
|
||||
/*
|
||||
GCSChannelManager
|
||||
|
||||
@@ -22,6 +22,8 @@
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSCalendarDate.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSEnumerator.h>
|
||||
#import <Foundation/NSLock.h>
|
||||
#import <Foundation/NSTimer.h>
|
||||
#import <Foundation/NSUserDefaults.h>
|
||||
#import <Foundation/NSValue.h>
|
||||
@@ -31,6 +33,7 @@
|
||||
|
||||
#import <GDLAccess/EOAdaptor.h>
|
||||
#import <GDLAccess/EOAdaptorContext.h>
|
||||
#import <GDLAccess/EOAdaptorChannel.h>
|
||||
|
||||
#import "GCSChannelManager.h"
|
||||
#import "NSURL+GCS.h"
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#ifndef __GDLContentStore_GCSFieldInfo_H__
|
||||
#define __GDLContentStore_GCSFieldInfo_H__
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
|
||||
/*
|
||||
GCSFieldInfo
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
#import <NGExtensions/NSNull+misc.h>
|
||||
#import <NGExtensions/NSObject+Logs.h>
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#ifndef __GDLContentStore_GCSFolder_H__
|
||||
#define __GDLContentStore_GCSFolder_H__
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
|
||||
/*
|
||||
GCSFolder
|
||||
@@ -123,7 +124,6 @@
|
||||
|
||||
- (NSException *) deleteContentWithName: (NSString *) _name;
|
||||
- (NSException *) deleteAllContent;
|
||||
- (NSException *) touchContentWithName: (NSString *) _name;
|
||||
|
||||
- (NSException *) deleteFolder;
|
||||
|
||||
|
||||
@@ -91,6 +91,13 @@ static GCSStringFormatter *stringFormatter = nil;
|
||||
NSEnumerator *fields;
|
||||
GCSFieldInfo *field;
|
||||
NSString *fieldName;
|
||||
|
||||
if (![_loc isNotNull])
|
||||
{
|
||||
[self errorWithFormat:@"missing quicktable parameter!"];
|
||||
[self release];
|
||||
return nil;
|
||||
}
|
||||
|
||||
if ((self = [super init])) {
|
||||
folderManager = [_fm retain];
|
||||
@@ -100,7 +107,6 @@ static GCSStringFormatter *stringFormatter = nil;
|
||||
while ((field = [fields nextObject]))
|
||||
{
|
||||
fieldName = [field columnName];
|
||||
|
||||
if (![fieldName isEqualToString: @"c_name"])
|
||||
[quickFieldNames addObject: fieldName];
|
||||
}
|
||||
@@ -110,9 +116,7 @@ static GCSStringFormatter *stringFormatter = nil;
|
||||
while ((field = [fields nextObject]))
|
||||
{
|
||||
fieldName = [field columnName];
|
||||
|
||||
if (![fieldName isEqualToString: @"c_name"])
|
||||
[contentFieldNames addObject: fieldName];
|
||||
[contentFieldNames addObject: fieldName];
|
||||
}
|
||||
|
||||
folderId = [_folderId copy];
|
||||
@@ -183,31 +187,12 @@ static GCSStringFormatter *stringFormatter = nil;
|
||||
}
|
||||
|
||||
- (NSURL *)location {
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
return [folderManager storeLocation];
|
||||
|
||||
return location;
|
||||
}
|
||||
- (NSURL *)quickLocation {
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
{
|
||||
NSString *baseURL;
|
||||
NSRange range;
|
||||
|
||||
baseURL = [[folderManager folderInfoLocation] absoluteString];
|
||||
range = [baseURL rangeOfString: @"/" options: NSBackwardsSearch];
|
||||
if (range.location != NSNotFound)
|
||||
baseURL = [baseURL substringToIndex: range.location];
|
||||
|
||||
return [NSURL URLWithString: [NSString stringWithFormat: @"%@/%@", baseURL, [self quickTableName]]];
|
||||
}
|
||||
|
||||
return quickLocation;
|
||||
}
|
||||
- (NSURL *)aclLocation {
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
return [folderManager aclLocation];
|
||||
|
||||
return aclLocation;
|
||||
}
|
||||
|
||||
@@ -223,9 +208,6 @@ static GCSStringFormatter *stringFormatter = nil;
|
||||
return [[self location] gcsTableName];
|
||||
}
|
||||
- (NSString *)quickTableName {
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
return [NSString stringWithFormat: @"sogo_quick_%@", [folderTypeName lowercaseString]];
|
||||
|
||||
return [[self quickLocation] gcsTableName];
|
||||
}
|
||||
- (NSString *)aclTableName {
|
||||
@@ -443,36 +425,20 @@ static GCSStringFormatter *stringFormatter = nil;
|
||||
ignoreDeleted: (BOOL) ignoreDeleted
|
||||
{
|
||||
EOQualifier *qualifier;
|
||||
EOSortOrdering *ordering;
|
||||
NSArray *sortOrderings;
|
||||
NSEnumerator *sortOrderingsList;
|
||||
NSMutableString *sql;
|
||||
NSMutableArray *allFields, *whereSql;
|
||||
NSMutableArray *whereSql;
|
||||
GCSTableRequirement requirement;
|
||||
NSString *whereString;
|
||||
|
||||
// NSLog(@"queryForFields...");
|
||||
qualifier = [spec qualifier];
|
||||
sortOrderings = [spec sortOrderings];
|
||||
|
||||
if (fields)
|
||||
allFields = [NSMutableArray arrayWithArray: fields];
|
||||
else
|
||||
allFields = [NSMutableArray arrayWithCapacity: [sortOrderings count]];
|
||||
|
||||
if ([sortOrderings count] > 0)
|
||||
{
|
||||
sortOrderingsList = [sortOrderings objectEnumerator];
|
||||
while ((ordering = [sortOrderingsList nextObject]))
|
||||
{
|
||||
[allFields addObject: [ordering key]];
|
||||
}
|
||||
}
|
||||
requirement = [self _tableRequirementForFields: allFields
|
||||
andOrQualifier: qualifier];
|
||||
requirement = [self _tableRequirementForFields: fields
|
||||
andOrQualifier: qualifier];
|
||||
sql = [NSMutableString stringWithCapacity: 256];
|
||||
[sql appendString: @"SELECT "];
|
||||
if ([allFields count])
|
||||
[sql appendString: [self _selectedFields: allFields requirement: requirement]];
|
||||
if (fields)
|
||||
[sql appendString: [self _selectedFields: fields requirement: requirement]];
|
||||
else
|
||||
[sql appendString: @"*"];
|
||||
[sql appendString:@" FROM "];
|
||||
@@ -488,16 +454,6 @@ static GCSStringFormatter *stringFormatter = nil;
|
||||
}
|
||||
|
||||
whereSql = [NSMutableArray array];
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
{
|
||||
if (requirement == bothTableRequired)
|
||||
[whereSql addObject: [NSString stringWithFormat:
|
||||
@"(a.c_folder_id = %@ AND b.c_folder_id = %@)",
|
||||
folderId, folderId]];
|
||||
else
|
||||
[whereSql addObject: [NSString stringWithFormat: @"c_folder_id = %@",
|
||||
folderId]];
|
||||
}
|
||||
if (qualifier)
|
||||
{
|
||||
whereString = [NSString stringWithFormat: @"(%@)",
|
||||
@@ -518,6 +474,7 @@ static GCSStringFormatter *stringFormatter = nil;
|
||||
[sql appendFormat: @" WHERE %@",
|
||||
[whereSql componentsJoinedByString: @" AND "]];
|
||||
|
||||
sortOrderings = [spec sortOrderings];
|
||||
if ([sortOrderings count] > 0)
|
||||
{
|
||||
[sql appendString:@" ORDER BY "];
|
||||
@@ -718,8 +675,6 @@ andAttribute: (EOAttribute *)_attribute
|
||||
[sql appendString:@"INSERT INTO "];
|
||||
[sql appendString:_table];
|
||||
[sql appendString:@" ("];
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
[sql appendString:@"c_folder_id, "];
|
||||
|
||||
for (i = 0, count = [keys count]; i < count; i++) {
|
||||
if (i != 0) [sql appendString:@", "];
|
||||
@@ -727,8 +682,6 @@ andAttribute: (EOAttribute *)_attribute
|
||||
}
|
||||
|
||||
[sql appendString:@") VALUES ("];
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
[sql appendFormat:@"%@, ", folderId];
|
||||
|
||||
for (i = 0, count = [keys count]; i < count; i++) {
|
||||
fieldName = [keys objectAtIndex:i];
|
||||
@@ -796,8 +749,6 @@ andAttribute: (EOAttribute *)_attribute
|
||||
}
|
||||
|
||||
[sql appendString:@" WHERE "];
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
[sql appendString: [NSString stringWithFormat: @"c_folder_id = %@ AND ", folderId]];
|
||||
[sql appendString:_colname];
|
||||
[sql appendString:@" = "];
|
||||
attribute = [self _attributeForColumn: _colname];
|
||||
@@ -884,39 +835,22 @@ andAttribute: (EOAttribute *)_attribute
|
||||
attribute1 = [self _attributeForColumn: _colname];
|
||||
if (_colname2 == nil)
|
||||
{
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
qualifier = [[EOSQLQualifier alloc] initWithEntity: _entity
|
||||
qualifierFormat: @"%A = %@ AND c_folder_id = %@", _colname,
|
||||
[self _formatRowValue:_value
|
||||
withAdaptor: _adaptor andAttribute: attribute1], folderId];
|
||||
else
|
||||
qualifier = [[EOSQLQualifier alloc] initWithEntity: _entity
|
||||
qualifierFormat: @"%A = %@", _colname,
|
||||
[self _formatRowValue:_value
|
||||
withAdaptor: _adaptor andAttribute: attribute1]];
|
||||
qualifier = [[EOSQLQualifier alloc] initWithEntity: _entity
|
||||
qualifierFormat: @"%A = %@", _colname,
|
||||
[self _formatRowValue:_value
|
||||
withAdaptor: _adaptor andAttribute: attribute1]];
|
||||
}
|
||||
else
|
||||
{
|
||||
attribute2 = [self _attributeForColumn: _colname2];
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
qualifier = [[EOSQLQualifier alloc] initWithEntity: _entity
|
||||
qualifierFormat: @"%A = %@ AND %A = %@ AND c_folder_id = %@",
|
||||
_colname,
|
||||
[self _formatRowValue:_value
|
||||
withAdaptor: _adaptor andAttribute: attribute1],
|
||||
_colname2,
|
||||
[self _formatRowValue:_value2
|
||||
withAdaptor: _adaptor andAttribute: attribute2]];
|
||||
else
|
||||
qualifier = [[EOSQLQualifier alloc] initWithEntity: _entity
|
||||
qualifierFormat: @"%A = %@ AND %A = %@",
|
||||
_colname,
|
||||
[self _formatRowValue:_value
|
||||
withAdaptor: _adaptor andAttribute: attribute1],
|
||||
_colname2,
|
||||
[self _formatRowValue:_value2
|
||||
withAdaptor: _adaptor andAttribute: attribute2],
|
||||
folderId];
|
||||
qualifier = [[EOSQLQualifier alloc] initWithEntity: _entity
|
||||
qualifierFormat: @"%A = %@ AND %A = %@",
|
||||
_colname,
|
||||
[self _formatRowValue:_value
|
||||
withAdaptor: _adaptor andAttribute: attribute1],
|
||||
_colname2,
|
||||
[self _formatRowValue:_value2
|
||||
withAdaptor: _adaptor andAttribute: attribute2]];
|
||||
}
|
||||
|
||||
return AUTORELEASE(qualifier);
|
||||
@@ -935,17 +869,10 @@ andAttribute: (EOAttribute *)_attribute
|
||||
|
||||
table = [self storeTableName];
|
||||
attribute = [self _attributeForColumn: @"c_name"];
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
delSql = [NSString stringWithFormat: @"DELETE FROM %@"
|
||||
@" WHERE c_name = %@ AND c_folder_id = %@", table,
|
||||
[self _formatRowValue: recordName
|
||||
withAdaptor: [adaptorCtx adaptor]
|
||||
andAttribute: attribute], folderId];
|
||||
else
|
||||
delSql = [NSString stringWithFormat: @"DELETE FROM %@"
|
||||
@" WHERE c_name = %@", table,
|
||||
[self _formatRowValue: recordName
|
||||
withAdaptor: [adaptorCtx adaptor]
|
||||
delSql = [NSString stringWithFormat: @"DELETE FROM %@"
|
||||
@" WHERE c_name = %@", table,
|
||||
[self _formatRowValue: recordName
|
||||
withAdaptor: [adaptorCtx adaptor]
|
||||
andAttribute: attribute]];
|
||||
[channel evaluateExpressionX: delSql];
|
||||
|
||||
@@ -1017,21 +944,7 @@ andAttribute: (EOAttribute *)_attribute
|
||||
|| *_baseVersion == [storedVersion unsignedIntValue])
|
||||
{
|
||||
/* extract quick info */
|
||||
NSMethodSignature *aSignature;
|
||||
NSInvocation *anInvocation;
|
||||
SEL aSelector;
|
||||
|
||||
aSelector = @selector(quickRecordFromContent:container:nameInContainer:);
|
||||
aSignature = [[theComponent class] instanceMethodSignatureForSelector: aSelector];
|
||||
anInvocation = [NSInvocation invocationWithMethodSignature:aSignature];
|
||||
[anInvocation setSelector: aSelector];
|
||||
[anInvocation setTarget: theComponent];
|
||||
[anInvocation setArgument:&_content atIndex: 2];
|
||||
[anInvocation setArgument:&theContainer atIndex: 3];
|
||||
[anInvocation setArgument:&_name atIndex: 4];
|
||||
[anInvocation invoke];
|
||||
[anInvocation getReturnValue: &quickRow];
|
||||
|
||||
quickRow = [theComponent performSelector: @selector(quickRecordFromContent:container:) withObject: _content withObject: theContainer];
|
||||
if (quickRow)
|
||||
{
|
||||
[quickRow setObject:_name forKey:@"c_name"];
|
||||
@@ -1187,7 +1100,7 @@ andAttribute: (EOAttribute *)_attribute
|
||||
return error;
|
||||
}
|
||||
|
||||
- (NSException *) deleteContentWithName:(NSString *)_name {
|
||||
- (NSException *)deleteContentWithName:(NSString *)_name {
|
||||
EOAdaptorChannel *storeChannel, *quickChannel;
|
||||
EOAdaptorContext *adaptorCtx;
|
||||
NSException *error;
|
||||
@@ -1195,6 +1108,7 @@ andAttribute: (EOAttribute *)_attribute
|
||||
NSCalendarDate *nowDate;
|
||||
|
||||
/* check preconditions */
|
||||
|
||||
if (_name == nil) {
|
||||
return [NSException exceptionWithName:@"GCSDeleteException"
|
||||
reason:@"no content filename was provided"
|
||||
@@ -1238,8 +1152,6 @@ andAttribute: (EOAttribute *)_attribute
|
||||
delsql = [delsql stringByAppendingString: [self _formatRowValue:_name
|
||||
withAdaptor: [adaptorCtx adaptor]
|
||||
andAttribute: [self _attributeForColumn: @"c_name"]]];
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
delsql = [delsql stringByAppendingFormat:@" AND c_folder_id = %@", folderId];
|
||||
if ((error = [storeChannel evaluateExpressionX:delsql]) != nil) {
|
||||
[self errorWithFormat:
|
||||
@"%s: cannot delete content '%@': %@",
|
||||
@@ -1252,8 +1164,6 @@ andAttribute: (EOAttribute *)_attribute
|
||||
delsql = [delsql stringByAppendingString: [self _formatRowValue:_name
|
||||
withAdaptor: [adaptorCtx adaptor]
|
||||
andAttribute: [self _attributeForColumn: @"c_name"]]];
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
delsql = [delsql stringByAppendingFormat:@" AND c_folder_id = %@", folderId];
|
||||
if ((error = [quickChannel evaluateExpressionX:delsql]) != nil) {
|
||||
[self errorWithFormat:
|
||||
@"%s: cannot delete quick row '%@': %@",
|
||||
@@ -1301,24 +1211,18 @@ andAttribute: (EOAttribute *)_attribute
|
||||
if (!ofFlags.sameTableForQuick) [[quickChannel adaptorContext] beginTransaction];
|
||||
[[storeChannel adaptorContext] beginTransaction];
|
||||
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
query = [NSString stringWithFormat: @"DELETE FROM %@ WHERE c_folder_id = %@", [self storeTableName], folderId];
|
||||
else
|
||||
query = [NSString stringWithFormat: @"DELETE FROM %@", [self storeTableName]];
|
||||
query = [NSString stringWithFormat: @"DELETE FROM %@", [self storeTableName]];
|
||||
error = [storeChannel evaluateExpressionX:query];
|
||||
if (error)
|
||||
[self errorWithFormat: @"%s: cannot delete content '%@': %@",
|
||||
__PRETTY_FUNCTION__, query, error];
|
||||
else if (!ofFlags.sameTableForQuick) {
|
||||
/* content row deleted, now delete the quick row */
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
query = [NSString stringWithFormat: @"DELETE FROM %@ WHERE c_folder_id = %@", [self quickTableName], folderId];
|
||||
else
|
||||
/* content row deleted, now delete the quick row */
|
||||
query = [NSString stringWithFormat: @"DELETE FROM %@", [self quickTableName]];
|
||||
error = [quickChannel evaluateExpressionX: query];
|
||||
if (error)
|
||||
[self errorWithFormat: @"%s: cannot delete quick row '%@': %@",
|
||||
__PRETTY_FUNCTION__, query, error];
|
||||
error = [quickChannel evaluateExpressionX: query];
|
||||
if (error)
|
||||
[self errorWithFormat: @"%s: cannot delete quick row '%@': %@",
|
||||
__PRETTY_FUNCTION__, query, error];
|
||||
}
|
||||
|
||||
/* release channels and return */
|
||||
@@ -1333,58 +1237,6 @@ andAttribute: (EOAttribute *)_attribute
|
||||
return error;
|
||||
}
|
||||
|
||||
- (NSException *) touchContentWithName: (NSString *) _name
|
||||
{
|
||||
NSString *touchSql, *table;
|
||||
EOAdaptorContext *adaptorCtx;
|
||||
EOAdaptorChannel *channel;
|
||||
EOAttribute *attribute;
|
||||
NSCalendarDate *nowDate;
|
||||
|
||||
if (_name == nil)
|
||||
return [NSException exceptionWithName: @"GCSDeleteException"
|
||||
reason: @"no content filename was provided"
|
||||
userInfo: nil];
|
||||
|
||||
channel = [self acquireStoreChannel];
|
||||
|
||||
if ((channel = [self acquireStoreChannel]) == nil)
|
||||
{
|
||||
[self errorWithFormat:@"could not open storage channel!"];
|
||||
return nil;
|
||||
}
|
||||
|
||||
adaptorCtx = [channel adaptorContext];
|
||||
[adaptorCtx beginTransaction];
|
||||
|
||||
table = [self storeTableName];
|
||||
attribute = [self _attributeForColumn: @"c_name"];
|
||||
nowDate = [NSCalendarDate date];
|
||||
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
touchSql = [NSString stringWithFormat: @"UPDATE %@ SET c_lastmodified = %u WHERE c_name = %@ AND c_folder_id = %@",
|
||||
table,
|
||||
(unsigned int) [nowDate timeIntervalSince1970],
|
||||
[self _formatRowValue: _name
|
||||
withAdaptor: [adaptorCtx adaptor]
|
||||
andAttribute: attribute],
|
||||
folderId];
|
||||
else
|
||||
touchSql = [NSString stringWithFormat: @"UPDATE %@ SET c_lastmodified = %u WHERE c_name = %@",
|
||||
table,
|
||||
(unsigned int) [nowDate timeIntervalSince1970],
|
||||
[self _formatRowValue: _name
|
||||
withAdaptor: [adaptorCtx adaptor]
|
||||
andAttribute: attribute]];
|
||||
|
||||
[channel evaluateExpressionX: touchSql];
|
||||
|
||||
[[channel adaptorContext] commitTransaction];
|
||||
[self releaseChannel: channel];
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSException *)deleteFolder {
|
||||
EOAdaptorChannel *channel;
|
||||
NSString *delsql;
|
||||
@@ -1401,26 +1253,17 @@ andAttribute: (EOAttribute *)_attribute
|
||||
[[channel adaptorContext] beginTransaction];
|
||||
table = [self storeTableName];
|
||||
if ([table length] > 0) {
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
delsql = [NSString stringWithFormat: @"DELETE FROM %@ WHERE c_folder_id = %@", table, folderId];
|
||||
else
|
||||
delsql = [@"DROP TABLE " stringByAppendingString: table];
|
||||
delsql = [@"DROP TABLE " stringByAppendingString: table];
|
||||
[channel evaluateExpressionX:delsql];
|
||||
}
|
||||
table = [self quickTableName];
|
||||
if ([table length] > 0) {
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
delsql = [NSString stringWithFormat: @"DELETE FROM %@ WHERE c_folder_id = %@", table, folderId];
|
||||
else
|
||||
delsql = [@"DROP TABLE " stringByAppendingString: table];
|
||||
delsql = [@"DROP TABLE " stringByAppendingString: table];
|
||||
[channel evaluateExpressionX:delsql];
|
||||
}
|
||||
table = [self aclTableName];
|
||||
if ([table length] > 0) {
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
delsql = [NSString stringWithFormat: @"DELETE FROM %@ WHERE c_folder_id = %@", table, folderId];
|
||||
else
|
||||
delsql = [@"DROP TABLE " stringByAppendingString: table];
|
||||
delsql = [@"DROP TABLE " stringByAppendingString: table];
|
||||
[channel evaluateExpressionX:delsql];
|
||||
}
|
||||
|
||||
@@ -1515,17 +1358,10 @@ andAttribute: (EOAttribute *)_attribute
|
||||
[sql appendString:@"SELECT c_uid, c_object, c_role"];
|
||||
[sql appendString:@" FROM "];
|
||||
[sql appendString:[self aclTableName]];
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
[sql appendFormat:@" WHERE c_folder_id = %@", folderId];
|
||||
|
||||
|
||||
if (qualifier != nil) {
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
[sql appendFormat:@" AND (%@)", [self _sqlForQualifier:qualifier]];
|
||||
else
|
||||
{
|
||||
[sql appendString:@" WHERE "];
|
||||
[sql appendString:[self _sqlForQualifier:qualifier]];
|
||||
}
|
||||
[sql appendString:@" WHERE "];
|
||||
[sql appendString:[self _sqlForQualifier:qualifier]];
|
||||
}
|
||||
if ([sortOrderings count] > 0) {
|
||||
[sql appendString:@" ORDER BY "];
|
||||
@@ -1608,14 +1444,10 @@ andAttribute: (EOAttribute *)_attribute
|
||||
[sql appendString:[self aclTableName]];
|
||||
qSql = [self _sqlForQualifier: [_fs qualifier]];
|
||||
if (qSql)
|
||||
{
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
[sql appendFormat:@" WHERE c_folder_id = %@ AND (%@)", folderId, qSql];
|
||||
else
|
||||
[sql appendFormat:@" WHERE %@", qSql];
|
||||
}
|
||||
|
||||
[sql appendFormat:@" WHERE %@", qSql];
|
||||
|
||||
/* open channel */
|
||||
|
||||
if ((channel = [self acquireAclChannel]) == nil) {
|
||||
[self errorWithFormat:@"could not open acl channel!"];
|
||||
return;
|
||||
@@ -1645,21 +1477,11 @@ andAttribute: (EOAttribute *)_attribute
|
||||
|
||||
count = 0;
|
||||
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
sqlString = [NSMutableString stringWithFormat:
|
||||
@"SELECT COUNT(*) AS CNT FROM %@ WHERE c_folder_id = %@",
|
||||
[self storeTableName], folderId];
|
||||
else
|
||||
sqlString = [NSMutableString stringWithFormat:
|
||||
@"SELECT COUNT(*) AS CNT FROM %@",
|
||||
[self storeTableName]];
|
||||
sqlString = [NSMutableString stringWithFormat:
|
||||
@"SELECT COUNT(*) AS CNT FROM %@",
|
||||
[self storeTableName]];
|
||||
if (excludeDeleted)
|
||||
{
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
[sqlString appendString: @" AND (c_deleted != 1 OR c_deleted IS NULL)"];
|
||||
else
|
||||
[sqlString appendString: @" WHERE (c_deleted != 1 OR c_deleted IS NULL)"];
|
||||
}
|
||||
[sqlString appendString: @" WHERE (c_deleted != 1 OR c_deleted IS NULL)"];
|
||||
|
||||
channel = [self acquireStoreChannel];
|
||||
if (channel)
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#ifndef __GDLContentStore_GCSFolderManager_H__
|
||||
#define __GDLContentStore_GCSFolderManager_H__
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
|
||||
/*
|
||||
GCSFolderManager
|
||||
@@ -38,28 +39,15 @@
|
||||
GCSChannelManager *channelManager;
|
||||
NSDictionary *nameToType;
|
||||
NSURL *folderInfoLocation;
|
||||
NSURL *storeLocation;
|
||||
NSURL *aclLocation;
|
||||
NSURL *cacheFolderLocation;
|
||||
}
|
||||
|
||||
+ (BOOL) singleStoreMode;
|
||||
+ (id)defaultFolderManager;
|
||||
- (id)initWithFolderInfoLocation: (NSURL *)_infoUrl
|
||||
andStoreLocation: (NSURL *)_storeUrl
|
||||
andAclLocation: (NSURL *)_aclUrl
|
||||
andCacheFolderLocation: (NSURL *)_cacheFolderUrl;
|
||||
- (id)initWithFolderInfoLocation:(NSURL *)_url;
|
||||
|
||||
/* accessors */
|
||||
|
||||
- (NSURL *)folderInfoLocation;
|
||||
- (NSString *)folderInfoTableName;
|
||||
- (NSURL *)storeLocation;
|
||||
- (NSString *)storeTableName;
|
||||
- (NSURL *)aclLocation;
|
||||
- (NSString *)aclTableName;
|
||||
- (NSURL *)cacheFolderLocation;
|
||||
- (NSString *)cacheFolderTableName;
|
||||
|
||||
/* connection */
|
||||
|
||||
|
||||
@@ -24,15 +24,19 @@
|
||||
#import <Foundation/NSCharacterSet.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSException.h>
|
||||
#import <Foundation/NSLock.h>
|
||||
#import <Foundation/NSProcessInfo.h>
|
||||
#import <Foundation/NSURL.h>
|
||||
#import <Foundation/NSSet.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSUserDefaults.h>
|
||||
|
||||
#import <NGExtensions/NSNull+misc.h>
|
||||
#import <NGExtensions/NSObject+Logs.h>
|
||||
|
||||
#import <GDLAccess/EOAdaptorChannel.h>
|
||||
#import <GDLAccess/EOAdaptorContext.h>
|
||||
#import <NGExtensions/NGResourceLocator.h>
|
||||
#import <unistd.h>
|
||||
|
||||
#import "GCSChannelManager.h"
|
||||
#import "EOAdaptorChannel+GCS.h"
|
||||
@@ -75,7 +79,6 @@ static NSString *GCSPathRecordName = @"c_path";
|
||||
static NSString *GCSGenericFolderTypeName = @"Container";
|
||||
static const char *GCSPathColumnPattern = "c_path%i";
|
||||
static NSCharacterSet *asciiAlphaNumericCS = nil;
|
||||
static BOOL _singleStoreMode = NO;
|
||||
|
||||
+ (void) initialize
|
||||
{
|
||||
@@ -98,24 +101,11 @@ static BOOL _singleStoreMode = NO;
|
||||
@"abcdefghijklmnopqrstuvwxyz"];
|
||||
[asciiAlphaNumericCS retain];
|
||||
}
|
||||
|
||||
if ([ud stringForKey: @"OCSStoreURL"] &&
|
||||
[ud stringForKey: @"OCSAclURL"] &&
|
||||
[ud stringForKey: @"OCSCacheFolderURL"])
|
||||
_singleStoreMode = YES;
|
||||
}
|
||||
|
||||
+ (BOOL) singleStoreMode
|
||||
{
|
||||
return _singleStoreMode;
|
||||
}
|
||||
|
||||
+ (id)defaultFolderManager {
|
||||
NSString *s;
|
||||
NSURL *infoUrl;
|
||||
NSURL *storeUrl;
|
||||
NSURL *aclUrl;
|
||||
NSURL *cacheFolderUrl;
|
||||
NSURL *url;
|
||||
|
||||
if (!fm)
|
||||
{
|
||||
@@ -125,66 +115,18 @@ static BOOL _singleStoreMode = NO;
|
||||
__PRETTY_FUNCTION__);
|
||||
return nil;
|
||||
}
|
||||
if ((infoUrl = [NSURL URLWithString:s]) == nil) {
|
||||
if ((url = [NSURL URLWithString:s]) == nil) {
|
||||
NSLog(@"ERROR(%s): default 'OCSFolderInfoURL' is not a valid URL: '%@'",
|
||||
__PRETTY_FUNCTION__, s);
|
||||
return nil;
|
||||
}
|
||||
|
||||
if (_singleStoreMode)
|
||||
{
|
||||
s = [[NSUserDefaults standardUserDefaults] stringForKey:@"OCSStoreURL"];
|
||||
if ([s length] == 0) {
|
||||
NSLog(@"ERROR(%s): default 'OCSStoreURL' is not configured.",
|
||||
__PRETTY_FUNCTION__);
|
||||
return nil;
|
||||
}
|
||||
if ((storeUrl = [NSURL URLWithString:s]) == nil) {
|
||||
NSLog(@"ERROR(%s): default 'OCSStoreURL' is not a valid URL: '%@'",
|
||||
__PRETTY_FUNCTION__, s);
|
||||
return nil;
|
||||
}
|
||||
s = [[NSUserDefaults standardUserDefaults] stringForKey:@"OCSAclURL"];
|
||||
if ([s length] == 0) {
|
||||
NSLog(@"ERROR(%s): default 'OCSAclURL' is not configured.",
|
||||
__PRETTY_FUNCTION__);
|
||||
return nil;
|
||||
}
|
||||
if ((aclUrl = [NSURL URLWithString:s]) == nil) {
|
||||
NSLog(@"ERROR(%s): default 'OCSAclURL' is not a valid URL: '%@'",
|
||||
__PRETTY_FUNCTION__, s);
|
||||
return nil;
|
||||
}
|
||||
s = [[NSUserDefaults standardUserDefaults] stringForKey:@"OCSCacheFolderURL"];
|
||||
if ([s length] == 0) {
|
||||
NSLog(@"ERROR(%s): default 'OCSCacheFolderURL' is not configured.",
|
||||
__PRETTY_FUNCTION__);
|
||||
return nil;
|
||||
}
|
||||
if ((cacheFolderUrl = [NSURL URLWithString:s]) == nil) {
|
||||
NSLog(@"ERROR(%s): default 'OCSCacheFolderURL' is not a valid URL: '%@'",
|
||||
__PRETTY_FUNCTION__, s);
|
||||
return nil;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
storeUrl = nil;
|
||||
aclUrl = nil;
|
||||
cacheFolderUrl = nil;
|
||||
}
|
||||
|
||||
if ((fm = [[self alloc] initWithFolderInfoLocation: infoUrl
|
||||
andStoreLocation: storeUrl
|
||||
andAclLocation: aclUrl
|
||||
andCacheFolderLocation: cacheFolderUrl]) == nil) {
|
||||
NSLog(@"ERROR(%s): could not create folder manager with URLs: '%@', '%@', '%@'",
|
||||
__PRETTY_FUNCTION__, [infoUrl absoluteString],
|
||||
[storeUrl absoluteString], [aclUrl absoluteString]);
|
||||
if ((fm = [[self alloc] initWithFolderInfoLocation:url]) == nil) {
|
||||
NSLog(@"ERROR(%s): could not create folder manager with URL: '%@'",
|
||||
__PRETTY_FUNCTION__, [url absoluteString]);
|
||||
return nil;
|
||||
}
|
||||
if (debugOn)
|
||||
[self debugWithFormat:@"Note: setup default manager at: %@", infoUrl];
|
||||
[self debugWithFormat:@"Note: setup default manager at: %@", url];
|
||||
}
|
||||
|
||||
return fm;
|
||||
@@ -222,81 +164,20 @@ static BOOL _singleStoreMode = NO;
|
||||
return typeMap;
|
||||
}
|
||||
|
||||
- (id)initWithFolderInfoLocation: (NSURL *)_infoUrl
|
||||
andStoreLocation: (NSURL *)_storeUrl
|
||||
andAclLocation: (NSURL *)_aclUrl
|
||||
andCacheFolderLocation: (NSURL *)_cacheFolderUrl {
|
||||
if (_infoUrl == nil) {
|
||||
- (id)initWithFolderInfoLocation:(NSURL *)_url {
|
||||
if (_url == nil) {
|
||||
[self logWithFormat:@"ERROR(%s): missing folder info url!",
|
||||
__PRETTY_FUNCTION__];
|
||||
[self release];
|
||||
return nil;
|
||||
}
|
||||
|
||||
if (_singleStoreMode)
|
||||
{
|
||||
if (_storeUrl == nil) {
|
||||
[self logWithFormat:@"ERROR(%s): missing folder store url!",
|
||||
__PRETTY_FUNCTION__];
|
||||
[self release];
|
||||
return nil;
|
||||
}
|
||||
if (_aclUrl == nil) {
|
||||
[self logWithFormat:@"ERROR(%s): missing folder acl url!",
|
||||
__PRETTY_FUNCTION__];
|
||||
[self release];
|
||||
return nil;
|
||||
}
|
||||
if (_cacheFolderUrl == nil) {
|
||||
[self logWithFormat:@"ERROR(%s): missing cache folder url!",
|
||||
__PRETTY_FUNCTION__];
|
||||
[self release];
|
||||
return nil;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if ((self = [super init])) {
|
||||
channelManager = [[GCSChannelManager defaultChannelManager] retain];
|
||||
folderInfoLocation = [_infoUrl retain];
|
||||
|
||||
if (_singleStoreMode)
|
||||
{
|
||||
storeLocation = [_storeUrl retain];
|
||||
aclLocation = [_aclUrl retain];
|
||||
cacheFolderLocation = [_cacheFolderUrl retain];
|
||||
}
|
||||
else
|
||||
{
|
||||
storeLocation = nil;
|
||||
aclLocation = nil;
|
||||
cacheFolderLocation = nil;
|
||||
}
|
||||
folderInfoLocation = [_url retain];
|
||||
|
||||
if ([[self folderInfoTableName] length] == 0) {
|
||||
[self logWithFormat:@"ERROR(%s): missing tablename in URL: %@",
|
||||
__PRETTY_FUNCTION__, [_infoUrl absoluteString]];
|
||||
[self release];
|
||||
return nil;
|
||||
}
|
||||
|
||||
if (_singleStoreMode && [[self storeTableName] length] == 0) {
|
||||
[self logWithFormat:@"ERROR(%s): missing tablename in URL: %@",
|
||||
__PRETTY_FUNCTION__, [_storeUrl absoluteString]];
|
||||
[self release];
|
||||
return nil;
|
||||
}
|
||||
|
||||
if (_singleStoreMode && [[self aclTableName] length] == 0) {
|
||||
[self logWithFormat:@"ERROR(%s): missing tablename in URL: %@",
|
||||
__PRETTY_FUNCTION__, [_aclUrl absoluteString]];
|
||||
[self release];
|
||||
return nil;
|
||||
}
|
||||
|
||||
if (_singleStoreMode && [[self cacheFolderTableName] length] == 0) {
|
||||
[self logWithFormat:@"ERROR(%s): missing tablename in URL: %@",
|
||||
__PRETTY_FUNCTION__, [_cacheFolderUrl absoluteString]];
|
||||
[self logWithFormat:@"ERROR(%s): missing tablename in URL: %@",
|
||||
__PRETTY_FUNCTION__, [_url absoluteString]];
|
||||
[self release];
|
||||
return nil;
|
||||
}
|
||||
@@ -325,31 +206,6 @@ static BOOL _singleStoreMode = NO;
|
||||
return [[self folderInfoLocation] gcsTableName];
|
||||
}
|
||||
|
||||
- (NSURL *)storeLocation {
|
||||
return storeLocation;
|
||||
}
|
||||
|
||||
- (NSString *)storeTableName {
|
||||
return [[self storeLocation] gcsTableName];
|
||||
}
|
||||
|
||||
- (NSURL *)aclLocation {
|
||||
return aclLocation;
|
||||
}
|
||||
|
||||
- (NSString *)aclTableName {
|
||||
return [[self aclLocation] gcsTableName];
|
||||
}
|
||||
|
||||
- (NSURL *)cacheFolderLocation {
|
||||
return cacheFolderLocation;
|
||||
}
|
||||
|
||||
- (NSString *)cacheFolderTableName {
|
||||
return [[self cacheFolderLocation] gcsTableName];
|
||||
}
|
||||
|
||||
|
||||
/* connection */
|
||||
|
||||
- (GCSChannelManager *)channelManager {
|
||||
@@ -415,7 +271,7 @@ static BOOL _singleStoreMode = NO;
|
||||
GCSFolderType *folderType;
|
||||
NSString *folderTypeName, *locationString, *folderName, *path;
|
||||
NSNumber *folderId;
|
||||
NSURL *location, *quickLocation, *acl_location;
|
||||
NSURL *location, *quickLocation, *aclLocation;
|
||||
|
||||
if (_record == nil) return nil;
|
||||
|
||||
@@ -436,43 +292,37 @@ static BOOL _singleStoreMode = NO;
|
||||
folderId = [_record objectForKey:@"c_folder_id"];
|
||||
folderName = [_record objectForKey:@"c_path"];
|
||||
path = [self pathFromInternalName:folderName];
|
||||
|
||||
locationString = [_record objectForKey:@"c_location"];
|
||||
location = [locationString isNotNull]
|
||||
? [NSURL URLWithString:locationString]
|
||||
: nil;
|
||||
if (location == nil) {
|
||||
[self logWithFormat:@"ERROR(%s): missing folder location in record: %@",
|
||||
__PRETTY_FUNCTION__, _record];
|
||||
return nil;
|
||||
}
|
||||
|
||||
locationString = [_record objectForKey:@"c_quick_location"];
|
||||
quickLocation = [locationString isNotNull]
|
||||
? [NSURL URLWithString:locationString]
|
||||
: nil;
|
||||
|
||||
if (!_singleStoreMode) {
|
||||
locationString = [_record objectForKey:@"c_location"];
|
||||
location = [locationString isNotNull]
|
||||
? [NSURL URLWithString:locationString]
|
||||
: nil;
|
||||
if (location == nil) {
|
||||
[self logWithFormat:@"ERROR(%s): missing folder location in record: %@",
|
||||
__PRETTY_FUNCTION__, _record];
|
||||
return nil;
|
||||
}
|
||||
|
||||
locationString = [_record objectForKey:@"c_quick_location"];
|
||||
quickLocation = [locationString isNotNull]
|
||||
? [NSURL URLWithString:locationString]
|
||||
: nil;
|
||||
|
||||
if (quickLocation == nil) {
|
||||
[self logWithFormat:@"WARNING(%s): missing quick location in record: %@",
|
||||
__PRETTY_FUNCTION__, _record];
|
||||
}
|
||||
|
||||
locationString = [_record objectForKey:@"c_acl_location"];
|
||||
acl_location = [locationString isNotNull]
|
||||
? [NSURL URLWithString:locationString]
|
||||
: nil;
|
||||
} else {
|
||||
location = nil;
|
||||
quickLocation = nil;
|
||||
acl_location = nil;
|
||||
if (quickLocation == nil) {
|
||||
[self logWithFormat:@"WARNING(%s): missing quick location in record: %@",
|
||||
__PRETTY_FUNCTION__, _record];
|
||||
}
|
||||
|
||||
locationString = [_record objectForKey:@"c_acl_location"];
|
||||
aclLocation = [locationString isNotNull]
|
||||
? [NSURL URLWithString:locationString]
|
||||
: nil;
|
||||
|
||||
folder = [[GCSFolder alloc] initWithPath:path primaryKey:folderId
|
||||
folderTypeName:folderTypeName
|
||||
folderType:folderType
|
||||
location:location quickLocation:quickLocation
|
||||
aclLocation:acl_location
|
||||
aclLocation:aclLocation
|
||||
folderManager:self];
|
||||
return [folder autorelease];
|
||||
}
|
||||
@@ -921,7 +771,7 @@ static BOOL _singleStoreMode = NO;
|
||||
baseURL, aclTableName,
|
||||
folderType];
|
||||
error = [channel evaluateExpressionX: sql];
|
||||
if (!_singleStoreMode && !error)
|
||||
if (!error)
|
||||
{
|
||||
specialQuery = [channel specialQueries];
|
||||
createQuery = [specialQuery createFolderTableWithName: tableName];
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
route later, we can still do it :-)
|
||||
*/
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
|
||||
@class NSString, NSArray, NSDictionary;
|
||||
@class EOQualifier;
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSKeyValueCoding.h>
|
||||
#import <Foundation/NSSet.h>
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
#import <NGExtensions/NSNull+misc.h>
|
||||
#import <NGExtensions/NSObject+Logs.h>
|
||||
@@ -29,9 +30,9 @@
|
||||
|
||||
#import <EOControl/EOQualifier.h>
|
||||
|
||||
#import <EOControl/EOKeyValueCoding.h>
|
||||
#import <NGExtensions/NGResourceLocator.h>
|
||||
|
||||
#import "GCSFolderManager.h"
|
||||
#import "GCSFolderType.h"
|
||||
#import "GCSFolder.h"
|
||||
#import "GCSFieldInfo.h"
|
||||
@@ -158,52 +159,15 @@
|
||||
{
|
||||
NSMutableString *sql;
|
||||
unsigned i, count;
|
||||
GCSFieldInfo *field;
|
||||
BOOL combined;
|
||||
|
||||
combined = NO;
|
||||
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
combined = YES;
|
||||
|
||||
|
||||
sql = [NSMutableString stringWithFormat: @"CREATE TABLE %@ (", _tabName];
|
||||
|
||||
if (combined)
|
||||
[sql appendString: @"c_folder_id INT NOT NULL, "];
|
||||
|
||||
count = [quickFields count];
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
field = [quickFields objectAtIndex:i];
|
||||
|
||||
if (i != 0) [sql appendString: @", "];
|
||||
[sql appendString:[field columnName]];
|
||||
[sql appendString:@" "];
|
||||
[sql appendString:[field sqlType]];
|
||||
|
||||
[sql appendString:@" "];
|
||||
if (![field doesAllowNull]) [sql appendString:@"NOT "];
|
||||
[sql appendString:@"NULL"];
|
||||
|
||||
if (!combined && [field isPrimaryKey])
|
||||
[sql appendString:@" PRIMARY KEY"];
|
||||
if (i > 0) [sql appendString:@", "];
|
||||
[sql appendFormat: @" %@", [[quickFields objectAtIndex:i] sqlCreateSection]];
|
||||
}
|
||||
|
||||
// Define primary key constraint for c_folder_id and additional primary key fields
|
||||
if (combined)
|
||||
{
|
||||
[sql appendFormat:@", CONSTRAINT %@_pkey PRIMARY KEY(c_folder_id", _tabName];
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
field = [quickFields objectAtIndex:i];
|
||||
if ([field isPrimaryKey])
|
||||
[sql appendFormat:@", %@", [field columnName]];
|
||||
}
|
||||
|
||||
[sql appendString:@")"];
|
||||
}
|
||||
|
||||
[sql appendString:@")"];
|
||||
[sql appendString:@"\n)"];
|
||||
|
||||
return sql;
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#ifndef GCSSESSIONSFOLDER_H
|
||||
#define GCSSESSIONSFOLDER_H
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
|
||||
@class NSCalendarDate;
|
||||
@class NSException;
|
||||
|
||||
@@ -20,10 +20,16 @@
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSURL.h>
|
||||
#import <Foundation/NSUserDefaults.h>
|
||||
#import <Foundation/NSValue.h>
|
||||
|
||||
#import <NGExtensions/NSObject+Logs.h>
|
||||
#import <NGExtensions/NSNull+misc.h>
|
||||
|
||||
#import <GDLAccess/EOAdaptorChannel.h>
|
||||
#import <GDLAccess/EOAdaptorContext.h>
|
||||
#import <GDLAccess/EOAttribute.h>
|
||||
#import <GDLAccess/EOEntity.h>
|
||||
@@ -33,6 +39,7 @@
|
||||
#import "GCSChannelManager.h"
|
||||
#import "GCSFolderManager.h"
|
||||
#import "GCSSpecialQueries.h"
|
||||
#import "GCSStringFormatter.h"
|
||||
#import "NSURL+GCS.h"
|
||||
|
||||
#import "GCSSessionsFolder.h"
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#ifndef GCSSPECIALQUERIES_H
|
||||
#define GCSSPECIALQUERIES_H
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
|
||||
#import <GDLAccess/EOAdaptorChannel.h>
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
*/
|
||||
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
#import <NGExtensions/NSObject+Logs.h>
|
||||
|
||||
|
||||
@@ -18,6 +18,11 @@
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSEnumerator.h>
|
||||
#import <Foundation/NSRange.h>
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
#import <NGExtensions/NGBase64Coding.h>
|
||||
#import <NGExtensions/NSObject+Logs.h>
|
||||
@@ -27,6 +32,7 @@
|
||||
#import "NSDictionary+NGCards.h"
|
||||
#import "CardVersitRenderer.h"
|
||||
|
||||
#import "CardElement.h"
|
||||
#import "CardGroup.h"
|
||||
|
||||
@implementation CardElement
|
||||
|
||||
@@ -20,6 +20,11 @@
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSEnumerator.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <SaxObjC/SaxXMLReader.h>
|
||||
#import <SaxObjC/SaxXMLReaderFactory.h>
|
||||
|
||||
#import "NGCardsSaxHandler.h"
|
||||
|
||||
@@ -21,9 +21,13 @@
|
||||
*/
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSEnumerator.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
#import <NGExtensions/NSObject+Logs.h>
|
||||
|
||||
#import "CardElement.h"
|
||||
#import "CardGroup.h"
|
||||
|
||||
#import "NSString+NGCards.h"
|
||||
|
||||
@@ -19,7 +19,14 @@
|
||||
02111-1307, USA.
|
||||
*/
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSEnumerator.h>
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
#import <NGObjWeb/WOContext.h>
|
||||
#import <NGObjWeb/WODynamicElement.h>
|
||||
#import <NGObjWeb/WOResponse.h>
|
||||
|
||||
@interface IcalComponent : WODynamicElement
|
||||
{
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#ifndef __SkyDaemon_skyaptd_IcalResponse_H__
|
||||
#define __SkyDaemon_skyaptd_IcalResponse_H__
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
|
||||
@class NSMutableString, NSData;
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
02111-1307, USA.
|
||||
*/
|
||||
|
||||
#import "IcalResponse.h"
|
||||
|
||||
@implementation IcalResponse
|
||||
|
||||
|
||||
@@ -22,9 +22,23 @@
|
||||
#ifndef __NGCards_H__
|
||||
#define __NGCards_H__
|
||||
|
||||
#import <NGCards/iCalAttachment.h>
|
||||
#import <NGCards/iCalObject.h>
|
||||
#import <NGCards/iCalEntityObject.h>
|
||||
#import <NGCards/iCalRepeatableEntityObject.h>
|
||||
#import <NGCards/iCalCalendar.h>
|
||||
#import <NGCards/iCalToDo.h>
|
||||
#import <NGCards/iCalJournal.h>
|
||||
#import <NGCards/iCalEvent.h>
|
||||
#import <NGCards/iCalFreeBusy.h>
|
||||
#import <NGCards/iCalPerson.h>
|
||||
#import <NGCards/iCalAlarm.h>
|
||||
#import <NGCards/iCalTrigger.h>
|
||||
|
||||
#import <NGCards/iCalEventChanges.h>
|
||||
|
||||
#import <NGCards/iCalRecurrenceRule.h>
|
||||
#import <NGCards/iCalRecurrenceCalculator.h>
|
||||
|
||||
#import <NGCards/NSCalendarDate+ICal.h>
|
||||
|
||||
|
||||
@@ -19,8 +19,11 @@
|
||||
02111-1307, USA.
|
||||
*/
|
||||
|
||||
#import <string.h>
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSEnumerator.h>
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
#import "NSString+NGCards.h"
|
||||
#import "NGCardsSaxHandler.h"
|
||||
|
||||
@@ -19,6 +19,10 @@
|
||||
02111-1307, USA.
|
||||
*/
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSEnumerator.h>
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
#import "NSArray+NGCards.h"
|
||||
#import "NSString+NGCards.h"
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
#import <NGExtensions/NGBase64Coding.h>
|
||||
#import <NGExtensions/NSObject+Logs.h>
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#ifndef NGVLIST_H
|
||||
#define NGVLIST_H
|
||||
|
||||
#import "CardGroup.h"
|
||||
|
||||
#import "NGVCard.h"
|
||||
|
||||
|
||||
@@ -21,7 +21,9 @@
|
||||
*/
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSEnumerator.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
|
||||
#import "NGVCardReference.h"
|
||||
|
||||
|
||||
@@ -20,6 +20,8 @@
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#import <Foundation/NSEnumerator.h>
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
#import "CardElement.h"
|
||||
#import "NSString+NGCards.h"
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#warning this module should be cleaned up and \
|
||||
merged with NSCalendarDate+NGCards
|
||||
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSTimeZone.h>
|
||||
|
||||
#import <NGExtensions/NSCalendarDate+misc.h>
|
||||
|
||||
@@ -23,8 +23,10 @@
|
||||
#ifndef NSDATE_NGCARDS_H
|
||||
#define NSDATE_NGCARDS_H
|
||||
|
||||
#import <Foundation/NSDate.h>
|
||||
#import <Foundation/NSCalendarDate.h>
|
||||
|
||||
#import "CardElement.h"
|
||||
|
||||
@interface NSDate (NGCardsExtensions)
|
||||
|
||||
|
||||
@@ -20,7 +20,9 @@
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
#import "CardElement.h"
|
||||
|
||||
#import "NSCalendarDate+NGCards.h"
|
||||
#import "NSString+NGCards.h"
|
||||
|
||||
@@ -20,6 +20,8 @@
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
#import "NSArray+NGCards.h"
|
||||
#import "NSString+NGCards.h"
|
||||
@@ -51,10 +53,10 @@
|
||||
[aString appendString: @","];
|
||||
subValue = [self objectAtIndex: count];
|
||||
|
||||
/* We MUST quote attribute values that have a ":" in them
|
||||
/* We MUST quote attribute values that have a ":" or "," in them
|
||||
and that not already quoted */
|
||||
if (asAttributes && [subValue length] > 2
|
||||
&& [subValue rangeOfString: @":"].length
|
||||
&& ([subValue rangeOfString: @":"].length || [subValue rangeOfString: @","].length)
|
||||
&& [subValue characterAtIndex: 0] != '"'
|
||||
&& ![subValue hasSuffix: @"\""])
|
||||
subValue = [NSString stringWithFormat: @"\"%@\"", subValue];
|
||||
|
||||
@@ -23,10 +23,13 @@
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSCalendarDate.h>
|
||||
#import <Foundation/NSEnumerator.h>
|
||||
#import <Foundation/NSRange.h>
|
||||
#import <Foundation/NSTimeZone.h>
|
||||
|
||||
#import <NGExtensions/NSObject+Logs.h>
|
||||
|
||||
#import <ctype.h>
|
||||
|
||||
#import "NSString+NGCards.h"
|
||||
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML IANA 2016h//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Abidjan
|
||||
X-LIC-LOCATION:Africa/Abidjan
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Abidjan
|
||||
X-LIC-LOCATION:Africa/Abidjan
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,14 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML IANA 2016h//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Accra
|
||||
X-LIC-LOCATION:Africa/Accra
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Accra
|
||||
X-LIC-LOCATION:Africa/Accra
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,14 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML IANA 2016h//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Addis_Ababa
|
||||
X-LIC-LOCATION:Africa/Addis_Ababa
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0300
|
||||
TZOFFSETTO:+0300
|
||||
TZNAME:EAT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Addis_Ababa
|
||||
X-LIC-LOCATION:Africa/Addis_Ababa
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0300
|
||||
TZOFFSETTO:+0300
|
||||
TZNAME:EAT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,14 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML IANA 2016h//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Algiers
|
||||
X-LIC-LOCATION:Africa/Algiers
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:CET
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Algiers
|
||||
X-LIC-LOCATION:Africa/Algiers
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:CET
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,14 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML IANA 2016h//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Asmara
|
||||
X-LIC-LOCATION:Africa/Asmara
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0300
|
||||
TZOFFSETTO:+0300
|
||||
TZNAME:EAT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Asmara
|
||||
X-LIC-LOCATION:Africa/Asmara
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0300
|
||||
TZOFFSETTO:+0300
|
||||
TZNAME:EAT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,14 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML IANA 2016h//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Bamako
|
||||
X-LIC-LOCATION:Africa/Bamako
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Bamako
|
||||
X-LIC-LOCATION:Africa/Bamako
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,14 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML IANA 2016h//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Bangui
|
||||
X-LIC-LOCATION:Africa/Bangui
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:WAT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Bangui
|
||||
X-LIC-LOCATION:Africa/Bangui
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:WAT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,14 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML IANA 2016h//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Banjul
|
||||
X-LIC-LOCATION:Africa/Banjul
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Banjul
|
||||
X-LIC-LOCATION:Africa/Banjul
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,14 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML IANA 2016h//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Bissau
|
||||
X-LIC-LOCATION:Africa/Bissau
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Bissau
|
||||
X-LIC-LOCATION:Africa/Bissau
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,14 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML IANA 2016h//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Blantyre
|
||||
X-LIC-LOCATION:Africa/Blantyre
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0200
|
||||
TZOFFSETTO:+0200
|
||||
TZNAME:CAT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Blantyre
|
||||
X-LIC-LOCATION:Africa/Blantyre
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0200
|
||||
TZOFFSETTO:+0200
|
||||
TZNAME:CAT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,14 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML IANA 2016h//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Brazzaville
|
||||
X-LIC-LOCATION:Africa/Brazzaville
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:WAT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Brazzaville
|
||||
X-LIC-LOCATION:Africa/Brazzaville
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:WAT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,14 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML IANA 2016h//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Bujumbura
|
||||
X-LIC-LOCATION:Africa/Bujumbura
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0200
|
||||
TZOFFSETTO:+0200
|
||||
TZNAME:CAT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Bujumbura
|
||||
X-LIC-LOCATION:Africa/Bujumbura
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0200
|
||||
TZOFFSETTO:+0200
|
||||
TZNAME:CAT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,14 +1,22 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML IANA 2016h//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Cairo
|
||||
X-LIC-LOCATION:Africa/Cairo
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0200
|
||||
TZOFFSETTO:+0200
|
||||
TZNAME:EET
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Cairo
|
||||
X-LIC-LOCATION:Africa/Cairo
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0300
|
||||
TZOFFSETTO:+0200
|
||||
TZNAME:EET
|
||||
DTSTART:19700924T235959
|
||||
RRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1TH
|
||||
END:STANDARD
|
||||
BEGIN:DAYLIGHT
|
||||
TZOFFSETFROM:+0300
|
||||
TZOFFSETTO:+0300
|
||||
TZNAME:EEST
|
||||
DTSTART:19700424T010000
|
||||
RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=-1FR
|
||||
END:DAYLIGHT
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,22 +1,22 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML IANA 2016h//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Casablanca
|
||||
X-LIC-LOCATION:Africa/Casablanca
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:WET
|
||||
DTSTART:19701025T030000
|
||||
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
|
||||
END:STANDARD
|
||||
BEGIN:DAYLIGHT
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:WEST
|
||||
DTSTART:19700329T020000
|
||||
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
|
||||
END:DAYLIGHT
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Casablanca
|
||||
X-LIC-LOCATION:Africa/Casablanca
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:WET
|
||||
DTSTART:19701025T030000
|
||||
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
|
||||
END:STANDARD
|
||||
BEGIN:DAYLIGHT
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:WEST
|
||||
DTSTART:19700329T020000
|
||||
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
|
||||
END:DAYLIGHT
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,22 +1,22 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML IANA 2016h//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Ceuta
|
||||
X-LIC-LOCATION:Africa/Ceuta
|
||||
BEGIN:DAYLIGHT
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0200
|
||||
TZNAME:CEST
|
||||
DTSTART:19700329T020000
|
||||
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
|
||||
END:DAYLIGHT
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0200
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:CET
|
||||
DTSTART:19701025T030000
|
||||
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Ceuta
|
||||
X-LIC-LOCATION:Africa/Ceuta
|
||||
BEGIN:DAYLIGHT
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0200
|
||||
TZNAME:CEST
|
||||
DTSTART:19700329T020000
|
||||
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
|
||||
END:DAYLIGHT
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0200
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:CET
|
||||
DTSTART:19701025T030000
|
||||
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,14 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML IANA 2016h//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Conakry
|
||||
X-LIC-LOCATION:Africa/Conakry
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Conakry
|
||||
X-LIC-LOCATION:Africa/Conakry
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,14 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML IANA 2016h//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Dakar
|
||||
X-LIC-LOCATION:Africa/Dakar
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Dakar
|
||||
X-LIC-LOCATION:Africa/Dakar
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,14 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML IANA 2016h//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Dar_es_Salaam
|
||||
X-LIC-LOCATION:Africa/Dar_es_Salaam
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0300
|
||||
TZOFFSETTO:+0300
|
||||
TZNAME:EAT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Dar_es_Salaam
|
||||
X-LIC-LOCATION:Africa/Dar_es_Salaam
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0300
|
||||
TZOFFSETTO:+0300
|
||||
TZNAME:EAT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,14 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML IANA 2016h//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Djibouti
|
||||
X-LIC-LOCATION:Africa/Djibouti
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0300
|
||||
TZOFFSETTO:+0300
|
||||
TZNAME:EAT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Djibouti
|
||||
X-LIC-LOCATION:Africa/Djibouti
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0300
|
||||
TZOFFSETTO:+0300
|
||||
TZNAME:EAT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,14 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML IANA 2016h//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Douala
|
||||
X-LIC-LOCATION:Africa/Douala
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:WAT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Douala
|
||||
X-LIC-LOCATION:Africa/Douala
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:WAT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,22 +1,22 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML IANA 2016h//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/El_Aaiun
|
||||
X-LIC-LOCATION:Africa/El_Aaiun
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:WET
|
||||
DTSTART:19701025T030000
|
||||
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
|
||||
END:STANDARD
|
||||
BEGIN:DAYLIGHT
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:WEST
|
||||
DTSTART:19700329T020000
|
||||
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
|
||||
END:DAYLIGHT
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/El_Aaiun
|
||||
X-LIC-LOCATION:Africa/El_Aaiun
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:WET
|
||||
DTSTART:19701025T030000
|
||||
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
|
||||
END:STANDARD
|
||||
BEGIN:DAYLIGHT
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:WEST
|
||||
DTSTART:19700329T020000
|
||||
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
|
||||
END:DAYLIGHT
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,14 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML IANA 2016h//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Freetown
|
||||
X-LIC-LOCATION:Africa/Freetown
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Freetown
|
||||
X-LIC-LOCATION:Africa/Freetown
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,14 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML IANA 2016h//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Gaborone
|
||||
X-LIC-LOCATION:Africa/Gaborone
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0200
|
||||
TZOFFSETTO:+0200
|
||||
TZNAME:CAT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Gaborone
|
||||
X-LIC-LOCATION:Africa/Gaborone
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0200
|
||||
TZOFFSETTO:+0200
|
||||
TZNAME:CAT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
Loaded 100 of 2053 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user