summaryrefslogtreecommitdiff
path: root/library/backend/vobject.cpp
Side-by-side diff
Diffstat (limited to 'library/backend/vobject.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--library/backend/vobject.cpp11
1 files changed, 6 insertions, 5 deletions
diff --git a/library/backend/vobject.cpp b/library/backend/vobject.cpp
index 9263c3a..592d116 100644
--- a/library/backend/vobject.cpp
+++ b/library/backend/vobject.cpp
@@ -1090,41 +1090,42 @@ static void writeEncString(OFile *fp, const char *s, bool nosemi)
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;
}
}
-static bool includesUnprintable(VObject *o)
+static bool includesUnprintable(VObject *o, bool nosemi)
{
if (o) {
if (VALUE_TYPE(o) == VCVT_STRINGZ) {
const char *p = STRINGZ_VALUE_OF(o);
if (p) {
while (*p) {
if (*p==' ' && (!p[1] || p[1]=='\n') // RFC 1521: spaces at ends need quoting
- || qpReplaceChar(*p) )
+ || qpReplaceChar(*p)
+ || *p==';' && nosemi )
return TRUE;
p++;
}
}
}
}
return FALSE;
}
static void writeVObject_(OFile *fp, VObject *o);
static void writeValue(OFile *fp, VObject *o, unsigned long size, bool nosemi)
{
if (o == 0) return;
switch (VALUE_TYPE(o)) {
case VCVT_STRINGZ: {
@@ -1148,33 +1149,33 @@ static void writeValue(OFile *fp, VObject *o, unsigned long size, bool nosemi)
writeBase64(fp,(unsigned char*)(ANY_VALUE_OF(o)),size);
break;
}
case VCVT_VOBJECT:
appendcOFile(fp,'\n');
writeVObject_(fp,VOBJECT_VALUE_OF(o));
break;
}
}
static void writeAttrValue(OFile *fp, VObject *o)
{
if (NAME_OF(o)) {
struct PreDefProp *pi;
pi = lookupPropInfo(NAME_OF(o));
if (pi && ((pi->flags & PD_INTERNAL) != 0)) return;
- if ( includesUnprintable(o) )
+ if ( includesUnprintable(o,TRUE) )
appendsOFileEncCs(fp);
appendcOFile(fp,';');
appendsOFile(fp,NAME_OF(o));
} else {
appendcOFile(fp,';');
}
if (VALUE_TYPE(o)) {
appendcOFile(fp,'=');
writeValue(fp,o,0,TRUE);
}
}
static void writeGroup(OFile *fp, VObject *o)
{
char buf1[256];
char buf2[256];
@@ -1216,58 +1217,58 @@ static void writeProp(OFile *fp, VObject *o)
if (pi) fields_ = pi->fields;
initPropIterator(&t,o);
while (moreIteration(&t)) {
const char *s;
VObject *eachProp = nextVObject(&t);
s = NAME_OF(eachProp);
if (qstricmp(VCGroupingProp,s) && !inList(fields_,s))
writeAttrValue(fp,eachProp);
}
if (fields_) {
int i = 0, n = 0;
const char** fields = fields_;
/* output prop as fields */
bool printable = TRUE;
while (*fields && printable) {
VObject *t = isAPropertyOf(o,*fields);
- if (includesUnprintable(t))
+ if (includesUnprintable(t,TRUE))
printable = FALSE;
fields++;
}
fields = fields_;
if (!printable)
appendsOFileEncCs(fp);
appendcOFile(fp,':');
while (*fields) {
VObject *t = isAPropertyOf(o,*fields);
i++;
if (t) n = i;
fields++;
}
fields = fields_;
for (i=0;i<n;i++) {
writeValue(fp,isAPropertyOf(o,*fields),0,TRUE);
fields++;
if (i<(n-1)) appendcOFile(fp,';');
}
}
}
if (VALUE_TYPE(o)) {
- if ( includesUnprintable(o) )
+ if ( includesUnprintable(o,FALSE) )
appendsOFileEncCs(fp);
unsigned long size = 0;
VObject *p = isAPropertyOf(o,VCDataSizeProp);
if (p) size = LONG_VALUE_OF(p);
appendcOFile(fp,':');
writeValue(fp,o,size,FALSE);
}
appendcOFile(fp,'\n');
}
static void writeVObject_(OFile *fp, VObject *o)
{
if (NAME_OF(o)) {
struct PreDefProp *pi;
pi = lookupPropInfo(NAME_OF(o));