-rw-r--r-- | library/backend/vcc.y | 22 | ||||
-rw-r--r-- | library/backend/vcc_yacc.cpp | 139 | ||||
-rw-r--r-- | library/backend/vobject.cpp | 273 | ||||
-rw-r--r-- | library/backend/vobject_p.h | 31 |
4 files changed, 251 insertions, 214 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 @@ -121,9 +121,9 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. //#ifdef PALMTOPCENTER
//#include <qpe/vobject_p.h>
//#else
-#include <qtopia/private/vobject_p.h> +#include "vobject_p.h"
//#endif
/**** Types, Constants ****/
@@ -722,18 +722,24 @@ static char* lexGet1Value() { int c;
lexSkipWhite();
c = lexLookahead();
lexClearToken();
- while (c != EOF && c != ';') {
+ while (c != EOF && (c != ';' || !fieldedProp)) {
if (c == '\\' ) {
int a;
lexSkipLookahead();
a = lexLookahead();
- if ( a != ';' ) {
- lexAppendc('\\');
- } else {
+ if ( a == ';' ) {
lexAppendc( ';' );
lexSkipLookahead();
+ } else if ( a == '\n' ) {
+ lexAppendc( '\n' );
+ lexSkipLookahead();
+ } else if ( a == '\\' ) {
+ lexAppendc( '\\' );
+ lexSkipLookahead();
+ } else {
+ lexAppendc('\\');
}
} else if (c == '\n') {
int a;
lexSkipLookahead();
@@ -960,8 +966,9 @@ static char* lexGetQuotedPrintable() } else {
// we have been sent buggy stuff. doesn't matter
// what we do so long as we keep going.
// should probably spit an error here
+ lexSkipLookahead();
c = lexLookahead();
continue;
}
@@ -977,8 +984,9 @@ static char* lexGetQuotedPrintable() } else {
// we have been sent buggy stuff. doesn't matter
// what we do so long as we keep going.
// should probably spit an error here
+ lexSkipLookahead();
c = lexLookahead();
continue;
}
@@ -999,9 +1007,9 @@ static int yylex() { int lexmode = LEXMODE();
if (lexmode == L_VALUES) {
int c = lexGetc();
- if (c == ';') {
+ if (c == ';' && fieldedProp) {
DBG_(("db: SEMICOLON\n"));
lexPushLookaheadc(c);
handleMoreRFC822LineBreak(c);
lexSkipLookahead();
@@ -1053,14 +1061,16 @@ static int yylex() { switch(c) {
case ':': {
/* consume all line separator(s) adjacent to each other */
/* ignoring linesep immediately after colon. */
+ /* I don't see this in the spec, and it breaks null values -- WA
c = lexLookahead();
while (strchr("\n",c)) {
lexSkipLookahead();
c = lexLookahead();
++mime_lineNum;
}
+ */
DBG_(("db: COLON\n"));
return COLON;
}
case ';':
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 @@ -157,9 +157,9 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. /*#ifdef PALMTOPCENTER
*/ /*#include <qpe/vobject_p.h>
*/ /*#else
*/ -#include <qtopia/private/vobject_p.h> +#include "vobject_p.h"
/*#endif
*/ /**** Types, Constants ****/
@@ -742,18 +742,24 @@ static char* lexGet1Value() { int c;
lexSkipWhite();
c = lexLookahead();
lexClearToken();
- while (c != EOF && c != ';') {
+ while (c != EOF && (c != ';' || !fieldedProp)) {
if (c == '\\' ) {
int a;
lexSkipLookahead();
a = lexLookahead();
- if ( a != ';' ) {
- lexAppendc('\\');
- } else {
+ if ( a == ';' ) {
lexAppendc( ';' );
lexSkipLookahead();
+ } else if ( a == '\n' ) {
+ lexAppendc( '\n' );
+ lexSkipLookahead();
+ } else if ( a == '\\' ) {
+ lexAppendc( '\\' );
+ lexSkipLookahead();
+ } else {
+ lexAppendc('\\');
}
} else if (c == '\n') {
int a;
lexSkipLookahead();
@@ -949,70 +955,81 @@ static int match_begin_end_name(int end) { return 0;
}
static char* lexGetQuotedPrintable()
- {
- int cur;
-
+{
+ int c;
+ lexSkipWhite();
+ c = lexLookahead();
lexClearToken();
- do {
- cur = lexGetc();
- switch (cur) {
- case '=': {
- int c = 0;
- int next[2];
- int i;
- for (i = 0; i < 2; i++) {
- next[i] = lexGetc();
- if (next[i] >= '0' && next[i] <= '9')
- c = c * 16 + next[i] - '0';
- else if (next[i] >= 'A' && next[i] <= 'F')
- c = c * 16 + next[i] - 'A' + 10;
- else
- break;
- }
- if (i == 0) {
- /* single '=' follow by LINESEP is continuation sign? */
- if (next[0] == '\n') {
- ++mime_lineNum;
- }
- else {
- lexPushLookaheadc('=');
- goto EndString;
- }
- }
- else if (i == 1) {
- lexPushLookaheadc(next[1]);
- lexPushLookaheadc(next[0]);
- lexAppendc('=');
- } else {
- lexAppendc(c);
- }
- break;
- } /* '=' */
- case '\n': {
- lexPushLookaheadc('\n');
- goto EndString;
- }
- case (int)EOF:
- break;
- default:
- lexAppendc(cur);
- break;
- } /* switch */
- } while (cur != (int)EOF);
-EndString:
+ while (c != EOF && c != ';') {
+ if (c == '\n') {
+ // break, leave '\n' on remaining chars.
+ break;
+ } else if (c == '=') {
+ int cur = 0;
+ int next;
+
+ lexSkipLookahead(); // skip '='
+ next = lexLookahead();
+
+ if (next == '\n') {
+ // skip and only skip the \n
+ lexSkipLookahead();
+ c = lexLookahead();
+ ++mime_lineNum; // aid in error reporting
+ continue;
+ } else if (next >= '0' && next <= '9') {
+ cur = next - '0';
+ } else if (next >= 'A' && next <= 'F') {
+ cur = next - 'A' + 10;
+ } else {
+ // we have been sent buggy stuff. doesn't matter
+ // what we do so long as we keep going.
+ // should probably spit an error here
+ lexSkipLookahead();
+ c = lexLookahead();
+ continue;
+ }
+
+ lexSkipLookahead(); // skip A-Z0-9
+ next = lexLookahead();
+
+ cur = cur * 16;
+ // this time really just expecting 0-9A-F
+ if (next >= '0' && next <= '9') {
+ cur += next - '0';
+ } else if (next >= 'A' && next <= 'F') {
+ cur += next - 'A' + 10;
+ } else {
+ // we have been sent buggy stuff. doesn't matter
+ // what we do so long as we keep going.
+ // should probably spit an error here
+ lexSkipLookahead();
+ c = lexLookahead();
+ continue;
+ }
+
+ // got a valid escaped =. append it.
+ lexSkipLookahead(); // skip second 0-9A-F
+ lexAppendc(cur);
+ } else {
+ lexSkipLookahead(); // skip whatever we just read.
+ lexAppendc(c); // and append it.
+ }
+ c = lexLookahead();
+ }
lexAppendc(0);
- return lexStr();
- } /* LexQuotedPrintable */
+ return c==EOF?0:lexStr();
+}
static int yylex() {
int lexmode = LEXMODE();
if (lexmode == L_VALUES) {
int c = lexGetc();
- if (c == ';') {
+ if (c == ';' && fieldedProp) {
DBG_(("db: SEMICOLON\n"));
lexPushLookaheadc(c);
handleMoreRFC822LineBreak(c);
lexSkipLookahead();
@@ -1064,14 +1081,16 @@ static int yylex() { switch(c) {
case ':': {
/* consume all line separator(s) adjacent to each other */
/* ignoring linesep immediately after colon. */
+ /* I don't see this in the spec, and it breaks null values -- WA
c = lexLookahead();
while (strchr("\n",c)) {
lexSkipLookahead();
c = lexLookahead();
++mime_lineNum;
}
+ */
DBG_(("db: COLON\n"));
return COLON;
}
case ';':
@@ -1216,9 +1235,9 @@ void mime_error_(char *s) mimeErrorHandler(s);
}
}
-#line 1221 "y.tab.c" +#line 1240 "y.tab.c" #define YYABORT goto yyabort #define YYREJECT goto yyabort #define YYACCEPT goto yyaccept #define YYERROR goto yyerrlab @@ -1516,9 +1535,9 @@ case 45: lexPopMode(0);
popVObject();
} break; -#line 1521 "y.tab.c" +#line 1540 "y.tab.c" } yyssp -= yym; yystate = *yyssp; yyvsp -= yym; 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 @@ -1,54 +1,55 @@ /*************************************************************************** -(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International -Business Machines Corporation and Siemens Rolm Communications Inc. - -For purposes of this license notice, the term Licensors shall mean, -collectively, Apple Computer, Inc., AT&T Corp., International -Business Machines Corporation and Siemens Rolm Communications Inc. -The term Licensor shall mean any of the Licensors. - -Subject to acceptance of the following conditions, permission is hereby -granted by Licensors without the need for written agreement and without -license or royalty fees, to use, copy, modify and distribute this -software for any purpose. - -The above copyright notice and the following four paragraphs must be -reproduced in all copies of this software and any software including -this software. - -THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE -ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR -MODIFICATIONS. - -IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT, -INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT -OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. - -EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, -INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. - -The software is provided with RESTRICTED RIGHTS. Use, duplication, or -disclosure by the government are subject to restrictions set forth in -DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. +(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International +Business Machines Corporation and Siemens Rolm Communications Inc. + +For purposes of this license notice, the term Licensors shall mean, +collectively, Apple Computer, Inc., AT&T Corp., International +Business Machines Corporation and Siemens Rolm Communications Inc. +The term Licensor shall mean any of the Licensors. + +Subject to acceptance of the following conditions, permission is hereby +granted by Licensors without the need for written agreement and without +license or royalty fees, to use, copy, modify and distribute this +software for any purpose. + +The above copyright notice and the following four paragraphs must be +reproduced in all copies of this software and any software including +this software. + +THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE +ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR +MODIFICATIONS. + +IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT, +INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT +OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. + +The software is provided with RESTRICTED RIGHTS. Use, duplication, or +disclosure by the government are subject to restrictions set forth in +DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. ***************************************************************************/ /* * src: vobject.c - * doc: vobject and APIs to construct vobject, APIs pretty print + * doc: vobject and APIs to construct vobject, APIs pretty print * vobject, and convert a vobject into its textual representation. */ #ifndef MWERKS #include <malloc.h> #endif -#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> #include <stdio.h> #include <fcntl.h> //#include <io.h> @@ -61,8 +62,12 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. #define LONG_VALUE_OF(o) o->val.l #define ANY_VALUE_OF(o) o->val.any #define VOBJECT_VALUE_OF(o) o->val.vobj +static char vobj_cs[10]; +static enum { EightBit, QuotedPrintable, Base64 } vobj_enc=EightBit; +static const char *vobj_enc_s=0; + typedef union ValueItem { const char *strs; unsigned int i; unsigned long l; @@ -85,9 +90,9 @@ struct StrItem { const char *s; unsigned int refCnt; }; -const char** fieldedProp; +DLLEXPORT(const char**) fieldedProp; /*---------------------------------------------------------------------- @@ -326,20 +331,20 @@ DLLEXPORT(VObject*) setValueWithSize(VObject *prop, void *val, unsigned int size } DLLEXPORT(void) initPropIterator(VObjectIterator *i, VObject *o) { - i->start = o->prop; + i->start = o->prop; i->next = 0; } DLLEXPORT(void) initVObjectIterator(VObjectIterator *i, VObject *o) { - i->start = o->next; + i->start = o->next; i->next = 0; } DLLEXPORT(int) moreIteration(VObjectIterator *i) -{ +{ return (i->start && (i->next==0 || i->next!=i->start)); } DLLEXPORT(VObject*) nextVObject(VObjectIterator *i) @@ -402,9 +407,9 @@ DLLEXPORT(VObject*) addGroup(VObject *o, const char *g) */ t = addProp(t,VCGroupingProp); setVObjectStringZValue(t,lookupProp_(n)); } while (n != gs); - deleteStr(gs); + deleteStr(gs); return p; } else return addProp_(o,lookupProp(g)); @@ -798,22 +803,22 @@ static struct PreDefProp propNames[] = { static struct PreDefProp* lookupPropInfo(const char* str) { /* brute force for now, could use a hash table here. */ int i; - + for (i = 0; propNames[i].name; i++) if (qstricmp(str, propNames[i].name) == 0) { return &propNames[i]; } - + return 0; } DLLEXPORT(const char*) lookupProp_(const char* str) { int i; - + for (i = 0; propNames[i].name; i++) if (qstricmp(str, propNames[i].name) == 0) { const char* s; s = propNames[i].alias?propNames[i].alias:propNames[i].name; @@ -825,9 +830,9 @@ DLLEXPORT(const char*) lookupProp_(const char* str) DLLEXPORT(const char*) lookupProp(const char* str) { int i; - + for (i = 0; propNames[i].name; i++) if (qstricmp(str, propNames[i].name) == 0) { const char *s; fieldedProp = propNames[i].fields; @@ -952,8 +957,19 @@ static void appendsOFile(OFile *fp, const char *s) } #endif +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) { fp->fp = ofp; fp->s = 0; @@ -1004,43 +1020,22 @@ static int writeBase64(OFile *fp, unsigned char *s, long len) return 1; } -static const char *replaceChar(unsigned char c) +static const char *qpReplaceChar(unsigned char c) { if (c == '\n') { return "=0A=\n"; } else if ( - (c >= 'A' && c <= 'Z') - || - (c >= 'a' && c <= 'z') - || - (c >= '0' && c <= '9') - || - (c >= '\'' && c <= ')') - || - (c >= '+' && c <= '-') - || - (c == '/') - || - (c == '?') + // RFC 1521 + (c >= 32 && c <= 60) // Note: " " not allowed at EOL || - (c == ' ')) - { + (c >= 62 && c <= 126) + ) + { return 0; } -#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]; trans[0] = '='; trans[3] = '\0'; int rem = c % 16; @@ -1056,79 +1051,87 @@ static const char *replaceChar(unsigned char c) else trans[2] = 'A' + (rem - 10); return trans; -#endif } -static void writeQPString(OFile *fp, const char *s) +static void writeEncString(OFile *fp, const char *s, bool nosemi) { /* - only A-Z, 0-9 and + only A-Z, 0-9 and "'" (ASCII code 39) "(" (ASCII code 40) ")" (ASCII code 41) "+" (ASCII code 43) "," (ASCII code 44) "-" (ASCII code 45) "/" (ASCII code 47) "?" (ASCII code 63) - + should remain un-encoded. '=' needs to be encoded as it is the escape character. ';' needs to be as it is a field separator. */ const char *p = s; - while (*p) { - const char *rep = replaceChar(*p); - if (rep) - appendsOFile(fp, rep); - else - appendcOFile(fp, *p); - p++; + 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 = 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; } } 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) { if (VALUE_TYPE(o) == VCVT_STRINGZ) { const char *p = STRINGZ_VALUE_OF(o); if (p) { while (*p) { - if (replaceChar(*p)) + if (*p==' ' && (!p[1] || p[1]=='\n') // RFC 1521: spaces at ends need quoting + || qpReplaceChar(*p) ) return TRUE; p++; } } } } - -#endif -#warning "Bug-Workaround must be fixed !" - return FALSE; } - + 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) { if (o == 0) return; switch (VALUE_TYPE(o)) { case VCVT_STRINGZ: { - writeQPString(fp, STRINGZ_VALUE_OF(o)); + writeEncString(fp, STRINGZ_VALUE_OF(o), nosemi); break; } case VCVT_UINT: { char buf[16]; @@ -1159,21 +1162,19 @@ 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) ) { - 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); + } } static void writeGroup(OFile *fp, VObject *o) { @@ -1234,12 +1235,10 @@ static void writeProp(OFile *fp, VObject *o) printable = FALSE; fields++; } fields = fields_; - if (!printable) { - appendsOFile(fp, ";" VCEncodingProp "=" VCQuotedPrintableProp); - appendsOFile(fp, ";" VCCharSetProp "=" "UTF-8"); - } + if (!printable) + appendsOFileEncCs(fp); appendcOFile(fp,':'); while (*fields) { VObject *t = isAPropertyOf(o,*fields); i++; @@ -1247,26 +1246,24 @@ static void writeProp(OFile *fp, VObject *o) fields++; } fields = fields_; for (i=0;i<n;i++) { - writeValue(fp,isAPropertyOf(o,*fields),0); + writeValue(fp,isAPropertyOf(o,*fields),0,TRUE); fields++; if (i<(n-1)) appendcOFile(fp,';'); } } } - + 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; VObject *p = isAPropertyOf(o,VCDataSizeProp); if (p) size = LONG_VALUE_OF(p); appendcOFile(fp,':'); - writeValue(fp,o,size); + writeValue(fp,o,size,FALSE); } appendcOFile(fp,'\n'); } @@ -1294,10 +1291,37 @@ 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; // ##### //_setmode(_fileno(fp), _O_BINARY); initOFile(&ofp,fp); @@ -1328,19 +1352,14 @@ DLLEXPORT(void) writeVObjectsToFile(char *fname, VObject *list) list = nextVObjectInList(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) { const char *type = vObjectName( o ); if ( strcmp( type, "TYPE" ) == 0 ) type = vObjectStringZValue( o ); return type; } -#endif + // end of source file vobject.c 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 @@ -98,13 +98,17 @@ For example: #define vCardMimeType "text/x-vCard" #define vCalendarMimeType "text/x-vCalendar" #undef DLLEXPORT + //#include <qtopia/qpeglobal.h> #include <qglobal.h> -#if defined(Q_WS_WIN) + +#if defined(QTOPIA_MAKEDLL) #define DLLEXPORT(t) __declspec(dllexport) t +#elif defined(QTOPIA_DLL) +#define DLLEXPORT(t) __declspec(dllimport) t #else -#define DLLEXPORT(t) t +#define DLLEXPORT(t) t #endif #ifndef FALSE #define FALSE 0 @@ -350,9 +354,9 @@ extern DLLEXPORT(int) vObjectValueType(VObject *o); /* if the VObject has value set by setVObjectAnyValue. */ #define VCVT_VOBJECT 5 /* if the VObject has value set by setVObjectVObjectValue. */ -extern const char** fieldedProp; +extern DLLEXPORT(const char**) fieldedProp; /*************************************************** * The methods below are implemented in vcc.c (generated from vcc.y ) ***************************************************/ @@ -367,9 +371,9 @@ to memory. However, if you are linking this code into your build directly then you may find them a more convenient API and you can go ahead and use them. If you try to use them with the DLL LIB you will get a link error. */ -extern void writeVObject(FILE *fp, VObject *o); +extern DLLEXPORT(void) writeVObject(FILE *fp, VObject *o); typedef void (*MimeErrorHandler)(char *); @@ -392,30 +396,15 @@ will get a link error. */ #if INCLUDEMFC -extern VObject* Parse_MIME_FromFile(CFile *file); +extern DLLEXPORT(VObject*) Parse_MIME_FromFile(CFile *file); #else -extern VObject* Parse_MIME_FromFile(FILE *file); +extern DLLEXPORT(VObject*) Parse_MIME_FromFile(FILE *file); #endif -#define __SHARP_COMP_ - -#ifndef __SHARP_COMP_ extern DLLEXPORT(const char *) vObjectTypeInfo(VObject *o); -#else -// This function is not available in the Sharp ROM for SL 5500 ! -// Therefore I have to move it into the header file.. (se) - -inline const char* vObjectTypeInfo(VObject *o) -{ - const char *type = vObjectName( o ); - if ( strcmp( type, "TYPE" ) == 0 ) - type = vObjectStringZValue( o ); - return type; -} -#endif #endif /* __VOBJECT_H__ */ |