Compare commits
892
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
42fa0a273e | ||
|
|
07872d753c | ||
|
|
0305d00d50 | ||
|
|
3b65b6e2cf | ||
|
|
43a68979ac | ||
|
|
4cd2ad0337 | ||
|
|
ca57ac4677 | ||
|
|
0063320d70 | ||
|
|
f7462fd5ee | ||
|
|
893fdda43b | ||
|
|
62df4fffa3 | ||
|
|
cde6fe520c | ||
|
|
d548cea518 | ||
|
|
278b65d89c | ||
|
|
46261d61ff | ||
|
|
d2952f1c91 | ||
|
|
f10b3e8be0 | ||
|
|
7837343383 | ||
|
|
22acfc943c | ||
|
|
daad202e50 | ||
|
|
a188b5132a | ||
|
|
56b92307b5 | ||
|
|
a479356fbf | ||
|
|
8166f48d10 | ||
|
|
a9eecd76b3 | ||
|
|
f39e4e880e | ||
|
|
399dad7d23 | ||
|
|
1088b027a7 | ||
|
|
baa9057fd6 | ||
|
|
90762689cf | ||
|
|
4c979e3f14 | ||
|
|
d91d5b7a2d | ||
|
|
617fcbbf19 | ||
|
|
b3741e65c8 | ||
|
|
81df371e9f | ||
|
|
c4c1e87612 | ||
|
|
4f9d514c2f | ||
|
|
7a0908c34a | ||
|
|
ced9369623 | ||
|
|
aba24c05fa | ||
|
|
0db668a0ea | ||
|
|
d53f477c8d | ||
|
|
0b243987e0 | ||
|
|
6bf26d45b9 | ||
|
|
64b72969d3 | ||
|
|
727c7ed89f | ||
|
|
3484cd570c | ||
|
|
b9b8983343 | ||
|
|
9c1f36d615 | ||
|
|
ff43324644 | ||
|
|
ef32b0c277 | ||
|
|
da3c68c708 | ||
|
|
3d7071d018 | ||
|
|
0d6c6bb425 | ||
|
|
60819d8233 | ||
|
|
daadc6df69 | ||
|
|
848201850a | ||
|
|
6649d7101e | ||
|
|
3a96b3b315 | ||
|
|
cbcc942e73 | ||
|
|
5433cf19da | ||
|
|
26bfbcf083 | ||
|
|
914f37c3b5 | ||
|
|
d4a4e49521 | ||
|
|
a0e7e9d24e | ||
|
|
52a3508479 | ||
|
|
3a33b465c8 | ||
|
|
559bdf15a8 | ||
|
|
1b13d7b862 | ||
|
|
3fe20b4b2f | ||
|
|
62813cd4b8 | ||
|
|
f370ce71c6 | ||
|
|
b450f999f0 | ||
|
|
6270a11d73 | ||
|
|
2ad709e4d1 | ||
|
|
4c87898167 | ||
|
|
0329133601 | ||
|
|
b2f3585739 | ||
|
|
9b7b637866 | ||
|
|
3711e7d123 | ||
|
|
1ff24dddfc | ||
|
|
eee1cb19d0 | ||
|
|
26c2fd3d28 | ||
|
|
73d663fe85 | ||
|
|
01b0b5f783 | ||
|
|
8cb6061b55 | ||
|
|
b5fa808758 | ||
|
|
c254ae327b | ||
|
|
53b1cc5477 | ||
|
|
d992ab921f | ||
|
|
c79e3790c5 | ||
|
|
dc70e7e691 | ||
|
|
5f4acda249 | ||
|
|
ebd4058b11 | ||
|
|
4229918693 | ||
|
|
7a628bac12 | ||
|
|
eb0917f42f | ||
|
|
7d70538517 | ||
|
|
e948b45899 | ||
|
|
892db449e5 | ||
|
|
7d1549250d | ||
|
|
cdae46c7c1 | ||
|
|
d74755fb63 | ||
|
|
f3aa717570 | ||
|
|
feca02e740 | ||
|
|
bde322b0b4 | ||
|
|
56a9f5f215 | ||
|
|
fce60e1c25 | ||
|
|
0d817c8e18 | ||
|
|
700a1aa706 | ||
|
|
ef84985025 | ||
|
|
827e9cfca6 | ||
|
|
6d9c5e4542 | ||
|
|
cad99d476d | ||
|
|
eaf0a19002 | ||
|
|
a912fe0c5e | ||
|
|
73cc81c71f | ||
|
|
5796992b56 | ||
|
|
be12528a0e | ||
|
|
0fc3791f37 | ||
|
|
3badf13c22 | ||
|
|
665367f8f8 | ||
|
|
340c110442 | ||
|
|
81d3d3bc5b | ||
|
|
686b32d78b | ||
|
|
6b322e6b75 | ||
|
|
29d004c4a4 | ||
|
|
1a8b82d75d | ||
|
|
ca87ac05a2 | ||
|
|
0c33bc58b6 | ||
|
|
6319007631 | ||
|
|
156a83046b | ||
|
|
84e170a601 | ||
|
|
5ada0024af | ||
|
|
7daa6728a1 | ||
|
|
1cbced4965 | ||
|
|
323bc50f10 | ||
|
|
8c81d55061 | ||
|
|
36fb9c138e | ||
|
|
81aee49555 | ||
|
|
ed4c2b3dca | ||
|
|
677df619fd | ||
|
|
40cd481ec0 | ||
|
|
cfcc4922ac | ||
|
|
1cf85475d7 | ||
|
|
83ce0f01b4 | ||
|
|
d1dcb820bd | ||
|
|
e098b3d050 | ||
|
|
18f7bc7e69 | ||
|
|
1a1afb7b95 | ||
|
|
44f7fdc50a | ||
|
|
3de6e0fc5a | ||
|
|
928b18890c | ||
|
|
828fed54a0 | ||
|
|
1b88d17e01 | ||
|
|
3d54bfb882 | ||
|
|
96914b39fb | ||
|
|
ec11b8abb4 | ||
|
|
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
|
||||
@@ -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>
|
||||
@@ -83,7 +87,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
- (NSString *) activeSyncRepresentationInContext: (WOContext *) context
|
||||
{
|
||||
NSArray *emails, *addresses, *categories, *elements;
|
||||
CardElement *n, *homeAdr, *workAdr;
|
||||
NSMutableArray *other_addresses;
|
||||
CardElement *n, *homeAdr, *workAdr, *otherAdr;
|
||||
NSMutableString *s, *a;
|
||||
NSString *url;
|
||||
id o;
|
||||
@@ -186,7 +191,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
if ((o = [homeAdr flattenedValueAtIndex: 1 forKey: @""]) && [o length])
|
||||
[a appendFormat: @"\n%@", [o activeSyncRepresentationInContext: context]];
|
||||
|
||||
[s appendFormat: @"<HomeStreet xmlns=\"Contacts:\">%@</HomeStreet>", [a activeSyncRepresentationInContext: context]];
|
||||
[s appendFormat: @"<HomeStreet xmlns=\"Contacts:\">%@</HomeStreet>", a];
|
||||
|
||||
if ((o = [homeAdr flattenedValueAtIndex: 3 forKey: @""]))
|
||||
[s appendFormat: @"<HomeCity xmlns=\"Contacts:\">%@</HomeCity>", [o activeSyncRepresentationInContext: context]];
|
||||
@@ -217,7 +222,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
if ((o = [workAdr flattenedValueAtIndex: 1 forKey: @""]) && [o length])
|
||||
[a appendFormat: @"\n%@", [o activeSyncRepresentationInContext: context]];
|
||||
|
||||
[s appendFormat: @"<BusinessStreet xmlns=\"Contacts:\">%@</BusinessStreet>", [a activeSyncRepresentationInContext: context]];
|
||||
[s appendFormat: @"<BusinessStreet xmlns=\"Contacts:\">%@</BusinessStreet>", a];
|
||||
|
||||
if ((o = [workAdr flattenedValueAtIndex: 3 forKey: @""]))
|
||||
[s appendFormat: @"<BusinessCity xmlns=\"Contacts:\">%@</BusinessCity>", [o activeSyncRepresentationInContext: context]];
|
||||
@@ -232,6 +237,39 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
[s appendFormat: @"<BusinessCountry xmlns=\"Contacts:\">%@</BusinessCountry>", [o activeSyncRepresentationInContext: context]];
|
||||
}
|
||||
|
||||
|
||||
// Other Address
|
||||
|
||||
other_addresses = [[self childrenWithTag: @"adr"] mutableCopy];
|
||||
[other_addresses removeObjectsInArray: [self childrenWithTag: @"adr" andAttribute: @"type" havingValue: @"work"]];
|
||||
[other_addresses removeObjectsInArray: [self childrenWithTag: @"adr" andAttribute: @"type" havingValue: @"home"]];
|
||||
|
||||
if ([other_addresses count])
|
||||
{
|
||||
otherAdr = [other_addresses objectAtIndex: 0];
|
||||
a = [NSMutableString string];
|
||||
|
||||
if ((o = [otherAdr flattenedValueAtIndex: 2 forKey: @""]))
|
||||
[a appendString: [o activeSyncRepresentationInContext: context]];
|
||||
|
||||
if ((o = [otherAdr flattenedValueAtIndex: 1 forKey: @""]) && [o length])
|
||||
[a appendFormat: @"\n%@", [o activeSyncRepresentationInContext: context]];
|
||||
|
||||
[s appendFormat: @"<OtherStreet xmlns=\"Contacts:\">%@</OtherStreet>", a];
|
||||
|
||||
if ((o = [otherAdr flattenedValueAtIndex: 3 forKey: @""]))
|
||||
[s appendFormat: @"<OtherCity xmlns=\"Contacts:\">%@</OtherCity>", [o activeSyncRepresentationInContext: context]];
|
||||
|
||||
if ((o = [otherAdr flattenedValueAtIndex: 4 forKey: @""]))
|
||||
[s appendFormat: @"<OtherState xmlns=\"Contacts:\">%@</OtherState>", [o activeSyncRepresentationInContext: context]];
|
||||
|
||||
if ((o = [otherAdr flattenedValueAtIndex: 5 forKey: @""]))
|
||||
[s appendFormat: @"<OtherPostalCode xmlns=\"Contacts:\">%@</OtherPostalCode>", [o activeSyncRepresentationInContext: context]];
|
||||
|
||||
if ((o = [otherAdr flattenedValueAtIndex: 6 forKey: @""]))
|
||||
[s appendFormat: @"<OtherCountry xmlns=\"Contacts:\">%@</OtherCountry>", [o activeSyncRepresentationInContext: context]];
|
||||
}
|
||||
|
||||
// Other, less important fields
|
||||
if ((o = [self birthday]))
|
||||
{
|
||||
@@ -267,7 +305,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
inContext: (WOContext *) context
|
||||
{
|
||||
CardElement *element;
|
||||
NSMutableArray *addressLines;
|
||||
NSMutableArray *addressLines, *other_addresses;
|
||||
id o;
|
||||
|
||||
// Contact's note
|
||||
@@ -398,6 +436,63 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
atIndex: 6 forKey: @""];
|
||||
}
|
||||
|
||||
// OtherCountry
|
||||
//
|
||||
|
||||
other_addresses = [[self childrenWithTag: @"adr"] mutableCopy];
|
||||
[other_addresses removeObjectsInArray: [self childrenWithTag: @"adr" andAttribute: @"type" havingValue: @"work"]];
|
||||
[other_addresses removeObjectsInArray: [self childrenWithTag: @"adr" andAttribute: @"type" havingValue: @"home"]];
|
||||
|
||||
if ([other_addresses count])
|
||||
element = [other_addresses objectAtIndex: 0];
|
||||
else
|
||||
{
|
||||
element = [CardElement elementWithTag: @"adr"];
|
||||
[self addChild: element];
|
||||
}
|
||||
|
||||
if ((o = [theValues objectForKey: @"OtherStreet"]) || ![self _isGhosted: @"OtherStreet" inContext: context])
|
||||
{
|
||||
addressLines = [NSMutableArray arrayWithArray: [o componentsSeparatedByString: @"\n"]];
|
||||
|
||||
[element setSingleValue: @""
|
||||
atIndex: 1 forKey: @""];
|
||||
[element setSingleValue: [addressLines count] ? [addressLines objectAtIndex: 0] : @""
|
||||
atIndex: 2 forKey: @""];
|
||||
|
||||
// Extended address line. If there are more then 2 address lines we add them to the extended address line.
|
||||
if ([addressLines count] > 1)
|
||||
{
|
||||
[addressLines removeObjectAtIndex: 0];
|
||||
[element setSingleValue: [addressLines componentsJoinedByString: @" "]
|
||||
atIndex: 1 forKey: @""];
|
||||
}
|
||||
}
|
||||
|
||||
if ((o = [theValues objectForKey: @"OtherCity"]) || ![self _isGhosted: @"OtherCity" inContext: context])
|
||||
{
|
||||
[element setSingleValue: [theValues objectForKey: @"OtherCity"]
|
||||
atIndex: 3 forKey: @""];
|
||||
}
|
||||
|
||||
if ((o = [theValues objectForKey: @"OtherState"]) || ![self _isGhosted: @"OtherState" inContext: context])
|
||||
{
|
||||
[element setSingleValue: [theValues objectForKey: @"OtherState"]
|
||||
atIndex: 4 forKey: @""];
|
||||
}
|
||||
|
||||
if ((o = [theValues objectForKey: @"OtherPostalCode"]) || ![self _isGhosted: @"OtherPostalCode" inContext: context])
|
||||
{
|
||||
[element setSingleValue: [theValues objectForKey: @"OtherPostalCode"]
|
||||
atIndex: 5 forKey: @""];
|
||||
}
|
||||
|
||||
if ((o = [theValues objectForKey: @"OtherCountry"]) || ![self _isGhosted: @"OtherCountry" inContext: context])
|
||||
{
|
||||
[element setSingleValue: [theValues objectForKey: @"OtherCountry"]
|
||||
atIndex: 6 forKey: @""];
|
||||
}
|
||||
|
||||
// Company's name
|
||||
if ((o = [theValues objectForKey: @"CompanyName"]))
|
||||
[self setOrg: o units: nil];
|
||||
|
||||
@@ -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,9 +62,17 @@ 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/SOGoCacheGCSObject.h>
|
||||
@@ -55,11 +80,22 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#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"
|
||||
|
||||
@@ -748,7 +785,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
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]])
|
||||
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];
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -27,10 +27,15 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
*/
|
||||
|
||||
#include "SOGoActiveSyncDispatcher.h"
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSData.h>
|
||||
#import <Foundation/NSAutoreleasePool.h>
|
||||
#import <Foundation/NSCalendarDate.h>
|
||||
#if GNUSTEP_BASE_MINOR_VERSION >= 21
|
||||
#import <Foundation/NSLocale.h>
|
||||
#endif
|
||||
#import <Foundation/NSProcessInfo.h>
|
||||
#import <Foundation/NSTimeZone.h>
|
||||
#import <Foundation/NSURL.h>
|
||||
@@ -39,13 +44,23 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import <NGObjWeb/NSException+HTTP.h>
|
||||
#import <NGObjWeb/SoPermissions.h>
|
||||
#import <NGObjWeb/SoSecurityManager.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 <NGObjWeb/WOCoreApplication.h>
|
||||
|
||||
#import <NGCards/iCalCalendar.h>
|
||||
#import <NGCards/iCalEntityObject.h>
|
||||
#import <NGCards/iCalEvent.h>
|
||||
#import <NGCards/iCalToDo.h>
|
||||
#import <NGCards/NGVCard.h>
|
||||
|
||||
#import <NGExtensions/NGBase64Coding.h>
|
||||
|
||||
#import <NGExtensions/NSCalendarDate+misc.h>
|
||||
#import <NGExtensions/NGCalendarDateRange.h>
|
||||
#import <NGExtensions/NGHashMap.h>
|
||||
@@ -62,16 +77,21 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import <NGMime/NGMimeMultipartBody.h>
|
||||
#import <NGMime/NGMimeType.h>
|
||||
#import <NGMail/NGMimeMessageParser.h>
|
||||
#import <NGMail/NGMimeMessage.h>
|
||||
#import <NGMail/NGMimeMessageGenerator.h>
|
||||
|
||||
#import <DOM/DOMElement.h>
|
||||
#import <DOM/DOMProtocols.h>
|
||||
#import <DOM/DOMSaxBuilder.h>
|
||||
|
||||
#import <EOControl/EOQualifier.h>
|
||||
|
||||
#import <SOGo/NSArray+DAV.h>
|
||||
#import <SOGo/NSDictionary+DAV.h>
|
||||
#import <SOGo/SOGoCache.h>
|
||||
#import <SOGo/SOGoCacheGCSObject.h>
|
||||
#import <SOGo/SOGoDAVAuthenticator.h>
|
||||
#import <SOGo/SOGoDomainDefaults.h>
|
||||
#import <SOGo/SOGoMailer.h>
|
||||
#import <SOGo/SOGoSystemDefaults.h>
|
||||
#import <SOGo/SOGoUser.h>
|
||||
@@ -97,11 +117,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import <Mailer/SOGoMailAccounts.h>
|
||||
#import <Mailer/SOGoMailBodyPart.h>
|
||||
#import <Mailer/SOGoMailFolder.h>
|
||||
#import <Mailer/SOGoMailObject.h>
|
||||
#import <Mailer/SOGoMailObject+Draft.h>
|
||||
#import <Mailer/SOGoSentFolder.h>
|
||||
#import <Mailer/NSString+Mail.h>
|
||||
#import <Mailer/SOGoSentFolder.h>
|
||||
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
#include "iCalEvent+ActiveSync.h"
|
||||
@@ -112,10 +134,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#include "NSData+ActiveSync.h"
|
||||
#include "NSDate+ActiveSync.h"
|
||||
#include "NSString+ActiveSync.h"
|
||||
#include "SOGoActiveSyncConstants.h"
|
||||
#include "SOGoMailObject+ActiveSync.h"
|
||||
|
||||
#import <GDLContentStore/GCSChannelManager.h>
|
||||
#import <GDLContentStore/GCSFolderManager.h>
|
||||
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
@@ -716,43 +738,53 @@ void handle_eas_terminate(int signum)
|
||||
[theResponse setContent: d];
|
||||
}
|
||||
|
||||
|
||||
- (void) _flattenFolders: (NSArray *) theFolders
|
||||
//
|
||||
//
|
||||
//
|
||||
- (void) _fixMissingParent: (NSArray *) theFolders
|
||||
into: (NSMutableArray *) theTarget
|
||||
parent: (NSDictionary *) theParent
|
||||
existingParent: (NSString *) theExistingParent
|
||||
{
|
||||
NSArray *o;
|
||||
int i;
|
||||
|
||||
[theTarget addObjectsFromArray: theFolders];
|
||||
NSString *folderPath;
|
||||
NSMutableDictionary *folder;
|
||||
int i, ii, iii;
|
||||
BOOL found;
|
||||
|
||||
for (i = 0; i < [theFolders count]; i++)
|
||||
{
|
||||
if ([theParent objectForKey: @"path"] && ![[theParent objectForKey: @"type"] isEqualToString: @"additional"])
|
||||
folder = [[theFolders objectAtIndex: i] mutableCopy];
|
||||
|
||||
if (![folder objectForKey: @"parent"] && [[[folder objectForKey: @"path"] pathComponents] count] > 2)
|
||||
{
|
||||
[[theFolders objectAtIndex: i] setObject: [theParent objectForKey: @"path"] forKey: @"parent"];
|
||||
theExistingParent = [theParent objectForKey: @"path"];
|
||||
}
|
||||
else if (theExistingParent)
|
||||
{
|
||||
[[theFolders objectAtIndex: i] setObject: theExistingParent forKey: @"parent"];
|
||||
[[theFolders objectAtIndex: i] setObject:
|
||||
[[[[theFolders objectAtIndex: i] objectForKey: @"path"] substringFromIndex: [theExistingParent length]+1]stringByReplacingOccurrencesOfString:@"/" withString:@"."]
|
||||
forKey: @"name"];
|
||||
}
|
||||
else if (![[[theFolders objectAtIndex: i] objectForKey: @"type"] isEqualToString: @"otherUsers"] &&
|
||||
![[[theFolders objectAtIndex: i] objectForKey: @"type"] isEqualToString: @"shared"])
|
||||
{
|
||||
[[theFolders objectAtIndex: i] setObject:
|
||||
[[[theFolders objectAtIndex: i] objectForKey: @"path"] stringByReplacingOccurrencesOfString:@"/" withString:@"."]
|
||||
forKey: @"name"];
|
||||
found = NO;
|
||||
folderPath = [folder objectForKey: @"path"];
|
||||
|
||||
for (ii = 0; ii < [[folderPath pathComponents] count] && !found; ii++)
|
||||
{
|
||||
folderPath = [folderPath stringByDeletingLastPathComponent];
|
||||
|
||||
for (iii = 0; iii < [theFolders count]; iii++)
|
||||
{
|
||||
if ([[[theFolders objectAtIndex: iii] objectForKey: @"path"] isEqualToString: folderPath])
|
||||
{
|
||||
[folder setObject: [[[folder objectForKey: @"displayName"] substringFromIndex:
|
||||
[[[theFolders objectAtIndex: iii] objectForKey: @"displayName"] length]+1]
|
||||
stringByReplacingString:@"/" withString:@"."] forKey: @"displayName"];
|
||||
|
||||
[folder setObject: folderPath forKey: @"parent"];
|
||||
|
||||
found = YES;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!found )
|
||||
[folder setObject: [[[folder objectForKey: @"displayName"] substringFromIndex: 1]
|
||||
stringByReplacingString:@"/" withString:@"."] forKey: @"displayName"];
|
||||
}
|
||||
|
||||
o = [[theFolders objectAtIndex: i] objectForKey: @"children"];
|
||||
|
||||
if (o)
|
||||
[self _flattenFolders: o into: theTarget parent: [theFolders objectAtIndex: i] existingParent: theExistingParent];
|
||||
[theTarget addObject: folder];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -767,8 +799,8 @@ void handle_eas_terminate(int signum)
|
||||
inResponse: (WOResponse *) theResponse
|
||||
{
|
||||
NSString *key, *cKey, *nkey, *name, *serverId, *parentId, *nameInCache, *personalFolderName, *syncKey, *folderType, *operation;
|
||||
NSMutableArray *folders, *processedFolders, *allFoldersMetadata;
|
||||
NSMutableDictionary *cachedGUIDs, *metadata;
|
||||
NSMutableArray *folders, *processedFolders, *allFoldersMetadata;
|
||||
NSDictionary *folderMetadata, *imapGUIDs;
|
||||
SOGoMailAccounts *accountsFolder;
|
||||
SOGoMailAccount *accountFolder;
|
||||
@@ -820,12 +852,12 @@ void handle_eas_terminate(int signum)
|
||||
if (first_sync)
|
||||
{
|
||||
[self _ensureFolder: (SOGoMailFolder *)[accountFolder draftsFolderInContext: context]];
|
||||
[self _ensureFolder: [accountFolder sentFolderInContext: context]];
|
||||
[self _ensureFolder: (SOGoMailFolder *)[accountFolder sentFolderInContext: context]];
|
||||
[self _ensureFolder: (SOGoMailFolder *)[accountFolder trashFolderInContext: context]];
|
||||
}
|
||||
|
||||
allFoldersMetadata = [NSMutableArray array];
|
||||
[self _flattenFolders: [accountFolder allFoldersMetadata: SOGoMailStandardListing] into: allFoldersMetadata parent: nil existingParent: nil];
|
||||
[self _fixMissingParent: [accountFolder allFoldersMetadata] into: allFoldersMetadata];
|
||||
|
||||
// Get GUIDs of folder (IMAP)
|
||||
// e.g. {folderINBOX = folder6b93c528176f1151c7260000aef6df92}
|
||||
@@ -947,6 +979,7 @@ void handle_eas_terminate(int signum)
|
||||
command_count++;
|
||||
}
|
||||
[o destroy];
|
||||
continue;
|
||||
}
|
||||
|
||||
// Remove the folder from device if it is a contact folder and we have no SOGoRole_ObjectViewer.
|
||||
@@ -973,18 +1006,15 @@ void handle_eas_terminate(int signum)
|
||||
for (i = 0; i < [allFoldersMetadata count]; i++)
|
||||
{
|
||||
folderMetadata = [allFoldersMetadata objectAtIndex: i];
|
||||
|
||||
// In v3, the "path" value does not have a '/' at the beginning
|
||||
nameInCache = [NSString stringWithFormat: @"folder%@", [folderMetadata objectForKey: @"path"]];
|
||||
|
||||
nameInCache = [NSString stringWithFormat: @"folder%@", [[folderMetadata objectForKey: @"path"] substringFromIndex: 1]];
|
||||
|
||||
// we have no guid - ignore the folder
|
||||
if (![imapGUIDs objectForKey: nameInCache])
|
||||
continue;
|
||||
|
||||
serverId = [NSString stringWithFormat: @"mail/%@", [[imapGUIDs objectForKey: nameInCache] substringFromIndex: 6]];
|
||||
|
||||
// In v3, we use "name" while in v2, it was "displayName"
|
||||
name = [folderMetadata objectForKey: @"name"];
|
||||
name = [folderMetadata objectForKey: @"displayName"];
|
||||
|
||||
// avoid duplicate folders if folder is returned by different imap namespaces
|
||||
if ([processedFolders indexOfObject: serverId] == NSNotFound)
|
||||
@@ -1005,7 +1035,7 @@ void handle_eas_terminate(int signum)
|
||||
{
|
||||
// make sure that parent of main-folders is always 0
|
||||
if (type == 12)
|
||||
parentId = [NSString stringWithFormat: @"mail/%@", [[imapGUIDs objectForKey: [NSString stringWithFormat: @"folder%@", [folderMetadata objectForKey: @"parent"]]] substringFromIndex: 6]];
|
||||
parentId = [NSString stringWithFormat: @"mail/%@", [[imapGUIDs objectForKey: [NSString stringWithFormat: @"folder%@", [[folderMetadata objectForKey: @"parent"] substringFromIndex: 1]]] substringFromIndex: 6]];
|
||||
|
||||
name = [[name pathComponents] lastObject];
|
||||
}
|
||||
@@ -1015,7 +1045,7 @@ void handle_eas_terminate(int signum)
|
||||
{
|
||||
// Search GUID to check name change in cache (diff between IMAP and cache)
|
||||
key = [NSString stringWithFormat: @"%@+%@", [context objectForKey: @"DeviceId"], [cachedGUIDs objectForKey: [imapGUIDs objectForKey: nameInCache ]]];
|
||||
nkey = [NSString stringWithFormat: @"%@+folder%@", [context objectForKey: @"DeviceId"], [folderMetadata objectForKey: @"path"]];
|
||||
nkey = [NSString stringWithFormat: @"%@+folder%@", [context objectForKey: @"DeviceId"], [[folderMetadata objectForKey: @"path"] substringFromIndex: 1] ];
|
||||
|
||||
if (![key isEqualToString: nkey])
|
||||
{
|
||||
@@ -1030,7 +1060,7 @@ void handle_eas_terminate(int signum)
|
||||
[o setTableUrl: [self folderTableURL]];
|
||||
[o reloadIfNeeded];
|
||||
|
||||
[[o properties ] setObject: [folderMetadata objectForKey: @"path"] forKey: @"displayName"];
|
||||
[[o properties ] setObject: [[folderMetadata objectForKey: @"path"] substringFromIndex: 1] forKey: @"displayName"];
|
||||
[o save];
|
||||
|
||||
command_count++;
|
||||
@@ -1050,7 +1080,7 @@ void handle_eas_terminate(int signum)
|
||||
[o setTableUrl: [self folderTableURL]];
|
||||
[o reloadIfNeeded];
|
||||
|
||||
[[o properties ] setObject: [folderMetadata objectForKey: @"path"] forKey: @"displayName"];
|
||||
[[o properties ] setObject: [[folderMetadata objectForKey: @"path"] substringFromIndex: 1] forKey: @"displayName"];
|
||||
|
||||
// clean cache content to avoid stale data
|
||||
[[o properties] removeObjectForKey: @"SyncKey"];
|
||||
@@ -1097,6 +1127,7 @@ void handle_eas_terminate(int signum)
|
||||
![currentFolder synchronize])
|
||||
{
|
||||
[folders removeObjectAtIndex: count];
|
||||
continue;
|
||||
}
|
||||
|
||||
// Remove the folder from the device if it is a contact folder and we have no SOGoRole_ObjectViewer access right.
|
||||
@@ -2651,6 +2682,7 @@ void handle_eas_terminate(int signum)
|
||||
NSData *d;
|
||||
|
||||
unsigned int startdate, enddate, increments;
|
||||
NGCalendarDateRange *r1, *r2;
|
||||
char c;
|
||||
|
||||
startDate = [[[(id)[theDocumentElement getElementsByTagName: @"StartTime"] lastObject] textValue] calendarDate];
|
||||
@@ -2697,17 +2729,13 @@ void handle_eas_terminate(int signum)
|
||||
folder = [user personalCalendarFolderInContext: context];
|
||||
freebusy = [folder fetchFreeBusyInfosFrom: startDate to: endDate];
|
||||
|
||||
|
||||
NGCalendarDateRange *r1, *r2;
|
||||
|
||||
for (j = 1; j <= increments; j++)
|
||||
for (j = 0; j < increments; j++)
|
||||
{
|
||||
c = '0';
|
||||
|
||||
r1 = [NGCalendarDateRange calendarDateRangeWithStartDate: [NSDate dateWithTimeIntervalSince1970: (startdate+j*30*60)]
|
||||
endDate: [NSDate dateWithTimeIntervalSince1970: (startdate+j*30*60 + 30)]];
|
||||
|
||||
|
||||
|
||||
for (k = 0; k < [freebusy count]; k++)
|
||||
{
|
||||
|
||||
@@ -2725,11 +2753,8 @@ void handle_eas_terminate(int signum)
|
||||
[s appendFormat: @"%c", c];
|
||||
}
|
||||
|
||||
|
||||
[s appendString: @"</MergedFreeBusy>"];
|
||||
[s appendString: @"</Availability>"];
|
||||
|
||||
|
||||
[s appendString: @"</Recipient>"];
|
||||
[s appendString: @"</Response>"];
|
||||
}
|
||||
@@ -2826,31 +2851,31 @@ void handle_eas_terminate(int signum)
|
||||
[s appendString: @"<Properties>"];
|
||||
|
||||
if ((o = [contact objectForKey: @"displayname"]))
|
||||
[s appendFormat: @"<DisplayName xmlns=\"Gal:\">%@</DisplayName>", o];
|
||||
[s appendFormat: @"<DisplayName xmlns=\"Gal:\">%@</DisplayName>", [o activeSyncRepresentationInContext: context]];
|
||||
|
||||
if ((o = [contact objectForKey: @"title"]))
|
||||
[s appendFormat: @"<Title xmlns=\"Gal:\">%@</Title>", o];
|
||||
[s appendFormat: @"<Title xmlns=\"Gal:\">%@</Title>", [o activeSyncRepresentationInContext: context]];
|
||||
|
||||
if ((o = [contact objectForKey: @"givenname"]))
|
||||
[s appendFormat: @"<FirstName xmlns=\"Gal:\">%@</FirstName>", o];
|
||||
[s appendFormat: @"<FirstName xmlns=\"Gal:\">%@</FirstName>", [o activeSyncRepresentationInContext: context]];
|
||||
|
||||
if ((o = [contact objectForKey: @"sn"]))
|
||||
[s appendFormat: @"<LastName xmlns=\"Gal:\">%@</LastName>", o];
|
||||
[s appendFormat: @"<LastName xmlns=\"Gal:\">%@</LastName>", [o activeSyncRepresentationInContext: context]];
|
||||
|
||||
if ([current_mail length] > 0)
|
||||
[s appendFormat: @"<EmailAddress xmlns=\"Gal:\">%@</EmailAddress>", current_mail];
|
||||
|
||||
if ((o = [contact objectForKey: @"telephonenumber"]))
|
||||
[s appendFormat: @"<Phone xmlns=\"Gal:\">%@</Phone>", o];
|
||||
[s appendFormat: @"<Phone xmlns=\"Gal:\">%@</Phone>", [o activeSyncRepresentationInContext: context]];
|
||||
|
||||
if ((o = [contact objectForKey: @"homephone"]))
|
||||
[s appendFormat: @"<HomePhone xmlns=\"Gal:\">%@</HomePhone>", o];
|
||||
[s appendFormat: @"<HomePhone xmlns=\"Gal:\">%@</HomePhone>", [o activeSyncRepresentationInContext: context]];
|
||||
|
||||
if ((o = [contact objectForKey: @"mobile"]))
|
||||
[s appendFormat: @"<MobilePhone xmlns=\"Gal:\">%@</MobilePhone>", o];
|
||||
[s appendFormat: @"<MobilePhone xmlns=\"Gal:\">%@</MobilePhone>", [o activeSyncRepresentationInContext: context]];
|
||||
|
||||
if ((o = [contact objectForKey: @"o"]))
|
||||
[s appendFormat: @"<Company xmlns=\"Gal:\">%@</Company>", o];
|
||||
[s appendFormat: @"<Company xmlns=\"Gal:\">%@</Company>", [o activeSyncRepresentationInContext: context]];
|
||||
|
||||
[s appendString: @"</Properties>"];
|
||||
[s appendString: @"</Result>"];
|
||||
@@ -3167,6 +3192,28 @@ void handle_eas_terminate(int signum)
|
||||
return nil;
|
||||
}
|
||||
|
||||
//
|
||||
// See https://msdn.microsoft.com/en-us/library/ee218647(v=exchg.80).aspx
|
||||
// for valid status codes.
|
||||
//
|
||||
- (NSData *) _sendMailErrorResponseWithStatus: (int) status
|
||||
{
|
||||
NSMutableString *s;
|
||||
NSData *d;
|
||||
|
||||
s = [NSMutableString string];
|
||||
|
||||
[s appendString: @"<?xml version=\"1.0\" encoding=\"utf-8\"?>"];
|
||||
[s appendString: @"<!DOCTYPE ActiveSync PUBLIC \"-//MICROSOFT//DTD ActiveSync//EN\" \"http://www.microsoft.com/\">"];
|
||||
[s appendString: @"<SendMail xmlns=\"ComposeMail:\">"];
|
||||
[s appendFormat: @"<Status>%d</Status>", status];
|
||||
[s appendString: @"</SendMail>"];
|
||||
|
||||
d = [[s dataUsingEncoding: NSUTF8StringEncoding] xml2wbxml];
|
||||
|
||||
return d;
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
@@ -3296,20 +3343,7 @@ void handle_eas_terminate(int signum)
|
||||
{
|
||||
if ([[context objectForKey: @"ASProtocolVersion"] floatValue] >= 14.0)
|
||||
{
|
||||
NSMutableString *s;
|
||||
NSData *d;
|
||||
|
||||
s = [NSMutableString string];
|
||||
|
||||
[s appendString: @"<?xml version=\"1.0\" encoding=\"utf-8\"?>"];
|
||||
[s appendString: @"<!DOCTYPE ActiveSync PUBLIC \"-//MICROSOFT//DTD ActiveSync//EN\" \"http://www.microsoft.com/\">"];
|
||||
[s appendString: @"<SendMail xmlns=\"ComposeMail:\">"];
|
||||
[s appendString: @"<Status>120</Status>"];
|
||||
[s appendString: @"</SendMail>"];
|
||||
|
||||
d = [[s dataUsingEncoding: NSUTF8StringEncoding] xml2wbxml];
|
||||
|
||||
[theResponse setContent: d];
|
||||
[theResponse setContent: [self _sendMailErrorResponseWithStatus: 120]];
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -3993,23 +4027,32 @@ void handle_eas_terminate(int signum)
|
||||
}
|
||||
|
||||
xml = [NSString stringWithFormat: @"<?xml version=\"1.0\"?><!DOCTYPE ActiveSync PUBLIC \"-//MICROSOFT//DTD ActiveSync//EN\" \"http://www.microsoft.com/\"><%@ xmlns=\"ComposeMail:\"><SaveInSentItems/><MIME>%@</MIME></%@>", cmdName, [s stringByEncodingBase64], cmdName];
|
||||
|
||||
|
||||
|
||||
d = [xml dataUsingEncoding: NSASCIIStringEncoding];
|
||||
}
|
||||
else
|
||||
{
|
||||
d = [[theRequest content] wbxml2xml];
|
||||
// Handle empty Ping request, no need to try decoding the WBXML blob here
|
||||
if ([[theRequest content] length])
|
||||
d = [[theRequest content] wbxml2xml];
|
||||
else
|
||||
d = nil;
|
||||
}
|
||||
|
||||
documentElement = nil;
|
||||
|
||||
if (!d)
|
||||
{
|
||||
// If we got no data in the SendMail request, that means SOPE rejected it because of the WOMaxUploadSize.
|
||||
// We generate here the proper failed response for SendMail
|
||||
if ([cmdName caseInsensitiveCompare: @"SendMail"] == NSOrderedSame)
|
||||
{
|
||||
[theResponse setHeader: @"application/vnd.ms-sync.wbxml" forKey: @"Content-Type"];
|
||||
[theResponse setContent: [self _sendMailErrorResponseWithStatus: 122]];
|
||||
goto return_response;
|
||||
}
|
||||
// We check if it's a Ping command with no body.
|
||||
// See http://msdn.microsoft.com/en-us/library/ee200913(v=exchg.80).aspx for details
|
||||
if ([cmdName caseInsensitiveCompare: @"Ping"] != NSOrderedSame && [cmdName caseInsensitiveCompare: @"GetAttachment"] != NSOrderedSame && [cmdName caseInsensitiveCompare: @"Sync"] != NSOrderedSame)
|
||||
else if ([cmdName caseInsensitiveCompare: @"Ping"] != NSOrderedSame && [cmdName caseInsensitiveCompare: @"GetAttachment"] != NSOrderedSame && [cmdName caseInsensitiveCompare: @"Sync"] != NSOrderedSame)
|
||||
{
|
||||
RELEASE(context);
|
||||
RELEASE(pool);
|
||||
@@ -4047,6 +4090,7 @@ void handle_eas_terminate(int signum)
|
||||
|
||||
[self performSelector: aSelector withObject: documentElement withObject: theResponse];
|
||||
|
||||
return_response:
|
||||
[theResponse setHeader: @"14.1" forKey: @"MS-Server-ActiveSync"];
|
||||
[theResponse setHeader: @"Sync,SendMail,SmartForward,SmartReply,GetAttachment,GetHierarchy,CreateCollection,DeleteCollection,MoveCollection,FolderSync,FolderCreate,FolderDelete,FolderUpdate,MoveItems,GetItemEstimate,MeetingResponse,Search,Settings,Ping,ItemOperations,ResolveRecipients,ValidateCert" forKey: @"MS-ASProtocolCommands"];
|
||||
[theResponse setHeader: @"2.5,12.0,12.1,14.0,14.1" forKey: @"MS-ASProtocolVersions"];
|
||||
@@ -4108,9 +4152,6 @@ void handle_eas_terminate(int signum)
|
||||
NSString *tableName, *query;
|
||||
GCSSpecialQueries *queries;
|
||||
|
||||
if ([GCSFolderManager singleStoreMode])
|
||||
return;
|
||||
|
||||
[self folderTableURL];
|
||||
|
||||
cm = [GCSChannelManager defaultChannelManager];
|
||||
|
||||
@@ -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;
|
||||
@@ -163,7 +163,7 @@ struct GlobalObjectId {
|
||||
const char *bytes;
|
||||
|
||||
uid = [event uid];
|
||||
uidAsASCII = [uid decodeFromHexidecimal];
|
||||
uidAsASCII = [uid dataUsingEncoding: NSASCIIStringEncoding];
|
||||
newGlobalId = (struct GlobalObjectId*)calloc(sizeof(uint8_t), sizeof(struct GlobalObjectId) + 0x0c + [uidAsASCII length]);
|
||||
|
||||
prefix = @"040000008200e00074c5b7101a82e008";
|
||||
@@ -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]];
|
||||
|
||||
@@ -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,12 +30,18 @@ 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>
|
||||
#import <NGCards/NSCalendarDate+NGCards.h>
|
||||
|
||||
#include "NSDate+ActiveSync.h"
|
||||
|
||||
@implementation iCalAlarm (ActiveSync)
|
||||
|
||||
@@ -53,9 +59,16 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
nextAlarmDate = [self nextAlarmDate];
|
||||
delta = (int)(([[(iCalEvent *)parent startDate] timeIntervalSince1970] - [nextAlarmDate timeIntervalSince1970])/60);
|
||||
|
||||
// don't send negative reminder - not supported
|
||||
if (delta > 0)
|
||||
[s appendFormat: @"<Reminder xmlns=\"Calendar:\">%d</Reminder>", (int)delta];
|
||||
if ([parent isKindOfClass: [iCalEvent class]])
|
||||
{
|
||||
// don't send negative reminder - not supported
|
||||
if (delta > 0)
|
||||
[s appendFormat: @"<Reminder xmlns=\"Calendar:\">%d</Reminder>", (int)delta];
|
||||
}
|
||||
else
|
||||
{
|
||||
[s appendFormat: @"<ReminderTime xmlns=\"Task:\">%@</ReminderTime>", [nextAlarmDate activeSyncRepresentationInContext: context]];
|
||||
}
|
||||
}
|
||||
|
||||
return s;
|
||||
@@ -67,37 +80,47 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
iCalTrigger *trigger;
|
||||
id o;
|
||||
|
||||
o = [theValues objectForKey: @"Reminder"];
|
||||
|
||||
// Outlook: if reminder is set to 0 minutes before start save it as 1 minute since -> 0 minutes in not accepted by SOGo
|
||||
if ([o isEqualToString: @"0"])
|
||||
o = @"1";
|
||||
|
||||
trigger = [iCalTrigger elementWithTag: @"TRIGGER"];
|
||||
[trigger setValueType: @"DURATION"];
|
||||
[self setTrigger: trigger];
|
||||
[self setAction: @"DISPLAY"];
|
||||
|
||||
// SOGo web ui only supports 1w but not 2w (custom reminder only supports min/hours/days)
|
||||
// 1week = -P1W
|
||||
// 2weeks > -PxD
|
||||
// xdays > -PxD
|
||||
// xhours -> -PTxH
|
||||
// xmin -> -PTxM
|
||||
if ([o intValue] == 10080)
|
||||
[trigger setSingleValue: [NSString stringWithFormat: @"-P1W" ] forKey: @""];
|
||||
else
|
||||
if ((o = [theValues objectForKey: @"Reminder"]))
|
||||
{
|
||||
if (([o intValue] % 1440) == 0)
|
||||
[trigger setSingleValue: [NSString stringWithFormat: @"-P%dD", ([o intValue] / 1440)] forKey: @""];
|
||||
// Outlook: if reminder is set to 0 minutes before starttime, save it as 1 minute since -> 0 minutes in not accepted by SOGo
|
||||
if ([o isEqualToString: @"0"])
|
||||
o = @"1";
|
||||
|
||||
trigger = [iCalTrigger elementWithTag: @"TRIGGER"];
|
||||
[trigger setValueType: @"DURATION"];
|
||||
[self setTrigger: trigger];
|
||||
[self setAction: @"DISPLAY"];
|
||||
|
||||
// SOGo web ui only supports 1w but not 2w (custom reminder only supports min/hours/days)
|
||||
// 1week = -P1W
|
||||
// 2weeks > -PxD
|
||||
// xdays > -PxD
|
||||
// xhours -> -PTxH
|
||||
// xmin -> -PTxM
|
||||
if ([o intValue] == 10080)
|
||||
[trigger setSingleValue: [NSString stringWithFormat: @"-P1W" ] forKey: @""];
|
||||
else
|
||||
{
|
||||
if (([o intValue] % 60) == 0)
|
||||
[trigger setSingleValue: [NSString stringWithFormat: @"-PT%dH", ([o intValue] / 60)] forKey: @""];
|
||||
if (([o intValue] % 1440) == 0)
|
||||
[trigger setSingleValue: [NSString stringWithFormat: @"-P%dD", ([o intValue] / 1440)] forKey: @""];
|
||||
else
|
||||
[trigger setSingleValue: [NSString stringWithFormat: @"-PT%@M", o] forKey: @""];
|
||||
{
|
||||
if (([o intValue] % 60) == 0)
|
||||
[trigger setSingleValue: [NSString stringWithFormat: @"-PT%dH", ([o intValue] / 60)] forKey: @""];
|
||||
else
|
||||
[trigger setSingleValue: [NSString stringWithFormat: @"-PT%@M", o] forKey: @""];
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ((o = [theValues objectForKey: @"ReminderTime"]))
|
||||
{
|
||||
o = [o calendarDate];
|
||||
trigger = [iCalTrigger elementWithTag: @"TRIGGER"];
|
||||
[trigger setValueType: @"DATE-TIME"];
|
||||
[trigger setSingleValue: [NSString stringWithFormat: @"%@Z", [o iCalFormattedDateTimeString]] forKey: @""];
|
||||
[self setTrigger: trigger];
|
||||
[self setAction: @"DISPLAY"];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -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>
|
||||
@@ -602,7 +609,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
}
|
||||
|
||||
// Recurrence
|
||||
if ((o = [theValues objectForKey: @"Recurrence"]))
|
||||
if ((o = [theValues objectForKey: @"Recurrence"]) && [o isKindOfClass: [NSDictionary class]])
|
||||
{
|
||||
iCalRecurrenceRule *rule;
|
||||
|
||||
@@ -884,6 +891,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
[self setAttendees: attendees];
|
||||
}
|
||||
}
|
||||
|
||||
[self setLastModified: [NSCalendarDate calendarDate]];
|
||||
}
|
||||
|
||||
- (void) changeParticipationStatus: (NSDictionary *) theValues
|
||||
|
||||
@@ -134,6 +134,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
[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_Interval xmlns=\"%@:\">%d</Recurrence_Interval>", t, [self repeatInterval]];
|
||||
}
|
||||
else if ([[self byMonthDay] count])
|
||||
{
|
||||
@@ -149,6 +150,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
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_Interval xmlns=\"%@:\">%d</Recurrence_Interval>", t, [self repeatInterval]];
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -43,9 +47,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import <NGCards/iCalDateTime.h>
|
||||
#import <NGCards/iCalTimeZone.h>
|
||||
|
||||
#import <Appointments/iCalEntityObject+SOGo.h>
|
||||
|
||||
#include "NSDate+ActiveSync.h"
|
||||
#include "NSString+ActiveSync.h"
|
||||
#include "iCalRecurrenceRule+ActiveSync.h"
|
||||
#include "iCalAlarm+ActiveSync.h"
|
||||
|
||||
@implementation iCalToDo (ActiveSync)
|
||||
|
||||
@@ -95,8 +102,19 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
v = 1;
|
||||
[s appendFormat: @"<Importance xmlns=\"Tasks:\">%d</Importance>", v];
|
||||
|
||||
// Reminder - FIXME
|
||||
[s appendFormat: @"<ReminderSet xmlns=\"Tasks:\">%d</ReminderSet>", 0];
|
||||
// Reminder
|
||||
if ([self hasAlarms])
|
||||
{
|
||||
iCalAlarm *alarm;
|
||||
|
||||
alarm = [self firstDisplayOrAudioAlarm];
|
||||
[s appendFormat: @"<ReminderSet xmlns=\"Tasks:\">%d</ReminderSet>", 1];
|
||||
[s appendString: [alarm activeSyncRepresentationInContext: context]];
|
||||
}
|
||||
else
|
||||
{
|
||||
[s appendFormat: @"<ReminderSet xmlns=\"Tasks:\">%d</ReminderSet>", 0];
|
||||
}
|
||||
|
||||
// Sensitivity
|
||||
if ([[self accessClass] isEqualToString: @"PRIVATE"])
|
||||
@@ -145,7 +163,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
[s appendString: @"</Body>"];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
@@ -249,6 +267,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
if ((o = [theValues objectForKey: @"ReminderTime"]))
|
||||
{
|
||||
iCalAlarm *alarm;
|
||||
|
||||
alarm = [[iCalAlarm alloc] init];
|
||||
[alarm takeActiveSyncValues: theValues inContext: context];
|
||||
|
||||
[self removeAllAlarms];
|
||||
[self addToAlarms: alarm];
|
||||
RELEASE(alarm);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -985,8 +955,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
|
||||
@@ -1089,10 +1059,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 +1131,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 +1326,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 +1374,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 +1431,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 +1441,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 +1456,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 +1477,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 +1485,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 +1538,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 +1593,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 +1620,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 +1821,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 +1859,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 +1876,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 +2158,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 +2310,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 +2337,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 +2352,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 +2387,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 +2405,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 +2702,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.19 - January 2017</releaseinfo>
|
||||
<subtitle>for version 2.3.19</subtitle>
|
||||
<date>2017-01-09</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 :
|
||||
|
||||
@@ -6,13 +6,13 @@
|
||||
Authors:
|
||||
- Inverse inc. <info@inverse.ca>
|
||||
|
||||
Copyright (C) 2008-2016 Inverse inc.
|
||||
Copyright (C) 2008-2017 Inverse inc.
|
||||
License: GFDL 1.2 or later. http://www.gnu.org/licenses/fdl.html
|
||||
|
||||
////
|
||||
|
||||
// TODO have the build system take care of this
|
||||
|
||||
:release_version: 3.2.2
|
||||
:release_version: 2.3.19
|
||||
|
||||
// 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
|
||||
|
||||
+10
-3
@@ -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>
|
||||
@@ -179,8 +185,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;
|
||||
|
||||
+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;
|
||||
|
||||
|
||||
+30
-74
@@ -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,14 +20,22 @@
|
||||
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>
|
||||
|
||||
#import <NGObjWeb/NSException+HTTP.h>
|
||||
#import <NGObjWeb/SoClassSecurityInfo.h>
|
||||
#import <NGObjWeb/WOContext.h>
|
||||
#import <NGObjWeb/WORequest+So.h>
|
||||
@@ -50,6 +59,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 +221,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];
|
||||
@@ -418,8 +370,12 @@ static BOOL debugLeaks;
|
||||
"GET" if no method was provided in the query path.
|
||||
*/
|
||||
if ([_key length] > 0 && ![_key isEqualToString:@"favicon.ico"])
|
||||
obj = [self lookupUser: _key inContext: _ctx];
|
||||
}
|
||||
{
|
||||
obj = [self lookupUser: _key inContext: _ctx];
|
||||
if (!obj && ![_key isEqualToString: @"public"])
|
||||
obj = [self lookupUser: @"anonymous" inContext: _ctx];
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
obj = nil;
|
||||
|
||||
@@ -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,229 @@
|
||||
3.2.2 (2016-11-23)
|
||||
------------------
|
||||
2.3.19 (2017-01-09)
|
||||
-------------------
|
||||
|
||||
Enhancements
|
||||
- [core] added handling of BYSETPOS for BYDAY in recurrence rules
|
||||
- [core] improved IMIP handling from Exchange/Outlook clients
|
||||
- [web] update jQuery to version 1.12.4 and jQuery UI to version 1.11.4
|
||||
- [web] added SOGoMaximumMessageSizeLimit to limit webmail message size
|
||||
- [web] added photo support for LDIF import (#1084)
|
||||
- [web] updated CKEditor to version 4.6.1
|
||||
|
||||
Bug fixes
|
||||
- [core] honor blocking wrong login attemps within time interval (#2850)
|
||||
- [core] use source's domain when none defined and trying to match users (#3523)
|
||||
- [core] properly honor the "include in freebusy" setting (#3354)
|
||||
- [core] fix events in floating time during CalDAV's PUT operation (#2865)
|
||||
- [core] handle rounds in sha512-crypt password hashes
|
||||
- [web] return login page for unknown users (#2135)
|
||||
- [web] append ics file extension when importing events (#2308)
|
||||
- [web] set a max-height so we can scroll in the attendees list (#3666)
|
||||
- [web] set a max-height so we can scroll in the attachments list (#3413)
|
||||
- [web] handle URI in vCard photos (#2683)
|
||||
- [web] handle semicolon in values during LDIF import (#1760)
|
||||
- [eas] properly escape all GAL responses (#3923)
|
||||
- [eas] properly skip folders we don't want to synchronize (#3943)
|
||||
- [eas] fixed 30 mins freebusy offset with S Planner
|
||||
- [eas] now correctly handles reminders on tasks (#3964)
|
||||
- [eas] do not decode from hex the event's UID (#3965)
|
||||
- [eas] add support for "other addresses" (#3966)
|
||||
- [eas] provide correct response status when sending too big mails (#3956)
|
||||
|
||||
2.3.18 (2016-11-28)
|
||||
-------------------
|
||||
|
||||
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
|
||||
- [core] updated time zones to version 2016h
|
||||
- [eas] initial support for recurring tasks EAS
|
||||
- [eas] now support replied/forwarded flags using EAS (#3796)
|
||||
- [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
|
||||
- [web] updated CKEditor to version 4.6.0
|
||||
|
||||
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] fixed support for recurrent tasks
|
||||
- [web] improved validation of mail account delegators
|
||||
- [web] allow edition of a mailbox rights when user can administer mailbox
|
||||
- [web] restore attributes when rewriting base64-encoded img tags (#3814)
|
||||
|
||||
3.2.1 (2016-11-02)
|
||||
------------------
|
||||
2.3.17 (2016-10-20)
|
||||
-------------------
|
||||
|
||||
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
|
||||
- [web] allow custom email address to be one of the user's profile (#3551)
|
||||
- [web] the left column of the attendees editor is resizable (not supported in IE) (#1479, #3667)
|
||||
|
||||
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] make sure we don't sleep for too long when EAS processes need interruption
|
||||
- [eas] fixed recurring events with timezones for EAS (#3822)
|
||||
- [eas] improve handling of email folders without a parent
|
||||
- [eas] never send IMIP reply when the "initiator" is Outlook 2013/2016
|
||||
- [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)
|
||||
------------------
|
||||
2.3.16 (2016-09-28)
|
||||
-------------------
|
||||
|
||||
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
|
||||
- [eas] propagate message submission errors to EAS clients (#3774)
|
||||
- [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)
|
||||
- [web] added Serbian (sr) translation - thanks to Bogdanović Bojan
|
||||
|
||||
Bug fixes
|
||||
- [web] correctly set percent-complete for tasks from the list view (#3197)
|
||||
- [core] fixed caching expiration of ACLs assigned to LDAP groups (#2867)
|
||||
- [core] we now search in all domain sources for Apple Calendar
|
||||
- [core] properly handle groups in Apple Calendar's delegation
|
||||
- [core] make sure new cards always have a UID (#3819)
|
||||
|
||||
2.3.15 (2016-09-14)
|
||||
-------------------
|
||||
|
||||
Enhancements
|
||||
- [web] don't allow a recurrence rule to end before the first occurrence
|
||||
|
||||
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
|
||||
- [web] handle binary content transfer encoding when displaying mails
|
||||
|
||||
3.1.5 (2016-08-10)
|
||||
------------------
|
||||
2.3.14 (2016-08-17)
|
||||
-------------------
|
||||
|
||||
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 +247,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
|
||||
|
||||
@@ -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"];
|
||||
@@ -1238,8 +1151,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 +1163,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 +1210,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 */
|
||||
@@ -1361,21 +1264,12 @@ andAttribute: (EOAttribute *)_attribute
|
||||
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]];
|
||||
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];
|
||||
|
||||
@@ -1401,26 +1295,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 +1400,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 +1486,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 +1519,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"
|
||||
|
||||
|
||||
@@ -5,9 +5,9 @@ BEGIN:VTIMEZONE
|
||||
TZID:Antarctica/Casey
|
||||
X-LIC-LOCATION:Antarctica/Casey
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+1100
|
||||
TZOFFSETTO:+1100
|
||||
TZNAME:+11
|
||||
TZOFFSETFROM:+0800
|
||||
TZOFFSETTO:+0800
|
||||
TZNAME:+08
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
|
||||
@@ -4,19 +4,11 @@ VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Pacific/Tongatapu
|
||||
X-LIC-LOCATION:Pacific/Tongatapu
|
||||
BEGIN:DAYLIGHT
|
||||
TZOFFSETFROM:+1300
|
||||
TZOFFSETTO:+1400
|
||||
TZNAME:+14
|
||||
DTSTART:19701101T020000
|
||||
RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
|
||||
END:DAYLIGHT
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+1400
|
||||
TZOFFSETFROM:+1300
|
||||
TZOFFSETTO:+1300
|
||||
TZNAME:+13
|
||||
DTSTART:19700118T030000
|
||||
RRULE:FREQ=YEARLY;BYMONTH=1;BYDAY=3SU
|
||||
TZNAME:TOT
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -11,8 +11,8 @@ To updated the timezone files:
|
||||
|
||||
mkdir /tmp/zones
|
||||
cd /tmp/zones
|
||||
wget http://www.iana.org/time-zones/repository/releases/tzdata2016i.tar.gz
|
||||
tar -zxvf tzdata2016i.tar.gz
|
||||
wget http://www.iana.org/time-zones/repository/releases/tzdata2016h.tar.gz
|
||||
tar -zxvf tzdata2016h.tar.gz
|
||||
|
||||
4- compile and run the conversion tool
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
*/
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <NGExtensions/NSNull+misc.h>
|
||||
#import <NGExtensions/NSObject+Logs.h>
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
/* iCalByDayMask.h - this file is part of SOPE
|
||||
*
|
||||
* Copyright (C) 2010-2015 Inverse inc.
|
||||
* Copyright (C) 2010 Wolfgang Sourdeau
|
||||
*
|
||||
* 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 ICALBYDAYMASK_H
|
||||
#define ICALBYDAYMASK_H
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
|
||||
#import "iCalRecurrenceRule.h"
|
||||
|
||||
@@ -52,8 +55,6 @@ typedef iCalWeekOccurrence iCalWeekOccurrences[7];
|
||||
- (id) initWithDays: (iCalWeekOccurrences) theDays;
|
||||
+ (id) byDayMaskWithRuleString: (NSString *) byDayRule;
|
||||
- (id) initWithRuleString: (NSString *) byDayRule;
|
||||
+ (id) byDayMaskWithDaysAndOccurrences: (NSArray *) values;
|
||||
- (id) initWithDaysAndOccurrences: (NSArray *) values;
|
||||
|
||||
- (BOOL) occursOnDay: (iCalWeekDay) weekDay;
|
||||
- (BOOL) occursOnDay: (iCalWeekDay) weekDay
|
||||
@@ -70,7 +71,6 @@ typedef iCalWeekOccurrence iCalWeekOccurrences[7];
|
||||
|
||||
- (NSString *) asRuleString;
|
||||
- (NSString *) asRuleStringWithIntegers;
|
||||
- (NSArray *) asRuleArray;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
+23
-159
@@ -1,6 +1,8 @@
|
||||
/* iCalByDayMask.m - this file is part of SOPE
|
||||
*
|
||||
* Copyright (C) 2010-2015 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
|
||||
@@ -19,11 +21,12 @@
|
||||
*/
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSValue.h>
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
#import "iCalByDayMask.h"
|
||||
|
||||
#import <ctype.h>
|
||||
#import <math.h>
|
||||
|
||||
@interface iCalByDayMask (PrivateAPI)
|
||||
|
||||
@@ -36,10 +39,10 @@
|
||||
+ (id) byDayMaskWithDays: (iCalWeekOccurrences) theDays
|
||||
{
|
||||
id o;
|
||||
|
||||
|
||||
o = [[self alloc] initWithDays: theDays];
|
||||
AUTORELEASE(o);
|
||||
|
||||
|
||||
return o;
|
||||
}
|
||||
|
||||
@@ -59,7 +62,7 @@
|
||||
{
|
||||
id o;
|
||||
iCalWeekOccurrences d;
|
||||
|
||||
|
||||
d[iCalWeekDaySunday] = 0;
|
||||
d[iCalWeekDayMonday] = iCalWeekOccurrenceAll;
|
||||
d[iCalWeekDayTuesday] = iCalWeekOccurrenceAll;
|
||||
@@ -69,7 +72,7 @@
|
||||
d[iCalWeekDaySaturday] = 0;
|
||||
o = [[self alloc] initWithDays: d];
|
||||
AUTORELEASE(o);
|
||||
|
||||
|
||||
return o;
|
||||
}
|
||||
|
||||
@@ -99,7 +102,7 @@
|
||||
if (self)
|
||||
{
|
||||
memset(days, 0, 7 * sizeof(iCalWeekOccurrence));
|
||||
|
||||
|
||||
if ([byDayRule length] > 0)
|
||||
{
|
||||
values = [byDayRule componentsSeparatedByString: @","];
|
||||
@@ -117,7 +120,7 @@
|
||||
|
||||
[value getCharacters: chars
|
||||
range: NSMakeRange(valueLength - 2, 2)];
|
||||
|
||||
|
||||
switch (chars[0])
|
||||
{
|
||||
case 'M': day = iCalWeekDayMonday;
|
||||
@@ -139,7 +142,7 @@
|
||||
day = iCalWeekDaySunday;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if (day != iCalWeekDayUnknown)
|
||||
{
|
||||
c = [value characterAtIndex: 0];
|
||||
@@ -154,15 +157,15 @@
|
||||
digitStart = 1;
|
||||
c = [value characterAtIndex: 1];
|
||||
}
|
||||
|
||||
|
||||
i = digitStart;
|
||||
|
||||
|
||||
while (i < valueLength && isdigit(c))
|
||||
{
|
||||
i++;
|
||||
c = [value characterAtIndex: i];
|
||||
}
|
||||
|
||||
|
||||
if (i != digitStart)
|
||||
order = [[value substringWithRange: NSMakeRange(digitStart, (i - digitStart))] intValue];
|
||||
|
||||
@@ -183,123 +186,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (id) byDayMaskWithDaysAndOccurrences: (NSArray *) values
|
||||
{
|
||||
id o;
|
||||
|
||||
o = [[self alloc] initWithDaysAndOccurrences: values];
|
||||
AUTORELEASE(o);
|
||||
|
||||
return o;
|
||||
}
|
||||
|
||||
- (id) initWithDaysAndOccurrences: (NSArray *) values
|
||||
{
|
||||
unsigned int count, max;
|
||||
NSString *value;
|
||||
unichar c, chars[2];
|
||||
unsigned int valueLength, i, digitStart, order;
|
||||
iCalWeekDay day;
|
||||
id mask;
|
||||
BOOL reverse;
|
||||
|
||||
self = [super init];
|
||||
|
||||
if (self)
|
||||
{
|
||||
memset(days, 0, 7 * sizeof(iCalWeekOccurrence));
|
||||
|
||||
max = [values count];
|
||||
for (count = 0; count < max; count++)
|
||||
{
|
||||
mask = [values objectAtIndex: count];
|
||||
if (![mask isKindOfClass: [NSDictionary class]])
|
||||
continue;
|
||||
value = [[mask objectForKey: @"day"] uppercaseString];
|
||||
valueLength = [value length];
|
||||
if (valueLength > 1)
|
||||
{
|
||||
day = iCalWeekDayUnknown;
|
||||
reverse = NO;
|
||||
digitStart = 0;
|
||||
order = 0;
|
||||
|
||||
[value getCharacters: chars
|
||||
range: NSMakeRange(0, valueLength)];
|
||||
|
||||
switch (chars[0])
|
||||
{
|
||||
case 'M': day = iCalWeekDayMonday;
|
||||
break;
|
||||
case 'W': day = iCalWeekDayWednesday;
|
||||
break;
|
||||
case 'F': day = iCalWeekDayFriday;
|
||||
break;
|
||||
case 'T':
|
||||
if (chars[1] == 'U')
|
||||
day = iCalWeekDayTuesday;
|
||||
else if (chars[1] == 'H')
|
||||
day = iCalWeekDayThursday;
|
||||
break;
|
||||
case 'S':
|
||||
if (chars[1] == 'A')
|
||||
day = iCalWeekDaySaturday;
|
||||
else if (chars[1] == 'U')
|
||||
day = iCalWeekDaySunday;
|
||||
break;
|
||||
}
|
||||
|
||||
if (day != iCalWeekDayUnknown)
|
||||
{
|
||||
value = [mask objectForKey: @"occurrence"];
|
||||
valueLength = [value length];
|
||||
if (valueLength > 0)
|
||||
{
|
||||
c = [value characterAtIndex: 0];
|
||||
if (c == '-')
|
||||
{
|
||||
digitStart = 1;
|
||||
reverse = YES;
|
||||
}
|
||||
else if (c == '+')
|
||||
{
|
||||
digitStart = 1;
|
||||
}
|
||||
|
||||
i = digitStart;
|
||||
while (i < valueLength)
|
||||
{
|
||||
c = [value characterAtIndex: i];
|
||||
i++;
|
||||
if (!isdigit(c))
|
||||
break;
|
||||
}
|
||||
|
||||
if (i != digitStart)
|
||||
order = [[value substringWithRange: NSMakeRange(digitStart, (i - digitStart))] intValue];
|
||||
}
|
||||
|
||||
if (order > 0 && order < 6)
|
||||
{
|
||||
order = pow (2, order - 1);
|
||||
if (reverse)
|
||||
order = order << 5;
|
||||
days[day] |= order;
|
||||
//NSLog(@"*** iCalByDayMask [%i] %@ : day = %i, order = %i, result = %i", count, byDayRule, day, order, days[day]);
|
||||
}
|
||||
else
|
||||
{
|
||||
days[day] = iCalWeekOccurrenceAll;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
@@ -327,7 +214,7 @@
|
||||
withWeekNumber: (int) week
|
||||
{
|
||||
unsigned int absWeek, order;
|
||||
|
||||
|
||||
absWeek = abs (week);
|
||||
order = 0;
|
||||
if (absWeek > 0 && absWeek < 6)
|
||||
@@ -336,7 +223,7 @@
|
||||
if (week < 0)
|
||||
order = order << 5;
|
||||
}
|
||||
|
||||
|
||||
return ((days[weekDay] & order) > 0);
|
||||
}
|
||||
|
||||
@@ -362,7 +249,7 @@
|
||||
if (days[i])
|
||||
day = i;
|
||||
}
|
||||
|
||||
|
||||
return day;
|
||||
}
|
||||
|
||||
@@ -373,10 +260,10 @@
|
||||
|
||||
occurrence = 0;
|
||||
day = [self firstDay];
|
||||
|
||||
|
||||
if (day > -1 && days[day] != iCalWeekOccurrenceAll)
|
||||
occurrence = [self _iCalWeekOccurrenceIntValue: days[day]];
|
||||
|
||||
|
||||
return occurrence;
|
||||
}
|
||||
|
||||
@@ -436,7 +323,7 @@
|
||||
[rules addObject: rule];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return [rules componentsJoinedByString: @","];
|
||||
}
|
||||
|
||||
@@ -457,27 +344,4 @@
|
||||
return s;
|
||||
}
|
||||
|
||||
- (NSArray *) asRuleArray
|
||||
{
|
||||
NSMutableArray *rules;
|
||||
NSMutableDictionary *rule;
|
||||
int i;
|
||||
|
||||
rules = [NSMutableArray array];
|
||||
for (i = 0; i < 7; i++)
|
||||
{
|
||||
if (days[i])
|
||||
{
|
||||
rule = [NSMutableDictionary dictionary];
|
||||
if (days[i] != iCalWeekOccurrenceAll)
|
||||
[rule setObject: [NSNumber numberWithInt: [self _iCalWeekOccurrenceIntValue: days[i]]]
|
||||
forKey: @"occurrence"];
|
||||
[rule setObject: iCalWeekDayString[i]
|
||||
forKey: @"day"];
|
||||
[rules addObject: rule];
|
||||
}
|
||||
}
|
||||
return rules;
|
||||
}
|
||||
|
||||
@end /* iCalByDayMask */
|
||||
@@ -26,6 +26,7 @@
|
||||
#import "iCalToDo.h"
|
||||
#import "iCalJournal.h"
|
||||
#import "iCalFreeBusy.h"
|
||||
#import "iCalEntityObject.h"
|
||||
#import "iCalTimeZone.h"
|
||||
|
||||
#import "iCalCalendar.h"
|
||||
|
||||
@@ -20,6 +20,8 @@
|
||||
02111-1307, USA.
|
||||
*/
|
||||
|
||||
#import <Foundation/NSDate.h>
|
||||
#import <Foundation/NSArray.h>
|
||||
|
||||
#import <NGExtensions/NSCalendarDate+misc.h>
|
||||
#import <NGExtensions/NGCalendarDateRange.h>
|
||||
@@ -27,6 +29,7 @@
|
||||
#import "NSCalendarDate+ICal.h"
|
||||
|
||||
#import "iCalRecurrenceCalculator.h"
|
||||
#import "iCalRecurrenceRule.h"
|
||||
#import "iCalByDayMask.h"
|
||||
|
||||
@interface iCalDailyRecurrenceCalculator : iCalRecurrenceCalculator
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#ifndef __NGiCal_iCalDataSource_H__
|
||||
#define __NGiCal_iCalDataSource_H__
|
||||
|
||||
#import <EOControl/EODataSource.h>
|
||||
|
||||
@class NSString, NSURL;
|
||||
@class EOFetchSpecification;
|
||||
|
||||
@@ -19,6 +19,11 @@
|
||||
02111-1307, USA.
|
||||
*/
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSAutoreleasePool.h>
|
||||
#import <Foundation/NSBundle.h>
|
||||
#import <Foundation/NSObject.h>
|
||||
#import <Foundation/NSURL.h>
|
||||
|
||||
#import <EOControl/EOClassDescription.h>
|
||||
#import <EOControl/EOFetchSpecification.h>
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
*/
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSTimeZone.h>
|
||||
|
||||
#import <NGExtensions/NSObject+Logs.h>
|
||||
|
||||
@@ -94,8 +94,8 @@ typedef enum
|
||||
- (void) increaseSequence;
|
||||
|
||||
/* url can either be set as NSString or NSURL */
|
||||
- (void) setAttach: (NSArray *) _value;
|
||||
- (NSArray *) attach;
|
||||
- (void) setAttach: (id) _value;
|
||||
- (NSURL *) attach;
|
||||
- (void) setUrl: (id) _value;
|
||||
- (NSURL *) url;
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
*/
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSException.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSURL.h>
|
||||
#import <Foundation/NSValue.h>
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#import "iCalAlarm.h"
|
||||
#import "iCalCalendar.h"
|
||||
#import "iCalDateTime.h"
|
||||
#import "iCalEntityObject.h"
|
||||
#import "iCalEvent.h"
|
||||
#import "iCalPerson.h"
|
||||
|
||||
@@ -403,58 +404,32 @@
|
||||
return [self childrenWithTag: @"valarm"];
|
||||
}
|
||||
|
||||
- (void) setAttach: (NSArray *) _value
|
||||
- (void) setAttach: (id) _value
|
||||
{
|
||||
NSString *aString;
|
||||
id anObject;
|
||||
int count, max;
|
||||
|
||||
max = [_value count];
|
||||
for (count = 0; count < max; count++)
|
||||
{
|
||||
anObject = [_value objectAtIndex: count];
|
||||
if ([anObject isKindOfClass: [NSURL class]])
|
||||
{
|
||||
aString = [anObject absoluteString];
|
||||
}
|
||||
else
|
||||
aString = anObject;
|
||||
[self addChild: [CardElement simpleElementWithTag: @"attach" value: aString]];
|
||||
}
|
||||
if ([_value isKindOfClass: [NSString class]])
|
||||
aString = _value;
|
||||
else if ([_value isKindOfClass: [NSURL class]])
|
||||
aString = [_value absoluteString];
|
||||
else
|
||||
aString = @"";
|
||||
|
||||
[[self uniqueChildWithTag: @"attach"] setSingleValue: aString forKey: @""];
|
||||
}
|
||||
|
||||
- (NSArray *) attach
|
||||
- (NSURL *) attach
|
||||
{
|
||||
NSArray *elements;
|
||||
NSMutableArray *attachUrls;
|
||||
NSString *stringAttach;
|
||||
NSURL *url;
|
||||
int count, max;
|
||||
|
||||
elements = [self childrenWithTag: @"attach"];
|
||||
max = [elements count];
|
||||
attachUrls = [NSMutableArray arrayWithCapacity: max];
|
||||
for (count = 0; count < max; count++)
|
||||
{
|
||||
stringAttach = [[elements objectAtIndex: count] flattenedValuesForKey: @""];
|
||||
stringAttach = [[self uniqueChildWithTag: @"attach"] flattenedValuesForKey: @""];
|
||||
url = [NSURL URLWithString: stringAttach];
|
||||
|
||||
NS_DURING
|
||||
{
|
||||
url = [NSURL URLWithString: stringAttach];
|
||||
|
||||
if (![url scheme] && [stringAttach length] > 0)
|
||||
url = [NSURL URLWithString: [NSString stringWithFormat: @"http://%@", stringAttach]];
|
||||
|
||||
[attachUrls addObject: [url absoluteString]];
|
||||
}
|
||||
NS_HANDLER
|
||||
{
|
||||
// Invalid URL, skipping.
|
||||
}
|
||||
NS_ENDHANDLER
|
||||
}
|
||||
if (!url && [stringAttach length] > 0)
|
||||
url = [NSURL URLWithString: [NSString stringWithFormat: @"http://%@", stringAttach]];
|
||||
|
||||
return attachUrls;
|
||||
return url;
|
||||
}
|
||||
|
||||
- (void) setUrl: (id) _value
|
||||
|
||||
@@ -29,6 +29,8 @@
|
||||
|
||||
#import "iCalEventChanges.h"
|
||||
#import "iCalDateTime.h"
|
||||
#import "iCalRecurrenceRule.h"
|
||||
#import "iCalRecurrenceCalculator.h"
|
||||
|
||||
#import "iCalEvent.h"
|
||||
|
||||
|
||||
@@ -1,26 +1,29 @@
|
||||
/* iCalEventChanges.h - this file is part of SOPE
|
||||
*
|
||||
* Copyright (C) 2004-2016 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
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This file is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
/*
|
||||
Copyright (C) 2004-2005 SKYRIX Software AG
|
||||
|
||||
This file is part of SOPE.
|
||||
|
||||
SOPE is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU Lesser General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
SOPE is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with SOPE; see the file COPYING. If not, write to the
|
||||
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
02111-1307, USA.
|
||||
*/
|
||||
// Created by znek on 31.08.04.
|
||||
|
||||
#ifndef __NGiCal_iCalEventChanges_H_
|
||||
#define __NGiCal_iCalEventChanges_H_
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
|
||||
@class iCalEvent, NSArray, NSMutableArray;
|
||||
|
||||
@@ -39,7 +42,6 @@
|
||||
- (id)initWithFromEvent:(iCalEvent *)_from toEvent:(iCalEvent *)_to;
|
||||
|
||||
- (BOOL)hasChanges;
|
||||
- (BOOL)hasMajorChanges;
|
||||
|
||||
- (BOOL)hasAttendeeChanges;
|
||||
- (NSArray *)insertedAttendees;
|
||||
|
||||
@@ -1,21 +1,22 @@
|
||||
/* iCalEventChanges.m - this file is part of SOPE
|
||||
*
|
||||
* Copyright (C) 2004-2016 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
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This file is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
/*
|
||||
Copyright (C) 2004-2005 SKYRIX Software AG
|
||||
|
||||
This file is part of SOPE.
|
||||
|
||||
SOPE is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU Lesser General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
SOPE is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with SOPE; see the file COPYING. If not, write to the
|
||||
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
02111-1307, USA.
|
||||
*/
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
@@ -141,7 +142,7 @@
|
||||
[updatedProperties addObject:@"accessClass"];
|
||||
if(!IS_EQUAL([_from sequence], [_to sequence], isEqualToNumber:))
|
||||
[updatedProperties addObject:@"sequence"];
|
||||
if(!IS_EQUAL([_from organizer], [_to organizer], isEqual:))
|
||||
if(!IS_EQUAL([[_from organizer] rfc822Email], [[_to organizer] rfc822Email], isEqual:))
|
||||
[updatedProperties addObject:@"organizer"];
|
||||
if(!IS_EQUAL([_from recurrenceRules], [_to recurrenceRules], isEqual:))
|
||||
[updatedProperties addObject:@"rrule"];
|
||||
@@ -157,13 +158,6 @@
|
||||
[self hasPropertyChanges];
|
||||
}
|
||||
|
||||
- (BOOL)hasMajorChanges {
|
||||
return
|
||||
[self hasAttendeeChanges] ||
|
||||
([self hasPropertyChanges] &&
|
||||
([[self updatedProperties] count] > 1 || ![[self updatedProperties] containsObject: @"lastModified"]));
|
||||
}
|
||||
|
||||
- (BOOL)hasAttendeeChanges {
|
||||
return [[self insertedAttendees] count] > 0 ||
|
||||
[[self deletedAttendees] count] > 0 ||
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
02111-1307, USA.
|
||||
*/
|
||||
|
||||
#import <Foundation/NSString.h>
|
||||
#import <NGExtensions/NSCalendarDate+misc.h>
|
||||
|
||||
#import "iCalRecurrenceCalculator.h"
|
||||
@@ -29,9 +30,11 @@
|
||||
@end
|
||||
|
||||
#import <NGExtensions/NGCalendarDateRange.h>
|
||||
#import "iCalRecurrenceRule.h"
|
||||
#import "iCalByDayMask.h"
|
||||
#import "NSCalendarDate+ICal.h"
|
||||
|
||||
#import <string.h>
|
||||
|
||||
@interface iCalRecurrenceCalculator (PrivateAPI)
|
||||
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
#ifndef __NGiCal_iCalObject_H__
|
||||
#define __NGiCal_iCalObject_H__
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
#import <Foundation/NSDate.h>
|
||||
|
||||
/*
|
||||
iCalObject
|
||||
|
||||
@@ -44,8 +44,6 @@ typedef enum {
|
||||
|
||||
@interface iCalPerson : CardElement
|
||||
|
||||
+ (NSString *) descriptionForParticipationStatus: (iCalPersonPartStat) _status;
|
||||
|
||||
/* accessors */
|
||||
|
||||
- (void)setCn:(NSString *)_s;
|
||||
|
||||
+34
-45
@@ -25,48 +25,6 @@
|
||||
|
||||
@implementation iCalPerson
|
||||
|
||||
+ (NSString *) descriptionForParticipationStatus: (iCalPersonPartStat) _status
|
||||
{
|
||||
NSString *stat;
|
||||
|
||||
switch (_status) {
|
||||
case iCalPersonPartStatUndefined:
|
||||
stat = @"";
|
||||
break;
|
||||
case iCalPersonPartStatAccepted:
|
||||
stat = @"ACCEPTED";
|
||||
break;
|
||||
case iCalPersonPartStatDeclined:
|
||||
stat = @"DECLINED";
|
||||
break;
|
||||
case iCalPersonPartStatTentative:
|
||||
stat = @"TENTATIVE";
|
||||
break;
|
||||
case iCalPersonPartStatDelegated:
|
||||
stat = @"DELEGATED";
|
||||
break;
|
||||
case iCalPersonPartStatCompleted:
|
||||
stat = @"COMPLETED";
|
||||
break;
|
||||
case iCalPersonPartStatInProcess:
|
||||
stat = @"IN-PROCESS";
|
||||
break;
|
||||
case iCalPersonPartStatExperimental:
|
||||
case iCalPersonPartStatOther:
|
||||
// [NSException raise:NSInternalInconsistencyException
|
||||
// format:@"Attempt to set meaningless "
|
||||
// @"participationStatus (%d)!", _status];
|
||||
stat = nil; /* keep compiler happy */
|
||||
break;
|
||||
default:
|
||||
stat = @"NEEDS-ACTION";
|
||||
break;
|
||||
}
|
||||
|
||||
return stat;
|
||||
}
|
||||
|
||||
|
||||
/* accessors */
|
||||
|
||||
- (void) setCn: (NSString *) _s
|
||||
@@ -174,13 +132,44 @@
|
||||
{
|
||||
NSString *stat;
|
||||
|
||||
stat = [iCalPerson descriptionForParticipationStatus: _status];
|
||||
|
||||
switch (_status) {
|
||||
case iCalPersonPartStatUndefined:
|
||||
stat = @"";
|
||||
break;
|
||||
case iCalPersonPartStatAccepted:
|
||||
stat = @"ACCEPTED";
|
||||
break;
|
||||
case iCalPersonPartStatDeclined:
|
||||
stat = @"DECLINED";
|
||||
break;
|
||||
case iCalPersonPartStatTentative:
|
||||
stat = @"TENTATIVE";
|
||||
break;
|
||||
case iCalPersonPartStatDelegated:
|
||||
stat = @"DELEGATED";
|
||||
break;
|
||||
case iCalPersonPartStatCompleted:
|
||||
stat = @"COMPLETED";
|
||||
break;
|
||||
case iCalPersonPartStatInProcess:
|
||||
stat = @"IN-PROCESS";
|
||||
break;
|
||||
case iCalPersonPartStatExperimental:
|
||||
case iCalPersonPartStatOther:
|
||||
// [NSException raise:NSInternalInconsistencyException
|
||||
// format:@"Attempt to set meaningless "
|
||||
// @"participationStatus (%d)!", _status];
|
||||
stat = nil; /* keep compiler happy */
|
||||
break;
|
||||
default:
|
||||
stat = @"NEEDS-ACTION";
|
||||
break;
|
||||
}
|
||||
if (stat)
|
||||
[self setPartStat:stat];
|
||||
}
|
||||
|
||||
- (iCalPersonPartStat) participationStatus {
|
||||
- (iCalPersonPartStat)participationStatus {
|
||||
NSString *stat;
|
||||
|
||||
stat = [[self partStat] uppercaseString];
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#ifndef __NGiCal_iCalRecurrenceCalculator_H_
|
||||
#define __NGiCal_iCalRecurrenceCalculator_H_
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
|
||||
/*
|
||||
iCalRecurrenceCalculator
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
02111-1307, USA.
|
||||
*/
|
||||
|
||||
#import <Foundation/NSEnumerator.h>
|
||||
|
||||
#import <NGExtensions/NSCalendarDate+misc.h>
|
||||
#import <NGExtensions/NGCalendarDateRange.h>
|
||||
|
||||
@@ -75,7 +75,6 @@ extern NSString *iCalWeekDayString[];
|
||||
- (void) setFrequency: (iCalRecurrenceFrequency) _frequency;
|
||||
- (iCalRecurrenceFrequency) frequency;
|
||||
- (iCalRecurrenceFrequency) valueForFrequency: (NSString *) value;
|
||||
- (NSString *) frequencyForValue: (iCalRecurrenceFrequency) freq;
|
||||
|
||||
- (void) setRepeatInterval: (int) _repeatInterval;
|
||||
- (int) repeatInterval;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Copyright (C) 2004-2005 SKYRIX Software AG
|
||||
Copyright (C) 2006-2016 Inverse inc.
|
||||
Copyright (C) 2006-2010 Inverse inc.
|
||||
|
||||
This file is part of SOPE.
|
||||
|
||||
@@ -184,9 +184,12 @@
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSEnumerator.h>
|
||||
#import <Foundation/NSException.h>
|
||||
#import <NGExtensions/NSString+Ext.h>
|
||||
#import <NGExtensions/NSObject+Logs.h>
|
||||
|
||||
#import <ctype.h>
|
||||
|
||||
#import "NSCalendarDate+ICal.h"
|
||||
#import "NSCalendarDate+NGCards.h"
|
||||
@@ -194,6 +197,7 @@
|
||||
|
||||
#import "CardGroup.h"
|
||||
#import "iCalByDayMask.h"
|
||||
#import "iCalRecurrenceRule.h"
|
||||
|
||||
NSString *iCalWeekDayString[] = { @"SU", @"MO", @"TU", @"WE", @"TH", @"FR",
|
||||
@"SA" };
|
||||
@@ -287,8 +291,6 @@ NSString *iCalWeekDayString[] = { @"SU", @"MO", @"TU", @"WE", @"TH", @"FR",
|
||||
NSString *frequency;
|
||||
iCalRecurrenceFrequency freq;
|
||||
|
||||
freq = 0;
|
||||
|
||||
if ([value length] > 0)
|
||||
{
|
||||
frequency = [value uppercaseString];
|
||||
@@ -306,7 +308,11 @@ NSString *iCalWeekDayString[] = { @"SU", @"MO", @"TU", @"WE", @"TH", @"FR",
|
||||
freq = iCalRecurrenceFrequenceMinutely;
|
||||
else if ([frequency isEqualToString:@"SECONDLY"])
|
||||
freq = iCalRecurrenceFrequenceSecondly;
|
||||
else
|
||||
freq = (iCalRecurrenceFrequency)NSNotFound;
|
||||
}
|
||||
else
|
||||
freq = (iCalRecurrenceFrequency)NSNotFound;
|
||||
|
||||
return freq;
|
||||
}
|
||||
@@ -466,9 +472,16 @@ NSString *iCalWeekDayString[] = { @"SU", @"MO", @"TU", @"WE", @"TH", @"FR",
|
||||
|
||||
- (iCalByDayMask *) byDayMask
|
||||
{
|
||||
NSArray *setPos;
|
||||
NSString *day;
|
||||
|
||||
if (dayMask == nil && [[self byDay] length])
|
||||
{
|
||||
dayMask = [iCalByDayMask byDayMaskWithRuleString: [self byDay]];
|
||||
day = [self byDay];
|
||||
setPos = [self bySetPos];
|
||||
if ([setPos count])
|
||||
day = [NSString stringWithFormat: @"%@%@", [setPos lastObject], day];
|
||||
dayMask = [iCalByDayMask byDayMaskWithRuleString: day];
|
||||
[dayMask retain];
|
||||
}
|
||||
|
||||
|
||||
@@ -20,6 +20,10 @@
|
||||
02111-1307, USA.
|
||||
*/
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSCalendarDate.h>
|
||||
#import <Foundation/NSEnumerator.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSTimeZone.h>
|
||||
|
||||
#import <NGExtensions/NGCalendarDateRange.h>
|
||||
@@ -29,8 +33,10 @@
|
||||
#import "iCalDateTime.h"
|
||||
#import "iCalEvent.h"
|
||||
#import "iCalTimeZone.h"
|
||||
#import "iCalTimeZonePeriod.h"
|
||||
#import "iCalRecurrenceRule.h"
|
||||
#import "iCalRecurrenceCalculator.h"
|
||||
#import "iCalRepeatableEntityObject.h"
|
||||
|
||||
@implementation iCalRepeatableEntityObject
|
||||
|
||||
|
||||
Loaded 100 of 1556 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user