-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 @@ -48,4 +48,5 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. -#include <qtopia/private/vobject_p.h> -#include <qtopia/private/qfiledirect_p.h> +#include <qtopia/config.h> +#include "vobject_p.h" +#include "qfiledirect_p.h" #include <string.h> @@ -64,2 +65,6 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. +static char vobj_cs[10]; +static enum { EightBit, QuotedPrintable, Base64 } vobj_enc=EightBit; +static const char *vobj_enc_s=0; + typedef union ValueItem { @@ -88,3 +93,3 @@ struct StrItem { -const char** fieldedProp; +DLLEXPORT(const char**) fieldedProp; @@ -955,2 +960,13 @@ static void appendsOFile(OFile *fp, const char *s) +static void appendsOFileEncCs(OFile *fp) +{ + if ( vobj_enc_s ) { + appendsOFile(fp, ";" VCEncodingProp "="); + appendsOFile(fp, vobj_enc_s); + } + appendsOFile(fp, ";" VCCharSetProp "="); + appendsOFile(fp, vobj_cs); +} + + static void initOFile(OFile *fp, FILE *ofp) @@ -1007,3 +1023,3 @@ static int writeBase64(OFile *fp, unsigned char *s, long len) -static const char *replaceChar(unsigned char c) +static const char *qpReplaceChar(unsigned char c) { @@ -1012,17 +1028,7 @@ static const char *replaceChar(unsigned char c) } else if ( - (c >= 'A' && c <= 'Z') - || - (c >= 'a' && c <= 'z') + // RFC 1521 + (c >= 32 && c <= 60) // Note: " " not allowed at EOL || - (c >= '0' && c <= '9') - || - (c >= '\'' && c <= ')') - || - (c >= '+' && c <= '-') - || - (c == '/') - || - (c == '?') - || - (c == ' ')) + (c >= 62 && c <= 126) + ) { @@ -1031,13 +1037,2 @@ static const char *replaceChar(unsigned char c) -#warning "Bug-Workaround must be fixed !" - // IF THIS FUNCTION RETURNES TRUE, THE DATA IS EXPORTED - // AS QUOTED PRINTABLE. - // BUT THE PARSER IS UNABLE TO IMPORT THIS, THEREFORE - // I DECIDED TO DISABLE IT UNTIL TROLLTECH FIXES THIS BUG - // SEE ALSO includesUnprintable(VObject *o) - // (se) - - return 0; - -#if 0 static char trans[4]; @@ -1059,6 +1054,5 @@ static const char *replaceChar(unsigned char c) return trans; -#endif } -static void writeQPString(OFile *fp, const char *s) +static void writeEncString(OFile *fp, const char *s, bool nosemi) { @@ -1081,10 +1075,32 @@ static void writeQPString(OFile *fp, const char *s) const char *p = s; + switch ( vobj_enc ) { + case EightBit: + while (*p) { + if ( *p == '\n' || nosemi && ( *p == '\\' || *p == ';' ) ) + appendcOFile(fp, '\\'); + appendcOFile(fp, *p); + p++; + } + break; + case QuotedPrintable: while (*p) { - const char *rep = replaceChar(*p); + const char *rep = qpReplaceChar(*p); if (rep) appendsOFile(fp, rep); + else if ( *p == ';' && nosemi ) + appendsOFile(fp, "=3B"); + else if ( *p == ' ' ) { + if ( !p[1] || p[1] == '\n' ) // RFC 1521 + appendsOFile(fp, "=20"); else appendcOFile(fp, *p); + } else + appendcOFile(fp, *p); p++; } + break; + case Base64: + writeBase64(fp, (unsigned char*)p, strlen(p)); + break; + } } @@ -1093,12 +1109,2 @@ static bool includesUnprintable(VObject *o) { - -#if 0 - - // IF THIS FUNCTION RETURNES TRUE, THE DATA IS EXPORTED - // AS QUOTED PRINTABLE. - // BUT THE PARSER IS UNABLE TO IMPORT THIS, THEREFORE - // I DECIDED TO DISABLE IT UNTIL TROLLTECH FIXES THIS BUG - // SEE ALSO *replaceChar(unsigned char c) - // (se) - if (o) { @@ -1108,3 +1114,4 @@ static bool includesUnprintable(VObject *o) while (*p) { - if (replaceChar(*p)) + if (*p==' ' && (!p[1] || p[1]=='\n') // RFC 1521: spaces at ends need quoting + || qpReplaceChar(*p) ) return TRUE; @@ -1115,6 +1122,2 @@ static bool includesUnprintable(VObject *o) } - -#endif -#warning "Bug-Workaround must be fixed !" - return FALSE; @@ -1124,3 +1127,3 @@ static void writeVObject_(OFile *fp, VObject *o); -static void writeValue(OFile *fp, VObject *o, unsigned long size) +static void writeValue(OFile *fp, VObject *o, unsigned long size, bool nosemi) { @@ -1129,3 +1132,3 @@ static void writeValue(OFile *fp, VObject *o, unsigned long size) case VCVT_STRINGZ: { - writeQPString(fp, STRINGZ_VALUE_OF(o)); + writeEncString(fp, STRINGZ_VALUE_OF(o), nosemi); break; @@ -1162,14 +1165,12 @@ static void writeAttrValue(OFile *fp, VObject *o) if (pi && ((pi->flags & PD_INTERNAL) != 0)) return; - if ( includesUnprintable(o) ) { - appendsOFile(fp, ";" VCEncodingProp "=" VCQuotedPrintableProp); - appendsOFile(fp, ";" VCCharSetProp "=" "UTF-8"); - } + if ( includesUnprintable(o) ) + appendsOFileEncCs(fp); appendcOFile(fp,';'); appendsOFile(fp,NAME_OF(o)); - } - else + } else { appendcOFile(fp,';'); + } if (VALUE_TYPE(o)) { appendcOFile(fp,'='); - writeValue(fp,o,0); + writeValue(fp,o,0,TRUE); } @@ -1237,6 +1238,4 @@ static void writeProp(OFile *fp, VObject *o) fields = fields_; - if (!printable) { - appendsOFile(fp, ";" VCEncodingProp "=" VCQuotedPrintableProp); - appendsOFile(fp, ";" VCCharSetProp "=" "UTF-8"); - } + if (!printable) + appendsOFileEncCs(fp); appendcOFile(fp,':'); @@ -1250,3 +1249,3 @@ static void writeProp(OFile *fp, VObject *o) for (i=0;i<n;i++) { - writeValue(fp,isAPropertyOf(o,*fields),0); + writeValue(fp,isAPropertyOf(o,*fields),0,TRUE); fields++; @@ -1259,6 +1258,4 @@ static void writeProp(OFile *fp, VObject *o) if (VALUE_TYPE(o)) { - if ( includesUnprintable(o) ) { - appendsOFile(fp, ";" VCEncodingProp "=" VCQuotedPrintableProp); - appendsOFile(fp, ";" VCCharSetProp "=" "UTF-8"); - } + if ( includesUnprintable(o) ) + appendsOFileEncCs(fp); unsigned long size = 0; @@ -1267,3 +1264,3 @@ static void writeProp(OFile *fp, VObject *o) appendcOFile(fp,':'); - writeValue(fp,o,size); + writeValue(fp,o,size,FALSE); } @@ -1297,4 +1294,31 @@ static void writeVObject_(OFile *fp, VObject *o) +static void initVObjectEncoding() +{ + Config pimConfig( "Beam" ); + pimConfig.setGroup("Send"); + Config devcfg(pimConfig.readEntry("DeviceConfig"),Config::File); + QString enc = "QP"; + QString cs = "UTF-8"; + if ( devcfg.isValid() ) { + devcfg.setGroup("Send"); + enc = devcfg.readEntry("Encoding","QP"); + cs = devcfg.readEntry("CharSet","UTF-8"); + } + strncpy(vobj_cs,cs.latin1(),10); + if ( enc == "QP" ) { + vobj_enc = QuotedPrintable; + vobj_enc_s = VCQuotedPrintableProp; + } else if ( enc == "B64" ) { + vobj_enc = Base64; + vobj_enc_s = VCBase64Prop; + } else { + vobj_enc = EightBit; + vobj_enc_s = 0; + } +} + void writeVObject(FILE *fp, VObject *o) { + initVObjectEncoding(); + OFile ofp; @@ -1331,7 +1355,2 @@ DLLEXPORT(void) writeVObjectsToFile(char *fname, VObject *list) -#ifndef __SHARP_COMP_ - -// This function is not available in the Sharp ROM for SL 5500 ! -// Therefore I have to move it into the header file.. (se) - DLLEXPORT(const char *) vObjectTypeInfo(VObject *o) @@ -1343,3 +1362,3 @@ DLLEXPORT(const char *) vObjectTypeInfo(VObject *o) } -#endif + |