RSA sync with private
[platform/core/messaging/msg-service.git] / vobject-engine / VMessage.c
1 /*
2 * Copyright 2012  Samsung Electronics Co., Ltd
3 *
4 * Licensed under the Flora License, Version 1.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *    http://www.tizenopensource.org/license
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "VTypes.h"
18 #include "VMessage.h"
19 #include "VCard.h"
20 #include "vobject.h"
21
22 #define MAX_TYPE_NAME_LEN 50
23 #define MAX_PARAM_NAME_LEN 50
24 #define CHECK_START 1
25 #define CHECK_END 2
26
27 #define VFREE(obj) if(obj != NULL) { /*VDATA_TRACE("%p",obj);*/ free(obj); \
28         obj = NULL; \
29 }
30
31 #define TRIM(obj) if(obj != NULL) {\
32         _VRLSpace(obj);\
33         _VRTSpace(obj);\
34 }
35
36 #define UPPER(obj,start,end) if(obj != NULL) {\
37         for(start = 0; start < end; start++)\
38                 obj[start] = toupper(obj[start]);\
39 }
40
41 #define GO_NEXT_CHAR(current, rowData, addedCnt) {\
42         current = *rowData;\
43         rowData++;\
44         (*addedCnt)++;\
45 }
46
47 #define SET_PARAM_VALUE(PARAM, SZVALUE, LIST, LISTCNT, PARAMOBJ, PTYPE, ENC) {\
48         PARAM = 0;\
49         PARAM |= __VMsgGetValue(SZVALUE, LIST, LISTCNT);\
50         if ( PARAM != UNKNOWN_NAME ) {\
51                 PARAMOBJ->parameter = PTYPE;\
52                 if(PTYPE == VMSG_PARAM_ENCODING)\
53                         ENC = PARAM;\
54                 break;\
55         }\
56 }
57
58 #define LENGTH_TYPE_LIST(obj, len) for(len =0; obj[len] != NULL; len++);
59
60 extern char* _VUnfoldingNoSpecNew( char *string );
61
62 /** GLOBAL VARIABLE DECLARATION AND INITIALIZATION */
63 /** vMsg Types. */
64 char* pszMsgTypeList[] =
65 {
66         "BEGIN",
67         "END",
68         "TEL",
69         "VBODY",
70         "VCARD",
71         "VMSG",
72         "X-BODY-CONTENTS",
73         "X-BODY-SUBJECT",
74         "X-IRMC-BOX",
75         "X-IRMC-STATUS",
76         "X-MESSAGE-TYPE",
77         "X-SS-DT",
78 };
79
80 /** Parameter */
81 char* pszMsgParamList[] =
82 {
83         "CHARSET",
84         "CONTEXT",
85         "ENCODING",
86         "LANGUAGE",
87         "TYPE",
88         "VALUE"
89 };
90
91 /** Encoding value */
92 ValueObj pMsgEncList[] =
93 {
94         {"B",                   0x00000001},
95         {"BASE64",      0x00000002},
96         {"QUOTED-PRINTABLE", 0x00000004},
97         {"7BIT",                0x00000008},
98         {"8BIT",                0x00000010}
99 };
100
101 /** Character set value */
102 ValueObj pMsgCharsetList[] =
103 {
104         {"UTF-8",                       0x00000001},
105         {"UTF-16",              0x00000002},
106         {"ISO-8859-1",  0x00000004}
107 };
108
109 /** Value value */
110 ValueObj pMsgValueList[] =
111 {
112         {"BINARY",                      0x00000001},
113         {"BOOLEAN",                     0x00000002},
114         {"DATE",                                0x00000004},
115         {"DATE-TIME",           0x00000008},
116         {"FLOAT",                               0x00000010},
117         {"INTEGER",                     0x00000020},
118         {"PHONE-NUMBER",        0x00000040},
119         {"TEXT",                                0x00000080},
120         {"TIME",                                0x00000100},
121         {"URI",                                 0x00000200},
122         {"URL",                                 0x00000400},
123         {"UTC-OFFSET",          0x00000800},
124         {"VMSG",                                0x00001000}
125 };
126
127 /** Type value */
128 ValueObj pMsgTypeList[] =
129 {
130         {"AIFF",                0x00000001},
131         {"BBS",                 0x00000002},
132         {"CAR",                 0x00000004},
133         {"CELL",                0x00000008},
134         {"DOM",                 0x00000010},
135         {"WORK",                0x00000020},
136         {"FAX",                 0x00000040},
137         {"GIF",                 0x00000080},
138         {"HOME",                0x00000100},
139         {"INTL",                0x00000200},
140         {"INTERNET",    0x00000400},
141         {"ISDN",                0x00000800},
142         {"JPEG",                0x00001000},
143         {"MOBILE",      0x00002000},
144         {"MODEM",               0x00004000},
145         {"MSG",                 0x00008000},
146         {"PAGER",               0x00010000},
147         {"PARCEL",      0x00020000},
148         {"PCM",                 0x00040000},
149         {"PCS",                 0x00080000},
150         {"PNG",                 0x00100000},
151         {"POSTAL",      0x00200000},
152         {"PREF",                0x00400000},
153         {"VIDEO",               0x00800000},
154         {"VOICE",               0x01000000},
155         {"WAVE",                0x02000000},
156         {"WBMP",                0x04000000},
157         {"ETC",                 0x08000000},
158         {"X400",                0x10000000}
159 };
160
161 /** FUNCTION DECLARATION        */
162 int __VMsgGetName(char*, char**, int);
163 int __VMsgGetValue(char*, const ValueObj*, int);
164 int __VMsgGetTypeName(char*, int*, int*);
165 int __VMsgGetParamName(char*, int*, int*);
166 int __VIsVmsgFile(char*, int);
167 char* __VMsgGetParamVal(char*,int*, int*);
168 char* __VMsgGetTypeVal(char*, int*, int*, int, VObject*);
169 char* __VMsgTypeEncode(VObject*, char*);
170 char* __VMsgParamEncode(VObject*, int*);
171
172
173 /**
174  * __VMsgGetName() compares the string and vMsg type, parameter name.
175  *
176  * @param       szString        Name which will compare
177  * @param               pszList[]               Name list of vMsg type and param
178  * @param               size                            Number of total element of list
179  *
180  * @return      index           The index in the list
181  */
182 int
183 __VMsgGetName(char* szString, char* pszList[], int size)
184 {
185         VDATA_TRACE_BEGINE
186         int high, low, i, diff = 0;
187
188         low = 0;
189         high = size - 1;
190
191         for(; high >= low; diff<0 ? (low = i+1):(high = i-1)) {
192                 i = ( low + high ) / 2;
193                 if((diff = strcmp( pszList[i], szString )) == 0) /* success: found it */
194                         return i;
195         }
196         VDATA_TRACE_END
197         return UNKNOWN_NAME;
198 }
199
200 /**
201  * __VMsgGetValue() compares the string and vMsg type, parameter value.
202  *
203  * @param       szString        Value which will compare
204  * @param               list[]          Value list of vMsg param
205  * @param               size                    Number of total element of list
206  *
207  * @return      flag      The value's flag.
208  */
209 int
210 __VMsgGetValue( char* szString, const ValueObj list[], int size)
211 {
212         VDATA_TRACE_BEGINE
213         int i = 0, diff = -1;
214         char* szTemp = szString;
215
216         SysRequireEx(szString, UNKNOWN_NAME);
217         SysRequireEx(size > 0, UNKNOWN_NAME);
218
219         UPPER(szTemp,i,strlen(szTemp));
220
221         for(i = 0; i < size-1; i++)
222         {
223                 VDATA_TRACE(" i : %d",i);
224                 VDATA_TRACE(" for loop %d < %d, list[%d] : %p, list[%d].szName : %p",i,size,i,list[i],i,list[i].szName);
225                 VDATA_TRACE(" i : %d",i);
226                 if(list[i].szName != NULL)
227                 {
228                         VDATA_TRACE(" list[%d].szName != NULL",i);
229                         VDATA_TRACE(" before strcmp %s %s",list[i].szName,szTemp);
230                         VDATA_TRACE(" before strcmp %d",strcmp(list[i].szName, szTemp));
231                         if((diff = strcmp(list[i].szName, szTemp)) == 0) /* success: found it */
232                         {
233                                 VDATA_TRACE(" return %d",list[i].flag);
234                                 VDATA_TRACE_END
235                                 return list[i].flag;
236                         }
237                         VDATA_TRACE(" after strcmp %s %s",list[i].szName,szTemp);
238                 }
239         }
240         VDATA_TRACE(" return UNKNOWN_NAME");
241         VDATA_TRACE_END
242         return UNKNOWN_NAME;
243 }
244
245 /**
246  * __VMsgGetTypeName() fine the type name and returns the index number
247  *
248  * @param               pVMsgRaw        The raw data
249  * @param               pStatus         Decoder status
250  * @param               pDLen           retrived length
251  *
252  * @return      res                     The index in type list
253  */
254 int
255 __VMsgGetTypeName(char* pVMsgRaw, int* pStatus, int* pDLen)
256 {
257         VDATA_TRACE_BEGINE
258         int     i, index, res;
259         char    c;
260         char    name[MAX_TYPE_NAME_LEN+1]={0,};
261
262         SysRequireEx(pVMsgRaw, UNKNOWN_NAME);
263
264         i = index = 0;
265         res = UNKNOWN_NAME;
266
267         while(true) {
268
269                 GO_NEXT_CHAR(c, pVMsgRaw, pDLen);
270
271                 /**
272                  * TYPE NAME's length is must be less than MAX_TYPE_NAME_LEN.
273                  * If TYPE NAME's value is over MAX_TYPE_NAME_LEN, return UNKNOWN_NAME.
274                  * And then Decoding Step shoud not be changed.
275                  */
276                 if(index >= MAX_TYPE_NAME_LEN) {
277                         *pStatus = VMSG_TYPE_NAME_STATUS;
278                         res = UNKNOWN_NAME;
279                         break;
280                 }
281
282                 /**
283                  * There is a delimeter between TYPE NAME and next element(=Param, or Type Value).
284                  * If VTYPE_TOKEN_SEMICOLON or VTYPE_TOKEN_COLON is faced with,
285                  * find TYPE NAME's value in pszMsgTypeList, and then return searched result.
286                  */
287                 if ((c == VTYPE_TOKEN_SEMICOLON ) || ( c == VTYPE_TOKEN_COLON)) {
288                         name[index] = 0x00;
289                         TRIM(name);
290                         UPPER(name,i,index);
291                         res = __VMsgGetName( name, (char**)pszMsgTypeList, VMSG_TYPE_NUM );
292                         break;
293                 }
294                 /**
295                  * There is no new line in TYPE NAME.
296                  * If new line character is faced with, return UNKNOWN_NAME;
297                  */
298                 else if ( ( c == '\r' ) || ( c == '\n' ) )
299                 {
300                         (*pDLen)++;
301                         *pStatus = VMSG_TYPE_NAME_STATUS;
302                         res = UNKNOWN_NAME;
303                         return res;
304                 }
305                 else if(_VIsSpace(c));
306                 else    name[index++] = c;
307         }
308
309         /**
310          *      Set Next Step.
311          *
312          */
313         if ( c == VTYPE_TOKEN_SEMICOLON )
314                 /**
315                  * This case next token is parameter. So set VMSG_PARAM_NAME_STATUS step.
316                  */
317                 *pStatus = VMSG_PARAM_NAME_STATUS;
318         else
319         {
320                 if(res != UNKNOWN_NAME)
321                         /**
322                          * This case next string is value. So set VMSG_TYPE_VALUE_STATUS step.
323                          */
324                         *pStatus = VMSG_TYPE_VALUE_STATUS;
325                 else
326                         /**
327                          * In current step, TYPE NAME is invalid. So Try to get TYPE NAME again from next position.
328                          */
329                         *pStatus = VMSG_TYPE_NAME_STATUS;
330         }
331         VDATA_TRACE_END
332         return res;
333 }
334
335 /**
336  * __VMsgGetParamName() fine the param name and returns the index number
337  *
338  * @param               pVMsgRaw        The raw data
339  * @param               pStatus         Decoder status
340  * @param               pDLen           retrived length
341  *
342  * @return      res                     The index in type list
343  */
344 int
345 __VMsgGetParamName( char* pVMsgRaw, int* pStatus, int* pDLen )
346 {
347         VDATA_TRACE_BEGINE
348         int     i, index, res;
349
350         char    c;
351         char    name[MAX_PARAM_NAME_LEN+1]={0,};
352         char* pTemp = pVMsgRaw;
353
354         SysRequireEx( pVMsgRaw, UNKNOWN_NAME );
355
356         i = index = 0;
357         res = UNKNOWN_NAME;
358
359         while ( true )
360         {
361                 GO_NEXT_CHAR(c, pVMsgRaw, pDLen);
362
363                 /**
364                  * PARAM NAME's length is must be less than MAX_PARAM_NAME_LEN.
365                  * If PARAM NAME's value is over MAX_PARAM_NAME_LEN, return UNKNOWN_NAME.
366                  * And then Decoding Step shoud not be changed.
367                  */
368                 if(index >= MAX_PARAM_NAME_LEN) {
369                         *pStatus = VMSG_TYPE_NAME_STATUS;
370                         res = UNKNOWN_NAME;
371                         break;
372                 }
373
374                 /**
375                  * There is a delimeter between PARAM NAME and next element(=Param, or Param Value).
376                  * If VTYPE_TOKEN_EQUAL is faced with,
377                  * find PARAM NAME's value in pszMsgParamList, and then return searched result.
378                  */
379                 if(c == VTYPE_TOKEN_EQUAL) {
380                         name[index] = '\0';
381                         TRIM(name);
382                         UPPER(name, i, index);
383                         res = __VMsgGetName( name, ( char** )pszMsgParamList, VMSG_PARAM_NUM );
384                         if(res==UNKNOWN_NAME){
385                                 (*pDLen) = 0;
386                         }
387                         *pStatus = VMSG_PARAM_VALUE_STATUS;
388                         break;
389                 }
390                 /**
391                  * This case, There is no parameter type. Only Parameter Value.
392                  * In VMSG_PARAM_NAME_STATUS status, VTYPE_TOKEN_COLON means that anything parameter is no more.
393                  * so set next step to VMSG_PARAM_VALUE_STATUS.
394                  *
395                  * Ex) TEL;WORK:+12341234
396                  *        ------ ":" next is TEL TYPE's value.
397                  *
398                  * VMSG_PARAM_NAME_STATUS(current) -> VMSG_PARAM_VALUE_STATUS
399                  * -> VMSG_TYPE_VALUE_STATUS -> MOVE TO NEXT TYPE
400                  */
401                 else if(c == VTYPE_TOKEN_COLON) {
402                         *pStatus = VMSG_PARAM_VALUE_STATUS;
403                         pVMsgRaw = pTemp;
404                         (*pDLen) = 0;
405                         res = UNKNOWN_NAME;
406                         break;
407                 }
408                 /**
409                  * This case, There is no parameter type. Only Parameter Value.
410                  * In VMSG_PARAM_NAME_STATUS status, VTYPE_TOKEN_SEMICOLON means that there is a next parameter.
411                  * so set next step to VMSG_PARAM_NAME_STATUS.
412                  *
413                  * Ex) TEL;WORK;PREF:+12341234
414                  *        ------ ":" next is TEL TYPE's value.
415                  *
416                  * VMSG_PARAM_NAME_STATUS(current) -> VMSG_PARAM_NAME_STATUS
417                  * -> VMSG_PARAM_VALUE_STATUS -> VMSG_TYPE_VALUE_STATUS -> MOVE TO NEXT TYPE
418                  */
419                 else if(c == VTYPE_TOKEN_SEMICOLON) {
420                         *pStatus = VMSG_PARAM_NAME_STATUS;
421                         pVMsgRaw = pTemp;
422                         (*pDLen) = 0;
423                         res = UNKNOWN_NAME;
424                         break;
425                 }
426                 else if((c == '\r') || (c == '\n') || (_VIsSpace(c)));
427                 else
428                         name[index++] = c;
429         }
430         VDATA_TRACE_END
431         return res;
432 }
433
434 bool
435 __VMsgFreeVTreeMemory(VTree * pTree)
436 {
437         VDATA_TRACE_BEGINE
438         VObject*                pCurObj = NULL;
439         VObject*                pNextObj = NULL;
440
441         VTree*                  pCurTree = NULL;
442         VTree*                  pNextTree = NULL;
443
444         VParam* pCurParam = NULL;
445         VParam* pNextParam = NULL;
446
447         int count = 0;
448         int i = 0;
449
450         SysRequireEx( pTree->treeType == VMESSAGE, false );
451         SysRequireEx( pTree != NULL, false );
452         VDATA_TRACE("vmsg_free_vtree_memory() entered.");
453
454         if (pTree->treeType != VMESSAGE)
455         {
456                 VDATA_TRACE_END
457                 return true;
458         }
459
460         pCurTree = pTree;
461
462         while(pCurTree)
463         {
464                 pNextTree = pCurTree->pNext;
465                 pCurObj = pCurTree->pTop;
466
467                 while ( pCurObj )
468                 {
469
470                         pNextObj = pCurObj->pSibling;
471                         count = pCurObj->valueCount;
472
473                         for ( i = 0; i < count; i++ ) {
474                                 VFREE( pCurObj->pszValue[i]);
475                         }
476
477                         if ( pCurObj->pParam )
478                         {
479
480                                 pCurParam = pCurObj->pParam;
481
482                                 while(pCurParam != NULL)
483                                 {
484                                         pNextParam = pCurParam->pNext;
485                                         VDATA_TRACE("pNEXT ==> %p", pCurParam->pNext);
486                                         VDATA_TRACE("pPARAM ==> %p", pCurParam->parameter);
487                                         VDATA_TRACE("pVALUE ==> %p", pCurParam->paramValue);
488                                         VDATA_TRACE("pCurParam : %p", pCurParam);
489                                         VDATA_TRACE("pCurParam->parameter : %d", pCurParam->parameter);
490                                         VDATA_TRACE("pCurParam->paramValue : %d", pCurParam->paramValue);
491                                         if(pNextParam != NULL) {
492                                                 VDATA_TRACE("pNextParam : %p", pNextParam);
493                                                 VDATA_TRACE("pNextParam->parameter : %d", pNextParam->parameter);
494                                                 VDATA_TRACE("pNextParam->paramValue : %d", pNextParam->paramValue);
495                                         }
496                                         VFREE(pCurParam);
497                                         pCurParam = pNextParam;
498                                 }
499                         }
500
501                         VFREE( pCurObj );
502                         pCurObj = pNextObj;
503                 }
504
505                 VFREE( pCurTree );
506                 pCurTree = pNextTree;
507         }
508
509         VDATA_TRACE("exit vmsg_free_vtree_memory");
510         VDATA_TRACE_END
511         return true;
512 }
513
514 /**
515  * __VMsgGetParamVal() fine the param value and returns value.
516  *
517  * @param               pVMsgRaw        The raw data
518  * @param               pStatus         Decoder status
519  * @param               pDLen           retrived length
520  *
521  * @return      buffer          The result value
522  */
523 char*
524 __VMsgGetParamVal( char* pVMsgRaw, int* pStatus, int* pDLen )
525 {
526         VDATA_TRACE_BEGINE
527         int len = 0;
528         char    c;
529         char* pBuf = NULL;
530         char* pTemp = pVMsgRaw;
531
532         SysRequireEx( pVMsgRaw, NULL );
533
534         while(true) {
535                 GO_NEXT_CHAR(c, pVMsgRaw, pDLen);
536                 len++;
537                 switch(c) {
538                         case VTYPE_TOKEN_SEMICOLON :
539                                 *pStatus = VMSG_PARAM_NAME_STATUS;
540                                 break;
541                         case VTYPE_TOKEN_COLON :
542                                 *pStatus = VMSG_TYPE_VALUE_STATUS;
543                                 break;
544                         case VTYPE_TOKEN_COMMA :
545                                 *pStatus = VMSG_PARAM_VALUE_STATUS;
546                                 break;
547                 }
548                 if( c == VTYPE_TOKEN_SEMICOLON
549                                 || c == VTYPE_TOKEN_COLON
550                                 || c == VTYPE_TOKEN_COMMA
551                                 || c == 0x00)
552                         break;
553         }
554
555         if(len < 1 || (pBuf = (char *)malloc(len)) == NULL)
556                 return NULL;
557         memset(pBuf, 0x00, len);
558         memcpy( pBuf, pTemp, len-1 );
559         TRIM(pBuf);
560         VDATA_TRACE_END
561         return pBuf;
562 }
563
564
565 /**
566  * __VMsgGetTypeVal() fine the type value and returns value.
567  *
568  * @param       pVMsgRaw        The raw data
569  * @param               status                  Decoder status
570  * @return      buffer          The result value
571  */
572 char*
573 __VMsgGetTypeVal( char* pVMsgRaw, int* pStatus, int* pDLen, int enc, VObject* pType)
574 {
575         VDATA_TRACE_BEGINE
576         int num = 0;
577         int len = 0;
578         int bufferCount = 0;
579
580         bool bEscape = false;
581
582         char    c, c1, c2;
583         char* pBuf = NULL;
584         char* pTemp = pVMsgRaw;
585         char* pTmpBuf = NULL;
586         int Status = 0;
587         int Len = 0;
588
589         SysRequireEx( pVMsgRaw, NULL );
590         VDATA_TRACE("pVMsgRaw: %s", pVMsgRaw);
591         while(true)
592         {
593                 GO_NEXT_CHAR(c, pVMsgRaw, pDLen);
594
595                 if( c == 0x00)
596                         break;
597
598                 len++;
599
600                 /** This case means that there are more type's value. */
601                 if ( c == VTYPE_TOKEN_SEMICOLON && bEscape == false )
602                 {
603                         if((pBuf = (char *)malloc(len)) == NULL)
604                                 return NULL;
605
606                         memset(pBuf, 0x00, len);
607                         memcpy(pBuf,pTemp,len-1);
608
609                         TRIM(pBuf);
610                         _VUnescape(pBuf);
611
612                         *pStatus = VMSG_TYPE_VALUE_STATUS;
613
614                         /** Base 64 Decoding */
615                         if((enc & pMsgEncList[1].flag) || (enc & pMsgEncList[0].flag))
616                         {
617
618                                 bufferCount = (len * 6 / 8) + 2;
619
620                                 if((pTmpBuf = (char *)malloc(bufferCount)) == NULL)
621                                 {
622                                         VFREE(pBuf);
623                                         return NULL;
624                                 }
625
626                                 memset(pTmpBuf, 0x00, bufferCount);
627                                 num = _VB64Decode(pTmpBuf, pBuf);
628
629                                 if(pType != NULL)
630                                         pType->numOfBiData = num;
631
632                                 VFREE(pBuf);
633                                 pBuf = pTmpBuf;
634                                 pTmpBuf = NULL;
635                                 break;
636                         }
637
638                         /** Quoted Printable Decoding */
639                         if(enc & pMsgEncList[2].flag)
640                         {
641
642                                 int i = 0, j = 0;
643
644                                 while(pBuf[i])
645                                 {
646                                         if(pBuf[i] == '\n' || pBuf[i] == '\r')
647                                         {
648                                                 i++;
649                                                 if(pBuf[i] == '\n'|| pBuf[i] == '\r')
650                                                         i++;
651
652                                                 if(pBuf[j-1] == '=')
653                                                         j--;
654                                         }
655                                         else
656                                                 pBuf[j++] = pBuf[i++];
657                                 }
658                                 pBuf[j] = '\0';
659
660                                 _VQPDecode(pBuf);
661                                 TRIM(pBuf);
662                                 break;
663                         }
664                         break;
665                 }
666
667                 if(c == '\\')
668                         bEscape = true;
669                 else if(bEscape == true && c != VTYPE_TOKEN_SEMICOLON )
670                         bEscape = false;
671                 else if((c == '\r') || (c == '\n'))
672                 {
673                         c2 = *(pVMsgRaw-2);
674
675                         if(c2 == '=' && (enc & pMsgEncList[2].flag))
676                         {
677                                 c1 = *pVMsgRaw;
678                                 if((c1 == '\r') || (c1 == '\n'))
679                                 {
680                                         pVMsgRaw += 1;
681                                         (*pDLen) += 1;
682                                         len++;
683                                 }
684                         }
685                         else if(__VMsgGetTypeName(pVMsgRaw, &Status, &Len) != UNKNOWN_NAME)
686                         {
687                                 if((pBuf = (char *)malloc(len)) == NULL)
688                                         return NULL;
689
690                                 memset(pBuf, 0x00, len);
691                                 memcpy(pBuf, pTemp, len-1);
692
693                                 TRIM(pBuf);
694                                 _VUnescape(pBuf);
695                                 VDATA_TRACE("pVMsgRaw: %s", pVMsgRaw);
696                                 *pStatus = VMSG_TYPE_NAME_STATUS;
697
698                                 c1 = *pVMsgRaw;
699
700                                 if((c1 == '\r') || (c1 == '\n'))
701                                 {
702                                         pVMsgRaw += 1;
703                                         (*pDLen) += 1;
704                                 }
705
706                                 if((enc & pMsgEncList[1].flag) || (enc & pMsgEncList[0].flag))
707                                 {
708
709                                         bufferCount = (len * 6 / 8) + 5;
710
711                                         if((pTmpBuf = (char *)malloc(bufferCount)) == NULL)
712                                         {
713                                                 VFREE(pBuf);
714                                                 return NULL;
715                                         }
716
717                                         memset(pTmpBuf, 0x00, bufferCount);
718                                         num = _VB64Decode(pTmpBuf, pBuf);
719
720                                         if(pType != NULL)
721                                                 pType->numOfBiData = num;
722
723                                         VFREE(pBuf);
724                                         pBuf = pTmpBuf;
725                                         pTmpBuf = NULL;
726                                         break;
727                                 }
728
729                                 if(enc & pMsgEncList[2].flag)
730                                 {
731
732                                         int i = 0, j = 0;
733
734                                         while(pBuf[i])
735                                         {
736                                                 if(pBuf[i] == '\n' || pBuf[i] == '\r')
737                                                 {
738                                                         i++;
739                                                         if(pBuf[i] == '\n' || pBuf[i] == '\r')
740                                                                 i++;
741
742                                                         if(pBuf[j-1] == '=') j--;
743                                                 }
744                                                 else
745                                                         pBuf[j++] = pBuf[i++];
746                                         }
747                                         pBuf[j] = '\0';
748
749                                         _VQPDecode(pBuf);
750                                         TRIM(pBuf);
751                                         break;
752                                 }
753                                 break;
754                         }
755                 }
756         }
757
758         VDATA_TRACE_END
759         return pBuf;
760 }
761
762
763 int
764 VMsgGetTypeValue( int index )
765 {
766         VDATA_TRACE_BEGINE
767         VDATA_TRACE("VMsgGetTypeValue() enter..\n");
768         VDATA_TRACE_END
769         return pMsgTypeList[index].flag;
770 }
771
772 int
773 VMsgGetValValue( int index )
774 {
775         VDATA_TRACE_BEGINE
776         VDATA_TRACE("VMsgGetValValue() enter..\n");
777         VDATA_TRACE_END
778         return pMsgValueList[index].flag;
779 }
780
781 int
782 VMsgGetEncValue( int index )
783 {
784         VDATA_TRACE_BEGINE
785         VDATA_TRACE("VMsgGetEncValue() enter..\n");
786         VDATA_TRACE_END
787         return pMsgEncList[index].flag;
788 }
789
790 int
791 VMsgGetCharsetValue( int index )
792 {
793         VDATA_TRACE_BEGINE
794         VDATA_TRACE("VMsgGetCharsetValue() enter..\n");
795         VDATA_TRACE_END
796         return pMsgCharsetList[index].flag;
797 }
798
799 /*
800  * vmsg_decode() decode the vMsg data and returns vObject struct
801  *
802  * @param       pVMsgRaw            The raw data
803  * @return      vObject             The result value
804  */
805 SLPAPI VTree*
806 vmsg_decode( char *pMsgRaw )
807 {
808         VDATA_TRACE_BEGINE;
809
810         char* szValue = NULL;
811         char* szMsgBegin = NULL;
812         char* pMsgRawTmp = NULL;
813         VTree* pVMsg = NULL;
814         VTree* pVBody = NULL;
815         VTree* pCurrent = NULL;
816         VTree* pVCard = NULL;
817         VParam* pTmpParam = NULL;
818         VObject* pTemp = NULL;
819
820         char    c;
821
822         int type, param;
823         int status = VMSG_TYPE_NAME_STATUS;
824         int done = false;
825         int valueCount = 0;
826         int len;
827         int dLen = 0;
828         int param_status = false;
829         int numberedParam = 0;
830         int enc = 0;
831         int start_status = 0;
832         char* temp = NULL;
833         char* pVTree = NULL;
834         bool vmsg_ended = false;
835
836         SysRequireEx(pMsgRaw != NULL, NULL);
837         len = strlen(pMsgRaw);
838         len = _VUnfoldingNoSpec(pMsgRaw, VMESSAGE);
839         pMsgRawTmp = pMsgRaw;
840         len = _VManySpace2Space( pMsgRaw );
841
842         if(!__VIsVmsgFile(pMsgRaw, CHECK_START)) {
843                 VFREE(pMsgRawTmp);
844                 VDATA_TRACE_END
845                 return NULL;
846         }
847
848         while(true && !done)
849         {
850                 c = *pMsgRaw;
851
852                 if((c == '\0') || done)
853                         break;
854
855                 switch(status) {
856                         case VMSG_TYPE_NAME_STATUS:
857                                 dLen = 0;
858                                 type = __VMsgGetTypeName(pMsgRaw, &status, &dLen);
859
860                                 if(type == VMSG_TYPE_BEGIN)
861                                         pVTree = pMsgRaw;
862
863                                 pMsgRaw += dLen;
864
865                                 if(type == -1)
866                                         break;
867
868                                 switch ( type )
869                                 {
870                                         case VMSG_TYPE_BEGIN:
871                                                 dLen = 0;
872                                                 enc = 0;
873                                                 szMsgBegin = __VMsgGetTypeVal(pMsgRaw, &status, &dLen, enc, NULL);
874                                                 pMsgRaw += dLen;
875
876                                                 if(szMsgBegin == NULL)
877                                                         goto CATCH;
878
879                                                 if(!strncmp(szMsgBegin, "VCARD", strlen("VCARD")))
880                                                 {
881                                                         VDATA_TRACE("pVTree: %s", pVTree);
882                                                         pVCard = vcard_decode(pVTree);
883                                                         pCurrent->pNext = pVCard;
884                                                         pCurrent = pVCard;
885
886                                                         dLen = ((strstr(pMsgRaw,"END:VCARD") + 9) - pMsgRaw);
887                                                         pMsgRaw += dLen;
888                                                 }
889
890                                                 else
891                                                 {
892
893                                                         if(start_status == 1)
894                                                                 goto CATCH;
895
896
897
898
899                                                         if(!strncmp(szMsgBegin, "VMSG", strlen("VMSG")))
900                                                         {
901                                                                 if ( ( pVMsg = ( VTree* )malloc( sizeof( VTree ) ) ) == NULL )
902                                                                 {
903                                                                         start_status = 1;
904                                                                         goto CATCH;
905                                                                 }
906                                                                 memset(pVMsg,0x00, sizeof(VTree));
907
908                                                                 pVMsg->treeType = VMESSAGE;
909                                                                 pVMsg->pTop = NULL;
910                                                                 pVMsg->pCur = NULL;
911                                                                 pVMsg->pNext = NULL;
912                                                                 pCurrent = pVMsg;
913                                                         }
914
915                                                         else if(!strncmp(szMsgBegin, "VBODY", strlen("VBODY")))
916                                                         {
917                                                                 if ( ( pVBody = ( VTree* )malloc( sizeof( VTree ) ) ) == NULL )
918                                                                 {
919                                                                         start_status = 1;
920                                                                         goto CATCH;
921                                                                 }
922
923                                                                 memset(pVBody,0x00, sizeof(VTree));
924                                                                 pVBody->treeType = VBODY;
925                                                                 pVBody->pTop = NULL;
926                                                                 pVBody->pCur = NULL;
927                                                                 pVBody->pNext = NULL;
928                                                                 pCurrent->pNext = pVBody;
929                                                                 pCurrent = pVBody;
930                                                         }
931                                                 }
932
933                                                 VFREE(szMsgBegin);
934                                                 break;
935
936                                         case VMSG_TYPE_END:
937                                                 dLen = 0;
938                                                 enc = 0;
939                                                 //szMsgBegin = __VMsgGetTypeVal(pMsgRaw, &status, &dLen, enc, NULL);
940
941                                                 if(!strncmp(pMsgRaw,"VMSG", strlen("VMSG")))
942                                                 {
943                                                         done = true;
944                                                         vmsg_ended = true;
945                                                 }
946                                                 else
947                                                 {
948                                                         status = VMSG_TYPE_NAME_STATUS;
949                                                         //pMsgRaw += dLen;
950                                                 }
951                                                 VDATA_TRACE("pMsgRaw:%s", pMsgRaw);
952                                                 pMsgRaw += dLen;
953                                                 break;
954
955                                         case UNKNOWN_NAME :
956                                                 break;
957
958                                         default:
959                                                 if(UNKNOWN_NAME == type || type < 0) {
960                                                         status = VMSG_TYPE_NAME_STATUS;
961                                                         break;
962                                                 }
963
964                                                 if ( ( pTemp = ( VObject* )malloc( sizeof( VObject ) ) ) == NULL )
965                                                 {
966                                                         goto CATCH;
967                                                 }
968
969                                                 memset( pTemp, 0, sizeof( VObject ) );
970                                                 pTemp->property = type;
971
972                                                 if ( pCurrent->pTop == NULL ) {
973                                                         pCurrent->pTop = pTemp;
974                                                         pCurrent->pCur = pTemp;
975                                                 }
976                                                 else {
977                                                         pCurrent->pCur->pSibling = pTemp;
978                                                         pCurrent->pCur = pTemp;
979                                                 }
980
981                                                 break;
982                                 }
983
984                                 numberedParam = 0;
985                                 param_status = false;
986                                 valueCount = 0;
987                                 break;
988
989                         case VMSG_PARAM_NAME_STATUS:
990                         {
991                                 dLen = 0;
992                                 param = __VMsgGetParamName( pMsgRaw, &status, &dLen );
993                                 pMsgRaw += dLen;
994
995                                 if ( param_status != true ) {
996
997                                         if ( ( pTmpParam = ( VParam* )malloc( sizeof( VParam ) ) ) == NULL )
998                                                         goto CATCH;
999
1000                                         param_status = true;
1001                                         pCurrent->pCur->pParam = pTmpParam;
1002                                         memset( pTmpParam, 0x00, sizeof( VParam ) );
1003                                         VDATA_TRACE("pTmpParam : %p", pTmpParam);
1004                                 }
1005                                 else
1006                                 {
1007                                         if ( ( pTmpParam->pNext = ( VParam* )malloc( sizeof( VParam ) ) ) == NULL )
1008                                                         goto CATCH;
1009
1010                                         pTmpParam = pTmpParam->pNext;
1011                                         memset( pTmpParam, 0x00, sizeof(VParam));
1012                                         VDATA_TRACE("pTmpParam : %p", pTmpParam);
1013                                 }
1014
1015                                 pTmpParam->parameter = param;
1016                                 break;
1017                         }
1018                         case VMSG_PARAM_VALUE_STATUS:
1019                                 dLen = 0;
1020                                 numberedParam = 0;
1021                                 switch ( pTmpParam->parameter )
1022                                 {
1023                                         case VMSG_PARAM_TYPE:
1024                                                 szValue = __VMsgGetParamVal( pMsgRaw, &status, &dLen );
1025                                                 numberedParam |= __VMsgGetValue( szValue, pMsgTypeList, VMSG_TYPE_PARAM_NUM );
1026                                                 break;
1027                                         case VMSG_PARAM_VALUE:
1028                                                 szValue = __VMsgGetParamVal( pMsgRaw, &status, &dLen );
1029                                                 numberedParam |= __VMsgGetValue( szValue, pMsgValueList, VMSG_VALUE_PARAM_NUM );
1030                                                 break;
1031                                         case VMSG_PARAM_ENCODING:
1032                                                 szValue = __VMsgGetParamVal( pMsgRaw, &status, &dLen );
1033                                                 numberedParam |= __VMsgGetValue( szValue, pMsgEncList, VMSG_ENCODE_PARAM_NUM );
1034                                                 enc = numberedParam;
1035                                                 break;
1036                                         case VMSG_PARAM_CHARSET:
1037                                                 szValue = __VMsgGetParamVal( pMsgRaw, &status, &dLen );
1038                                                 numberedParam |= __VMsgGetValue( szValue, pMsgCharsetList, VMSG_CHARSET_PARAM_NUM );
1039                                                 break;
1040                                         case VMSG_PARAM_CONTEXT:
1041                                         case VMSG_PARAM_LANGUAGE:
1042                                                 // prevent 7605 08.03.13
1043                                                 szValue = __VMsgGetParamVal( pMsgRaw, &status, &dLen );
1044                                                 numberedParam = 0;
1045                                                 break;
1046                                         default:
1047                                                 szValue = __VMsgGetParamVal( pMsgRaw, &status, &dLen );
1048
1049                                                 SET_PARAM_VALUE(numberedParam, szValue, pMsgTypeList, VMSG_TYPE_PARAM_NUM, pTmpParam, VMSG_PARAM_TYPE, enc);
1050                                                 SET_PARAM_VALUE(numberedParam, szValue, pMsgValueList, VMSG_VALUE_PARAM_NUM, pTmpParam, VMSG_PARAM_VALUE, enc);
1051                                                 SET_PARAM_VALUE(numberedParam, szValue, pMsgEncList, VMSG_ENCODE_PARAM_NUM, pTmpParam, VMSG_PARAM_ENCODING, enc);
1052                                                 SET_PARAM_VALUE(numberedParam, szValue, pMsgCharsetList, VMSG_CHARSET_PARAM_NUM, pTmpParam, VMSG_PARAM_CHARSET, enc);
1053
1054                                                 numberedParam = 0;
1055                                                 pMsgRaw += dLen;
1056                                                 dLen = 0;
1057
1058                                                 break;
1059                                 }
1060
1061                                 VDATA_TRACE("%d, %s, %p",numberedParam, szValue, pTmpParam);
1062                                 pTmpParam->paramValue = numberedParam;
1063                                 pTmpParam->pNext = NULL;
1064                                 VFREE(szValue);
1065                                 pMsgRaw += dLen;
1066                                 break;
1067                         case VMSG_TYPE_VALUE_STATUS:
1068                                 dLen = 0;
1069                                 temp = __VMsgGetTypeVal( pMsgRaw, &status, &dLen, enc, pCurrent->pCur);
1070
1071                                 if(valueCount <= VDATA_VALUE_COUNT_MAX) {
1072                                         pCurrent->pCur->pszValue[valueCount] = temp;
1073                                         valueCount++;
1074                                         pCurrent->pCur->valueCount = valueCount;
1075                                         VDATA_TRACE("object property: %d, value: %s", pCurrent->pCur->property, pCurrent->pCur->pszValue[valueCount - 1]);
1076                                 }
1077                                 else
1078                                         VFREE(temp);
1079
1080                                 pMsgRaw += dLen;
1081                                 break;
1082                 }
1083         }
1084         VDATA_TRACE("pMsgRawTmp: %s", pMsgRawTmp);
1085         //VFREE(pMsgRawTmp);
1086
1087         if(pVMsg->pTop == NULL)
1088         {
1089                 VDATA_TRACE("pVMsg->Top: NULL");
1090                 goto CATCH;
1091         }
1092
1093         if(!vmsg_ended) {
1094                 VDATA_TRACE("vmsg_ended: false");
1095                 goto CATCH1;
1096         }
1097         VDATA_TRACE_END
1098         return pVMsg;
1099
1100 CATCH :
1101         VFREE(pTemp);
1102 CATCH1 :
1103         VFREE(pMsgRawTmp);
1104         __VMsgFreeVTreeMemory(pVMsg);
1105         VDATA_TRACE_END
1106         return NULL;
1107 }
1108
1109 /*
1110  * vmsg_encode() compares the string and vMsg type, parameter value.
1111  *
1112  * @param       pVMsgRaw            Data which will be encoded
1113  * @return      char *              Encoded result
1114  */
1115 SLPAPI char*
1116 vmsg_encode( VTree *pVMsgRaw )
1117 {
1118         VDATA_TRACE_BEGINE
1119         char*           pVMsgRes = NULL;
1120         char*           pTmpVMsgRes = NULL;
1121         VTree*          pTmpTree = NULL;
1122         VObject *       pTmpObj =  NULL;
1123         char*           pTemp = NULL;
1124         int                     len;
1125         int                     total = 0;
1126         int             cnt = 0;
1127
1128         for(;cnt < pVMsgRaw->pTop->valueCount;cnt++) {
1129
1130                 if(pVMsgRaw->pTop->pszValue[cnt] == NULL)  {
1131                         VDATA_TRACE("pVMsgRaw->pTop->valueCount : %d",pVMsgRaw->pTop->valueCount);
1132                         VDATA_TRACE("pVMsgRaw->pTop->pszValue[%d] : %s", cnt, pVMsgRaw->pTop->pszValue[cnt]);
1133                         VDATA_TRACE_END
1134                         return NULL;
1135                 }
1136         }
1137
1138         pTmpTree = pVMsgRaw;
1139         pTmpObj = pVMsgRaw->pTop;
1140
1141         while(true)
1142         {
1143                 switch(pTmpTree->treeType)
1144                 {
1145                         case VMESSAGE:
1146                                 if (pVMsgRes) {
1147                                         free(pVMsgRes);
1148                                         pVMsgRes = NULL;
1149                                 }
1150
1151                                 if ( ( pVMsgRes = ( char * )malloc( sizeof( char ) * ( total += 13 ) ) ) == NULL )
1152                                 {
1153                                         VDATA_TRACE(  "vmsg_encode:malloc failed\n" );
1154                                         VDATA_TRACE_END
1155                                         return NULL;
1156                                 }
1157                                 memcpy( pVMsgRes, "BEGIN:VMSG\r\n", 13 );
1158                                 break;
1159
1160                         case VBODY:
1161                                 if ( ( pTmpVMsgRes = ( char * )realloc( pVMsgRes,  sizeof( char ) * ( total += 14 ) ) ) == NULL )
1162                                 {
1163                                         VDATA_TRACE(  "vmsg_encode:realloc failed\n" );
1164                                         VFREE(pVMsgRes);
1165                                         VDATA_TRACE_END
1166                                         return NULL;
1167                                 }
1168
1169                                 pVMsgRes = pTmpVMsgRes;
1170                                 strncat( pVMsgRes, "BEGIN:VBODY\r\n", 13);
1171                                 break;
1172
1173                         case VCARD:
1174                                 break;
1175                 }
1176
1177                 while ( true )
1178                 {
1179                         if(pTmpObj == NULL)
1180                                 break;
1181
1182                         if ( ( pTemp = __VMsgTypeEncode( pTmpObj, pTmpObj->property == VCARD_TYPE_TEL ? "TEL" : pszMsgTypeList[pTmpObj->property] ) ) != NULL )
1183                         {
1184                                 if(pTmpTree->treeType == VCARD)
1185                                 {
1186                                         char* encoded  = NULL;
1187
1188                                         encoded = vcard_encode(pTmpTree);
1189                                         if (encoded == NULL) {
1190                                                 VDATA_TRACE(  "vcard_encode() failed\n");
1191                                                 VFREE(pTemp);
1192                                                 VDATA_TRACE_END
1193                                                 return NULL;
1194                                         }
1195
1196                                         len= strlen(encoded);
1197
1198                                         if ( ( pTmpVMsgRes = ( char* )realloc( pVMsgRes, ( total += len+10 ) ) ) == NULL )
1199                                         {
1200                                                 VDATA_TRACE(  "vmsg_encode():realloc failed\n");
1201                                                 VFREE( pTemp );
1202                                                 VFREE( encoded );
1203                                                 VFREE(pVMsgRes);
1204                                                 VDATA_TRACE_END
1205                                                 return NULL;
1206                                         }
1207
1208                                         pVMsgRes = pTmpVMsgRes;
1209                                         strncat(pVMsgRes, encoded, len+10);
1210                                         VDATA_TRACE("pTemp : %s", encoded);
1211                                         VFREE( pTemp );
1212                                         VFREE( encoded );
1213                                         break;
1214                                 }
1215                                 else
1216                                 {
1217                                         len = strlen( pTemp );
1218
1219                                         if ( ( pTmpVMsgRes = ( char* )realloc( pVMsgRes, ( total += len+10 ) ) ) == NULL )
1220                                         {
1221                                                 VDATA_TRACE(  "vmsg_encode():realloc failed\n");
1222                                                 VFREE( pTemp );
1223                                                 VFREE(pVMsgRes);
1224                                                 VDATA_TRACE_END
1225                                                 return NULL;
1226                                         }
1227                                         pVMsgRes = pTmpVMsgRes;
1228                                         strncat(pVMsgRes, pTemp, len+10);
1229                                         VDATA_TRACE("pTemp : %s", pTemp);
1230                                         VFREE( pTemp );
1231
1232                                         if ( pTmpObj->pSibling != NULL )
1233                                                 pTmpObj = pTmpObj->pSibling;
1234                                         else
1235                                                 break;
1236                                 }
1237                         }
1238
1239
1240                 }
1241
1242                 switch(pTmpTree->treeType)
1243                 {
1244                         case VBODY:
1245                                 if ( ( pTmpVMsgRes = ( char * )realloc( pVMsgRes, ( total += 12 ) ) ) == NULL )
1246                                 {
1247                                         VFREE(pVMsgRes);
1248                                         VDATA_TRACE(  "vcal_encode():realloc failed\n");
1249                                         return NULL;
1250                                 }
1251
1252                                 pVMsgRes = pTmpVMsgRes;
1253                                 strncat( pVMsgRes, "END:VBODY\r\n", 12);
1254                                 break;
1255
1256                         case VCARD:
1257                                 break;
1258
1259                         case VMESSAGE:
1260                                 break;
1261
1262                 }
1263
1264                 if ( pTmpTree->pNext != NULL )
1265                         pTmpTree = pTmpTree->pNext;
1266                 else
1267                         break;
1268                 pTmpObj = pTmpTree->pTop;
1269         }
1270
1271         if ( ( pTmpVMsgRes = ( char * )realloc( pVMsgRes, ( total += 11 ) ) ) == NULL )
1272         {
1273                 VDATA_TRACE(  "vmsg_encode:realloc failed\n");
1274                 VFREE(pVMsgRes);
1275                 VDATA_TRACE_END
1276                 return NULL;
1277         }
1278
1279         pVMsgRes = pTmpVMsgRes;
1280         strncat( pVMsgRes, "END:VMSG\r\n", 11);
1281         VDATA_TRACE_END
1282         return pVMsgRes;
1283 }
1284
1285
1286 /*
1287  * VIsVmsgFile() verify VMsg file.
1288  *
1289  * @param       pVMsgRaw           Data which will be encoded
1290  * @return      int                 result (true or false)
1291  */
1292 int
1293 __VIsVmsgFile(char *pMsgRaw, int mode)
1294 {
1295         int i=0;
1296         bool rtnValue = true;
1297         char *pszVmsgBegin = "BEGIN:VMSG";
1298
1299         switch(mode)
1300         {
1301                 case CHECK_START :
1302                         for(i=0; i < 10; i++)
1303                 if(*pszVmsgBegin++ != *pMsgRaw++)
1304                                         rtnValue = false;
1305                         break;
1306
1307                 default :
1308                         rtnValue = false;
1309         }
1310         VDATA_TRACE_END
1311         return rtnValue;
1312 }
1313
1314
1315 /*
1316  * vMsgTypeEncoder() compares the string and vMsg type, parameter value.
1317  *
1318  * @param               typeObj                         Data which will be encoded
1319  * @param               type                            Name of the type
1320  * @return      char *              Encoded result
1321  */
1322 char*
1323 __VMsgTypeEncode( VObject *pTypeObj, char *pType )
1324 {
1325         VDATA_TRACE_BEGINE
1326         int                     len;
1327         char*           pTemp = NULL;
1328         char*           szTypeValue = NULL;
1329         int                     i;
1330         int                     enc = 0;
1331         char*           pEncode = NULL;
1332         char*           pRes = NULL;
1333         int                     total = 0;
1334         int                     biLen = 0;
1335
1336         len = strlen( pType );
1337         biLen = pTypeObj->numOfBiData;
1338
1339         if ( ( szTypeValue = ( char * )malloc( total += ( len+1 ) ) ) == NULL )
1340         {
1341                 VDATA_TRACE(  "__VMsgTypeEncode():malloc failed\n");
1342                 VDATA_TRACE_END
1343                 return NULL;
1344         }
1345         memset( szTypeValue, '\0', ( len+1 ) );
1346         strncat( szTypeValue, pType, len+1);
1347
1348         pTemp = __VMsgParamEncode( pTypeObj, &enc );
1349         if ( pTemp != NULL )
1350         {
1351                 len = strlen( pTemp );
1352                 if ( ( szTypeValue = ( char * )realloc( szTypeValue, ( total += len ) ) ) == NULL )
1353                 {
1354                         VDATA_TRACE(  "__VMsgTypeEncode():realloc failed\n");
1355                         VFREE( pTemp );
1356                         pTemp = NULL
1357                         VDATA_TRACE_END;
1358                         return NULL;
1359                 }
1360                 strncat( szTypeValue, pTemp, len);
1361                 VFREE( pTemp );
1362                 pTemp = NULL;
1363         }
1364
1365         if ( ( szTypeValue = ( char * )realloc( szTypeValue, ( total += 2 ) ) ) == NULL )
1366         {
1367                 VDATA_TRACE_END
1368                 return NULL;
1369         }
1370
1371         strncat( szTypeValue, ":", 2 );
1372
1373         len = 0;
1374
1375         if(strcmp(pType, pszMsgTypeList[6]) != 0)       {
1376                 for ( i = 0; i < pTypeObj->valueCount; i++ ) {
1377
1378                         if(pTypeObj->pszValue[i] != NULL)
1379                         len += strlen( pTypeObj->pszValue[i] );
1380                 }
1381         }
1382         else
1383                 len += biLen;
1384
1385
1386         for ( i = 0; i < pTypeObj->valueCount; i++ ) {
1387
1388                 if ( i == 0 )
1389                 {
1390                         if ( ( pEncode = ( char * )malloc( len+20 ) ) == NULL )
1391                         {
1392                                 VFREE(szTypeValue);
1393                                 VDATA_TRACE_END
1394                                 return NULL;
1395                         }
1396
1397                         memset( pEncode, '\0', len+20 );
1398
1399                         if(strcmp(pType, pszMsgTypeList[6]) != 0)
1400                         {
1401                                 strncat( pEncode, pTypeObj->pszValue[i], 20 );
1402                                 _VEscape(pEncode);
1403                         }
1404                         else
1405                                 memcpy(pEncode, pTypeObj->pszValue[i], biLen);
1406                 }
1407                 else
1408                 {
1409                         char    buf[1000];
1410                         strncpy( buf, pTypeObj->pszValue[i], 999 );
1411                         _VEscape( buf );
1412                         strcat( pEncode, ";" );
1413                         strcat( pEncode, buf );
1414                 }
1415         }
1416
1417         if(strcmp(pType, pszMsgTypeList[6]) != 0)       {
1418                 if (pEncode) {
1419                         strcat( pEncode, "\0\0" );
1420                         len = strlen( pEncode );
1421                 }
1422         }
1423         else {
1424                 len = biLen;
1425         }
1426
1427         if ( enc & pMsgEncList[2].flag ) {
1428                 if((pRes = (char *)malloc(len * 6 + 10)) == NULL) {
1429                         VFREE(pEncode);
1430                         VFREE(szTypeValue);
1431                         VDATA_TRACE_END
1432                         return NULL;
1433                 }
1434                 _VQPEncode( pRes, pEncode );
1435                 VFREE(pEncode);
1436                         }
1437         else if(enc & pMsgEncList[1].flag )
1438         {
1439                 if((pRes = (char *)malloc((len * 8 / 6) + 48)) == NULL)
1440                 {
1441                         VFREE(pEncode);
1442                         VFREE(szTypeValue);
1443                         VDATA_TRACE_END
1444                         return NULL;
1445                 }
1446
1447                 memset( pRes, '\0', ( ( len * 8 / 6 ) + 48 ) );
1448                 _VB64Encode( pRes, pEncode, biLen );
1449                 VDATA_TRACE(  "Origin Size: %d, Allocated Size %d, Coverted Size: %d\n", biLen, ( len * 8 / 6 ) + 48, strlen(pRes));
1450                 VFREE(pEncode);
1451         }
1452         else
1453         {
1454                 if((pRes = (char *)malloc(len+30)) == NULL)
1455                 {
1456                         VFREE(pEncode);
1457                         VFREE(szTypeValue);
1458                         VDATA_TRACE_END
1459                         return NULL;
1460                 }
1461                 memset( pRes, '\0', ( len + 30 ) );
1462                 memcpy( pRes, pEncode, len );
1463                 VFREE(pEncode);
1464         }
1465
1466         if((pRes = (char *)realloc(pRes, strlen(pRes) + 3)) == NULL)
1467         {
1468                 VFREE(pEncode);
1469                 VFREE(szTypeValue);
1470                 VDATA_TRACE_END
1471                 return NULL;
1472         }
1473         strncat( pRes, "\r\n", strlen(pRes) + 2);
1474
1475         len = strlen( pRes );
1476
1477         if ((szTypeValue = (char *)realloc(szTypeValue, (total += (len+3)))) == NULL) {
1478                 VFREE(pEncode);
1479                 VFREE(pRes);
1480                 VDATA_TRACE_END
1481                 return NULL;
1482         }
1483
1484         strncat(szTypeValue, pRes, total - 1);
1485
1486         if(strcmp(pType, pszMsgTypeList[6]) != 0) {
1487                 _VRLSpace( szTypeValue );
1488                 _VRTSpace( szTypeValue );
1489         }
1490
1491         VFREE(pRes);
1492
1493         VDATA_TRACE_END
1494         return szTypeValue;
1495 }
1496
1497 /**
1498  * __VMsgParamEncode() Parameter Encoding.
1499  *
1500  * @param               pTypeObj                Data which will be encoded
1501  * @param               pEnc                            Name of the type
1502  */
1503 char *
1504 __VMsgParamEncode(VObject* pTypeObj, int* pEnc)
1505 {
1506         VDATA_TRACE_BEGINE
1507         int i = 0;
1508         int len = 0;
1509         int sNum = 0;
1510         int shift = 0;
1511         bool bSupported;
1512         char* szParam = NULL;
1513         VParam* pTemp = NULL;
1514         ValueObj*       pList = NULL;
1515
1516         /** Paramter initialize. */
1517         pTemp = pTypeObj->pParam;
1518
1519         /** Momory Allocation for parameter string. */
1520         if(pTemp != NULL) {
1521                 if ((szParam = (char*)malloc(len+=2)) == NULL)
1522                 {
1523                         VDATA_TRACE_END
1524                         return NULL;
1525                 }
1526                 memset(szParam, 0x00, 2);
1527         }
1528
1529         /** appending pamaters. */
1530         while(true) {
1531
1532                 if(pTemp == NULL) break;
1533
1534                 bSupported = false;
1535
1536                 /** Expand szParam string. For appending.*/
1537                 if((szParam = (char *)realloc(szParam, len += 15)) == NULL)
1538                 {
1539                         VDATA_TRACE_END
1540                         return NULL;
1541                 }
1542
1543                 /** appending paramter name. */
1544                 strcat( szParam, ";" );
1545                 if(pTemp->parameter != VMSG_PARAM_TYPE) {
1546                         strcat( szParam, pszMsgParamList[pTemp->parameter] );
1547                         strcat( szParam, "=" );
1548                 }
1549
1550                 /** Set Parameter Value name. */
1551                 switch ( pTemp->parameter )
1552                 {
1553                         case VMSG_PARAM_ENCODING:
1554                                 *pEnc = pMsgEncList[pTemp->paramValue].flag;
1555                                 shift = VMSG_ENCODE_PARAM_NUM;
1556                                 pList = pMsgEncList; bSupported = true;
1557                                 break;
1558                         case VMSG_PARAM_TYPE:
1559                                 shift = VMSG_TYPE_PARAM_NUM;
1560                                 pList = pMsgTypeList; bSupported = true;
1561                                 break;
1562                         case VMSG_PARAM_VALUE:
1563                                 shift = VMSG_VALUE_PARAM_NUM;
1564                                 pList = pMsgValueList; bSupported = true;
1565                                 break;
1566                         case VMSG_PARAM_CHARSET:
1567                                 shift = VMSG_CHARSET_PARAM_NUM;
1568                                 pList = pMsgCharsetList; bSupported = true;
1569                                 break;
1570                         default:
1571                                 if ( ( szParam = ( char* )realloc( szParam, 5 ) ) == NULL )
1572                                 {
1573                                         VDATA_TRACE_END
1574                                         return NULL;
1575                                 }
1576                                 strcat( szParam, "NONE" );
1577                 }
1578
1579                 /** exchage parameter value's to string.*/
1580                 if(bSupported == true) {
1581
1582                         for(i = 0, sNum = 0x00000001; i < shift; i++) {
1583
1584                                 if(pList[pTemp->paramValue].flag & sNum) {
1585                                         if((szParam = (char *)realloc(szParam, ( len += (strlen(pList[i].szName) + 2)))) == NULL)
1586                                         {
1587                                                 VDATA_TRACE_END
1588                                                 return NULL;
1589                                         }
1590
1591                                         strcat( szParam, pList[i].szName );
1592                                         strcat( szParam, "; " );
1593                                 }
1594
1595                                 sNum <<= 1;
1596                         }
1597                 }
1598
1599                 /** remove semicolon from tail. */
1600                 for(i = strlen( szParam ); i > 0 ; i--) {
1601
1602                         if ( szParam[i] == ' ' && szParam[i-1] == ';' ) {
1603                                 szParam[i-1] = '\0';
1604                                 break;
1605                         }
1606                 }
1607
1608                 if ( pTemp->pNext != NULL )
1609                         pTemp = pTemp->pNext;
1610                 else
1611                         break;
1612         }
1613         VDATA_TRACE_END
1614         return szParam;
1615 }
1616
1617 SLPAPI bool
1618 vmsg_free_vtree_memory(VTree * pTree)
1619 {
1620         VDATA_TRACE_BEGINE
1621         if(pTree == NULL)
1622         {
1623                 VDATA_TRACE_END
1624                 return false;
1625         }
1626         VDATA_TRACE_END
1627         return __VMsgFreeVTreeMemory(pTree);
1628 }