summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--library/backend/vcc.y22
-rw-r--r--library/backend/vcc_yacc.cpp139
-rw-r--r--library/backend/vobject.cpp273
-rw-r--r--library/backend/vobject_p.h31
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
@@ -119,13 +119,13 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
119#include <stdlib.h> 119#include <stdlib.h>
120#include <ctype.h> 120#include <ctype.h>
121 121
122//#ifdef PALMTOPCENTER 122//#ifdef PALMTOPCENTER
123//#include <qpe/vobject_p.h> 123//#include <qpe/vobject_p.h>
124//#else 124//#else
125#include <qtopia/private/vobject_p.h> 125#include "vobject_p.h"
126//#endif 126//#endif
127 127
128/**** Types, Constants ****/ 128/**** Types, Constants ****/
129 129
130 #define YYDEBUG 0/* 1 to compile in some debugging code */ 130 #define YYDEBUG 0/* 1 to compile in some debugging code */
131 #define MAXTOKEN 256/* maximum token (line) length */ 131 #define MAXTOKEN 256/* maximum token (line) length */
@@ -720,22 +720,28 @@ static void handleMoreRFC822LineBreak(int c) {
720 720
721static char* lexGet1Value() { 721static char* lexGet1Value() {
722 int c; 722 int c;
723 lexSkipWhite(); 723 lexSkipWhite();
724 c = lexLookahead(); 724 c = lexLookahead();
725 lexClearToken(); 725 lexClearToken();
726 while (c != EOF && c != ';') { 726 while (c != EOF && (c != ';' || !fieldedProp)) {
727 if (c == '\\' ) { 727 if (c == '\\' ) {
728 int a; 728 int a;
729 lexSkipLookahead(); 729 lexSkipLookahead();
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 }
737 } else if (c == '\n') { 743 } else if (c == '\n') {
738 int a; 744 int a;
739 lexSkipLookahead(); 745 lexSkipLookahead();
740 a = lexLookahead(); 746 a = lexLookahead();
741 if (a == ' ' || a == '\t') { 747 if (a == ' ' || a == '\t') {
@@ -958,12 +964,13 @@ static char* lexGetQuotedPrintable()
958 } else if (next >= 'A' && next <= 'F') { 964 } else if (next >= 'A' && next <= 'F') {
959 cur = next - 'A' + 10; 965 cur = next - 'A' + 10;
960 } else { 966 } else {
961 // we have been sent buggy stuff. doesn't matter 967 // we have been sent buggy stuff. doesn't matter
962 // what we do so long as we keep going. 968 // what we do so long as we keep going.
963 // should probably spit an error here 969 // should probably spit an error here
970 lexSkipLookahead();
964 c = lexLookahead(); 971 c = lexLookahead();
965 continue; 972 continue;
966 } 973 }
967 974
968 lexSkipLookahead(); // skip A-Z0-9 975 lexSkipLookahead(); // skip A-Z0-9
969 next = lexLookahead(); 976 next = lexLookahead();
@@ -975,12 +982,13 @@ static char* lexGetQuotedPrintable()
975 } else if (next >= 'A' && next <= 'F') { 982 } else if (next >= 'A' && next <= 'F') {
976 cur += next - 'A' + 10; 983 cur += next - 'A' + 10;
977 } else { 984 } else {
978 // we have been sent buggy stuff. doesn't matter 985 // we have been sent buggy stuff. doesn't matter
979 // what we do so long as we keep going. 986 // what we do so long as we keep going.
980 // should probably spit an error here 987 // should probably spit an error here
988 lexSkipLookahead();
981 c = lexLookahead(); 989 c = lexLookahead();
982 continue; 990 continue;
983 } 991 }
984 992
985 // got a valid escaped =. append it. 993 // got a valid escaped =. append it.
986 lexSkipLookahead(); // skip second 0-9A-F 994 lexSkipLookahead(); // skip second 0-9A-F
@@ -997,13 +1005,13 @@ static char* lexGetQuotedPrintable()
997 1005
998static int yylex() { 1006static int yylex() {
999 1007
1000 int lexmode = LEXMODE(); 1008 int lexmode = LEXMODE();
1001 if (lexmode == L_VALUES) { 1009 if (lexmode == L_VALUES) {
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"));
1005 lexPushLookaheadc(c); 1013 lexPushLookaheadc(c);
1006 handleMoreRFC822LineBreak(c); 1014 handleMoreRFC822LineBreak(c);
1007 lexSkipLookahead(); 1015 lexSkipLookahead();
1008 return SEMICOLON; 1016 return SEMICOLON;
1009 } 1017 }
@@ -1051,18 +1059,20 @@ static int yylex() {
1051 while (1) { 1059 while (1) {
1052 int c = lexGetc(); 1060 int c = lexGetc();
1053 switch(c) { 1061 switch(c) {
1054 case ':': { 1062 case ':': {
1055 /* consume all line separator(s) adjacent to each other */ 1063 /* consume all line separator(s) adjacent to each other */
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();
1058 while (strchr("\n",c)) { 1067 while (strchr("\n",c)) {
1059 lexSkipLookahead(); 1068 lexSkipLookahead();
1060 c = lexLookahead(); 1069 c = lexLookahead();
1061 ++mime_lineNum; 1070 ++mime_lineNum;
1062 } 1071 }
1072 */
1063 DBG_(("db: COLON\n")); 1073 DBG_(("db: COLON\n"));
1064 return COLON; 1074 return COLON;
1065 } 1075 }
1066 case ';': 1076 case ';':
1067 DBG_(("db: SEMICOLON\n")); 1077 DBG_(("db: SEMICOLON\n"));
1068 return SEMICOLON; 1078 return SEMICOLON;
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
@@ -155,13 +155,13 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
155#include <stdlib.h> 155#include <stdlib.h>
156#include <ctype.h> 156#include <ctype.h>
157 157
158/*#ifdef PALMTOPCENTER */ 158/*#ifdef PALMTOPCENTER */
159/*#include <qpe/vobject_p.h> */ 159/*#include <qpe/vobject_p.h> */
160/*#else */ 160/*#else */
161#include <qtopia/private/vobject_p.h> 161#include "vobject_p.h"
162/*#endif */ 162/*#endif */
163 163
164/**** Types, Constants ****/ 164/**** Types, Constants ****/
165 165
166 #define YYDEBUG 0/* 1 to compile in some debugging code */ 166 #define YYDEBUG 0/* 1 to compile in some debugging code */
167 #define MAXTOKEN 256/* maximum token (line) length */ 167 #define MAXTOKEN 256/* maximum token (line) length */
@@ -740,22 +740,28 @@ static void handleMoreRFC822LineBreak(int c) {
740 740
741static char* lexGet1Value() { 741static char* lexGet1Value() {
742 int c; 742 int c;
743 lexSkipWhite(); 743 lexSkipWhite();
744 c = lexLookahead(); 744 c = lexLookahead();
745 lexClearToken(); 745 lexClearToken();
746 while (c != EOF && c != ';') { 746 while (c != EOF && (c != ';' || !fieldedProp)) {
747 if (c == '\\' ) { 747 if (c == '\\' ) {
748 int a; 748 int a;
749 lexSkipLookahead(); 749 lexSkipLookahead();
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 }
757 } else if (c == '\n') { 763 } else if (c == '\n') {
758 int a; 764 int a;
759 lexSkipLookahead(); 765 lexSkipLookahead();
760 a = lexLookahead(); 766 a = lexLookahead();
761 if (a == ' ' || a == '\t') { 767 if (a == ' ' || a == '\t') {
@@ -947,74 +953,85 @@ static int match_begin_end_name(int end) {
947 return token; 953 return token;
948 } 954 }
949 return 0; 955 return 0;
950 } 956 }
951 957
952static char* lexGetQuotedPrintable() 958static char* lexGetQuotedPrintable()
953 { 959{
954 int cur; 960 int c;
955 961 lexSkipWhite();
962 c = lexLookahead();
956 lexClearToken(); 963 lexClearToken();
957 do {
958 cur = lexGetc();
959 switch (cur) {
960 case '=': {
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;
972 }
973 if (i == 0) {
974 /* single '=' follow by LINESEP is continuation sign? */
975 if (next[0] == '\n') {
976 ++mime_lineNum;
977 }
978 else {
979 lexPushLookaheadc('=');
980 goto EndString;
981 }
982 }
983 else if (i == 1) {
984 lexPushLookaheadc(next[1]);
985 lexPushLookaheadc(next[0]);
986 lexAppendc('=');
987 } else {
988 lexAppendc(c);
989 }
990 break;
991 } /* '=' */
992 case '\n': {
993 lexPushLookaheadc('\n');
994 goto EndString;
995 }
996 case (int)EOF:
997 break;
998 default:
999 lexAppendc(cur);
1000 break;
1001 } /* switch */
1002 } while (cur != (int)EOF);
1003 964
1004EndString: 965 while (c != EOF && c != ';') {
966 if (c == '\n') {
967 // break, leave '\n' on remaining chars.
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;
993 }
994
995 lexSkipLookahead(); // skip A-Z0-9
996 next = lexLookahead();
997
998 cur = cur * 16;
999 // this time really just expecting 0-9A-F
1000 if (next >= '0' && next <= '9') {
1001 cur += next - '0';
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;
1011 }
1012
1013 // got a valid escaped =. append it.
1014 lexSkipLookahead(); // skip second 0-9A-F
1015 lexAppendc(cur);
1016 } else {
1017 lexSkipLookahead(); // skip whatever we just read.
1018 lexAppendc(c); // and append it.
1019 }
1020 c = lexLookahead();
1021 }
1005 lexAppendc(0); 1022 lexAppendc(0);
1006 return lexStr(); 1023 return c==EOF?0:lexStr();
1007 } /* LexQuotedPrintable */ 1024}
1008 1025
1009static int yylex() { 1026static int yylex() {
1010 1027
1011 int lexmode = LEXMODE(); 1028 int lexmode = LEXMODE();
1012 if (lexmode == L_VALUES) { 1029 if (lexmode == L_VALUES) {
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"));
1016 lexPushLookaheadc(c); 1033 lexPushLookaheadc(c);
1017 handleMoreRFC822LineBreak(c); 1034 handleMoreRFC822LineBreak(c);
1018 lexSkipLookahead(); 1035 lexSkipLookahead();
1019 return SEMICOLON; 1036 return SEMICOLON;
1020 } 1037 }
@@ -1062,18 +1079,20 @@ static int yylex() {
1062 while (1) { 1079 while (1) {
1063 int c = lexGetc(); 1080 int c = lexGetc();
1064 switch(c) { 1081 switch(c) {
1065 case ':': { 1082 case ':': {
1066 /* consume all line separator(s) adjacent to each other */ 1083 /* consume all line separator(s) adjacent to each other */
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();
1069 while (strchr("\n",c)) { 1087 while (strchr("\n",c)) {
1070 lexSkipLookahead(); 1088 lexSkipLookahead();
1071 c = lexLookahead(); 1089 c = lexLookahead();
1072 ++mime_lineNum; 1090 ++mime_lineNum;
1073 } 1091 }
1092 */
1074 DBG_(("db: COLON\n")); 1093 DBG_(("db: COLON\n"));
1075 return COLON; 1094 return COLON;
1076 } 1095 }
1077 case ';': 1096 case ';':
1078 DBG_(("db: SEMICOLON\n")); 1097 DBG_(("db: SEMICOLON\n"));
1079 return SEMICOLON; 1098 return SEMICOLON;
@@ -1214,13 +1233,13 @@ void mime_error_(char *s)
1214 { 1233 {
1215 if (mimeErrorHandler) { 1234 if (mimeErrorHandler) {
1216 mimeErrorHandler(s); 1235 mimeErrorHandler(s);
1217 } 1236 }
1218 } 1237 }
1219 1238
1220#line 1221 "y.tab.c" 1239#line 1240 "y.tab.c"
1221#define YYABORT goto yyabort 1240#define YYABORT goto yyabort
1222#define YYREJECT goto yyabort 1241#define YYREJECT goto yyabort
1223#define YYACCEPT goto yyaccept 1242#define YYACCEPT goto yyaccept
1224#define YYERROR goto yyerrlab 1243#define YYERROR goto yyerrlab
1225int 1244int
1226#if defined(__STDC__) 1245#if defined(__STDC__)
@@ -1514,13 +1533,13 @@ case 45:
1514#line 376 "backend/vcc.y" 1533#line 376 "backend/vcc.y"
1515{ 1534{
1516 lexPopMode(0); 1535 lexPopMode(0);
1517 popVObject(); 1536 popVObject();
1518 } 1537 }
1519break; 1538break;
1520#line 1521 "y.tab.c" 1539#line 1540 "y.tab.c"
1521 } 1540 }
1522 yyssp -= yym; 1541 yyssp -= yym;
1523 yystate = *yyssp; 1542 yystate = *yyssp;
1524 yyvsp -= yym; 1543 yyvsp -= yym;
1525 yym = yylhs[yyn]; 1544 yym = yylhs[yyn];
1526 if (yystate == 0 && yym == 0) 1545 if (yystate == 0 && yym == 0)
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,56 +1,57 @@
1/*************************************************************************** 1/***************************************************************************
2(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International 2(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International
3Business Machines Corporation and Siemens Rolm Communications Inc. 3Business Machines Corporation and Siemens Rolm Communications Inc.
4 4
5For purposes of this license notice, the term Licensors shall mean, 5For purposes of this license notice, the term Licensors shall mean,
6collectively, Apple Computer, Inc., AT&T Corp., International 6collectively, Apple Computer, Inc., AT&T Corp., International
7Business Machines Corporation and Siemens Rolm Communications Inc. 7Business Machines Corporation and Siemens Rolm Communications Inc.
8The term Licensor shall mean any of the Licensors. 8The term Licensor shall mean any of the Licensors.
9 9
10Subject to acceptance of the following conditions, permission is hereby 10Subject to acceptance of the following conditions, permission is hereby
11granted by Licensors without the need for written agreement and without 11granted by Licensors without the need for written agreement and without
12license or royalty fees, to use, copy, modify and distribute this 12license or royalty fees, to use, copy, modify and distribute this
13software for any purpose. 13software for any purpose.
14 14
15The above copyright notice and the following four paragraphs must be 15The above copyright notice and the following four paragraphs must be
16reproduced in all copies of this software and any software including 16reproduced in all copies of this software and any software including
17this software. 17this software.
18 18
19THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE 19THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE
20ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR 20ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR
21MODIFICATIONS. 21MODIFICATIONS.
22 22
23IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT, 23IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT,
24INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT 24INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
25OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 25OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
26DAMAGE. 26DAMAGE.
27 27
28EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, 28EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED,
29INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE 29INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE
30IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 30IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
31PURPOSE. 31PURPOSE.
32 32
33The software is provided with RESTRICTED RIGHTS. Use, duplication, or 33The software is provided with RESTRICTED RIGHTS. Use, duplication, or
34disclosure by the government are subject to restrictions set forth in 34disclosure by the government are subject to restrictions set forth in
35DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. 35DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
36 36
37***************************************************************************/ 37***************************************************************************/
38 38
39/* 39/*
40 * src: vobject.c 40 * src: vobject.c
41 * doc: vobject and APIs to construct vobject, APIs pretty print 41 * doc: vobject and APIs to construct vobject, APIs pretty print
42 * vobject, and convert a vobject into its textual representation. 42 * vobject, and convert a vobject into its textual representation.
43 */ 43 */
44 44
45 #ifndef MWERKS 45 #ifndef MWERKS
46#include <malloc.h> 46#include <malloc.h>
47#endif 47#endif
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>
52#include <stdio.h> 53#include <stdio.h>
53#include <fcntl.h> 54#include <fcntl.h>
54//#include <io.h> 55//#include <io.h>
55 56
56 57
@@ -59,12 +60,16 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
59 #define STRINGZ_VALUE_OF(o) o->val.strs 60 #define STRINGZ_VALUE_OF(o) o->val.strs
60 #define INTEGER_VALUE_OF(o) o->val.i 61 #define INTEGER_VALUE_OF(o) o->val.i
61 #define LONG_VALUE_OF(o) o->val.l 62 #define LONG_VALUE_OF(o) o->val.l
62 #define ANY_VALUE_OF(o) o->val.any 63 #define ANY_VALUE_OF(o) o->val.any
63 #define VOBJECT_VALUE_OF(o) o->val.vobj 64 #define VOBJECT_VALUE_OF(o) o->val.vobj
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 {
66 const char *strs; 71 const char *strs;
67 unsigned int i; 72 unsigned int i;
68 unsigned long l; 73 unsigned long l;
69 void *any; 74 void *any;
70 VObject *vobj; 75 VObject *vobj;
@@ -83,13 +88,13 @@ typedef struct StrItem StrItem;
83struct StrItem { 88struct StrItem {
84 StrItem *next; 89 StrItem *next;
85 const char *s; 90 const char *s;
86 unsigned int refCnt; 91 unsigned int refCnt;
87 }; 92 };
88 93
89const char** fieldedProp; 94DLLEXPORT(const char**) fieldedProp;
90 95
91 96
92 97
93/*---------------------------------------------------------------------- 98/*----------------------------------------------------------------------
94 The following functions involve with memory allocation: 99 The following functions involve with memory allocation:
95 newVObject 100 newVObject
@@ -324,24 +329,24 @@ DLLEXPORT(VObject*) setValueWithSize(VObject *prop, void *val, unsigned int size
324 void *p = dupStr((const char *)val,size); 329 void *p = dupStr((const char *)val,size);
325 return setValueWithSize_(prop,p,p?size:0); 330 return setValueWithSize_(prop,p,p?size:0);
326} 331}
327 332
328DLLEXPORT(void) initPropIterator(VObjectIterator *i, VObject *o) 333DLLEXPORT(void) initPropIterator(VObjectIterator *i, VObject *o)
329{ 334{
330 i->start = o->prop; 335 i->start = o->prop;
331 i->next = 0; 336 i->next = 0;
332} 337}
333 338
334DLLEXPORT(void) initVObjectIterator(VObjectIterator *i, VObject *o) 339DLLEXPORT(void) initVObjectIterator(VObjectIterator *i, VObject *o)
335{ 340{
336 i->start = o->next; 341 i->start = o->next;
337 i->next = 0; 342 i->next = 0;
338} 343}
339 344
340DLLEXPORT(int) moreIteration(VObjectIterator *i) 345DLLEXPORT(int) moreIteration(VObjectIterator *i)
341{ 346{
342 return (i->start && (i->next==0 || i->next!=i->start)); 347 return (i->start && (i->next==0 || i->next!=i->start));
343} 348}
344 349
345DLLEXPORT(VObject*) nextVObject(VObjectIterator *i) 350DLLEXPORT(VObject*) nextVObject(VObjectIterator *i)
346{ 351{
347 if (i->start && i->next != i->start) { 352 if (i->start && i->next != i->start) {
@@ -400,13 +405,13 @@ DLLEXPORT(VObject*) addGroup(VObject *o, const char *g)
400 /* property(VCGroupingProp=n); 405 /* property(VCGroupingProp=n);
401 *and the value may have VCGrouping property 406 *and the value may have VCGrouping property
402 */ 407 */
403 t = addProp(t,VCGroupingProp); 408 t = addProp(t,VCGroupingProp);
404 setVObjectStringZValue(t,lookupProp_(n)); 409 setVObjectStringZValue(t,lookupProp_(n));
405 } while (n != gs); 410 } while (n != gs);
406 deleteStr(gs); 411 deleteStr(gs);
407 return p; 412 return p;
408 } 413 }
409 else 414 else
410 return addProp_(o,lookupProp(g)); 415 return addProp_(o,lookupProp(g));
411} 416}
412 417
@@ -796,26 +801,26 @@ static struct PreDefProp propNames[] = {
796 801
797 802
798static struct PreDefProp* lookupPropInfo(const char* str) 803static struct PreDefProp* lookupPropInfo(const char* str)
799{ 804{
800 /* brute force for now, could use a hash table here. */ 805 /* brute force for now, could use a hash table here. */
801 int i; 806 int i;
802 807
803 for (i = 0; propNames[i].name; i++) 808 for (i = 0; propNames[i].name; i++)
804 if (qstricmp(str, propNames[i].name) == 0) { 809 if (qstricmp(str, propNames[i].name) == 0) {
805 return &propNames[i]; 810 return &propNames[i];
806 } 811 }
807 812
808 return 0; 813 return 0;
809} 814}
810 815
811 816
812DLLEXPORT(const char*) lookupProp_(const char* str) 817DLLEXPORT(const char*) lookupProp_(const char* str)
813{ 818{
814 int i; 819 int i;
815 820
816 for (i = 0; propNames[i].name; i++) 821 for (i = 0; propNames[i].name; i++)
817 if (qstricmp(str, propNames[i].name) == 0) { 822 if (qstricmp(str, propNames[i].name) == 0) {
818 const char* s; 823 const char* s;
819 s = propNames[i].alias?propNames[i].alias:propNames[i].name; 824 s = propNames[i].alias?propNames[i].alias:propNames[i].name;
820 return lookupStr(s); 825 return lookupStr(s);
821 } 826 }
@@ -823,13 +828,13 @@ DLLEXPORT(const char*) lookupProp_(const char* str)
823} 828}
824 829
825 830
826DLLEXPORT(const char*) lookupProp(const char* str) 831DLLEXPORT(const char*) lookupProp(const char* str)
827{ 832{
828 int i; 833 int i;
829 834
830 for (i = 0; propNames[i].name; i++) 835 for (i = 0; propNames[i].name; i++)
831 if (qstricmp(str, propNames[i].name) == 0) { 836 if (qstricmp(str, propNames[i].name) == 0) {
832 const char *s; 837 const char *s;
833 fieldedProp = propNames[i].fields; 838 fieldedProp = propNames[i].fields;
834 s = propNames[i].alias?propNames[i].alias:propNames[i].name; 839 s = propNames[i].alias?propNames[i].alias:propNames[i].name;
835 return lookupStr(s); 840 return lookupStr(s);
@@ -950,12 +955,23 @@ static void appendsOFile(OFile *fp, const char *s)
950 appendcOFile(fp,s[i]); 955 appendcOFile(fp,s[i]);
951 } 956 }
952} 957}
953 958
954#endif 959#endif
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)
957{ 973{
958 fp->fp = ofp; 974 fp->fp = ofp;
959 fp->s = 0; 975 fp->s = 0;
960 fp->len = 0; 976 fp->len = 0;
961 fp->limit = 0; 977 fp->limit = 0;
@@ -1002,47 +1018,26 @@ static int writeBase64(OFile *fp, unsigned char *s, long len)
1002 } 1018 }
1003 appendcOFile(fp,'\n'); 1019 appendcOFile(fp,'\n');
1004 1020
1005 return 1; 1021 return 1;
1006} 1022}
1007 1023
1008static const char *replaceChar(unsigned char c) 1024static const char *qpReplaceChar(unsigned char c)
1009{ 1025{
1010 if (c == '\n') { 1026 if (c == '\n') {
1011 return "=0A=\n"; 1027 return "=0A=\n";
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 ||
1017 (c >= '0' && c <= '9')
1018 ||
1019 (c >= '\'' && c <= ')')
1020 ||
1021 (c >= '+' && c <= '-')
1022 ||
1023 (c == '/')
1024 ||
1025 (c == '?')
1026 || 1031 ||
1027 (c == ' ')) 1032 (c >= 62 && c <= 126)
1028 { 1033 )
1034 {
1029 return 0; 1035 return 0;
1030 } 1036 }
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];
1044 trans[0] = '='; 1039 trans[0] = '=';
1045 trans[3] = '\0'; 1040 trans[3] = '\0';
1046 int rem = c % 16; 1041 int rem = c % 16;
1047 int div = c / 16; 1042 int div = c / 16;
1048 1043
@@ -1054,83 +1049,91 @@ static const char *replaceChar(unsigned char c)
1054 if (rem < 10) 1049 if (rem < 10)
1055 trans[2] = '0' + rem; 1050 trans[2] = '0' + rem;
1056 else 1051 else
1057 trans[2] = 'A' + (rem - 10); 1052 trans[2] = 'A' + (rem - 10);
1058 1053
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{
1065 /* 1059 /*
1066 only A-Z, 0-9 and 1060 only A-Z, 0-9 and
1067 "'" (ASCII code 39) 1061 "'" (ASCII code 39)
1068 "(" (ASCII code 40) 1062 "(" (ASCII code 40)
1069 ")" (ASCII code 41) 1063 ")" (ASCII code 41)
1070 "+" (ASCII code 43) 1064 "+" (ASCII code 43)
1071 "," (ASCII code 44) 1065 "," (ASCII code 44)
1072 "-" (ASCII code 45) 1066 "-" (ASCII code 45)
1073 "/" (ASCII code 47) 1067 "/" (ASCII code 47)
1074 "?" (ASCII code 63) 1068 "?" (ASCII code 63)
1075 1069
1076 should remain un-encoded. 1070 should remain un-encoded.
1077 '=' needs to be encoded as it is the escape character. 1071 '=' needs to be encoded as it is the escape character.
1078 ';' needs to be as it is a field separator. 1072 ';' needs to be as it is a field separator.
1079 1073
1080 */ 1074 */
1081 const char *p = s; 1075 const char *p = s;
1082 while (*p) { 1076 switch ( vobj_enc ) {
1083 const char *rep = replaceChar(*p); 1077 case EightBit:
1084 if (rep) 1078 while (*p) {
1085 appendsOFile(fp, rep); 1079 if ( *p == '\n' || nosemi && ( *p == '\\' || *p == ';' ) )
1086 else 1080 appendcOFile(fp, '\\');
1087 appendcOFile(fp, *p); 1081 appendcOFile(fp, *p);
1088 p++; 1082 p++;
1083 }
1084 break;
1085 case QuotedPrintable:
1086 while (*p) {
1087 const char *rep = qpReplaceChar(*p);
1088 if (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");
1095 else
1096 appendcOFile(fp, *p);
1097 } else
1098 appendcOFile(fp, *p);
1099 p++;
1100 }
1101 break;
1102 case Base64:
1103 writeBase64(fp, (unsigned char*)p, strlen(p));
1104 break;
1089 } 1105 }
1090} 1106}
1091 1107
1092static bool includesUnprintable(VObject *o) 1108static 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) {
1105 if (VALUE_TYPE(o) == VCVT_STRINGZ) { 1111 if (VALUE_TYPE(o) == VCVT_STRINGZ) {
1106 const char *p = STRINGZ_VALUE_OF(o); 1112 const char *p = STRINGZ_VALUE_OF(o);
1107 if (p) { 1113 if (p) {
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;
1111 p++; 1118 p++;
1112 } 1119 }
1113 } 1120 }
1114 } 1121 }
1115 } 1122 }
1116
1117#endif
1118#warning "Bug-Workaround must be fixed !"
1119
1120 return FALSE; 1123 return FALSE;
1121} 1124}
1122 1125
1123static void writeVObject_(OFile *fp, VObject *o); 1126static 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{
1127 if (o == 0) return; 1130 if (o == 0) return;
1128 switch (VALUE_TYPE(o)) { 1131 switch (VALUE_TYPE(o)) {
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;
1132 } 1135 }
1133 case VCVT_UINT: { 1136 case VCVT_UINT: {
1134 char buf[16]; 1137 char buf[16];
1135 sprintf(buf,"%u", INTEGER_VALUE_OF(o)); 1138 sprintf(buf,"%u", INTEGER_VALUE_OF(o));
1136 appendsOFile(fp,buf); 1139 appendsOFile(fp,buf);
@@ -1157,25 +1160,23 @@ static void writeValue(OFile *fp, VObject *o, unsigned long size)
1157static void writeAttrValue(OFile *fp, VObject *o) 1160static void writeAttrValue(OFile *fp, VObject *o)
1158{ 1161{
1159 if (NAME_OF(o)) { 1162 if (NAME_OF(o)) {
1160 struct PreDefProp *pi; 1163 struct PreDefProp *pi;
1161 pi = lookupPropInfo(NAME_OF(o)); 1164 pi = lookupPropInfo(NAME_OF(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 }
1176} 1177}
1177 1178
1178static void writeGroup(OFile *fp, VObject *o) 1179static void writeGroup(OFile *fp, VObject *o)
1179{ 1180{
1180 char buf1[256]; 1181 char buf1[256];
1181 char buf2[256]; 1182 char buf2[256];
@@ -1232,43 +1233,39 @@ static void writeProp(OFile *fp, VObject *o)
1232 VObject *t = isAPropertyOf(o,*fields); 1233 VObject *t = isAPropertyOf(o,*fields);
1233 if (includesUnprintable(t)) 1234 if (includesUnprintable(t))
1234 printable = FALSE; 1235 printable = FALSE;
1235 fields++; 1236 fields++;
1236 } 1237 }
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,':');
1243 while (*fields) { 1242 while (*fields) {
1244 VObject *t = isAPropertyOf(o,*fields); 1243 VObject *t = isAPropertyOf(o,*fields);
1245 i++; 1244 i++;
1246 if (t) n = i; 1245 if (t) n = i;
1247 fields++; 1246 fields++;
1248 } 1247 }
1249 fields = fields_; 1248 fields = fields_;
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++;
1253 if (i<(n-1)) appendcOFile(fp,';'); 1252 if (i<(n-1)) appendcOFile(fp,';');
1254 } 1253 }
1255 } 1254 }
1256 } 1255 }
1257 1256
1258 1257
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;
1265 VObject *p = isAPropertyOf(o,VCDataSizeProp); 1262 VObject *p = isAPropertyOf(o,VCDataSizeProp);
1266 if (p) size = LONG_VALUE_OF(p); 1263 if (p) size = LONG_VALUE_OF(p);
1267 appendcOFile(fp,':'); 1264 appendcOFile(fp,':');
1268 writeValue(fp,o,size); 1265 writeValue(fp,o,size,FALSE);
1269 } 1266 }
1270 1267
1271 appendcOFile(fp,'\n'); 1268 appendcOFile(fp,'\n');
1272} 1269}
1273 1270
1274static void writeVObject_(OFile *fp, VObject *o) 1271static void writeVObject_(OFile *fp, VObject *o)
@@ -1292,14 +1289,41 @@ static void writeVObject_(OFile *fp, VObject *o)
1292 appendsOFile(fp,begin); 1289 appendsOFile(fp,begin);
1293 appendsOFile(fp,"\n\n"); 1290 appendsOFile(fp,"\n\n");
1294 } 1291 }
1295 } 1292 }
1296} 1293}
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;
1301 // ##### 1325 // #####
1302 //_setmode(_fileno(fp), _O_BINARY); 1326 //_setmode(_fileno(fp), _O_BINARY);
1303 initOFile(&ofp,fp); 1327 initOFile(&ofp,fp);
1304 writeVObject_(&ofp,o); 1328 writeVObject_(&ofp,o);
1305} 1329}
@@ -1326,21 +1350,16 @@ DLLEXPORT(void) writeVObjectsToFile(char *fname, VObject *list)
1326 while (list) { 1350 while (list) {
1327 writeVObject(f.directHandle(),list); 1351 writeVObject(f.directHandle(),list);
1328 list = nextVObjectInList(list); 1352 list = nextVObjectInList(list);
1329 } 1353 }
1330} 1354}
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)
1338{ 1357{
1339 const char *type = vObjectName( o ); 1358 const char *type = vObjectName( o );
1340 if ( strcmp( type, "TYPE" ) == 0 ) 1359 if ( strcmp( type, "TYPE" ) == 0 )
1341 type = vObjectStringZValue( o ); 1360 type = vObjectStringZValue( o );
1342 return type; 1361 return type;
1343} 1362}
1344#endif 1363
1345 1364
1346// end of source file vobject.c 1365// 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
@@ -96,17 +96,21 @@ For example:
96*/ 96*/
97 97
98 #define vCardMimeType "text/x-vCard" 98 #define vCardMimeType "text/x-vCard"
99 #define vCalendarMimeType"text/x-vCalendar" 99 #define vCalendarMimeType"text/x-vCalendar"
100 100
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
106#define DLLEXPORT(t) t 110#define DLLEXPORT(t) t
107#endif 111#endif
108 112
109#ifndef FALSE 113#ifndef FALSE
110 #define FALSE0 114 #define FALSE0
111#endif 115#endif
112#ifndef TRUE 116#ifndef TRUE
@@ -348,13 +352,13 @@ extern DLLEXPORT(int) vObjectValueType(VObject *o);
348 /* if the VObject has value set by setVObjectLongValue. */ 352 /* if the VObject has value set by setVObjectLongValue. */
349 #define VCVT_RAW 4 353 #define VCVT_RAW 4
350 /* if the VObject has value set by setVObjectAnyValue. */ 354 /* if the VObject has value set by setVObjectAnyValue. */
351 #define VCVT_VOBJECT5 355 #define VCVT_VOBJECT5
352 /* if the VObject has value set by setVObjectVObjectValue. */ 356 /* if the VObject has value set by setVObjectVObjectValue. */
353 357
354extern const char** fieldedProp; 358extern DLLEXPORT(const char**) fieldedProp;
355 359
356/*************************************************** 360/***************************************************
357 * The methods below are implemented in vcc.c (generated from vcc.y ) 361 * The methods below are implemented in vcc.c (generated from vcc.y )
358 ***************************************************/ 362 ***************************************************/
359 363
360/* NOTE regarding printVObject and writeVObject 364/* NOTE regarding printVObject and writeVObject
@@ -365,13 +369,13 @@ interface (at least that is my experience). Instead you can use
365their companion functions which take file names or pointers 369their companion functions which take file names or pointers
366to memory. However, if you are linking this code into 370to memory. However, if you are linking this code into
367your build directly then you may find them a more convenient API 371your build directly then you may find them a more convenient API
368and you can go ahead and use them. If you try to use them with 372and you can go ahead and use them. If you try to use them with
369the DLL LIB you will get a link error. 373the 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
373 377
374 378
375typedef void (*MimeErrorHandler)(char *); 379typedef void (*MimeErrorHandler)(char *);
376 380
377extern DLLEXPORT(void) registerMimeErrorHandler(MimeErrorHandler); 381extern DLLEXPORT(void) registerMimeErrorHandler(MimeErrorHandler);
@@ -390,32 +394,17 @@ you may find them a more convenient API that the other flavors
390that take a file name. If you use them with the DLL LIB you 394that take a file name. If you use them with the DLL LIB you
391will get a link error. 395will get a link error.
392*/ 396*/
393 397
394 398
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
419#endif /* __VOBJECT_H__ */ 408#endif /* __VOBJECT_H__ */
420 409
421 410