Compare commits
588
Commits
SOGo-3.2.7
...
SOGo-4.0.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
df2926e872 | ||
|
|
e3ba7c8cab | ||
|
|
1d7bc666d6 | ||
|
|
190fa0c77e | ||
|
|
0667c12db4 | ||
|
|
a911a3b78c | ||
|
|
2301ae2c75 | ||
|
|
5493855b2f | ||
|
|
4a5446d8ad | ||
|
|
bf34f4f552 | ||
|
|
d49219ceec | ||
|
|
0dc3ed3202 | ||
|
|
a75ae84953 | ||
|
|
d00db81d08 | ||
|
|
44ea5a29d4 | ||
|
|
218d8aa5fa | ||
|
|
d02a97468e | ||
|
|
518e6a56fd | ||
|
|
da52b0bf82 | ||
|
|
e10dc4af11 | ||
|
|
b8a02d6ce9 | ||
|
|
e50e112a96 | ||
|
|
9776e9d217 | ||
|
|
e7c56e86d4 | ||
|
|
26095d6361 | ||
|
|
2faf0411e4 | ||
|
|
d3b10730e9 | ||
|
|
a5adb2f952 | ||
|
|
3bf55a5edf | ||
|
|
b120669747 | ||
|
|
bccce4022e | ||
|
|
32fd61c8f4 | ||
|
|
7cd040fb6b | ||
|
|
9310a289f6 | ||
|
|
006859cee1 | ||
|
|
9fddc66007 | ||
|
|
ed6e191f66 | ||
|
|
099f6b42dc | ||
|
|
c5a324ae86 | ||
|
|
e265ecfe1b | ||
|
|
faed42094f | ||
|
|
40b0704812 | ||
|
|
e29ce4acec | ||
|
|
29047c4692 | ||
|
|
86b896e532 | ||
|
|
8ae8d67c0c | ||
|
|
ad943bf2aa | ||
|
|
1be0808a16 | ||
|
|
2fceae86dd | ||
|
|
750c720a73 | ||
|
|
24123e78da | ||
|
|
e2ee90f2ef | ||
|
|
e47640a06d | ||
|
|
b2703f4ddc | ||
|
|
19753f56f7 | ||
|
|
8305d30cb7 | ||
|
|
23d0b68e57 | ||
|
|
f88b46c78f | ||
|
|
e93727d3f0 | ||
|
|
2ccf7a5514 | ||
|
|
1528dc4dd0 | ||
|
|
d05477499f | ||
|
|
7897ea58fe | ||
|
|
a35138c0b8 | ||
|
|
8e35becd93 | ||
|
|
7ebdac5525 | ||
|
|
511aa63a34 | ||
|
|
341e5cbab0 | ||
|
|
0e673beb22 | ||
|
|
d80f2462f0 | ||
|
|
b8812d64e8 | ||
|
|
b8c20b24e5 | ||
|
|
e1cb7f385f | ||
|
|
c2169a1f72 | ||
|
|
2fc8018b52 | ||
|
|
bca655ffdd | ||
|
|
d4c8f5089b | ||
|
|
5b711dea8f | ||
|
|
4133a0b954 | ||
|
|
b39d3db674 | ||
|
|
30817079f2 | ||
|
|
a33df49331 | ||
|
|
e86efe59fd | ||
|
|
c29e0a1a3d | ||
|
|
5ba683d4b1 | ||
|
|
15de264967 | ||
|
|
5767419554 | ||
|
|
8d0f419acf | ||
|
|
451133f226 | ||
|
|
ed3fe1ecc2 | ||
|
|
da4e2e92bd | ||
|
|
b73e65ebeb | ||
|
|
d6c1fad2fc | ||
|
|
6cc96301f8 | ||
|
|
02d1aa12f9 | ||
|
|
a44118d68f | ||
|
|
c875302a86 | ||
|
|
2f1c8cdbc8 | ||
|
|
7824c35d95 | ||
|
|
48d94980b4 | ||
|
|
20e8fd852c | ||
|
|
8ab73fa76b | ||
|
|
2d6246d635 | ||
|
|
0287f34bca | ||
|
|
879e7a6cd5 | ||
|
|
0ec60788d8 | ||
|
|
ada9c57ef7 | ||
|
|
643c6b7ebf | ||
|
|
35c7f483d9 | ||
|
|
c80f016c18 | ||
|
|
8727024857 | ||
|
|
a73b20fa02 | ||
|
|
502b59bc08 | ||
|
|
3f95d53de8 | ||
|
|
72273bf454 | ||
|
|
496b402d17 | ||
|
|
695afc670f | ||
|
|
54d04741fa | ||
|
|
74d41ecb34 | ||
|
|
2a272f0aa7 | ||
|
|
95bf606bf2 | ||
|
|
6ce1fa42a2 | ||
|
|
793fc9024f | ||
|
|
71dd9d7d91 | ||
|
|
e27e558cb2 | ||
|
|
96d62c432b | ||
|
|
6294d91180 | ||
|
|
64a7b8a797 | ||
|
|
f880d1aa54 | ||
|
|
915fad335a | ||
|
|
5e26ff6d1d | ||
|
|
94f7050cb8 | ||
|
|
f95170e043 | ||
|
|
81e07f0105 | ||
|
|
8f2bcb6055 | ||
|
|
42bf30d05e | ||
|
|
8a4ebe2c60 | ||
|
|
979ec2c3a1 | ||
|
|
58f4c72c47 | ||
|
|
af641bbead | ||
|
|
873faf468f | ||
|
|
f5db41584b | ||
|
|
2952a69785 | ||
|
|
394e7e7e88 | ||
|
|
f662781312 | ||
|
|
6c993be9f1 | ||
|
|
8afa87e953 | ||
|
|
4b355f532d | ||
|
|
429a3bedb9 | ||
|
|
b89752cd39 | ||
|
|
9ed23c32f2 | ||
|
|
28a37de613 | ||
|
|
60bbe26289 | ||
|
|
37074086cf | ||
|
|
c9c5f8bba9 | ||
|
|
97147e261b | ||
|
|
732f81b44b | ||
|
|
3b411101cd | ||
|
|
8d38be1e43 | ||
|
|
de91b57825 | ||
|
|
e6e5e077bd | ||
|
|
e590aec64f | ||
|
|
3816d25a44 | ||
|
|
7f99514744 | ||
|
|
e61a55f30e | ||
|
|
e7a4384f28 | ||
|
|
b3f2fba4da | ||
|
|
d526efa501 | ||
|
|
38790af774 | ||
|
|
c45c691bf9 | ||
|
|
73201a0314 | ||
|
|
fc7706abd0 | ||
|
|
8e1a19dca2 | ||
|
|
7ddecd4006 | ||
|
|
c9c6b0dc9f | ||
|
|
2c86f68fb9 | ||
|
|
27ce401e6b | ||
|
|
39e579e656 | ||
|
|
30c361a56b | ||
|
|
1d90aa748d | ||
|
|
7874b0a74c | ||
|
|
6ab4688812 | ||
|
|
12fa8ef65a | ||
|
|
0608a0bec8 | ||
|
|
a7b32e8c6d | ||
|
|
d6e74cf9cb | ||
|
|
e8b29add3a | ||
|
|
e04b281864 | ||
|
|
eb90760b39 | ||
|
|
aed62cab26 | ||
|
|
d665f4b251 | ||
|
|
e588becf79 | ||
|
|
a2129f3e4a | ||
|
|
08ec68c07c | ||
|
|
3c30997bf5 | ||
|
|
80886afadd | ||
|
|
4a40230f23 | ||
|
|
00af2613b6 | ||
|
|
9335ee67c1 | ||
|
|
c5e2a6bcb9 | ||
|
|
5ff28a37e2 | ||
|
|
2b9cc20689 | ||
|
|
e7c15a697d | ||
|
|
38d4a26827 | ||
|
|
650faa4d22 | ||
|
|
c68d7204a1 | ||
|
|
ae0fff23b5 | ||
|
|
ccb1439c84 | ||
|
|
c7e9b0e3a6 | ||
|
|
9d45d57cb2 | ||
|
|
70dbba877a | ||
|
|
fe75cb3940 | ||
|
|
141af57e61 | ||
|
|
f5aeed444d | ||
|
|
b56df72992 | ||
|
|
e3505808dc | ||
|
|
1fd4657de7 | ||
|
|
2d61be8ff6 | ||
|
|
2b5bfff06d | ||
|
|
b6d657d001 | ||
|
|
38e898dc5d | ||
|
|
9b434bb859 | ||
|
|
aa7193d722 | ||
|
|
8df50f9ab7 | ||
|
|
92c96bc04c | ||
|
|
8b6aa7fb88 | ||
|
|
e59a8e12ba | ||
|
|
8b02db7b8c | ||
|
|
e5f9f3383a | ||
|
|
6a661264f6 | ||
|
|
f34937d92c | ||
|
|
888adc9396 | ||
|
|
c4be6a2114 | ||
|
|
7b1e7e2e7b | ||
|
|
a7529ecabf | ||
|
|
9b20a8377a | ||
|
|
b3f4a8f8c3 | ||
|
|
a313068595 | ||
|
|
861ce9ac53 | ||
|
|
7f8693948f | ||
|
|
24a41f20d2 | ||
|
|
1e0b71bbda | ||
|
|
5ed99af021 | ||
|
|
fe8f08c807 | ||
|
|
2ea7cefa3e | ||
|
|
6b6f70ce9d | ||
|
|
6730db74e6 | ||
|
|
aa7febe15b | ||
|
|
9e2f22d331 | ||
|
|
104ac2db33 | ||
|
|
789398bd27 | ||
|
|
391410a4ec | ||
|
|
106ae7a078 | ||
|
|
d02f0db0b4 | ||
|
|
8c5977088f | ||
|
|
3fa0baa396 | ||
|
|
b896897c3e | ||
|
|
2f89c5d4a7 | ||
|
|
e73c42ada3 | ||
|
|
77f9f60276 | ||
|
|
614a137128 | ||
|
|
aa3c02be93 | ||
|
|
24382a4318 | ||
|
|
3189e0e13a | ||
|
|
e0b0c9c2c1 | ||
|
|
7e4e2863b6 | ||
|
|
649337c3e5 | ||
|
|
ac376bbba9 | ||
|
|
7a76675864 | ||
|
|
752323fb7d | ||
|
|
141b3af83b | ||
|
|
8697b6c835 | ||
|
|
536b02b9fd | ||
|
|
02cbe23e78 | ||
|
|
84edeb85cd | ||
|
|
dff30d61fb | ||
|
|
933649c299 | ||
|
|
cb2ab9152f | ||
|
|
1ac910bdd1 | ||
|
|
f3a766d8b0 | ||
|
|
a65e96bdb5 | ||
|
|
ee7fdcba9f | ||
|
|
491e090fb4 | ||
|
|
5e5e52e3f1 | ||
|
|
c277c397e7 | ||
|
|
ccf9ceb729 | ||
|
|
2a046557ac | ||
|
|
debe1f41f8 | ||
|
|
5b19c8bf8b | ||
|
|
c29c6dc621 | ||
|
|
399397bd79 | ||
|
|
9495c43b4b | ||
|
|
37ffe889b5 | ||
|
|
c6dbb88dc1 | ||
|
|
1ac2ec7ad6 | ||
|
|
8df0896028 | ||
|
|
e35988e669 | ||
|
|
4d271a6d85 | ||
|
|
fdf755dbee | ||
|
|
fb1e00be81 | ||
|
|
c35e54e4fc | ||
|
|
66685d9f7f | ||
|
|
b7c8f43bcc | ||
|
|
45a5b533a3 | ||
|
|
c810e60a04 | ||
|
|
03887cb395 | ||
|
|
9b64a1bddf | ||
|
|
893873db22 | ||
|
|
8221a8de66 | ||
|
|
217525cf10 | ||
|
|
c975cf6c78 | ||
|
|
68adf8969a | ||
|
|
589c5f8ae0 | ||
|
|
1a76ade0ec | ||
|
|
032b2fbbd4 | ||
|
|
277342dced | ||
|
|
2adc11bcd6 | ||
|
|
5b84ee0c09 | ||
|
|
2c9c1e0d01 | ||
|
|
f6d79712e2 | ||
|
|
c0db64e0f2 | ||
|
|
43d85f8bc4 | ||
|
|
5aa74ca0ad | ||
|
|
5d98112a7a | ||
|
|
c48750c6f2 | ||
|
|
b7dac4db9f | ||
|
|
579ab68e19 | ||
|
|
0c82ad5944 | ||
|
|
22c078ee76 | ||
|
|
721428c88f | ||
|
|
07fa202523 | ||
|
|
919d1ef6be | ||
|
|
3927494393 | ||
|
|
14b902241d | ||
|
|
fa7aba89c2 | ||
|
|
7785c1c142 | ||
|
|
d9dafd3d14 | ||
|
|
df8c00089b | ||
|
|
741e639960 | ||
|
|
9f96639e6f | ||
|
|
ee68cf6ed5 | ||
|
|
8662dd199d | ||
|
|
2d1c2b2239 | ||
|
|
863510e707 | ||
|
|
3ce28b7316 | ||
|
|
b0e0950d12 | ||
|
|
e8ec8180a8 | ||
|
|
9bde9b66ef | ||
|
|
7f00afcef5 | ||
|
|
362d6d521f | ||
|
|
e1bc458d46 | ||
|
|
ade945219f | ||
|
|
6c654e0f90 | ||
|
|
ca43e7d9ca | ||
|
|
0a155d6f67 | ||
|
|
c9dded0947 | ||
|
|
d72c614d29 | ||
|
|
157d3050bf | ||
|
|
8a50ccdab4 | ||
|
|
99fff30489 | ||
|
|
ef122b0f39 | ||
|
|
b6b8f7a0fb | ||
|
|
8701d2c26c | ||
|
|
5080482507 | ||
|
|
392cad1cbb | ||
|
|
248cea87e8 | ||
|
|
7464c2e680 | ||
|
|
67b9ef0b8b | ||
|
|
9b2527ce6d | ||
|
|
67d4896bc7 | ||
|
|
a86f8a8a0a | ||
|
|
5fd8c9d2d0 | ||
|
|
aff5d53b1c | ||
|
|
b3f541b87e | ||
|
|
2604e2bf59 | ||
|
|
dc9eaa164d | ||
|
|
b8f54dd8e8 | ||
|
|
15ab809c38 | ||
|
|
bb04f97570 | ||
|
|
6f56522f89 | ||
|
|
6e04a2d99c | ||
|
|
e8e0df8b53 | ||
|
|
72d2152b20 | ||
|
|
89bfa0c536 | ||
|
|
1fa056bb25 | ||
|
|
a19d1573d3 | ||
|
|
c8e90b4abd | ||
|
|
e4d0ce6090 | ||
|
|
a33bd62343 | ||
|
|
0738896540 | ||
|
|
34a6a8960a | ||
|
|
02684127dd | ||
|
|
6a8345c2c8 | ||
|
|
9dae52a719 | ||
|
|
f87797d61e | ||
|
|
29dfc75fe9 | ||
|
|
af2507a689 | ||
|
|
2b90ff70fa | ||
|
|
43141a48cf | ||
|
|
0355f66e96 | ||
|
|
3049af066b | ||
|
|
b00fc756e6 | ||
|
|
555b7303d1 | ||
|
|
0a990ff66b | ||
|
|
e591c9b3cf | ||
|
|
acc6da4c15 | ||
|
|
3f3f58dc9f | ||
|
|
e30358aeaa | ||
|
|
28e0db4adf | ||
|
|
92137de325 | ||
|
|
ad90d666ca | ||
|
|
8678949c87 | ||
|
|
8f005b90f5 | ||
|
|
49183bd1fb | ||
|
|
a26970b33b | ||
|
|
f2af5e9f87 | ||
|
|
c24474b197 | ||
|
|
ec02efe873 | ||
|
|
8dc2cfc2dc | ||
|
|
ce5db84996 | ||
|
|
41967d3eec | ||
|
|
aee42f76f0 | ||
|
|
28ae2fd58a | ||
|
|
083be7e89f | ||
|
|
99510f4646 | ||
|
|
334765c977 | ||
|
|
7207925362 | ||
|
|
c9b9150b96 | ||
|
|
4d490d0f1e | ||
|
|
bc23130f9b | ||
|
|
28bc489c1a | ||
|
|
650f337c41 | ||
|
|
8de9b8ff53 | ||
|
|
8b812ba4f0 | ||
|
|
836700fb7e | ||
|
|
ba583f41b1 | ||
|
|
0e82550f6b | ||
|
|
0185ba9d46 | ||
|
|
9700b93ad1 | ||
|
|
63cb80142b | ||
|
|
c3ef225a02 | ||
|
|
b42876bb0a | ||
|
|
da4033eeab | ||
|
|
f1329a3d36 | ||
|
|
b46781c693 | ||
|
|
ef5728dcaf | ||
|
|
663a0b60dd | ||
|
|
59dbef5ee7 | ||
|
|
4caff58918 | ||
|
|
634cbe3d1b | ||
|
|
3d0c958a19 | ||
|
|
da44afdcf5 | ||
|
|
11f847cdfb | ||
|
|
5f71ee4d52 | ||
|
|
68eae92d2d | ||
|
|
9459185059 | ||
|
|
a9763e94a4 | ||
|
|
5c573b9a76 | ||
|
|
513d81eb59 | ||
|
|
2b4e357da6 | ||
|
|
ab50a41a86 | ||
|
|
7582ec8462 | ||
|
|
dd6b77a25b | ||
|
|
0091ff749a | ||
|
|
c09dff3fc8 | ||
|
|
8a59180c0e | ||
|
|
d87dc6cdf2 | ||
|
|
0af81b0831 | ||
|
|
6fd9927092 | ||
|
|
8bcda19799 | ||
|
|
5570d28d12 | ||
|
|
b8369ddb37 | ||
|
|
e1ea6392c2 | ||
|
|
011e112a1a | ||
|
|
7d396a51f5 | ||
|
|
dbf5039011 | ||
|
|
76e6c064f7 | ||
|
|
04f930dba5 | ||
|
|
08fcee67bd | ||
|
|
cc9602fbc8 | ||
|
|
c92d489017 | ||
|
|
4cf59cd92e | ||
|
|
c4ad338aed | ||
|
|
c8708d9164 | ||
|
|
9bf7247835 | ||
|
|
ed3f794226 | ||
|
|
b9f4947f8a | ||
|
|
f83d6a20a1 | ||
|
|
8ff189229b | ||
|
|
4c1de4cecc | ||
|
|
a7254fe4dd | ||
|
|
308938dcfa | ||
|
|
c11d961bf3 | ||
|
|
4e82820db7 | ||
|
|
26dac618d0 | ||
|
|
f1cc36b533 | ||
|
|
cf07f5746c | ||
|
|
a328f022cb | ||
|
|
46c7af5fdd | ||
|
|
7065c4f765 | ||
|
|
2c8d1d0a26 | ||
|
|
dab48bfc60 | ||
|
|
b0cc012849 | ||
|
|
1d028e4cf5 | ||
|
|
4dcc1af46a | ||
|
|
c57f42b44b | ||
|
|
736921bdf7 | ||
|
|
0cc7c6be3d | ||
|
|
b7bc59d599 | ||
|
|
2f92484064 | ||
|
|
b463fd4eda | ||
|
|
75aaef0f3d | ||
|
|
e7a06c42a4 | ||
|
|
5ff8463fba | ||
|
|
bc8146ef5d | ||
|
|
b25480f228 | ||
|
|
585cda36d1 | ||
|
|
b6d9c3e8e0 | ||
|
|
ce8f2e9481 | ||
|
|
cb532de83a | ||
|
|
1aebad854b | ||
|
|
9f6bc8a749 | ||
|
|
d24ff75ecf | ||
|
|
f60ffa923e | ||
|
|
19512a85d2 | ||
|
|
baa6d39e28 | ||
|
|
5d9673415a | ||
|
|
50f25b0597 | ||
|
|
0a0f8a8d89 | ||
|
|
489e35158c | ||
|
|
11d9df6e6a | ||
|
|
e5dc76cc19 | ||
|
|
ab7ec63f4b | ||
|
|
1964fdebcb | ||
|
|
5b6807b78c | ||
|
|
9603971c1f | ||
|
|
4ae8961947 | ||
|
|
0ffbc13376 | ||
|
|
a02fa44dc7 | ||
|
|
682f699e2f | ||
|
|
f3b098da75 | ||
|
|
6a963bf84b | ||
|
|
270ff1bd29 | ||
|
|
74c2926bca | ||
|
|
75aa6e90a2 | ||
|
|
3c35c16bf3 | ||
|
|
e95e8e9eac | ||
|
|
588ec2b005 | ||
|
|
0627c2f58b | ||
|
|
f6ed816243 | ||
|
|
25430a8128 | ||
|
|
79a0d5e133 | ||
|
|
018b7b7ab9 | ||
|
|
c8539dffa1 | ||
|
|
c995c6e9d7 | ||
|
|
8322d318aa | ||
|
|
4d88eab13b | ||
|
|
a3d7ae3a6b | ||
|
|
a29ced853a | ||
|
|
5047aed6ed | ||
|
|
3c46a6ef14 | ||
|
|
af3a35169a | ||
|
|
6b471994ef | ||
|
|
23ff62a9e0 | ||
|
|
2a820bd780 | ||
|
|
125178e526 | ||
|
|
e1979976a6 | ||
|
|
d87cf6980a | ||
|
|
dfce966e79 | ||
|
|
4002650748 | ||
|
|
0fa8cbf9cb | ||
|
|
7a4dbcb364 | ||
|
|
784503bdbc | ||
|
|
91b32faac2 | ||
|
|
f24d9ae389 | ||
|
|
b501014935 | ||
|
|
cc52e82524 | ||
|
|
fe42180bc0 | ||
|
|
7f67e90c53 | ||
|
|
bf001b1af6 | ||
|
|
3c65973cd5 | ||
|
|
48b2008da4 | ||
|
|
fd13fd632c | ||
|
|
b1e8f30138 | ||
|
|
fc68709956 | ||
|
|
06238a39b1 | ||
|
|
9f84162c5d | ||
|
|
6ffc9a3552 |
No files matched your search
@@ -19,8 +19,6 @@ UI/WebServerResources/.bowerrc
|
||||
UI/WebServerResources/.sass-cache/
|
||||
UI/WebServerResources/bower_components/
|
||||
UI/WebServerResources/css/
|
||||
UI/WebServerResources/css/styles.css
|
||||
UI/WebServerResources/css/styles.css.map
|
||||
UI/WebServerResources/js/*.js
|
||||
UI/WebServerResources/js/*.js.map
|
||||
UI/WebServerResources/js/vendor/*.js
|
||||
|
||||
+22
@@ -21,6 +21,7 @@ trans.hu = UI/MailerUI/Hungarian.lproj/Localizable.strings
|
||||
trans.is = UI/MailerUI/Icelandic.lproj/Localizable.strings
|
||||
trans.it = UI/MailerUI/Italian.lproj/Localizable.strings
|
||||
trans.lt = UI/MailerUI/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = UI/MailerUI/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = UI/MailerUI/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = UI/MailerUI/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = UI/MailerUI/Dutch.lproj/Localizable.strings
|
||||
@@ -35,6 +36,7 @@ trans.sr = UI/MailerUI/Serbian.lproj/Localizable.strings
|
||||
trans.sv = UI/MailerUI/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = UI/MailerUI/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = UI/MailerUI/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = UI/MailerUI/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/MailerUI/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-preferencesui]
|
||||
@@ -57,6 +59,7 @@ trans.hu = UI/PreferencesUI/Hungarian.lproj/Localizable.strings
|
||||
trans.is = UI/PreferencesUI/Icelandic.lproj/Localizable.strings
|
||||
trans.it = UI/PreferencesUI/Italian.lproj/Localizable.strings
|
||||
trans.lt = UI/PreferencesUI/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = UI/PreferencesUI/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = UI/PreferencesUI/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = UI/PreferencesUI/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = UI/PreferencesUI/Dutch.lproj/Localizable.strings
|
||||
@@ -71,6 +74,7 @@ trans.sr = UI/PreferencesUI/Serbian.lproj/Localizable.strings
|
||||
trans.sv = UI/PreferencesUI/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = UI/PreferencesUI/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = UI/PreferencesUI/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = UI/PreferencesUI/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/PreferencesUI/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-scheduler]
|
||||
@@ -93,6 +97,7 @@ trans.hu = UI/Scheduler/Hungarian.lproj/Localizable.strings
|
||||
trans.is = UI/Scheduler/Icelandic.lproj/Localizable.strings
|
||||
trans.it = UI/Scheduler/Italian.lproj/Localizable.strings
|
||||
trans.lt = UI/Scheduler/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = UI/Scheduler/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = UI/Scheduler/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = UI/Scheduler/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = UI/Scheduler/Dutch.lproj/Localizable.strings
|
||||
@@ -107,6 +112,7 @@ trans.sr = UI/Scheduler/Serbian.lproj/Localizable.strings
|
||||
trans.sv = UI/Scheduler/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = UI/Scheduler/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = UI/Scheduler/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = UI/Scheduler/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/Scheduler/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-contacts]
|
||||
@@ -129,6 +135,7 @@ trans.hu = UI/Contacts/Hungarian.lproj/Localizable.strings
|
||||
trans.is = UI/Contacts/Icelandic.lproj/Localizable.strings
|
||||
trans.it = UI/Contacts/Italian.lproj/Localizable.strings
|
||||
trans.lt = UI/Contacts/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = UI/Contacts/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = UI/Contacts/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = UI/Contacts/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = UI/Contacts/Dutch.lproj/Localizable.strings
|
||||
@@ -143,6 +150,7 @@ trans.sr = UI/Contacts/Serbian.lproj/Localizable.strings
|
||||
trans.sv = UI/Contacts/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = UI/Contacts/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = UI/Contacts/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = UI/Contacts/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/Contacts/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-mainui]
|
||||
@@ -165,6 +173,7 @@ trans.hu = UI/MainUI/Hungarian.lproj/Localizable.strings
|
||||
trans.is = UI/MainUI/Icelandic.lproj/Localizable.strings
|
||||
trans.it = UI/MainUI/Italian.lproj/Localizable.strings
|
||||
trans.lt = UI/MainUI/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = UI/MainUI/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = UI/MainUI/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = UI/MainUI/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = UI/MainUI/Dutch.lproj/Localizable.strings
|
||||
@@ -179,6 +188,7 @@ trans.sr = UI/MainUI/Serbian.lproj/Localizable.strings
|
||||
trans.sv = UI/MainUI/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = UI/MainUI/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = UI/MainUI/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = UI/MainUI/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/MainUI/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-common]
|
||||
@@ -201,6 +211,7 @@ trans.hu = UI/Common/Hungarian.lproj/Localizable.strings
|
||||
trans.is = UI/Common/Icelandic.lproj/Localizable.strings
|
||||
trans.it = UI/Common/Italian.lproj/Localizable.strings
|
||||
trans.lt = UI/Common/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = UI/Common/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = UI/Common/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = UI/Common/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = UI/Common/Dutch.lproj/Localizable.strings
|
||||
@@ -215,6 +226,7 @@ trans.sr = UI/Common/Serbian.lproj/Localizable.strings
|
||||
trans.sv = UI/Common/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = UI/Common/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = UI/Common/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = UI/Common/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/Common/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-administrationui]
|
||||
@@ -237,6 +249,7 @@ trans.hu = UI/AdministrationUI/Hungarian.lproj/Localizable.strings
|
||||
trans.is = UI/AdministrationUI/Icelandic.lproj/Localizable.strings
|
||||
trans.it = UI/AdministrationUI/Italian.lproj/Localizable.strings
|
||||
trans.lt = UI/AdministrationUI/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = UI/AdministrationUI/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = UI/AdministrationUI/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = UI/AdministrationUI/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = UI/AdministrationUI/Dutch.lproj/Localizable.strings
|
||||
@@ -251,6 +264,7 @@ trans.sr = UI/AdministrationUI/Serbian.lproj/Localizable.strings
|
||||
trans.sv = UI/AdministrationUI/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = UI/AdministrationUI/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = UI/AdministrationUI/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = UI/AdministrationUI/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/AdministrationUI/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.soobjects-appointments]
|
||||
@@ -273,6 +287,7 @@ trans.hu = SoObjects/Appointments/Hungarian.lproj/Localizable.strings
|
||||
trans.is = SoObjects/Appointments/Icelandic.lproj/Localizable.strings
|
||||
trans.it = SoObjects/Appointments/Italian.lproj/Localizable.strings
|
||||
trans.lt = SoObjects/Appointments/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = SoObjects/Appointments/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = SoObjects/Appointments/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = SoObjects/Appointments/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = SoObjects/Appointments/Dutch.lproj/Localizable.strings
|
||||
@@ -287,6 +302,7 @@ trans.sr = SoObjects/Appointments/Serbian.lproj/Localizable.strings
|
||||
trans.sv = SoObjects/Appointments/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = SoObjects/Appointments/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = SoObjects/Appointments/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = SoObjects/Appointments/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = SoObjects/Appointments/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.soobjects-contacts]
|
||||
@@ -309,6 +325,7 @@ trans.hu = SoObjects/Contacts/Hungarian.lproj/Localizable.strings
|
||||
trans.is = SoObjects/Contacts/Icelandic.lproj/Localizable.strings
|
||||
trans.it = SoObjects/Contacts/Italian.lproj/Localizable.strings
|
||||
trans.lt = SoObjects/Contacts/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = SoObjects/Contacts/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = SoObjects/Contacts/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = SoObjects/Contacts/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = SoObjects/Contacts/Dutch.lproj/Localizable.strings
|
||||
@@ -323,6 +340,7 @@ trans.sr = SoObjects/Contacts/Serbian.lproj/Localizable.strings
|
||||
trans.sv = SoObjects/Contacts/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = SoObjects/Contacts/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = SoObjects/Contacts/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = SoObjects/Contacts/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = SoObjects/Contacts/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.soobjects-mailer]
|
||||
@@ -345,6 +363,7 @@ trans.hu = SoObjects/Mailer/Hungarian.lproj/Localizable.strings
|
||||
trans.is = SoObjects/Mailer/Icelandic.lproj/Localizable.strings
|
||||
trans.it = SoObjects/Mailer/Italian.lproj/Localizable.strings
|
||||
trans.lt = SoObjects/Mailer/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = SoObjects/Mailer/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = SoObjects/Mailer/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = SoObjects/Mailer/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = SoObjects/Mailer/Dutch.lproj/Localizable.strings
|
||||
@@ -359,6 +378,7 @@ trans.sr = SoObjects/Mailer/Serbian.lproj/Localizable.strings
|
||||
trans.sv = SoObjects/Mailer/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = SoObjects/Mailer/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = SoObjects/Mailer/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = SoObjects/Mailer/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = SoObjects/Mailer/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-mailpartviewers]
|
||||
@@ -381,6 +401,7 @@ trans.hu = UI/MailPartViewers/Hungarian.lproj/Localizable.strings
|
||||
trans.is = UI/MailPartViewers/Icelandic.lproj/Localizable.strings
|
||||
trans.it = UI/MailPartViewers/Italian.lproj/Localizable.strings
|
||||
trans.lt = UI/MailPartViewers/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = UI/MailPartViewers/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = UI/MailPartViewers/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = UI/MailPartViewers/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = UI/MailPartViewers/Dutch.lproj/Localizable.strings
|
||||
@@ -395,4 +416,5 @@ trans.sr = UI/MailPartViewers/Serbian.lproj/Localizable.strings
|
||||
trans.sv = UI/MailPartViewers/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = UI/MailPartViewers/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = UI/MailPartViewers/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = UI/MailPartViewers/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/MailPartViewers/ChineseTaiwan.lproj/Localizable.strings
|
||||
@@ -34,6 +34,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
static NSArray *asElementArray = nil;
|
||||
static NSArray *considerAsSameArray = nil;
|
||||
|
||||
@implementation NGDOMElement (ActiveSync)
|
||||
|
||||
@@ -101,7 +102,44 @@ static NSArray *asElementArray = nil;
|
||||
int i, count;
|
||||
|
||||
if (!asElementArray)
|
||||
asElementArray = [[NSArray alloc] initWithObjects: @"Attendee", @"Category", @"Exception", nil];
|
||||
asElementArray = [[NSArray alloc] initWithObjects: @"Attendee", @"Category", @"Exception", @"Add", @"Delete", nil];
|
||||
|
||||
// FIXME
|
||||
/* if the client sends
|
||||
<attachments>
|
||||
<add>
|
||||
...
|
||||
</add>
|
||||
<add>
|
||||
...
|
||||
</add>
|
||||
</attachments>
|
||||
|
||||
the result is a NSarray i.e. {add1; add2; ...}
|
||||
|
||||
if the client sends
|
||||
|
||||
<attachments>
|
||||
<add>
|
||||
...
|
||||
</add>
|
||||
<add>
|
||||
...
|
||||
</add>
|
||||
<delete>
|
||||
...
|
||||
</delete>
|
||||
<delete>
|
||||
...
|
||||
</delete>
|
||||
</attachments>
|
||||
|
||||
|
||||
the result is a NSDictionary ie. Add = { }; Delete = { }; the dictionary would contain only one entry for add
|
||||
*/
|
||||
if (!considerAsSameArray)
|
||||
considerAsSameArray = [[NSArray alloc] initWithObjects: @"Add", @"Delete", nil];
|
||||
|
||||
|
||||
data = [NSMutableDictionary dictionary];
|
||||
|
||||
@@ -151,7 +189,7 @@ static NSArray *asElementArray = nil;
|
||||
if (!innerTag)
|
||||
innerTag = [innerElement tagName];
|
||||
|
||||
if ([innerTag isEqualToString: [innerElement tagName]])
|
||||
if ([innerTag isEqualToString: [innerElement tagName]] || [considerAsSameArray containsObject: innerTag])
|
||||
{
|
||||
if ([(id)innerElement isTextNode])
|
||||
[innerElements addObject: [(NGDOMElement *)innerElement textValue]];
|
||||
|
||||
@@ -53,9 +53,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import <SOGo/SOGoCacheGCSObject.h>
|
||||
#import <SOGo/SOGoPermissions.h>
|
||||
|
||||
#import <NGCards/iCalCalendar.h>
|
||||
|
||||
#import <Appointments/iCalEntityObject+SOGo.h>
|
||||
#import <Appointments/SOGoAppointmentObject.h>
|
||||
#import <Appointments/SOGoTaskObject.h>
|
||||
#import <Appointments/SOGoAppointmentFolder.h>
|
||||
|
||||
#import <Contacts/SOGoContactGCSEntry.h>
|
||||
|
||||
@@ -227,7 +230,26 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
return nameInCache;
|
||||
}
|
||||
|
||||
- (void) _removeAllAlarmsFromCalendar: (iCalCalendar *) theCalendar
|
||||
{
|
||||
NSArray *allComponents;
|
||||
iCalEntityObject *currentComponent;
|
||||
NSUInteger count, max;
|
||||
|
||||
if (debugOn)
|
||||
[self logWithFormat: @"EAS - Remove all alarms"];
|
||||
|
||||
allComponents = [theCalendar allObjects];
|
||||
|
||||
max = [allComponents count];
|
||||
for (count = 0; count < max; count++)
|
||||
{
|
||||
currentComponent = [allComponents objectAtIndex: count];
|
||||
if ([currentComponent isKindOfClass: [iCalEvent class]] ||
|
||||
[currentComponent isKindOfClass: [iCalToDo class]])
|
||||
[currentComponent removeAllAlarms];
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// <?xml version="1.0"?>
|
||||
@@ -289,8 +311,34 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
anAddition = [additions objectAtIndex: i];
|
||||
is_new = YES;
|
||||
|
||||
clientId = [[(id)[anAddition getElementsByTagName: @"ClientId"] lastObject] textValue];
|
||||
|
||||
/*
|
||||
FIXME
|
||||
<Add>
|
||||
<ClientId>338</ClientId>
|
||||
<ApplicationData>
|
||||
<To xmlns="Email:"><foot@bar.com></To>
|
||||
<Cc xmlns="Email:"/>
|
||||
<Subject xmlns="Email:">test</Subject>
|
||||
<Reply-To xmlns="Email:">foo@bar.com</Reply-To>
|
||||
<Importance xmlns="Email:">1</Importance>
|
||||
<Read xmlns="Email:">1</Read>
|
||||
<Attachments xmlns="AirSyncBase:">
|
||||
<Add>
|
||||
<ClientId>152-ab557915-8451-49a7-a9c6-a9ac153021ad</ClientId>
|
||||
|
||||
|
||||
-> lastObject returns the ClientId in Attachments element -> try with objectAtIndex: 0 -> is this correct?
|
||||
*/
|
||||
//clientId = [[(id)[anAddition getElementsByTagName: @"ClientId"] lastObject] textValue];
|
||||
clientId = [[(id)[anAddition getElementsByTagName: @"ClientId"] objectAtIndex: 0] textValue];
|
||||
|
||||
allValues = [NSMutableDictionary dictionaryWithDictionary: [[(id)[anAddition getElementsByTagName: @"ApplicationData"] lastObject] applicationData]];
|
||||
|
||||
// FIXME: ignore the <Add> elements of Attachemnts - above (id)[theDocumentElement getElementsByTagName: @"Add"]; return any <Add> elements instead of only the direct childs of the <commands> element ..
|
||||
if (![allValues count])
|
||||
continue;
|
||||
|
||||
|
||||
switch (theFolderType)
|
||||
{
|
||||
@@ -309,8 +357,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
// the case, let's just update it. This can happen if for example, an iOS based device receives the
|
||||
// invitation email and choses "Add to calendar" BEFORE actually syncing the calendar. That would
|
||||
// create a duplicate on the server.
|
||||
if ([allValues objectForKey: @"UID"])
|
||||
serverId = [allValues objectForKey: @"UID"];
|
||||
if ([allValues objectForKey: ([[context objectForKey: @"ASProtocolVersion"] floatValue] >= 16.0) ? @"ClientUid" : @"UID"])
|
||||
serverId = [allValues objectForKey: ([[context objectForKey: @"ASProtocolVersion"] floatValue] >= 16.0) ? @"ClientUid" : @"UID"];
|
||||
else
|
||||
serverId = [theCollection globallyUniqueObjectId];
|
||||
|
||||
@@ -345,9 +393,49 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
case ActiveSyncMailFolder:
|
||||
default:
|
||||
{
|
||||
// FIXME - what to do?
|
||||
[self errorWithFormat: @"Fatal error occured - tried to call -processSyncAddCommand: ... on a mail folder. We abort."];
|
||||
abort();
|
||||
// Support Draft Mail/SMS to Exchange eMail sync.
|
||||
NSString *serverId;
|
||||
NSMutableString *s;
|
||||
NSDictionary *result;
|
||||
NSNumber *modseq;
|
||||
|
||||
serverId = nil;
|
||||
s = [NSMutableString string];
|
||||
|
||||
sogoObject = [SOGoMailObject objectWithName: @"Mail" inContainer: theCollection];
|
||||
serverId = [sogoObject storeMail: allValues inBuffer: s inContext: context];
|
||||
if (serverId)
|
||||
{
|
||||
sogoObject = [theCollection lookupName: serverId inContext: context acquire: 0];
|
||||
[sogoObject takeActiveSyncValues: allValues inContext: context];
|
||||
|
||||
// Everything is fine, lets generate our response
|
||||
[theBuffer appendString: @"<Add>"];
|
||||
[theBuffer appendFormat: @"<ClientId>%@</ClientId>", clientId];
|
||||
[theBuffer appendFormat: @"<ServerId>%@</ServerId>", serverId];
|
||||
[theBuffer appendFormat: @"<Status>%d</Status>", 1];
|
||||
[theBuffer appendString: s];
|
||||
[theBuffer appendString: @"</Add>"];
|
||||
|
||||
|
||||
folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: theCollection withType: theFolderType]];
|
||||
syncCache = [folderMetadata objectForKey: @"SyncCache"];
|
||||
|
||||
result = [sogoObject fetchParts: [NSArray arrayWithObject: @"MODSEQ"]];
|
||||
modseq = [[[result objectForKey: @"RawResponse"] objectForKey: @"fetch"] objectForKey: @"modseq"];
|
||||
|
||||
[syncCache setObject: [modseq stringValue] forKey: serverId];
|
||||
|
||||
[self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]];
|
||||
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
// FIXME - what to do?
|
||||
[self errorWithFormat: @"Fatal error occured - tried to call -processSyncAddCommand: ... on a mail folder. We abort."];
|
||||
abort();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -624,6 +712,24 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
NSDictionary *result;
|
||||
NSNumber *modseq;
|
||||
|
||||
// Process an update to a Draft Mail.
|
||||
if ([allChanges objectForKey: @"Body"])
|
||||
{
|
||||
NSString *serverId;
|
||||
NSMutableString *s;
|
||||
|
||||
serverId = nil;
|
||||
s = [NSMutableString string];
|
||||
|
||||
serverId = [sogoObject storeMail: allChanges inBuffer: s inContext: context];
|
||||
if (serverId)
|
||||
{
|
||||
// we delete the original email - next sync will update the client with the new mail
|
||||
[sogoObject delete];
|
||||
sogoObject = [theCollection lookupName: serverId inContext: context acquire: 0];
|
||||
}
|
||||
}
|
||||
|
||||
[sogoObject takeActiveSyncValues: allChanges inContext: context];
|
||||
|
||||
result = [sogoObject fetchParts: [NSArray arrayWithObject: @"MODSEQ"]];
|
||||
@@ -638,7 +744,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
[theBuffer appendString: @"<Change>"];
|
||||
[theBuffer appendFormat: @"<ServerId>%@</ServerId>", origServerId];
|
||||
[theBuffer appendFormat: @"<Status>%d</Status>", 1];
|
||||
|
||||
// A body element is sent only for draft mails - status 8 will delete the mail on the client - the next sync update fetch the new mail
|
||||
if ([allChanges objectForKey: @"Body"] && theFolderType == ActiveSyncMailFolder)
|
||||
[theBuffer appendFormat: @"<Status>%d</Status>", 8];
|
||||
else
|
||||
[theBuffer appendFormat: @"<Status>%d</Status>", 1];
|
||||
|
||||
[theBuffer appendString: @"</Change>"];
|
||||
}
|
||||
}
|
||||
@@ -1221,6 +1333,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
d = [NSCalendarDate distantFuture];
|
||||
|
||||
[dateCache setObject: d forKey: uid];
|
||||
|
||||
if (!([theCollection showCalendarAlarms]))
|
||||
[self _removeAllAlarmsFromCalendar: [componentObject parent]];
|
||||
}
|
||||
|
||||
if (updated)
|
||||
@@ -1581,7 +1696,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
[s appendString: [mailObject activeSyncRepresentationInContext: context]];
|
||||
[s appendString: @"</ApplicationData>"];
|
||||
[s appendString: @"</Add>"];
|
||||
|
||||
|
||||
[syncCache setObject: [aCacheObject sequence] forKey: [aCacheObject uid]];
|
||||
[dateCache setObject: [NSCalendarDate date] forKey: [aCacheObject uid]];
|
||||
|
||||
@@ -2540,7 +2655,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
{
|
||||
int t;
|
||||
|
||||
[self logWithFormat: @"Sleeping %d seconds while detecting changes in Sync...", internalInterval-total_sleep];
|
||||
[self logWithFormat: @"Sleeping %d seconds while detecting changes for user %@ in Sync...", internalInterval-total_sleep, [[context activeUser] login]];
|
||||
|
||||
for (t = 0; t < sleepInterval; t++)
|
||||
{
|
||||
|
||||
@@ -741,14 +741,14 @@ void handle_eas_terminate(int signum)
|
||||
{
|
||||
[[theFolders objectAtIndex: i] setObject: theExistingParent forKey: @"parent"];
|
||||
[[theFolders objectAtIndex: i] setObject:
|
||||
[[[[theFolders objectAtIndex: i] objectForKey: @"path"] substringFromIndex: [theExistingParent length]+1]stringByReplacingOccurrencesOfString:@"/" withString:@"."]
|
||||
[[[[[theFolders objectAtIndex: i] objectForKey: @"path"] substringFromIndex: [theExistingParent length]+1]stringByReplacingOccurrencesOfString:@"/" withString:@"."] stringByDecodingImap4FolderName]
|
||||
forKey: @"name"];
|
||||
}
|
||||
else if (![[[theFolders objectAtIndex: i] objectForKey: @"type"] isEqualToString: @"otherUsers"] &&
|
||||
![[[theFolders objectAtIndex: i] objectForKey: @"type"] isEqualToString: @"shared"])
|
||||
{
|
||||
[[theFolders objectAtIndex: i] setObject:
|
||||
[[[theFolders objectAtIndex: i] objectForKey: @"path"] stringByReplacingOccurrencesOfString:@"/" withString:@"."]
|
||||
[[[[theFolders objectAtIndex: i] objectForKey: @"path"] stringByReplacingOccurrencesOfString:@"/" withString:@"."] stringByDecodingImap4FolderName]
|
||||
forKey: @"name"];
|
||||
}
|
||||
|
||||
@@ -1151,38 +1151,45 @@ void handle_eas_terminate(int signum)
|
||||
|
||||
name = [NSString stringWithFormat: @"vtodo/%@", [[folders objectAtIndex:fi] nameInContainer]];
|
||||
type = ([[[folders objectAtIndex:fi] nameInContainer] isEqualToString: personalFolderName] ? 7 : 15);
|
||||
[commands appendFormat: @"<%@><ServerId>%@</ServerId><ParentId>%@</ParentId><DisplayName>%@</DisplayName><Type>%d</Type></%@>", operation,
|
||||
[name stringByEscapingURL], @"0", [[[folders objectAtIndex:fi] displayName] activeSyncRepresentationInContext: context], type, operation];
|
||||
|
||||
command_count++;
|
||||
key = [NSString stringWithFormat: @"%@+%@", [context objectForKey: @"DeviceId"], name];
|
||||
|
||||
o = [SOGoCacheGCSObject objectWithName: key inContainer: nil];
|
||||
[o setObjectType: ActiveSyncFolderCacheObject];
|
||||
[o setTableUrl: [self folderTableURL]];
|
||||
[o reloadIfNeeded];
|
||||
[[o properties ] setObject: [[folders objectAtIndex:fi] displayName] forKey: @"displayName"];
|
||||
|
||||
if ([operation isEqualToString: @"Add"])
|
||||
// We always sync the "Default Tasks folder" (7). For "User-created Tasks folder" (15), we check if we include it in
|
||||
// the sync process by checking if "Show tasks" is enabled. If not, we skip the folder entirely.
|
||||
if (type == 7 ||
|
||||
(type == 15 && [[folders objectAtIndex: fi] showCalendarTasks]))
|
||||
{
|
||||
// clean cache content to avoid stale data
|
||||
[[o properties] removeObjectForKey: @"SyncKey"];
|
||||
[[o properties] removeObjectForKey: @"SyncCache"];
|
||||
[[o properties] removeObjectForKey: @"DateCache"];
|
||||
[[o properties] removeObjectForKey: @"UidCache"];
|
||||
[[o properties] removeObjectForKey: @"MoreAvailable"];
|
||||
[[o properties] removeObjectForKey: @"BodyPreferenceType"];
|
||||
[[o properties] removeObjectForKey: @"SupportedElements"];
|
||||
[[o properties] removeObjectForKey: @"SuccessfulMoveItemsOps"];
|
||||
[[o properties] removeObjectForKey: @"InitialLoadSequence"];
|
||||
[[o properties] removeObjectForKey: @"FirstIdInCache"];
|
||||
[[o properties] removeObjectForKey: @"LastIdInCache"];
|
||||
[[o properties] removeObjectForKey: @"MergedFoldersSyncKeys"];
|
||||
[[o properties] removeObjectForKey: @"MergedFolder"];
|
||||
[[o properties] removeObjectForKey: @"CleanoutDate"];
|
||||
}
|
||||
[commands appendFormat: @"<%@><ServerId>%@</ServerId><ParentId>%@</ParentId><DisplayName>%@</DisplayName><Type>%d</Type></%@>", operation,
|
||||
[name stringByEscapingURL], @"0", [[[folders objectAtIndex:fi] displayName] activeSyncRepresentationInContext: context], type, operation];
|
||||
|
||||
[o save];
|
||||
command_count++;
|
||||
|
||||
key = [NSString stringWithFormat: @"%@+%@", [context objectForKey: @"DeviceId"], name];
|
||||
o = [SOGoCacheGCSObject objectWithName: key inContainer: nil];
|
||||
[o setObjectType: ActiveSyncFolderCacheObject];
|
||||
[o setTableUrl: [self folderTableURL]];
|
||||
[o reloadIfNeeded];
|
||||
[[o properties ] setObject: [[folders objectAtIndex:fi] displayName] forKey: @"displayName"];
|
||||
|
||||
if ([operation isEqualToString: @"Add"])
|
||||
{
|
||||
// clean cache content to avoid stale data
|
||||
[[o properties] removeObjectForKey: @"SyncKey"];
|
||||
[[o properties] removeObjectForKey: @"SyncCache"];
|
||||
[[o properties] removeObjectForKey: @"DateCache"];
|
||||
[[o properties] removeObjectForKey: @"UidCache"];
|
||||
[[o properties] removeObjectForKey: @"MoreAvailable"];
|
||||
[[o properties] removeObjectForKey: @"BodyPreferenceType"];
|
||||
[[o properties] removeObjectForKey: @"SupportedElements"];
|
||||
[[o properties] removeObjectForKey: @"SuccessfulMoveItemsOps"];
|
||||
[[o properties] removeObjectForKey: @"InitialLoadSequence"];
|
||||
[[o properties] removeObjectForKey: @"FirstIdInCache"];
|
||||
[[o properties] removeObjectForKey: @"LastIdInCache"];
|
||||
[[o properties] removeObjectForKey: @"MergedFoldersSyncKeys"];
|
||||
[[o properties] removeObjectForKey: @"MergedFolder"];
|
||||
[[o properties] removeObjectForKey: @"CleanoutDate"];
|
||||
}
|
||||
|
||||
[o save];
|
||||
}
|
||||
}
|
||||
else if ([[folders objectAtIndex:fi] isKindOfClass: [SOGoContactGCSFolder class]])
|
||||
{
|
||||
@@ -1215,8 +1222,8 @@ void handle_eas_terminate(int signum)
|
||||
|
||||
[o save];
|
||||
}
|
||||
}
|
||||
}
|
||||
} // if (operation)
|
||||
} // for (fi = 0; fi <= count ; fi++)
|
||||
|
||||
|
||||
// set a new syncKey if there are folder changes
|
||||
@@ -2432,7 +2439,7 @@ void handle_eas_terminate(int signum)
|
||||
{
|
||||
int t;
|
||||
|
||||
[self logWithFormat: @"Sleeping %d seconds while detecting changes in Ping...", internalInterval-total_sleep];
|
||||
[self logWithFormat: @"Sleeping %d seconds while detecting changes for user %@ in Ping...", internalInterval-total_sleep, [[context activeUser] login]];
|
||||
|
||||
for (t = 0; t < sleepInterval; t++)
|
||||
{
|
||||
@@ -2759,7 +2766,7 @@ void handle_eas_terminate(int signum)
|
||||
inResponse: (WOResponse *) theResponse
|
||||
{
|
||||
SOGoContactSourceFolder *currentFolder;
|
||||
NSArray *allKeys, *allContacts, *mails;
|
||||
NSArray *allKeys, *allContacts, *mails, *a;
|
||||
NSDictionary *systemSources, *contact;
|
||||
SOGoContactFolders *contactFolders;
|
||||
NSString *current_mail, *query;
|
||||
@@ -2769,7 +2776,10 @@ void handle_eas_terminate(int signum)
|
||||
NSData *d;
|
||||
id o;
|
||||
|
||||
int i, j, total;
|
||||
int i, j, t, v, total, minResult, maxResult, maxSize, maxPictures;
|
||||
BOOL withPhoto;
|
||||
|
||||
withPhoto = NO;
|
||||
|
||||
query = [[(id)[theDocumentElement getElementsByTagName: @"Query"] lastObject] textValue];
|
||||
|
||||
@@ -2778,6 +2788,33 @@ void handle_eas_terminate(int signum)
|
||||
systemSources = [contactFolders systemSources];
|
||||
allKeys = [systemSources allKeys];
|
||||
|
||||
// We check for the maximum number of results to return.
|
||||
a = [[[(id)[theDocumentElement getElementsByTagName: @"Range"] lastObject] textValue] componentsSeparatedByString: @"-"];
|
||||
minResult = [[a objectAtIndex: 0] intValue];
|
||||
maxResult = [[a objectAtIndex: 1] intValue];
|
||||
|
||||
if (maxResult == 0)
|
||||
maxResult = 99;
|
||||
|
||||
if ((o = [(id)[[(id)[theDocumentElement getElementsByTagName: @"Options"] lastObject] getElementsByTagName: @"Picture"] lastObject]))
|
||||
{
|
||||
withPhoto = YES;
|
||||
|
||||
// We check for a MaxSize, default to 102400.
|
||||
maxSize = [[[(id)[o getElementsByTagName: @"MaxSize"] lastObject] textValue] intValue];
|
||||
|
||||
// We check if we must overwrite the maxSize with a system preference. This can be useful
|
||||
// if we don't want to have pictures in the response.
|
||||
if ((v = [[SOGoSystemDefaults sharedSystemDefaults] maximumPictureSize]))
|
||||
maxSize = v;
|
||||
|
||||
// We check for a MaxPictures, default to 99.
|
||||
maxPictures = [[[(id)[o getElementsByTagName: @"MaxPictures"] lastObject] textValue] intValue];
|
||||
|
||||
if (maxPictures == 0)
|
||||
maxPictures = 99;
|
||||
}
|
||||
|
||||
s = [NSMutableString string];
|
||||
|
||||
[s appendString: @"<?xml version=\"1.0\" encoding=\"utf-8\"?>"];
|
||||
@@ -2794,12 +2831,12 @@ void handle_eas_terminate(int signum)
|
||||
{
|
||||
currentFolder = [systemSources objectForKey: [allKeys objectAtIndex: i]];
|
||||
allContacts = [currentFolder lookupContactsWithFilter: query
|
||||
onCriteria: @"name_or_address"
|
||||
onCriteria: nil
|
||||
sortBy: @"c_cn"
|
||||
ordering: NSOrderedAscending
|
||||
inDomain: [[context activeUser] domain]];
|
||||
|
||||
for (j = 0; j < [allContacts count]; j++)
|
||||
for (j = minResult; (j < [allContacts count] && j < maxResult) ; j++)
|
||||
{
|
||||
contact = [allContacts objectAtIndex: j];
|
||||
|
||||
@@ -2817,9 +2854,9 @@ void handle_eas_terminate(int signum)
|
||||
else
|
||||
mails = [NSArray arrayWithObjects: o ? o : @"", nil];
|
||||
|
||||
for (total = 0; total < [mails count]; total++)
|
||||
for (t = 0; t < [mails count]; t++)
|
||||
{
|
||||
current_mail = [mails objectAtIndex: total];
|
||||
current_mail = [mails objectAtIndex: t];
|
||||
|
||||
[s appendString: @"<Result xmlns=\"Search:\">"];
|
||||
[s appendString: @"<Properties>"];
|
||||
@@ -2837,7 +2874,7 @@ void handle_eas_terminate(int signum)
|
||||
[s appendFormat: @"<LastName xmlns=\"Gal:\">%@</LastName>", [o activeSyncRepresentationInContext: context]];
|
||||
|
||||
if ([current_mail length] > 0)
|
||||
[s appendFormat: @"<EmailAddress xmlns=\"Gal:\">%@</EmailAddress>", current_mail];
|
||||
[s appendFormat: @"<EmailAddress xmlns=\"Gal:\">%@</EmailAddress>", [current_mail activeSyncRepresentationInContext: context]];
|
||||
|
||||
if ((o = [contact objectForKey: @"telephonenumber"]))
|
||||
[s appendFormat: @"<Phone xmlns=\"Gal:\">%@</Phone>", [o activeSyncRepresentationInContext: context]];
|
||||
@@ -2850,9 +2887,27 @@ void handle_eas_terminate(int signum)
|
||||
|
||||
if ((o = [contact objectForKey: @"o"]))
|
||||
[s appendFormat: @"<Company xmlns=\"Gal:\">%@</Company>", [o activeSyncRepresentationInContext: context]];
|
||||
|
||||
|
||||
if ([[context objectForKey: @"ASProtocolVersion"] floatValue] >= 14.1 && withPhoto)
|
||||
{
|
||||
o = [contact objectForKey: @"photo"];
|
||||
if (o && [o length] <= maxSize && total < maxPictures)
|
||||
{
|
||||
[s appendString: @"<Picture xmlns=\"Gal:\"><Status>1</Status><Data>"];
|
||||
[s appendString: [o activeSyncRepresentationInContext: context]];
|
||||
[s appendString: @"</Data></Picture>"];
|
||||
}
|
||||
else if (!o)
|
||||
[s appendString: @"<Picture xmlns=\"Gal:\"><Status>173</Status></Picture>"];
|
||||
else if ([o length] > maxSize)
|
||||
[s appendString: @"<Picture xmlns=\"Gal:\"><Status>174</Status></Picture>"];
|
||||
else if (total >= maxPictures)
|
||||
[s appendString: @"<Picture xmlns=\"Gal:\"><Status>175</Status></Picture>"];
|
||||
}
|
||||
|
||||
[s appendString: @"</Properties>"];
|
||||
[s appendString: @"</Result>"];
|
||||
total++;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3541,10 +3596,14 @@ void handle_eas_terminate(int signum)
|
||||
{
|
||||
NSString *folderId, *itemId, *realCollectionId;
|
||||
SOGoMicrosoftActiveSyncFolderType folderType;
|
||||
SOGoMailAccounts *accountsFolder;
|
||||
SOGoMailFolder *currentFolder;
|
||||
SOGoUserFolder *userFolder;
|
||||
SOGoMailObject *mailObject;
|
||||
SOGoUserDefaults *ud;
|
||||
|
||||
BOOL htmlComposition, isHTML;
|
||||
id value;
|
||||
id value, currentCollection;
|
||||
|
||||
isHTML = NO;
|
||||
ud = [[context activeUser] userDefaults];
|
||||
@@ -3570,23 +3629,31 @@ void handle_eas_terminate(int signum)
|
||||
|
||||
value = [theDocumentElement getElementsByTagName: @"ReplaceMime"];
|
||||
|
||||
// We fetch the mail object from the server
|
||||
userFolder = [[context activeUser] homeFolderInContext: context];
|
||||
accountsFolder = [userFolder lookupName: @"Mail" inContext: context acquire: NO];
|
||||
currentFolder = [accountsFolder lookupName: @"0" inContext: context acquire: NO];
|
||||
|
||||
currentCollection = [currentFolder lookupName: [NSString stringWithFormat: @"folder%@", realCollectionId]
|
||||
inContext: context
|
||||
acquire: NO];
|
||||
|
||||
mailObject = [currentCollection lookupName: itemId inContext: context acquire: NO];
|
||||
|
||||
// ReplaceMime IS specified so we must NOT use the server copy
|
||||
// but rather take the data as-is from the client.
|
||||
if ([value count])
|
||||
{
|
||||
[self processSendMail: theDocumentElement
|
||||
inResponse: theResponse];
|
||||
[self processSendMail: theDocumentElement inResponse: theResponse];
|
||||
if (!isSmartForward)
|
||||
[mailObject addFlags: @"Answered"];
|
||||
else
|
||||
[mailObject addFlags: @"$Forwarded"];
|
||||
return;
|
||||
}
|
||||
|
||||
if (folderType == ActiveSyncMailFolder)
|
||||
{
|
||||
SOGoMailAccounts *accountsFolder;
|
||||
SOGoMailFolder *currentFolder;
|
||||
SOGoUserFolder *userFolder;
|
||||
SOGoMailObject *mailObject;
|
||||
id currentCollection;
|
||||
|
||||
NGMimeMessage *messageFromSmartForward, *messageToSend;
|
||||
NGMimeMessageParser *parser;
|
||||
NSData *data;
|
||||
@@ -3605,16 +3672,6 @@ void handle_eas_terminate(int signum)
|
||||
|
||||
int a;
|
||||
|
||||
userFolder = [[context activeUser] homeFolderInContext: context];
|
||||
accountsFolder = [userFolder lookupName: @"Mail" inContext: context acquire: NO];
|
||||
currentFolder = [accountsFolder lookupName: @"0" inContext: context acquire: NO];
|
||||
|
||||
currentCollection = [currentFolder lookupName: [NSString stringWithFormat: @"folder%@", realCollectionId]
|
||||
inContext: context
|
||||
acquire: NO];
|
||||
|
||||
mailObject = [currentCollection lookupName: itemId inContext: context acquire: NO];
|
||||
|
||||
parser = [[NGMimeMessageParser alloc] init];
|
||||
data = [[[[(id)[theDocumentElement getElementsByTagName: @"MIME"] lastObject] textValue] stringByDecodingBase64] dataUsingEncoding: NSUTF8StringEncoding];
|
||||
messageFromSmartForward = [parser parsePartFromData: data];
|
||||
|
||||
@@ -42,6 +42,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
- (NSString *) activeSyncRepresentationInContext: (WOContext *) context;
|
||||
- (void) takeActiveSyncValues: (NSDictionary *) theValues
|
||||
inContext: (WOContext *) context;
|
||||
- (NSString *) storeMail: (NSDictionary *) theValues
|
||||
inBuffer: (NSMutableString *) theBuffer
|
||||
inContext: (WOContext *) _context;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@@ -34,6 +34,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import <Foundation/NSException.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSCharacterSet.h>
|
||||
#import <Foundation/NSTimeZone.h>
|
||||
|
||||
#import <NGCards/iCalCalendar.h>
|
||||
#import <NGCards/iCalDateTime.h>
|
||||
@@ -44,9 +45,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#import <NGExtensions/NSString+misc.h>
|
||||
#import <NGExtensions/NSString+Encoding.h>
|
||||
#import <NGExtensions/NGHashMap.h>
|
||||
#import <NGImap4/NGImap4Envelope.h>
|
||||
#import <NGImap4/NGImap4EnvelopeAddress.h>
|
||||
#import <NGImap4/NSString+Imap4.h>
|
||||
#import <NGImap4/NGImap4Connection.h>
|
||||
#import <NGImap4/NGImap4Client.h>
|
||||
#import <NGObjWeb/WOContext+SoObjects.h>
|
||||
#import <NGObjWeb/WOApplication.h>
|
||||
#import <NGObjWeb/WORequest.h>
|
||||
@@ -60,6 +64,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import <NGMail/NGMimeMessageGenerator.h>
|
||||
|
||||
#import <SOGo/SOGoUserDefaults.h>
|
||||
#import <SOGo/SOGoUserFolder.h>
|
||||
#import <SOGo/NSArray+Utilities.h>
|
||||
|
||||
#include "iCalTimeZone+ActiveSync.h"
|
||||
#include "NSData+ActiveSync.h"
|
||||
@@ -71,6 +77,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#include <Mailer/SOGoMailBodyPart.h>
|
||||
#include <Mailer/NSString+Mail.h>
|
||||
|
||||
#import <Mailer/SOGoMailLabel.h>
|
||||
#import <Mailer/SOGoMailFolder.h>
|
||||
#import <Mailer/SOGoMailObject.h>
|
||||
#import <Mailer/SOGoMailAccount.h>
|
||||
#import <Mailer/SOGoMailAccounts.h>
|
||||
|
||||
#include <SOGo/SOGoUser.h>
|
||||
#include <SOGo/NSString+Utilities.h>
|
||||
|
||||
@@ -972,7 +984,12 @@ struct GlobalObjectId {
|
||||
|
||||
// Location
|
||||
if ([[event location] length])
|
||||
[s appendFormat: @"<Location xmlns=\"Email:\">%@</Location>", [[event location] activeSyncRepresentationInContext: context]];
|
||||
{
|
||||
if ([[context objectForKey: @"ASProtocolVersion"] floatValue] >= 16.0)
|
||||
[s appendFormat: @"<Location xmlns=\"AirSyncBase:\"><DisplayName>%@</DisplayName></Location>", [[event location] activeSyncRepresentationInContext: context]];
|
||||
else
|
||||
[s appendFormat: @"<Location xmlns=\"Email:\">%@</Location>", [[event location] activeSyncRepresentationInContext: context]];
|
||||
}
|
||||
|
||||
[s appendFormat: @"<Organizer xmlns=\"Email:\">%@</Organizer>", [[[event organizer] mailAddress] activeSyncRepresentationInContext: context]];
|
||||
|
||||
@@ -1432,4 +1449,239 @@ struct GlobalObjectId {
|
||||
}
|
||||
}
|
||||
|
||||
- (NSString *) storeMail: (NSDictionary *) theValues
|
||||
inBuffer: (NSMutableString *) theBuffer
|
||||
inContext: (WOContext *) _context
|
||||
{
|
||||
NSString *dateReceived, *folder, *s, *serverId, *messageId;
|
||||
NGMimeMessageGenerator *generator;
|
||||
NGMimeMessage *draftMessage;
|
||||
NGMimeBodyPart *bodyPart;
|
||||
NGMimeMultipartBody *body;
|
||||
NSDictionary *identity;
|
||||
NGMutableHashMap *map;
|
||||
NGImap4Client *client;
|
||||
NSData *message_data;
|
||||
NSArray *attachmentKeys;
|
||||
|
||||
id o, a, result, attachments;
|
||||
int bodyType, i;
|
||||
|
||||
identity = [[context activeUser] primaryIdentity];
|
||||
message_data = nil;
|
||||
bodyType = 1;
|
||||
|
||||
if ((o = [[theValues objectForKey: @"Body"] objectForKey: @"Type"]))
|
||||
bodyType = [o intValue];
|
||||
|
||||
if (bodyType == 4)
|
||||
{
|
||||
s = [[theValues objectForKey: @"Body"] objectForKey: @"Data"];
|
||||
message_data = [s dataUsingEncoding: NSUTF8StringEncoding];
|
||||
}
|
||||
|
||||
if (bodyType == 1 || bodyType == 2)
|
||||
{
|
||||
map = [[[NGMutableHashMap alloc] initWithCapacity: 1] autorelease];
|
||||
|
||||
[map setObject: [NSString stringWithFormat: @"%@ <%@>", [identity objectForKey: @"fullName"], [identity objectForKey: @"email"]] forKey: @"from"];
|
||||
|
||||
if ((o = [theValues objectForKey: @"To"]))
|
||||
[map setObject: o forKey: @"to"];
|
||||
|
||||
if ((o = [theValues objectForKey: @"Cc"]))
|
||||
[map setObject: o forKey: @"cc"];
|
||||
|
||||
if ((o = [theValues objectForKey: @"Bcc"]))
|
||||
[map setObject: o forKey: @"bcc"];
|
||||
|
||||
if ((o = [theValues objectForKey: @"Reply-To"]))
|
||||
[map setObject: o forKey: @"Reply-To"];
|
||||
|
||||
if ((o = [theValues objectForKey: @"Subject"]))
|
||||
[map setObject: o forKey: @"subject"];
|
||||
|
||||
o = [[theValues objectForKey: @"DateReceived"] calendarDate];
|
||||
|
||||
if (!o)
|
||||
o = [NSCalendarDate date];
|
||||
|
||||
#if GNUSTEP_BASE_MINOR_VERSION < 21
|
||||
dateReceived = [o descriptionWithCalendarFormat: @"%a, %d %b %Y %H:%M:%S %z"
|
||||
timeZone: [NSTimeZone timeZoneWithName: @"GMT"]
|
||||
locale: nil];
|
||||
#else
|
||||
dateReceived = [o descriptionWithCalendarFormat: @"%a, %d %b %Y %H:%M:%S %z"
|
||||
timeZone: [NSTimeZone timeZoneWithName: @"GMT"]
|
||||
locale: [NSDictionary dictionaryWithObjectsAndKeys:
|
||||
[NSArray arrayWithObjects: @"Jan", @"Feb", @"Mar", @"Apr",
|
||||
@"May", @"Jun", @"Jul", @"Aug",
|
||||
@"Sep", @"Oct", @"Nov", @"Dec", nil],
|
||||
@"NSShortMonthNameArray",
|
||||
[NSArray arrayWithObjects: @"Sun", @"Mon", @"Tue", @"Wed", @"Thu",
|
||||
@"Fri", @"Sat", nil],
|
||||
@"NSShortWeekDayNameArray",
|
||||
nil]];
|
||||
#endif
|
||||
|
||||
[map setObject: dateReceived forKey: @"date"];
|
||||
|
||||
messageId = [NSString generateMessageID];
|
||||
[map setObject: messageId forKey: @"message-id"];
|
||||
|
||||
attachmentKeys = [self fetchFileAttachmentKeys];
|
||||
|
||||
if ((attachments = [theValues objectForKey: @"Attachments"]) || [attachmentKeys count])
|
||||
{
|
||||
[map setObject: @"multipart/mixed" forKey: @"content-type"];
|
||||
draftMessage = [[[NGMimeMessage alloc] initWithHeader: map] autorelease];
|
||||
body = [[[NGMimeMultipartBody alloc] initWithPart: draftMessage] autorelease];
|
||||
|
||||
map = [[[NGMutableHashMap alloc] initWithCapacity: 1] autorelease];
|
||||
|
||||
[map setObject: (bodyType == 1 ? @"text/plain; charset=utf-8" : @"text/html; charset=utf-8")
|
||||
forKey: @"content-type"];
|
||||
[map setObject: @"quoted-printable" forKey: @"content-transfer-encoding"];
|
||||
|
||||
bodyPart = [[[NGMimeBodyPart alloc] initWithHeader:map] autorelease];
|
||||
|
||||
[bodyPart setBody: [[NSString stringWithFormat: @"%@", [[theValues objectForKey: @"Body"] objectForKey: @"Data"] ] dataUsingEncoding: NSUTF8StringEncoding]];
|
||||
|
||||
[body addBodyPart: bodyPart];
|
||||
|
||||
// Add attachments from the original mail - skip deletions
|
||||
if ([attachmentKeys count])
|
||||
{
|
||||
id currentAttachment;
|
||||
NGHashMap *response;
|
||||
NSData *bodydata;
|
||||
NSArray *paths;
|
||||
NGMimeFileData *fdata;
|
||||
int i, ii;
|
||||
BOOL found;
|
||||
|
||||
paths = [attachmentKeys keysWithFormat: @"BODY[%{path}]"];
|
||||
response = [[self fetchParts: paths] objectForKey: @"RawResponse"];
|
||||
|
||||
for (i = 0; i < [attachmentKeys count]; i++)
|
||||
{
|
||||
currentAttachment = [attachmentKeys objectAtIndex: i];
|
||||
found = NO;
|
||||
for (ii = 0; ii < [attachments count]; ii++)
|
||||
{
|
||||
// no ClientId means its a deletio
|
||||
if (![[attachments objectAtIndex: ii] objectForKey: @"ClientId"] &&
|
||||
[[[[attachments objectAtIndex: ii] objectForKey: @"FileReference"] lastPathComponent] isEqualToString: [currentAttachment objectForKey: @"path"]])
|
||||
{
|
||||
found = YES;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// skip deletions
|
||||
if (found)
|
||||
continue;
|
||||
|
||||
bodydata = [[[response objectForKey: @"fetch"] objectForKey: [NSString stringWithFormat: @"body[%@]", [currentAttachment objectForKey: @"path"]]] valueForKey: @"data"];
|
||||
|
||||
map = [[[NGMutableHashMap alloc] initWithCapacity: 1] autorelease];
|
||||
[map setObject: [currentAttachment objectForKey: @"mimetype"] forKey: @"content-type"];
|
||||
[map setObject: [currentAttachment objectForKey: @"encoding"] forKey: @"content-transfer-encoding"];
|
||||
[map addObject: [NSString stringWithFormat: @"attachment; filename=\"%@\"", [currentAttachment objectForKey: @"filename"]] forKey: @"content-disposition"];
|
||||
bodyPart = [[[NGMimeBodyPart alloc] initWithHeader: map] autorelease];
|
||||
|
||||
fdata = [[NGMimeFileData alloc] initWithBytes:[bodydata bytes] length:[bodydata length]];
|
||||
[bodyPart setBody: fdata];
|
||||
RELEASE(fdata);
|
||||
[body addBodyPart: bodyPart];
|
||||
}
|
||||
}
|
||||
|
||||
// add new attachments
|
||||
for (i = 0; i < [attachments count]; i++)
|
||||
{
|
||||
|
||||
map = [[[NGMutableHashMap alloc] initWithCapacity: 1] autorelease];
|
||||
a = [attachments objectAtIndex: i];
|
||||
|
||||
// no ClientId means its a deletion
|
||||
if (![a objectForKey: @"ClientId"])
|
||||
continue;
|
||||
|
||||
[map setObject: @"application/octet-stream" forKey: @"content-type"]; // FIXME ?? can we guess the right content-type
|
||||
[map setObject: @"base64" forKey: @"content-transfer-encoding"];
|
||||
[map setObject: [NSString stringWithFormat: @"attachment; filename=\"%@\"", [a objectForKey: @"DisplayName"]] forKey: @"content-disposition"];
|
||||
|
||||
bodyPart = [[[NGMimeBodyPart alloc] initWithHeader:map] autorelease];
|
||||
[bodyPart setBody: [[a objectForKey: @"Content"] stringByDecodingBase64]];
|
||||
[body addBodyPart: bodyPart];
|
||||
}
|
||||
|
||||
|
||||
[draftMessage setBody: body];
|
||||
}
|
||||
else
|
||||
{
|
||||
[map setObject: (bodyType == 1 ? @"text/plain; charset=utf-8" : @"text/html; charset=utf-8")
|
||||
forKey: @"content-type"];
|
||||
[map setObject: @"quoted-printable" forKey: @"content-transfer-encoding"];
|
||||
|
||||
draftMessage = [[[NGMimeMessage alloc] initWithHeader: map] autorelease];
|
||||
|
||||
[draftMessage setBody: [[NSString stringWithFormat: @"%@", [[theValues objectForKey: @"Body"] objectForKey: @"Data"] ] dataUsingEncoding: NSUTF8StringEncoding]];
|
||||
}
|
||||
|
||||
generator = [[[NGMimeMessageGenerator alloc] init] autorelease];
|
||||
message_data = [generator generateMimeFromPart: draftMessage];
|
||||
}
|
||||
|
||||
if (message_data)
|
||||
{
|
||||
client = [[self imap4Connection] client];
|
||||
|
||||
if (![imap4 doesMailboxExistAtURL: [container imap4URL]])
|
||||
{
|
||||
[[self imap4Connection] createMailbox: [[self imap4Connection] imap4FolderNameForURL: [container imap4URL]]
|
||||
atURL: [[self mailAccountFolder] imap4URL]];
|
||||
[imap4 flushFolderHierarchyCache];
|
||||
}
|
||||
|
||||
folder = [imap4 imap4FolderNameForURL: [container imap4URL]];
|
||||
|
||||
result = [client append: message_data
|
||||
toFolder: folder
|
||||
withFlags: [NSArray arrayWithObjects: @"draft", nil]];
|
||||
|
||||
serverId = [NSString stringWithFormat: @"%d", [self IMAP4IDFromAppendResult: result]];
|
||||
|
||||
[theBuffer appendString: @"<ApplicationData>"];
|
||||
[theBuffer appendFormat: @"<ConversationId xmlns=\"Email2:\">%@</ConversationId>", [[messageId dataUsingEncoding: NSUTF8StringEncoding] activeSyncRepresentationInContext: context]];
|
||||
|
||||
if ([attachments count])
|
||||
{
|
||||
[theBuffer appendString: @"<Attachments xmlns=\"AirSyncBase:\">"];
|
||||
|
||||
for (i = 0; i < [attachments count]; i++)
|
||||
{
|
||||
a = [attachments objectAtIndex: i];
|
||||
|
||||
[theBuffer appendString: @"<Attachment>"];
|
||||
[theBuffer appendFormat: @"<ClientId xmlns=\"AirSyncBase:\">%@</ClientId>", [a objectForKey: @"ClientId"]];
|
||||
[theBuffer appendFormat: @"<FileReference xmlns=\"AirSyncBase:\">mail/%@/%@/%d</FileReference>", [[[self container] relativeImap4Name] stringByEscapingURL], serverId, i+2];
|
||||
[theBuffer appendString: @"</Attachment>"];
|
||||
}
|
||||
|
||||
[theBuffer appendString: @"</Attachments>"];
|
||||
}
|
||||
|
||||
[theBuffer appendString: @"</ApplicationData>"];
|
||||
|
||||
if ([[result objectForKey: @"result"] boolValue])
|
||||
return serverId;
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
@@ -128,7 +128,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
// StartTime -- http://msdn.microsoft.com/en-us/library/ee157132(v=exchg.80).aspx
|
||||
if ([self startDate])
|
||||
{
|
||||
if ([self isAllDay] && !tz)
|
||||
if ([self isAllDay] && !tz && [[context objectForKey: @"ASProtocolVersion"] floatValue] < 16.0)
|
||||
[s appendFormat: @"<StartTime xmlns=\"Calendar:\">%@</StartTime>",
|
||||
[[[self startDate] dateByAddingYears: 0 months: 0 days: 0
|
||||
hours: 0 minutes: 0
|
||||
@@ -141,7 +141,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
// EndTime -- http://msdn.microsoft.com/en-us/library/ee157945(v=exchg.80).aspx
|
||||
if ([self endDate])
|
||||
{
|
||||
if ([self isAllDay] && !tz)
|
||||
if ([self isAllDay] && !tz && [[context objectForKey: @"ASProtocolVersion"] floatValue] < 16.0)
|
||||
[s appendFormat: @"<EndTime xmlns=\"Calendar:\">%@</EndTime>",
|
||||
[[[self endDate] dateByAddingYears: 0 months: 0 days: 0
|
||||
hours: 0 minutes: 0
|
||||
@@ -231,9 +231,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
}
|
||||
else
|
||||
{
|
||||
// If it's a normal event (ie, with no organizer/attendee) or we are the organizer to an event
|
||||
// invitation, we set the busy status to 2 (Busy)
|
||||
[s appendFormat: @"<BusyStatus xmlns=\"Calendar:\">%d</BusyStatus>", 2];
|
||||
// If it's a normal event (i.e. with no organizer/attendee) or we are the organizer of an event
|
||||
// invitation, we set the busy status depending on TRANSP.
|
||||
[s appendFormat: @"<BusyStatus xmlns=\"Calendar:\">%d</BusyStatus>", (([self isOpaque]) ? 2 : 0)];
|
||||
}
|
||||
|
||||
[s appendFormat: @"<MeetingStatus xmlns=\"Calendar:\">%d</MeetingStatus>", meetingStatus];
|
||||
@@ -244,7 +244,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// Location
|
||||
if ([[self location] length])
|
||||
[s appendFormat: @"<Location xmlns=\"Calendar:\">%@</Location>", [[self location] activeSyncRepresentationInContext: context]];
|
||||
{
|
||||
if ([[context objectForKey: @"ASProtocolVersion"] floatValue] >= 16.0)
|
||||
[s appendFormat: @"<Location xmlns=\"AirSyncBase:\"><DisplayName>%@</DisplayName></Location>", [[self location] activeSyncRepresentationInContext: context]];
|
||||
else
|
||||
[s appendFormat: @"<Location xmlns=\"Calendar:\">%@</Location>", [[self location] activeSyncRepresentationInContext: context]];
|
||||
}
|
||||
|
||||
// Importance - NOT SUPPORTED - DO NOT ENABLE
|
||||
//o = [self priority];
|
||||
@@ -451,7 +456,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
occurences = [NSMutableArray arrayWithArray: [[self parent] events]];
|
||||
|
||||
if ((o = [theValues objectForKey: @"UID"]))
|
||||
if ((o = [theValues objectForKey: ([[context objectForKey: @"ASProtocolVersion"] floatValue] >= 16.0) ? @"ClientUid" : @"UID"]))
|
||||
[self setUid: o];
|
||||
|
||||
// FIXME: merge with iCalToDo
|
||||
@@ -474,7 +479,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
if ((o = [theValues objectForKey: @"BusyStatus"]))
|
||||
{
|
||||
[o intValue];
|
||||
if ([o boolValue])
|
||||
[self setTransparency: @"OPAQUE"];
|
||||
else
|
||||
[self setTransparency: @"TRANSPARENT"];
|
||||
}
|
||||
|
||||
//
|
||||
@@ -527,8 +535,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
[self setComment: o];
|
||||
}
|
||||
|
||||
if ((o = [theValues objectForKey: @"Location"]))
|
||||
if ([[context objectForKey: @"ASProtocolVersion"] floatValue] < 16.0 && (o = [theValues objectForKey: @"Location"]))
|
||||
[self setLocation: o];
|
||||
else if ([[context objectForKey: @"ASProtocolVersion"] floatValue] >= 16.0 && (o = [theValues objectForKey: @"Location"]) && [o isKindOfClass: [NSDictionary class]])
|
||||
[self setLocation: [o objectForKey: @"DisplayName"]];
|
||||
|
||||
deltasecs = 0;
|
||||
start = nil;
|
||||
@@ -579,7 +589,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
{
|
||||
// Ignore the alarm for now
|
||||
}
|
||||
else if ((o = [theValues objectForKey: @"Reminder"]))
|
||||
else if ((o = [theValues objectForKey: @"Reminder"]) && [o length])
|
||||
{
|
||||
// NOTE: Outlook sends a 15 min reminder (18 hour for allday) if no reminder is specified
|
||||
// although no default reminder is defined (File -> Options -> Clendar -> Calendar Options - > Default Reminders)
|
||||
@@ -830,7 +840,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Attendees - we don't touch the values if we're an attendee. This is gonna
|
||||
// be done automatically by the ActiveSync client when invoking MeetingResponse.
|
||||
if (![self userIsAttendee: [context activeUser]])
|
||||
@@ -852,10 +861,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
// { "Attendee_Email" = "sogo3@example.com"; "Attendee_Name" = "Wolfgang Fritz"; "Attendee_Status" = 5; "Attendee_Type" = 1; }
|
||||
attendee = [o objectAtIndex: i];
|
||||
|
||||
if ([self isOrganizer: [attendee objectForKey: @"Attendee_Email"]])
|
||||
continue;
|
||||
|
||||
person = [iCalPerson elementWithTag: @"attendee"];
|
||||
[person setCn: [attendee objectForKey: @"Attendee_Name"]];
|
||||
[person setEmail: [attendee objectForKey: @"Attendee_Email"]];
|
||||
|
||||
|
||||
status = [[attendee objectForKey: @"Attendee_Status"] intValue];
|
||||
|
||||
switch (status)
|
||||
@@ -872,7 +884,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
case 0:
|
||||
case 5:
|
||||
default:
|
||||
[person setPartStat: @"NEEDS-ACTION"];
|
||||
{
|
||||
[person setPartStat: @"NEEDS-ACTION"];
|
||||
[person setRsvp: @"TRUE"];
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Loaded 100 of 1288 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user