vmenv.h 21.6 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739
/*****************************************************************************
*  Copyright Statement:
*  --------------------
*  This software is protected by Copyright and the information contained
*  herein is confidential. The software may not be copied and the information
*  contained herein may not be used or disclosed except with the written
*  permission of MediaTek Inc. (C) 2005
*
*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
*
*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/

/*****************************************************************************
 *
 * Filename:
 * ---------
 * 
 *
 * Project:
 * --------
 * MAUI
 *
 * Description:
 * ------------
 * 
 *
 * Author:
 * -------
 * 
 *
 *============================================================================
 *             HISTORY
 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
 *------------------------------------------------------------------------------
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 *
 *------------------------------------------------------------------------------
 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
 *============================================================================
 ****************************************************************************/
#ifndef __VM_ENV__
#define __VM_ENV__

#ifdef __cplusplus
extern "C" {
#endif

#include "vmswitch.h"

#include "vmsys.h"
#include "vmdl.h"
#include "vmpromng.h"
#include "vmloader.h"

typedef enum {
	MRE_EVT_START_SUCCESS = 0,	/** succeed to start application async **/		    
    MRE_EVT_START_ASM_READY,    /**<ASM内存分配成功,MRE启动成功。                              */         
	MRE_EVT_START_INTERNEL_ERROR,		/**<系统在启动过程中内部失败。									*/
	MRE_EVT_QUIT							/**<MRE 即将退出的消息。 												*/
} VAM_START_MRE_EVT;

typedef void (*vm_mre_evt_cb_t)(VAM_START_MRE_EVT evt);
typedef void (*vm_mre_app_evt_cb_t)(VMUWSTR fileName, VAM_START_MRE_EVT evt);

#define VM_VLC_START_SUCCESS					(0)
#define VM_VLC_ASYN_ALLOC_ASM					(1)
#define VM_VLC_MASS_STORAGE					(-1)
#define VM_VLC_MEDIA_BUFFER_ALLOC_ERROR		(-2)
#define VM_VLC_INTERNEL_ERROR					(-3)
#define VM_VLC_NOT_ENOUGH_MEMORY            (-4)


#define VM_START_APP_NORMAL              0
#define VM_START_APP_EXIT_PARENT         1
#define VM_START_APP_RESTART_PARENT      2
#define VM_START_APP_NO_SELECT_POPUP     4
#define VM_START_APP_INSTALL             8
#define VM_FLAG_DIS_WLAN_PERFER (0X80000000)

/**
 * 启动MRE 环境,但是不会注册Pen, Keyboard的消息处理也不会
 * 创建MRE 的SCREEN。但关于SCREEN有一个例外,在MRE使用ASM
 * 内存并且内存没有分配到的时候,ASM Framework可能会有自己
 * 的Popup Screen。如果MRE环境已经启动则调用本函数不会有任何
 * 的处理,并且返回启动成功。
 * 
 * @param[in]					state 当前没有用到,默认为0。
 * @return					启动MRE是否成功的返回值。
 * @retval					VM_VLC_START_SUCCESS 启动成功。
 * @retval					VM_VLC_ASYN_ALLOC_ASM ASM没有分配到
 *							系统将异步释放掉其它占用ASM的应用。
 * @retval					VM_VLC_MASS_STOREAGE 手机处在存储模式,MRE启动失败。
 * @retval					VM_VLC_MEDIA_BUFFER_ALLOC_ERROR MRE申请media buffer失败。
 * @retval					VM_VLC_INTERNEL_ERROR MRE内部错误。
 */
VMINT vm_vam_load_core(vm_mre_evt_cb_t vam_cb);

/**
 * @name vm_execute函数的返回值
 * @{
 */
/**
 * 成功启动了指定应用。
 */
#define VM_EXECUTE_APP_SUCCESS					(0)

/**
 * 指定应用为非法的应用程序。
 */
#define VM_EXECUTE_APP_ILLEGAL					(-1)

/**
 * 没有足够的内存启动应用。
 */
#define VM_EXECUTE_APP_NOT_ENOUGH_MEMORY		(-2)

/**
 * 启动栈已满。
 */
#define VM_EXECUTE_APP_CALL_STACK_FULL			(-3)

/**
 * 启动内核内部错误,包括IO读取错误等。
 */
#define VM_EXECUTE_INTERNAL_ERROR				(-4)

/**
 * 应用程序运行参数与平台参数不匹配。
 */
#define VM_EXECUTE_PLATFORM_PARAM_DISMATCH		(-5)

/**
 * 应用程序超过有效期。
 */
#define VM_EXECUTE_TIMESTAMP_ERROR				(-6)

/**
 * 是黑名单的应用不能启动。
 */
#define VM_EXECUTE_BANNED_APP					(-7)

/**
 * 应用程序的IMSI号与平台的IMSI不匹配,启动失败。
 */
#define VM_EXECUTE_IMSI_DISMATCH					(-8)

/**
 * 应用程序使用的证书过期。
 */
#define VM_EXECUTE_CERT_OVERDUE					(-9)

/**
 * 在MRE目录下文件超过5000个则返回该错误码。
 */
#define VM_EXECUTE_EXCEED_FILE_IN_MRE_DIRECTORY (-10)

/**
 * 系统没有足够的内存启动该应用。如果退出所有的应用也不能启动该
 * 应用。
 */
#define VM_EXECUTE_SYS_NOT_ENOUGH_MEMORY		(-11)

/* */
#define VM_EXECUTE_SYS_ASYN_ASM     (-12)

#define VM_EXECUTE_SYS_NOT_SUPPORT_VP   (-13)

#define VM_EXECUTE_ONLY_ONE_FOREGROUND   (-14)

#define VM_EXECUTE_MAX_APP_NUM_REACHED   (-15)

#define VM_EXECUTE_VERSION_NOT_MATCH    (-16)
/**@} */

/**
 * 启动应用程序。如果应用启动成功,MRE 会创建MRE 的SCREEN,
 * 失败则不会创建。如果该文件已经被启动,则MRE会直接把
 * 该应用调度到前台。
 * 
 * @param[in]				filename 需要启动的文件名称,需要包含的路径。
 * @return				是否成功启动了应用程序的返回值。
 * @retval				VM_EXECUTE_APP_SUCCESS 启动应用程序成功。
 * @retval				VM_EXECUTE_APP_ILLEGAL 非法的应用程序。
 * @retval				VM_EXECUTE_APP_NOT_ENOUGH_MEMORY 没有足够的内存启动应用程序。
 * @retval				VM_EXECUTE_APP_CALL_STACK_FULL 调用堆栈已满。
 * @retval				VM_EXECUTE_INTERNAL_ERROR 启动内核内部错误。
 * @retval				VM_EXECUTE_PLATFORM_PARAM_DISMATCH 平台参数不匹配。
 * @retval				VM_EXECUTE_TIMESTAMP_ERROR 应用程序超过有效期。
 * @retval				VM_EXECUTE_BANNED_APP 是黑名单的应用不能启动。
 * @retval				VM_EXECUTE_IMSI_DISMATCH 应用程序的IMSI号与平台的IMSI不匹配,启动失败。
 * @retval				VM_EXECUTE_CERT_OVERDUE 应用程序使用的证书过期。
 * @retval				VM_EXECUTE_EXCEED_FILE_IN_MRE_DIRECTORY MRE目录下文件超过5000个返回该错误码。
 */
VMINT vm_execute(VMWSTR filename, vm_mre_app_evt_cb_t vam_cb);

/**
 * 启动预加载的应用程序。如果应用启动成功,MRE 会创建MRE 的SCREEN,
 * 失败则不会创建。如果该文件已经被启动,则MRE会直接把
 * 该应用调度到前台。
 * 
 * @param[in]				filename 需要启动的文件名称,需要包含的路径。
 * @return				是否成功启动了应用程序的返回值。
 * @retval				VM_EXECUTE_APP_SUCCESS 启动应用程序成功。
 * @retval				VM_EXECUTE_APP_ILLEGAL 非法的应用程序。
 * @retval				VM_EXECUTE_APP_NOT_ENOUGH_MEMORY 没有足够的内存启动应用程序。
 * @retval				VM_EXECUTE_APP_CALL_STACK_FULL 调用堆栈已满。
 * @retval				VM_EXECUTE_INTERNAL_ERROR 启动内核内部错误。
 * @retval				VM_EXECUTE_PLATFORM_PARAM_DISMATCH 平台参数不匹配。
 * @retval				VM_EXECUTE_TIMESTAMP_ERROR 应用程序超过有效期。
 * @retval				VM_EXECUTE_BANNED_APP 是黑名单的应用不能启动。
 * @retval				VM_EXECUTE_IMSI_DISMATCH 应用程序的IMSI号与平台的IMSI不匹配,启动失败。
 * @retval				VM_EXECUTE_CERT_OVERDUE 应用程序使用的证书过期。
 * @retval				VM_EXECUTE_EXCEED_FILE_IN_MRE_DIRECTORY MRE目录下文件超过5000个返回该错误码。
 */
VMINT vm_execute_preload_app(vm_preload_app_info_t *preload_info, vm_mre_app_evt_cb_t vam_cb);

/**
 * 已经运行的应用程序信息。
 */
typedef struct vm_running_app_info_t
{
	VMWCHAR app_filename[MAX_APP_NAME_LEN + 1];		/**< 当前已经运行的应用程序的名称。*/
	VMINT app_id;										/**< 应用程序编号。							*/
	VMUINT alloc_mem;									/**< 内存占用量,单位为KB。 				*/
}vm_running_app_info_t;

/**
 * 启动应用程序,如果返回VM_EXECUTE_APP_NOT_ENOUGH_MEMORY,则会向bg_app_infos与
 * app_info_num指针的位置写入当前正在后台运行的进程列表及个数。
 * 在不使用bg_app_infos所指向内存时,必须调用vm_release_app_running_infos释放
 * exist_app_infos所指向的对象。
 *
 * @code 
 * VMINT ret = VM_EXECUTE_APP_SUCCESS;
 * VMUINT infos_num = 0;
 * vm_running_app_info_t* infos = NULL;
 * 
 * ret = vm_execute_app((VMWSTR)L"c:\\mre\\game.vxp", &infos, &infos_num);
 * switch (ret)
 * {
 * case VM_EXECUTE_APP_NOT_ENOUGH_MEMORY:
 *     // 提示用户退出应用可以启动新应用。
 *     if (infos != NULL)
 *     {
 *         vm_release_app_running_infos(infos);
 *     }
 *     break;
 * case VM_EXECUTE_SYS_NOT_ENOUGH_MEMORY:
 *     // 提示应用无法运行,内存需求过大。
 *     break;
 * case VM_EXECUTE_TIMESTAMP_ERROR:
 *     ......
 * }
 * @endcode
 * 
 * @param[in]				filename 需要启动的文件名称。
 * @param[out]			bg_app_infos 正在后台运行的应用程序的信息。
 * @param[out]			app_info_num 正在后台运行的应用程序信息个数。
 * @param[in]				filename 需要启动的文件名称,需要包含的路径。
 * 
 * @return				是否成功启动了应用程序的返回值。
 * @retval				VM_EXECUTE_APP_SUCCESS 启动应用程序成功。
 * @retval				VM_EXECUTE_APP_ILLEGAL 非法的应用程序。
 * @retval				VM_EXECUTE_APP_NOT_ENOUGH_MEMORY 没有足够的内存启动应用程序。
 * @retval				VM_EXECUTE_APP_CALL_STACK_FULL 调用堆栈已满。
 * @retval				VM_EXECUTE_INTERNAL_ERROR 启动内核内部错误。
 * @retval				VM_EXECUTE_PLATFORM_PARAM_DISMATCH 平台参数不匹配。
 * @retval				VM_EXECUTE_TIMESTAMP_ERROR 应用程序超过有效期。
 * @retval				VM_EXECUTE_BANNED_APP 是黑名单的应用不能启动。
 * @retval				VM_EXECUTE_IMSI_DISMATCH 应用程序的IMSI号与平台的IMSI不匹配,启动失败。
 * @retval				VM_EXECUTE_CERT_OVERDUE 应用程序使用的证书过期。
 * @retval				VM_EXECUTE_EXCEED_FILE_IN_MRE_DIRECTORY MRE目录下文件超过5000个返回该错误码。
 * @retval				VM_EXECUTE_SYS_NOT_ENOUGH_MEMORY 应用所需要内存过大,系统无法满足需求。
 * 
 * @see					vm_release_app_running_infos
 */
VMINT vm_execute_app(VMWSTR filename, vm_running_app_info_t** bg_app_infos, VMUINT* app_info_num);

/**
 * 释放由调用vm_execute_ext产生出来的正在运行的应用程序信息。
 *
 * @param[in]				app_infos 应用程序信息。
 * @see					vm_execute_ext
 */
void vm_release_app_running_infos(vm_running_app_info_t* app_infos);

/**
 * 终止应用程序成功。
 */
#define VM_TERMINATE_SUCCESS					(0)

/**
 * 参数出错。
 */
#define VM_TERMINATE_ERROR_PARAM				(-1)

/**
 * 需要终止的应用程序不存在。
 */
#define VM_TERMINATE_NOT_EXISTS				(-2)

/**
 * 停止在前台运行的进程。
 */
#define VM_TERMINATE_ERROR_STATUS			(-3)

/**
 * 终止后台运行的应用程序。
 * 
 * @code
 * vm_terminate_bg_app((VMWSTR)L"c:\\mre\\game.vxp");
 * @endocde
 * @param[in]					filename 需要终止的应用程序的名称,是绝对路径。
 * @return					是否成功终止应用程序的标志。
 * @retval					VM_TERMINATE_SUCCESS 成功终止应用程序。
 * @retval					VM_TERMINATE_ERROR_PARAM 参数错误。
 * @retval					VM_TERMINATE_NOT_EXISTS 指定的应用程序不存在。
 * @retval					VM_TERMINATE_ERROR_STATUS 停止的应用程序正在前台运行,终止应用
 *							程序失败。
 */
VMINT vm_terminate_bg_app(VMWSTR filename);

/**
 * 如果MRE里有应用正在运行,调用本函数将没有作用;
 * 如果MRE没有运行调用本函数也没有任何作用;
 * 如果MRE没有应用正在运行且MRE环境启动成功,
 * 调用本函数会将MRE环境退出。
 */
void vm_vam_unload_core(void);

void vm_vam_unload_core_by_asm(void);

#define		VAM_IN_USE					1
#define		VAM_OUT_OF_USE			0

/*
 * 通知内核VAM的状态
 *  
 * @param[in] 			VAM_IN_USE 表示VAM正在运行,VAM_OUT_OF_USE 表示VAM已经退出。
*/
void vm_vam_set_vam_state(VMINT state);

/**
 * VAM 向MRE申请内存。
 * 
 * @param[in]				size 需要申请的内存数。
 * @return				NULL 分配失败,否则为内存的首地址。
 */
void* vm_vam_malloc(VMINT size);

/**
 * VAM 释放内存时调用。
 * 
 * @param[in]				p 需要释放的内存首地址。  
 */
void vm_vam_free(void* p);


/*
 * 判断应用程序是否在运行。
 *
 * @param[in]				vxp_filename	应用的文件名,必须是全路径。
 * @return				如果应用程序正在运行,返回1,否则返回0。
 */
VMINT vm_vam_app_is_running(VMWSTR vxp_filename);

#define		LOAD_VAM_RES_PARAM_ERROR				(-1)
#define		LOAD_VAM_RES_FAIL							(-2)
#define		LOAD_VAM_RES_INSUFFICIENT_BUF			(-3)

/*
 * 从文件中装载指定的资源
 *  
 * @param[in]					filename 文件的名称。
 * @param[in] 				res_name 资源名称。
 * @param[out]				res_size 接受资源长度的指针。
 * @param[in]					cache_buf 外部缓存 。
 * @param[in] 				cache_size 外部缓存的长度。
 * @return					加载资源成功返回0, 否则返回负数的错误码。
*/
int vm_vam_load_resource_from_file( short * filename, char * res_name, int * res_size, char * cache_buf, int cache_size );

/**
 * 语言类型。
 */
typedef enum LANGUAGE_TYPE{
	ENG = 0,		/**<英语。			*/
	CHS,		/**<简体中文。 	*/
	CHT			/**<繁体中文。 	*/
}LANGUAGE_TYPE;

/**
* 从配置文件中获取GIF数据至内存。详见unpackGIFZM.h和unpackGIFZM3.c
* 
* @param[in] 					gifzm 数据源。
* @param[out] 				data_buf 接受数据的缓存。
* @param[out] 				data_len 传回GIF数据长度。
* @return					成功时返回0,否则返回负数的错误码。
*							当data_buf为空时,该接口查询所需要获取的数据的大小,有data_len返回。
*							当data_buf不为空时,data_len的初始值为data_buf的大小, 
*							接口执行完,data_len返回数据的实际大小。
*/
VMINT vm_vam_get_gif_data(VMUINT8 *gifzm, VMUINT8 ** data_buf, VMINT *data_len);

/**
* 从配置文件中获取字符串数据至内存。详见unpackGIFZM.h和unpackGIFZM3.c
* 
* @param[in]					gifzm 数据源。
* @param[out]				data_buf 接受数据的缓存。
* @param[in]					lan 语言类型。
* @param[out]				data_len 传回string数据长度。
* @param[out]				font 传回字符串字体大小。
* @param[out]               data_size 字模size
* @return					成功时返回0,否则返回负数的错误码。
*							当data_buf为空时,该接口查询所需要获取的数据的大小,有data_len返回。
*							当data_buf不为空时,data_len的初始值为data_buf的大小, 
*							接口执行完,data_len返回数据的实际大小。
*/
VMINT vm_vam_get_string_data(VMUINT8* gifzm, VMUINT8** data_buf, LANGUAGE_TYPE lan, VMINT* data_len, VMINT* font, VMINT *data_size);


/**
 * 获取像素宽度
 * @param[in] zimo_buf 指向字模数据的指针 
 * @param[in] str_len 字符个数 
 *
 * @return  字模的像素宽度 
 */
VMINT vm_vam_measure_zimo_string(VMUINT8 *zimo_buf, VMINT str_len);

/**
 * 检查临时文件是否合法及下载进度。
 * 
 * @param[in]					filename 临时文件的名称。
 * @param[out]				progress	接受进度数据的指针。 
 * @return					如果临时文件合法返回0, 否则返回负数的错误码。
 *							返回0时, progress指向的数据代表进度(0 - 100)。
*/
VMINT vm_vam_check_tempfile(VMSHORT * filename, VMINT* progress);

/**
 * 取消下载。
 */
void vm_vam_cancel_download(void);

/**
 * 设置SIM卡。
 *
 * @param[in]					choose_index 选中的SIM卡编号,1为SIM卡一,2为SIM卡二。
 * @return                                	设置成功返回0,否则返回-1
 */
VMINT vm_vam_set_sim_card(VMINT choose_index);

/**
 * 设置网络类型。
 *
 * @param[in]					net_type 网络类型,1为GPRS,2为WIFI。
 * @return                             	设置成功返回0,否则返回-1
 */
VMINT vm_vam_set_net_type(VMINT net_type);

/**
 * 得到当前已经设置的卡的索引。
 * 
 * @param[out]				得到卡索引的指针。
 * @return					是否成功得到SIM卡索引的标志。
 * @retval					TRUE(1) 成功得到SIM卡索引。
 * @retval					FALSE(0) 失败,没有得到SIM卡索引。
 */
VMINT vm_vam_get_sim_card(VMINT* sim_index);

/**
 * 得到当前网络类型。
 * 
 * @param[out]				得到网络类型的指针。
 * @return					是否成功得到网络类型的标志。
 * @retval					TRUE(1) 成功得到网络类型。
 * @retval					FALSE(0) 失败,没有得到网络类型。
 */
VMINT vm_vam_get_net_type(VMINT* net_type);

/**
 * 设置网络连接点。
 * 
 * @param[in] 				point_type 连接点类型,1为CMWAP,2为CMNET。
 * @return                             	设置成功返回0,否则返回-1
 */
//VMINT vm_vam_set_connection_point(VMINT point_type);

/**
 * 验证应用程序是否有效
 * 
 * @param[in]					vxp_filename VXP文件的文件名,带全路径
 * @return					应用程序验证通过,返回0, 否则返回负数的错误码。参考vmcerter.h
 */
VMINT vm_vam_app_is_valid(VMWSTR vxp_filename);

#define  VAM_DL_DONE             	1  //整个VXP下载完成
#define  VAM_DL_OK               		0  //成功
#define  VAM_DL_ERR              		-1 //失败
#define  VAM_DL_NET_ERR         	-2 //网络错误         
#define  VAM_DL_SAVE_ERR         	-3 //保存错误
#define  VAM_DL_APP_NOT_EXIST  -4 //应用不存在
#define  VAM_DL_SPACE_FULL       	-5 //空间不足
#define  VAM_DL_OTHER_ERR        	-6 //其它错误
#define  VAM_DL_FILE_NOT_EXIST -7 //文件不存在
#define  VAM_DL_IO_ERROR        -8 //I/O 操作错误


/**
 * 发起应用下载* @param download_app_cb     下载应用回调
 *                             @param nResult  下载结果:VAM_DL_OK = 成功发送请求或者成功下载完一块
 *                                                      VAM_DL_DONE = 全部下载完成
 *                                                      VAM_DL_ERR等错误码
                                                        VAM_DL_IO_ERROR 文件操作错误
														VAM_DL_SPACE_FULL 空间不足
 *                             @param nPercent nResult不为VAM_DL_DONE时表示下载进度,否则表示存储盘符
 *
 * @param[in] 			    download_app_cb     下载应用回调。
 * @param[out] 				nResult  下载结果:VAM_DL_OK = 成功发送请求或者成功下载完一块
 *                                            VAM_DL_DONE = 全部下载完成
 *                                            VAM_DL_ERR等错误码
 * @paramp[out] 			nPercent nResult不为VAM_DL_DONE时表示下载进度,否则表示存储盘符
 * @param[in] 				pszVersionID 应用版本号ID。
 * @param[in]				pszFileName 文件名。
 * @param[in] 				nBlockSize 下载块大小。
 * @return                  成功发起下载请求返回VAM_DL_OK, 否则返回错误码(VAM_DL_ERR, VAM_DL_IO_ERROR, VAM_DL_SPACE_FULL)。
 */
VMINT vm_vam_download_app(void(*download_app_cb)(VMINT nResult, VMINT nPercent), 
	VMUINT32 nAppID/*VMWSTR pszVersionID*/, VMWSTR pszFileName, VMINT nBlockSize);


#define			VMM_RET_NO_SYSC_CDR								(0)
#define			VAM_RET_NVRAM_NEED_FOR_SYNC_CDR				(1)
#define			VAM_RET_TIME_NEED_FOR_SYNC_CDR					(2)

/**
 * 是否需要同步计费。
 * 
 * @return					是否需要更新的标志。
 * @retval					VMM_RET_NO_SYSC_CDR 表示不需要更新。
 * @retval					VAM_RET_NVRAM_NEED_FOR_SYNC_CDR NVRAM满需要更新。
 * @retval					VAM_RET_TIME_NEED_FOR_SYNC_CDR 时间到需要更新。
 */
VMINT vm_vam_is_sync_cdr(void);

/**
 * 向服务器同步计费请求。
 * 
 * @param[in/out]				sync_cb 成功或失败的回调,参数nResult为0表示成功否则为失败。
 * @return					成功发起同步返回VAM_DL_OK, 否则返回错误码(VAM_DL_ERR, VAM_DL_IO_ERROR)。
 */
VMINT vm_vam_sync_cdr(void (*sync_cb)(VMINT nResult));

/**
 * 得到用户的余额。
 * 
 * @param[out]				user_balance 用户余额。
 * @return					0 表示已经得到余额,否则为失败。
 */
VMINT vm_vam_get_user_balance(VMUINT* user_balance);

/**
  * 取消计费更新
  */
void vm_vam_cancel_sync_cdr(void);
/**
 * 注册申请释放空间函数
 *
 * @param mem_calloc_cb   申请空间接口
 * @param mem_free_cb     释放空间接口
 */
void vm_am_pre_download_app(void *(* mem_calloc_cb)(int size), void (* mem_free_cb)(void *ptr));


/**
 * 获取应用版本号
 *
 * @param[in] 文件名
 * @param[out] 得到的版本号
 *
 * @return 获取成功返回VAM_DL_OK,否则返回VAM_DL_ERR
 */
VMINT vm_get_app_version(VMWSTR filename, VMINT * version);

/*
 * 检测有无更新的请求
 *
 * @return  如果有应用程序的更新请求,返回更新请求的version id,否则返回null。
 */
VMWSTR vm_vam_need_update(void);

/*
 * 清除更新,当vam获取更新请求的version id后,应该通知mre清除更新的version id。
 */
void vm_vam_clean_update(void);

/**
 * 退出所有进程,退出MRE环境。如果MRE没有启动则调用本函数
 * 将不会有任何作用。
 */
void vm_exit(void);
void vm_exit_ex(VMINT param);

/**
 * ASM 回收内存的操作的callback函数。
 */
void vm_exit_by_asm(void);

/**
 * 获得内置程序首地址列表。
 * 
 * @param[out]			app_array_ptr 内置程序首地址列表的指针。
 * @param[out]			app_array_len_ptr 内置程序个数。
 */
void vm_get_buildin_app_array(VMINT** app_array_ptr, VMINT* app_array_len_ptr);


/*****************************************************************************
 * FUNCTION
 *  vm_vam_get_core_asm_size
 * DESCRIPTION
 *  Get the ASM size of MRE core by byte.
 * RETURNS
 *  ASM size of MRE core by byte.
 *****************************************************************************/
VMUINT vm_vam_get_core_asm_size(void);


extern void vm_start_app(const VMWCHAR* filepath, VMINT parent_app_handle, VMINT flag);
extern void vm_start_app_with_para(const VMWCHAR* filepath, VMINT parent_app_handle, VMINT is_parent_exit,void* parameter,VMINT parameter_size);


/**
 * 交换字符串字节顺序
 *
 * @param 				pwDesData 交换后的字串
 * @param 				pwSrcData 源数据
 */
extern void vm_vam_string_byte_switch(VMWCHAR * pwDesData, VMWCHAR * pwSrcData);

extern VMINT vm_vam_get_app_version(VMWSTR filename, VMCHAR * appversion);

extern VMINT vm_vam_parse_time_data(vm_time_t *timestamp, char* str_time);

extern VMINT vm_vam_get_today_from_2000(void);

#ifdef __cplusplus
}
#endif
#endif