summaryrefslogtreecommitdiff
path: root/library/backend/vobject.cpp
Side-by-side diff
Diffstat (limited to 'library/backend/vobject.cpp') (more/less context) (show whitespace changes)
-rw-r--r--library/backend/vobject.cpp163
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
+