summaryrefslogtreecommitdiff
authoreilers <eilers>2002-12-09 15:32:16 (UTC)
committer eilers <eilers>2002-12-09 15:32:16 (UTC)
commit9aa2442f6ea4e0d58fa7888995ebad04b3692049 (patch) (unidiff)
treef0a4340cf9178868e5c8d05df69a3d0d0fa12756
parentb0a600bf9dd32b908d79c2cf1f12b8088dc2590d (diff)
downloadopie-9aa2442f6ea4e0d58fa7888995ebad04b3692049.zip
opie-9aa2442f6ea4e0d58fa7888995ebad04b3692049.tar.gz
opie-9aa2442f6ea4e0d58fa7888995ebad04b3692049.tar.bz2
Temorarely bug workaround ( #490 ) until trolltech publishing a bugfix !
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--library/backend/vobject.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/library/backend/vobject.cpp b/library/backend/vobject.cpp
index 2f22c20..2c5b577 100644
--- a/library/backend/vobject.cpp
+++ b/library/backend/vobject.cpp
@@ -776,545 +776,571 @@ static struct PreDefProp propNames[] = {
776 { VCTimeZoneProp, 0, 0, 0 }, 776 { VCTimeZoneProp, 0, 0, 0 },
777 { VCTitleProp, 0, 0, 0 }, 777 { VCTitleProp, 0, 0, 0 },
778 { VCTLXProp, 0, 0, 0 }, 778 { VCTLXProp, 0, 0, 0 },
779 { VCTodoProp, 0, 0, PD_BEGIN }, 779 { VCTodoProp, 0, 0, PD_BEGIN },
780 { VCTranspProp, 0, 0, 0 }, 780 { VCTranspProp, 0, 0, 0 },
781 { VCUniqueStringProp, 0, 0, 0 }, 781 { VCUniqueStringProp, 0, 0, 0 },
782 { VCURLProp, 0, 0, 0 }, 782 { VCURLProp, 0, 0, 0 },
783 { VCURLValueProp, 0, 0, 0 }, 783 { VCURLValueProp, 0, 0, 0 },
784 { VCValueProp, 0, 0, 0 }, 784 { VCValueProp, 0, 0, 0 },
785 { VCVersionProp, 0, 0, 0 }, 785 { VCVersionProp, 0, 0, 0 },
786 { VCVideoProp, 0, 0, 0 }, 786 { VCVideoProp, 0, 0, 0 },
787 { VCVoiceProp, 0, 0, 0 }, 787 { VCVoiceProp, 0, 0, 0 },
788 { VCWAVEProp, 0, 0, 0 }, 788 { VCWAVEProp, 0, 0, 0 },
789 { VCWMFProp, 0, 0, 0 }, 789 { VCWMFProp, 0, 0, 0 },
790 { VCWorkProp, 0, 0, 0 }, 790 { VCWorkProp, 0, 0, 0 },
791 { VCX400Prop, 0, 0, 0 }, 791 { VCX400Prop, 0, 0, 0 },
792 { VCX509Prop, 0, 0, 0 }, 792 { VCX509Prop, 0, 0, 0 },
793 { VCXRuleProp, 0, 0, 0 }, 793 { VCXRuleProp, 0, 0, 0 },
794 { 0,0,0,0 } 794 { 0,0,0,0 }
795 }; 795 };
796 796
797 797
798static struct PreDefProp* lookupPropInfo(const char* str) 798static struct PreDefProp* lookupPropInfo(const char* str)
799{ 799{
800 /* brute force for now, could use a hash table here. */ 800 /* brute force for now, could use a hash table here. */
801 int i; 801 int i;
802 802
803 for (i = 0; propNames[i].name; i++) 803 for (i = 0; propNames[i].name; i++)
804 if (qstricmp(str, propNames[i].name) == 0) { 804 if (qstricmp(str, propNames[i].name) == 0) {
805 return &propNames[i]; 805 return &propNames[i];
806 } 806 }
807 807
808 return 0; 808 return 0;
809} 809}
810 810
811 811
812DLLEXPORT(const char*) lookupProp_(const char* str) 812DLLEXPORT(const char*) lookupProp_(const char* str)
813{ 813{
814 int i; 814 int i;
815 815
816 for (i = 0; propNames[i].name; i++) 816 for (i = 0; propNames[i].name; i++)
817 if (qstricmp(str, propNames[i].name) == 0) { 817 if (qstricmp(str, propNames[i].name) == 0) {
818 const char* s; 818 const char* s;
819 s = propNames[i].alias?propNames[i].alias:propNames[i].name; 819 s = propNames[i].alias?propNames[i].alias:propNames[i].name;
820 return lookupStr(s); 820 return lookupStr(s);
821 } 821 }
822 return lookupStr(str); 822 return lookupStr(str);
823} 823}
824 824
825 825
826DLLEXPORT(const char*) lookupProp(const char* str) 826DLLEXPORT(const char*) lookupProp(const char* str)
827{ 827{
828 int i; 828 int i;
829 829
830 for (i = 0; propNames[i].name; i++) 830 for (i = 0; propNames[i].name; i++)
831 if (qstricmp(str, propNames[i].name) == 0) { 831 if (qstricmp(str, propNames[i].name) == 0) {
832 const char *s; 832 const char *s;
833 fieldedProp = propNames[i].fields; 833 fieldedProp = propNames[i].fields;
834 s = propNames[i].alias?propNames[i].alias:propNames[i].name; 834 s = propNames[i].alias?propNames[i].alias:propNames[i].name;
835 return lookupStr(s); 835 return lookupStr(s);
836 } 836 }
837 fieldedProp = 0; 837 fieldedProp = 0;
838 return lookupStr(str); 838 return lookupStr(str);
839} 839}
840 840
841 841
842/*---------------------------------------------------------------------- 842/*----------------------------------------------------------------------
843 APIs to Output text form. 843 APIs to Output text form.
844 ----------------------------------------------------------------------*/ 844 ----------------------------------------------------------------------*/
845#define OFILE_REALLOC_SIZE 256 845#define OFILE_REALLOC_SIZE 256
846typedef struct OFile { 846typedef struct OFile {
847 FILE *fp; 847 FILE *fp;
848 char *s; 848 char *s;
849 int len; 849 int len;
850 int limit; 850 int limit;
851 int alloc:1; 851 int alloc:1;
852 int fail:1; 852 int fail:1;
853 } OFile; 853 } OFile;
854 854
855#if 0 855#if 0
856static void appendsOFile(OFile *fp, const char *s) 856static void appendsOFile(OFile *fp, const char *s)
857{ 857{
858 int slen; 858 int slen;
859 if (fp->fail) return; 859 if (fp->fail) return;
860 slen = strlen(s); 860 slen = strlen(s);
861 if (fp->fp) { 861 if (fp->fp) {
862 fwrite(s,1,slen,fp->fp); 862 fwrite(s,1,slen,fp->fp);
863 } 863 }
864 else { 864 else {
865stuff: 865stuff:
866 if (fp->len + slen < fp->limit) { 866 if (fp->len + slen < fp->limit) {
867 memcpy(fp->s+fp->len,s,slen); 867 memcpy(fp->s+fp->len,s,slen);
868 fp->len += slen; 868 fp->len += slen;
869 return; 869 return;
870 } 870 }
871 else if (fp->alloc) { 871 else if (fp->alloc) {
872 fp->limit = fp->limit + OFILE_REALLOC_SIZE; 872 fp->limit = fp->limit + OFILE_REALLOC_SIZE;
873 if (OFILE_REALLOC_SIZE <= slen) fp->limit += slen; 873 if (OFILE_REALLOC_SIZE <= slen) fp->limit += slen;
874 fp->s = (char *) realloc(fp->s,fp->limit); 874 fp->s = (char *) realloc(fp->s,fp->limit);
875 if (fp->s) goto stuff; 875 if (fp->s) goto stuff;
876 } 876 }
877 if (fp->alloc) 877 if (fp->alloc)
878 free(fp->s); 878 free(fp->s);
879 fp->s = 0; 879 fp->s = 0;
880 fp->fail = 1; 880 fp->fail = 1;
881 } 881 }
882} 882}
883 883
884static void appendcOFile(OFile *fp, char c) 884static void appendcOFile(OFile *fp, char c)
885{ 885{
886 if (fp->fail) return; 886 if (fp->fail) return;
887 if (fp->fp) { 887 if (fp->fp) {
888 fputc(c,fp->fp); 888 fputc(c,fp->fp);
889 } 889 }
890 else { 890 else {
891stuff: 891stuff:
892 if (fp->len+1 < fp->limit) { 892 if (fp->len+1 < fp->limit) {
893 fp->s[fp->len] = c; 893 fp->s[fp->len] = c;
894 fp->len++; 894 fp->len++;
895 return; 895 return;
896 } 896 }
897 else if (fp->alloc) { 897 else if (fp->alloc) {
898 fp->limit = fp->limit + OFILE_REALLOC_SIZE; 898 fp->limit = fp->limit + OFILE_REALLOC_SIZE;
899 fp->s = (char *) realloc(fp->s,fp->limit); 899 fp->s = (char *) realloc(fp->s,fp->limit);
900 if (fp->s) goto stuff; 900 if (fp->s) goto stuff;
901 } 901 }
902 if (fp->alloc) 902 if (fp->alloc)
903 free(fp->s); 903 free(fp->s);
904 fp->s = 0; 904 fp->s = 0;
905 fp->fail = 1; 905 fp->fail = 1;
906 } 906 }
907} 907}
908#else 908#else
909static void appendcOFile_(OFile *fp, char c) 909static void appendcOFile_(OFile *fp, char c)
910{ 910{
911 if (fp->fail) return; 911 if (fp->fail) return;
912 if (fp->fp) { 912 if (fp->fp) {
913 fputc(c,fp->fp); 913 fputc(c,fp->fp);
914 } 914 }
915 else { 915 else {
916stuff: 916stuff:
917 if (fp->len+1 < fp->limit) { 917 if (fp->len+1 < fp->limit) {
918 fp->s[fp->len] = c; 918 fp->s[fp->len] = c;
919 fp->len++; 919 fp->len++;
920 return; 920 return;
921 } 921 }
922 else if (fp->alloc) { 922 else if (fp->alloc) {
923 fp->limit = fp->limit + OFILE_REALLOC_SIZE; 923 fp->limit = fp->limit + OFILE_REALLOC_SIZE;
924 fp->s = (char *)realloc(fp->s,fp->limit); 924 fp->s = (char *)realloc(fp->s,fp->limit);
925 if (fp->s) goto stuff; 925 if (fp->s) goto stuff;
926 } 926 }
927 if (fp->alloc) 927 if (fp->alloc)
928 free(fp->s); 928 free(fp->s);
929 fp->s = 0; 929 fp->s = 0;
930 fp->fail = 1; 930 fp->fail = 1;
931 } 931 }
932} 932}
933 933
934static void appendcOFile(OFile *fp, char c) 934static void appendcOFile(OFile *fp, char c)
935{ 935{
936 if (c == '\n') { 936 if (c == '\n') {
937 /* write out as <CR><LF> */ 937 /* write out as <CR><LF> */
938 appendcOFile_(fp,0xd); 938 appendcOFile_(fp,0xd);
939 appendcOFile_(fp,0xa); 939 appendcOFile_(fp,0xa);
940 } 940 }
941 else 941 else
942 appendcOFile_(fp,c); 942 appendcOFile_(fp,c);
943} 943}
944 944
945static void appendsOFile(OFile *fp, const char *s) 945static void appendsOFile(OFile *fp, const char *s)
946{ 946{
947 int i, slen; 947 int i, slen;
948 slen = strlen(s); 948 slen = strlen(s);
949 for (i=0; i<slen; i++) { 949 for (i=0; i<slen; i++) {
950 appendcOFile(fp,s[i]); 950 appendcOFile(fp,s[i]);
951 } 951 }
952} 952}
953 953
954#endif 954#endif
955 955
956static void initOFile(OFile *fp, FILE *ofp) 956static void initOFile(OFile *fp, FILE *ofp)
957{ 957{
958 fp->fp = ofp; 958 fp->fp = ofp;
959 fp->s = 0; 959 fp->s = 0;
960 fp->len = 0; 960 fp->len = 0;
961 fp->limit = 0; 961 fp->limit = 0;
962 fp->alloc = 0; 962 fp->alloc = 0;
963 fp->fail = 0; 963 fp->fail = 0;
964} 964}
965 965
966static int writeBase64(OFile *fp, unsigned char *s, long len) 966static int writeBase64(OFile *fp, unsigned char *s, long len)
967{ 967{
968 long cur = 0; 968 long cur = 0;
969 int i, numQuads = 0; 969 int i, numQuads = 0;
970 unsigned long trip; 970 unsigned long trip;
971 unsigned char b; 971 unsigned char b;
972 char quad[5]; 972 char quad[5];
973#define MAXQUADS 16 973#define MAXQUADS 16
974 974
975 quad[4] = 0; 975 quad[4] = 0;
976 976
977 while (cur < len) { 977 while (cur < len) {
978 // collect the triplet of bytes into 'trip' 978 // collect the triplet of bytes into 'trip'
979 trip = 0; 979 trip = 0;
980 for (i = 0; i < 3; i++) { 980 for (i = 0; i < 3; i++) {
981 b = (cur < len) ? *(s + cur) : 0; 981 b = (cur < len) ? *(s + cur) : 0;
982 cur++; 982 cur++;
983 trip = trip << 8 | b; 983 trip = trip << 8 | b;
984 } 984 }
985 // fill in 'quad' with the appropriate four characters 985 // fill in 'quad' with the appropriate four characters
986 for (i = 3; i >= 0; i--) { 986 for (i = 3; i >= 0; i--) {
987 b = (unsigned char)(trip & 0x3F); 987 b = (unsigned char)(trip & 0x3F);
988 trip = trip >> 6; 988 trip = trip >> 6;
989 if ((3 - i) < (cur - len)) 989 if ((3 - i) < (cur - len))
990 quad[i] = '='; // pad char 990 quad[i] = '='; // pad char
991 else if (b < 26) quad[i] = (char)b + 'A'; 991 else if (b < 26) quad[i] = (char)b + 'A';
992 else if (b < 52) quad[i] = (char)(b - 26) + 'a'; 992 else if (b < 52) quad[i] = (char)(b - 26) + 'a';
993 else if (b < 62) quad[i] = (char)(b - 52) + '0'; 993 else if (b < 62) quad[i] = (char)(b - 52) + '0';
994 else if (b == 62) quad[i] = '+'; 994 else if (b == 62) quad[i] = '+';
995 else quad[i] = '/'; 995 else quad[i] = '/';
996 } 996 }
997 // now output 'quad' with appropriate whitespace and line ending 997 // now output 'quad' with appropriate whitespace and line ending
998 appendsOFile(fp, (numQuads == 0 ? " " : "")); 998 appendsOFile(fp, (numQuads == 0 ? " " : ""));
999 appendsOFile(fp, quad); 999 appendsOFile(fp, quad);
1000 appendsOFile(fp, ((cur >= len)?"\n" :(numQuads==MAXQUADS-1?"\n" : ""))); 1000 appendsOFile(fp, ((cur >= len)?"\n" :(numQuads==MAXQUADS-1?"\n" : "")));
1001 numQuads = (numQuads + 1) % MAXQUADS; 1001 numQuads = (numQuads + 1) % MAXQUADS;
1002 } 1002 }
1003 appendcOFile(fp,'\n'); 1003 appendcOFile(fp,'\n');
1004 1004
1005 return 1; 1005 return 1;
1006} 1006}
1007 1007
1008static const char *replaceChar(unsigned char c) 1008static const char *replaceChar(unsigned char c)
1009{ 1009{
1010 if (c == '\n') { 1010 if (c == '\n') {
1011 return "=0A=\n"; 1011 return "=0A=\n";
1012 } else if ( 1012 } else if (
1013 (c >= 'A' && c <= 'Z') 1013 (c >= 'A' && c <= 'Z')
1014 || 1014 ||
1015 (c >= 'a' && c <= 'z') 1015 (c >= 'a' && c <= 'z')
1016 || 1016 ||
1017 (c >= '0' && c <= '9') 1017 (c >= '0' && c <= '9')
1018 || 1018 ||
1019 (c >= '\'' && c <= ')') 1019 (c >= '\'' && c <= ')')
1020 || 1020 ||
1021 (c >= '+' && c <= '-') 1021 (c >= '+' && c <= '-')
1022 || 1022 ||
1023 (c == '/') 1023 (c == '/')
1024 || 1024 ||
1025 (c == '?') 1025 (c == '?')
1026 || 1026 ||
1027 (c == ' ')) 1027 (c == ' '))
1028 { 1028 {
1029 return 0; 1029 return 0;
1030 } 1030 }
1031 1031
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
1032 static char trans[4]; 1043 static char trans[4];
1033 trans[0] = '='; 1044 trans[0] = '=';
1034 trans[3] = '\0'; 1045 trans[3] = '\0';
1035 int rem = c % 16; 1046 int rem = c % 16;
1036 int div = c / 16; 1047 int div = c / 16;
1037 1048
1038 if (div < 10) 1049 if (div < 10)
1039 trans[1] = '0' + div; 1050 trans[1] = '0' + div;
1040 else 1051 else
1041 trans[1] = 'A' + (div - 10); 1052 trans[1] = 'A' + (div - 10);
1042 1053
1043 if (rem < 10) 1054 if (rem < 10)
1044 trans[2] = '0' + rem; 1055 trans[2] = '0' + rem;
1045 else 1056 else
1046 trans[2] = 'A' + (rem - 10); 1057 trans[2] = 'A' + (rem - 10);
1047 1058
1048 return trans; 1059 return trans;
1060#endif
1049} 1061}
1050 1062
1051static void writeQPString(OFile *fp, const char *s) 1063static void writeQPString(OFile *fp, const char *s)
1052{ 1064{
1053 /* 1065 /*
1054 only A-Z, 0-9 and 1066 only A-Z, 0-9 and
1055 "'" (ASCII code 39) 1067 "'" (ASCII code 39)
1056 "(" (ASCII code 40) 1068 "(" (ASCII code 40)
1057 ")" (ASCII code 41) 1069 ")" (ASCII code 41)
1058 "+" (ASCII code 43) 1070 "+" (ASCII code 43)
1059 "," (ASCII code 44) 1071 "," (ASCII code 44)
1060 "-" (ASCII code 45) 1072 "-" (ASCII code 45)
1061 "/" (ASCII code 47) 1073 "/" (ASCII code 47)
1062 "?" (ASCII code 63) 1074 "?" (ASCII code 63)
1063 1075
1064 should remain un-encoded. 1076 should remain un-encoded.
1065 '=' needs to be encoded as it is the escape character. 1077 '=' needs to be encoded as it is the escape character.
1066 ';' needs to be as it is a field separator. 1078 ';' needs to be as it is a field separator.
1067 1079
1068 */ 1080 */
1069 const char *p = s; 1081 const char *p = s;
1070 while (*p) { 1082 while (*p) {
1071 const char *rep = replaceChar(*p); 1083 const char *rep = replaceChar(*p);
1072 if (rep) 1084 if (rep)
1073 appendsOFile(fp, rep); 1085 appendsOFile(fp, rep);
1074 else 1086 else
1075 appendcOFile(fp, *p); 1087 appendcOFile(fp, *p);
1076 p++; 1088 p++;
1077 } 1089 }
1078} 1090}
1079 1091
1080static bool includesUnprintable(VObject *o) 1092static bool includesUnprintable(VObject *o)
1081{ 1093{
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
1082 if (o) { 1104 if (o) {
1083 if (VALUE_TYPE(o) == VCVT_STRINGZ) { 1105 if (VALUE_TYPE(o) == VCVT_STRINGZ) {
1084 const char *p = STRINGZ_VALUE_OF(o); 1106 const char *p = STRINGZ_VALUE_OF(o);
1085 if (p) { 1107 if (p) {
1086 while (*p) { 1108 while (*p) {
1087 if (replaceChar(*p)) 1109 if (replaceChar(*p))
1088 return TRUE; 1110 return TRUE;
1089 p++; 1111 p++;
1090 } 1112 }
1091 } 1113 }
1092 } 1114 }
1093 } 1115 }
1116
1117#endif
1118#warning "Bug-Workaround must be fixed !"
1119
1094 return FALSE; 1120 return FALSE;
1095} 1121}
1096 1122
1097static void writeVObject_(OFile *fp, VObject *o); 1123static void writeVObject_(OFile *fp, VObject *o);
1098 1124
1099static void writeValue(OFile *fp, VObject *o, unsigned long size) 1125static void writeValue(OFile *fp, VObject *o, unsigned long size)
1100{ 1126{
1101 if (o == 0) return; 1127 if (o == 0) return;
1102 switch (VALUE_TYPE(o)) { 1128 switch (VALUE_TYPE(o)) {
1103 case VCVT_STRINGZ: { 1129 case VCVT_STRINGZ: {
1104 writeQPString(fp, STRINGZ_VALUE_OF(o)); 1130 writeQPString(fp, STRINGZ_VALUE_OF(o));
1105 break; 1131 break;
1106 } 1132 }
1107 case VCVT_UINT: { 1133 case VCVT_UINT: {
1108 char buf[16]; 1134 char buf[16];
1109 sprintf(buf,"%u", INTEGER_VALUE_OF(o)); 1135 sprintf(buf,"%u", INTEGER_VALUE_OF(o));
1110 appendsOFile(fp,buf); 1136 appendsOFile(fp,buf);
1111 break; 1137 break;
1112 } 1138 }
1113 case VCVT_ULONG: { 1139 case VCVT_ULONG: {
1114 char buf[16]; 1140 char buf[16];
1115 sprintf(buf,"%lu", LONG_VALUE_OF(o)); 1141 sprintf(buf,"%lu", LONG_VALUE_OF(o));
1116 appendsOFile(fp,buf); 1142 appendsOFile(fp,buf);
1117 break; 1143 break;
1118 } 1144 }
1119 case VCVT_RAW: { 1145 case VCVT_RAW: {
1120 appendcOFile(fp,'\n'); 1146 appendcOFile(fp,'\n');
1121 writeBase64(fp,(unsigned char*)(ANY_VALUE_OF(o)),size); 1147 writeBase64(fp,(unsigned char*)(ANY_VALUE_OF(o)),size);
1122 break; 1148 break;
1123 } 1149 }
1124 case VCVT_VOBJECT: 1150 case VCVT_VOBJECT:
1125 appendcOFile(fp,'\n'); 1151 appendcOFile(fp,'\n');
1126 writeVObject_(fp,VOBJECT_VALUE_OF(o)); 1152 writeVObject_(fp,VOBJECT_VALUE_OF(o));
1127 break; 1153 break;
1128 } 1154 }
1129} 1155}
1130 1156
1131static void writeAttrValue(OFile *fp, VObject *o) 1157static void writeAttrValue(OFile *fp, VObject *o)
1132{ 1158{
1133 if (NAME_OF(o)) { 1159 if (NAME_OF(o)) {
1134 struct PreDefProp *pi; 1160 struct PreDefProp *pi;
1135 pi = lookupPropInfo(NAME_OF(o)); 1161 pi = lookupPropInfo(NAME_OF(o));
1136 if (pi && ((pi->flags & PD_INTERNAL) != 0)) return; 1162 if (pi && ((pi->flags & PD_INTERNAL) != 0)) return;
1137 if ( includesUnprintable(o) ) { 1163 if ( includesUnprintable(o) ) {
1138 appendsOFile(fp, ";" VCEncodingProp "=" VCQuotedPrintableProp); 1164 appendsOFile(fp, ";" VCEncodingProp "=" VCQuotedPrintableProp);
1139 appendsOFile(fp, ";" VCCharSetProp "=" "UTF-8"); 1165 appendsOFile(fp, ";" VCCharSetProp "=" "UTF-8");
1140 } 1166 }
1141 appendcOFile(fp,';'); 1167 appendcOFile(fp,';');
1142 appendsOFile(fp,NAME_OF(o)); 1168 appendsOFile(fp,NAME_OF(o));
1143 } 1169 }
1144 else 1170 else
1145 appendcOFile(fp,';'); 1171 appendcOFile(fp,';');
1146 if (VALUE_TYPE(o)) { 1172 if (VALUE_TYPE(o)) {
1147 appendcOFile(fp,'='); 1173 appendcOFile(fp,'=');
1148 writeValue(fp,o,0); 1174 writeValue(fp,o,0);
1149 } 1175 }
1150} 1176}
1151 1177
1152static void writeGroup(OFile *fp, VObject *o) 1178static void writeGroup(OFile *fp, VObject *o)
1153{ 1179{
1154 char buf1[256]; 1180 char buf1[256];
1155 char buf2[256]; 1181 char buf2[256];
1156 strcpy(buf1,NAME_OF(o)); 1182 strcpy(buf1,NAME_OF(o));
1157 while ((o=isAPropertyOf(o,VCGroupingProp)) != 0) { 1183 while ((o=isAPropertyOf(o,VCGroupingProp)) != 0) {
1158 strcpy(buf2,STRINGZ_VALUE_OF(o)); 1184 strcpy(buf2,STRINGZ_VALUE_OF(o));
1159 strcat(buf2,"."); 1185 strcat(buf2,".");
1160 strcat(buf2,buf1); 1186 strcat(buf2,buf1);
1161 strcpy(buf1,buf2); 1187 strcpy(buf1,buf2);
1162 } 1188 }
1163 appendsOFile(fp,buf1); 1189 appendsOFile(fp,buf1);
1164} 1190}
1165 1191
1166static int inList(const char **list, const char *s) 1192static int inList(const char **list, const char *s)
1167{ 1193{
1168 if (list == 0) return 0; 1194 if (list == 0) return 0;
1169 while (*list) { 1195 while (*list) {
1170 if (qstricmp(*list,s) == 0) return 1; 1196 if (qstricmp(*list,s) == 0) return 1;
1171 list++; 1197 list++;
1172 } 1198 }
1173 return 0; 1199 return 0;
1174} 1200}
1175 1201
1176static void writeProp(OFile *fp, VObject *o) 1202static void writeProp(OFile *fp, VObject *o)
1177{ 1203{
1178 if (NAME_OF(o)) { 1204 if (NAME_OF(o)) {
1179 struct PreDefProp *pi; 1205 struct PreDefProp *pi;
1180 VObjectIterator t; 1206 VObjectIterator t;
1181 const char **fields_ = 0; 1207 const char **fields_ = 0;
1182 pi = lookupPropInfo(NAME_OF(o)); 1208 pi = lookupPropInfo(NAME_OF(o));
1183 if (pi && ((pi->flags & PD_BEGIN) != 0)) { 1209 if (pi && ((pi->flags & PD_BEGIN) != 0)) {
1184 writeVObject_(fp,o); 1210 writeVObject_(fp,o);
1185 return; 1211 return;
1186 } 1212 }
1187 if (isAPropertyOf(o,VCGroupingProp)) 1213 if (isAPropertyOf(o,VCGroupingProp))
1188 writeGroup(fp,o); 1214 writeGroup(fp,o);
1189 else 1215 else
1190 appendsOFile(fp,NAME_OF(o)); 1216 appendsOFile(fp,NAME_OF(o));
1191 if (pi) fields_ = pi->fields; 1217 if (pi) fields_ = pi->fields;
1192 initPropIterator(&t,o); 1218 initPropIterator(&t,o);
1193 while (moreIteration(&t)) { 1219 while (moreIteration(&t)) {
1194 const char *s; 1220 const char *s;
1195 VObject *eachProp = nextVObject(&t); 1221 VObject *eachProp = nextVObject(&t);
1196 s = NAME_OF(eachProp); 1222 s = NAME_OF(eachProp);
1197 if (qstricmp(VCGroupingProp,s) && !inList(fields_,s)) 1223 if (qstricmp(VCGroupingProp,s) && !inList(fields_,s))
1198 writeAttrValue(fp,eachProp); 1224 writeAttrValue(fp,eachProp);
1199 } 1225 }
1200 if (fields_) { 1226 if (fields_) {
1201 int i = 0, n = 0; 1227 int i = 0, n = 0;
1202 const char** fields = fields_; 1228 const char** fields = fields_;
1203 /* output prop as fields */ 1229 /* output prop as fields */
1204 bool printable = TRUE; 1230 bool printable = TRUE;
1205 while (*fields && printable) { 1231 while (*fields && printable) {
1206 VObject *t = isAPropertyOf(o,*fields); 1232 VObject *t = isAPropertyOf(o,*fields);
1207 if (includesUnprintable(t)) 1233 if (includesUnprintable(t))
1208 printable = FALSE; 1234 printable = FALSE;
1209 fields++; 1235 fields++;
1210 } 1236 }
1211 fields = fields_; 1237 fields = fields_;
1212 if (!printable) { 1238 if (!printable) {
1213 appendsOFile(fp, ";" VCEncodingProp "=" VCQuotedPrintableProp); 1239 appendsOFile(fp, ";" VCEncodingProp "=" VCQuotedPrintableProp);
1214 appendsOFile(fp, ";" VCCharSetProp "=" "UTF-8"); 1240 appendsOFile(fp, ";" VCCharSetProp "=" "UTF-8");
1215 } 1241 }
1216 appendcOFile(fp,':'); 1242 appendcOFile(fp,':');
1217 while (*fields) { 1243 while (*fields) {
1218 VObject *t = isAPropertyOf(o,*fields); 1244 VObject *t = isAPropertyOf(o,*fields);
1219 i++; 1245 i++;
1220 if (t) n = i; 1246 if (t) n = i;
1221 fields++; 1247 fields++;
1222 } 1248 }
1223 fields = fields_; 1249 fields = fields_;
1224 for (i=0;i<n;i++) { 1250 for (i=0;i<n;i++) {
1225 writeValue(fp,isAPropertyOf(o,*fields),0); 1251 writeValue(fp,isAPropertyOf(o,*fields),0);
1226 fields++; 1252 fields++;
1227 if (i<(n-1)) appendcOFile(fp,';'); 1253 if (i<(n-1)) appendcOFile(fp,';');
1228 } 1254 }
1229 } 1255 }
1230 } 1256 }
1231 1257
1232 1258
1233 if (VALUE_TYPE(o)) { 1259 if (VALUE_TYPE(o)) {
1234 if ( includesUnprintable(o) ) { 1260 if ( includesUnprintable(o) ) {
1235 appendsOFile(fp, ";" VCEncodingProp "=" VCQuotedPrintableProp); 1261 appendsOFile(fp, ";" VCEncodingProp "=" VCQuotedPrintableProp);
1236 appendsOFile(fp, ";" VCCharSetProp "=" "UTF-8"); 1262 appendsOFile(fp, ";" VCCharSetProp "=" "UTF-8");
1237 } 1263 }
1238 unsigned long size = 0; 1264 unsigned long size = 0;
1239 VObject *p = isAPropertyOf(o,VCDataSizeProp); 1265 VObject *p = isAPropertyOf(o,VCDataSizeProp);
1240 if (p) size = LONG_VALUE_OF(p); 1266 if (p) size = LONG_VALUE_OF(p);
1241 appendcOFile(fp,':'); 1267 appendcOFile(fp,':');
1242 writeValue(fp,o,size); 1268 writeValue(fp,o,size);
1243 } 1269 }
1244 1270
1245 appendcOFile(fp,'\n'); 1271 appendcOFile(fp,'\n');
1246} 1272}
1247 1273
1248static void writeVObject_(OFile *fp, VObject *o) 1274static void writeVObject_(OFile *fp, VObject *o)
1249{ 1275{
1250 if (NAME_OF(o)) { 1276 if (NAME_OF(o)) {
1251 struct PreDefProp *pi; 1277 struct PreDefProp *pi;
1252 pi = lookupPropInfo(NAME_OF(o)); 1278 pi = lookupPropInfo(NAME_OF(o));
1253 1279
1254 if (pi && ((pi->flags & PD_BEGIN) != 0)) { 1280 if (pi && ((pi->flags & PD_BEGIN) != 0)) {
1255 VObjectIterator t; 1281 VObjectIterator t;
1256 const char *begin = NAME_OF(o); 1282 const char *begin = NAME_OF(o);
1257 appendsOFile(fp,"BEGIN:"); 1283 appendsOFile(fp,"BEGIN:");
1258 appendsOFile(fp,begin); 1284 appendsOFile(fp,begin);
1259 appendcOFile(fp,'\n'); 1285 appendcOFile(fp,'\n');
1260 initPropIterator(&t,o); 1286 initPropIterator(&t,o);
1261 while (moreIteration(&t)) { 1287 while (moreIteration(&t)) {
1262 VObject *eachProp = nextVObject(&t); 1288 VObject *eachProp = nextVObject(&t);
1263 writeProp(fp, eachProp); 1289 writeProp(fp, eachProp);
1264 } 1290 }
1265 appendsOFile(fp,"END:"); 1291 appendsOFile(fp,"END:");
1266 appendsOFile(fp,begin); 1292 appendsOFile(fp,begin);
1267 appendsOFile(fp,"\n\n"); 1293 appendsOFile(fp,"\n\n");
1268 } 1294 }
1269 } 1295 }
1270} 1296}
1271 1297
1272void writeVObject(FILE *fp, VObject *o) 1298void writeVObject(FILE *fp, VObject *o)
1273{ 1299{
1274 OFile ofp; 1300 OFile ofp;
1275 // ##### 1301 // #####
1276 //_setmode(_fileno(fp), _O_BINARY); 1302 //_setmode(_fileno(fp), _O_BINARY);
1277 initOFile(&ofp,fp); 1303 initOFile(&ofp,fp);
1278 writeVObject_(&ofp,o); 1304 writeVObject_(&ofp,o);
1279} 1305}
1280 1306
1281DLLEXPORT(void) writeVObjectToFile(char *fname, VObject *o) 1307DLLEXPORT(void) writeVObjectToFile(char *fname, VObject *o)
1282{ 1308{
1283 QFileDirect f( fname); 1309 QFileDirect f( fname);
1284 if ( !f.open( IO_WriteOnly ) ) { 1310 if ( !f.open( IO_WriteOnly ) ) {
1285 qWarning("Unable to open vobject write %s", fname); 1311 qWarning("Unable to open vobject write %s", fname);
1286 return; 1312 return;
1287 } 1313 }
1288 1314
1289 writeVObject( f.directHandle(),o ); 1315 writeVObject( f.directHandle(),o );
1290} 1316}
1291 1317
1292DLLEXPORT(void) writeVObjectsToFile(char *fname, VObject *list) 1318DLLEXPORT(void) writeVObjectsToFile(char *fname, VObject *list)
1293{ 1319{
1294 QFileDirect f( fname); 1320 QFileDirect f( fname);
1295 if ( !f.open( IO_WriteOnly ) ) { 1321 if ( !f.open( IO_WriteOnly ) ) {
1296 qWarning("Unable to open vobject write %s", fname); 1322 qWarning("Unable to open vobject write %s", fname);
1297 return; 1323 return;
1298 } 1324 }
1299 1325
1300 while (list) { 1326 while (list) {
1301 writeVObject(f.directHandle(),list); 1327 writeVObject(f.directHandle(),list);
1302 list = nextVObjectInList(list); 1328 list = nextVObjectInList(list);
1303 } 1329 }
1304} 1330}
1305 1331
1306#ifndef __SHARP_COMP_ 1332#ifndef __SHARP_COMP_
1307 1333
1308// This function is not available in the Sharp ROM for SL 5500 ! 1334// This function is not available in the Sharp ROM for SL 5500 !
1309// Therefore I have to move it into the header file.. (se) 1335// Therefore I have to move it into the header file.. (se)
1310 1336
1311DLLEXPORT(const char *) vObjectTypeInfo(VObject *o) 1337DLLEXPORT(const char *) vObjectTypeInfo(VObject *o)
1312{ 1338{
1313 const char *type = vObjectName( o ); 1339 const char *type = vObjectName( o );
1314 if ( strcmp( type, "TYPE" ) == 0 ) 1340 if ( strcmp( type, "TYPE" ) == 0 )
1315 type = vObjectStringZValue( o ); 1341 type = vObjectStringZValue( o );
1316 return type; 1342 return type;
1317} 1343}
1318#endif 1344#endif
1319 1345
1320// end of source file vobject.c 1346// end of source file vobject.c