summaryrefslogtreecommitdiff
path: root/library/backend
Unidiff
Diffstat (limited to 'library/backend') (more/less context) (show whitespace changes)
-rw-r--r--library/backend/vcc.y22
-rw-r--r--library/backend/vcc_yacc.cpp127
-rw-r--r--library/backend/vobject.cpp163
-rw-r--r--library/backend/vobject_p.h29
4 files changed, 189 insertions, 152 deletions
diff --git a/library/backend/vcc.y b/library/backend/vcc.y
index 6781312..94a8fea 100644
--- a/library/backend/vcc.y
+++ b/library/backend/vcc.y
@@ -124,3 +124,3 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
124//#else 124//#else
125#include <qtopia/private/vobject_p.h> 125#include "vobject_p.h"
126//#endif 126//#endif
@@ -725,3 +725,3 @@ static char* lexGet1Value() {
725 lexClearToken(); 725 lexClearToken();
726 while (c != EOF && c != ';') { 726 while (c != EOF && (c != ';' || !fieldedProp)) {
727 if (c == '\\' ) { 727 if (c == '\\' ) {
@@ -730,7 +730,13 @@ static char* lexGet1Value() {
730 a = lexLookahead(); 730 a = lexLookahead();
731 if ( a != ';' ) { 731 if ( a == ';' ) {
732 lexAppendc('\\');
733 } else {
734 lexAppendc( ';' ); 732 lexAppendc( ';' );
735 lexSkipLookahead(); 733 lexSkipLookahead();
734 } else if ( a == '\n' ) {
735 lexAppendc( '\n' );
736 lexSkipLookahead();
737 } else if ( a == '\\' ) {
738 lexAppendc( '\\' );
739 lexSkipLookahead();
740 } else {
741 lexAppendc('\\');
736 } 742 }
@@ -963,2 +969,3 @@ static char* lexGetQuotedPrintable()
963 // should probably spit an error here 969 // should probably spit an error here
970 lexSkipLookahead();
964 c = lexLookahead(); 971 c = lexLookahead();
@@ -980,2 +987,3 @@ static char* lexGetQuotedPrintable()
980 // should probably spit an error here 987 // should probably spit an error here
988 lexSkipLookahead();
981 c = lexLookahead(); 989 c = lexLookahead();
@@ -1002,3 +1010,3 @@ static int yylex() {
1002 int c = lexGetc(); 1010 int c = lexGetc();
1003 if (c == ';') { 1011 if (c == ';' && fieldedProp) {
1004 DBG_(("db: SEMICOLON\n")); 1012 DBG_(("db: SEMICOLON\n"));
@@ -1056,2 +1064,3 @@ static int yylex() {
1056 /* ignoring linesep immediately after colon. */ 1064 /* ignoring linesep immediately after colon. */
1065 /* I don't see this in the spec, and it breaks null values -- WA
1057 c = lexLookahead(); 1066 c = lexLookahead();
@@ -1062,2 +1071,3 @@ static int yylex() {
1062 } 1071 }
1072 */
1063 DBG_(("db: COLON\n")); 1073 DBG_(("db: COLON\n"));
diff --git a/library/backend/vcc_yacc.cpp b/library/backend/vcc_yacc.cpp
index b2b0c14..5649522 100644
--- a/library/backend/vcc_yacc.cpp
+++ b/library/backend/vcc_yacc.cpp
@@ -160,3 +160,3 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
160/*#else */ 160/*#else */
161#include <qtopia/private/vobject_p.h> 161#include "vobject_p.h"
162/*#endif */ 162/*#endif */
@@ -745,3 +745,3 @@ static char* lexGet1Value() {
745 lexClearToken(); 745 lexClearToken();
746 while (c != EOF && c != ';') { 746 while (c != EOF && (c != ';' || !fieldedProp)) {
747 if (c == '\\' ) { 747 if (c == '\\' ) {
@@ -750,7 +750,13 @@ static char* lexGet1Value() {
750 a = lexLookahead(); 750 a = lexLookahead();
751 if ( a != ';' ) { 751 if ( a == ';' ) {
752 lexAppendc('\\');
753 } else {
754 lexAppendc( ';' ); 752 lexAppendc( ';' );
755 lexSkipLookahead(); 753 lexSkipLookahead();
754 } else if ( a == '\n' ) {
755 lexAppendc( '\n' );
756 lexSkipLookahead();
757 } else if ( a == '\\' ) {
758 lexAppendc( '\\' );
759 lexSkipLookahead();
760 } else {
761 lexAppendc('\\');
756 } 762 }
@@ -953,56 +959,67 @@ static char* lexGetQuotedPrintable()
953 { 959 {
954 int cur; 960 int c;
955 961 lexSkipWhite();
962 c = lexLookahead();
956 lexClearToken(); 963 lexClearToken();
957 do { 964
958 cur = lexGetc(); 965 while (c != EOF && c != ';') {
959 switch (cur) { 966 if (c == '\n') {
960 case '=': { 967 // break, leave '\n' on remaining chars.
961 int c = 0;
962 int next[2];
963 int i;
964 for (i = 0; i < 2; i++) {
965 next[i] = lexGetc();
966 if (next[i] >= '0' && next[i] <= '9')
967 c = c * 16 + next[i] - '0';
968 else if (next[i] >= 'A' && next[i] <= 'F')
969 c = c * 16 + next[i] - 'A' + 10;
970 else
971 break; 968 break;
969 } else if (c == '=') {
970 int cur = 0;
971 int next;
972
973 lexSkipLookahead(); // skip '='
974 next = lexLookahead();
975
976 if (next == '\n') {
977 // skip and only skip the \n
978 lexSkipLookahead();
979 c = lexLookahead();
980 ++mime_lineNum; // aid in error reporting
981 continue;
982 } else if (next >= '0' && next <= '9') {
983 cur = next - '0';
984 } else if (next >= 'A' && next <= 'F') {
985 cur = next - 'A' + 10;
986 } else {
987 // we have been sent buggy stuff. doesn't matter
988 // what we do so long as we keep going.
989 // should probably spit an error here
990 lexSkipLookahead();
991 c = lexLookahead();
992 continue;
972 } 993 }
973 if (i == 0) { 994
974 /* single '=' follow by LINESEP is continuation sign? */ 995 lexSkipLookahead(); // skip A-Z0-9
975 if (next[0] == '\n') { 996 next = lexLookahead();
976 ++mime_lineNum; 997
977 } 998 cur = cur * 16;
978 else { 999 // this time really just expecting 0-9A-F
979 lexPushLookaheadc('='); 1000 if (next >= '0' && next <= '9') {
980 goto EndString; 1001 cur += next - '0';
981 } 1002 } else if (next >= 'A' && next <= 'F') {
1003 cur += next - 'A' + 10;
1004 } else {
1005 // we have been sent buggy stuff. doesn't matter
1006 // what we do so long as we keep going.
1007 // should probably spit an error here
1008 lexSkipLookahead();
1009 c = lexLookahead();
1010 continue;
982 } 1011 }
983 else if (i == 1) { 1012
984 lexPushLookaheadc(next[1]); 1013 // got a valid escaped =. append it.
985 lexPushLookaheadc(next[0]); 1014 lexSkipLookahead(); // skip second 0-9A-F
986 lexAppendc('='); 1015 lexAppendc(cur);
987 } else { 1016 } else {
988 lexAppendc(c); 1017 lexSkipLookahead(); // skip whatever we just read.
1018 lexAppendc(c); // and append it.
989 } 1019 }
990 break; 1020 c = lexLookahead();
991 } /* '=' */
992 case '\n': {
993 lexPushLookaheadc('\n');
994 goto EndString;
995 } 1021 }
996 case (int)EOF:
997 break;
998 default:
999 lexAppendc(cur);
1000 break;
1001 } /* switch */
1002 } while (cur != (int)EOF);
1003
1004EndString:
1005 lexAppendc(0); 1022 lexAppendc(0);
1006 return lexStr(); 1023 return c==EOF?0:lexStr();
1007 } /* LexQuotedPrintable */ 1024}
1008 1025
@@ -1013,3 +1030,3 @@ static int yylex() {
1013 int c = lexGetc(); 1030 int c = lexGetc();
1014 if (c == ';') { 1031 if (c == ';' && fieldedProp) {
1015 DBG_(("db: SEMICOLON\n")); 1032 DBG_(("db: SEMICOLON\n"));
@@ -1067,2 +1084,3 @@ static int yylex() {
1067 /* ignoring linesep immediately after colon. */ 1084 /* ignoring linesep immediately after colon. */
1085 /* I don't see this in the spec, and it breaks null values -- WA
1068 c = lexLookahead(); 1086 c = lexLookahead();
@@ -1073,2 +1091,3 @@ static int yylex() {
1073 } 1091 }
1092 */
1074 DBG_(("db: COLON\n")); 1093 DBG_(("db: COLON\n"));
@@ -1219,3 +1238,3 @@ void mime_error_(char *s)
1219 1238
1220#line 1221 "y.tab.c" 1239#line 1240 "y.tab.c"
1221#define YYABORT goto yyabort 1240#define YYABORT goto yyabort
@@ -1519,3 +1538,3 @@ case 45:
1519break; 1538break;
1520#line 1521 "y.tab.c" 1539#line 1540 "y.tab.c"
1521 } 1540 }
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
@@ -48,4 +48,5 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
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>
@@ -64,2 +65,6 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
64 65
66static char vobj_cs[10];
67static enum { EightBit, QuotedPrintable, Base64 } vobj_enc=EightBit;
68static const char *vobj_enc_s=0;
69
65typedef union ValueItem { 70typedef union ValueItem {
@@ -88,3 +93,3 @@ struct StrItem {
88 93
89const char** fieldedProp; 94DLLEXPORT(const char**) fieldedProp;
90 95
@@ -955,2 +960,13 @@ static void appendsOFile(OFile *fp, const char *s)
955 960
961static 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
956static void initOFile(OFile *fp, FILE *ofp) 972static void initOFile(OFile *fp, FILE *ofp)
@@ -1007,3 +1023,3 @@ static int writeBase64(OFile *fp, unsigned char *s, long len)
1007 1023
1008static const char *replaceChar(unsigned char c) 1024static const char *qpReplaceChar(unsigned char c)
1009{ 1025{
@@ -1012,17 +1028,7 @@ static const char *replaceChar(unsigned char c)
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 {
@@ -1031,13 +1037,2 @@ static const char *replaceChar(unsigned char c)
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];
@@ -1059,6 +1054,5 @@ static const char *replaceChar(unsigned char c)
1059 return trans; 1054 return trans;
1060#endif
1061} 1055}
1062 1056
1063static void writeQPString(OFile *fp, const char *s) 1057static void writeEncString(OFile *fp, const char *s, bool nosemi)
1064{ 1058{
@@ -1081,10 +1075,32 @@ static void writeQPString(OFile *fp, const char *s)
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}
@@ -1093,12 +1109,2 @@ 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) {
@@ -1108,3 +1114,4 @@ static bool includesUnprintable(VObject *o)
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;
@@ -1115,6 +1122,2 @@ static bool includesUnprintable(VObject *o)
1115 } 1122 }
1116
1117#endif
1118#warning "Bug-Workaround must be fixed !"
1119
1120 return FALSE; 1123 return FALSE;
@@ -1124,3 +1127,3 @@ static void writeVObject_(OFile *fp, VObject *o);
1124 1127
1125static void writeValue(OFile *fp, VObject *o, unsigned long size) 1128static void writeValue(OFile *fp, VObject *o, unsigned long size, bool nosemi)
1126{ 1129{
@@ -1129,3 +1132,3 @@ static void writeValue(OFile *fp, VObject *o, unsigned long size)
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;
@@ -1162,14 +1165,12 @@ static void writeAttrValue(OFile *fp, VObject *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 }
@@ -1237,6 +1238,4 @@ static void writeProp(OFile *fp, VObject *o)
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,':');
@@ -1250,3 +1249,3 @@ static void writeProp(OFile *fp, VObject *o)
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++;
@@ -1259,6 +1258,4 @@ static void writeProp(OFile *fp, VObject *o)
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;
@@ -1267,3 +1264,3 @@ static void writeProp(OFile *fp, VObject *o)
1267 appendcOFile(fp,':'); 1264 appendcOFile(fp,':');
1268 writeValue(fp,o,size); 1265 writeValue(fp,o,size,FALSE);
1269 } 1266 }
@@ -1297,4 +1294,31 @@ static void writeVObject_(OFile *fp, VObject *o)
1297 1294
1295static 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
1298void writeVObject(FILE *fp, VObject *o) 1320void writeVObject(FILE *fp, VObject *o)
1299{ 1321{
1322 initVObjectEncoding();
1323
1300 OFile ofp; 1324 OFile ofp;
@@ -1331,7 +1355,2 @@ DLLEXPORT(void) writeVObjectsToFile(char *fname, VObject *list)
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
1337DLLEXPORT(const char *) vObjectTypeInfo(VObject *o) 1356DLLEXPORT(const char *) vObjectTypeInfo(VObject *o)
@@ -1343,3 +1362,3 @@ DLLEXPORT(const char *) vObjectTypeInfo(VObject *o)
1343} 1362}
1344#endif 1363
1345 1364
diff --git a/library/backend/vobject_p.h b/library/backend/vobject_p.h
index bab22bb..f969898 100644
--- a/library/backend/vobject_p.h
+++ b/library/backend/vobject_p.h
@@ -101,5 +101,9 @@ For example:
101#undef DLLEXPORT 101#undef DLLEXPORT
102 //#include <qtopia/qpeglobal.h>
102#include <qglobal.h> 103#include <qglobal.h>
103#if defined(Q_WS_WIN) 104
105#if defined(QTOPIA_MAKEDLL)
104#define DLLEXPORT(t) __declspec(dllexport) t 106#define DLLEXPORT(t) __declspec(dllexport) t
107#elif defined(QTOPIA_DLL)
108#define DLLEXPORT(t) __declspec(dllimport) t
105#else 109#else
@@ -353,3 +357,3 @@ extern DLLEXPORT(int) vObjectValueType(VObject *o);
353 357
354extern const char** fieldedProp; 358extern DLLEXPORT(const char**) fieldedProp;
355 359
@@ -370,3 +374,3 @@ the DLL LIB you will get a link error.
370*/ 374*/
371extern void writeVObject(FILE *fp, VObject *o); 375extern DLLEXPORT(void) writeVObject(FILE *fp, VObject *o);
372 376
@@ -395,24 +399,9 @@ will get a link error.
395#if INCLUDEMFC 399#if INCLUDEMFC
396extern VObject* Parse_MIME_FromFile(CFile *file); 400extern DLLEXPORT(VObject*) Parse_MIME_FromFile(CFile *file);
397#else 401#else
398extern VObject* Parse_MIME_FromFile(FILE *file); 402extern DLLEXPORT(VObject*) Parse_MIME_FromFile(FILE *file);
399#endif 403#endif
400 404
401#define __SHARP_COMP_
402
403#ifndef __SHARP_COMP_
404extern DLLEXPORT(const char *) vObjectTypeInfo(VObject *o); 405extern DLLEXPORT(const char *) vObjectTypeInfo(VObject *o);
405 406
406#else
407// This function is not available in the Sharp ROM for SL 5500 !
408// Therefore I have to move it into the header file.. (se)
409
410inline const char* vObjectTypeInfo(VObject *o)
411{
412 const char *type = vObjectName( o );
413 if ( strcmp( type, "TYPE" ) == 0 )
414 type = vObjectStringZValue( o );
415 return type;
416}
417#endif
418 407