4 * Copyright (c) 2000 - 2014 Samsung Electronics Co., Ltd. All rights reserved
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
24 #define MAX_TYPE_NAME_LEN 50
25 #define MAX_PARAM_NAME_LEN 50
29 #define VFREE(obj) if(obj != NULL) { /*VDATA_TRACE("%p",obj);*/ free(obj); \
33 #define TRIM(obj) if(obj != NULL) {\
38 #define UPPER(obj,start,end) if(obj != NULL) {\
39 for(start = 0; start < end; start++)\
40 obj[start] = toupper(obj[start]);\
43 #define GO_NEXT_CHAR(current, rowData, addedCnt) {\
49 #define SET_PARAM_VALUE(PARAM, SZVALUE, LIST, LISTCNT, PARAMOBJ, PTYPE, ENC) {\
51 PARAM |= __VCardGetValue(SZVALUE, LIST, LISTCNT);\
52 if ( PARAM != UNKNOWN_NAME ) {\
53 PARAMOBJ->parameter = PTYPE;\
54 if(PTYPE == VCARD_PARAM_ENCODING)\
60 #define LENGTH_TYPE_LIST(obj, len) for(len =0; obj[len] != NULL; len++);
62 extern char* _VUnfoldingNoSpecNew( char *string );
64 /** GLOBAL VARIABLE DECLARATION AND INITIALIZATION */
66 char* pszCardTypeList[] =
68 "ADR", /* Delivery Address -> address*/
69 "AGENT", /* Agent -> assistant name, assistant number*/
70 "BDAY", /* Birthday -> birthday */
71 "BEGIN", /* BEGIN VCARD DELIMITER*/
72 "CATEGORIES", /* Categories is a multivalued attribute */
74 "EMAIL", /* Email -> email */
75 "END", /* END VCARD DELIMITER*/
76 "FN", /* Formatted Name -> display_name */
77 "GEO", /* Geographic Positioning*/
78 "KEY", /* Public Key*/
79 "LABEL", /* Label Address -> address*/
81 "MAILER", /* Email Program (Optional)*/
82 "N", /* Name -> name */
83 "NAME", /* Name -> name */
84 "NICKNAME", /* Nickname -> nickname */
85 "NOTE", /* Note -> note */
86 "ORG", /* Organization Name or Organizational unit -> department*/
87 "PHOTO", /* Photograph -> caller id*/
90 "REV", /* Last Revision(combination of calendar date & time)*/
91 "ROLE", /* Role or occupation */
95 "TEL", /* Telephone -> phone number */
96 "TITLE", /* Job Title -> job title */
98 "UID", /* Unique Identifier*/
99 "URL", /* URL -> web address */
100 "VERSION", /* Version*/
106 char* pszCardParamList[] =
116 /** Encoding value */
117 ValueObj pEncList[] =
120 {"BASE64", 0x00000002},
121 {"QUOTED-PRINTABLE", 0x00000004},
122 {"7BIT", 0x00000008},
126 /** Character set value */
127 ValueObj pCharsetList[] =
129 {"UTF-8", 0x00000001},
130 {"UTF-16", 0x00000002},
131 {"ISO-8859-1", 0x00000004}
135 ValueObj pValueList[] =
137 {"BINARY", 0x00000001},
138 {"BOOLEAN", 0x00000002},
139 {"DATE", 0x00000004},
140 {"DATE-TIME", 0x00000008},
141 {"FLOAT", 0x00000010},
142 {"INTEGER", 0x00000020},
143 {"PHONE-NUMBER", 0x00000040},
144 {"TEXT", 0x00000080},
145 {"TIME", 0x00000100},
148 {"UTC-OFFSET", 0x00000800},
149 {"VCARD", 0x00001000}
153 ValueObj pTypeList[] =
155 {"AIFF", 0x00000001},
158 {"CELL", 0x00000008},
160 {"WORK", 0x00000020},
163 {"HOME", 0x00000100},
164 {"INTL", 0x00000200},
165 {"INTERNET", 0x00000400},
166 {"ISDN", 0x00000800},
167 {"JPEG", 0x00001000},
168 {"MOBILE", 0x00002000},
169 {"MODEM", 0x00004000},
171 {"PAGER", 0x00010000},
172 {"PARCEL", 0x00020000},
176 {"POSTAL", 0x00200000},
177 {"PREF", 0x00400000},
178 {"VIDEO", 0x00800000},
179 {"VOICE", 0x01000000},
180 {"WAVE", 0x02000000},
181 {"WBMP", 0x04000000},
186 /** FUNCTION DECLARATION */
187 int __VCardGetName(char*, char**, int);
188 int __VCardGetValue(char*, const ValueObj*, int);
189 int __VCardGetTypeName(char*, int*, int*);
190 int __VCardGetParamName(char*, int*, int*);
191 int __VIsVcardFile(char*, int);
192 char* __VCardGetParamVal(char*,int*, int*);
193 char* __VCardGetTypeVal(char*, int*, int*, int, VObject*);
194 char* __VCardTypeEncode(VObject*, char*);
195 char* __VCardParamEncode(VObject*, int*);
197 #ifdef VDATA_GROUPNAME_SUPPORTED
199 #endif // VDATA_GROUPNAME_SUPPORTED
203 * __VCardGetName() compares the string and vCard type, parameter name.
205 * @param szString Name which will compare
206 * @param pszList[] Name list of vCard type and param
207 * @param size Number of total element of list
209 * @return index The index in the list
212 __VCardGetName(char* szString, char* pszList[], int size)
215 int high, low, i, diff;
220 for(; high >= low; diff<0 ? (low = i+1):(high = i-1)) {
221 i = ( low + high ) / 2;
222 if((diff = strcmp( pszList[i], szString )) == 0) /* success: found it */
230 * __VCardGetValue() compares the string and vCard type, parameter value.
232 * @param szString Value which will compare
233 * @param list[] Value list of vCard param
234 * @param size Number of total element of list
236 * @return flag The value's flag.
239 __VCardGetValue( char* szString, const ValueObj list[], int size)
242 int i = 0, diff = -1;
243 char* szTemp = szString;
245 SysRequireEx(szString, UNKNOWN_NAME);
246 SysRequireEx(size > 0, UNKNOWN_NAME);
248 UPPER(szTemp,i,strlen(szTemp));
250 for(i = 0; i < size-1; i++)
252 VDATA_TRACE(" i : %d",i);
253 VDATA_TRACE(" for loop %d < %d, list[%d] : %p, list[%d].szName : %p",i,size,i,list[i],i,list[i].szName);
254 VDATA_TRACE(" i : %d",i);
255 if(list[i].szName != NULL)
257 VDATA_TRACE(" list[%d].szName != NULL",i);
258 VDATA_TRACE(" before strcmp %s %s",list[i].szName,szTemp);
259 VDATA_TRACE(" before strcmp %d",strcmp(list[i].szName, szTemp));
260 if((diff = strcmp(list[i].szName, szTemp)) == 0) /* success: found it */
262 VDATA_TRACE(" return %d",list[i].flag);
266 VDATA_TRACE(" after strcmp %s %s",list[i].szName,szTemp);
269 VDATA_TRACE(" return UNKNOWN_NAME");
275 * __VCardGetTypeName() fine the type name and returns the index number
277 * @param pVCardRaw The raw data
278 * @param pStatus Decoder status
279 * @param pDLen retrived length
281 * @return res The index in type list
284 __VCardGetTypeName(char* pVCardRaw, int* pStatus, int* pDLen)
289 char name[MAX_TYPE_NAME_LEN+1]={0,};
291 #ifdef VDATA_GROUPNAME_SUPPORTED
292 char* szGroupName = NULL;
293 #endif // VDATA_GROUPNAME_SUPPORTED
295 SysRequireEx(pVCardRaw, UNKNOWN_NAME);
302 GO_NEXT_CHAR(c, pVCardRaw, pDLen);
305 * TYPE NAME's length is must be less than MAX_TYPE_NAME_LEN.
306 * If TYPE NAME's value is over MAX_TYPE_NAME_LEN, return UNKNOWN_NAME.
307 * And then Decoding Step shoud not be changed.
309 if(index >= MAX_TYPE_NAME_LEN) {
310 *pStatus = VCARD_TYPE_NAME_STATUS;
316 * There is a delimeter between TYPE NAME and next element(=Param, or Type Value).
317 * If VTYPE_TOKEN_SEMICOLON or VTYPE_TOKEN_COLON is faced with,
318 * find TYPE NAME's value in pszCardTypeList, and then return searched result.
320 if ((c == VTYPE_TOKEN_SEMICOLON ) || ( c == VTYPE_TOKEN_COLON)) {
324 res = __VCardGetName( name, (char**)pszCardTypeList, VCARD_TYPE_NUM );
327 /** current version not support grouping vcard type */
328 else if ( c == VTYPE_TOKEN_DOT ) {
329 #ifdef VDATA_GROUPNAME_SUPPORTED
331 szGroupName = ( char* ) malloc ( index+1 );
332 if(szGroupName != NULL){
333 strncpy( szGroupName, name, index );
334 gszGroupName = szGroupName;
340 * There is no new line in TYPE NAME.
341 * If new line character is faced with, return UNKNOWN_NAME;
343 else if ( ( c == '\r' ) || ( c == '\n' ) )
346 *pStatus = VCARD_TYPE_NAME_STATUS;
350 else if(_VIsSpace(c));
351 else name[index++] = c;
358 if ( c == VTYPE_TOKEN_SEMICOLON )
360 * This case next token is parameter. So set VCARD_PARAM_NAME_STATUS step.
362 *pStatus = VCARD_PARAM_NAME_STATUS;
364 if(res != UNKNOWN_NAME)
366 * This case next string is value. So set VCARD_TYPE_VALUE_STATUS step.
368 *pStatus = VCARD_TYPE_VALUE_STATUS;
371 * In current step, TYPE NAME is invalid. So Try to get TYPE NAME again from next position.
373 *pStatus = VCARD_TYPE_NAME_STATUS;
380 * __VCardGetParamName() fine the param name and returns the index number
382 * @param pVCardRaw The raw data
383 * @param pStatus Decoder status
384 * @param pDLen retrived length
386 * @return res The index in type list
389 __VCardGetParamName( char* pVCardRaw, int* pStatus, int* pDLen )
395 char name[MAX_PARAM_NAME_LEN+1]={0,};
396 char* pTemp = pVCardRaw;
398 SysRequireEx( pVCardRaw, UNKNOWN_NAME );
405 GO_NEXT_CHAR(c, pVCardRaw, pDLen);
408 * PARAM NAME's length is must be less than MAX_PARAM_NAME_LEN.
409 * If PARAM NAME's value is over MAX_PARAM_NAME_LEN, return UNKNOWN_NAME.
410 * And then Decoding Step shoud not be changed.
412 if(index >= MAX_PARAM_NAME_LEN) {
413 *pStatus = VCARD_TYPE_NAME_STATUS;
419 * There is a delimeter between PARAM NAME and next element(=Param, or Param Value).
420 * If VTYPE_TOKEN_EQUAL is faced with,
421 * find PARAM NAME's value in pszCardParamList, and then return searched result.
423 if(c == VTYPE_TOKEN_EQUAL) {
426 UPPER(name, i, index);
427 res = __VCardGetName( name, ( char** )pszCardParamList, VCARD_PARAM_NUM );
428 if(res==UNKNOWN_NAME){
431 *pStatus = VCARD_PARAM_VALUE_STATUS;
435 * This case, There is no parameter type. Only Parameter Value.
436 * In VCARD_PARAM_NAME_STATUS status, VTYPE_TOKEN_COLON means that anything parameter is no more.
437 * so set next step to VCARD_PARAM_VALUE_STATUS.
439 * Ex) TEL;WORK:+12341234
440 * ------ ":" next is TEL TYPE's value.
442 * VCARD_PARAM_NAME_STATUS(current) -> VCARD_PARAM_VALUE_STATUS
443 * -> VCARD_TYPE_VALUE_STATUS -> MOVE TO NEXT TYPE
445 else if(c == VTYPE_TOKEN_COLON) {
446 *pStatus = VCARD_PARAM_VALUE_STATUS;
453 * This case, There is no parameter type. Only Parameter Value.
454 * In VCARD_PARAM_NAME_STATUS status, VTYPE_TOKEN_SEMICOLON means that there is a next parameter.
455 * so set next step to VCARD_PARAM_NAME_STATUS.
457 * Ex) TEL;WORK;PREF:+12341234
458 * ------ ":" next is TEL TYPE's value.
460 * VCARD_PARAM_NAME_STATUS(current) -> VCARD_PARAM_NAME_STATUS
461 * -> VCARD_PARAM_VALUE_STATUS -> VCARD_TYPE_VALUE_STATUS -> MOVE TO NEXT TYPE
463 else if(c == VTYPE_TOKEN_SEMICOLON) {
464 *pStatus = VCARD_PARAM_NAME_STATUS;
470 else if((c == '\r') || (c == '\n') || (_VIsSpace(c)));
479 __VCardFreeVTreeMemory(VTree * pTree)
482 VObject* pCurObj = NULL;
483 VObject* pNextObj = NULL;
485 VTree* pCurTree = NULL;
486 VTree* pNextTree = NULL;
488 VParam* pCurParam = NULL;
489 VParam* pNextParam = NULL;
494 SysRequireEx( pTree->treeType == VCARD, false );
495 SysRequireEx( pTree != NULL, false );
496 VDATA_TRACE("vcard_free_vtree_memory() entered.");
498 if (pTree->treeType != VCARD)
508 pNextTree = pCurTree->pNext;
509 pCurObj = pCurTree->pTop;
514 pNextObj = pCurObj->pSibling;
515 count = pCurObj->valueCount;
517 for ( i = 0; i < count; i++ ) {
518 VFREE( pCurObj->pszValue[i]);
521 #ifdef VDATA_GROUPNAME_SUPPORTED
522 if ( pCurObj->pszGroupName )
523 VFREE( pCurObj->pszGroupName );
526 if ( pCurObj->pParam )
529 pCurParam = pCurObj->pParam;
531 while(pCurParam != NULL)
533 pNextParam = pCurParam->pNext;
534 VDATA_TRACE("pNEXT ==> %p", pCurParam->pNext);
535 VDATA_TRACE("pPARAM ==> %p", pCurParam->parameter);
536 VDATA_TRACE("pVALUE ==> %p", pCurParam->paramValue);
537 VDATA_TRACE("pCurParam : %p", pCurParam);
538 VDATA_TRACE("pCurParam->parameter : %d", pCurParam->parameter);
539 VDATA_TRACE("pCurParam->paramValue : %d", pCurParam->paramValue);
540 if(pNextParam != NULL) {
541 VDATA_TRACE("pNextParam : %p", pNextParam);
542 VDATA_TRACE("pNextParam->parameter : %d", pNextParam->parameter);
543 VDATA_TRACE("pNextParam->paramValue : %d", pNextParam->paramValue);
546 pCurParam = pNextParam;
555 pCurTree = pNextTree;
558 VDATA_TRACE("exit vcard_free_vtree_memory");
564 * __VCardGetParamVal() fine the param value and returns value.
566 * @param pVCardRaw The raw data
567 * @param pStatus Decoder status
568 * @param pDLen retrived length
570 * @return buffer The result value
573 __VCardGetParamVal( char* pVCardRaw, int* pStatus, int* pDLen )
579 char* pTemp = pVCardRaw;
581 SysRequireEx( pVCardRaw, NULL );
584 GO_NEXT_CHAR(c, pVCardRaw, pDLen);
587 case VTYPE_TOKEN_SEMICOLON :
588 *pStatus = VCARD_PARAM_NAME_STATUS;
590 case VTYPE_TOKEN_COLON :
591 *pStatus = VCARD_TYPE_VALUE_STATUS;
593 case VTYPE_TOKEN_COMMA :
594 *pStatus = VCARD_PARAM_VALUE_STATUS;
597 if( c == VTYPE_TOKEN_SEMICOLON
598 || c == VTYPE_TOKEN_COLON
599 || c == VTYPE_TOKEN_COMMA
604 pBuf = (char *)malloc(len);
605 if(len < 1 || (pBuf == NULL)) {
613 memset(pBuf, 0x00, len);
614 memcpy( pBuf, pTemp, len-1 );
622 * __VCardGetTypeVal() fine the type value and returns value.
624 * @param pVCardRaw The raw data
625 * @param status Decoder status
626 * @return buffer The result value
629 __VCardGetTypeVal( char* pVCardRaw, int* pStatus, int* pDLen, int enc, VObject* pType)
636 bool bEscape = false;
640 char* pTemp = pVCardRaw;
641 char* pTmpBuf = NULL;
645 SysRequireEx( pVCardRaw, NULL );
649 GO_NEXT_CHAR(c, pVCardRaw, pDLen);
651 if( c == 0x00) break;
655 /** This case means that there are more type's value. */
656 if ( c == VTYPE_TOKEN_SEMICOLON && bEscape == false ) {
658 if((pBuf = (char *)malloc(len)) == NULL) return NULL;
660 memset(pBuf, 0x00, len);
661 memcpy(pBuf,pTemp,len-1);
666 *pStatus = VCARD_TYPE_VALUE_STATUS;
668 /** Base 64 Decoding */
669 if((enc & pEncList[1].flag) || (enc & pEncList[0].flag)) {
671 bufferCount = (len * 6 / 8) + 2;
673 if((pTmpBuf = (char *)malloc(bufferCount)) == NULL) {
678 memset(pTmpBuf, 0x00, bufferCount);
679 num = _VB64Decode(pTmpBuf, pBuf);
681 if(pType != NULL) pType->numOfBiData = num;
689 /** Quoted Printable Decoding */
690 if(enc & pEncList[2].flag) {
695 if(pBuf[i] == '\n' || pBuf[i] == '\r'){
697 if(pBuf[i] == '\n'|| pBuf[i] == '\r')
700 if(pBuf[j-1] == '=') j--;
703 pBuf[j++] = pBuf[i++];
716 else if(bEscape == true && c != VTYPE_TOKEN_SEMICOLON )
718 else if((c == '\r') || (c == '\n'))
722 if(c2 == '=' && (enc & pEncList[2].flag))
725 if((c1 == '\r') || (c1 == '\n'))
732 else if(__VCardGetTypeName(pVCardRaw, &Status, &Len) != UNKNOWN_NAME)
735 if((pBuf = (char *)malloc(len)) == NULL) return NULL;
737 memset(pBuf, 0x00, len);
738 memcpy(pBuf,pTemp,len-1);
743 *pStatus = VCARD_TYPE_NAME_STATUS;
747 if((c1 == '\r') || (c1 == '\n')) {
752 if((enc & pEncList[1].flag) || (enc & pEncList[0].flag)) {
754 bufferCount = (len * 6 / 8) + 5;
756 if((pTmpBuf = (char *)malloc(bufferCount)) == NULL) {
761 memset(pTmpBuf, 0x00, bufferCount);
762 num = _VB64Decode(pTmpBuf, pBuf);
765 pType->numOfBiData = num;
773 if(enc & pEncList[2].flag) {
779 if(pBuf[i] == '\n' || pBuf[i] == '\r')
782 if(pBuf[i] == '\n' || pBuf[i] == '\r')
785 if(pBuf[j-1] == '=') j--;
788 pBuf[j++] = pBuf[i++];
806 VCardGetTypeValue( int index )
809 VDATA_TRACE("VCardGetTypeValue() enter..\n");
811 return pTypeList[index].flag;
815 VCardGetValValue( int index )
818 VDATA_TRACE("VCardGetValValue() enter..\n");
820 return pValueList[index].flag;
824 VCardGetEncValue( int index )
827 VDATA_TRACE("VCardGetEncValue() enter..\n");
829 return pEncList[index].flag;
833 VCardGetCharsetValue( int index )
836 VDATA_TRACE("VCardGetCharsetValue() enter..\n");
838 return pCharsetList[index].flag;
842 * vcard_decode() decode the vCard data and returns vObject struct
844 * @param pVCardRaw The raw data
845 * @return vObject The result value
848 vcard_decode( char *pCardRaw )
851 char* szValue = NULL;
852 char* szCardBegin = NULL;
853 char* pCardRawTmp = NULL;
854 VTree* pVCard = NULL;
855 VParam* pTmpParam = NULL;
856 VObject* pTemp = NULL;
861 int status = VCARD_TYPE_NAME_STATUS;
866 int param_status = false;
867 int numberedParam = 0;
869 int start_status = 0;
872 bool vcard_ended = false;
874 SysRequireEx(pCardRaw != NULL, NULL);
875 len = strlen(pCardRaw);
877 pCardRaw = _VUnfoldingNoSpecNew(pCardRaw);
878 pCardRawTmp = pCardRaw;
879 len = _VManySpace2Space( pCardRaw );
881 if(!__VIsVcardFile(pCardRaw, CHECK_START)) {
892 if((c == '\0') || done)
896 case VCARD_TYPE_NAME_STATUS:
898 type = __VCardGetTypeName(pCardRaw, &status, &dLen);
906 case VCARD_TYPE_BEGIN:
907 if(start_status == 1) {
911 if ( ( pVCard = ( VTree* )malloc( sizeof( VTree ) ) ) == NULL ) {
916 memset(pVCard,0x00, sizeof(VTree));
919 szCardBegin = __VCardGetTypeVal(pCardRaw, &status, &dLen, enc, NULL);
923 pVCard->treeType = VCARD;
926 pVCard->pNext = NULL;
931 if(strstr(pCardRaw,"VCARD") != NULL) {
937 status = VCARD_TYPE_NAME_STATUS;
947 if(UNKNOWN_NAME == type || type < 0) {
948 status = VCARD_TYPE_NAME_STATUS;
952 if ( ( pTemp = ( VObject* )malloc( sizeof( VObject ) ) ) == NULL ) {
956 memset( pTemp, 0, sizeof( VObject ) );
957 pTemp->property = type;
959 if ( pVCard->pTop == NULL ) {
960 pVCard->pTop = pTemp;
961 pVCard->pCur = pTemp;
964 pVCard->pCur->pSibling = pTemp;
965 pVCard->pCur = pTemp;
972 param_status = false;
975 #ifdef VDATA_GROUPNAME_SUPPORTED
976 if ( gszGroupName != NULL )
977 pVCard->pCur->pszGroupName = gszGroupName;
981 case VCARD_PARAM_NAME_STATUS:
984 param = __VCardGetParamName( pCardRaw, &status, &dLen );
987 if ( param_status != true ) {
989 if ( ( pTmpParam = ( VParam* )malloc( sizeof( VParam ) ) ) == NULL )
993 pVCard->pCur->pParam = pTmpParam;
994 memset( pTmpParam, 0x00, sizeof( VParam ) );
995 VDATA_TRACE("pTmpParam : %p", pTmpParam);
999 if ( ( pTmpParam->pNext = ( VParam* )malloc( sizeof( VParam ) ) ) == NULL )
1002 pTmpParam = pTmpParam->pNext;
1003 memset( pTmpParam, 0x00, sizeof(VParam));
1004 VDATA_TRACE("pTmpParam : %p", pTmpParam);
1007 pTmpParam->parameter = param;
1010 case VCARD_PARAM_VALUE_STATUS:
1013 switch ( pTmpParam->parameter )
1015 case VCARD_PARAM_TYPE:
1016 szValue = __VCardGetParamVal( pCardRaw, &status, &dLen );
1017 numberedParam |= __VCardGetValue( szValue, pTypeList, VCARD_TYPE_PARAM_NUM );
1019 case VCARD_PARAM_VALUE:
1020 szValue = __VCardGetParamVal( pCardRaw, &status, &dLen );
1021 numberedParam |= __VCardGetValue( szValue, pValueList, VCARD_VALUE_PARAM_NUM );
1023 case VCARD_PARAM_ENCODING:
1024 szValue = __VCardGetParamVal( pCardRaw, &status, &dLen );
1025 numberedParam |= __VCardGetValue( szValue, pEncList, VCARD_ENCODE_PARAM_NUM );
1026 enc = numberedParam;
1028 case VCARD_PARAM_CHARSET:
1029 szValue = __VCardGetParamVal( pCardRaw, &status, &dLen );
1030 numberedParam |= __VCardGetValue( szValue, pCharsetList, VCARD_CHARSET_PARAM_NUM );
1032 case VCARD_PARAM_CONTEXT:
1033 case VCARD_PARAM_LANGUAGE:
1034 // prevent 7605 08.03.13
1035 szValue = __VCardGetParamVal( pCardRaw, &status, &dLen );
1039 szValue = __VCardGetParamVal( pCardRaw, &status, &dLen );
1041 SET_PARAM_VALUE(numberedParam, szValue, pTypeList, VCARD_TYPE_PARAM_NUM, pTmpParam, VCARD_PARAM_TYPE, enc);
1042 SET_PARAM_VALUE(numberedParam, szValue, pValueList, VCARD_VALUE_PARAM_NUM, pTmpParam, VCARD_PARAM_VALUE, enc);
1043 SET_PARAM_VALUE(numberedParam, szValue, pEncList, VCARD_ENCODE_PARAM_NUM, pTmpParam, VCARD_PARAM_ENCODING, enc);
1044 SET_PARAM_VALUE(numberedParam, szValue, pCharsetList, VCARD_CHARSET_PARAM_NUM, pTmpParam, VCARD_PARAM_CHARSET, enc);
1053 VDATA_TRACE("%d, %s, %p",numberedParam, szValue, pTmpParam);
1054 pTmpParam->paramValue = numberedParam;
1055 pTmpParam->pNext = NULL;
1059 case VCARD_TYPE_VALUE_STATUS:
1061 temp = __VCardGetTypeVal( pCardRaw, &status, &dLen, enc, pVCard->pCur);
1063 if(valueCount <= VDATA_VALUE_COUNT_MAX) {
1064 pVCard->pCur->pszValue[valueCount] = temp;
1066 pVCard->pCur->valueCount = valueCount;
1078 if(pVCard->pTop == NULL)
1091 __VCardFreeVTreeMemory(pVCard);
1097 * vcard_encode() compares the string and vCard type, parameter value.
1099 * @param pVCardRaw Data which will be encoded
1100 * @return char * Encoded result
1103 vcard_encode( VTree *pVCardRaw )
1106 char* pVCardRes = NULL;
1107 VObject * pTmpObj = NULL;
1112 int lenTypeList = 0;
1114 LENGTH_TYPE_LIST(pszCardTypeList, lenTypeList);
1116 SysRequireEx(pVCardRaw != NULL, NULL);
1117 SysRequireEx(pVCardRaw->pTop != NULL, NULL);
1118 SysRequireEx(pVCardRaw->pTop->property >= 0, NULL);
1119 SysRequireEx(pVCardRaw->pTop->property < lenTypeList, NULL);
1120 SysRequireEx(pVCardRaw->treeType == VCARD, NULL);
1121 SysRequireEx(pVCardRaw->pTop->valueCount > 0, NULL);
1123 //VDATA_TRACE("START %d %d", pVCardRaw->pTop->property, lenTypeList);
1125 for(;cnt < pVCardRaw->pTop->valueCount;cnt++) {
1127 if(pVCardRaw->pTop->pszValue[cnt] == NULL) {
1128 VDATA_TRACE("pVCardRaw->pTop->valueCount : %d",pVCardRaw->pTop->valueCount);
1129 VDATA_TRACE("pVCardRaw->pTop->pszValue[%d] : %s", cnt, pVCardRaw->pTop->pszValue[cnt]);
1135 if ( ( pVCardRes = ( char * )malloc( sizeof( char ) * ( total += 14 + 14 ) ) ) == NULL )
1137 VDATA_TRACE( "vcard_encode:malloc failed\n" );
1142 memcpy( pVCardRes, "BEGIN:VCARD\r\n", 14 );
1143 strcat( pVCardRes, "VERSION:2.1\r\n" );
1145 pTmpObj = pVCardRaw->pTop;
1152 if ( ( pTemp = __VCardTypeEncode( pTmpObj, pszCardTypeList[pTmpObj->property] ) ) != NULL )
1154 len = strlen( pTemp );
1156 if ( ( pVCardRes = ( char* )realloc( pVCardRes, ( total += len+10 ) ) ) == NULL )
1158 VDATA_TRACE( "vcard_encode():realloc failed\n");
1165 if( strncmp(pTemp,"VERSION", strlen("VERSION")) != 0)
1166 strncat(pVCardRes, pTemp, strlen(pTemp));
1168 VDATA_TRACE("pTemp : %s", pTemp);
1174 if ( pTmpObj->pSibling != NULL )
1175 pTmpObj = pTmpObj->pSibling;
1180 if ( ( pVCardRes = ( char * )realloc( pVCardRes, ( total += 12 ) ) ) == NULL )
1182 VDATA_TRACE( "vcard_encode:realloc failed\n");
1186 strcat( pVCardRes, "END:VCARD\r\n" );
1193 * VIsVcardFile() verify VCard file.
1195 * @param pVCardRaw Data which will be encoded
1196 * @return int result (true or false)
1199 __VIsVcardFile(char *pCardRaw, int mode)
1202 bool rtnValue = true;
1203 char *pszVcardBegin = "BEGIN:VCARD";
1208 for(i=0; i < 11; i++)
1209 if(*pszVcardBegin++ != *pCardRaw++)
1222 * vCardTypeEncoder() compares the string and vCard type, parameter value.
1224 * @param typeObj Data which will be encoded
1225 * @param type Name of the type
1226 * @return char * Encoded result
1229 __VCardTypeEncode( VObject *pTypeObj, char *pType )
1234 char* szTypeValue = NULL;
1237 char* pEncode = NULL;
1242 len = strlen( pType );
1243 biLen = pTypeObj->numOfBiData;
1245 #ifdef VDATA_GROUPNAME_SUPPORTED
1246 if ( pTypeObj->pszGroupName != NULL )
1248 len += strlen( pTypeObj->pszGroupName ) + 1;
1250 #endif // VDATA_GROUPNAME_SUPPORTED
1251 if ( ( szTypeValue = ( char * )malloc( total += ( len+1 ) ) ) == NULL )
1253 VDATA_TRACE( "__VCardTypeEncode():malloc failed\n");
1257 memset( szTypeValue, '\0', ( len+1 ) );
1258 #ifdef VDATA_GROUPNAME_SUPPORTED
1259 if ( pTypeObj->pszGroupName != NULL )
1261 strcat( szTypeValue, pTypeObj->pszGroupName );
1262 strcat( szTypeValue, "." );
1264 #endif // VDATA_GROUPNAME_SUPPORTED
1265 strcat( szTypeValue, pType );
1267 pTemp = __VCardParamEncode( pTypeObj, &enc );
1268 if ( pTemp != NULL )
1270 len = strlen( pTemp );
1271 if ( ( szTypeValue = ( char * )realloc( szTypeValue, ( total += len ) ) ) == NULL )
1273 VDATA_TRACE( "__VCardTypeEncode():realloc failed\n");
1279 strcat( szTypeValue, pTemp );
1284 if ( ( szTypeValue = ( char * )realloc( szTypeValue, ( total += 2 ) ) ) == NULL )
1290 strcat( szTypeValue, ":" );
1294 if(strcmp(pType, pszCardTypeList[19]) != 0) {
1295 for ( i = 0; i < pTypeObj->valueCount; i++ ) {
1297 if(pTypeObj->pszValue[i] != NULL)
1298 len += strlen( pTypeObj->pszValue[i] );
1305 for ( i = 0; i < pTypeObj->valueCount; i++ ) {
1308 if ( ( pEncode = ( char * )malloc( len+20 ) ) == NULL ) {
1314 memset( pEncode, '\0', len+20 );
1316 if(strcmp(pType, pszCardTypeList[19]) != 0) {
1317 strcat( pEncode, pTypeObj->pszValue[i] );
1321 memcpy(pEncode, pTypeObj->pszValue[i], biLen);
1325 strncpy( buf, pTypeObj->pszValue[i], 999 );
1327 strcat( pEncode, ";" );
1328 strcat( pEncode, buf );
1332 if(strcmp(pType, pszCardTypeList[19]) != 0) {
1334 strcat( pEncode, "\0\0" );
1335 len = strlen( pEncode );
1342 if ( enc & pEncList[2].flag ) {
1343 if((pRes = (char *)malloc(len * 6 + 10)) == NULL) {
1350 _VQPEncode( pRes, pEncode );
1353 else if(enc & pEncList[1].flag ) {
1354 if((pRes = (char *)malloc((len * 8 / 6) + 4)) == NULL){
1361 memset( pRes, '\0', ( ( len * 8 / 6 ) + 4 ) );
1362 _VB64Encode( pRes, pEncode, biLen );
1366 if((pRes = (char *)malloc(len+30)) == NULL) {
1372 memset( pRes, '\0', ( len + 30 ) );
1375 memcpy( pRes, pEncode, len );
1380 if((pRes = (char *)realloc(pRes, strlen(pRes) + 3)) == NULL)
1387 strncat( pRes, "\r\n", strlen(pRes) + 2);
1389 len = strlen( pRes );
1391 if ((szTypeValue = (char *)realloc(szTypeValue, (total += (len+3)))) == NULL) {
1398 strncat(szTypeValue, pRes, total - 1);
1400 if(strcmp(pType, pszCardTypeList[19]) != 0) {
1401 _VRLSpace( szTypeValue );
1402 _VRTSpace( szTypeValue );
1411 * __VCardParamEncode() Parameter Encoding.
1413 * @param pTypeObj Data which will be encoded
1414 * @param pEnc Name of the type
1417 __VCardParamEncode(VObject* pTypeObj, int* pEnc)
1425 char* szParam = NULL;
1426 VParam* pTemp = NULL;
1427 ValueObj* pList = NULL;
1429 /** Paramter initialize. */
1430 pTemp = pTypeObj->pParam;
1432 /** Momory Allocation for parameter string. */
1434 if ((szParam = (char*)malloc(len+=2)) == NULL)
1439 memset(szParam, 0x00, 2);
1442 /** appending pamaters. */
1445 if(pTemp == NULL) break;
1449 /** Expand szParam string. For appending.*/
1450 if((szParam = (char *)realloc(szParam, len += 15)) == NULL)
1456 /** appending paramter name. */
1457 strcat( szParam, ";" );
1458 if(pTemp->parameter != VCARD_PARAM_TYPE) {
1459 strcat( szParam, pszCardParamList[pTemp->parameter] );
1460 strcat( szParam, "=" );
1463 /** Set Parameter Value name. */
1464 switch ( pTemp->parameter )
1466 case VCARD_PARAM_ENCODING:
1467 *pEnc = pTemp->paramValue;
1468 shift = VCARD_ENCODE_PARAM_NUM;
1469 pList = pEncList; bSupported = true;
1471 case VCARD_PARAM_TYPE:
1472 shift = VCARD_TYPE_PARAM_NUM;
1473 pList = pTypeList; bSupported = true;
1475 case VCARD_PARAM_VALUE:
1476 shift = VCARD_VALUE_PARAM_NUM;
1477 pList = pValueList; bSupported = true;
1479 case VCARD_PARAM_CHARSET:
1480 shift = VCARD_CHARSET_PARAM_NUM;
1481 pList = pCharsetList; bSupported = true;
1484 if ( ( szParam = ( char* )realloc( szParam, 5 ) ) == NULL )
1489 strcat( szParam, "NONE" );
1492 /** exchage parameter value's to string.*/
1493 if(bSupported == true) {
1495 for(i = 0, sNum = 0x00000001; i < shift; i++) {
1497 if(pTemp->paramValue & sNum) {
1498 if((szParam = (char *)realloc(szParam, ( len += (strlen(pList[i].szName) + 2)))) == NULL)
1504 strcat( szParam, pList[i].szName );
1505 strcat( szParam, "; " );
1512 /** remove semicolon from tail. */
1513 for(i = strlen( szParam ); i > 0 ; i--) {
1515 if ( szParam[i] == ' ' && szParam[i-1] == ';' ) {
1516 szParam[i-1] = '\0';
1521 if ( pTemp->pNext != NULL )
1522 pTemp = pTemp->pNext;
1531 vcard_free_vtree_memory(VTree * pTree)
1540 return __VCardFreeVTreeMemory(pTree);