Compare commits
423
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c4bc215a47 | ||
|
|
bd776152db | ||
|
|
c6374b52ec | ||
|
|
734c164ae0 | ||
|
|
c9936d7ecf | ||
|
|
9f381e768d | ||
|
|
b531b6160c | ||
|
|
885e59a2af | ||
|
|
8a041860a0 | ||
|
|
d5f76ac832 | ||
|
|
12b7fea825 | ||
|
|
1c82af8842 | ||
|
|
6cef5245e1 | ||
|
|
0069a4200b | ||
|
|
e24c20c48a | ||
|
|
256b679798 | ||
|
|
b85ed0db1c | ||
|
|
048bae2fc5 | ||
|
|
19e542396b | ||
|
|
249a1fcf14 | ||
|
|
7dad5ad84e | ||
|
|
16105d37b8 | ||
|
|
e08ebd2390 | ||
|
|
03553980fd | ||
|
|
33fd60efb3 | ||
|
|
b8e2255a07 | ||
|
|
e687dbf155 | ||
|
|
bf398889bf | ||
|
|
f42d52743d | ||
|
|
70cd64a626 | ||
|
|
4359b05da8 | ||
|
|
e26e3d7307 | ||
|
|
25dbd4849d | ||
|
|
045b275b27 | ||
|
|
a2a89e8720 | ||
|
|
7ec1973e0f | ||
|
|
2581f6c568 | ||
|
|
20369631c9 | ||
|
|
1221da2443 | ||
|
|
f27b8b6a54 | ||
|
|
a79a9c4eff | ||
|
|
a6b393c2c1 | ||
|
|
faf228022a | ||
|
|
3e87ba92db | ||
|
|
0a87ff97b6 | ||
|
|
031cd210f7 | ||
|
|
9d9a434fdc | ||
|
|
41ed498d65 | ||
|
|
d28482557f | ||
|
|
4c97d54939 | ||
|
|
c08263d1c3 | ||
|
|
dc96466462 | ||
|
|
1734b387a3 | ||
|
|
871115e349 | ||
|
|
a764286879 | ||
|
|
5304461e4c | ||
|
|
6b25f08943 | ||
|
|
a0022e06f7 | ||
|
|
f24e65b6d8 | ||
|
|
0fb006c19f | ||
|
|
47a3f1a19d | ||
|
|
f25344182d | ||
|
|
f24e3a0a31 | ||
|
|
afb7bc309c | ||
|
|
cfee5aa3f4 | ||
|
|
2a51f6f385 | ||
|
|
4cffea43eb | ||
|
|
cafce5753d | ||
|
|
5d6a5f5d5e | ||
|
|
8e5a26dfb1 | ||
|
|
4cb0facd72 | ||
|
|
854bce28fb | ||
|
|
49e964c529 | ||
|
|
3281cea2a2 | ||
|
|
82253e91d2 | ||
|
|
1d1ed9a031 | ||
|
|
2bd8a2935f | ||
|
|
8a25e38827 | ||
|
|
4ec19d46fa | ||
|
|
d46a39e252 | ||
|
|
23e10d30be | ||
|
|
f049e2430a | ||
|
|
a53c66e8a4 | ||
|
|
4fb3492ea8 | ||
|
|
353f40ac3e | ||
|
|
96c831f726 | ||
|
|
59b3219f2d | ||
|
|
d7fdfc6cb2 | ||
|
|
d02f58b3cd | ||
|
|
62fee93d86 | ||
|
|
139c14d9e1 | ||
|
|
8ee15c6f77 | ||
|
|
5d17414018 | ||
|
|
3cd91846a6 | ||
|
|
e9eb8bdc86 | ||
|
|
3739cb1536 | ||
|
|
30f10ee8f0 | ||
|
|
dfb8788270 | ||
|
|
3810833e1b | ||
|
|
29e05c7c81 | ||
|
|
0a08285fac | ||
|
|
01f20a42ad | ||
|
|
3a61a2566b | ||
|
|
d2dda86529 | ||
|
|
cc125d2192 | ||
|
|
4da1e41d93 | ||
|
|
e24eb10c4f | ||
|
|
dd9e51fd16 | ||
|
|
9932d1413b | ||
|
|
ff13c49540 | ||
|
|
1e33b4bf26 | ||
|
|
e23a7df125 | ||
|
|
4ca476db9e | ||
|
|
33840c71cd | ||
|
|
1b983ef691 | ||
|
|
eec8c07d4f | ||
|
|
84ba93fc0a | ||
|
|
37a6f82659 | ||
|
|
b4aaa68d85 | ||
|
|
5487f34b9e | ||
|
|
e07734fa5f | ||
|
|
6a8e6cd762 | ||
|
|
663351029a | ||
|
|
c26e5fa7fe | ||
|
|
74c01dc448 | ||
|
|
a009c71034 | ||
|
|
b4ebc90dd0 | ||
|
|
95dc134ca6 | ||
|
|
9c4b7d8481 | ||
|
|
9fb9f2cae6 | ||
|
|
15f9b7d22e | ||
|
|
5f179ed6b0 | ||
|
|
93f9a7273e | ||
|
|
15e082896c | ||
|
|
63ff9751d7 | ||
|
|
d12c651d59 | ||
|
|
41a6c02aa3 | ||
|
|
a026e75c0e | ||
|
|
46815042c9 | ||
|
|
c79af52b67 | ||
|
|
e882dedac9 | ||
|
|
13277bbdb9 | ||
|
|
7e8a83aefb | ||
|
|
f1846191d5 | ||
|
|
a7c3f33447 | ||
|
|
a8d67edb44 | ||
|
|
89766b2e7e | ||
|
|
7d65d808f6 | ||
|
|
fa5e99d58d | ||
|
|
67c2d508ea | ||
|
|
19923d10db | ||
|
|
e57b6835e6 | ||
|
|
bcab7e7dc9 | ||
|
|
2572eedd89 | ||
|
|
efb45bfba6 | ||
|
|
4f38b5cf3f | ||
|
|
71b9772546 | ||
|
|
c13c389ae5 | ||
|
|
caf6f0ec6c | ||
|
|
4952ff7914 | ||
|
|
8981dcd645 | ||
|
|
470a53a548 | ||
|
|
7b65b7400e | ||
|
|
90c61abdb6 | ||
|
|
f8387b90ff | ||
|
|
feb02c54b9 | ||
|
|
49a2299414 | ||
|
|
43044bf88f | ||
|
|
0532d331a3 | ||
|
|
70fc05091f | ||
|
|
469e5c647e | ||
|
|
4bfb43a4ad | ||
|
|
5e0c7ae4f2 | ||
|
|
3daa7e55b7 | ||
|
|
6913502810 | ||
|
|
24971070f6 | ||
|
|
3d90e3a539 | ||
|
|
b5fdaa78cd | ||
|
|
f94adb5473 | ||
|
|
e34ba5689c | ||
|
|
7b5da8a2c9 | ||
|
|
451c82c815 | ||
|
|
488a76c5e3 | ||
|
|
a4bd966cc0 | ||
|
|
ecc36c9025 | ||
|
|
716daf027d | ||
|
|
0b7c32510b | ||
|
|
547dfa0d90 | ||
|
|
225a28258f | ||
|
|
e01b190e57 | ||
|
|
cd7d410262 | ||
|
|
4bcf90c693 | ||
|
|
0408415c61 | ||
|
|
c1c0c1ab44 | ||
|
|
3ea94940c2 | ||
|
|
321675ba99 | ||
|
|
9eb1418e36 | ||
|
|
d8804c699d | ||
|
|
4e9db74e29 | ||
|
|
7150ebde6b | ||
|
|
6fbd975e00 | ||
|
|
e0a1a47953 | ||
|
|
da757a19c6 | ||
|
|
ea13fd14c9 | ||
|
|
902a5d8f70 | ||
|
|
be0090be06 | ||
|
|
2d455bf0ca | ||
|
|
1d8e72646c | ||
|
|
c066136a06 | ||
|
|
a59fff785b | ||
|
|
40facab9a7 | ||
|
|
94eec4678e | ||
|
|
292ed9cfc8 | ||
|
|
663346e8ec | ||
|
|
8f33197c59 | ||
|
|
46b53b31fd | ||
|
|
6093c4dd2e | ||
|
|
61ded01171 | ||
|
|
9ed53cbab3 | ||
|
|
dfe49ea3b4 | ||
|
|
147d7f4cf0 | ||
|
|
794ca2ae8a | ||
|
|
036e535b33 | ||
|
|
a1b623b325 | ||
|
|
0965fd837a | ||
|
|
95b193391e | ||
|
|
9e38c5060a | ||
|
|
cfa7402dec | ||
|
|
1e4f737a7d | ||
|
|
8d9cfdb3b4 | ||
|
|
884dd7448c | ||
|
|
3cd7beb93d | ||
|
|
790a0536bc | ||
|
|
9dded7c86c | ||
|
|
d85ada6750 | ||
|
|
5b4dd4ecb1 | ||
|
|
721472d38e | ||
|
|
d737b2fd9a | ||
|
|
ac5c2b611a | ||
|
|
502f10cfd4 | ||
|
|
5bbb5df2a8 | ||
|
|
ddc9a1b3f5 | ||
|
|
d835921062 | ||
|
|
5c3dc34440 | ||
|
|
be459fa946 | ||
|
|
a78d7007d7 | ||
|
|
7e001a05a4 | ||
|
|
e6e4616a69 | ||
|
|
58dc0343bb | ||
|
|
814e2c0556 | ||
|
|
d357936c31 | ||
|
|
e279db6431 | ||
|
|
9897d003be | ||
|
|
113bae4638 | ||
|
|
e9b18d4521 | ||
|
|
f85cc4c186 | ||
|
|
775a8421d5 | ||
|
|
6c3ec9836c | ||
|
|
8ce4b89656 | ||
|
|
4f2183ec07 | ||
|
|
2370ecb089 | ||
|
|
0216658674 | ||
|
|
9ac8e9f0e1 | ||
|
|
8fc53ea1d7 | ||
|
|
55ccd0e83f | ||
|
|
219dfc61c9 | ||
|
|
d26df456e5 | ||
|
|
bc1edef448 | ||
|
|
2993c3a226 | ||
|
|
0e5a4901db | ||
|
|
ec0cc29f38 | ||
|
|
0211a26aba | ||
|
|
c34cca6a16 | ||
|
|
630c69d82d | ||
|
|
d761a864eb | ||
|
|
4b18fc108b | ||
|
|
9d4f4c3a9c | ||
|
|
0e0b7728fd | ||
|
|
c7fbcb0fc4 | ||
|
|
5667bb1b11 | ||
|
|
ea904f2e05 | ||
|
|
a75c797553 | ||
|
|
6f8d8394df | ||
|
|
b838734756 | ||
|
|
cd0244883d | ||
|
|
39632239f9 | ||
|
|
1382fe25fc | ||
|
|
126cd5fdfe | ||
|
|
ea26e0cc0a | ||
|
|
4971e8d05a | ||
|
|
7d24ece7d6 | ||
|
|
e253a7429c | ||
|
|
8db5e6d224 | ||
|
|
0124191329 | ||
|
|
d7d6a31837 | ||
|
|
bdc5ce7cd9 | ||
|
|
a0aef043a8 | ||
|
|
b4822f6c4e | ||
|
|
4804337a01 | ||
|
|
e2d2212524 | ||
|
|
6a70db80e6 | ||
|
|
01e42dce7c | ||
|
|
e533eb91a9 | ||
|
|
d610630c8d | ||
|
|
ed8c4a8f54 | ||
|
|
99669f2d5c | ||
|
|
128368f66c | ||
|
|
7c7989065c | ||
|
|
4dc7790015 | ||
|
|
f141312195 | ||
|
|
2a5e0aeaa9 | ||
|
|
026ffd8888 | ||
|
|
4926855f48 | ||
|
|
881a725f12 | ||
|
|
a7722755b7 | ||
|
|
5e7d2325bb | ||
|
|
347434dbff | ||
|
|
ca1a3ac06b | ||
|
|
8ca79d9a17 | ||
|
|
3606601c39 | ||
|
|
988e91a638 | ||
|
|
f6b5fdacb9 | ||
|
|
aa7aa6a973 | ||
|
|
d64fd65ea8 | ||
|
|
ef7c69eda7 | ||
|
|
2017536beb | ||
|
|
5500f99312 | ||
|
|
eed17fd95a | ||
|
|
0e02334fda | ||
|
|
1993d60683 | ||
|
|
47a9a22bc0 | ||
|
|
b1d3aba1e1 | ||
|
|
f0f206b8bb | ||
|
|
73ff981d4f | ||
|
|
88550c0d0d | ||
|
|
440523747d | ||
|
|
93f77c0dd5 | ||
|
|
ce36e80d6b | ||
|
|
96f023d108 | ||
|
|
f2da438a2b | ||
|
|
e1411e7120 | ||
|
|
cbfb6eb9ff | ||
|
|
14630ce222 | ||
|
|
e523926ef5 | ||
|
|
57e4116d7c | ||
|
|
1d0eb66781 | ||
|
|
d75b04c59f | ||
|
|
3e8f7cb29e | ||
|
|
7c250fad8f | ||
|
|
6d61e064a5 | ||
|
|
a5948b420b | ||
|
|
1bf2509d1e | ||
|
|
249bf16e8a | ||
|
|
7b65c29b1e | ||
|
|
28f66c6fd9 | ||
|
|
cc98664d13 | ||
|
|
1fdcf843f3 | ||
|
|
a1d092cab0 | ||
|
|
2606787dd7 | ||
|
|
eec99de5d0 | ||
|
|
5bf7105982 | ||
|
|
0979bd13ae | ||
|
|
40d6ce66d0 | ||
|
|
8fd0966a23 | ||
|
|
3f8d374d63 | ||
|
|
77e4b3307f | ||
|
|
378eef4082 | ||
|
|
8c96f717c0 | ||
|
|
33bd07a53d | ||
|
|
0e8aeb5ef5 | ||
|
|
fb4b266b3b | ||
|
|
d82ba7cbb9 | ||
|
|
f8a72d4719 | ||
|
|
51192dd533 | ||
|
|
b088f6f97f | ||
|
|
e037ca0a49 | ||
|
|
48b6cbcf0c | ||
|
|
3b0a497f2d | ||
|
|
58d6a3c5ea | ||
|
|
c3c5e464a9 | ||
|
|
303eaa3820 | ||
|
|
d797868d71 | ||
|
|
0ab36d4ec5 | ||
|
|
e49f21b0c4 | ||
|
|
3f58b6bfd1 | ||
|
|
160aa42b88 | ||
|
|
0884a0f23e | ||
|
|
54e1439faf | ||
|
|
63024c30f0 | ||
|
|
4b8a14e41e | ||
|
|
ba67c57629 | ||
|
|
0f0b4926a9 | ||
|
|
6ad59a8481 | ||
|
|
fe09a7969d | ||
|
|
ca568ec5b5 | ||
|
|
0a4809e2be | ||
|
|
627ebbaea9 | ||
|
|
48c41e6c62 | ||
|
|
9096f0b279 | ||
|
|
1ebf0a69ed | ||
|
|
aeabd85c90 | ||
|
|
695fc5fff9 | ||
|
|
6840fbb96c | ||
|
|
b905f42f47 | ||
|
|
efb39b401a | ||
|
|
e02221d716 | ||
|
|
9edab5ee4a | ||
|
|
bc2b003676 | ||
|
|
a9b521c8be | ||
|
|
157e66ad4f | ||
|
|
39c2d43cef | ||
|
|
ac5f0bb95a | ||
|
|
e31f809849 | ||
|
|
a916ac8927 | ||
|
|
21ee23e7df | ||
|
|
1223a6c0ee | ||
|
|
7c2079870a | ||
|
|
806ea9fd13 | ||
|
|
40a1a51845 | ||
|
|
20cb769db1 | ||
|
|
2fdf4f5535 | ||
|
|
9929623119 | ||
|
|
cf0e0691f6 |
No files matched your search
+31
-1
@@ -1,9 +1,10 @@
|
||||
[main]
|
||||
host = https://www.transifex.net
|
||||
host = https://www.transifex.com
|
||||
|
||||
[sogo.ui-mailerui]
|
||||
source_file = UI/MailerUI/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
trans.ar = UI/MailerUI/Arabic.lproj/Localizable.strings
|
||||
trans.ca = UI/MailerUI/Catalan.lproj/Localizable.strings
|
||||
trans.cs = UI/MailerUI/Czech.lproj/Localizable.strings
|
||||
trans.cy = UI/MailerUI/Welsh.lproj/Localizable.strings
|
||||
@@ -11,6 +12,7 @@ trans.da_DK = UI/MailerUI/Danish.lproj/Localizable.strings
|
||||
trans.de = UI/MailerUI/German.lproj/Localizable.strings
|
||||
trans.es_AR = UI/MailerUI/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = UI/MailerUI/SpanishSpain.lproj/Localizable.strings
|
||||
trans.fi = UI/MailerUI/Finnish.lproj/Localizable.strings
|
||||
trans.fr = UI/MailerUI/French.lproj/Localizable.strings
|
||||
trans.hu = UI/MailerUI/Hungarian.lproj/Localizable.strings
|
||||
trans.is = UI/MailerUI/Icelandic.lproj/Localizable.strings
|
||||
@@ -21,12 +23,14 @@ trans.nn_NO = UI/MailerUI/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = UI/MailerUI/Polish.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ru = UI/MailerUI/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/MailerUI/Slovak.lproj/Localizable.strings
|
||||
trans.sv = UI/MailerUI/Swedish.lproj/Localizable.strings
|
||||
trans.uk = UI/MailerUI/Ukrainian.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-preferencesui]
|
||||
source_file = UI/PreferencesUI/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
trans.ar = UI/PreferencesUI/Arabic.lproj/Localizable.strings
|
||||
trans.ca = UI/PreferencesUI/Catalan.lproj/Localizable.strings
|
||||
trans.cs = UI/PreferencesUI/Czech.lproj/Localizable.strings
|
||||
trans.cy = UI/PreferencesUI/Welsh.lproj/Localizable.strings
|
||||
@@ -34,6 +38,7 @@ trans.da_DK = UI/PreferencesUI/Danish.lproj/Localizable.strings
|
||||
trans.de = UI/PreferencesUI/German.lproj/Localizable.strings
|
||||
trans.es_AR = UI/PreferencesUI/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings
|
||||
trans.fi = UI/PreferencesUI/Finnish.lproj/Localizable.strings
|
||||
trans.fr = UI/PreferencesUI/French.lproj/Localizable.strings
|
||||
trans.hu = UI/PreferencesUI/Hungarian.lproj/Localizable.strings
|
||||
trans.is = UI/PreferencesUI/Icelandic.lproj/Localizable.strings
|
||||
@@ -44,12 +49,14 @@ trans.nn_NO = UI/PreferencesUI/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = UI/PreferencesUI/Polish.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ru = UI/PreferencesUI/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/PreferencesUI/Slovak.lproj/Localizable.strings
|
||||
trans.sv = UI/PreferencesUI/Swedish.lproj/Localizable.strings
|
||||
trans.uk = UI/PreferencesUI/Ukrainian.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-scheduler]
|
||||
source_file = UI/Scheduler/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
trans.ar = UI/Scheduler/Arabic.lproj/Localizable.strings
|
||||
trans.ca = UI/Scheduler/Catalan.lproj/Localizable.strings
|
||||
trans.cs = UI/Scheduler/Czech.lproj/Localizable.strings
|
||||
trans.cy = UI/Scheduler/Welsh.lproj/Localizable.strings
|
||||
@@ -57,6 +64,7 @@ trans.da_DK = UI/Scheduler/Danish.lproj/Localizable.strings
|
||||
trans.de = UI/Scheduler/German.lproj/Localizable.strings
|
||||
trans.es_AR = UI/Scheduler/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = UI/Scheduler/SpanishSpain.lproj/Localizable.strings
|
||||
trans.fi = UI/Scheduler/Finnish.lproj/Localizable.strings
|
||||
trans.fr = UI/Scheduler/French.lproj/Localizable.strings
|
||||
trans.hu = UI/Scheduler/Hungarian.lproj/Localizable.strings
|
||||
trans.is = UI/Scheduler/Icelandic.lproj/Localizable.strings
|
||||
@@ -67,12 +75,14 @@ trans.nn_NO = UI/Scheduler/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = UI/Scheduler/Polish.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ru = UI/Scheduler/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/Scheduler/Slovak.lproj/Localizable.strings
|
||||
trans.sv = UI/Scheduler/Swedish.lproj/Localizable.strings
|
||||
trans.uk = UI/Scheduler/Ukrainian.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-contacts]
|
||||
source_file = UI/Contacts/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
trans.ar = UI/Contacts/Arabic.lproj/Localizable.strings
|
||||
trans.ca = UI/Contacts/Catalan.lproj/Localizable.strings
|
||||
trans.cs = UI/Contacts/Czech.lproj/Localizable.strings
|
||||
trans.cy = UI/Contacts/Welsh.lproj/Localizable.strings
|
||||
@@ -80,6 +90,7 @@ trans.da_DK = UI/Contacts/Danish.lproj/Localizable.strings
|
||||
trans.de = UI/Contacts/German.lproj/Localizable.strings
|
||||
trans.es_AR = UI/Contacts/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = UI/Contacts/SpanishSpain.lproj/Localizable.strings
|
||||
trans.fi = UI/Contacts/Finnish.lproj/Localizable.strings
|
||||
trans.fr = UI/Contacts/French.lproj/Localizable.strings
|
||||
trans.hu = UI/Contacts/Hungarian.lproj/Localizable.strings
|
||||
trans.is = UI/Contacts/Icelandic.lproj/Localizable.strings
|
||||
@@ -90,12 +101,14 @@ trans.nn_NO = UI/Contacts/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = UI/Contacts/Polish.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ru = UI/Contacts/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/Contacts/Slovak.lproj/Localizable.strings
|
||||
trans.sv = UI/Contacts/Swedish.lproj/Localizable.strings
|
||||
trans.uk = UI/Contacts/Ukrainian.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-mainui]
|
||||
source_file = UI/MainUI/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
trans.ar = UI/MainUI/Arabic.lproj/Localizable.strings
|
||||
trans.ca = UI/MainUI/Catalan.lproj/Localizable.strings
|
||||
trans.cs = UI/MainUI/Czech.lproj/Localizable.strings
|
||||
trans.cy = UI/MainUI/Welsh.lproj/Localizable.strings
|
||||
@@ -103,6 +116,7 @@ trans.da_DK = UI/MainUI/Danish.lproj/Localizable.strings
|
||||
trans.de = UI/MainUI/German.lproj/Localizable.strings
|
||||
trans.es_AR = UI/MainUI/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = UI/MainUI/SpanishSpain.lproj/Localizable.strings
|
||||
trans.fi = UI/MainUI/Finnish.lproj/Localizable.strings
|
||||
trans.fr = UI/MainUI/French.lproj/Localizable.strings
|
||||
trans.hu = UI/MainUI/Hungarian.lproj/Localizable.strings
|
||||
trans.is = UI/MainUI/Icelandic.lproj/Localizable.strings
|
||||
@@ -113,12 +127,14 @@ trans.nn_NO = UI/MainUI/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = UI/MainUI/Polish.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ru = UI/MainUI/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/MainUI/Slovak.lproj/Localizable.strings
|
||||
trans.sv = UI/MainUI/Swedish.lproj/Localizable.strings
|
||||
trans.uk = UI/MainUI/Ukrainian.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-common]
|
||||
source_file = UI/Common/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
trans.ar = UI/Common/Arabic.lproj/Localizable.strings
|
||||
trans.ca = UI/Common/Catalan.lproj/Localizable.strings
|
||||
trans.cs = UI/Common/Czech.lproj/Localizable.strings
|
||||
trans.cy = UI/Common/Welsh.lproj/Localizable.strings
|
||||
@@ -126,6 +142,7 @@ trans.da_DK = UI/Common/Danish.lproj/Localizable.strings
|
||||
trans.de = UI/Common/German.lproj/Localizable.strings
|
||||
trans.es_AR = UI/Common/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = UI/Common/SpanishSpain.lproj/Localizable.strings
|
||||
trans.fi = UI/Common/Finnish.lproj/Localizable.strings
|
||||
trans.fr = UI/Common/French.lproj/Localizable.strings
|
||||
trans.hu = UI/Common/Hungarian.lproj/Localizable.strings
|
||||
trans.is = UI/Common/Icelandic.lproj/Localizable.strings
|
||||
@@ -136,12 +153,14 @@ trans.nn_NO = UI/Common/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = UI/Common/Polish.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/Common/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ru = UI/Common/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/Common/Slovak.lproj/Localizable.strings
|
||||
trans.sv = UI/Common/Swedish.lproj/Localizable.strings
|
||||
trans.uk = UI/Common/Ukrainian.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-administrationui]
|
||||
source_file = UI/AdministrationUI/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
trans.ar = UI/AdministrationUI/Arabic.lproj/Localizable.strings
|
||||
trans.ca = UI/AdministrationUI/Catalan.lproj/Localizable.strings
|
||||
trans.cs = UI/AdministrationUI/Czech.lproj/Localizable.strings
|
||||
trans.cy = UI/AdministrationUI/Welsh.lproj/Localizable.strings
|
||||
@@ -149,6 +168,7 @@ trans.da_DK = UI/AdministrationUI/Danish.lproj/Localizable.strings
|
||||
trans.de = UI/AdministrationUI/German.lproj/Localizable.strings
|
||||
trans.es_AR = UI/AdministrationUI/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = UI/AdministrationUI/SpanishSpain.lproj/Localizable.strings
|
||||
trans.fi = UI/AdministrationUI/Finnish.lproj/Localizable.strings
|
||||
trans.fr = UI/AdministrationUI/French.lproj/Localizable.strings
|
||||
trans.hu = UI/AdministrationUI/Hungarian.lproj/Localizable.strings
|
||||
trans.is = UI/AdministrationUI/Icelandic.lproj/Localizable.strings
|
||||
@@ -159,12 +179,14 @@ trans.nn_NO = UI/AdministrationUI/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = UI/AdministrationUI/Polish.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/AdministrationUI/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ru = UI/AdministrationUI/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/AdministrationUI/Slovak.lproj/Localizable.strings
|
||||
trans.sv = UI/AdministrationUI/Swedish.lproj/Localizable.strings
|
||||
trans.uk = UI/AdministrationUI/Ukrainian.lproj/Localizable.strings
|
||||
|
||||
[sogo.soobjects-appointments]
|
||||
source_file = SoObjects/Appointments/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
trans.ar = SoObjects/Appointments/Arabic.lproj/Localizable.strings
|
||||
trans.ca = SoObjects/Appointments/Catalan.lproj/Localizable.strings
|
||||
trans.cs = SoObjects/Appointments/Czech.lproj/Localizable.strings
|
||||
trans.cy = SoObjects/Appointments/Welsh.lproj/Localizable.strings
|
||||
@@ -172,6 +194,7 @@ trans.da_DK = SoObjects/Appointments/Danish.lproj/Localizable.strings
|
||||
trans.de = SoObjects/Appointments/German.lproj/Localizable.strings
|
||||
trans.es_AR = SoObjects/Appointments/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = SoObjects/Appointments/SpanishSpain.lproj/Localizable.strings
|
||||
trans.fi = SoObjects/Appointments/Finnish.lproj/Localizable.strings
|
||||
trans.fr = SoObjects/Appointments/French.lproj/Localizable.strings
|
||||
trans.hu = SoObjects/Appointments/Hungarian.lproj/Localizable.strings
|
||||
trans.is = SoObjects/Appointments/Icelandic.lproj/Localizable.strings
|
||||
@@ -182,12 +205,14 @@ trans.nn_NO = SoObjects/Appointments/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = SoObjects/Appointments/Polish.lproj/Localizable.strings
|
||||
trans.pt_BR = SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ru = SoObjects/Appointments/Russian.lproj/Localizable.strings
|
||||
trans.sk = SoObjects/Appointments/Slovak.lproj/Localizable.strings
|
||||
trans.sv = SoObjects/Appointments/Swedish.lproj/Localizable.strings
|
||||
trans.uk = SoObjects/Appointments/Ukrainian.lproj/Localizable.strings
|
||||
|
||||
[sogo.soobjects-contacts]
|
||||
source_file = SoObjects/Contacts/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
trans.ar = SoObjects/Contacts/Arabic.lproj/Localizable.strings
|
||||
trans.ca = SoObjects/Contacts/Catalan.lproj/Localizable.strings
|
||||
trans.cs = SoObjects/Contacts/Czech.lproj/Localizable.strings
|
||||
trans.cy = SoObjects/Contacts/Welsh.lproj/Localizable.strings
|
||||
@@ -195,6 +220,7 @@ trans.da_DK = SoObjects/Contacts/Danish.lproj/Localizable.strings
|
||||
trans.de = SoObjects/Contacts/German.lproj/Localizable.strings
|
||||
trans.es_AR = SoObjects/Contacts/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = SoObjects/Contacts/SpanishSpain.lproj/Localizable.strings
|
||||
trans.fi = SoObjects/Contacts/Finnish.lproj/Localizable.strings
|
||||
trans.fr = SoObjects/Contacts/French.lproj/Localizable.strings
|
||||
trans.hu = SoObjects/Contacts/Hungarian.lproj/Localizable.strings
|
||||
trans.is = SoObjects/Contacts/Icelandic.lproj/Localizable.strings
|
||||
@@ -205,12 +231,14 @@ trans.nn_NO = SoObjects/Contacts/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = SoObjects/Contacts/Polish.lproj/Localizable.strings
|
||||
trans.pt_BR = SoObjects/Contacts/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ru = SoObjects/Contacts/Russian.lproj/Localizable.strings
|
||||
trans.sk = SoObjects/Contacts/Slovak.lproj/Localizable.strings
|
||||
trans.sv = SoObjects/Contacts/Swedish.lproj/Localizable.strings
|
||||
trans.uk = SoObjects/Contacts/Ukrainian.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-mailpartviewers]
|
||||
source_file = UI/MailPartViewers/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
trans.ar = UI/MailPartViewers/Arabic.lproj/Localizable.strings
|
||||
trans.ca = UI/MailPartViewers/Catalan.lproj/Localizable.strings
|
||||
trans.cs = UI/MailPartViewers/Czech.lproj/Localizable.strings
|
||||
trans.cy = UI/MailPartViewers/Welsh.lproj/Localizable.strings
|
||||
@@ -218,6 +246,7 @@ trans.da_DK = UI/MailPartViewers/Danish.lproj/Localizable.strings
|
||||
trans.de = UI/MailPartViewers/German.lproj/Localizable.strings
|
||||
trans.es_AR = UI/MailPartViewers/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = UI/MailPartViewers/SpanishSpain.lproj/Localizable.strings
|
||||
trans.fi = UI/MailPartViewers/Finnish.lproj/Localizable.strings
|
||||
trans.fr = UI/MailPartViewers/French.lproj/Localizable.strings
|
||||
trans.hu = UI/MailPartViewers/Hungarian.lproj/Localizable.strings
|
||||
trans.is = UI/MailPartViewers/Icelandic.lproj/Localizable.strings
|
||||
@@ -228,5 +257,6 @@ trans.nn_NO = UI/MailPartViewers/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = UI/MailPartViewers/Polish.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ru = UI/MailPartViewers/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/MailPartViewers/Slovak.lproj/Localizable.strings
|
||||
trans.sv = UI/MailPartViewers/Swedish.lproj/Localizable.strings
|
||||
trans.uk = UI/MailPartViewers/Ukrainian.lproj/Localizable.strings
|
||||
@@ -0,0 +1,26 @@
|
||||
# use *:8843 for SSL
|
||||
<VirtualHost *:8800>
|
||||
RewriteEngine Off
|
||||
ProxyRequests Off
|
||||
SetEnv proxy-nokeepalive 1
|
||||
ProxyPreserveHost On
|
||||
ProxyPassInterpolateEnv On
|
||||
ProxyPass /principals http://127.0.0.1:20000/SOGo/dav/ interpolate
|
||||
ProxyPass /SOGo http://127.0.0.1:20000/SOGo interpolate
|
||||
ProxyPass / http://127.0.0.1:20000/SOGo/dav/ interpolate
|
||||
<Location />
|
||||
Order allow,deny
|
||||
Allow from all
|
||||
</Location>
|
||||
|
||||
<Proxy http://127.0.0.1:20000>
|
||||
RequestHeader set "x-webobjects-server-port" "8800"
|
||||
RequestHeader set "x-webobjects-server-name" "changethis:8800"
|
||||
RequestHeader set "x-webobjects-server-url" "http://changethis:8800"
|
||||
RequestHeader set "x-webobjects-server-protocol" "HTTP/1.0"
|
||||
AddDefaultCharset UTF-8
|
||||
</Proxy>
|
||||
|
||||
ErrorLog /var/log/apache2/ab-error.log
|
||||
CustomLog /var/log/apache2/ab-access.log combined
|
||||
</VirtualHost>
|
||||
@@ -59,7 +59,6 @@ ProxyPass /SOGo http://127.0.0.1:20000/SOGo retry=0
|
||||
# RequestHeader set "x-webobjects-remote-user" "%{REMOTE_USER}e"
|
||||
|
||||
RequestHeader set "x-webobjects-server-protocol" "HTTP/1.0"
|
||||
RequestHeader set "x-webobjects-remote-host" %{REMOTE_HOST}e env=REMOTE_HOST
|
||||
|
||||
AddDefaultCharset UTF-8
|
||||
|
||||
@@ -67,8 +66,3 @@ ProxyPass /SOGo http://127.0.0.1:20000/SOGo retry=0
|
||||
Allow from all
|
||||
</Proxy>
|
||||
|
||||
## We use mod_rewrite to pass remote address to the SOGo proxy.
|
||||
# The remote address will appear in SOGo's log files and in the X-Forward
|
||||
# header of emails.
|
||||
RewriteEngine On
|
||||
RewriteRule ^/SOGo/(.*)$ /SOGo/$1 [env=REMOTE_HOST:%{REMOTE_ADDR},PT]
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,3 +1,199 @@
|
||||
2.0.7 (2013-07-19)
|
||||
------------------
|
||||
|
||||
New features
|
||||
- print gridlines of calendar in 15-minute intervals
|
||||
- allow the events/tasks lists to be collapsable
|
||||
|
||||
Enhancements
|
||||
- bubble box of events no longer overlaps the current event
|
||||
- now pass the x-originating-ip using the IMAP ID extension (#2366)
|
||||
- updated BrazilianPortuguese, Czech, Dutch, German, Polish and Russian translations
|
||||
|
||||
Bug fixes
|
||||
- properly handle RFC2231 everywhere
|
||||
- fixed minor XSS issues
|
||||
- fixed jquery-ui not bluring the active element when clicking on a draggable
|
||||
|
||||
2.0.6b (2013-06-27)
|
||||
------------------
|
||||
|
||||
Bug fixes
|
||||
- Properly escape the foldername to avoid XSS issues
|
||||
- Fix loading of MSExchangeFreeBusySOAPResponseMap
|
||||
|
||||
2.0.6a (2013-06-25)
|
||||
------------------
|
||||
|
||||
Bug fixes
|
||||
- Documentation fixes
|
||||
- Added missing file for CAS single logout
|
||||
|
||||
2.0.6 (2013-06-21)
|
||||
------------------
|
||||
|
||||
Enhancements
|
||||
- updated CKEditor to version 4.1.1 (#2333)
|
||||
- new failed login attemps rate-limiting options. See the new
|
||||
SOGoMaximumFailedLoginCount, SOGoMaximumFailedLoginInterval and
|
||||
SOGoFailedLoginBlockInterval defaults
|
||||
- new message submissions rate-limiting options. See the new
|
||||
SOGoMaximumMessageSubmissionCount, SOGoMaximumRecipientCount,
|
||||
SOGoMaximumSubmissionInterval and SOGoMessageSubmissionBlockInterval defaults
|
||||
- now possible to send or not event notifications on a per-event basis
|
||||
- now possible to see who created an event/task in a delegated calendar
|
||||
- multi-domain support in OpenChange (implemented using a trick)
|
||||
|
||||
Bug fixes
|
||||
- fixed decoding of the charset parameter when using single quotes (#2306)
|
||||
- fixed potential crash when sending MDN from Sent folder (#2209)
|
||||
- fixed handling of unicode separators (#2309)
|
||||
- fixed public access when SOGoTrustProxyAuthentication is used (#2237)
|
||||
- fixed access right issues with import feature (#2294)
|
||||
- fixed IMAP ACL issue when SOGoForceExternalLoginWithEmail is used (#2313)
|
||||
- fixed handling of CAS logoutRequest (#2346)
|
||||
- fixed many major OpenChange stability issues
|
||||
|
||||
2.0.5a (2013-04-17)
|
||||
------------------
|
||||
|
||||
Bug fixes
|
||||
- Fixed an issue when parsing user CN with leading or trailing spaces (#2287)
|
||||
- Fixed a crash that occured when saving contacts or tasks via Outlook
|
||||
|
||||
2.0.5 (2013-04-11)
|
||||
------------------
|
||||
|
||||
New features
|
||||
- new system default SOGoEncryptionKey to be used to encrypt the passwords of
|
||||
remote Web calendars when SOGoTrustProxyAuthentication is enabled
|
||||
- activated the menu option "Mark Folder Read" in the Webmail (#1473)
|
||||
|
||||
Enhancements
|
||||
- added logging of the X-Forwarded-For HTTP header (#2229)
|
||||
- now use BSON instead of GNUstep's binary format for serializing
|
||||
Outlook related cache files
|
||||
- updated Danish, Finnish, Polish and Slovak translations
|
||||
- added Arabic translation - thanks to Anass Ahmed
|
||||
|
||||
Bug fixes
|
||||
- don't use the cache for password lookups from login page (#2169)
|
||||
- fixed issue with exceptions in repeating events
|
||||
- avoid data truncation issue in OpenChange with mysql backend
|
||||
run sql-update-2.0.4b_to_2.0.5-mysql.sh to update existing tables
|
||||
- avoid random crashes in OpenChange due to RTF conversion
|
||||
- fixed issue when modifying/deleting exceptions of recurring events
|
||||
- fixed major cache miss issue leading to slow Outlook resynchronizations
|
||||
- fixed major memory corruption issue when Outlook was saving "messages"
|
||||
- fixed filtering of sql contact entries when using dynamic domains (#2269)
|
||||
- sogo.conf can now be used by all tools (#2226)
|
||||
- SOPE: fixed handling of sieve capabilities after starttls (#2132)
|
||||
- OpenChange: fixed 'stuck email' problem when sending a mail
|
||||
- OpenChange NTLMAuthHandler: avoid tightloop when samba isn't available.
|
||||
- OpenChange NTLMAuthHandler: avoid crash while parsing cookies
|
||||
- OpenChange ocsmanager: a LOT of fixes, see git log
|
||||
|
||||
|
||||
2.0.4b (2013-02-04)
|
||||
------------------
|
||||
|
||||
Bug fixes
|
||||
- Fixed order of precedence for options (#2166)
|
||||
The following order is enforced - first match wins
|
||||
1. Command line arguments
|
||||
2. .GNUstepDefaults
|
||||
3. /etc/sogo/{debconf,sogo}.conf
|
||||
4. SOGoDefaults.plist
|
||||
- fixed handling of LDAP DN containing special characters (#2152, #2207)
|
||||
- fixed handling of credential files for older GNUsteps (#2216)
|
||||
- fixed display of messages with control characters (#2079, #2177)
|
||||
- fixed tooltips in contacts list (#2211)
|
||||
- fixed classification menu in component editor (#2223)
|
||||
- fixed link to ACL editor for 'any authenticated user' (#2222, #2224)
|
||||
- fixed saving preferences when mail module is disabled
|
||||
- fixed handling for long credential strings (#2212)
|
||||
|
||||
2.0.4a (2013-01-30)
|
||||
------------------
|
||||
|
||||
Enhancements
|
||||
- updated Czech translation
|
||||
- birthday is now properly formatted in addressbook module
|
||||
|
||||
Bug fixes
|
||||
- fixed handling of groups with spaces in their UID
|
||||
- fixed possible infinite loop in repeatable object
|
||||
- fixed until date in component editor
|
||||
- fixed saving all-day event in appointment editor
|
||||
- fixed handling of decoding contacts UID
|
||||
- fixed support of GNUstep 1.20 / Debian Squeeze
|
||||
|
||||
2.0.4 (2013-01-25)
|
||||
------------------
|
||||
|
||||
New features
|
||||
- sogo-tool: new "dump-defaults" command to easily create /etc/sogo/sogo.conf
|
||||
|
||||
Enhancements
|
||||
- The sogo user is now a system user.
|
||||
For new installs, this means that 'su - sogo' won't work anymore.
|
||||
Please use 'sudo -u sogo cmd' instead
|
||||
If used in scripts from cronjobs, 'requiretty' must be disabled in sudoers
|
||||
- added basic support for LDAP URL in user sources
|
||||
- renamed default SOGoForceIMAPLoginWithEmail to
|
||||
SOGoForceExternalLoginWithEmail and extended it to SMTP authentication
|
||||
- updated the timezone files to the 2012j edition and removed RRDATES
|
||||
- updated CKEditor to version 4.0.1
|
||||
- added Finnish translation - thanks to Kari Salmu
|
||||
- updated translations
|
||||
- recurrence-id of all-day events is now set as a proper date with no time
|
||||
- 'show completed tasks' is now persistent
|
||||
- fixed memory usage consumption for remote ICS subscriptions
|
||||
|
||||
Bug fixes
|
||||
- fixed usage of browser's language for the login page
|
||||
- fixed partstat of attendee in her/his calendar
|
||||
- fixed French templates encoding
|
||||
- fixed CardDAV collections for OS X
|
||||
- fixed event recurrence editor (until date)
|
||||
- fixed column display for subfolders of draft & sent
|
||||
- improved IE7 support
|
||||
- fixed drag'n'drop of events with Safari
|
||||
- fixed first day of the week in datepickers
|
||||
- fixed exceptions of recurring all-day events
|
||||
|
||||
2.0.3 (2012-12-06)
|
||||
------------------
|
||||
|
||||
New features
|
||||
- support for SAML2 for single sign-on, with the help of the lasso library
|
||||
- added support for the "AUTHENTICATE" command and SASL mechanisms
|
||||
- added domain default SieveHostFieldName
|
||||
- added a search field for tasks
|
||||
|
||||
Enhancements
|
||||
- search the contacts for the organization attribute
|
||||
- in HTML mode, optionally place answer after the quoted text
|
||||
- improved memory usage of "sogo-tool restore"
|
||||
- fixed invitations status in OSX iCal.app/Calendar.app (cleanup RSVP attribute)
|
||||
- now uses "imap4flags" instead of the deprecated "imapflags"
|
||||
- added Slovak translation - thanks to Martin Pastor
|
||||
- updated translations
|
||||
|
||||
Bug fixes
|
||||
- fixed LDIF import with categories
|
||||
- imported events now keep their UID when possible
|
||||
- fixed importation of multiple calendars
|
||||
- fixed modification date when drag'n'droping events
|
||||
- fixed missing 'from' header in Outlook
|
||||
- fixed invitations in Outlook
|
||||
- fixed JavaScript regexp for Firefox
|
||||
- fixed JavaScript syntax for IE7
|
||||
- fixed all-day event display in day/week view
|
||||
- fixed parsing of alarm
|
||||
- fixed Sieve server URL fallback
|
||||
- fixed Debian cronjob (spool directory cleanup)
|
||||
|
||||
2.0.2a (2012-11-15)
|
||||
-------------------
|
||||
|
||||
|
||||
@@ -7,8 +7,7 @@ libOGoContentStore_LIBRARIES_DEPEND_UPON += \
|
||||
-lNGExtensions \
|
||||
-lEOControl \
|
||||
-lSaxObjC \
|
||||
-lgnustep-base \
|
||||
-lobjc
|
||||
$(BASE_LIBS)
|
||||
|
||||
ADDITIONAL_INCLUDE_DIRS += -I. -I.. -I../SOPE -I../SoObjects
|
||||
|
||||
@@ -29,4 +28,5 @@ test_quick_extract_TOOL_LIBS += \
|
||||
-lNGCards \
|
||||
-lGDLContentStore \
|
||||
-lGDLAccess \
|
||||
-lOGoContentStore
|
||||
-lOGoContentStore \
|
||||
$(BASE_LIBS)
|
||||
@@ -0,0 +1,50 @@
|
||||
//
|
||||
// BSONCodec.h
|
||||
// BSON Codec for Objective-C.
|
||||
//
|
||||
// Created by Martin Kou on 8/17/10.
|
||||
// MIT License, see LICENSE file for details.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <stdint.h>
|
||||
|
||||
@protocol BSONCoding
|
||||
- (uint8_t) BSONTypeID;
|
||||
- (NSData *) BSONEncode;
|
||||
- (NSData *) BSONRepresentation;
|
||||
+ (id) BSONFragment: (NSData *) data at: (const void **) base ofType: (uint8_t) typeID;
|
||||
@end
|
||||
|
||||
@protocol BSONObjectCoding
|
||||
- (id) initWithBSONDictionary: (NSDictionary *) data;
|
||||
- (NSDictionary *) BSONDictionary;
|
||||
@end
|
||||
|
||||
@interface NSObject (BSONObjectCoding)
|
||||
- (NSData *) BSONEncode;
|
||||
- (NSData *) BSONRepresentation;
|
||||
@end
|
||||
|
||||
|
||||
@interface NSDictionary (BSON) <BSONCoding>
|
||||
@end
|
||||
|
||||
@interface NSData (BSON) <BSONCoding>
|
||||
- (NSDictionary *) BSONValue;
|
||||
@end
|
||||
|
||||
@interface NSNumber (BSON) <BSONCoding>
|
||||
@end
|
||||
|
||||
@interface NSString (BSON) <BSONCoding>
|
||||
@end
|
||||
|
||||
@interface NSArray (BSON) <BSONCoding>
|
||||
@end
|
||||
|
||||
@interface NSNull (BSON) <BSONCoding>
|
||||
@end
|
||||
|
||||
@interface NSCalendarDate (BSON) <BSONCoding>
|
||||
@end
|
||||
@@ -0,0 +1,585 @@
|
||||
//
|
||||
// BSONCodec.m
|
||||
// BSON Codec for Objective-C.
|
||||
//
|
||||
// Created by Martin Kou on 8/17/10.
|
||||
// MIT License, see LICENSE file for details.
|
||||
//
|
||||
|
||||
#import "BSONCodec.h"
|
||||
#import <ctype.h>
|
||||
#import <string.h>
|
||||
#import <objc/objc.h>
|
||||
|
||||
#define BSONTYPE(tag,className) [className class], [NSNumber numberWithChar: (tag)]
|
||||
|
||||
#ifndef objc_msgSend
|
||||
#define objc_msgSend(obj, sel, ...) \
|
||||
objc_msg_lookup(obj, sel)(obj, sel, ## __VA_ARGS__)
|
||||
#endif
|
||||
|
||||
static NSDictionary *BSONTypes()
|
||||
{
|
||||
static NSDictionary *retval = nil;
|
||||
|
||||
if (retval == nil)
|
||||
{
|
||||
retval = [[NSDictionary dictionaryWithObjectsAndKeys:
|
||||
BSONTYPE(0x01, NSNumber),
|
||||
BSONTYPE(0x02, NSString),
|
||||
BSONTYPE(0x03, NSDictionary),
|
||||
BSONTYPE(0x04, NSArray),
|
||||
BSONTYPE(0x05, NSData),
|
||||
BSONTYPE(0x08, NSNumber),
|
||||
BSONTYPE(0x0A, NSNull),
|
||||
BSONTYPE(0x10, NSNumber),
|
||||
BSONTYPE(0x11, NSCalendarDate),
|
||||
BSONTYPE(0x12, NSNumber),
|
||||
nil] retain];
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
#define SWAP16(x) \
|
||||
((uint16_t)((((uint16_t)(x) & 0xff00) >> 8) | \
|
||||
(((uint16_t)(x) & 0x00ff) << 8)))
|
||||
|
||||
#define SWAP32(x) \
|
||||
((uint32_t)((((uint32_t)(x) & 0xff000000) >> 24) | \
|
||||
(((uint32_t)(x) & 0x00ff0000) >> 8) | \
|
||||
(((uint32_t)(x) & 0x0000ff00) << 8) | \
|
||||
(((uint32_t)(x) & 0x000000ff) << 24)))
|
||||
|
||||
#define SWAP64(x) \
|
||||
((uint64_t)((((uint64_t)(x) & 0xff00000000000000ULL) >> 56) | \
|
||||
(((uint64_t)(x) & 0x00ff000000000000ULL) >> 40) | \
|
||||
(((uint64_t)(x) & 0x0000ff0000000000ULL) >> 24) | \
|
||||
(((uint64_t)(x) & 0x000000ff00000000ULL) >> 8) | \
|
||||
(((uint64_t)(x) & 0x00000000ff000000ULL) << 8) | \
|
||||
(((uint64_t)(x) & 0x0000000000ff0000ULL) << 24) | \
|
||||
(((uint64_t)(x) & 0x000000000000ff00ULL) << 40) | \
|
||||
(((uint64_t)(x) & 0x00000000000000ffULL) << 56)))
|
||||
|
||||
|
||||
#if BYTE_ORDER == LITTLE_ENDIAN
|
||||
#define BSONTOHOST16(x) (x)
|
||||
#define BSONTOHOST32(x) (x)
|
||||
#define BSONTOHOST64(x) (x)
|
||||
#define HOSTTOBSON16(x) (x)
|
||||
#define HOSTTOBSON32(x) (x)
|
||||
#define HOSTTOBSON64(x) (x)
|
||||
|
||||
#elif BYTE_ORDER == BIG_ENDIAN
|
||||
#define BSONTOHOST16(x) SWAP16(x)
|
||||
#define BSONTOHOST32(x) SWAP32(x)
|
||||
#define BSONTOHOST64(x) SWAP64(x)
|
||||
#define HOSTTOBSON16(x) SWAP16(x)
|
||||
#define HOSTTOBSON32(x) SWAP16(x)
|
||||
#define HOSTTOBSON64(x) SWAP16(x)
|
||||
|
||||
#endif
|
||||
|
||||
#define CLASS_NAME_MARKER @"$$__CLASS_NAME__$$"
|
||||
|
||||
@implementation NSObject (BSONObjectCoding)
|
||||
- (NSData *) BSONEncode
|
||||
{
|
||||
if (!class_conformsToProtocol([self class], @protocol(BSONObjectCoding)))
|
||||
[NSException raise: NSInvalidArgumentException format: @"BSON encoding is only valid on objects conforming to the BSONObjectEncoding protocol."];
|
||||
|
||||
id <BSONObjectCoding> myself = (id <BSONObjectCoding>) self;
|
||||
NSMutableDictionary *values = [[myself BSONDictionary] mutableCopy];
|
||||
|
||||
const char* className = class_getName([self class]);
|
||||
[values setObject: [NSData dataWithBytes: (void *)className length: strlen(className)] forKey: CLASS_NAME_MARKER];
|
||||
NSData *retval = [values BSONEncode];
|
||||
[values release];
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
- (NSData *) BSONRepresentation
|
||||
{
|
||||
return [self BSONEncode];
|
||||
}
|
||||
@end
|
||||
|
||||
|
||||
@implementation NSDictionary (BSON)
|
||||
|
||||
- (uint8_t) BSONTypeID
|
||||
{
|
||||
return 0x03;
|
||||
}
|
||||
|
||||
- (NSData *) BSONEncode
|
||||
{
|
||||
// Initialize the components structure.
|
||||
NSMutableArray *components = [[NSMutableArray alloc] init];
|
||||
|
||||
NSMutableData *lengthData = [[NSMutableData alloc] initWithLength: 4];
|
||||
[components addObject: lengthData];
|
||||
[lengthData release];
|
||||
|
||||
NSMutableData *contentsData = [[NSMutableData alloc] init];
|
||||
[components addObject: contentsData];
|
||||
[contentsData release];
|
||||
|
||||
[components addObject: [NSData dataWithBytes: "\x00" length: 1]];
|
||||
|
||||
// Ensure ordered keys. not in BSON spec, but ensures all BSONRepresentations
|
||||
// of the same dict will be the same.
|
||||
NSMutableArray *keys = [[NSMutableArray alloc] init];
|
||||
[keys addObjectsFromArray: [self allKeys]];
|
||||
//[keys sortUsingSelector: @selector(caseInsensitiveCompare:)];
|
||||
|
||||
// Encode data.- (NSData *) BSONEncode;
|
||||
uint8_t elementType = 0;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < [keys count]; i++)
|
||||
{
|
||||
NSString *key = [keys objectAtIndex: i];
|
||||
NSObject *value = [self objectForKey: key];
|
||||
|
||||
if ([value respondsToSelector: @selector(BSONTypeID)])
|
||||
elementType = [(id <BSONCoding>) value BSONTypeID];
|
||||
else
|
||||
elementType = 3;
|
||||
|
||||
[contentsData appendBytes: &elementType length: 1];
|
||||
[contentsData appendData: [key dataUsingEncoding: NSUTF8StringEncoding]];
|
||||
[contentsData appendBytes: "\x00" length: 1];
|
||||
[contentsData appendData: [value BSONEncode]];
|
||||
}
|
||||
[keys release];
|
||||
|
||||
// Write length.
|
||||
uint32_t *length = (uint32_t *)[lengthData mutableBytes];
|
||||
*length = HOSTTOBSON32([contentsData length]) + 4 + 1;
|
||||
|
||||
// Assemble the output data.
|
||||
NSMutableData *retval = [NSMutableData data];
|
||||
for (i = 0; i < [components count]; i++)
|
||||
[retval appendData: [components objectAtIndex: i]];
|
||||
[components release];
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
- (NSData *) BSONRepresentation
|
||||
{
|
||||
return [self BSONEncode];
|
||||
}
|
||||
|
||||
+ (id) BSONFragment: (NSData *) data at: (const void **) base ofType: (uint8_t) t
|
||||
{
|
||||
const void *current = [data bytes];
|
||||
if ((id)base != nil)
|
||||
current = *base;
|
||||
else
|
||||
base = ¤t;
|
||||
|
||||
uint32_t length = BSONTOHOST32(*((uint32_t *)current));
|
||||
const void *endPoint = current + length;
|
||||
current += 4;
|
||||
|
||||
NSMutableDictionary *retval = [NSMutableDictionary dictionary];
|
||||
while (current < endPoint - 1)
|
||||
{
|
||||
uint8_t typeID = *((uint8_t *)current);
|
||||
current++;
|
||||
|
||||
char *utf8Key = (char *) current;
|
||||
while (*((char *)current) != 0 && current < endPoint - 1)
|
||||
current++;
|
||||
current++;
|
||||
NSString *key = [NSString stringWithUTF8String: utf8Key];
|
||||
|
||||
*base = current;
|
||||
Class typeClass = [BSONTypes() objectForKey: [NSNumber numberWithChar: typeID]];
|
||||
id value = objc_msgSend(typeClass, @selector(BSONFragment:at:ofType:), data, base, typeID);
|
||||
current = *base;
|
||||
|
||||
[retval setObject: value forKey: key];
|
||||
}
|
||||
|
||||
*base = current + 1;
|
||||
|
||||
// If the dictionary has a class name marker, then it is to be converted to an object.
|
||||
if ([retval objectForKey: CLASS_NAME_MARKER] != nil)
|
||||
{
|
||||
NSData *classNameData = [retval objectForKey: CLASS_NAME_MARKER];
|
||||
char *className = malloc([classNameData length] + 1);
|
||||
memcpy(className, [classNameData bytes], [classNameData length]);
|
||||
className[[classNameData length]] = 0;
|
||||
|
||||
Class targetClass = objc_getClass(className);
|
||||
if (targetClass == nil)
|
||||
[NSException raise: NSInvalidArgumentException format: @"Class %s found in incoming data is undefined.", className];
|
||||
|
||||
id obj = [[targetClass alloc] initWithBSONDictionary: retval];
|
||||
return obj;
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
@end
|
||||
|
||||
@implementation NSData (BSON)
|
||||
- (uint8_t) BSONTypeID
|
||||
{
|
||||
return 0x05;
|
||||
}
|
||||
|
||||
- (NSData *) BSONEncode
|
||||
{
|
||||
uint32_t length = HOSTTOBSON32([self length]);
|
||||
NSMutableData *retval = [NSMutableData data];
|
||||
[retval appendBytes: &length length: 4];
|
||||
[retval appendBytes: "\x00" length: 1];
|
||||
[retval appendData: self];
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
- (NSData *) BSONRepresentation
|
||||
{
|
||||
return [self BSONEncode];
|
||||
}
|
||||
|
||||
+ (id) BSONFragment: (NSData *) data at: (const void **) base ofType: (uint8_t) t
|
||||
{
|
||||
const void *current = [data bytes];
|
||||
if ((id)base != nil)
|
||||
current = *base;
|
||||
else
|
||||
base = ¤t;
|
||||
|
||||
uint32_t length = BSONTOHOST32(*((uint32_t *)current));
|
||||
current += 4 + 1;
|
||||
|
||||
NSData *retval = [NSData dataWithBytes: current length: length];
|
||||
current += length;
|
||||
*base = current;
|
||||
return retval;
|
||||
}
|
||||
|
||||
- (NSDictionary *) BSONValue
|
||||
{
|
||||
return [NSDictionary BSONFragment: self at: NULL ofType: 0x03];
|
||||
}
|
||||
@end
|
||||
|
||||
@implementation NSNumber (BSON)
|
||||
- (uint8_t) BSONTypeID
|
||||
{
|
||||
const char encoding = tolower(*([self objCType]));
|
||||
|
||||
switch (encoding) {
|
||||
case 'f':
|
||||
case 'd': return 0x01;
|
||||
case 'b': return 0x08;
|
||||
case 'c':
|
||||
case 's': return 0x10;
|
||||
case 'i':
|
||||
// Ok, if you're running Objective-C on 16-bit platforms...
|
||||
// Then YOU have issues.
|
||||
// So, yeah, we won't handle that case.
|
||||
if (sizeof(int) == 4)
|
||||
return 0x10;
|
||||
else if (sizeof(int) == 8)
|
||||
return 0x12;
|
||||
|
||||
case 'l':
|
||||
if (sizeof(long) == 4)
|
||||
return 0x10;
|
||||
else if (sizeof(long) == 8)
|
||||
return 0x12;
|
||||
|
||||
case 'q': return 0x12;
|
||||
default:
|
||||
[NSException raise: NSInvalidArgumentException format: @"%@::%s - invalid encoding type '%c'", [self class], _cmd, encoding];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
- (NSData *) BSONEncode
|
||||
{
|
||||
const char encoding = *([self objCType]);
|
||||
|
||||
if (encoding == 'd' || encoding == 'D')
|
||||
{
|
||||
double value = [self doubleValue];
|
||||
return [NSData dataWithBytes: &value length: 8];
|
||||
}
|
||||
|
||||
if (encoding == 'f' || encoding == 'F')
|
||||
{
|
||||
double value = [self floatValue];
|
||||
return [NSData dataWithBytes: &value length: 8];
|
||||
}
|
||||
|
||||
if (encoding == 'b' || encoding == 'B')
|
||||
{
|
||||
char value = [self boolValue];
|
||||
return [NSData dataWithBytes: &value length: 1];
|
||||
}
|
||||
|
||||
if (encoding == 'c' || encoding == 'C')
|
||||
{
|
||||
int32_t value = [self charValue];
|
||||
value = HOSTTOBSON32(value);
|
||||
return [NSData dataWithBytes: &value length: 4];
|
||||
}
|
||||
|
||||
if (encoding == 's' || encoding == 'S')
|
||||
{
|
||||
int32_t value = [self shortValue];
|
||||
value = HOSTTOBSON32(value);
|
||||
return [NSData dataWithBytes: &value length: 4];
|
||||
}
|
||||
|
||||
if (encoding == 'i' || encoding == 'I')
|
||||
{
|
||||
int value = [self intValue];
|
||||
if (sizeof(int) == 4)
|
||||
value = HOSTTOBSON32(value);
|
||||
else if (sizeof(int) == 8)
|
||||
value = HOSTTOBSON64(value);
|
||||
return [NSData dataWithBytes: &value length: sizeof(int)];
|
||||
}
|
||||
|
||||
if (encoding == 'l' || encoding == 'L')
|
||||
{
|
||||
long value = [self longValue];
|
||||
if (sizeof(long) == 4)
|
||||
value = HOSTTOBSON32(value);
|
||||
else if (sizeof(long) == 8)
|
||||
value = HOSTTOBSON64(value);
|
||||
|
||||
return [NSData dataWithBytes: &value length: sizeof(long)];
|
||||
}
|
||||
|
||||
if (encoding == 'q')
|
||||
{
|
||||
long long value = HOSTTOBSON64([self longLongValue]);
|
||||
return [NSData dataWithBytes: &value length: 8];
|
||||
}
|
||||
|
||||
if (encoding == 'Q')
|
||||
{
|
||||
long long value = HOSTTOBSON64([self unsignedLongLongValue]);
|
||||
return [NSData dataWithBytes: &value length: 8];
|
||||
}
|
||||
|
||||
|
||||
[NSException raise: NSInvalidArgumentException format: @"%@::%s - invalid encoding type '%c'", [self class], _cmd, encoding];
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSData *) BSONRepresentation
|
||||
{
|
||||
return [self BSONEncode];
|
||||
}
|
||||
|
||||
+ (id) BSONFragment: (NSData *) data at: (const void **) base ofType: (uint8_t) t
|
||||
{
|
||||
if (t == 0x01)
|
||||
{
|
||||
// #5: LLVM GCC requires double pointers to have a certain alignment in ARM CPUs.
|
||||
// So we can't just read the double off directly from the data - need to copy it.
|
||||
double value;
|
||||
memcpy(&value, *base, sizeof(double));
|
||||
*base += 8;
|
||||
return [NSNumber numberWithDouble: value];
|
||||
}
|
||||
|
||||
if (t == 0x08)
|
||||
{
|
||||
char value = ((char *) *base)[0];
|
||||
*base += 1;
|
||||
return [NSNumber numberWithBool: value];
|
||||
}
|
||||
|
||||
if (t == 0x10)
|
||||
{
|
||||
int32_t value = BSONTOHOST32(((int32_t *) *base)[0]);
|
||||
*base += 4;
|
||||
|
||||
if (sizeof(int) == 4)
|
||||
return [NSNumber numberWithInt: value];
|
||||
|
||||
return [NSNumber numberWithLong: value];
|
||||
}
|
||||
|
||||
if (t == 0x12)
|
||||
{
|
||||
int64_t value = BSONTOHOST64(((int64_t *) *base)[0]);
|
||||
*base += 8;
|
||||
|
||||
return [NSNumber numberWithUnsignedLongLong: value];
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
@end
|
||||
|
||||
@implementation NSString (BSON)
|
||||
- (uint8_t) BSONTypeID
|
||||
{
|
||||
return 0x02;
|
||||
}
|
||||
|
||||
- (NSData *) BSONEncode
|
||||
{
|
||||
NSData *utf8Data = [self dataUsingEncoding: NSUTF8StringEncoding];
|
||||
uint32_t length = HOSTTOBSON32([utf8Data length] + 1);
|
||||
|
||||
NSMutableData *retval = [NSMutableData data];
|
||||
[retval appendBytes: &length length: 4];
|
||||
[retval appendData: utf8Data];
|
||||
[retval appendBytes: "\x00" length: 1];
|
||||
return retval;
|
||||
}
|
||||
|
||||
- (NSData *) BSONRepresentation
|
||||
{
|
||||
return [self BSONEncode];
|
||||
}
|
||||
|
||||
+ (id) BSONFragment: (NSData *) data at: (const void **) base ofType: (uint8_t) typeID
|
||||
{
|
||||
uint32_t length = BSONTOHOST32(((const uint32_t *) *base)[0]);
|
||||
*base += 4;
|
||||
|
||||
const char *utf8Str = (const char *) *base;
|
||||
*base += length;
|
||||
|
||||
return [NSString stringWithUTF8String: utf8Str];
|
||||
}
|
||||
@end
|
||||
|
||||
@implementation NSArray (BSON)
|
||||
- (uint8_t) BSONTypeID
|
||||
{
|
||||
return 0x04;
|
||||
}
|
||||
|
||||
- (NSData *) BSONEncode
|
||||
{
|
||||
// Initialize the components structure.
|
||||
NSMutableArray *components = [[NSMutableArray alloc] init];
|
||||
|
||||
NSMutableData *lengthData = [[NSMutableData alloc] initWithLength: 4];
|
||||
[components addObject: lengthData];
|
||||
[lengthData release];
|
||||
|
||||
NSMutableData *contentsData = [[NSMutableData alloc] init];
|
||||
[components addObject: contentsData];
|
||||
[contentsData release];
|
||||
|
||||
[components addObject: [NSData dataWithBytes: "\x00" length: 1]];
|
||||
|
||||
// Encode data.
|
||||
uint8_t elementType = 0;
|
||||
int i, count = [self count];
|
||||
for (i = 0 ; i < count ; i++)
|
||||
{
|
||||
NSObject *value = [self objectAtIndex: i];
|
||||
|
||||
if ([value respondsToSelector: @selector(BSONTypeID)])
|
||||
elementType = [(id <BSONCoding>) value BSONTypeID];
|
||||
else
|
||||
elementType = 3;
|
||||
|
||||
[contentsData appendBytes: &elementType length: 1];
|
||||
[contentsData appendData: [[NSString stringWithFormat: @"%d", i] dataUsingEncoding: NSUTF8StringEncoding]];
|
||||
[contentsData appendBytes: "\x00" length: 1];
|
||||
[contentsData appendData: [value BSONEncode]];
|
||||
}
|
||||
|
||||
// Write length.
|
||||
uint32_t *length = (uint32_t *)[lengthData mutableBytes];
|
||||
*length = HOSTTOBSON32([contentsData length]) + 4 + 1;
|
||||
|
||||
// Assemble the output data.
|
||||
NSMutableData *retval = [NSMutableData data];
|
||||
for (i = 0; i < [components count]; i++)
|
||||
[retval appendData: [components objectAtIndex: i]];
|
||||
[components release];
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
- (NSData *) BSONRepresentation
|
||||
{
|
||||
return [self BSONEncode];
|
||||
}
|
||||
|
||||
+ (id) BSONFragment: (NSData *) data at: (const void **) base ofType: (uint8_t) typeID
|
||||
{
|
||||
NSDictionary *tmp = [NSDictionary BSONFragment: data at: base ofType: 0x03];
|
||||
NSMutableArray *retval = [NSMutableArray arrayWithCapacity: [tmp count]];
|
||||
int i;
|
||||
for (i = 0; i < [tmp count]; i++)
|
||||
[retval addObject: [tmp objectForKey: [NSString stringWithFormat: @"%d", i]]];
|
||||
|
||||
return retval;
|
||||
}
|
||||
@end
|
||||
|
||||
@implementation NSNull (BSON)
|
||||
- (uint8_t) BSONTypeID
|
||||
{
|
||||
return 0x0a;
|
||||
}
|
||||
|
||||
- (NSData *) BSONEncode
|
||||
{
|
||||
return [NSData data];
|
||||
}
|
||||
|
||||
- (NSData *) BSONRepresentation
|
||||
{
|
||||
return [self BSONEncode];
|
||||
}
|
||||
|
||||
+ (id) BSONFragment: (NSData *) data at: (const void **) base ofType: (uint8_t) typeID
|
||||
{
|
||||
return [NSNull null];
|
||||
}
|
||||
@end
|
||||
|
||||
@implementation NSCalendarDate (BSON)
|
||||
- (uint8_t) BSONTypeID
|
||||
{
|
||||
return 0x11;
|
||||
}
|
||||
|
||||
- (NSData *) BSONEncode
|
||||
{
|
||||
NSString *v;
|
||||
|
||||
v = [self descriptionWithCalendarFormat: @"%Y-%m-%d %H:%M:%S %Z"
|
||||
locale: nil];
|
||||
|
||||
return [v BSONEncode];
|
||||
}
|
||||
|
||||
- (NSData *) BSONRepresentation
|
||||
{
|
||||
return [self BSONEncode];
|
||||
}
|
||||
|
||||
+ (id) BSONFragment: (NSData *) data at: (const void **) base ofType: (uint8_t) typeID
|
||||
{
|
||||
NSString *v;
|
||||
|
||||
v = [NSString BSONFragment: data at: base ofType: 0x02];
|
||||
|
||||
return [NSCalendarDate dateWithString: v
|
||||
calendarFormat: @"%Y-%m-%d %H:%M:%S %Z"];
|
||||
}
|
||||
@end
|
||||
@@ -46,12 +46,12 @@
|
||||
NSDictionary *properties;
|
||||
BOOL rc;
|
||||
|
||||
[self logWithFormat: @"evaluating object '%@'", object];
|
||||
//[self logWithFormat: @"evaluating object '%@'", object];
|
||||
|
||||
properties = [object properties];
|
||||
rc = [self _evaluateSOGoMAPIDBObject: properties];
|
||||
|
||||
[self logWithFormat: @" evaluation result: %d", rc];
|
||||
//[self logWithFormat: @" evaluation result: %d", rc];
|
||||
|
||||
return rc;
|
||||
}
|
||||
@@ -150,9 +150,9 @@ typedef BOOL (*EOComparator) (id, SEL, id);
|
||||
rc = ((isZero && (intValue & mask) == 0)
|
||||
|| (!isZero && (intValue & mask) != 0));
|
||||
|
||||
[self logWithFormat: @"evaluation of bitmask qualifier:"
|
||||
@" (%.8x & %.8x) %s 0: %d",
|
||||
intValue, mask, (isZero ? "==" : "!="), rc];
|
||||
//[self logWithFormat: @"evaluation of bitmask qualifier:"
|
||||
// @" (%.8x & %.8x) %s 0: %d",
|
||||
// intValue, mask, (isZero ? "==" : "!="), rc];
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
@" c_lastmodified INT NOT NULL,"
|
||||
@" c_version INT NOT NULL DEFAULT 0,"
|
||||
@" c_deleted TINYINT NOT NULL DEFAULT 0,"
|
||||
@" c_content TEXT)");
|
||||
@" c_content LONGTEXT)");
|
||||
|
||||
return [NSString stringWithFormat: sqlFolderFormat, tableName];
|
||||
}
|
||||
|
||||
+5
-30
@@ -7,8 +7,6 @@ include ../Version
|
||||
|
||||
BACKEND_VERSION = 1.0.0
|
||||
|
||||
UNRTF_VERSION = 0.21.2
|
||||
|
||||
### bootstrap library
|
||||
MAPISTORESOGO = MAPIStoreSOGo
|
||||
LIBRARY_NAME = $(MAPISTORESOGO)
|
||||
@@ -24,8 +22,6 @@ BUNDLE_NAME = $(SOGOBACKEND)
|
||||
BUNDLE_EXTENSION = .MAPIStore
|
||||
BUNDLE_INSTALL_DIR = $(SOGO_LIBDIR)
|
||||
|
||||
UNRTF_DIR = unrtf-$(UNRTF_VERSION)
|
||||
|
||||
PYTHON = /usr/bin/python
|
||||
PYTHON_IS_GOOD = $(shell $(PYTHON) -c 'from sys import version_info; a=version_info; print a[0] == 2 and a[1] >= 6')
|
||||
ifeq (${PYTHON_IS_GOOD},False)
|
||||
@@ -37,8 +33,6 @@ all::
|
||||
|
||||
SAMBA_PRIVATE_DIR = $(shell $(PYTHON) ./samba-get-config.py "private dir")
|
||||
|
||||
$(SOGOBACKEND)_SUBPROJECTS += $(UNRTF_DIR)/src
|
||||
|
||||
$(SOGOBACKEND)_PRINCIPAL_CLASS = MAPIApplication
|
||||
|
||||
$(SOGOBACKEND)_OBJC_FILES += \
|
||||
@@ -133,32 +127,14 @@ $(SOGOBACKEND)_OBJC_FILES += \
|
||||
\
|
||||
EOQualifier+MAPI.m \
|
||||
\
|
||||
EOBitmaskQualifier.m
|
||||
EOBitmaskQualifier.m \
|
||||
\
|
||||
BSONCodec.m \
|
||||
RTFHandler.m
|
||||
|
||||
|
||||
$(SOGOBACKEND)_RESOURCE_FILES += \
|
||||
product.plist \
|
||||
$(UNRTF_DIR)/charmaps/SYMBOL.charmap \
|
||||
$(UNRTF_DIR)/outputs/html.conf
|
||||
|
||||
### unrtf
|
||||
all:: $(UNRTF_DIR)/config.h $(UNRTF_DIR)/src/GNUmakefile
|
||||
|
||||
$(UNRTF_DIR): $(UNRTF_DIR).tar.gz $(UNRTF_DIR).diff
|
||||
@echo " Extracting and patching $(UNRTF_DIR)..."
|
||||
@rm -rf $(UNRTF_DIR)
|
||||
@$(TAR) -xvzf $< > /dev/null
|
||||
@(cd $(UNRTF_DIR) && patch -p1 < ../$(UNRTF_DIR).diff) > /dev/null
|
||||
@touch $(UNRTF_DIR)
|
||||
|
||||
$(UNRTF_DIR)-stamp: $(UNRTF_DIR)
|
||||
@touch $@
|
||||
|
||||
$(UNRTF_DIR)/config.h: $(UNRTF_DIR)-stamp unrtf_config_h
|
||||
@cp unrtf_config_h $(UNRTF_DIR)/config.h
|
||||
|
||||
$(UNRTF_DIR)/src/GNUmakefile: $(UNRTF_DIR)-stamp GNUmakefile.unrtf
|
||||
@cp GNUmakefile.unrtf $@
|
||||
product.plist
|
||||
|
||||
### pl reader
|
||||
PLREADER_TOOL = plreader
|
||||
@@ -210,7 +186,6 @@ ADDITIONAL_INCLUDE_DIRS += \
|
||||
-DSAMBA_PRIVATE_DIR=@"\"$(SAMBA_PRIVATE_DIR)\"" \
|
||||
$(LIBMAPI_CFLAGS) \
|
||||
$(LIBMAPISTORE_CFLAGS) \
|
||||
-I$(UNRTF_DIR)/src \
|
||||
-I../SoObjects -I../SOPE \
|
||||
-DBACKEND_BUNDLE_NAME="@\"$(BUNDLE_NAME)$(BUNDLE_EXTENSION)\"" \
|
||||
-DSOGO_BUNDLES_DIR="@\"$(BUNDLE_INSTALL_DIR)\""
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
# -*-makefile-*-
|
||||
|
||||
# GNUstep makefile
|
||||
|
||||
include $(GNUSTEP_MAKEFILES)/common.make
|
||||
|
||||
UNRTF = unrtf
|
||||
|
||||
SUBPROJECT_NAME = $(UNRTF)
|
||||
|
||||
$(UNRTF)_C_FILES = \
|
||||
attr.c \
|
||||
convert.c \
|
||||
error.c \
|
||||
hash.c \
|
||||
malloc.c \
|
||||
my_iconv.c \
|
||||
output.c \
|
||||
parse.c \
|
||||
unicode.c \
|
||||
user.c \
|
||||
util.c \
|
||||
word.c
|
||||
|
||||
$(UNRTF)_CFLAGS = -DHAVE_CONFIG_H=1 -I. -I../
|
||||
|
||||
# Option include to set any additional variables
|
||||
-include GNUmakefile.preamble
|
||||
|
||||
# Include in the rules for making libraries
|
||||
include $(GNUSTEP_MAKEFILES)/subproject.make
|
||||
|
||||
# Option include to define any additional rules
|
||||
-include GNUmakefile.postamble
|
||||
@@ -48,7 +48,7 @@
|
||||
- (NSData *) mimeAttachTag;
|
||||
|
||||
/* move & copy operations */
|
||||
- (void) copyToAttachment: (MAPIStoreAttachment *) newAttachment;
|
||||
- (void) copyToAttachment: (MAPIStoreAttachment *) newAttachment inMemCtx: (TALLOC_CTX *) memCtx;
|
||||
|
||||
/* subclasses */
|
||||
- (MAPIStoreEmbeddedMessage *) openEmbeddedMessage;
|
||||
|
||||
@@ -152,13 +152,13 @@
|
||||
return ULLONG_MAX;
|
||||
}
|
||||
|
||||
- (void) copyToAttachment: (MAPIStoreAttachment *) newAttachment
|
||||
- (void) copyToAttachment: (MAPIStoreAttachment *) newAttachment inMemCtx: (TALLOC_CTX *) memCtx
|
||||
{
|
||||
void *attachMethod;
|
||||
enum mapistore_error error;
|
||||
MAPIStoreEmbeddedMessage *embeddedMessage, *newEmbeddedMessage;
|
||||
|
||||
[self copyPropertiesToObject: newAttachment];
|
||||
[self copyPropertiesToObject: newAttachment inMemCtx: memCtx];
|
||||
|
||||
attachMethod = NULL;
|
||||
error = [self getProperty: &attachMethod
|
||||
@@ -170,7 +170,7 @@
|
||||
{
|
||||
embeddedMessage = [self openEmbeddedMessage];
|
||||
newEmbeddedMessage = [newAttachment createEmbeddedMessage];
|
||||
[embeddedMessage copyToMessage: newEmbeddedMessage];
|
||||
[embeddedMessage copyToMessage: newEmbeddedMessage inMemCtx: memCtx];
|
||||
}
|
||||
talloc_free (attachMethod);
|
||||
}
|
||||
|
||||
@@ -161,7 +161,7 @@
|
||||
return [self getNo: data inMemCtx: memCtx];
|
||||
}
|
||||
|
||||
- (void) save
|
||||
- (void) save: (TALLOC_CTX *) memCtx
|
||||
{
|
||||
// (gdb) po embeddedMessage->properties
|
||||
// 2442592320 = "2012-07-11 22:30:00 +0000";
|
||||
@@ -208,7 +208,8 @@
|
||||
|
||||
[[container event] updateFromMAPIProperties: properties
|
||||
inUserContext: [self userContext]
|
||||
withActiveUser: activeUser];
|
||||
withActiveUser: activeUser
|
||||
inMemCtx: memCtx];
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -63,6 +63,8 @@
|
||||
SOGoAppointmentObject *newEntry;
|
||||
NSString *name;
|
||||
|
||||
//[self logWithFormat: @"METHOD '%s' (%d)", __FUNCTION__, __LINE__];
|
||||
|
||||
name = [NSString stringWithFormat: @"%@.ics",
|
||||
[SOGoObject globallyUniqueObjectId]];
|
||||
newEntry = [SOGoAppointmentObject objectWithName: name
|
||||
|
||||
@@ -200,6 +200,7 @@ static Class NSArrayK;
|
||||
|
||||
- (void) dealloc
|
||||
{
|
||||
//NSLog(@"MAPIStoreCalendarMessage: -dealloc (%p)", self);
|
||||
[calendar release];
|
||||
[super dealloc];
|
||||
}
|
||||
@@ -417,7 +418,7 @@ static Class NSArrayK;
|
||||
return [self getYes: data inMemCtx: memCtx];
|
||||
}
|
||||
|
||||
- (NSString *) _uidFromGlobalObjectId
|
||||
- (NSString *) _uidFromGlobalObjectId: (TALLOC_CTX *) memCtx
|
||||
{
|
||||
NSData *objectId;
|
||||
NSString *uid = nil;
|
||||
@@ -431,7 +432,7 @@ static Class NSArrayK;
|
||||
if (objectId)
|
||||
{
|
||||
length = [objectId length];
|
||||
bytesDup = talloc_array (NULL, char, length + 1);
|
||||
bytesDup = talloc_array (memCtx, char, length + 1);
|
||||
memcpy (bytesDup, [objectId bytes], length);
|
||||
bytesDup[length] = 0;
|
||||
uidStart = bytesDup + length - 1;
|
||||
@@ -596,7 +597,7 @@ static Class NSArrayK;
|
||||
}
|
||||
}
|
||||
|
||||
- (void) save
|
||||
- (void) save: (TALLOC_CTX *) memCtx
|
||||
{
|
||||
// iCalCalendar *vCalendar;
|
||||
// NSCalendarDate *now;
|
||||
@@ -608,7 +609,7 @@ static Class NSArrayK;
|
||||
|
||||
if (isNew)
|
||||
{
|
||||
uid = [self _uidFromGlobalObjectId];
|
||||
uid = [self _uidFromGlobalObjectId: memCtx];
|
||||
if (uid)
|
||||
{
|
||||
/* Hack required because of what's explained in oxocal 3.1.4.7.1:
|
||||
@@ -650,12 +651,12 @@ static Class NSArrayK;
|
||||
activeUser = [[self context] activeUser];
|
||||
[masterEvent updateFromMAPIProperties: properties
|
||||
inUserContext: [self userContext]
|
||||
withActiveUser: activeUser];
|
||||
withActiveUser: activeUser
|
||||
inMemCtx: memCtx];
|
||||
[self _updateAttachedEvents];
|
||||
[[self userContext] activateWithUser: activeUser];
|
||||
[sogoObject updateContentWithCalendar: calendar
|
||||
fromRequest: nil];
|
||||
|
||||
[self updateVersions];
|
||||
}
|
||||
|
||||
|
||||
@@ -911,7 +911,7 @@ fromProperties: (NSDictionary *) attachmentProps
|
||||
//
|
||||
//
|
||||
//
|
||||
- (void) save
|
||||
- (void) save:(TALLOC_CTX *) memCtx
|
||||
{
|
||||
NSArray *elements, *units;
|
||||
CardElement *element;
|
||||
|
||||
@@ -224,7 +224,7 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri)
|
||||
NSURL *baseURL;
|
||||
int rc = MAPISTORE_ERR_NOT_FOUND;
|
||||
|
||||
NSLog (@"METHOD '%s' (%d) -- uri: '%s'", __FUNCTION__, __LINE__, newUri);
|
||||
//NSLog (@"METHOD '%s' (%d) -- uri: '%s'", __FUNCTION__, __LINE__, newUri);
|
||||
|
||||
context = nil;
|
||||
|
||||
@@ -532,8 +532,8 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri)
|
||||
mappingId = [mapping idFromURL: childURL];
|
||||
if (mappingId == NSNotFound)
|
||||
{
|
||||
[self warnWithFormat: @"no id exist yet for '%@', requesting one...",
|
||||
childURL];
|
||||
//[self warnWithFormat: @"no id exist yet for '%@', requesting one...",
|
||||
// childURL];
|
||||
openchangedb_get_new_folderID (connInfo->oc_ctx, &mappingId);
|
||||
[mapping registerURL: childURL withID: mappingId];
|
||||
contextId = 0;
|
||||
|
||||
@@ -130,6 +130,7 @@ static NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
|
||||
withNewName: (NSString *) newFolderName
|
||||
isMove: (BOOL) isMove
|
||||
isRecursive: (BOOL) isRecursive
|
||||
inMemCtx: (TALLOC_CTX *) memCtx
|
||||
{
|
||||
enum mapistore_error rc;
|
||||
NSString *path, *pathComponent, *targetPath, *newPath;
|
||||
@@ -164,7 +165,8 @@ static NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
|
||||
else
|
||||
rc = [super moveCopyToFolder: targetFolder withNewName: newFolderName
|
||||
isMove: isMove
|
||||
isRecursive: isRecursive];
|
||||
isRecursive: isRecursive
|
||||
inMemCtx: memCtx];
|
||||
|
||||
return rc;
|
||||
}
|
||||
@@ -234,7 +236,7 @@ static NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
|
||||
messageKeys = [self messageKeys];
|
||||
|
||||
date = [NSCalendarDate date];
|
||||
[self logWithFormat: @"current date: %@", date];
|
||||
//[self logWithFormat: @"current date: %@", date];
|
||||
|
||||
max = [messageKeys count];
|
||||
for (count = 0; count < max; count++)
|
||||
@@ -243,7 +245,7 @@ static NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
|
||||
fileDate = [msg lastModificationTime];
|
||||
if ([date laterDate: fileDate] == fileDate)
|
||||
{
|
||||
[self logWithFormat: @"current date: %@", date];
|
||||
//[self logWithFormat: @"current date: %@", date];
|
||||
|
||||
date = fileDate;
|
||||
}
|
||||
@@ -337,7 +339,18 @@ static NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
|
||||
|
||||
- (BOOL) subscriberCanReadMessages
|
||||
{
|
||||
return [self _testRoleForActiveUser: MAPIStoreRightReadItems];
|
||||
NSString *displayName;
|
||||
|
||||
/* when this folder is the "Freebusy Data" folder, we need to allow
|
||||
subscribed to read an open contained messages in order to enable them to
|
||||
find the "LocalFreebusy" message */
|
||||
[sogoObject reloadIfNeeded];
|
||||
|
||||
displayName = [[sogoObject properties]
|
||||
objectForKey: MAPIPropertyKey (PidTagDisplayName)];
|
||||
|
||||
return ([displayName isEqualToString: @"Freebusy Data"]
|
||||
|| [self _testRoleForActiveUser: MAPIStoreRightReadItems]);
|
||||
}
|
||||
|
||||
- (BOOL) subscriberCanDeleteMessages
|
||||
|
||||
@@ -135,7 +135,7 @@
|
||||
[super addProperties: newNewProperties];
|
||||
}
|
||||
|
||||
- (void) save
|
||||
- (void) save: (TALLOC_CTX *) memCtx
|
||||
{
|
||||
uint64_t newVersion;
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ static Class MAPIStoreDBMessageK = Nil;
|
||||
cVersion = exchange_globcnt (([value unsignedLongLongValue] >> 16)
|
||||
& 0x0000ffffffffffffLL);
|
||||
version = [NSNumber numberWithUnsignedLongLong: cVersion];
|
||||
[self logWithFormat: @"change number from oxcfxics: %.16lx", [value unsignedLongLongValue]];
|
||||
//[self logWithFormat: @"change number from oxcfxics: %.16lx", [value unsignedLongLongValue]];
|
||||
[self logWithFormat: @" version: %.16lx", cVersion];
|
||||
*qualifier = [[EOKeyValueQualifier alloc] initWithKey: @"version"
|
||||
operatorSelector: EOQualifierOperatorGreaterThanOrEqualTo
|
||||
|
||||
@@ -146,7 +146,7 @@ static Class MAPIStoreAttachmentK;
|
||||
return ULLONG_MAX;
|
||||
}
|
||||
|
||||
- (void) save
|
||||
- (void) save: (TALLOC_CTX *) memCtx
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
}
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
return [self getYes: data inMemCtx: memCtx];
|
||||
}
|
||||
|
||||
- (enum mapistore_error) saveMessage
|
||||
- (enum mapistore_error) saveMessage: (TALLOC_CTX *) memCtx;
|
||||
{
|
||||
enum mapistore_error rc;
|
||||
MAPIStoreContext *context;
|
||||
@@ -60,7 +60,7 @@
|
||||
context = [self context];
|
||||
ownerUser = [[self userContext] sogoUser];
|
||||
if ([[context activeUser] isEqual: ownerUser])
|
||||
rc = [super saveMessage];
|
||||
rc = [super saveMessage: memCtx];
|
||||
else
|
||||
rc = MAPISTORE_ERR_DENIED;
|
||||
|
||||
|
||||
@@ -123,12 +123,14 @@
|
||||
fromFolder: (MAPIStoreFolder *) sourceFolder
|
||||
withMIDs: (uint64_t *) targetMids
|
||||
andChangeKeys: (struct Binary_r **) targetChangeKeys
|
||||
wantCopy: (uint8_t) want_copy;
|
||||
wantCopy: (uint8_t) want_copy
|
||||
inMemCtx: (TALLOC_CTX *) memCtx;
|
||||
|
||||
- (enum mapistore_error) moveCopyToFolder: (MAPIStoreFolder *) targetFolder
|
||||
withNewName: (NSString *) newFolderName
|
||||
isMove: (BOOL) isMove
|
||||
isRecursive: (BOOL) isRecursive;
|
||||
isRecursive: (BOOL) isRecursive
|
||||
inMemCtx: (TALLOC_CTX *) memCtx;
|
||||
|
||||
- (int) getDeletedFMIDs: (struct UI8Array_r **) fmidsPtr
|
||||
andCN: (uint64_t *) cnPtr
|
||||
|
||||
@@ -180,6 +180,8 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||
|
||||
- (void) dealloc
|
||||
{
|
||||
//[self logWithFormat: @"METHOD '%s' (%d)", __FUNCTION__, __LINE__];
|
||||
|
||||
// [messageKeys release];
|
||||
// [faiMessageKeys release];
|
||||
// [folderKeys release];
|
||||
@@ -364,7 +366,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||
MAPIStoreMapping *mapping;
|
||||
NSString *childURL;
|
||||
|
||||
[self logWithFormat: @"METHOD '%s' (%d)", __FUNCTION__, __LINE__];
|
||||
//[self logWithFormat: @"METHOD '%s' (%d)", __FUNCTION__, __LINE__];
|
||||
|
||||
mapping = [self mapping];
|
||||
childURL = [mapping urlFromID: fid];
|
||||
@@ -391,7 +393,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||
MAPIStoreFolder *childFolder;
|
||||
SOGoUser *ownerUser;
|
||||
|
||||
[self logWithFormat: @"METHOD '%s' (%d)", __FUNCTION__, __LINE__];
|
||||
//[self logWithFormat: @"METHOD '%s' (%d)", __FUNCTION__, __LINE__];
|
||||
|
||||
ownerUser = [[self userContext] sogoUser];
|
||||
if ([[context activeUser] isEqual: ownerUser]
|
||||
@@ -448,8 +450,8 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||
NSArray *keys;
|
||||
int rc = MAPISTORE_SUCCESS;
|
||||
|
||||
[self logWithFormat: @"METHOD '%s' (%d) -- tableType: %d",
|
||||
__FUNCTION__, __LINE__, tableType];
|
||||
//[self logWithFormat: @"METHOD '%s' (%d) -- tableType: %d",
|
||||
//__FUNCTION__, __LINE__, tableType];
|
||||
|
||||
if (tableType == MAPISTORE_MESSAGE_TABLE)
|
||||
keys = [self messageKeys];
|
||||
@@ -511,8 +513,8 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||
MAPIStoreMapping *mapping;
|
||||
SOGoUser *ownerUser;
|
||||
|
||||
[self logWithFormat: @"METHOD '%s' -- mid: 0x%.16llx associated: %d",
|
||||
__FUNCTION__, mid, isAssociated];
|
||||
//[self logWithFormat: @"METHOD '%s' -- mid: 0x%.16llx associated: %d",
|
||||
// __FUNCTION__, mid, isAssociated];
|
||||
|
||||
context = [self context];
|
||||
ownerUser = [[self userContext] sogoUser];
|
||||
@@ -656,19 +658,23 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||
return rc;
|
||||
}
|
||||
|
||||
- (int) moveCopyMessageWithMID: (uint64_t) srcMid
|
||||
fromFolder: (MAPIStoreFolder *) sourceFolder
|
||||
withMID: (uint64_t) targetMid
|
||||
andChangeKey: (struct Binary_r *) targetChangeKey
|
||||
wantCopy: (uint8_t) wantCopy
|
||||
// private method
|
||||
- (int) _moveCopyMessageWithMID: (uint64_t) srcMid
|
||||
fromFolder: (MAPIStoreFolder *) sourceFolder
|
||||
withMID: (uint64_t) targetMid
|
||||
andChangeKey: (struct Binary_r *) targetChangeKey
|
||||
wantCopy: (uint8_t) wantCopy
|
||||
inMemCtx: (TALLOC_CTX *) memCtx
|
||||
{
|
||||
int rc;
|
||||
MAPIStoreMessage *sourceMsg, *destMsg;
|
||||
TALLOC_CTX *memCtx;
|
||||
//TALLOC_CTX *memCtx;
|
||||
struct SRow aRow;
|
||||
struct SPropValue property;
|
||||
|
||||
memCtx = talloc_zero (NULL, TALLOC_CTX);
|
||||
[self logWithFormat: @"-moveCopyMessageWithMID: 0x%.16llx .. withMID: 0x%.16llx .. wantCopy: %d", srcMid, targetMid, wantCopy];
|
||||
|
||||
//memCtx = talloc_zero (NULL, TALLOC_CTX);
|
||||
rc = [sourceFolder openMessage: &sourceMsg
|
||||
withMID: srcMid
|
||||
forWriting: NO
|
||||
@@ -681,7 +687,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||
if (rc != MAPISTORE_SUCCESS)
|
||||
goto end;
|
||||
|
||||
[sourceMsg copyToMessage: destMsg];
|
||||
[sourceMsg copyToMessage: destMsg inMemCtx: memCtx];
|
||||
|
||||
if (targetChangeKey)
|
||||
{
|
||||
@@ -693,12 +699,12 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||
if (rc != MAPISTORE_SUCCESS)
|
||||
goto end;
|
||||
}
|
||||
[destMsg save];
|
||||
[destMsg save: memCtx];
|
||||
if (!wantCopy)
|
||||
rc = [sourceFolder deleteMessageWithMID: srcMid andFlags: 0];
|
||||
|
||||
end:
|
||||
talloc_free (memCtx);
|
||||
//talloc_free (memCtx);
|
||||
|
||||
return rc;
|
||||
}
|
||||
@@ -709,6 +715,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||
withMIDs: (uint64_t *) targetMids
|
||||
andChangeKeys: (struct Binary_r **) targetChangeKeys
|
||||
wantCopy: (uint8_t) wantCopy
|
||||
inMemCtx: (TALLOC_CTX *) memCtx
|
||||
{
|
||||
int rc = MAPISTORE_SUCCESS;
|
||||
NSUInteger count;
|
||||
@@ -717,6 +724,9 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||
MAPIStoreMapping *mapping;
|
||||
SOGoUser *ownerUser;
|
||||
struct Binary_r *targetChangeKey;
|
||||
//TALLOC_CTX *memCtx;
|
||||
|
||||
//memCtx = talloc_zero (NULL, TALLOC_CTX);
|
||||
|
||||
ownerUser = [[self userContext] sogoUser];
|
||||
|
||||
@@ -738,11 +748,12 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||
targetChangeKey = targetChangeKeys[count];
|
||||
else
|
||||
targetChangeKey = NULL;
|
||||
rc = [self moveCopyMessageWithMID: srcMids[count]
|
||||
fromFolder: sourceFolder
|
||||
withMID: targetMids[count]
|
||||
andChangeKey: targetChangeKey
|
||||
wantCopy: wantCopy];
|
||||
rc = [self _moveCopyMessageWithMID: srcMids[count]
|
||||
fromFolder: sourceFolder
|
||||
withMID: targetMids[count]
|
||||
andChangeKey: targetChangeKey
|
||||
wantCopy: wantCopy
|
||||
inMemCtx: memCtx];
|
||||
}
|
||||
else
|
||||
rc = MAPISTORE_ERR_NOT_FOUND;
|
||||
@@ -765,7 +776,9 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||
}
|
||||
else
|
||||
rc = MAPISTORE_ERR_DENIED;
|
||||
|
||||
|
||||
//talloc_free (memCtx);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -773,6 +786,8 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||
withNewName: (NSString *) newFolderName
|
||||
isMove: (BOOL) isMove
|
||||
isRecursive: (BOOL) isRecursive
|
||||
inMemCtx: (TALLOC_CTX *) memCtx
|
||||
|
||||
{
|
||||
enum mapistore_error rc;
|
||||
NSAutoreleasePool *pool;
|
||||
@@ -785,6 +800,9 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||
NSUInteger count, max;
|
||||
NSString *childKey;
|
||||
uint64_t fmid;
|
||||
//TALLOC_CTX *memCtx;
|
||||
|
||||
//memCtx = talloc_zero (NULL, TALLOC_CTX);
|
||||
|
||||
/* TODO: one possible issue with this algorithm is that moved messages will
|
||||
lack a version number and will all be assigned a new one, even though
|
||||
@@ -807,7 +825,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||
if (rc == MAPISTORE_SUCCESS)
|
||||
{
|
||||
newFolder = [targetFolder lookupFolder: childKey];
|
||||
[self copyPropertiesToObject: newFolder];
|
||||
[self copyPropertiesToObject: newFolder inMemCtx: memCtx];
|
||||
|
||||
pool = [NSAutoreleasePool new];
|
||||
children = [self messageKeys];
|
||||
@@ -818,7 +836,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||
message = [self lookupMessage: childKey];
|
||||
targetMessage = [newFolder createMessage: NO];
|
||||
[targetMessage setIsNew: YES];
|
||||
[message copyToMessage: targetMessage];
|
||||
[message copyToMessage: targetMessage inMemCtx: memCtx];
|
||||
if (isMove)
|
||||
{
|
||||
fmid = [mapping idFromURL: [message url]];
|
||||
@@ -826,7 +844,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||
[mapping registerURL: [targetMessage url]
|
||||
withID: fmid];
|
||||
}
|
||||
[targetMessage save];
|
||||
[targetMessage save: memCtx];
|
||||
}
|
||||
[pool release];
|
||||
|
||||
@@ -839,7 +857,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||
message = [self lookupFAIMessage: childKey];
|
||||
targetMessage = [newFolder createMessage: YES];
|
||||
[targetMessage setIsNew: YES];
|
||||
[message copyToMessage: targetMessage];
|
||||
[message copyToMessage: targetMessage inMemCtx: memCtx];
|
||||
if (isMove)
|
||||
{
|
||||
fmid = [mapping idFromURL: [message url]];
|
||||
@@ -847,7 +865,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||
[mapping registerURL: [targetMessage url]
|
||||
withID: fmid];
|
||||
}
|
||||
[targetMessage save];
|
||||
[targetMessage save: memCtx];
|
||||
}
|
||||
[pool release];
|
||||
|
||||
@@ -862,7 +880,9 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||
subFolder = [self lookupFolder: childKey];
|
||||
[subFolder moveCopyToFolder: newFolder withNewName: nil
|
||||
isMove: isMove
|
||||
isRecursive: isRecursive];
|
||||
isRecursive: isRecursive
|
||||
inMemCtx: memCtx];
|
||||
|
||||
}
|
||||
[pool release];
|
||||
}
|
||||
@@ -882,6 +902,8 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||
else
|
||||
rc = MAPISTORE_ERR_DENIED;
|
||||
|
||||
//talloc_free (memCtx);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
@@ -461,7 +461,7 @@ static Class NSNumberK;
|
||||
[mapping setObject: cLastModified forKey: changeNumber];
|
||||
[messageEntry setObject: changeNumber forKey: @"version"];
|
||||
|
||||
newChangeNum = [changeNumber unsignedLongValue];
|
||||
newChangeNum = [changeNumber unsignedLongLongValue];
|
||||
changeKey = [self getReplicaKeyFromGlobCnt: newChangeNum >> 16];
|
||||
[self _setChangeKey: changeKey forMessageEntry: messageEntry
|
||||
inChangeListOnly: NO];
|
||||
|
||||
@@ -92,8 +92,8 @@
|
||||
value = NSObjectFromMAPISPropValue (&res->lpProp);
|
||||
lastModified = [(MAPIStoreGCSFolder *)
|
||||
container lastModifiedFromMessageChangeNumber: value];
|
||||
[self logWithFormat: @"change number from oxcfxics: %.16lx", [value unsignedLongLongValue]];
|
||||
[self logWithFormat: @" c_lastmodified: %@", lastModified];
|
||||
//[self logWithFormat: @"change number from oxcfxics: %.16lx", [value unsignedLongLongValue]];
|
||||
//[self logWithFormat: @" c_lastmodified: %@", lastModified];
|
||||
if (lastModified)
|
||||
{
|
||||
*qualifier = [[EOKeyValueQualifier alloc] initWithKey: @"c_lastmodified"
|
||||
|
||||
@@ -390,7 +390,7 @@ static Class SOGoMailFolderK, MAPIStoreMailFolderK, MAPIStoreOutboxFolderK;
|
||||
else
|
||||
value = [NSDate date];
|
||||
|
||||
[self logWithFormat: @"lastMessageModificationTime: %@", value];
|
||||
//[self logWithFormat: @"lastMessageModificationTime: %@", value];
|
||||
|
||||
return value;
|
||||
}
|
||||
@@ -613,8 +613,8 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data)
|
||||
[messageEntry setObject: modseq forKey: @"modseq"];
|
||||
[messageEntry setObject: changeNumber forKey: @"version"];
|
||||
|
||||
[self logWithFormat: @"added message entry for uid %@, modseq %@,"
|
||||
@" version %@", uid, modseq, changeNumber];
|
||||
//[self logWithFormat: @"added message entry for uid %@, modseq %@,"
|
||||
// @" version %@", uid, modseq, changeNumber];
|
||||
|
||||
changeKey = [self getReplicaKeyFromGlobCnt: newChangeNum >> 16];
|
||||
[self _setChangeKey: changeKey forMessageEntry: messageEntry];
|
||||
@@ -796,7 +796,7 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data)
|
||||
|
||||
if (tableType == MAPISTORE_MESSAGE_TABLE)
|
||||
{
|
||||
changeNumber = [NSString stringWithUnsignedLongLong: changeNum];
|
||||
changeNumber = [NSString stringWithFormat: @"0x%.16llx", changeNum];
|
||||
modseq = [[self modseqFromMessageChangeNumber: changeNumber]
|
||||
unsignedLongLongValue];
|
||||
if (modseq > 0)
|
||||
@@ -929,6 +929,8 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP)
|
||||
withMIDs: (uint64_t *) targetMids
|
||||
andChangeKeys: (struct Binary_r **) targetChangeKeys
|
||||
wantCopy: (uint8_t) wantCopy
|
||||
inMemCtx: (TALLOC_CTX *) memCtx
|
||||
|
||||
{
|
||||
NGImap4Connection *connection;
|
||||
NGImap4Client *client;
|
||||
@@ -946,7 +948,8 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP)
|
||||
return [super moveCopyMessagesWithMIDs: srcMids andCount: midCount
|
||||
fromFolder: sourceFolder withMIDs: targetMids
|
||||
andChangeKeys: targetChangeKeys
|
||||
wantCopy: wantCopy];
|
||||
wantCopy: wantCopy
|
||||
inMemCtx: memCtx];
|
||||
|
||||
/* Conversion of mids to IMAP uids */
|
||||
mapping = [self mapping];
|
||||
@@ -1052,6 +1055,7 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP)
|
||||
withNewName: (NSString *) newFolderName
|
||||
isMove: (BOOL) isMove
|
||||
isRecursive: (BOOL) isRecursive
|
||||
inMemCtx: (TALLOC_CTX *) memCtx
|
||||
{
|
||||
enum mapistore_error rc;
|
||||
NSURL *folderURL, *newFolderURL;
|
||||
@@ -1147,7 +1151,8 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP)
|
||||
moveCopyToFolder: newFolder
|
||||
withNewName: nil
|
||||
isMove: NO
|
||||
isRecursive: YES];
|
||||
isRecursive: YES
|
||||
inMemCtx: memCtx];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1160,7 +1165,8 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP)
|
||||
else
|
||||
rc = [super moveCopyToFolder: targetFolder withNewName: newFolderName
|
||||
isMove: isMove
|
||||
isRecursive: isRecursive];
|
||||
isRecursive: isRecursive
|
||||
inMemCtx: memCtx];
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -693,7 +693,15 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data)
|
||||
ngAddress = [[NGMailAddressParser mailAddressParserWithString: fullMail]
|
||||
parse];
|
||||
if ([ngAddress isKindOfClass: [NGMailAddress class]])
|
||||
cn = [ngAddress displayName];
|
||||
{
|
||||
cn = [ngAddress displayName];
|
||||
|
||||
// If we don't have a displayName, we use the email address instead. This
|
||||
// avoid bug #2119 - where Outlook won't display anything in the "From" field,
|
||||
// nor in the recipient field if we reply to the email.
|
||||
if (![cn length])
|
||||
cn = [ngAddress address];
|
||||
}
|
||||
else
|
||||
cn = @"";
|
||||
|
||||
@@ -1576,7 +1584,7 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data)
|
||||
bodySetup = YES;
|
||||
}
|
||||
|
||||
- (void) save
|
||||
- (void) save: (TALLOC_CTX *) memCtx
|
||||
{
|
||||
NSNumber *value;
|
||||
|
||||
|
||||
@@ -120,7 +120,7 @@ static Class MAPIStoreMailMessageK, NSDataK, NSStringK;
|
||||
case PidLidAppointmentStartWhole:
|
||||
case PidLidAppointmentEndWhole:
|
||||
case PidLidRecurring:
|
||||
[self logWithFormat: @"apt restriction on mail folder?"];
|
||||
//[self logWithFormat: @"apt restriction on mail folder?"];
|
||||
rc = MAPIRestrictionStateAlwaysFalse;
|
||||
break;
|
||||
|
||||
@@ -155,10 +155,11 @@ static Class MAPIStoreMailMessageK, NSDataK, NSStringK;
|
||||
|
||||
case PidTagChangeNumber:
|
||||
{
|
||||
value = [NSString stringWithFormat: @"0x%.16llx", [value unsignedLongLongValue]];
|
||||
modseq = [(MAPIStoreMailFolder *)
|
||||
container modseqFromMessageChangeNumber: value];
|
||||
[self logWithFormat: @"change number from oxcfxics: %.16lx", [value unsignedLongLongValue]];
|
||||
[self logWithFormat: @" modseq: %.16lx", [modseq unsignedLongLongValue]];
|
||||
//[self logWithFormat: @"change number from oxcfxics: %.16lx", [value unsignedLongLongValue]];
|
||||
//[self logWithFormat: @" modseq: %.16lx", [modseq unsignedLongLongValue]];
|
||||
if (modseq)
|
||||
modseq = [NSNumber numberWithUnsignedLongLong:
|
||||
[modseq unsignedLongLongValue] + 1];
|
||||
@@ -316,7 +317,7 @@ static Class MAPIStoreMailMessageK, NSDataK, NSStringK;
|
||||
ASSIGN (sortOrderings, newSortOrderings);
|
||||
else
|
||||
ASSIGN (sortOrderings, [NSArray arrayWithObject: @"ARRIVAL"]);
|
||||
[self logWithFormat: @"new sort orderings: '%@'", sortOrderings];
|
||||
//[self logWithFormat: @"new sort orderings: '%@'", sortOrderings];
|
||||
}
|
||||
else
|
||||
ASSIGN (sortOrderings, [NSArray arrayWithObject: @"ARRIVAL"]);
|
||||
|
||||
@@ -569,7 +569,7 @@ FillMessageHeadersFromProperties (NGMutableHashMap *headers,
|
||||
}
|
||||
|
||||
list = MakeRecipientsList ([recipients objectForKey: @"orig"]);
|
||||
if (list)
|
||||
if ([list count])
|
||||
[headers setObjects: list forKey: @"from"];
|
||||
}
|
||||
else
|
||||
@@ -904,7 +904,7 @@ MakeMessageBody (NSDictionary *mailProperties, NSDictionary *attachmentParts, NS
|
||||
return MAPISTORE_SUCCESS;
|
||||
}
|
||||
|
||||
- (void) save
|
||||
- (void) save: (TALLOC_CTX *) memCtx
|
||||
{
|
||||
NSString *folderName, *flag, *newIdString, *messageKey;
|
||||
NSData *changeKey, *messageData;
|
||||
@@ -943,7 +943,14 @@ MakeMessageBody (NSDictionary *mailProperties, NSDictionary *attachmentParts, NS
|
||||
[mapping registerURL: [self url] withID: mid];
|
||||
|
||||
/* synchronise the cache and update the change key with the one provided
|
||||
by the client */
|
||||
by the client. Before doing this, lets issue a unselect/select combo
|
||||
because of timing issues with Dovecot in obtaining the latest modseq.
|
||||
Sometimes, Dovecot doesn't return the newly appended UID if we do
|
||||
a "UID SORT (DATE) UTF-8 (MODSEQ XYZ) (NOT DELETED)" command (where
|
||||
XYZ is the HIGHESTMODSEQ+1) immediately after IMAP APPEND */
|
||||
[client unselect];
|
||||
[client select: folderName];
|
||||
|
||||
[(MAPIStoreMailFolder *) container synchroniseCache];
|
||||
changeKey = [properties objectForKey: MAPIPropertyKey (PR_CHANGE_KEY)];
|
||||
if (changeKey)
|
||||
|
||||
@@ -64,17 +64,17 @@
|
||||
- (int) getAttachmentTable: (MAPIStoreAttachmentTable **) tablePtr
|
||||
andRowCount: (uint32_t *) countPtr;
|
||||
- (int) setReadFlag: (uint8_t) flag;
|
||||
- (enum mapistore_error) saveMessage;
|
||||
- (enum mapistore_error) saveMessage: (TALLOC_CTX *) memCtx;
|
||||
|
||||
- (NSArray *) activeContainerMessageTables;
|
||||
|
||||
- (NSArray *) activeUserRoles;
|
||||
|
||||
/* move & copy internal ops */
|
||||
- (void) copyToMessage: (MAPIStoreMessage *) newMessage;
|
||||
- (void) copyToMessage: (MAPIStoreMessage *) newMessage inMemCtx: (TALLOC_CTX *) memCtx;
|
||||
|
||||
/* subclasses */
|
||||
- (void) save;
|
||||
- (void) save: (TALLOC_CTX *) memCtx;
|
||||
|
||||
/* attachments (subclasses) */
|
||||
- (MAPIStoreAttachment *) createAttachment;
|
||||
|
||||
@@ -45,11 +45,10 @@
|
||||
#import "NSData+MAPIStore.h"
|
||||
#import "NSObject+MAPIStore.h"
|
||||
#import "NSString+MAPIStore.h"
|
||||
#import "RTFHandler.h"
|
||||
|
||||
#import "MAPIStoreMessage.h"
|
||||
|
||||
#include <unrtf.h>
|
||||
|
||||
#undef DEBUG
|
||||
#include <stdbool.h>
|
||||
#include <gen_ndr/exchange.h>
|
||||
@@ -60,17 +59,6 @@ static Class MAPIStoreFolderK, MAPIStoreEmbeddedMessageK;
|
||||
|
||||
static NSString *resourcesDir = nil;
|
||||
|
||||
/* rtf conversion via unrtf */
|
||||
static int
|
||||
unrtf_data_output (void *data, const char *str, size_t str_len)
|
||||
{
|
||||
NSMutableData *rtfData = data;
|
||||
|
||||
[rtfData appendBytes: str length: str_len];
|
||||
|
||||
return str_len;
|
||||
}
|
||||
|
||||
static NSData *
|
||||
uncompressRTF (NSData *compressedRTF)
|
||||
{
|
||||
@@ -97,22 +85,17 @@ rtf2html (NSData *compressedRTF)
|
||||
{
|
||||
NSData *rtf;
|
||||
NSMutableData *html = nil;
|
||||
int rc;
|
||||
struct unRTFOptions unrtfOptions;
|
||||
|
||||
rtf = uncompressRTF (compressedRTF);
|
||||
if (rtf)
|
||||
{
|
||||
html = [NSMutableData data];
|
||||
memset (&unrtfOptions, 0, sizeof (struct unRTFOptions));
|
||||
unrtf_set_output_device (&unrtfOptions, unrtf_data_output, html);
|
||||
unrtfOptions.config_directory = [resourcesDir UTF8String];
|
||||
unrtfOptions.output_format = "html";
|
||||
unrtfOptions.nopict_mode = YES;
|
||||
rc = unrtf_convert_from_string (&unrtfOptions,
|
||||
[rtf bytes], [rtf length]);
|
||||
if (!rc)
|
||||
html = nil;
|
||||
//html = [NSMutableData data];
|
||||
RTFHandler *handler;
|
||||
|
||||
handler = [[RTFHandler alloc] initWithData: rtf];
|
||||
AUTORELEASE(handler);
|
||||
|
||||
html = [handler parse];
|
||||
}
|
||||
|
||||
return html;
|
||||
@@ -139,6 +122,8 @@ rtf2html (NSData *compressedRTF)
|
||||
|
||||
- (id) init
|
||||
{
|
||||
//[self logWithFormat: @"METHOD '%s' (%d) (%d)", __FUNCTION__, __LINE__, self];
|
||||
|
||||
if ((self = [super init]))
|
||||
{
|
||||
attachmentParts = [NSMutableDictionary new];
|
||||
@@ -151,6 +136,7 @@ rtf2html (NSData *compressedRTF)
|
||||
|
||||
- (void) dealloc
|
||||
{
|
||||
//[self logWithFormat: @"METHOD '%s' (%d) (%d)", __FUNCTION__, __LINE__, self];
|
||||
[activeUserRoles release];
|
||||
[attachmentKeys release];
|
||||
[attachmentParts release];
|
||||
@@ -257,7 +243,7 @@ rtf2html (NSData *compressedRTF)
|
||||
struct mapistore_message_recipient *recipient;
|
||||
NSUInteger count;
|
||||
|
||||
[self logWithFormat: @"METHOD '%s'", __FUNCTION__];
|
||||
//[self logWithFormat: @"METHOD '%s'", __FUNCTION__];
|
||||
|
||||
recipients = [NSMutableDictionary new];
|
||||
recipientProperties = [NSDictionary dictionaryWithObject: recipients
|
||||
@@ -437,17 +423,19 @@ rtf2html (NSData *compressedRTF)
|
||||
andType: MAPISTORE_MESSAGE_TABLE];
|
||||
}
|
||||
|
||||
- (void) copyToMessage: (MAPIStoreMessage *) newMessage
|
||||
- (void) copyToMessage: (MAPIStoreMessage *) newMessage inMemCtx: (TALLOC_CTX *) memCtx;
|
||||
|
||||
{
|
||||
TALLOC_CTX *memCtx;
|
||||
//TALLOC_CTX *memCtx;
|
||||
struct mapistore_message *messageData;
|
||||
NSArray *keys;
|
||||
NSUInteger count, max;
|
||||
NSString *key;
|
||||
MAPIStoreAttachment *attachment, *newAttachment;
|
||||
|
||||
memCtx = talloc_zero (NULL, TALLOC_CTX);
|
||||
//[self logWithFormat: @"METHOD '%s' (%d) (%d)", __FUNCTION__, __LINE__, self];
|
||||
|
||||
//memCtx = talloc_zero (NULL, TALLOC_CTX);
|
||||
|
||||
/* message headers and recipients */
|
||||
[self getMessageData: &messageData inMemCtx: memCtx];
|
||||
@@ -456,7 +444,7 @@ rtf2html (NSData *compressedRTF)
|
||||
andColumns: messageData->columns];
|
||||
|
||||
/* properties */
|
||||
[self copyPropertiesToObject: newMessage];
|
||||
[self copyPropertiesToObject: newMessage inMemCtx: memCtx];
|
||||
|
||||
/* attachments */
|
||||
keys = [self attachmentKeys];
|
||||
@@ -466,13 +454,13 @@ rtf2html (NSData *compressedRTF)
|
||||
key = [keys objectAtIndex: count];
|
||||
attachment = [self lookupAttachment: key];
|
||||
newAttachment = [newMessage createAttachment];
|
||||
[attachment copyToAttachment: newAttachment];
|
||||
[attachment copyToAttachment: newAttachment inMemCtx: memCtx];
|
||||
}
|
||||
|
||||
talloc_free (memCtx);
|
||||
//talloc_free (memCtx);
|
||||
}
|
||||
|
||||
- (enum mapistore_error) saveMessage
|
||||
- (enum mapistore_error) saveMessage: (TALLOC_CTX *) memCtx
|
||||
{
|
||||
enum mapistore_error rc;
|
||||
NSArray *containerTables;
|
||||
@@ -485,6 +473,8 @@ rtf2html (NSData *compressedRTF)
|
||||
BOOL userIsOwner;
|
||||
MAPIStoreMessage *mainMessage;
|
||||
|
||||
//[self logWithFormat: @"METHOD '%s' (%d)", __FUNCTION__, __LINE__];
|
||||
|
||||
context = [self context];
|
||||
ownerUser = [[self userContext] sogoUser];
|
||||
userIsOwner = [[context activeUser] isEqual: ownerUser];
|
||||
@@ -511,7 +501,7 @@ rtf2html (NSData *compressedRTF)
|
||||
|
||||
/* folder modified */
|
||||
notif_parameters
|
||||
= talloc_zero(NULL, struct mapistore_object_notification_parameters);
|
||||
= talloc_zero(memCtx, struct mapistore_object_notification_parameters);
|
||||
notif_parameters->object_id = folderId;
|
||||
if (isNew)
|
||||
{
|
||||
@@ -535,7 +525,7 @@ rtf2html (NSData *compressedRTF)
|
||||
if (isNew)
|
||||
{
|
||||
notif_parameters
|
||||
= talloc_zero(NULL,
|
||||
= talloc_zero(memCtx,
|
||||
struct mapistore_object_notification_parameters);
|
||||
notif_parameters->object_id = [self objectId];
|
||||
notif_parameters->folder_id = folderId;
|
||||
@@ -555,7 +545,7 @@ rtf2html (NSData *compressedRTF)
|
||||
[[containerTables objectAtIndex: count] restrictedChildKeys];
|
||||
}
|
||||
|
||||
[self save];
|
||||
[self save: memCtx];
|
||||
/* We make sure that any change-related properties are removes from the
|
||||
properties dictionary, to make sure that related methods will be
|
||||
invoked the next time they are requested. */
|
||||
@@ -930,7 +920,7 @@ rtf2html (NSData *compressedRTF)
|
||||
return MAPISTORE_ERROR;
|
||||
}
|
||||
|
||||
- (void) save
|
||||
- (void) save: (TALLOC_CTX *) memCtx
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
}
|
||||
|
||||
@@ -91,7 +91,7 @@
|
||||
inMemCtx: (TALLOC_CTX *) memCtx;
|
||||
|
||||
/* move and copy operations */
|
||||
- (void) copyPropertiesToObject: (MAPIStoreObject *) newObject;
|
||||
- (void) copyPropertiesToObject: (MAPIStoreObject *) newObject inMemCtx: (TALLOC_CTX *) memCtx;
|
||||
|
||||
/* subclasses */
|
||||
- (NSString *) nameInContainer;
|
||||
|
||||
@@ -317,9 +317,9 @@ static Class NSExceptionK, MAPIStoreFolderK;
|
||||
}
|
||||
|
||||
/* move and copy operations */
|
||||
- (void) copyPropertiesToObject: (MAPIStoreObject *) newObject
|
||||
- (void) copyPropertiesToObject: (MAPIStoreObject *) newObject inMemCtx: (TALLOC_CTX *) memCtx
|
||||
{
|
||||
TALLOC_CTX *memCtx;
|
||||
//TALLOC_CTX *memCtx;
|
||||
struct SPropTagArray *availableProps;
|
||||
struct SRow row;
|
||||
enum MAPITAGS propTag;
|
||||
@@ -328,7 +328,7 @@ static Class NSExceptionK, MAPIStoreFolderK;
|
||||
enum mapistore_error error;
|
||||
void *data;
|
||||
|
||||
memCtx = talloc_zero (NULL, TALLOC_CTX);
|
||||
//memCtx = talloc_zero (NULL, TALLOC_CTX);
|
||||
|
||||
[self getAvailableProperties: &availableProps inMemCtx: memCtx];
|
||||
|
||||
@@ -369,8 +369,7 @@ static Class NSExceptionK, MAPIStoreFolderK;
|
||||
}
|
||||
[newObject addPropertiesFromRow: &row];
|
||||
|
||||
talloc_free (memCtx);
|
||||
|
||||
//talloc_free (memCtx);
|
||||
}
|
||||
|
||||
/* subclasses */
|
||||
|
||||
@@ -68,7 +68,7 @@ sogo_backend_atexit (void)
|
||||
|
||||
GSRegisterCurrentThread ();
|
||||
pool = [NSAutoreleasePool new];
|
||||
NSLog (@"allocated classes:\n%s", GSDebugAllocationList (YES));
|
||||
//NSLog (@"allocated classes:\n%s", GSDebugAllocationList (YES));
|
||||
[pool release];
|
||||
GSUnregisterCurrentThread ();
|
||||
}
|
||||
@@ -95,6 +95,7 @@ sogo_backend_init (void)
|
||||
defaults using the system encoding rather than honouring
|
||||
the encoding specified in the file. */
|
||||
putenv ("GNUSTEP_STRING_ENCODING=NSUTF8StringEncoding");
|
||||
//putenv ("NSZombieEnabled=YES");
|
||||
|
||||
[NSProcessInfo initializeWithArguments: argv
|
||||
count: 1
|
||||
@@ -567,6 +568,7 @@ sogo_folder_delete_message(void *folder_object, uint64_t mid, uint8_t flags)
|
||||
static enum mapistore_error
|
||||
sogo_folder_move_copy_messages(void *folder_object,
|
||||
void *source_folder_object,
|
||||
TALLOC_CTX *mem_ctx,
|
||||
uint32_t mid_count,
|
||||
uint64_t *src_mids, uint64_t *t_mids,
|
||||
struct Binary_r **target_change_keys,
|
||||
@@ -594,7 +596,8 @@ sogo_folder_move_copy_messages(void *folder_object,
|
||||
fromFolder: sourceFolder
|
||||
withMIDs: t_mids
|
||||
andChangeKeys: target_change_keys
|
||||
wantCopy: want_copy];
|
||||
wantCopy: want_copy
|
||||
inMemCtx: mem_ctx];
|
||||
[pool release];
|
||||
GSUnregisterCurrentThread ();
|
||||
}
|
||||
@@ -608,7 +611,7 @@ sogo_folder_move_copy_messages(void *folder_object,
|
||||
|
||||
static enum mapistore_error
|
||||
sogo_folder_move_folder(void *folder_object, void *target_folder_object,
|
||||
const char *new_folder_name)
|
||||
TALLOC_CTX *mem_ctx, const char *new_folder_name)
|
||||
{
|
||||
NSAutoreleasePool *pool;
|
||||
MAPIStoreFolder *moveFolder, *targetFolder;
|
||||
@@ -640,7 +643,9 @@ sogo_folder_move_folder(void *folder_object, void *target_folder_object,
|
||||
rc = [moveFolder moveCopyToFolder: targetFolder
|
||||
withNewName: newFolderName
|
||||
isMove: YES
|
||||
isRecursive: YES];
|
||||
isRecursive: YES
|
||||
inMemCtx: mem_ctx];
|
||||
|
||||
[pool release];
|
||||
GSUnregisterCurrentThread ();
|
||||
}
|
||||
@@ -653,7 +658,7 @@ sogo_folder_move_folder(void *folder_object, void *target_folder_object,
|
||||
}
|
||||
|
||||
static enum mapistore_error
|
||||
sogo_folder_copy_folder(void *folder_object, void *target_folder_object,
|
||||
sogo_folder_copy_folder(void *folder_object, void *target_folder_object, TALLOC_CTX *mem_ctx,
|
||||
bool recursive, const char *new_folder_name)
|
||||
{
|
||||
NSAutoreleasePool *pool;
|
||||
@@ -680,7 +685,9 @@ sogo_folder_copy_folder(void *folder_object, void *target_folder_object,
|
||||
rc = [copyFolder moveCopyToFolder: targetFolder
|
||||
withNewName: newFolderName
|
||||
isMove: NO
|
||||
isRecursive: recursive];
|
||||
isRecursive: recursive
|
||||
inMemCtx: mem_ctx];
|
||||
|
||||
[pool release];
|
||||
GSUnregisterCurrentThread ();
|
||||
}
|
||||
@@ -1017,7 +1024,7 @@ sogo_message_set_read_flag (void *message_object, uint8_t flag)
|
||||
}
|
||||
|
||||
static enum mapistore_error
|
||||
sogo_message_save (void *message_object)
|
||||
sogo_message_save (void *message_object, TALLOC_CTX *mem_ctx)
|
||||
{
|
||||
struct MAPIStoreTallocWrapper *wrapper;
|
||||
NSAutoreleasePool *pool;
|
||||
@@ -1032,7 +1039,7 @@ sogo_message_save (void *message_object)
|
||||
message = wrapper->instance;
|
||||
GSRegisterCurrentThread ();
|
||||
pool = [NSAutoreleasePool new];
|
||||
rc = [message saveMessage];
|
||||
rc = [message saveMessage: mem_ctx];
|
||||
// [context tearDownRequest];
|
||||
[pool release];
|
||||
GSUnregisterCurrentThread ();
|
||||
@@ -1222,7 +1229,7 @@ sogo_table_set_restrictions (void *table_object, struct mapi_SRestriction *restr
|
||||
GSRegisterCurrentThread ();
|
||||
pool = [NSAutoreleasePool new];
|
||||
[table setRestrictions: restrictions];
|
||||
[table cleanupCaches];
|
||||
//[table cleanupCaches];
|
||||
rc = MAPISTORE_SUCCESS;
|
||||
*table_status = TBLSTAT_COMPLETE;
|
||||
[pool release];
|
||||
|
||||
@@ -375,12 +375,12 @@ static Class NSDataK, NSStringK;
|
||||
|
||||
- (void) setRestrictions: (const struct mapi_SRestriction *) res
|
||||
{
|
||||
EOQualifier *oldRestriction;
|
||||
//EOQualifier *oldRestriction;
|
||||
|
||||
// [self logWithFormat: @"set restriction to (table type: %d): %@",
|
||||
// type, MAPIStringForRestriction (res)];
|
||||
|
||||
oldRestriction = restriction;
|
||||
//oldRestriction = restriction;
|
||||
[restriction autorelease];
|
||||
if (res)
|
||||
restrictionState = [self evaluateRestriction: res
|
||||
@@ -396,11 +396,11 @@ static Class NSDataK, NSStringK;
|
||||
// FIXME: we should not flush the caches if the restrictions matches
|
||||
[self cleanupCaches];
|
||||
|
||||
if (restriction)
|
||||
[self logWithFormat: @"restriction set to EOQualifier: %@",
|
||||
restriction];
|
||||
else if (oldRestriction)
|
||||
[self logWithFormat: @"restriction unset (was %@)", oldRestriction];
|
||||
//if (restriction)
|
||||
// [self logWithFormat: @"restriction set to EOQualifier: %@",
|
||||
// restriction];
|
||||
// else if (oldRestriction)
|
||||
// [self logWithFormat: @"restriction unset (was %@)", oldRestriction];
|
||||
}
|
||||
|
||||
- (MAPIRestrictionState) evaluateNotRestriction: (struct mapi_SNotRestriction *) res
|
||||
|
||||
@@ -357,7 +357,7 @@
|
||||
return rc;
|
||||
}
|
||||
|
||||
- (void) save
|
||||
- (void) save:(TALLOC_CTX *) memCtx
|
||||
{
|
||||
iCalCalendar *vCalendar;
|
||||
iCalToDo *vToDo;
|
||||
|
||||
@@ -52,9 +52,9 @@ static inline NSNumber *
|
||||
MAPIPropertyKey (enum MAPITAGS propTag)
|
||||
{
|
||||
#if (GS_SIZEOF_LONG == 4)
|
||||
return [NSNumber numberWithUnsignedLong: propTag];
|
||||
return [NSString stringWithFormat: @"%ul", propTag];
|
||||
#elif (GS_SIZEOF_INT == 4)
|
||||
return [NSNumber numberWithUnsignedInt: propTag];
|
||||
return [NSString stringWithFormat: @"%u", propTag];
|
||||
#else
|
||||
#error No suitable type for 4 bytes integers
|
||||
#endif
|
||||
|
||||
@@ -342,7 +342,8 @@ MAPIStoreDumpMessageProperties (NSDictionary *properties)
|
||||
{
|
||||
NSNumber *key;
|
||||
NSArray *allKeys;
|
||||
NSUInteger keyAsInt, count, max;
|
||||
NSUInteger count, max;
|
||||
NSUInteger keyAsInt;
|
||||
id value;
|
||||
|
||||
allKeys = [properties allKeys];
|
||||
@@ -351,7 +352,7 @@ MAPIStoreDumpMessageProperties (NSDictionary *properties)
|
||||
NSLog (@"message properties (%d):", max);
|
||||
|
||||
value = [properties objectForKey: @"recipients"];
|
||||
if (value)
|
||||
if (value)
|
||||
NSLog (@" recipients: %@", value);
|
||||
|
||||
for (count = 0; count < max; count++)
|
||||
@@ -363,7 +364,7 @@ MAPIStoreDumpMessageProperties (NSDictionary *properties)
|
||||
value = [properties objectForKey: key];
|
||||
NSLog (@" 0x%.4x: %@ (%@)",
|
||||
keyAsInt, value,
|
||||
NSStringFromClass ([value class]));
|
||||
NSStringFromClass ([value class]));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,7 @@
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#import <Foundation/NSCharacterSet.h>
|
||||
#import <Foundation/NSData.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSMapTable.h>
|
||||
@@ -107,15 +108,17 @@ static NSMapTable *contextsTable = nil;
|
||||
password = nil;
|
||||
|
||||
path = [NSString stringWithFormat: SAMBA_PRIVATE_DIR
|
||||
@"/mapistore/%@/password", newUsername];
|
||||
@"/mapistore/%@/password", newUsername];
|
||||
|
||||
content = [NSData dataWithContentsOfFile: path];
|
||||
|
||||
if (content)
|
||||
{
|
||||
password = [[NSString alloc] initWithData: content
|
||||
encoding: NSUTF8StringEncoding];
|
||||
encoding: NSUTF8StringEncoding];
|
||||
[password autorelease];
|
||||
password = [password stringByTrimmingCharactersInSet:
|
||||
[NSCharacterSet characterSetWithCharactersInString: @"\r\n"]];
|
||||
}
|
||||
|
||||
return password;
|
||||
|
||||
@@ -50,7 +50,7 @@ MAPIStoreTallocWrapperDestroy (void *data)
|
||||
GSRegisterCurrentThread ();
|
||||
pool = [NSAutoreleasePool new];
|
||||
wrapper = data;
|
||||
// NSLog (@"destroying wrapped object (wrapper: %p; object: %p)...\n", wrapper, wrapper->MAPIStoreSOGoObject);
|
||||
//NSLog (@"destroying wrapped object (wrapper: %p; object: %p (%@))...\n", wrapper, wrapper->instance, NSStringFromClass([wrapper->instance class]));
|
||||
[wrapper->instance release];
|
||||
[pool release];
|
||||
GSUnregisterCurrentThread ();
|
||||
@@ -66,8 +66,7 @@ MAPIStoreTallocWrapperDestroy (void *data)
|
||||
talloc_set_destructor ((void *) wrapper, MAPIStoreTallocWrapperDestroy);
|
||||
wrapper->instance = self;
|
||||
[self retain];
|
||||
// NSLog (@"returning wrapper: %p; object: %p", wrapper, self);
|
||||
|
||||
//NSLog (@"returning wrapper: %p; object: %p (%@)", wrapper, self, NSStringFromClass([self class]));
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
|
||||
@@ -33,6 +33,8 @@
|
||||
#import <Foundation/NSValue.h>
|
||||
#import <NGExtensions/NSNull+misc.h>
|
||||
|
||||
#import "BSONCodec.h"
|
||||
|
||||
const char *indentationStep = " ";
|
||||
|
||||
@interface NSObject (plext)
|
||||
@@ -142,41 +144,43 @@ const char *indentationStep = " ";
|
||||
static void
|
||||
OCDumpPListData (NSData *content)
|
||||
{
|
||||
NSDictionary *d;
|
||||
NSPropertyListFormat format;
|
||||
NSString *error = nil;
|
||||
const char *formatName;
|
||||
//NSDictionary *d;
|
||||
//NSPropertyListFormat format;
|
||||
//NSString *error = nil;
|
||||
//const char *formatName;
|
||||
|
||||
d = [NSPropertyListSerialization propertyListFromData: content
|
||||
mutabilityOption: NSPropertyListImmutable
|
||||
format: &format
|
||||
errorDescription: &error];
|
||||
if (d)
|
||||
{
|
||||
switch (format)
|
||||
{
|
||||
case NSPropertyListOpenStepFormat:
|
||||
formatName = "OpenStep";
|
||||
break;
|
||||
case NSPropertyListXMLFormat_v1_0:
|
||||
formatName = "XML";
|
||||
break;
|
||||
case NSPropertyListBinaryFormat_v1_0:
|
||||
formatName = "Binary";
|
||||
break;
|
||||
case NSPropertyListGNUstepFormat:
|
||||
formatName = "GNUstep";
|
||||
break;
|
||||
case NSPropertyListGNUstepBinaryFormat:
|
||||
formatName = "GNUstep binary";
|
||||
break;
|
||||
default: formatName = "unknown";
|
||||
}
|
||||
//d = [NSPropertyListSerialization propertyListFromData: content
|
||||
// mutabilityOption: NSPropertyListImmutable
|
||||
// format: &format
|
||||
// errorDescription: &error];
|
||||
//d = [content BSONValue];
|
||||
|
||||
printf ("File format is: %s\n", formatName);
|
||||
[d displayWithIndentation: 0];
|
||||
printf ("\n");
|
||||
}
|
||||
else
|
||||
printf ("an error occurred: %s\n", [error UTF8String]);
|
||||
// if (d)
|
||||
// {
|
||||
// switch (format)
|
||||
// {
|
||||
// case NSPropertyListOpenStepFormat:
|
||||
// formatName = "OpenStep";
|
||||
// break;
|
||||
// case NSPropertyListXMLFormat_v1_0:
|
||||
// formatName = "XML";
|
||||
// break;
|
||||
// case NSPropertyListBinaryFormat_v1_0:
|
||||
// formatName = "Binary";
|
||||
// break;
|
||||
// case NSPropertyListGNUstepFormat:
|
||||
// formatName = "GNUstep";
|
||||
// break;
|
||||
// case NSPropertyListGNUstepBinaryFormat:
|
||||
// formatName = "GNUstep binary";
|
||||
// break;
|
||||
// default: formatName = "unknown";
|
||||
// }
|
||||
|
||||
// printf ("File format is: %s\n", formatName);
|
||||
// [d displayWithIndentation: 0];
|
||||
// printf ("\n");
|
||||
// }
|
||||
// else
|
||||
// printf ("an error occurred: %s\n", [error UTF8String]);
|
||||
}
|
||||
@@ -0,0 +1,132 @@
|
||||
/*
|
||||
Copyright (C) 2005-2012 Inverse inc.
|
||||
|
||||
This file is part of SOGo.
|
||||
|
||||
SOGo 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.
|
||||
|
||||
SOGo 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 OGo; see the file COPYING. If not, write to the
|
||||
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <Foundation/NSArray.h>
|
||||
#include <Foundation/NSData.h>
|
||||
#include <Foundation/NSMapTable.h>
|
||||
#include <Foundation/NSObject.h>
|
||||
#include <Foundation/NSString.h>
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
@interface RTFHandler : NSObject
|
||||
{
|
||||
NSMapTable *_charsets;
|
||||
NSMutableData *_html;
|
||||
NSData *_data;
|
||||
|
||||
const char *_bytes;
|
||||
int _current_pos;
|
||||
int _len;
|
||||
}
|
||||
|
||||
- (id) initWithData: (NSData *) theData;
|
||||
- (NSMutableData *) parse;
|
||||
@end
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
@interface RTFStack: NSObject
|
||||
{
|
||||
NSMutableArray *a;
|
||||
}
|
||||
- (void) push: (id) theObject;
|
||||
- (id) pop;
|
||||
@end
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
@interface RTFFormattingOptions : NSObject
|
||||
{
|
||||
@public
|
||||
BOOL bold;
|
||||
BOOL italic;
|
||||
BOOL underline;
|
||||
BOOL strikethrough;
|
||||
int font_index;
|
||||
int color_index;
|
||||
int start_pos;
|
||||
}
|
||||
@end
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
@interface RTFFontInfo : NSObject
|
||||
{
|
||||
@public
|
||||
NSString *family;
|
||||
NSString *charset;
|
||||
NSString *name;
|
||||
unsigned int pitch;
|
||||
unsigned int index;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
//
|
||||
// \fX - font, index in font table
|
||||
//
|
||||
@interface RTFFontTable : NSObject
|
||||
{
|
||||
@public
|
||||
NSMapTable *fontInfos;
|
||||
}
|
||||
|
||||
- (void) addFontInfo: (RTFFontInfo *) theFontInfo
|
||||
atIndex: (unsigned int ) theIndex;
|
||||
|
||||
- (RTFFontInfo *) fontInfoAtIndex: (unsigned int ) theIndex;
|
||||
|
||||
@end
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
@interface RTFColorDef : NSObject
|
||||
{
|
||||
@public
|
||||
unsigned char red;
|
||||
unsigned char green;
|
||||
unsigned char blue;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
//
|
||||
// {\colortbl\red0\green0\blue0;\red128\green0\blue0;\red255\green0\blue0;}
|
||||
//
|
||||
// \cfX - color/foreground - index
|
||||
// \cbX - color/background - index
|
||||
//
|
||||
//
|
||||
@interface RTFColorTable : NSObject
|
||||
{
|
||||
@public
|
||||
NSMutableArray *colorDefs;
|
||||
}
|
||||
|
||||
- (void) addColorDef: (RTFColorDef *) theColorDef;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,949 @@
|
||||
/*
|
||||
Copyright (C) 2005-2013 Inverse inc.
|
||||
|
||||
This file is part of SOGo.
|
||||
|
||||
SOGo 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.
|
||||
|
||||
SOGo 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 OGo; see the file COPYING. If not, write to the
|
||||
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include "RTFHandler.h"
|
||||
#include <Foundation/NSValue.h>
|
||||
|
||||
//
|
||||
// Useful macros
|
||||
//
|
||||
#define ADVANCE _bytes++; _current_pos++;
|
||||
#define REWIND _bytes--; _current_pos--;
|
||||
|
||||
|
||||
//
|
||||
// Charset definitions. See http://msdn.microsoft.com/en-us/goglobal/bb964654 for all details.
|
||||
//
|
||||
const unsigned short ansicpg1250[256] = {
|
||||
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
|
||||
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
|
||||
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
|
||||
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
|
||||
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
|
||||
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
|
||||
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
|
||||
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
|
||||
0x20ac, 0x0000, 0x201a, 0x0000, 0x201e, 0x2026, 0x2020, 0x2021, 0x0000, 0x2030, 0x0160, 0x2039, 0x015a, 0x0164, 0x017d, 0x0179,
|
||||
0x0000, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0161, 0x203a, 0x015b, 0x0165, 0x017e, 0x017a,
|
||||
0x00a0, 0x02c7, 0x02d8, 0x0141, 0x00a4, 0x0104, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x015e, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x017b,
|
||||
0x00b0, 0x00b1, 0x02db, 0x0142, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x0105, 0x015f, 0x00bb, 0x013d, 0x02dd, 0x013e, 0x017c,
|
||||
0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e,
|
||||
0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df,
|
||||
0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f,
|
||||
0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9 };
|
||||
|
||||
const unsigned short ansicpg1251[256] = {
|
||||
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
|
||||
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
|
||||
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
|
||||
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
|
||||
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
|
||||
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
|
||||
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
|
||||
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
|
||||
0x0402, 0x0403, 0x201a, 0x0453, 0x201e, 0x2026, 0x2020, 0x2021, 0x20ac, 0x2030, 0x0409, 0x2039, 0x040a, 0x040c, 0x040b, 0x040f,
|
||||
0x0452, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0459, 0x203a, 0x045a, 0x045c, 0x045b, 0x045f,
|
||||
0x00a0, 0x040e, 0x045e, 0x0408, 0x00a4, 0x0490, 0x00a6, 0x00a7, 0x0401, 0x00a9, 0x0404, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0407,
|
||||
0x00b0, 0x00b1, 0x0406, 0x0456, 0x0491, 0x00b5, 0x00b6, 0x00b7, 0x0451, 0x2116, 0x0454, 0x00bb, 0x0458, 0x0405, 0x0455, 0x0457,
|
||||
0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f,
|
||||
0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f,
|
||||
0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f,
|
||||
0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f };
|
||||
|
||||
const unsigned short ansicpg1252[256] = {
|
||||
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
|
||||
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
|
||||
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
|
||||
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
|
||||
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
|
||||
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
|
||||
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
|
||||
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
|
||||
0x20ac, 0x0000, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x017d, 0x0000,
|
||||
0x0000, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x0000, 0x017e, 0x0178,
|
||||
0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
|
||||
0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
|
||||
0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
|
||||
0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
|
||||
0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
|
||||
0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff };
|
||||
|
||||
const unsigned short ansicpg1253[256] = {
|
||||
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
|
||||
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
|
||||
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
|
||||
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
|
||||
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
|
||||
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
|
||||
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
|
||||
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
|
||||
0x20ac, 0x0000, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0000, 0x203a, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x00a0, 0x0385, 0x0386, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x0000, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x2015,
|
||||
0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x00b5, 0x00b6, 0x00b7, 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f,
|
||||
0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f,
|
||||
0x03a0, 0x03a1, 0x0000, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af,
|
||||
0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf,
|
||||
0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x0000 };
|
||||
|
||||
const unsigned short ansicpg1254[256] = {
|
||||
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
|
||||
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
|
||||
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
|
||||
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
|
||||
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
|
||||
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
|
||||
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
|
||||
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
|
||||
0x20ac, 0x0000, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x0000, 0x0000, 0x0178,
|
||||
0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
|
||||
0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
|
||||
0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
|
||||
0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df,
|
||||
0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
|
||||
0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff };
|
||||
|
||||
const unsigned short ansicpg1255[256] = {
|
||||
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
|
||||
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
|
||||
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
|
||||
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
|
||||
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
|
||||
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
|
||||
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
|
||||
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
|
||||
0x20ac, 0x0000, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0000, 0x203a, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20aa, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
|
||||
0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
|
||||
0x05b0, 0x05b1, 0x05b2, 0x05b3, 0x05b4, 0x05b5, 0x05b6, 0x05b7, 0x05b8, 0x05b9, 0x0000, 0x05bb, 0x05bc, 0x05bd, 0x05be, 0x05bf,
|
||||
0x05c0, 0x05c1, 0x05c2, 0x05c3, 0x05f0, 0x05f1, 0x05f2, 0x05f3, 0x05f4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df,
|
||||
0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x05ea, 0x0000, 0x0000, 0x200e, 0x200f, 0x0000 };
|
||||
|
||||
const unsigned short ansicpg1256[256] = {
|
||||
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
|
||||
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
|
||||
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
|
||||
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
|
||||
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
|
||||
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
|
||||
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
|
||||
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
|
||||
0x20ac, 0x067e, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688,
|
||||
0x06af, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x06a9, 0x2122, 0x0691, 0x203a, 0x0153, 0x200c, 0x200d, 0x06ba,
|
||||
0x00a0, 0x060c, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x06be, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
|
||||
0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x061b, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x061f,
|
||||
0x06c1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f,
|
||||
0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00d7, 0x0637, 0x0638, 0x0639, 0x063a, 0x0640, 0x0641, 0x0642, 0x0643,
|
||||
0x00e0, 0x0644, 0x00e2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x0649, 0x064a, 0x00ee, 0x00ef,
|
||||
0x064b, 0x064c, 0x064d, 0x064e, 0x00f4, 0x064f, 0x0650, 0x00f7, 0x0651, 0x00f9, 0x0652, 0x00fb, 0x00fc, 0x200e, 0x200f, 0x06d2 };
|
||||
|
||||
const unsigned short ansicpg1257[256] = {
|
||||
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
|
||||
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
|
||||
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
|
||||
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
|
||||
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
|
||||
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
|
||||
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
|
||||
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
|
||||
0x20ac, 0x0000, 0x201a, 0x0000, 0x201e, 0x2026, 0x2020, 0x2021, 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x00a8, 0x02c7, 0x00b8,
|
||||
0x0000, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0000, 0x203a, 0x0000, 0x00af, 0x02db, 0x0000,
|
||||
0x00a0, 0x0000, 0x00a2, 0x00a3, 0x00a4, 0x0000, 0x00a6, 0x00a7, 0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6,
|
||||
0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6,
|
||||
0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112, 0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b,
|
||||
0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7, 0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df,
|
||||
0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113, 0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c,
|
||||
0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7, 0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x02d9 };
|
||||
|
||||
const unsigned short ansicpg1258[256] = {
|
||||
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
|
||||
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
|
||||
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
|
||||
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
|
||||
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
|
||||
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
|
||||
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
|
||||
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
|
||||
0x20ac, 0x0000, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0000, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0000, 0x203a, 0x0153, 0x0000, 0x0000, 0x0178,
|
||||
0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
|
||||
0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
|
||||
0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x0300, 0x00cd, 0x00ce, 0x00cf,
|
||||
0x0110, 0x00d1, 0x0309, 0x00d3, 0x00d4, 0x01a0, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x01af, 0x0303, 0x00df,
|
||||
0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x0301, 0x00ed, 0x00ee, 0x00ef,
|
||||
0x0111, 0x00f1, 0x0323, 0x00f3, 0x00f4, 0x01a1, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x01b0, 0x20ab, 0x00ff };
|
||||
|
||||
const unsigned short ansicpg874[256] = {
|
||||
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
|
||||
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
|
||||
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
|
||||
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
|
||||
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
|
||||
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
|
||||
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
|
||||
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
|
||||
0x20ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x2026, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x00a0, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07, 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f,
|
||||
0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17, 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f,
|
||||
0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27, 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f,
|
||||
0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37, 0x0e38, 0x0e39, 0x0e3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0e3f,
|
||||
0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47, 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f,
|
||||
0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, 0x0e58, 0x0e59, 0x0e5a, 0x0e5b, 0x0000, 0x0000, 0x0000, 0x0000 };
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
@implementation RTFStack
|
||||
|
||||
- (id) init
|
||||
{
|
||||
if ((self = [super init]))
|
||||
{
|
||||
a = [[NSMutableArray alloc] init];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void) dealloc
|
||||
{
|
||||
RELEASE(a);
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (void) push: (id) theObject
|
||||
{
|
||||
[a addObject: theObject];
|
||||
}
|
||||
|
||||
- (id) pop
|
||||
{
|
||||
id o = nil;
|
||||
|
||||
if ([a count])
|
||||
{
|
||||
o = AUTORELEASE([[a lastObject] retain]);
|
||||
[a removeLastObject];
|
||||
}
|
||||
|
||||
return o;
|
||||
}
|
||||
|
||||
- (id) top
|
||||
{
|
||||
id o = nil;
|
||||
|
||||
if ([a count])
|
||||
{
|
||||
o = AUTORELEASE([[a lastObject] retain]);
|
||||
}
|
||||
|
||||
return o;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
@implementation RTFFormattingOptions
|
||||
@end
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
@implementation RTFFontInfo
|
||||
|
||||
- (id) init
|
||||
{
|
||||
if ((self = [super init]))
|
||||
{
|
||||
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void) dealloc
|
||||
{
|
||||
RELEASE(family);
|
||||
RELEASE(charset);
|
||||
RELEASE(name);
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
@implementation RTFFontTable
|
||||
|
||||
- (id) init
|
||||
{
|
||||
if ((self = [super init]))
|
||||
{
|
||||
fontInfos = NSCreateMapTable(NSObjectMapKeyCallBacks, NSObjectMapValueCallBacks, 128);
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void) dealloc
|
||||
{
|
||||
NSFreeMapTable(fontInfos);
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (void) addFontInfo: (RTFFontInfo *) theFontInfo
|
||||
atIndex: (unsigned int) theIndex
|
||||
{
|
||||
NSNumber *key;
|
||||
|
||||
key = [NSNumber numberWithInt: theIndex];
|
||||
NSMapInsert(fontInfos, key, (void*) theFontInfo);
|
||||
}
|
||||
|
||||
- (RTFFontInfo *) fontInfoAtIndex: (unsigned int) theIndex
|
||||
{
|
||||
NSNumber *key;
|
||||
|
||||
key = [NSNumber numberWithInt: theIndex];
|
||||
return NSMapGet(fontInfos, key);
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
@implementation RTFColorDef
|
||||
|
||||
@end
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
@implementation RTFColorTable
|
||||
|
||||
- (id) init
|
||||
{
|
||||
if ((self = [super init]))
|
||||
{
|
||||
colorDefs = [[NSMutableArray alloc] init];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void) dealloc
|
||||
{
|
||||
RELEASE(colorDefs);
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (void) addColorDef: (RTFColorDef *) theColorDef
|
||||
{
|
||||
[colorDefs addObject: theColorDef];
|
||||
}
|
||||
|
||||
- (RTFColorDef *) colorDefAtIndex: (unsigned int) theIndex
|
||||
{
|
||||
return [colorDefs objectAtIndex: theIndex];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
@implementation RTFHandler
|
||||
|
||||
- (id) initWithData: (NSData *) theData
|
||||
{
|
||||
if ((self = [super init]))
|
||||
{
|
||||
ASSIGN(_data, theData);
|
||||
_bytes = (char *)[_data bytes];
|
||||
_len = [_data length];
|
||||
_current_pos = 0;
|
||||
|
||||
_charsets = NSCreateMapTable(NSObjectMapKeyCallBacks, NSNonOwnedPointerMapValueCallBacks, 10);
|
||||
NSMapInsert(_charsets, @"ansicpg1250", ansicpg1250);
|
||||
NSMapInsert(_charsets, @"ansicpg1251", ansicpg1251);
|
||||
NSMapInsert(_charsets, @"ansicpg1252", ansicpg1252);
|
||||
NSMapInsert(_charsets, @"ansicpg1253", ansicpg1253);
|
||||
NSMapInsert(_charsets, @"ansicpg1254", ansicpg1254);
|
||||
NSMapInsert(_charsets, @"ansicpg1255", ansicpg1255);
|
||||
NSMapInsert(_charsets, @"ansicpg1256", ansicpg1256);
|
||||
NSMapInsert(_charsets, @"ansicpg1257", ansicpg1257);
|
||||
NSMapInsert(_charsets, @"ansicpg1258", ansicpg1258);
|
||||
NSMapInsert(_charsets, @"ansicpg874", ansicpg874);
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void) dealloc
|
||||
{
|
||||
NSFreeMapTable(_charsets);
|
||||
RELEASE(_data);
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (const char *) parseControlWord: (unsigned int *) len
|
||||
{
|
||||
const char *start, *end;
|
||||
|
||||
start = ADVANCE;
|
||||
|
||||
while (isalnum(*_bytes) || *_bytes == '-')
|
||||
{
|
||||
ADVANCE;
|
||||
}
|
||||
end = _bytes;
|
||||
|
||||
*len = end-start-1;
|
||||
return start+1;
|
||||
}
|
||||
|
||||
//
|
||||
// {\colortbl\red0\green0\blue0;\red128\green0\blue0;\red255\green0\blue0;}
|
||||
//
|
||||
- (RTFColorTable *) parseColorTable
|
||||
{
|
||||
RTFColorTable *colorTable;
|
||||
RTFColorDef *colorDef;
|
||||
|
||||
colorTable = [[[RTFColorTable alloc] init] autorelease];
|
||||
colorDef = [[[RTFColorDef alloc] init] autorelease];
|
||||
|
||||
while (*_bytes != '}')
|
||||
{
|
||||
if (*_bytes == ';')
|
||||
{
|
||||
[colorTable addColorDef: colorDef];
|
||||
colorDef = [[[RTFColorDef alloc] init] autorelease];
|
||||
ADVANCE;
|
||||
}
|
||||
else if (*_bytes == '\\')
|
||||
{
|
||||
const char *cw;
|
||||
unsigned int len;
|
||||
NSString *s;
|
||||
|
||||
cw = [self parseControlWord: &len];
|
||||
|
||||
// Skip our control word
|
||||
//if (strncmp(start+1, "colortbl", len) == 0)
|
||||
// continue;
|
||||
|
||||
s = [[NSString alloc] initWithBytesNoCopy: (void *)cw
|
||||
length: len
|
||||
encoding: NSASCIIStringEncoding
|
||||
freeWhenDone: NO];
|
||||
[s autorelease];
|
||||
|
||||
if ([s hasPrefix: @"red"])
|
||||
{
|
||||
colorDef->red = [[s substringFromIndex: 3] intValue];
|
||||
}
|
||||
else if ([s hasPrefix: @"green"])
|
||||
{
|
||||
colorDef->green = [[s substringFromIndex: 4] intValue];
|
||||
}
|
||||
else
|
||||
{
|
||||
colorDef->blue = [[s substringFromIndex: 4] intValue];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ADVANCE;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return colorTable;
|
||||
}
|
||||
|
||||
//
|
||||
// Possible formats:
|
||||
//
|
||||
// {\fonttbl\f0\fswiss Helvetica;}
|
||||
// {\fonttbl{\f0\froman\fcharset0\fprq2 Arial;}{\f1\fswiss\fprq2\fcharset0 Arial;}}
|
||||
//
|
||||
// FIXME: Complex ones not handled right now:
|
||||
//
|
||||
// {\fonttbl{\f2\fnil\fcharset256\fprq2{\*\panose 00020703090202050204}Courier New;}{...
|
||||
// {\fonttbl{\f31\fnil\fcharset0\fprq0 Times New Roman Monotype{\*\falt Times New Roman};}{...
|
||||
//
|
||||
// We receive the full string.
|
||||
//
|
||||
- (RTFFontTable *) parseFontTable
|
||||
{
|
||||
NSMutableString *fontName;
|
||||
RTFFontTable *fontTable;
|
||||
RTFFontInfo *fontInfo;
|
||||
|
||||
unsigned int count;
|
||||
|
||||
fontTable = [[[RTFFontTable alloc] init] autorelease];
|
||||
fontName = nil;
|
||||
count = 0;
|
||||
|
||||
do
|
||||
{
|
||||
if (*_bytes == '{')
|
||||
{
|
||||
if (fontTable)
|
||||
{
|
||||
fontInfo = [[[RTFFontInfo alloc] init] autorelease];
|
||||
fontName = [[[NSMutableString alloc] init] autorelease];
|
||||
}
|
||||
ADVANCE;
|
||||
count++;
|
||||
}
|
||||
else if (*_bytes == '}')
|
||||
{
|
||||
if (fontTable) //&& ![NSAllMapTableValues(fontTable->fontInfos) containsObject: fontInfo])
|
||||
{
|
||||
ASSIGN(fontInfo->name, fontName);
|
||||
[fontTable addFontInfo: fontInfo atIndex: fontInfo->index];
|
||||
}
|
||||
ADVANCE;
|
||||
count--;
|
||||
}
|
||||
else if (*_bytes == '\\')
|
||||
{
|
||||
const char *cw;
|
||||
unsigned int len;
|
||||
NSString *s;
|
||||
|
||||
cw = [self parseControlWord: &len];
|
||||
|
||||
// Skip our control word
|
||||
if (strncmp((const char*)cw, "fonttbl", len) == 0)
|
||||
continue;
|
||||
|
||||
// We must at least parse <fontnum><fontfamily><fcharset>
|
||||
s = [[NSString alloc] initWithBytesNoCopy: (void *)cw+1
|
||||
length: len-1
|
||||
encoding: NSASCIIStringEncoding
|
||||
freeWhenDone: NO];
|
||||
[s autorelease];
|
||||
|
||||
// If we got a fontnum, let's parse all three fields at once)
|
||||
if (isdigit(*(cw+1)))
|
||||
{
|
||||
fontInfo->index = [s intValue];
|
||||
|
||||
// We now parse <fontfamily><fcharset>
|
||||
cw = [self parseControlWord: &len];
|
||||
fontInfo->family = [[NSString alloc] initWithBytesNoCopy: (void *)cw+1
|
||||
length: len-1
|
||||
encoding: NSASCIIStringEncoding
|
||||
freeWhenDone: NO];
|
||||
|
||||
cw = [self parseControlWord: &len];
|
||||
fontInfo->charset = [[NSString alloc] initWithBytesNoCopy: (void *)cw+1
|
||||
length: len-1
|
||||
encoding: NSASCIIStringEncoding
|
||||
freeWhenDone: NO];
|
||||
|
||||
// We now skip everything until we find our final group closer ('}')
|
||||
int cc = 1;
|
||||
|
||||
do
|
||||
{
|
||||
if (*_bytes == '{')
|
||||
cc++;
|
||||
if (*_bytes == '}')
|
||||
cc--;
|
||||
|
||||
ADVANCE;
|
||||
}
|
||||
while (cc != 0);
|
||||
|
||||
// move back our buffer;
|
||||
REWIND;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (isalnum(*_bytes))
|
||||
[fontName appendFormat: @"%c", *_bytes];
|
||||
ADVANCE;
|
||||
}
|
||||
} while (count != 0);
|
||||
|
||||
return fontTable;
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
- (void) parseStyleSheet
|
||||
{
|
||||
unsigned int count;
|
||||
|
||||
count = 0;
|
||||
|
||||
do
|
||||
{
|
||||
if (*_bytes == '{')
|
||||
{
|
||||
count++;
|
||||
}
|
||||
else if (*_bytes == '}')
|
||||
{
|
||||
count--;
|
||||
}
|
||||
ADVANCE;
|
||||
|
||||
} while (count != 0);
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
- (void) parsePicture
|
||||
{
|
||||
// Do the same as -parseStyleSheet for now, that is, ignore everything.
|
||||
[self parseStyleSheet];
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
- (NSMutableData *) parse
|
||||
{
|
||||
RTFFormattingOptions *formattingOptions;
|
||||
RTFColorTable *colorTable;
|
||||
RTFFontTable *fontTable;
|
||||
RTFStack *stack;
|
||||
|
||||
unsigned short *charset;
|
||||
char c;
|
||||
|
||||
stack = [[RTFStack alloc] init];
|
||||
fontTable = nil;
|
||||
colorTable = nil;
|
||||
charset = NULL;
|
||||
|
||||
_html = [[NSMutableData alloc] init];
|
||||
[_html appendBytes: "<html><meta charset='utf-8'><body>" length: 34];
|
||||
|
||||
|
||||
|
||||
// Check if we got RTF data
|
||||
if (_len > 4 && strncmp((const char*)_bytes, "{\\rtf", 4) != 0)
|
||||
return NO;
|
||||
|
||||
while (_current_pos < _len)
|
||||
{
|
||||
c = *_bytes;
|
||||
|
||||
// RTF control code
|
||||
if (c == '\\')
|
||||
{
|
||||
unsigned int len;
|
||||
const char *cw;
|
||||
NSString *s;
|
||||
|
||||
if (*(_bytes+1) == '\'' && charset)
|
||||
{
|
||||
// A hexadecimal value, based on the specified character set (may be used to identify 8-bit values).
|
||||
NSString *s;
|
||||
NSData *d;
|
||||
|
||||
const char *b1, *b2;
|
||||
unsigned short index;
|
||||
|
||||
ADVANCE;
|
||||
ADVANCE;
|
||||
|
||||
b1 = ADVANCE;
|
||||
b2 = ADVANCE;
|
||||
|
||||
index = (isdigit(*b1) ? *b1 - 48 : toupper(*b1) - 55) * 16;
|
||||
index += (isdigit(*b2) ? *b2 - 48 : toupper(*b2) - 55);
|
||||
|
||||
s = [NSString stringWithCharacters: &(charset[index]) length: 1];
|
||||
d = [s dataUsingEncoding: NSUTF8StringEncoding];
|
||||
[_html appendData: d];
|
||||
continue;
|
||||
}
|
||||
else if (*(_bytes+1) == '*')
|
||||
{
|
||||
while (*_bytes != '}')
|
||||
{
|
||||
ADVANCE;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
cw = [self parseControlWord: &len];
|
||||
|
||||
s = [[NSString alloc] initWithBytesNoCopy: (void *)cw
|
||||
length: len
|
||||
encoding: NSASCIIStringEncoding
|
||||
freeWhenDone: NO];
|
||||
[s autorelease];
|
||||
|
||||
if (strncmp(cw, "ansicpg", 7) == 0)
|
||||
{
|
||||
charset = NSMapGet(_charsets, s);
|
||||
}
|
||||
else if (strncmp(cw, "fonttbl", 7) == 0)
|
||||
{
|
||||
// We rewind our buffer so we start at the beginning of {\fonttbl...
|
||||
_bytes = cw-2;
|
||||
_current_pos -= 10;
|
||||
fontTable = [self parseFontTable];
|
||||
|
||||
// We go back 1 byte in order to end our section properly ('}' character
|
||||
REWIND;
|
||||
}
|
||||
else if (strncmp(cw, "stylesheet", 10) == 0)
|
||||
{
|
||||
_bytes = cw-2;
|
||||
_current_pos -= 13;
|
||||
[self parseStyleSheet];
|
||||
REWIND;
|
||||
}
|
||||
else if (strncmp(cw, "colortbl", 8) == 0)
|
||||
{
|
||||
colorTable = [self parseColorTable];
|
||||
}
|
||||
else if (strncmp(cw, "pict", 4) == 0)
|
||||
{
|
||||
_bytes = cw-2;
|
||||
_current_pos -= 7;
|
||||
[self parsePicture];
|
||||
REWIND;
|
||||
}
|
||||
else if ([s isEqualToString: @"b"] && formattingOptions)
|
||||
{
|
||||
[_html appendBytes: "<b>" length: 3];
|
||||
formattingOptions->bold = YES;
|
||||
}
|
||||
else if ([s isEqualToString: @"b0"] && formattingOptions)
|
||||
{
|
||||
[_html appendBytes: "</b>" length: 4];
|
||||
formattingOptions->bold = NO;
|
||||
}
|
||||
else if ([s hasPrefix: @"cf"] && [s length] > 2)
|
||||
{
|
||||
RTFColorDef *colorDef;
|
||||
int color_index;
|
||||
char *v;
|
||||
|
||||
color_index = [[s substringFromIndex: 2] intValue];
|
||||
|
||||
if (!formattingOptions)
|
||||
continue;
|
||||
|
||||
if (formattingOptions->color_index >= 0) // && color_index != formattingOptions->color_index)
|
||||
{
|
||||
[_html appendBytes: "</font>" length: 7];
|
||||
}
|
||||
|
||||
formattingOptions->color_index = color_index;
|
||||
colorDef = [colorTable colorDefAtIndex: color_index];
|
||||
|
||||
v = malloc(23*sizeof(char));
|
||||
memset(v, 0, 23);
|
||||
sprintf(v, "<font color=\"#%02x%02x%02x\">", colorDef->red, colorDef->green, colorDef->blue);
|
||||
[_html appendBytes: v length: strlen(v)];
|
||||
free(v);
|
||||
}
|
||||
else if ([s hasPrefix: @"fcs"])
|
||||
{
|
||||
// ignore
|
||||
}
|
||||
else if ([s hasPrefix: @"fs"])
|
||||
{
|
||||
// ignore
|
||||
}
|
||||
else if ([s hasPrefix: @"fbidis"])
|
||||
{
|
||||
// ignore
|
||||
}
|
||||
else if ([s hasPrefix: @"fromhtml"])
|
||||
{
|
||||
// ignore
|
||||
}
|
||||
else if ([s hasPrefix: @"f"] && [s length] > 1)
|
||||
{
|
||||
RTFFontInfo *fontInfo;
|
||||
int font_index;
|
||||
|
||||
font_index = [[s substringFromIndex: 1] intValue];
|
||||
|
||||
if (!formattingOptions)
|
||||
continue;
|
||||
|
||||
if (formattingOptions->font_index >= 0 &&
|
||||
font_index != formattingOptions->font_index)
|
||||
{
|
||||
[_html appendBytes: "</font>" length: 7];
|
||||
}
|
||||
|
||||
formattingOptions->font_index = font_index;
|
||||
|
||||
fontInfo = [fontTable fontInfoAtIndex: font_index];
|
||||
|
||||
char *v = malloc(128*sizeof(char));
|
||||
memset(v, 0, 128);
|
||||
sprintf(v, "<font face=\"%s\">", [fontInfo->name UTF8String]);
|
||||
[_html appendBytes: v length: strlen(v)];
|
||||
free(v);
|
||||
}
|
||||
else if ([s isEqualToString: @"i"] && formattingOptions)
|
||||
{
|
||||
[_html appendBytes: "<i>" length: 3];
|
||||
formattingOptions->italic = YES;
|
||||
}
|
||||
else if ([s isEqualToString: @"i0"] && formattingOptions)
|
||||
{
|
||||
[_html appendBytes: "</i>" length: 4];
|
||||
formattingOptions->italic = NO;
|
||||
}
|
||||
else if ([s isEqualToString: @"tab"])
|
||||
{
|
||||
[_html appendBytes: " " length: 12];
|
||||
}
|
||||
else if ([s isEqualToString: @"softline"] || [s isEqualToString: @"par"])
|
||||
{
|
||||
[_html appendBytes: "<br>" length: 4];
|
||||
}
|
||||
else if ([s isEqualToString: @"strike"] && formattingOptions)
|
||||
{
|
||||
[_html appendBytes: "<strike>" length: 8];
|
||||
formattingOptions->strikethrough = YES;
|
||||
}
|
||||
else if ([s isEqualToString: @"strike0"] && formattingOptions)
|
||||
{
|
||||
[_html appendBytes: "</strike>" length: 9];
|
||||
formattingOptions->strikethrough = NO;
|
||||
}
|
||||
else if ([s hasPrefix: @"u"] && [s length] > 1 && isdigit([s characterAtIndex: 1]))
|
||||
{
|
||||
NSData *d;
|
||||
unichar ch;
|
||||
|
||||
ch = (unichar)[[s substringFromIndex: 1] intValue];
|
||||
s = [NSString stringWithCharacters: &ch length: 1];
|
||||
d = [s dataUsingEncoding: NSUTF8StringEncoding];
|
||||
[_html appendData: d];
|
||||
}
|
||||
else if ([s isEqualToString: @"ul"] && formattingOptions)
|
||||
{
|
||||
[_html appendBytes: "<u>" length: 3];
|
||||
formattingOptions->underline = YES;
|
||||
}
|
||||
else if (([s isEqualToString: @"ul0"] || [s isEqualToString: @"ulnone"])
|
||||
&& formattingOptions)
|
||||
{
|
||||
[_html appendBytes: "</u>" length: 4];
|
||||
formattingOptions->underline = NO;
|
||||
}
|
||||
|
||||
// If a space delimits the control word, the space does not appear in the document.
|
||||
// Any characters following the delimiter, including spaces, will appear in the document.
|
||||
if (*_bytes == ' ')
|
||||
{
|
||||
ADVANCE;
|
||||
}
|
||||
}
|
||||
else if (c == '{')
|
||||
{
|
||||
formattingOptions = [[[RTFFormattingOptions alloc] init] autorelease];
|
||||
|
||||
formattingOptions->bold = NO;
|
||||
formattingOptions->italic = NO;
|
||||
formattingOptions->strikethrough = NO;
|
||||
formattingOptions->underline = NO;
|
||||
formattingOptions->font_index = -1;
|
||||
formattingOptions->color_index = -1;
|
||||
formattingOptions->start_pos = [_html length];
|
||||
[stack push: formattingOptions];
|
||||
ADVANCE;
|
||||
}
|
||||
else if (c == '}')
|
||||
{
|
||||
formattingOptions = [stack pop];
|
||||
|
||||
if (formattingOptions)
|
||||
{
|
||||
// Handle {\b bold} vs. \b bold \b0
|
||||
if (formattingOptions->bold)
|
||||
{
|
||||
[_html appendBytes: "</b>" length: 4];
|
||||
}
|
||||
|
||||
if (formattingOptions->italic)
|
||||
{
|
||||
[_html appendBytes: "</i>" length: 4];
|
||||
}
|
||||
|
||||
if (formattingOptions->strikethrough)
|
||||
{
|
||||
[_html appendBytes: "</strike>" length: 9];
|
||||
}
|
||||
|
||||
if (formattingOptions->underline)
|
||||
{
|
||||
[_html appendBytes: "</u>" length: 4];
|
||||
}
|
||||
|
||||
if (formattingOptions->font_index >= 0)
|
||||
{
|
||||
[_html appendBytes: "</font>" length: 7];
|
||||
}
|
||||
|
||||
if (formattingOptions->color_index >= 0)
|
||||
{
|
||||
[_html appendBytes: "</font>" length: 7];
|
||||
}
|
||||
}
|
||||
|
||||
formattingOptions = [stack top];
|
||||
ADVANCE;
|
||||
}
|
||||
else
|
||||
{
|
||||
// We avoid appending NULL bytes
|
||||
if (*_bytes)
|
||||
[_html appendBytes: _bytes length: 1];
|
||||
ADVANCE;
|
||||
}
|
||||
}
|
||||
|
||||
[_html appendBytes: "</body></html>" length: 14];
|
||||
|
||||
RELEASE(stack);
|
||||
return AUTORELEASE(_html);
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -28,6 +28,7 @@
|
||||
#import <Foundation/NSPropertyList.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSURL.h>
|
||||
#import <Foundation/NSUserDefaults.h>
|
||||
#import <Foundation/NSValue.h>
|
||||
#import <GDLAccess/EOAdaptor.h>
|
||||
#import <GDLAccess/EOAdaptorChannel.h>
|
||||
@@ -45,9 +46,22 @@
|
||||
#import "GCSSpecialQueries+OpenChange.h"
|
||||
#import "MAPIStoreTypes.h"
|
||||
#import "SOGoMAPIDBFolder.h"
|
||||
#import "BSONCodec.h"
|
||||
|
||||
#import "SOGoMAPIDBObject.h"
|
||||
|
||||
//
|
||||
// This defines the storage for internal properly list, stored in the
|
||||
// database. Possible values are:
|
||||
//
|
||||
// NSPropertyListGNUstepFormat = 1000
|
||||
// NSPropertyListGNUstepBinaryFormat = 1001
|
||||
// NSPropertyListOpenStepFormat = 1
|
||||
// NSPropertyListXMLFormat_v1_0 = 100
|
||||
// NSPropertyListBinaryFormat_v1_0 = 200
|
||||
//
|
||||
static NSPropertyListFormat plistFormat;
|
||||
|
||||
static EOAttribute *textColumn = nil;
|
||||
|
||||
@implementation SOGoMAPIDBObject
|
||||
@@ -56,6 +70,11 @@ static EOAttribute *textColumn = nil;
|
||||
{
|
||||
NSDictionary *description;
|
||||
|
||||
plistFormat = [[NSUserDefaults standardUserDefaults] integerForKey: @"SOGoPropertyListFormat"];
|
||||
|
||||
if (!plistFormat)
|
||||
plistFormat = NSPropertyListGNUstepBinaryFormat;
|
||||
|
||||
if (!textColumn)
|
||||
{
|
||||
/* TODO: this is a hack for providing an EOAttribute definition that is
|
||||
@@ -138,9 +157,9 @@ static EOAttribute *textColumn = nil;
|
||||
- (void) setupFromRecord: (NSDictionary *) record
|
||||
{
|
||||
NSInteger intValue;
|
||||
NSString *propsValue, *error;
|
||||
NSString *propsValue;//, *error;
|
||||
NSDictionary *newValues;
|
||||
NSPropertyListFormat format;
|
||||
//NSPropertyListFormat format;
|
||||
|
||||
objectType = [[record objectForKey: @"c_type"] intValue];
|
||||
intValue = [[record objectForKey: @"c_creationdate"] intValue];
|
||||
@@ -156,13 +175,8 @@ static EOAttribute *textColumn = nil;
|
||||
propsValue = [record objectForKey: @"c_content"];
|
||||
if ([propsValue isNotNull])
|
||||
{
|
||||
newValues = [NSPropertyListSerialization propertyListFromData: [propsValue dataByDecodingBase64]
|
||||
mutabilityOption: NSPropertyListMutableContainers
|
||||
format: &format
|
||||
errorDescription: &error];
|
||||
newValues = [[propsValue dataByDecodingBase64] BSONValue];
|
||||
[properties addEntriesFromDictionary: newValues];
|
||||
// [properties addEntriesFromDictionary: [propsValue
|
||||
// objectFromJSONString]];
|
||||
}
|
||||
else
|
||||
[properties removeAllObjects];
|
||||
@@ -237,13 +251,13 @@ static EOAttribute *textColumn = nil;
|
||||
className = @"MAPIStoreNotesMessage";
|
||||
else
|
||||
className = @"MAPIStoreDBMessage";
|
||||
[self logWithFormat: @"PidTagMessageClass = '%@', returning '%@'",
|
||||
mapiMsgClass, className];
|
||||
//[self logWithFormat: @"PidTagMessageClass = '%@', returning '%@'",
|
||||
// mapiMsgClass, className];
|
||||
}
|
||||
else
|
||||
{
|
||||
[self warnWithFormat: @"PidTagMessageClass is not set, falling back"
|
||||
@" to 'MAPIStoreDBMessage'"];
|
||||
//[self warnWithFormat: @"PidTagMessageClass is not set, falling back"
|
||||
// @" to 'MAPIStoreDBMessage'"];
|
||||
className = @"MAPIStoreDBMessage";
|
||||
}
|
||||
break;
|
||||
@@ -508,10 +522,7 @@ static EOAttribute *textColumn = nil;
|
||||
|
||||
if ([properties count] > 0)
|
||||
{
|
||||
content = [NSPropertyListSerialization
|
||||
dataFromPropertyList: properties
|
||||
format: NSPropertyListGNUstepBinaryFormat
|
||||
errorDescription: NULL];
|
||||
content = [properties BSONRepresentation];
|
||||
propsValue = [adaptor formatValue: [content stringByEncodingBase64]
|
||||
forAttribute: textColumn];
|
||||
}
|
||||
|
||||
Executable
+84
@@ -0,0 +1,84 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import getopt
|
||||
import os
|
||||
import re
|
||||
import string
|
||||
import sys
|
||||
|
||||
h_template = """unsigned short %(charsetName)s[%(len)d] = { %(values)s };"""
|
||||
CHAR_UNDEF = "0x0000"
|
||||
MAP_LEN = 256
|
||||
itemsPerLine = 16
|
||||
|
||||
def usage():
|
||||
usageMsg = """
|
||||
Usage: %s -f inputFile
|
||||
""" % (os.path.basename(sys.argv[0]))
|
||||
sys.stderr.write(usageMsg)
|
||||
|
||||
def parseCharsetFile(file = None):
|
||||
if file is None:
|
||||
return None
|
||||
|
||||
charmap = [CHAR_UNDEF] * MAP_LEN
|
||||
|
||||
# Sample line:
|
||||
# FD = U+200E : LEFT-TO-RIGHT MARK
|
||||
for line in file.xreadlines():
|
||||
m = re.search("(\w{2}) = U\+(\w{4}) :", line)
|
||||
if not m:
|
||||
sys.stderr.write("Skipping weird line: %s" % line)
|
||||
continue
|
||||
|
||||
ind = int(m.group(1), base=16)
|
||||
unicodeValue = str(m.group(2)).lower()
|
||||
|
||||
charmap[ind] = "0x%s" % (unicodeValue)
|
||||
|
||||
return charmap
|
||||
|
||||
|
||||
def formatCharacterMap(charmap = None):
|
||||
if not charmap:
|
||||
return None
|
||||
|
||||
value = ""
|
||||
for i in xrange(0,MAP_LEN-1):
|
||||
char = charmap[i]
|
||||
if i % itemsPerLine == 0:
|
||||
value += "\n "
|
||||
value += "%s, " % (char)
|
||||
i += 1
|
||||
value += charmap[MAP_LEN-1]
|
||||
|
||||
return value
|
||||
|
||||
if __name__ == '__main__':
|
||||
inputFile = None
|
||||
|
||||
try:
|
||||
opts, args = getopt.getopt(sys.argv[1:], "f:")
|
||||
except getopt.GetoptError, err:
|
||||
sys.stderr.write(str(err))
|
||||
usage()
|
||||
sys.exit(2)
|
||||
|
||||
for o, a in opts:
|
||||
if o == "-f":
|
||||
inputFile = a
|
||||
else:
|
||||
assert False, "unhandled option"
|
||||
|
||||
if not inputFile:
|
||||
usage()
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
f = open(inputFile, "r", 1)
|
||||
|
||||
charsetMap = parseCharsetFile(f)
|
||||
charsetValues = formatCharacterMap(charsetMap)
|
||||
print h_template % {"len": len(charsetMap),
|
||||
"charsetName": os.path.basename(inputFile),
|
||||
"values": charsetValues}
|
||||
@@ -23,6 +23,8 @@
|
||||
#ifndef ICALEVENT_MAPISTORE_H
|
||||
#define ICALEVENT_MAPISTORE_H
|
||||
|
||||
#include <talloc.h>
|
||||
|
||||
#import <NGCards/iCalEvent.h>
|
||||
|
||||
@class MAPIStoreUserContext;
|
||||
@@ -34,8 +36,8 @@
|
||||
|
||||
- (void) updateFromMAPIProperties: (NSDictionary *) properties
|
||||
inUserContext: (MAPIStoreUserContext *) userContext
|
||||
withActiveUser: (SOGoUser *) activeUser;
|
||||
|
||||
withActiveUser: (SOGoUser *) activeUser
|
||||
inMemCtx: (TALLOC_CTX *) memCtx;
|
||||
@end
|
||||
|
||||
#endif /* ICALEVENT_MAPISTORE_H */
|
||||
@@ -20,7 +20,6 @@
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <talloc.h>
|
||||
#include <util/attr.h>
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
@@ -75,16 +74,17 @@
|
||||
@implementation iCalEvent (MAPIStoreProperties)
|
||||
|
||||
- (void) _setupEventRecurrence: (NSData *) mapiRecurrenceData
|
||||
inMemCtx: (TALLOC_CTX *) memCtx
|
||||
{
|
||||
struct Binary_r *blob;
|
||||
struct AppointmentRecurrencePattern *pattern;
|
||||
|
||||
blob = [mapiRecurrenceData asBinaryInMemCtx: NULL];
|
||||
pattern = get_AppointmentRecurrencePattern (blob, blob);
|
||||
blob = [mapiRecurrenceData asBinaryInMemCtx: memCtx];
|
||||
pattern = get_AppointmentRecurrencePattern (memCtx, blob);
|
||||
[(iCalCalendar *) parent
|
||||
setupRecurrenceWithMasterEntity: self
|
||||
fromRecurrencePattern: &pattern->RecurrencePattern];
|
||||
talloc_free (blob);
|
||||
//talloc_free (blob);
|
||||
}
|
||||
|
||||
- (void) _setupEventAlarmFromProperties: (NSDictionary *) properties
|
||||
@@ -134,6 +134,7 @@
|
||||
- (void) updateFromMAPIProperties: (NSDictionary *) properties
|
||||
inUserContext: (MAPIStoreUserContext *) userContext
|
||||
withActiveUser: (SOGoUser *) activeUser
|
||||
inMemCtx: (TALLOC_CTX *) memCtx
|
||||
{
|
||||
BOOL isAllDay;
|
||||
iCalDateTime *start, *end;
|
||||
@@ -328,7 +329,7 @@
|
||||
value = [properties
|
||||
objectForKey: MAPIPropertyKey (PidLidAppointmentRecur)];
|
||||
if (value)
|
||||
[self _setupEventRecurrence: value];
|
||||
[self _setupEventRecurrence: value inMemCtx: memCtx];
|
||||
|
||||
/* alarm */
|
||||
[self _setupEventAlarmFromProperties: properties];
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
Binary file not shown.
@@ -1,75 +0,0 @@
|
||||
/* config.h. Generated from config.h.in by configure. */
|
||||
/* config.h.in. Generated from configure.ac by autoheader. */
|
||||
|
||||
/* Define to 1 if you have the <ctype.h> header file. */
|
||||
#define HAVE_CTYPE_H 1
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#define HAVE_INTTYPES_H 1
|
||||
|
||||
/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
|
||||
to 0 otherwise. */
|
||||
#define HAVE_MALLOC 1
|
||||
|
||||
/* Define to 1 if you have the <memory.h> header file. */
|
||||
#define HAVE_MEMORY_H 1
|
||||
|
||||
/* Define to 1 if you have the `memset' function. */
|
||||
#define HAVE_MEMSET 1
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#define HAVE_STDINT_H 1
|
||||
|
||||
/* Define to 1 if you have the <stdio.h> header file. */
|
||||
#define HAVE_STDIO_H 1
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#define HAVE_STDLIB_H 1
|
||||
|
||||
/* Define to 1 if you have the `strchr' function. */
|
||||
#define HAVE_STRCHR 1
|
||||
|
||||
/* Define to 1 if you have the <strings.h> header file. */
|
||||
#define HAVE_STRINGS_H 1
|
||||
|
||||
/* Define to 1 if you have the <string.h> header file. */
|
||||
#define HAVE_STRING_H 1
|
||||
|
||||
/* Define to 1 if you have the `strstr' function. */
|
||||
#define HAVE_STRSTR 1
|
||||
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#define HAVE_SYS_STAT_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||
#define HAVE_SYS_TYPES_H 1
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#define HAVE_UNISTD_H 1
|
||||
|
||||
/* Name of package */
|
||||
#define PACKAGE "unrtf"
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#define PACKAGE_BUGREPORT "bug-unrtf@gnu.org"
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#define PACKAGE_NAME "unrtf"
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#define PACKAGE_STRING "unrtf 0.21.2"
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#define PACKAGE_TARNAME "unrtf"
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#define PACKAGE_VERSION "0.21.2"
|
||||
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
#define STDC_HEADERS 1
|
||||
|
||||
/* Version number of package */
|
||||
#define VERSION "0.21.2"
|
||||
|
||||
/* Define to rpl_malloc if the replacement function should be used. */
|
||||
/* #undef malloc */
|
||||
@@ -351,15 +351,12 @@ static GCSStringFormatter *stringFormatter = nil;
|
||||
- (NSString *) _selectedFields: (NSArray *) fields
|
||||
requirement: (GCSTableRequirement) requirement
|
||||
{
|
||||
NSMutableString *selectedFields;
|
||||
|
||||
selectedFields = [NSMutableString string];
|
||||
NSString *selectedFields;
|
||||
|
||||
if (requirement == bothTableRequired
|
||||
&& [fields containsObject: @"c_name"])
|
||||
[selectedFields appendString: [self _dottedFields: fields]];
|
||||
if (requirement == bothTableRequired && [fields containsObject: @"c_name"])
|
||||
selectedFields = [self _dottedFields: fields];
|
||||
else
|
||||
[selectedFields appendString: [fields componentsJoinedByString: @", "]];
|
||||
selectedFields = [fields componentsJoinedByString: @", "];
|
||||
|
||||
return selectedFields;
|
||||
}
|
||||
|
||||
@@ -40,6 +40,9 @@
|
||||
- (NSString *) createSessionsFolderWithName: (NSString *) tableName;
|
||||
- (NSDictionary *) sessionsAttributeTypes;
|
||||
|
||||
- (NSString *) updateCPathInFolderInfo: (NSString *) tableName
|
||||
withCPath2: (NSString *) c_path2;
|
||||
|
||||
@end
|
||||
|
||||
@interface EOAdaptorChannel (GCSSpecialQueries)
|
||||
|
||||
@@ -8,11 +8,12 @@ ADDITIONAL_INCLUDE_DIRS += -I. -I..
|
||||
|
||||
|
||||
# dependencies
|
||||
BASE_LIBS := $(shell gnustep-config --base-libs)
|
||||
|
||||
libGDLContentStore_LIBRARIES_DEPEND_UPON += \
|
||||
-lGDLAccess \
|
||||
-lNGExtensions -lEOControl \
|
||||
-lgnustep-base -lobjc
|
||||
$(BASE_LIBS)
|
||||
|
||||
GDLContentStore_LIBRARIES_DEPEND_UPON += \
|
||||
-framework GDLAccess \
|
||||
@@ -25,7 +26,7 @@ GCS_TOOL_LIBS += \
|
||||
-lGDLContentStore -lGDLAccess \
|
||||
-lNGExtensions -lEOControl \
|
||||
-lDOM -lSaxObjC \
|
||||
-lgnustep-base
|
||||
$(BASE_LIBS)
|
||||
else
|
||||
GCS_TOOL_LIBS += \
|
||||
-framework GDLContentStore -framework GDLAccess \
|
||||
|
||||
@@ -424,16 +424,19 @@
|
||||
}
|
||||
|
||||
static inline BOOL
|
||||
_subValuesAreVoid (NSArray *subValues)
|
||||
_subValuesAreVoid (id subValues)
|
||||
{
|
||||
BOOL result = YES;
|
||||
NSUInteger count, max;
|
||||
|
||||
result = YES;
|
||||
|
||||
max = [subValues count];
|
||||
for (count = 0; result && count < max; count++)
|
||||
result = ([[subValues objectAtIndex: count] length] == 0);
|
||||
if ([subValues isKindOfClass: [NSArray class]])
|
||||
{
|
||||
max = [subValues count];
|
||||
for (count = 0; result && count < max; count++)
|
||||
result = ([[subValues objectAtIndex: count] length] == 0);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -127,17 +127,23 @@
|
||||
|
||||
if (order)
|
||||
{
|
||||
NSMutableArray *orderedElements;
|
||||
NSMutableArray *orderedElements, *originalElements;
|
||||
NSArray *currentChildren;
|
||||
int i, c;
|
||||
|
||||
originalElements = [NSMutableArray arrayWithArray: [aGroup children]];
|
||||
orderedElements = [NSMutableArray array];
|
||||
c = [order count];
|
||||
|
||||
for (i = 0; i < c; i++)
|
||||
{
|
||||
[orderedElements addObjectsFromArray: [aGroup childrenWithTag: [order objectAtIndex: i]]];
|
||||
currentChildren = [aGroup childrenWithTag: [order objectAtIndex: i]];
|
||||
[orderedElements addObjectsFromArray: currentChildren];
|
||||
[originalElements removeObjectsInArray: currentChildren];
|
||||
}
|
||||
|
||||
// We add the remaining, unordered elements
|
||||
[orderedElements addObjectsFromArray: originalElements];
|
||||
children = [orderedElements objectEnumerator];
|
||||
}
|
||||
else
|
||||
|
||||
@@ -17,11 +17,13 @@ ADDITIONAL_INCLUDE_DIRS += \
|
||||
|
||||
# dependencies
|
||||
|
||||
BASE_LIBS := $(shell gnustep-config --base-libs)
|
||||
|
||||
libNGCards_LIBRARIES_DEPEND_UPON += \
|
||||
-lNGExtensions \
|
||||
-lEOControl \
|
||||
-lSaxObjC \
|
||||
-lgnustep-base -lobjc -lm
|
||||
$(BASE_LIBS)
|
||||
|
||||
NGCards_LIBRARIES_DEPEND_UPON += \
|
||||
-framework NGExtensions -framework EOControl \
|
||||
|
||||
@@ -155,20 +155,41 @@
|
||||
|
||||
- (NSString *) escapedForCards
|
||||
{
|
||||
NSString *string;
|
||||
NSMutableString *string;
|
||||
unsigned int len, i;
|
||||
unichar c;
|
||||
|
||||
string = [self stringByReplacingString: @"\\"
|
||||
withString: @"\\\\"];
|
||||
string = [string stringByReplacingString: @","
|
||||
withString: @"\\,"];
|
||||
// string = [string stringByReplacingString: @":"
|
||||
// withString: @"\\:"];
|
||||
string = [string stringByReplacingString: @";"
|
||||
withString: @"\\;"];
|
||||
string = [string stringByReplacingString: @"\n"
|
||||
withString: @"\\n"];
|
||||
string = [string stringByReplacingString: @"\r"
|
||||
withString: @"\\r"];
|
||||
len = [self length];
|
||||
string = [NSMutableString stringWithCapacity: len * 1.5];
|
||||
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
c = [self characterAtIndex: i];
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case '\\':
|
||||
[string appendString: @"\\\\"];
|
||||
break;
|
||||
case ',':
|
||||
[string appendString: @"\\,"];
|
||||
break;
|
||||
//case ':':
|
||||
// [string appendString: @"\\:"];
|
||||
//break;
|
||||
case ';':
|
||||
[string appendString: @"\\;"];
|
||||
break;
|
||||
case'\n':
|
||||
[string appendString: @"\\n"];
|
||||
break;
|
||||
case'\r':
|
||||
[string appendString: @"\\r"];
|
||||
break;
|
||||
default:
|
||||
[string appendFormat: @"%C", c];
|
||||
}
|
||||
}
|
||||
|
||||
return string;
|
||||
}
|
||||
|
||||
@@ -1,15 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Abidjan
|
||||
X-LIC-LOCATION:Africa/Abidjan
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:-001608
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:19120101T000000
|
||||
RDATE:19120101T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,41 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Accra
|
||||
X-LIC-LOCATION:Africa/Accra
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:-000052
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:19180101T000000
|
||||
RDATE:19180101T000000
|
||||
END:STANDARD
|
||||
BEGIN:DAYLIGHT
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0020
|
||||
TZNAME:GHST
|
||||
DTSTART:19360901T000000
|
||||
RDATE:19360901T000000
|
||||
RDATE:19370901T000000
|
||||
RDATE:19380901T000000
|
||||
RDATE:19390901T000000
|
||||
RDATE:19400901T000000
|
||||
RDATE:19410901T000000
|
||||
RDATE:19420901T000000
|
||||
END:DAYLIGHT
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0020
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:19361231T000000
|
||||
RDATE:19361231T000000
|
||||
RDATE:19371231T000000
|
||||
RDATE:19381231T000000
|
||||
RDATE:19391231T000000
|
||||
RDATE:19401231T000000
|
||||
RDATE:19411231T000000
|
||||
RDATE:19421231T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,22 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Addis_Ababa
|
||||
X-LIC-LOCATION:Africa/Addis_Ababa
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+023448
|
||||
TZOFFSETTO:+023520
|
||||
TZNAME:ADMT
|
||||
DTSTART:18700101T000000
|
||||
RDATE:18700101T000000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+023520
|
||||
TZOFFSETFROM:+0300
|
||||
TZOFFSETTO:+0300
|
||||
TZNAME:EAT
|
||||
DTSTART:19360505T000000
|
||||
RDATE:19360505T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,90 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Algiers
|
||||
X-LIC-LOCATION:Africa/Algiers
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+001212
|
||||
TZOFFSETTO:+000921
|
||||
TZNAME:PMT
|
||||
DTSTART:18910315T000100
|
||||
RDATE:18910315T000100
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+000921
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:WET
|
||||
DTSTART:19110311T000000
|
||||
RDATE:19110311T000000
|
||||
END:STANDARD
|
||||
BEGIN:DAYLIGHT
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:WEST
|
||||
DTSTART:19160614T230000
|
||||
RDATE:19160614T230000
|
||||
RDATE:19170324T230000
|
||||
RDATE:19180309T230000
|
||||
RDATE:19190301T230000
|
||||
RDATE:19200214T230000
|
||||
RDATE:19210314T230000
|
||||
RDATE:19390911T230000
|
||||
RDATE:19710425T230000
|
||||
RDATE:19770506T000000
|
||||
RDATE:19800425T000000
|
||||
END:DAYLIGHT
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:WET
|
||||
DTSTART:19161002T000000
|
||||
RDATE:19161002T000000
|
||||
RDATE:19171008T000000
|
||||
RDATE:19181007T000000
|
||||
RDATE:19191006T000000
|
||||
RDATE:19201024T000000
|
||||
RDATE:19210622T000000
|
||||
RDATE:19391119T010000
|
||||
RDATE:19461007T000000
|
||||
RDATE:19630414T000000
|
||||
RDATE:19710927T000000
|
||||
RDATE:19791026T000000
|
||||
RDATE:19801031T020000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:CET
|
||||
DTSTART:19400225T020000
|
||||
RDATE:19400225T020000
|
||||
RDATE:19560129T000000
|
||||
RDATE:19810501T000000
|
||||
END:STANDARD
|
||||
BEGIN:DAYLIGHT
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0200
|
||||
TZNAME:CEST
|
||||
DTSTART:19440403T020000
|
||||
RDATE:19440403T020000
|
||||
RDATE:19450402T020000
|
||||
RDATE:19780324T010000
|
||||
END:DAYLIGHT
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0200
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:CET
|
||||
DTSTART:19441008T020000
|
||||
RDATE:19441008T020000
|
||||
RDATE:19450916T010000
|
||||
RDATE:19780922T030000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:CET
|
||||
DTSTART:19771021T000000
|
||||
RDATE:19771021T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,29 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Asmara
|
||||
X-LIC-LOCATION:Africa/Asmara
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+023532
|
||||
TZOFFSETTO:+023532
|
||||
TZNAME:AMT
|
||||
DTSTART:18700101T000000
|
||||
RDATE:18700101T000000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+023532
|
||||
TZOFFSETTO:+023520
|
||||
TZNAME:ADMT
|
||||
DTSTART:18900101T000000
|
||||
RDATE:18900101T000000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+023520
|
||||
TZOFFSETFROM:+0300
|
||||
TZOFFSETTO:+0300
|
||||
TZNAME:EAT
|
||||
DTSTART:19360505T000000
|
||||
RDATE:19360505T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,29 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Bamako
|
||||
X-LIC-LOCATION:Africa/Bamako
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:-0032
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:19120101T000000
|
||||
RDATE:19120101T000000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:-0100
|
||||
TZNAME:WAT
|
||||
DTSTART:19340226T000000
|
||||
RDATE:19340226T000000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:-0100
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:19600620T000000
|
||||
RDATE:19600620T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,15 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Bangui
|
||||
X-LIC-LOCATION:Africa/Bangui
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+011420
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:WAT
|
||||
DTSTART:19120101T000000
|
||||
RDATE:19120101T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,29 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Banjul
|
||||
X-LIC-LOCATION:Africa/Banjul
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:-010636
|
||||
TZOFFSETTO:-010636
|
||||
TZNAME:BMT
|
||||
DTSTART:19120101T000000
|
||||
RDATE:19120101T000000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:-010636
|
||||
TZOFFSETTO:-0100
|
||||
TZNAME:WAT
|
||||
DTSTART:19350101T000000
|
||||
RDATE:19350101T000000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:-0100
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:19640101T000000
|
||||
RDATE:19640101T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,22 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Bissau
|
||||
X-LIC-LOCATION:Africa/Bissau
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:-010220
|
||||
TZOFFSETTO:-0100
|
||||
TZNAME:WAT
|
||||
DTSTART:19110526T000000
|
||||
RDATE:19110526T000000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:-0100
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:19750101T000000
|
||||
RDATE:19750101T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,15 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Blantyre
|
||||
X-LIC-LOCATION:Africa/Blantyre
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0220
|
||||
TZOFFSETFROM:+0200
|
||||
TZOFFSETTO:+0200
|
||||
TZNAME:CAT
|
||||
DTSTART:19030301T000000
|
||||
RDATE:19030301T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,15 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Brazzaville
|
||||
X-LIC-LOCATION:Africa/Brazzaville
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+010108
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:WAT
|
||||
DTSTART:19120101T000000
|
||||
RDATE:19120101T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,15 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Bujumbura
|
||||
X-LIC-LOCATION:Africa/Bujumbura
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+015728
|
||||
TZOFFSETFROM:+0200
|
||||
TZOFFSETTO:+0200
|
||||
TZNAME:CAT
|
||||
DTSTART:18900101T000000
|
||||
RDATE:18900101T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,149 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Cairo
|
||||
X-LIC-LOCATION:Africa/Cairo
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0205
|
||||
TZOFFSETTO:+0200
|
||||
TZNAME:EET
|
||||
DTSTART:19001001T000000
|
||||
RDATE:19001001T000000
|
||||
END:STANDARD
|
||||
BEGIN:DAYLIGHT
|
||||
TZOFFSETFROM:+0200
|
||||
TZOFFSETTO:+0300
|
||||
TZNAME:EEST
|
||||
DTSTART:19400715T000000
|
||||
RDATE:19400715T000000
|
||||
RDATE:19410415T000000
|
||||
RDATE:19420401T000000
|
||||
RDATE:19430401T000000
|
||||
RDATE:19440401T000000
|
||||
RDATE:19450416T000000
|
||||
RDATE:19570510T000000
|
||||
RDATE:19580501T000000
|
||||
RDATE:19590501T010000
|
||||
RDATE:19600501T010000
|
||||
RDATE:19610501T010000
|
||||
RDATE:19620501T010000
|
||||
RDATE:19630501T010000
|
||||
RDATE:19640501T010000
|
||||
RDATE:19650501T010000
|
||||
RDATE:19660501T010000
|
||||
RDATE:19670501T010000
|
||||
RDATE:19680501T010000
|
||||
RDATE:19690501T010000
|
||||
RDATE:19700501T010000
|
||||
RDATE:19710501T010000
|
||||
RDATE:19720501T010000
|
||||
RDATE:19730501T010000
|
||||
RDATE:19740501T010000
|
||||
RDATE:19750501T010000
|
||||
RDATE:19760501T010000
|
||||
RDATE:19770501T010000
|
||||
RDATE:19780501T010000
|
||||
RDATE:19790501T010000
|
||||
RDATE:19800501T010000
|
||||
RDATE:19810501T010000
|
||||
RDATE:19820725T010000
|
||||
RDATE:19830712T010000
|
||||
RDATE:19840501T010000
|
||||
RDATE:19850501T010000
|
||||
RDATE:19860501T010000
|
||||
RDATE:19870501T010000
|
||||
RDATE:19880501T010000
|
||||
RDATE:19890506T010000
|
||||
RDATE:19900501T010000
|
||||
RDATE:19910501T010000
|
||||
RDATE:19920501T010000
|
||||
RDATE:19930501T010000
|
||||
RDATE:19940501T010000
|
||||
RDATE:19950428T000000
|
||||
RDATE:19960426T000000
|
||||
RDATE:19970425T000000
|
||||
RDATE:19980424T000000
|
||||
RDATE:19990430T000000
|
||||
RDATE:20000428T000000
|
||||
RDATE:20010427T000000
|
||||
RDATE:20020426T000000
|
||||
RDATE:20030425T000000
|
||||
RDATE:20040430T000000
|
||||
RDATE:20050429T000000
|
||||
RDATE:20060428T000000
|
||||
RDATE:20070427T000000
|
||||
RDATE:20080425T000000
|
||||
RDATE:20090424T000000
|
||||
RDATE:20100430T000000
|
||||
RDATE:20100910T000000
|
||||
END:DAYLIGHT
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0300
|
||||
TZOFFSETTO:+0200
|
||||
TZNAME:EET
|
||||
DTSTART:19401001T000000
|
||||
RDATE:19401001T000000
|
||||
RDATE:19410916T000000
|
||||
RDATE:19421027T000000
|
||||
RDATE:19431101T000000
|
||||
RDATE:19441101T000000
|
||||
RDATE:19451101T000000
|
||||
RDATE:19571001T000000
|
||||
RDATE:19581001T000000
|
||||
RDATE:19590930T030000
|
||||
RDATE:19600930T030000
|
||||
RDATE:19610930T030000
|
||||
RDATE:19620930T030000
|
||||
RDATE:19630930T030000
|
||||
RDATE:19640930T030000
|
||||
RDATE:19650930T030000
|
||||
RDATE:19661001T030000
|
||||
RDATE:19671001T030000
|
||||
RDATE:19681001T030000
|
||||
RDATE:19691001T030000
|
||||
RDATE:19701001T030000
|
||||
RDATE:19711001T030000
|
||||
RDATE:19721001T030000
|
||||
RDATE:19731001T030000
|
||||
RDATE:19741001T030000
|
||||
RDATE:19751001T030000
|
||||
RDATE:19761001T030000
|
||||
RDATE:19771001T030000
|
||||
RDATE:19781001T030000
|
||||
RDATE:19791001T030000
|
||||
RDATE:19801001T030000
|
||||
RDATE:19811001T030000
|
||||
RDATE:19821001T030000
|
||||
RDATE:19831001T030000
|
||||
RDATE:19841001T030000
|
||||
RDATE:19851001T030000
|
||||
RDATE:19861001T030000
|
||||
RDATE:19871001T030000
|
||||
RDATE:19881001T030000
|
||||
RDATE:19891001T030000
|
||||
RDATE:19901001T030000
|
||||
RDATE:19911001T030000
|
||||
RDATE:19921001T030000
|
||||
RDATE:19931001T030000
|
||||
RDATE:19941001T030000
|
||||
RDATE:19950929T000000
|
||||
RDATE:19960927T000000
|
||||
RDATE:19970926T000000
|
||||
RDATE:19980925T000000
|
||||
RDATE:19991001T000000
|
||||
RDATE:20000929T000000
|
||||
RDATE:20010928T000000
|
||||
RDATE:20020927T000000
|
||||
RDATE:20030926T000000
|
||||
RDATE:20041001T000000
|
||||
RDATE:20050930T000000
|
||||
RDATE:20060922T000000
|
||||
RDATE:20070907T000000
|
||||
RDATE:20080829T000000
|
||||
RDATE:20090821T000000
|
||||
RDATE:20100811T000000
|
||||
RDATE:20101001T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,5 +1,5 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Casablanca
|
||||
@@ -8,68 +8,15 @@ BEGIN:DAYLIGHT
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:WEST
|
||||
DTSTART:20120429T020000
|
||||
DTSTART:19700426T020000
|
||||
RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=-1SU
|
||||
END:DAYLIGHT
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:WET
|
||||
DTSTART:20120930T030000
|
||||
DTSTART:19700927T030000
|
||||
RRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1SU
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:-003020
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:WET
|
||||
DTSTART:19131026T000000
|
||||
RDATE:19131026T000000
|
||||
END:STANDARD
|
||||
BEGIN:DAYLIGHT
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:WEST
|
||||
DTSTART:19390912T000000
|
||||
RDATE:19390912T000000
|
||||
RDATE:19400225T000000
|
||||
RDATE:19500611T000000
|
||||
RDATE:19670603T120000
|
||||
RDATE:19740624T000000
|
||||
RDATE:19760501T000000
|
||||
RDATE:19770501T000000
|
||||
RDATE:19780601T000000
|
||||
RDATE:20080601T000000
|
||||
RDATE:20090601T000000
|
||||
RDATE:20100502T000000
|
||||
RDATE:20110403T000000
|
||||
RDATE:20120820T020000
|
||||
END:DAYLIGHT
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:WET
|
||||
DTSTART:19391119T000000
|
||||
RDATE:19391119T000000
|
||||
RDATE:19451118T000000
|
||||
RDATE:19501029T000000
|
||||
RDATE:19671001T000000
|
||||
RDATE:19740901T000000
|
||||
RDATE:19760801T000000
|
||||
RDATE:19770928T000000
|
||||
RDATE:19780804T000000
|
||||
RDATE:19860101T000000
|
||||
RDATE:20080901T000000
|
||||
RDATE:20090821T000000
|
||||
RDATE:20100808T000000
|
||||
RDATE:20110731T000000
|
||||
RDATE:20120720T030000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:CET
|
||||
DTSTART:19840316T000000
|
||||
RDATE:19840316T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,5 +1,5 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Ceuta
|
||||
@@ -8,92 +8,15 @@ BEGIN:DAYLIGHT
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0200
|
||||
TZNAME:CEST
|
||||
DTSTART:19860330T020000
|
||||
DTSTART:19700329T020000
|
||||
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
|
||||
END:DAYLIGHT
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0200
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:CET
|
||||
DTSTART:19961027T030000
|
||||
DTSTART:19701025T030000
|
||||
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:-002116
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:WET
|
||||
DTSTART:19010101T000000
|
||||
RDATE:19010101T000000
|
||||
END:STANDARD
|
||||
BEGIN:DAYLIGHT
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:WEST
|
||||
DTSTART:19180506T230000
|
||||
RDATE:19180506T230000
|
||||
RDATE:19240416T230000
|
||||
RDATE:19260417T230000
|
||||
RDATE:19270409T230000
|
||||
RDATE:19280414T230000
|
||||
RDATE:19670603T120000
|
||||
RDATE:19740624T000000
|
||||
RDATE:19760501T000000
|
||||
RDATE:19770501T000000
|
||||
RDATE:19780601T000000
|
||||
END:DAYLIGHT
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:WET
|
||||
DTSTART:19181007T230000
|
||||
RDATE:19181007T230000
|
||||
RDATE:19241005T000000
|
||||
RDATE:19261003T000000
|
||||
RDATE:19271002T000000
|
||||
RDATE:19281007T000000
|
||||
RDATE:19671001T000000
|
||||
RDATE:19740901T000000
|
||||
RDATE:19760801T000000
|
||||
RDATE:19770928T000000
|
||||
RDATE:19780804T000000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:WET
|
||||
DTSTART:19240101T000000
|
||||
RDATE:19240101T000000
|
||||
RDATE:19290101T000000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:CET
|
||||
DTSTART:19840316T000000
|
||||
RDATE:19840316T000000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:CET
|
||||
DTSTART:19860101T000000
|
||||
RDATE:19860101T000000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0200
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:CET
|
||||
DTSTART:19860928T030000
|
||||
RDATE:19860928T030000
|
||||
RDATE:19870927T030000
|
||||
RDATE:19880925T030000
|
||||
RDATE:19890924T030000
|
||||
RDATE:19900930T030000
|
||||
RDATE:19910929T030000
|
||||
RDATE:19920927T030000
|
||||
RDATE:19930926T030000
|
||||
RDATE:19940925T030000
|
||||
RDATE:19950924T030000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,29 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Conakry
|
||||
X-LIC-LOCATION:Africa/Conakry
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:-005452
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:19120101T000000
|
||||
RDATE:19120101T000000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:-0100
|
||||
TZNAME:WAT
|
||||
DTSTART:19340226T000000
|
||||
RDATE:19340226T000000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:-0100
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:19600101T000000
|
||||
RDATE:19600101T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,22 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Dakar
|
||||
X-LIC-LOCATION:Africa/Dakar
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:-010944
|
||||
TZOFFSETTO:-0100
|
||||
TZNAME:WAT
|
||||
DTSTART:19120101T000000
|
||||
RDATE:19120101T000000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:-0100
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:19410601T000000
|
||||
RDATE:19410601T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,29 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Dar_es_Salaam
|
||||
X-LIC-LOCATION:Africa/Dar_es_Salaam
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+023708
|
||||
TZOFFSETTO:+0300
|
||||
TZNAME:EAT
|
||||
DTSTART:19310101T000000
|
||||
RDATE:19310101T000000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0300
|
||||
TZOFFSETTO:+0245
|
||||
TZNAME:BEAUT
|
||||
DTSTART:19480101T000000
|
||||
RDATE:19480101T000000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0245
|
||||
TZOFFSETTO:+0300
|
||||
TZNAME:EAT
|
||||
DTSTART:19610101T000000
|
||||
RDATE:19610101T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,15 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Djibouti
|
||||
X-LIC-LOCATION:Africa/Djibouti
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+025236
|
||||
TZOFFSETFROM:+0300
|
||||
TZOFFSETTO:+0300
|
||||
TZNAME:EAT
|
||||
DTSTART:19110701T000000
|
||||
RDATE:19110701T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,15 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Douala
|
||||
X-LIC-LOCATION:Africa/Douala
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+003848
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:WAT
|
||||
DTSTART:19120101T000000
|
||||
RDATE:19120101T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,22 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/El_Aaiun
|
||||
X-LIC-LOCATION:Africa/El_Aaiun
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:-005248
|
||||
TZOFFSETTO:-0100
|
||||
TZNAME:WAT
|
||||
DTSTART:19340101T000000
|
||||
RDATE:19340101T000000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:-0100
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:WET
|
||||
DTSTART:19760414T000000
|
||||
RDATE:19760414T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,81 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Freetown
|
||||
X-LIC-LOCATION:Africa/Freetown
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:-0053
|
||||
TZOFFSETTO:-0053
|
||||
TZNAME:FMT
|
||||
DTSTART:18820101T000000
|
||||
RDATE:18820101T000000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:-0053
|
||||
TZOFFSETTO:-0100
|
||||
TZNAME:WAT
|
||||
DTSTART:19130601T000000
|
||||
RDATE:19130601T000000
|
||||
END:STANDARD
|
||||
BEGIN:DAYLIGHT
|
||||
TZOFFSETFROM:-0100
|
||||
TZOFFSETTO:-0020
|
||||
TZNAME:SLST
|
||||
DTSTART:19350601T000000
|
||||
RDATE:19350601T000000
|
||||
RDATE:19360601T000000
|
||||
RDATE:19370601T000000
|
||||
RDATE:19380601T000000
|
||||
RDATE:19390601T000000
|
||||
RDATE:19400601T000000
|
||||
RDATE:19410601T000000
|
||||
RDATE:19420601T000000
|
||||
END:DAYLIGHT
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:-0020
|
||||
TZOFFSETTO:-0100
|
||||
TZNAME:WAT
|
||||
DTSTART:19351001T000000
|
||||
RDATE:19351001T000000
|
||||
RDATE:19361001T000000
|
||||
RDATE:19371001T000000
|
||||
RDATE:19381001T000000
|
||||
RDATE:19391001T000000
|
||||
RDATE:19401001T000000
|
||||
RDATE:19411001T000000
|
||||
RDATE:19421001T000000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:-0100
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:19570101T000000
|
||||
RDATE:19570101T000000
|
||||
END:STANDARD
|
||||
BEGIN:DAYLIGHT
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:SLST
|
||||
DTSTART:19570601T000000
|
||||
RDATE:19570601T000000
|
||||
RDATE:19580601T000000
|
||||
RDATE:19590601T000000
|
||||
RDATE:19600601T000000
|
||||
RDATE:19610601T000000
|
||||
RDATE:19620601T000000
|
||||
END:DAYLIGHT
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:19570901T000000
|
||||
RDATE:19570901T000000
|
||||
RDATE:19580901T000000
|
||||
RDATE:19590901T000000
|
||||
RDATE:19600901T000000
|
||||
RDATE:19610901T000000
|
||||
RDATE:19620901T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,29 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Gaborone
|
||||
X-LIC-LOCATION:Africa/Gaborone
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+014340
|
||||
TZOFFSETTO:+0200
|
||||
TZNAME:CAT
|
||||
DTSTART:18850101T000000
|
||||
RDATE:18850101T000000
|
||||
END:STANDARD
|
||||
BEGIN:DAYLIGHT
|
||||
TZOFFSETFROM:+0200
|
||||
TZOFFSETTO:+0300
|
||||
TZNAME:CAST
|
||||
DTSTART:19430919T020000
|
||||
RDATE:19430919T020000
|
||||
END:DAYLIGHT
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0300
|
||||
TZOFFSETTO:+0200
|
||||
TZNAME:CAT
|
||||
DTSTART:19440319T020000
|
||||
RDATE:19440319T020000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,15 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Harare
|
||||
X-LIC-LOCATION:Africa/Harare
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+020412
|
||||
TZOFFSETFROM:+0200
|
||||
TZOFFSETTO:+0200
|
||||
TZNAME:CAT
|
||||
DTSTART:19030301T000000
|
||||
RDATE:19030301T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,38 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Johannesburg
|
||||
X-LIC-LOCATION:Africa/Johannesburg
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0152
|
||||
TZOFFSETTO:+0130
|
||||
TZNAME:SAST
|
||||
DTSTART:18920208T000000
|
||||
RDATE:18920208T000000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0130
|
||||
TZOFFSETTO:+0200
|
||||
TZNAME:SAST
|
||||
DTSTART:19030301T000000
|
||||
RDATE:19030301T000000
|
||||
END:STANDARD
|
||||
BEGIN:DAYLIGHT
|
||||
TZOFFSETFROM:+0200
|
||||
TZOFFSETTO:+0300
|
||||
TZNAME:SAST
|
||||
DTSTART:19420920T020000
|
||||
RDATE:19420920T020000
|
||||
RDATE:19430919T020000
|
||||
END:DAYLIGHT
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0300
|
||||
TZOFFSETTO:+0200
|
||||
TZNAME:SAST
|
||||
DTSTART:19430321T020000
|
||||
RDATE:19430321T020000
|
||||
RDATE:19440319T020000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,66 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Juba
|
||||
X-LIC-LOCATION:Africa/Juba
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+020624
|
||||
TZOFFSETTO:+0200
|
||||
TZNAME:CAT
|
||||
DTSTART:19310101T000000
|
||||
RDATE:19310101T000000
|
||||
END:STANDARD
|
||||
BEGIN:DAYLIGHT
|
||||
TZOFFSETFROM:+0200
|
||||
TZOFFSETTO:+0300
|
||||
TZNAME:CAST
|
||||
DTSTART:19700501T000000
|
||||
RDATE:19700501T000000
|
||||
RDATE:19710430T000000
|
||||
RDATE:19720430T000000
|
||||
RDATE:19730429T000000
|
||||
RDATE:19740428T000000
|
||||
RDATE:19750427T000000
|
||||
RDATE:19760425T000000
|
||||
RDATE:19770424T000000
|
||||
RDATE:19780430T000000
|
||||
RDATE:19790429T000000
|
||||
RDATE:19800427T000000
|
||||
RDATE:19810426T000000
|
||||
RDATE:19820425T000000
|
||||
RDATE:19830424T000000
|
||||
RDATE:19840429T000000
|
||||
RDATE:19850428T000000
|
||||
END:DAYLIGHT
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0300
|
||||
TZOFFSETTO:+0200
|
||||
TZNAME:CAT
|
||||
DTSTART:19701015T000000
|
||||
RDATE:19701015T000000
|
||||
RDATE:19711015T000000
|
||||
RDATE:19721015T000000
|
||||
RDATE:19731015T000000
|
||||
RDATE:19741015T000000
|
||||
RDATE:19751015T000000
|
||||
RDATE:19761015T000000
|
||||
RDATE:19771015T000000
|
||||
RDATE:19781015T000000
|
||||
RDATE:19791015T000000
|
||||
RDATE:19801015T000000
|
||||
RDATE:19811015T000000
|
||||
RDATE:19821015T000000
|
||||
RDATE:19831015T000000
|
||||
RDATE:19841015T000000
|
||||
RDATE:19851015T000000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0200
|
||||
TZOFFSETTO:+0300
|
||||
TZNAME:EAT
|
||||
DTSTART:20000115T120000
|
||||
RDATE:20000115T120000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,36 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Kampala
|
||||
X-LIC-LOCATION:Africa/Kampala
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+020940
|
||||
TZOFFSETTO:+0300
|
||||
TZNAME:EAT
|
||||
DTSTART:19280701T000000
|
||||
RDATE:19280701T000000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0300
|
||||
TZOFFSETTO:+0230
|
||||
TZNAME:BEAT
|
||||
DTSTART:19300101T000000
|
||||
RDATE:19300101T000000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0230
|
||||
TZOFFSETTO:+0245
|
||||
TZNAME:BEAUT
|
||||
DTSTART:19480101T000000
|
||||
RDATE:19480101T000000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0245
|
||||
TZOFFSETTO:+0300
|
||||
TZNAME:EAT
|
||||
DTSTART:19570101T000000
|
||||
RDATE:19570101T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,66 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Khartoum
|
||||
X-LIC-LOCATION:Africa/Khartoum
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+021008
|
||||
TZOFFSETTO:+0200
|
||||
TZNAME:CAT
|
||||
DTSTART:19310101T000000
|
||||
RDATE:19310101T000000
|
||||
END:STANDARD
|
||||
BEGIN:DAYLIGHT
|
||||
TZOFFSETFROM:+0200
|
||||
TZOFFSETTO:+0300
|
||||
TZNAME:CAST
|
||||
DTSTART:19700501T000000
|
||||
RDATE:19700501T000000
|
||||
RDATE:19710430T000000
|
||||
RDATE:19720430T000000
|
||||
RDATE:19730429T000000
|
||||
RDATE:19740428T000000
|
||||
RDATE:19750427T000000
|
||||
RDATE:19760425T000000
|
||||
RDATE:19770424T000000
|
||||
RDATE:19780430T000000
|
||||
RDATE:19790429T000000
|
||||
RDATE:19800427T000000
|
||||
RDATE:19810426T000000
|
||||
RDATE:19820425T000000
|
||||
RDATE:19830424T000000
|
||||
RDATE:19840429T000000
|
||||
RDATE:19850428T000000
|
||||
END:DAYLIGHT
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0300
|
||||
TZOFFSETTO:+0200
|
||||
TZNAME:CAT
|
||||
DTSTART:19701015T000000
|
||||
RDATE:19701015T000000
|
||||
RDATE:19711015T000000
|
||||
RDATE:19721015T000000
|
||||
RDATE:19731015T000000
|
||||
RDATE:19741015T000000
|
||||
RDATE:19751015T000000
|
||||
RDATE:19761015T000000
|
||||
RDATE:19771015T000000
|
||||
RDATE:19781015T000000
|
||||
RDATE:19791015T000000
|
||||
RDATE:19801015T000000
|
||||
RDATE:19811015T000000
|
||||
RDATE:19821015T000000
|
||||
RDATE:19831015T000000
|
||||
RDATE:19841015T000000
|
||||
RDATE:19851015T000000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+0200
|
||||
TZOFFSETTO:+0300
|
||||
TZNAME:EAT
|
||||
DTSTART:20000115T120000
|
||||
RDATE:20000115T120000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,15 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Kigali
|
||||
X-LIC-LOCATION:Africa/Kigali
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+020016
|
||||
TZOFFSETFROM:+0200
|
||||
TZOFFSETTO:+0200
|
||||
TZNAME:CAT
|
||||
DTSTART:19350601T000000
|
||||
RDATE:19350601T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,15 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Kinshasa
|
||||
X-LIC-LOCATION:Africa/Kinshasa
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+010112
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:WAT
|
||||
DTSTART:18971109T000000
|
||||
RDATE:18971109T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,15 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Lagos
|
||||
X-LIC-LOCATION:Africa/Lagos
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+001336
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:WAT
|
||||
DTSTART:19190901T000000
|
||||
RDATE:19190901T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,15 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Libreville
|
||||
X-LIC-LOCATION:Africa/Libreville
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+003748
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:WAT
|
||||
DTSTART:19120101T000000
|
||||
RDATE:19120101T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,15 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Lome
|
||||
X-LIC-LOCATION:Africa/Lome
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+000452
|
||||
TZOFFSETFROM:+0000
|
||||
TZOFFSETTO:+0000
|
||||
TZNAME:GMT
|
||||
DTSTART:18930101T000000
|
||||
RDATE:18930101T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,22 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Luanda
|
||||
X-LIC-LOCATION:Africa/Luanda
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+005256
|
||||
TZOFFSETTO:+005204
|
||||
TZNAME:AOT
|
||||
DTSTART:18920101T000000
|
||||
RDATE:18920101T000000
|
||||
END:STANDARD
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+005204
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0100
|
||||
TZNAME:WAT
|
||||
DTSTART:19110526T000000
|
||||
RDATE:19110526T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,15 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Lubumbashi
|
||||
X-LIC-LOCATION:Africa/Lubumbashi
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+014952
|
||||
TZOFFSETFROM:+0200
|
||||
TZOFFSETTO:+0200
|
||||
TZNAME:CAT
|
||||
DTSTART:18971109T000000
|
||||
RDATE:18971109T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
@@ -1,15 +1,14 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-/Inverse inc.//NONSGML Olson 2012f//EN
|
||||
PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Lusaka
|
||||
X-LIC-LOCATION:Africa/Lusaka
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:+015308
|
||||
TZOFFSETFROM:+0200
|
||||
TZOFFSETTO:+0200
|
||||
TZNAME:CAT
|
||||
DTSTART:19030301T000000
|
||||
RDATE:19030301T000000
|
||||
DTSTART:19700101T000000
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
END:VCALENDAR
|
||||
Loaded 100 of 1210 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user