-rw-r--r-- | library/backend/vobject.cpp | 163 |
1 files changed, 91 insertions, 72 deletions
diff --git a/library/backend/vobject.cpp b/library/backend/vobject.cpp index 2c5b577..b6d17dc 100644 --- a/library/backend/vobject.cpp +++ b/library/backend/vobject.cpp | |||
@@ -47,6 +47,7 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. | |||
47 | #endif | 47 | #endif |
48 | 48 | ||
49 | #include <qtopia/private/vobject_p.h> | 49 | #include <qtopia/config.h> |
50 | #include <qtopia/private/qfiledirect_p.h> | 50 | #include "vobject_p.h" |
51 | #include "qfiledirect_p.h" | ||
51 | #include <string.h> | 52 | #include <string.h> |
52 | #include <stdio.h> | 53 | #include <stdio.h> |
@@ -63,4 +64,8 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. | |||
63 | #define VOBJECT_VALUE_OF(o) o->val.vobj | 64 | #define VOBJECT_VALUE_OF(o) o->val.vobj |
64 | 65 | ||
66 | static char vobj_cs[10]; | ||
67 | static enum { EightBit, QuotedPrintable, Base64 } vobj_enc=EightBit; | ||
68 | static const char *vobj_enc_s=0; | ||
69 | |||
65 | typedef union ValueItem { | 70 | typedef union ValueItem { |
66 | const char *strs; | 71 | const char *strs; |
@@ -87,5 +92,5 @@ struct StrItem { | |||
87 | }; | 92 | }; |
88 | 93 | ||
89 | const char** fieldedProp; | 94 | DLLEXPORT(const char**) fieldedProp; |
90 | 95 | ||
91 | 96 | ||
@@ -954,4 +959,15 @@ static void appendsOFile(OFile *fp, const char *s) | |||
954 | #endif | 959 | #endif |
955 | 960 | ||
961 | static void appendsOFileEncCs(OFile *fp) | ||
962 | { | ||
963 | if ( vobj_enc_s ) { | ||
964 | appendsOFile(fp, ";" VCEncodingProp "="); | ||
965 | appendsOFile(fp, vobj_enc_s); | ||
966 | } | ||
967 | appendsOFile(fp, ";" VCCharSetProp "="); | ||
968 | appendsOFile(fp, vobj_cs); | ||
969 | } | ||
970 | |||
971 | |||
956 | static void initOFile(OFile *fp, FILE *ofp) | 972 | static void initOFile(OFile *fp, FILE *ofp) |
957 | { | 973 | { |
@@ -1006,39 +1022,18 @@ static int writeBase64(OFile *fp, unsigned char *s, long len) | |||
1006 | } | 1022 | } |
1007 | 1023 | ||
1008 | static const char *replaceChar(unsigned char c) | 1024 | static const char *qpReplaceChar(unsigned char c) |
1009 | { | 1025 | { |
1010 | if (c == '\n') { | 1026 | if (c == '\n') { |
1011 | return "=0A=\n"; | 1027 | return "=0A=\n"; |
1012 | } else if ( | 1028 | } else if ( |
1013 | (c >= 'A' && c <= 'Z') | 1029 | // RFC 1521 |
1014 | || | 1030 | (c >= 32 && c <= 60) // Note: " " not allowed at EOL |
1015 | (c >= 'a' && c <= 'z') | ||
1016 | || | 1031 | || |
1017 | (c >= '0' && c <= '9') | 1032 | (c >= 62 && c <= 126) |
1018 | || | 1033 | ) |
1019 | (c >= '\'' && c <= ')') | ||
1020 | || | ||
1021 | (c >= '+' && c <= '-') | ||
1022 | || | ||
1023 | (c == '/') | ||
1024 | || | ||
1025 | (c == '?') | ||
1026 | || | ||
1027 | (c == ' ')) | ||
1028 | { | 1034 | { |
1029 | return 0; | 1035 | return 0; |
1030 | } | 1036 | } |
1031 | 1037 | ||
1032 | #warning "Bug-Workaround must be fixed !" | ||
1033 | // IF THIS FUNCTION RETURNES TRUE, THE DATA IS EXPORTED | ||
1034 | // AS QUOTED PRINTABLE. | ||
1035 | // BUT THE PARSER IS UNABLE TO IMPORT THIS, THEREFORE | ||
1036 | // I DECIDED TO DISABLE IT UNTIL TROLLTECH FIXES THIS BUG | ||
1037 | // SEE ALSO includesUnprintable(VObject *o) | ||
1038 | // (se) | ||
1039 | |||
1040 | return 0; | ||
1041 | |||
1042 | #if 0 | ||
1043 | static char trans[4]; | 1038 | static char trans[4]; |
1044 | trans[0] = '='; | 1039 | trans[0] = '='; |
@@ -1058,8 +1053,7 @@ static const char *replaceChar(unsigned char c) | |||
1058 | 1053 | ||
1059 | return trans; | 1054 | return trans; |
1060 | #endif | ||
1061 | } | 1055 | } |
1062 | 1056 | ||
1063 | static void writeQPString(OFile *fp, const char *s) | 1057 | static void writeEncString(OFile *fp, const char *s, bool nosemi) |
1064 | { | 1058 | { |
1065 | /* | 1059 | /* |
@@ -1080,26 +1074,38 @@ static void writeQPString(OFile *fp, const char *s) | |||
1080 | */ | 1074 | */ |
1081 | const char *p = s; | 1075 | const char *p = s; |
1076 | switch ( vobj_enc ) { | ||
1077 | case EightBit: | ||
1078 | while (*p) { | ||
1079 | if ( *p == '\n' || nosemi && ( *p == '\\' || *p == ';' ) ) | ||
1080 | appendcOFile(fp, '\\'); | ||
1081 | appendcOFile(fp, *p); | ||
1082 | p++; | ||
1083 | } | ||
1084 | break; | ||
1085 | case QuotedPrintable: | ||
1082 | while (*p) { | 1086 | while (*p) { |
1083 | const char *rep = replaceChar(*p); | 1087 | const char *rep = qpReplaceChar(*p); |
1084 | if (rep) | 1088 | if (rep) |
1085 | appendsOFile(fp, rep); | 1089 | appendsOFile(fp, rep); |
1090 | else if ( *p == ';' && nosemi ) | ||
1091 | appendsOFile(fp, "=3B"); | ||
1092 | else if ( *p == ' ' ) { | ||
1093 | if ( !p[1] || p[1] == '\n' ) // RFC 1521 | ||
1094 | appendsOFile(fp, "=20"); | ||
1086 | else | 1095 | else |
1087 | appendcOFile(fp, *p); | 1096 | appendcOFile(fp, *p); |
1097 | } else | ||
1098 | appendcOFile(fp, *p); | ||
1088 | p++; | 1099 | p++; |
1089 | } | 1100 | } |
1101 | break; | ||
1102 | case Base64: | ||
1103 | writeBase64(fp, (unsigned char*)p, strlen(p)); | ||
1104 | break; | ||
1105 | } | ||
1090 | } | 1106 | } |
1091 | 1107 | ||
1092 | static bool includesUnprintable(VObject *o) | 1108 | static bool includesUnprintable(VObject *o) |
1093 | { | 1109 | { |
1094 | |||
1095 | #if 0 | ||
1096 | |||
1097 | // IF THIS FUNCTION RETURNES TRUE, THE DATA IS EXPORTED | ||
1098 | // AS QUOTED PRINTABLE. | ||
1099 | // BUT THE PARSER IS UNABLE TO IMPORT THIS, THEREFORE | ||
1100 | // I DECIDED TO DISABLE IT UNTIL TROLLTECH FIXES THIS BUG | ||
1101 | // SEE ALSO *replaceChar(unsigned char c) | ||
1102 | // (se) | ||
1103 | |||
1104 | if (o) { | 1110 | if (o) { |
1105 | if (VALUE_TYPE(o) == VCVT_STRINGZ) { | 1111 | if (VALUE_TYPE(o) == VCVT_STRINGZ) { |
@@ -1107,5 +1113,6 @@ static bool includesUnprintable(VObject *o) | |||
1107 | if (p) { | 1113 | if (p) { |
1108 | while (*p) { | 1114 | while (*p) { |
1109 | if (replaceChar(*p)) | 1115 | if (*p==' ' && (!p[1] || p[1]=='\n') // RFC 1521: spaces at ends need quoting |
1116 | || qpReplaceChar(*p) ) | ||
1110 | return TRUE; | 1117 | return TRUE; |
1111 | p++; | 1118 | p++; |
@@ -1114,8 +1121,4 @@ static bool includesUnprintable(VObject *o) | |||
1114 | } | 1121 | } |
1115 | } | 1122 | } |
1116 | |||
1117 | #endif | ||
1118 | #warning "Bug-Workaround must be fixed !" | ||
1119 | |||
1120 | return FALSE; | 1123 | return FALSE; |
1121 | } | 1124 | } |
@@ -1123,10 +1126,10 @@ static bool includesUnprintable(VObject *o) | |||
1123 | static void writeVObject_(OFile *fp, VObject *o); | 1126 | static void writeVObject_(OFile *fp, VObject *o); |
1124 | 1127 | ||
1125 | static void writeValue(OFile *fp, VObject *o, unsigned long size) | 1128 | static void writeValue(OFile *fp, VObject *o, unsigned long size, bool nosemi) |
1126 | { | 1129 | { |
1127 | if (o == 0) return; | 1130 | if (o == 0) return; |
1128 | switch (VALUE_TYPE(o)) { | 1131 | switch (VALUE_TYPE(o)) { |
1129 | case VCVT_STRINGZ: { | 1132 | case VCVT_STRINGZ: { |
1130 | writeQPString(fp, STRINGZ_VALUE_OF(o)); | 1133 | writeEncString(fp, STRINGZ_VALUE_OF(o), nosemi); |
1131 | break; | 1134 | break; |
1132 | } | 1135 | } |
@@ -1161,16 +1164,14 @@ static void writeAttrValue(OFile *fp, VObject *o) | |||
1161 | pi = lookupPropInfo(NAME_OF(o)); | 1164 | pi = lookupPropInfo(NAME_OF(o)); |
1162 | if (pi && ((pi->flags & PD_INTERNAL) != 0)) return; | 1165 | if (pi && ((pi->flags & PD_INTERNAL) != 0)) return; |
1163 | if ( includesUnprintable(o) ) { | 1166 | if ( includesUnprintable(o) ) |
1164 | appendsOFile(fp, ";" VCEncodingProp "=" VCQuotedPrintableProp); | 1167 | appendsOFileEncCs(fp); |
1165 | appendsOFile(fp, ";" VCCharSetProp "=" "UTF-8"); | ||
1166 | } | ||
1167 | appendcOFile(fp,';'); | 1168 | appendcOFile(fp,';'); |
1168 | appendsOFile(fp,NAME_OF(o)); | 1169 | appendsOFile(fp,NAME_OF(o)); |
1169 | } | 1170 | } else { |
1170 | else | ||
1171 | appendcOFile(fp,';'); | 1171 | appendcOFile(fp,';'); |
1172 | } | ||
1172 | if (VALUE_TYPE(o)) { | 1173 | if (VALUE_TYPE(o)) { |
1173 | appendcOFile(fp,'='); | 1174 | appendcOFile(fp,'='); |
1174 | writeValue(fp,o,0); | 1175 | writeValue(fp,o,0,TRUE); |
1175 | } | 1176 | } |
1176 | } | 1177 | } |
@@ -1236,8 +1237,6 @@ static void writeProp(OFile *fp, VObject *o) | |||
1236 | } | 1237 | } |
1237 | fields = fields_; | 1238 | fields = fields_; |
1238 | if (!printable) { | 1239 | if (!printable) |
1239 | appendsOFile(fp, ";" VCEncodingProp "=" VCQuotedPrintableProp); | 1240 | appendsOFileEncCs(fp); |
1240 | appendsOFile(fp, ";" VCCharSetProp "=" "UTF-8"); | ||
1241 | } | ||
1242 | appendcOFile(fp,':'); | 1241 | appendcOFile(fp,':'); |
1243 | while (*fields) { | 1242 | while (*fields) { |
@@ -1249,5 +1248,5 @@ static void writeProp(OFile *fp, VObject *o) | |||
1249 | fields = fields_; | 1248 | fields = fields_; |
1250 | for (i=0;i<n;i++) { | 1249 | for (i=0;i<n;i++) { |
1251 | writeValue(fp,isAPropertyOf(o,*fields),0); | 1250 | writeValue(fp,isAPropertyOf(o,*fields),0,TRUE); |
1252 | fields++; | 1251 | fields++; |
1253 | if (i<(n-1)) appendcOFile(fp,';'); | 1252 | if (i<(n-1)) appendcOFile(fp,';'); |
@@ -1258,13 +1257,11 @@ static void writeProp(OFile *fp, VObject *o) | |||
1258 | 1257 | ||
1259 | if (VALUE_TYPE(o)) { | 1258 | if (VALUE_TYPE(o)) { |
1260 | if ( includesUnprintable(o) ) { | 1259 | if ( includesUnprintable(o) ) |
1261 | appendsOFile(fp, ";" VCEncodingProp "=" VCQuotedPrintableProp); | 1260 | appendsOFileEncCs(fp); |
1262 | appendsOFile(fp, ";" VCCharSetProp "=" "UTF-8"); | ||
1263 | } | ||
1264 | unsigned long size = 0; | 1261 | unsigned long size = 0; |
1265 | VObject *p = isAPropertyOf(o,VCDataSizeProp); | 1262 | VObject *p = isAPropertyOf(o,VCDataSizeProp); |
1266 | if (p) size = LONG_VALUE_OF(p); | 1263 | if (p) size = LONG_VALUE_OF(p); |
1267 | appendcOFile(fp,':'); | 1264 | appendcOFile(fp,':'); |
1268 | writeValue(fp,o,size); | 1265 | writeValue(fp,o,size,FALSE); |
1269 | } | 1266 | } |
1270 | 1267 | ||
@@ -1296,6 +1293,33 @@ static void writeVObject_(OFile *fp, VObject *o) | |||
1296 | } | 1293 | } |
1297 | 1294 | ||
1295 | static void initVObjectEncoding() | ||
1296 | { | ||
1297 | Config pimConfig( "Beam" ); | ||
1298 | pimConfig.setGroup("Send"); | ||
1299 | Config devcfg(pimConfig.readEntry("DeviceConfig"),Config::File); | ||
1300 | QString enc = "QP"; | ||
1301 | QString cs = "UTF-8"; | ||
1302 | if ( devcfg.isValid() ) { | ||
1303 | devcfg.setGroup("Send"); | ||
1304 | enc = devcfg.readEntry("Encoding","QP"); | ||
1305 | cs = devcfg.readEntry("CharSet","UTF-8"); | ||
1306 | } | ||
1307 | strncpy(vobj_cs,cs.latin1(),10); | ||
1308 | if ( enc == "QP" ) { | ||
1309 | vobj_enc = QuotedPrintable; | ||
1310 | vobj_enc_s = VCQuotedPrintableProp; | ||
1311 | } else if ( enc == "B64" ) { | ||
1312 | vobj_enc = Base64; | ||
1313 | vobj_enc_s = VCBase64Prop; | ||
1314 | } else { | ||
1315 | vobj_enc = EightBit; | ||
1316 | vobj_enc_s = 0; | ||
1317 | } | ||
1318 | } | ||
1319 | |||
1298 | void writeVObject(FILE *fp, VObject *o) | 1320 | void writeVObject(FILE *fp, VObject *o) |
1299 | { | 1321 | { |
1322 | initVObjectEncoding(); | ||
1323 | |||
1300 | OFile ofp; | 1324 | OFile ofp; |
1301 | // ##### | 1325 | // ##### |
@@ -1330,9 +1354,4 @@ DLLEXPORT(void) writeVObjectsToFile(char *fname, VObject *list) | |||
1330 | } | 1354 | } |
1331 | 1355 | ||
1332 | #ifndef __SHARP_COMP_ | ||
1333 | |||
1334 | // This function is not available in the Sharp ROM for SL 5500 ! | ||
1335 | // Therefore I have to move it into the header file.. (se) | ||
1336 | |||
1337 | DLLEXPORT(const char *) vObjectTypeInfo(VObject *o) | 1356 | DLLEXPORT(const char *) vObjectTypeInfo(VObject *o) |
1338 | { | 1357 | { |
@@ -1342,5 +1361,5 @@ DLLEXPORT(const char *) vObjectTypeInfo(VObject *o) | |||
1342 | return type; | 1361 | return type; |
1343 | } | 1362 | } |
1344 | #endif | 1363 | |
1345 | 1364 | ||
1346 | // end of source file vobject.c | 1365 | // end of source file vobject.c |