This commit is contained in:
zengming
2019-03-21 13:34:44 +08:00
parent 6ebbfbad7d
commit de08533a79
37 changed files with 1519 additions and 0 deletions

Binary file not shown.

Binary file not shown.

BIN
ARM汇编.pdf Normal file

Binary file not shown.

BIN
C语言程序设计.pdf Normal file

Binary file not shown.

BIN
IRAM_STEP_3.rar Normal file

Binary file not shown.

BIN
IRAM_STEP_4.rar Normal file

Binary file not shown.

BIN
IRAM_STEP_5_Doc.rar Normal file

Binary file not shown.

BIN
J2ME&GAME.pdf Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,152 @@
EXT<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ǰ8<EFBFBD>ֽڣ<EFBFBD>
0~3<><33>mr_table <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ָ<><D6B8>
4~7<><37>mr_c_function_st ָ<><D6B8>
8~11<31><31>mr_c_function_load <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
typedef struct _mrc_extChunk_st
{
int32 check;
MR_LOAD_C_FUNCTION init_func; //mr_c_function_load <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
/**
* (void* P, int32 code, uint8* input, int32 input_len, uint8** output, int32* output_len);
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* p<><70>global_p_buf ָ<><D6B8>
* code<64><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD>
* 0<><30>mrc_init 1<><31>mrc_event 2<><32>
*/
MR_C_FUNCTION event; //mr_helper <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
uint8* code_buf; //ext<78>ڴ<EFBFBD><DAB4><EFBFBD>ַ
int32 code_len; //ext<78><74><EFBFBD><EFBFBD>
uint8* var_buf; //RW<52>ε<EFBFBD>ַ
int32 var_len; //RW<52>γ<EFBFBD><CEB3><EFBFBD>
mr_c_function_st* global_p_buf; //mr_c_function_st <20><><EFBFBD><EFBFBD>ַ
int32 global_p_len; //mr_c_function_st <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int32 timer;
mrc_extMainSendAppMsg_t sendAppEvent;
mr_table *extMrTable;
#ifdef MRC_PLUGIN
MR_C_FUNCTION_EX eventEx;
#endif
int32 isPause;/*1: pause ״̬0:<3A><><EFBFBD><EFBFBD>״̬*/
} mrc_extChunk_st;
typedef struct _mr_c_function_st
{
uint8* start_of_ER_RW;
uint32 ER_RW_Length;
//uint8* old_start_of_ER_RW;
int32 ext_type;
mrc_extChunk_st * mrc_extChunk;
//stack shell 2008-2-28
int32 stack;
//
} mr_c_function_st;
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̣<EFBFBD>
<09>ȵ<EFBFBD><C8B5>ã<EFBFBD>int32 mr_c_function_load (int32 code)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mr_table <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ʱ<EFBFBD>գ<EFBFBD>
[<5B><>ַ]-4λ<34><CEBB><EFBFBD><EFBFBD> mr_c_function_stָ<74>
[<5B><>ַ]-8λ<38><CEBB><EFBFBD>Ǻ<EFBFBD><C7BA><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>
mr_c_function_load<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˺<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>Ϊ0x64<EFBFBD><EFBFBD>mr_c_function_new<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mr_c_function_new<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
EXT<EFBFBD><EFBFBD>RW<EFBFBD>Σ<EFBFBD><EFBFBD><EFBFBD>EXTȫ<EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ䣬EXT<EFBFBD>ڲ<EFBFBD><EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BinSys<EFBFBD><EFBFBD>
# /* ---- SKY_PLATFORM start ---- */
ifeq ($(strip $(DSM_SUPPORT)),TRUE)
# sky add ,compile switch macro
COM_DEFS += __MMI_DSM_NEW__
ifeq ($(strip $(PLATFORM)),MT6235B)
COMPOBJS += plutommi\mmi\mythroad\mythroadlib\dsm35.lib
endif
ifneq ($(strip $(PLATFORM)),MT6235B)
COMPOBJS += plutommi\mmi\mythroad\mythroadlib\dsm.lib
endif
COMPOBJS += plutommi\mmi\mythroad\mythroadlib\mmidsm111.lib
<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD> dsm.lib <20><> mmidsm111.lib
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կ<EFBFBD><EFBFBD><EFBFBD>Ŀǰ<EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>dsm.lib<69><62><EFBFBD><EFBFBD>mythroad.obj
<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>API<EFBFBD>ӿ<EFBFBD> <20><><EFBFBD>ں<EFBFBD><DABA><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD>ýӿ<EFBFBD> <20><EFBFBD><EEB5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD>ҿ<EFBFBD><EFBFBD><EFBFBD> Ŀǰ<C4BF><C7B0><EFBFBD><EFBFBD>Ҫ<EFBFBD>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>к<EFBFBD><D0BA><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>д
<EFBFBD><EFBFBD>װNDK<EFBFBD>ײ㺯<EFBFBD><EFBFBD>
Ȼ<EFBFBD><EFBFBD> <20>ѵ<EFBFBD><D1B5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>EXT֮ǰҪ<C7B0><D2AA>ʲô<CAB2><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mrc_initǰ<74><C7B0><EFBFBD><EFBFBD>ʲô<CAB2><C3B4><EFBFBD><EFBFBD>ô<EFBFBD><C3B4>mrc_init
mr_c_function_load <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַΪext<78>ڴ<EFBFBD><DAB4><EFBFBD>ַ + 8<><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ext<78>ڲ<EFBFBD>λ<EFBFBD>ù̶<C3B9>
eleqian<EFBFBD><EFBFBD>
<EFBFBD>ţ<EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƱȽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>
<EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mrc_init mrc_event mrc_pause <20>Ⱥ<EFBFBD><C8BA><EFBFBD> <20>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD><EFBFBD> ext<78>ļ<EFBFBD><C4BC><EFBFBD>λ<EFBFBD>ù̶<C3B9><CCB6>Ķ
<EFBFBD>޾<EFBFBD>ʱ<EFBFBD><EFBFBD><timespace_2011@qq.com> 23:35:01
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
eleqian(1003082820) 23:35:20
ext<EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>ʹ֮<EFBFBD><EFBFBD><edroid@foxmail.com> 23:35:44
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD>ҵ<EFBFBD> mrc_init <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD>޾<EFBFBD>ʱ<EFBFBD><EFBFBD><timespace_2011@qq.com> 23:35:48
<EFBFBD><EFBFBD><EFBFBD>Ƕ<EFBFBD><EFBFBD><EFBFBD>mr_helper<EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>mr_helper <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>Ϣ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
eleqian(1003082820) 23:35:51
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>ʹ֮<EFBFBD><EFBFBD><edroid@foxmail.com> 1:22:58
mr_table <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MTK<54><4B><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ɵģ<C9B5><C4A3><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>´ο<C2B4><CEBF><EFBFBD><EFBFBD>Ż<EFBFBD><C5BB>ָ<EFBFBD>
BinSys(123077083) 1:23:03
mr_c_function_load ȷʵ<C8B7>ǹ̶<C7B9><CCB6>ģ<EFBFBD><C4A3><EFBFBD>Ϊһ<CEAA><D2BB>elf<6C>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>fromelf<6C><66><EFBFBD><EFBFBD>ò<EFBFBD><C3B2>ֻʣ<D6BB>´<EFBFBD><C2B4><EFBFBD><EFBFBD>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD><EFBFBD>entry<72><79>0<EFBFBD>ֽڴ<D6BD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊʲôƫ<C3B4><C6AB><EFBFBD><EFBFBD>8<EFBFBD><38><EFBFBD>Ͳ<EFBFBD>֪<EFBFBD><D6AA><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>ʹ֮<EFBFBD><EFBFBD><edroid@foxmail.com> 1:24:09
<EFBFBD><EFBFBD>Ϊ ǰ<><C7B0> 8<><38><EFBFBD>ֽ<EFBFBD> <20>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>洢 mr_table <20><> mr_c_function_st <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
first<EFBFBD><EFBFBD>entry<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>Ϊ mr_c_function_load<61><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2B2BB>armccָ<63><D6B8><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>armlink<6E>IJ<EFBFBD><C4B2><EFBFBD>
armlink
<09><><EFBFBD><EFBFBD>
-rwpi
-ro
-base0x80000
-remove
-first mr_c_function_load
-entry mr_c_function_load
-o
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\mr_cfunction.fmt
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\mr_sfw_mrc_mrc_win.o
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\mr_src_helloworld.o
C:\SKYMOBI\SDS4CPv1.0\Compiler\mr_helper.lib(mr_helper.o)
C:\SKYMOBI\SDS4CPv1.0\Compiler\mr_helper.lib(mr_helper_s.o)
C:\SKYMOBI\SDS4CPv1.0\Compiler\mr_helperexf.lib
C:\SKYMOBI\SDS4CPv1.0\Compiler\mr_helperexb.lib
<EFBFBD><EFBFBD>ͬ<EFBFBD>
ext<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>mr_table<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ext<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣ<EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ext<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>mr_internal_table<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>"dealtimer"
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õĶ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>start.mr<6D><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD>dealtimer
dealtimer <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD><C7B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>start.mr<6D><EFBFBD><EFB6A8>
*(mr_c_function_load - 0x4) + 0xC <20><><EFBFBD><EFBFBD>extģ<74><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֪<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>

Binary file not shown.

BIN
Mythroad API V1.05.chm Normal file

Binary file not shown.

BIN
MythroadSDK.exe Normal file

Binary file not shown.

View File

@@ -1,2 +1,18 @@
# mrpdev # mrpdev
老硬盘里翻出来的代码斯凯mrp的开发文档、SDK、相关资料等 老硬盘里翻出来的代码斯凯mrp的开发文档、SDK、相关资料等
# 冒泡开放平台功能机业务停止运营
因冒泡开放平台团队业务调整2013年8月1日起冒泡开放平台功能机业务将停止新应用的审核
2013年10月1日平台将正式停止运营。并于2013年10月30日前完成收益结算此次调整仅针对冒泡开放平台业务不涉及任何斯凯其他功能机业务。给您造成的困扰万分抱歉。冒泡开放平台智能机业务继续运营感谢您对冒泡开放平台业务的支持祝您生活愉快。
# other
很遗憾mrp时代结束这么多年后才终于将这些资料公开可能我是最后一个保留了完整的开发技术的人留着将来考古用
幸运的是我们在安卓手机上有了mrp模拟器以及与mrp开发极其相似的mpc
这里面有基础的API和当时未开放的高级API接口文档以及当时比较高级的自定义字库、扩展内存等技术的资料
青春如同奔流的江河,一去不回来不及道别

Binary file not shown.

Binary file not shown.

BIN
SKYENGINE API.chm Normal file

Binary file not shown.

BIN
Sky_SDK_API_0.1.3.chm Normal file

Binary file not shown.

BIN
VS2005.pdf Normal file

Binary file not shown.

Binary file not shown.

BIN
e_mrp.exe Normal file

Binary file not shown.

BIN
gzip.exe Normal file

Binary file not shown.

BIN
mrc_base_i.7z Normal file

Binary file not shown.

742
mrc_network_http.c Normal file
View File

@@ -0,0 +1,742 @@
#include "mrc_base.h"
#include "mrc_network.h"
#include "mrc_network_http.h"
#include "stdarg.h"//for va_list
typedef DWORD HBLOCKHEAP;
#ifndef MAX_HOSTNAME_LEN
#define MAX_HOSTNAME_LEN 112
#endif
#define HTTP_RESPONSECODE_OFFSET 9
static const char sHttpMethods[][5] =
{
"GET",
"HEAD",
"POST"
};
typedef struct HttpRequest_T
{
HTTPMETHOD method;
struct HttpRequest_T* next;
}HTTPREQUEST, *PHTTPREQUEST;
typedef struct HttpData
{
//http event handler
FN_SOCKEVENT fnEvent;
//available when header responsed
uint32 responsecode;
int32 contentLength;
//cache the http header
uint32 hdrsize;
char header[HTTP_HEADER_SIZE];
//http request list on this connection
PHTTPREQUEST requests_head;
PHTTPREQUEST requests_tail;
}HTTPDATA, *PHTTPDATA;
static HTTPDATA sHttpDataPool[SOCKET_MAX_COUNT];
static HBLOCKHEAP sHttpDataHeap;
HBLOCKHEAP BlockHeap_Initialize(VOID* buffer, int buffersize, int blocksize);
VOID BlockHeap_Free(HBLOCKHEAP* pHeap, VOID* pBlock);
VOID* BlockHeap_Alloc(HBLOCKHEAP* pHeap);
static int mrc_i_isNum(uint8 code);
static int mrc_i_isNumText(char * code);
static uint32 inet_addr(const char* cp);
static char* tolower(char* str);
static PCSTR host(PCSTR url, uint16* port, uint16 def);
static uint16 get_port(PCSTR url);
static char* tolower(char* str)
{
int i = 0;
for(; str[i]; i++)
{
if(str[i] >= 'A' && str[i] <= 'Z')
str[i] += 'a' - 'A';
}
return str;
}
static PCSTR host(PCSTR url, uint16* port, uint16 def)
{
static char host[MAX_HOSTNAME_LEN];
int i, j;
if(port) *port = def;
for(i = j = 0; url[i]; i++)
{
if(url[i] == ':' && url[i+1] == '/' && url[i+2] == '/')
{
i+=3;
while(url[i] && url[i]!=':' && url[i]!='/')
{
host[j++] = url[i++];
}
if(port && url[i] == ':')
{
*port = atoi(url+i+1);
}
break;
}
}
host[j] = 0;
return host;
}
static uint16 get_port(PCSTR url)
{
uint16 port = 0;
char* p = NULL;
if( NULL == url )
{
return 80;
}
p = mrc_strstr(url,"://");
if( p )
{
p += 3;
}
else
{
p = (char*)url;
}
p = mrc_strstr(p,":");
if( p )
{
port = atoi(p+1);
}
else
{
port = 80;
}
if( port == 0 )
{
port = 80;
}
return port;
}
static int mrc_i_isNum(uint8 code)
{
if ((code>47 && code<58) || (code=='.') || (code==':') )
{
return 1;
}
return 0;
}
static int mrc_i_isNumText(char * code)
{
char * tempCode = code;
while(*tempCode)
{
if( mrc_i_isNum(*tempCode) ==0 )
{
return 0;
}
tempCode++;
}
return 1;
}
static uint32 inet_addr(const char* cp)
{
uint32 ip = 0;
int i;
char ipstr[100];
mrc_memset(ipstr, 0, 100);
for(i = 0; i < 4; i++)
{
ip <<= 8;
ip |= atoi(cp);
if(i < 3 && (NULL == (cp = mrc_strchr(cp, '.'))))
return 0;
cp++;
}
return ip;
}
#ifdef HTTP_HEAD_METHOD_ENABLE
static BOOL mrc_Http_Request_Add(PHTTPDATA pHttpData, HTTPMETHOD method)
{
PHTTPREQUEST request;
//append to the request list, must not failed
if( NULL == (request = (PHTTPREQUEST)malloc(sizeof(HTTPREQUEST))))
{
return FALSE;
}
//add to the request list
request->method = method;
request->next = NULL;
if(pHttpData->requests_head == NULL)
pHttpData->requests_head = request;
else
pHttpData->requests_tail->next = request;
pHttpData->requests_tail = request;
return TRUE;
}
static void mrc_Http_Request_Clear(PHTTPDATA pHttpData)
{
PHTTPREQUEST request;
while(pHttpData->requests_head)
{
request = pHttpData->requests_head;
pHttpData->requests_head = request->next;
free(request);
}
}
static void mrc_Http_Request_Pop(PHTTPDATA pHttpData)
{
PHTTPREQUEST request = pHttpData->requests_head;
if(request)
{
pHttpData->requests_head = request->next;
if(pHttpData->requests_head == NULL)
pHttpData->requests_tail = NULL;
free(request);
}
}
#endif
#define FIND_HTTP_HEADER_ENDING(pHttpData) \
(pHttpData->hdrsize >= 4 \
&& pHttpData->header[pHttpData->hdrsize - 4] == '\r' \
&& pHttpData->header[pHttpData->hdrsize - 3] == '\n' \
&& pHttpData->header[pHttpData->hdrsize - 2] == '\r' \
&& pHttpData->header[pHttpData->hdrsize -1] == '\n')
#define RESET_HTTP_RESPONSE_INFO(pHttpData) \
pHttpData->contentLength = 0; \
pHttpData->hdrsize = 0; \
pHttpData->responsecode = 0
#ifdef HTTP_HEAD_METHOD_ENABLE
#define HANDLE_RESPONSE_END(socket, pHttpData) \
if(pHttpData->fnEvent(socket, HTTPEVT_RESPONSE_END, NULL)) \
return 1; \
RESET_HTTP_RESPONSE_INFO(pHttpData); \
Http_Request_Pop(pHttpData)
#else
#define HANDLE_RESPONSE_END(socket, pHttpData) \
if(pHttpData->fnEvent(socket, HTTPEVT_RESPONSE_END, NULL)) \
return 1; \
RESET_HTTP_RESPONSE_INFO(pHttpData)
#endif
static DWORD mrc_Http_HandleResponseData(PSOCKET socket, PSOCKEVTDATA data)
{
int32 i;
PCSTR len;
PHTTPDATA pHttpData = (PHTTPDATA)socket->userdata;
if(pHttpData->responsecode == 0)
{
//receive the http header
for(i = 0; i < data->size; i++)
{
//check the http header buffer, when this happen user should adjust the value of HTTP_HEADER_SIZE
//todo
if(pHttpData->hdrsize >= HTTP_HEADER_SIZE)
{
mrc_Http_Close(socket, HTTPEVT_ERROR);
return 1;
}
//copy the byte and continue when not found the http header ending
pHttpData->header[pHttpData->hdrsize++] = data->buffer[i];
if(!FIND_HTTP_HEADER_ENDING(pHttpData))
continue;
//find the header
pHttpData->header[pHttpData->hdrsize] = 0;
//SGL_LOG("header.txt", pHttpData->header, pHttpData->hdrsize);
tolower(pHttpData->header);
//maybe socket been closed, user do not want to deal the data left
//Note:changed by huangsunbo 2008-10-20,respond head data
//todo
if(pHttpData->fnEvent(socket, HTTPEVT_RESPONSE_HEADER, data))
return 1;
#ifdef HTTP_HEAD_METHOD_ENABLE
if(pHttpData->requests_head->method == HEAD)
{
HANDLE_RESPONSE_END(socket, pHttpData);
}else{
#endif
if(NULL == (len = mrc_Http_GetResponseField(socket, HTTP_FIELD_CONTENTLENGTH)) )
{
//can not support the response do not have the field "Content-Length"
mrc_Http_Close(socket, HTTPEVT_ERROR);
return 1;
}
pHttpData->contentLength = atoi(len);
pHttpData->responsecode = mrc_Http_GetResponseCode(socket);
if(pHttpData->contentLength == 0)
{
HANDLE_RESPONSE_END(socket, pHttpData);
}
#ifdef HTTP_HEAD_METHOD_ENABLE
}
#endif
i++; //i is the bytes has been copyed, so should add 1
break;
}
data->buffer += i;
data->size -= i;
}
if(data->size > 0)
{
int32 notifybytes = MIN(pHttpData->contentLength, data->size);
int32 remainbytes = data->size - pHttpData->contentLength;
data->size = notifybytes;
//maybe socket been closed, user do not want to deal the data left
if(pHttpData->fnEvent(socket, HTTPEVT_RESPONSE_DATA, data))
return 1;
pHttpData->contentLength -= notifybytes;
data->size -= notifybytes;
data->buffer += notifybytes;
data->size = remainbytes;
if(pHttpData->contentLength == 0)
{
HANDLE_RESPONSE_END(socket, pHttpData);
}
if(data->size > 0)
return mrc_Http_HandleResponseData(socket, data);
}
return 0;
}
static void mrc_Http_Destroy(PSOCKET socket)
{
PHTTPDATA pHttpData = (PHTTPDATA)socket->userdata;
#ifdef HTTP_HEAD_METHOD_ENABLE
Http_Request_Clear(pHttpData);
#endif
BlockHeap_Free(&sHttpDataHeap, pHttpData);
}
static DWORD mrc_Http_HandleSocketEvents(PSOCKET socket, DWORD evt, PSOCKEVTDATA data)
{
PHTTPDATA pHttpData = (PHTTPDATA)socket->userdata;
FN_SOCKEVENT fnEvent = pHttpData->fnEvent;
switch(evt)
{
case SOCKEVT_CONNECTED:
{
return fnEvent(socket, evt, data);
}
case SOCKEVT_RECVDATA:
{
/*
* HTTPEVT_RESPONSE_HEADER sent to the user after get the http response header
* HTTPEVT_RESPONSE_DATA sent to the user when receive the http data,
* HTTPEVT_RESPONSE_END sent to the user when request finished
*/
return mrc_Http_HandleResponseData(socket, data);
}
case SOCKEVT_CONNECTFAILED:
case SOCKEVT_ERROR:
case SOCKEVT_CLOSED:
{
mrc_Http_Destroy(socket);
return fnEvent(socket, evt, data);
}
}
return 0;
}
void mrc_Http_Initialize(void)
{
sHttpDataHeap = BlockHeap_Initialize(sHttpDataPool, sizeof(sHttpDataPool), sizeof(HTTPDATA));
}
void mrc_Http_Terminate(void)
{
//DO NOTHING
}
/*
֧<EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ
<EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD> 2010-03-30
*/
PSOCKET mrc_Http_OpenEx(char*ip_string,uint16 port,FN_SOCKEVENT fnEvent)
{
PHTTPDATA pHttpData;
PSOCKET socket;
if(!ip_string)
{
return NULL;
}
if( NULL == (pHttpData = BlockHeap_Alloc(&sHttpDataHeap)))
{
return NULL;
}
pHttpData->fnEvent = fnEvent;
pHttpData->contentLength = 0;
pHttpData->responsecode = 0;
pHttpData->hdrsize = 0;
#ifdef HTTP_HEAD_METHOD_ENABLE
pHttpData->requests_head = NULL;
pHttpData->requests_tail = NULL;
#endif
if(NULL == (socket = mrc_Socket_Create(SOCKPROTO_TCP,
mrc_Http_HandleSocketEvents, (DWORD)pHttpData)))
{
BlockHeap_Free(&sHttpDataHeap, pHttpData);
return NULL;
}
if(mrc_Socket_ConnectNoProxy(socket, ip_string,port,1))
{
return socket;
}
else
{
mrc_Socket_Close(socket,SOCKEVT_CLOSED);
BlockHeap_Free(&sHttpDataHeap, pHttpData);
return NULL;
}
}
BOOL mrc_Http_Close(PSOCKET socket, DWORD evt)
{
return mrc_Socket_Close(socket, evt);
}
PCSTR mrc_Http_FormatHeader(uint32* size, HTTPMETHOD method, PCSTR url,...)
{
static char header[HTTP_HEADER_SIZE];
uint32 hdrsize;
PCSTR field, value;
va_list args;
va_start(args, url);
//format the request header line
sprintf(header, HTTP_HEADER_FORMAT, sHttpMethods[method], url);
hdrsize = strlen(header);
//parse other fields and values
while(NULL != (field = va_arg(args, PCSTR)))
{
//field name
strcpy(header + hdrsize, field);
hdrsize += strlen(field);
header[hdrsize++] = ':';
header[hdrsize++] = ' ';//add space by huangsunbo
//field value
value = va_arg(args, PCSTR);
strcpy(header + hdrsize, value);
hdrsize += strlen(value);
//field ending
header[hdrsize++] = '\r';
header[hdrsize++] = '\n';
}
//append the http header ending
header[hdrsize++] = '\r';
header[hdrsize++] = '\n';
va_end(args);
*size = hdrsize;
return header;
}
BOOL mrc_Http_Send(PSOCKET socket, HTTPMETHOD method, PBYTE buffer, uint32 size)
{
#ifdef HTTP_HEAD_METHOD_ENABLE
PHTTPDATA pHttpData = (PHTTPDATA)socket->userdata;
#endif
if(!mrc_Socket_Send(socket, buffer, size))
return FALSE;
#ifdef HTTP_HEAD_METHOD_ENABLE
//append to the request list, must not failed
if(!mrc_Http_Request_Add(pHttpData, method))
{
mrc_Http_Close(socket, HTTPEVT_ERROR);
return FALSE;
}
#endif
return TRUE;
}
BOOL mrc_Http_GetEx(PSOCKET socket, PCSTR url, uint32 from, uint32 to)
{
PCSTR pHeader, pHost;
uint32 hdrsize;
uint16 port;
uint8 host_buf[128] = {0};
pHost = host(url,NULL,80);
port = get_port(url);
//<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>Ͷ˿<CDB6>
/*<2A><><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>*/
sprintf((char*)host_buf,"%s:%d",pHost,port);
//<1>CP<43><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD>http<74><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>Ҫͨ<D2AA><CDA8>sky<6B><79>proxy<78><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>
//<2F><><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>sky<6B><79>server<65><72>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>
//<2F><><EFBFBD><EFBFBD>Ҫ<EFBFBD>޸<EFBFBD>url
//<2><3E><><EFBFBD><EFBFBD>cmwap<61><70><EFBFBD>ŷ<EFBFBD>ʽ<EFBFBD><CABD>ʱ<EFBFBD><CAB1>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫͨ<D2AA><CDA8>cmcc<63><63><EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><D8BD><EFBFBD>ת<EFBFBD><D7AA>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫͨ<D2AA><CDA8>Host<73><74>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͷ˿<CDB6><CBBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><D8BD><EFBFBD>ת<EFBFBD><D7AA>
if(from > 0)
{
char tmp[24] = {0};
if(to > from)
sprintf(tmp, "bytes=%d-%d", from, to);
else
sprintf(tmp, "bytes=%d-", from);
pHeader = mrc_Http_FormatHeader(&hdrsize, GET, url,
HTTP_FIELD_HOST, host_buf,
HTTP_FIELD_UA, HTTP_VALUE_UA,
HTTP_FIELD_ACCEPT, HTTP_VALUE_ACCEPT,
HTTP_FIELD_CONTENTTYPE, HTTP_VALUE_CONTENTTYPE,
HTTP_FIELD_CONNECTION, HTTP_VALUE_CONNECTION_KEEPALIVE,
HTTP_FIELD_PROXYCONNECTION, HTTP_VALUE_CONNECTION_KEEPALIVE,
HTTP_FIELD_RANGE, tmp,
NULL); //do not forget the NULL ending
}
else
{
/**/
pHeader = mrc_Http_FormatHeader(&hdrsize, GET, url,
HTTP_FIELD_HOST, host_buf,
HTTP_FIELD_UA, HTTP_VALUE_UA,
HTTP_FIELD_ACCEPT, HTTP_VALUE_ACCEPT,
HTTP_FIELD_CONTENTTYPE, HTTP_VALUE_CONTENTTYPE,
HTTP_FIELD_CONNECTION, HTTP_VALUE_CONNECTION_KEEPALIVE,
HTTP_FIELD_PROXYCONNECTION, HTTP_VALUE_CONNECTION_KEEPALIVE,
NULL); //do not forget the NULL ending
}
return mrc_Http_Send(socket, GET, (PBYTE)pHeader, hdrsize);
}
#ifdef HTTP_HEAD_METHOD_ENABLE
BOOL mrc_Http_Head(PSOCKET socket, PCSTR url)
{
PCSTR pHeader, pHost;
uint32 hdrsize;
pHost = host(url, NULL, 0);
pHeader = mrc_Http_FormatHeader(&hdrsize, HEAD, url,
HTTP_FIELD_HOST, pHost,
HTTP_FIELD_UA, HTTP_VALUE_UA,
HTTP_FIELD_ACCEPT, HTTP_VALUE_ACCEPT,
HTTP_FIELD_CONTENTTYPE, HTTP_VALUE_CONTENTTYPE,
HTTP_FIELD_CONNECTION, HTTP_VALUE_CONNECTION_KEEPALIVE,
HTTP_FIELD_PROXYCONNECTION, HTTP_VALUE_CONNECTION_KEEPALIVE,
NULL); //do not forget the NULL ending
return mrc_Http_Send(socket, HEAD, (PBYTE)pHeader, hdrsize);
}
#endif
BOOL mrc_Http_PostEx(PSOCKET socket, PCSTR url, PCSTR buffer, uint32 size)
{
PCSTR pHeader, pHost;
uint32 hdrsize;
char tmp[12]={0};
uint8 host_buf[128] = {0};
uint16 port;
pHost = host(url,NULL,80);
port = get_port(url);
//<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>Ͷ˿<CDB6>
sprintf((char*)host_buf,"%s:%d",pHost,port);
sprintf(tmp, "%d", size);
pHeader = mrc_Http_FormatHeader(&hdrsize, POST, url,
HTTP_FIELD_HOST, host_buf,
HTTP_FIELD_UA, HTTP_VALUE_UA,
HTTP_FIELD_ACCEPT, HTTP_VALUE_ACCEPT,
HTTP_FIELD_CONTENTTYPE, HTTP_VALUE_CONTENTTYPE,
HTTP_FIELD_CONNECTION, HTTP_VALUE_CONNECTION_KEEPALIVE,
HTTP_FIELD_PROXYCONNECTION, HTTP_VALUE_CONNECTION_KEEPALIVE,
HTTP_FIELD_CONTENTLENGTH, tmp,
NULL); //do not forget the NULL ending
//check that socket have enough buffer
if(socket->begin + SOCKET_SENDBUFFER_SIZE - socket->end < hdrsize + size)
{
return FALSE;
}
//if return false that cause is not about send buffer
if(!mrc_Http_Send(socket, POST, (PBYTE)pHeader, hdrsize))
return FALSE;
//if return false that cause is not about send buffer
if(size > 0 && !mrc_Socket_Send(socket, (PBYTE)buffer, size))
return FALSE;
return TRUE;
}
uint32 mrc_Http_GetResponseCode(PSOCKET socket)
{
PHTTPDATA pHttpData = (PHTTPDATA) socket->userdata;
return atoi(pHttpData->header + HTTP_RESPONSECODE_OFFSET);
}
int mrc_Http_GetResponseHead(PSOCKET socket,uint8** buf, uint32* size)
{
PHTTPDATA pHttpData = NULL;
if( NULL == socket || NULL == buf || size == NULL ||
socket->sd < 0 || socket->protocol != SOCKPROTO_TCP )
{
buf = NULL;
*size = 0;
return MR_FAILED;
}
pHttpData = (PHTTPDATA) socket->userdata;
*buf = (uint8*)pHttpData->header;
*size = pHttpData->hdrsize;
return MR_SUCCESS;
}
PCSTR mrc_Http_GetResponseField(PSOCKET socket, PCSTR field)
{
static char value[HTTP_FIELDVALUE_SIZE];
int32 i = 0;
PCSTR pTmp;
PHTTPDATA pHttpData = (PHTTPDATA)socket->userdata;
strncpy(value, field, HTTP_FIELDVALUE_SIZE-1);
value[HTTP_FIELDVALUE_SIZE-1] = 0;
tolower(value);
if( NULL == (pTmp = mrc_strstr(pHttpData->header, value)))
return NULL;
pTmp += mrc_strlen(field);
while(*pTmp == ' ' || *pTmp == ':')
pTmp++;
while(!(pTmp[i] == '\r' && pTmp[i+1] == '\n'))
{
value[i] = pTmp[i];
i++;
}
value[i] = 0;
return value;
}
HBLOCKHEAP BlockHeap_Initialize(VOID* buffer, int buffersize, int blocksize)
{
PBYTE pBlock = (PBYTE)buffer;
//SGL_ASSERT(0 == MOD(buffersize, blocksize) && 0 == MOD(blocksize, 4));
for(buffersize -= blocksize; pBlock - (PBYTE)buffer < buffersize ; pBlock += blocksize)
*(Uint8**)pBlock = pBlock + blocksize;
*(PBYTE*)pBlock = NULL;
return (HBLOCKHEAP)buffer;
}
VOID* BlockHeap_Alloc(HBLOCKHEAP* pHeap)
{
VOID* pBlock = (VOID*)(*pHeap);
if(pBlock)
*pHeap =(HBLOCKHEAP)( *(PBYTE*)(*pHeap) );
return pBlock;
}
VOID BlockHeap_Free(HBLOCKHEAP* pHeap, VOID* pBlock)
{
*(PBYTE*)pBlock = (PBYTE)(*pHeap);
*pHeap = (HBLOCKHEAP)pBlock;
}

171
mrc_network_http.h Normal file
View File

@@ -0,0 +1,171 @@
#ifndef _MRC_NETWORK_HTTP_H_
#define _MRC_NETWORK_HTTP_H_
#include "mrc_base.h"
#include "mrc_network.h"
/*
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǻ<EFBFBD><EFBFBD><EFBFBD>HTTPЭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿڣ<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>HTTP<EFBFBD>ǻ<EFBFBD><EFBFBD><EFBFBD>socket<EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD>ض<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϤHTTPЭ<EFBFBD>鼰socket<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><EFBFBD>ֵ<EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD>freesky.51mrp.com<6F><6D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
/**
* \brief max http header size in bytes
*/
#ifndef HTTP_HEADER_SIZE
#define HTTP_HEADER_SIZE 1024
#endif
/**
* \brief max field value length in response header
*/
#ifndef HTTP_FIELDVALUE_SIZE
#define HTTP_FIELDVALUE_SIZE 128
#endif
/**
* \brief supported http method
*/
typedef enum HTTP_METHOD_E
{
GET = 0, //"GET"
HEAD, //"HEAD"
POST//"POST"
}HTTPMETHOD;
/**
* \brief http events
*/
typedef enum HTTP_EVENT_E
{
/** sent when http socket connected */
HTTPEVT_CONNECTED = SOCKEVT_CONNECTED,
/** sent when http socket connect failed */
HTTPEVT_CONNECTFAILED = SOCKEVT_CONNECTFAILED,
/** sent when error happen */
HTTPEVT_ERROR = SOCKEVT_ERROR,
/** sent when socket closed */
HTTPEVT_CLOSED = SOCKEVT_CLOSED,
/** sent when get the http response header */
HTTPEVT_RESPONSE_HEADER,
/** sent when get the http response data */
HTTPEVT_RESPONSE_DATA,
/** sent when one http response finished */
HTTPEVT_RESPONSE_END
}HTTPEVENT;
/**
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:mrc_Http_Initialize
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: HTTP<54><50>ʼ<EFBFBD><CABC>
* <20><><EFBFBD><EFBFBD>ֵ:<3A><>
*/
VOID mrc_Http_Initialize(VOID);
/**
* \brief Terminate the http module.
*
* When the http module is not needed by the application anymore, this function could
* be called to release the http module.
*
* \sa Socket_Initialize
*/
VOID mrc_Http_Terminate(VOID);
/**
* \brief Open a socket for http.
*
* \param ip_string the server ip address or host name,just like 192.168.0.1 or http://www.163.com
* only the authorization user can use this function
* \param port the server port number
* \param fnEvent the http events handler
* \return http socket handle on success, NULL otherwise
*/
PSOCKET mrc_Http_OpenEx(char*ip_string,uint16 port,FN_SOCKEVENT fnEvent);
/**
* \brief Close a http socket .
*
* \param socket the socket handle
* \param evt the close event
* \return TRUE on success, FALSE otherwise
*/
BOOL mrc_Http_Close(PSOCKET socket, DWORD evt);
/**
* \brief Send http get command.
*
* \param socket the http socket handle
* \param url the request url
* \param from the start position of the content
* \param to the end position of the content
* \return TRUE on success, FALSE otherwise
*/
BOOL mrc_Http_GetEx(PSOCKET socket, PCSTR url, uint32 from, uint32 to);
/**
* \brief Post the http data.
*
* \param socket the http socket
* \param url the request url
* \param buffer the post data
* \param size post data size
* \return TRUE on success, FALSE otherwise
*/
BOOL mrc_Http_PostEx(PSOCKET socket, PCSTR url, PCSTR buffer, uint32 size);
/**
* \brief Get the http response code.
*
* This can only be called after receive the EVENT HTTPEVT_RESPONSE_HEADER event.
* otherwise undefined.
*
* \param socket the http socket handle
* \return the response code
*/
uint32 mrc_Http_GetResponseCode(PSOCKET socket);
/**
* \brief Get the field value of the http header
*
* This can only be called after receive the EVENT HTTPEVT_RESPONSE_HEADER event.
* otherwise undefined.
*
* \param socket the http socket handle
* \param field the http header field
* \return the value of the filed on success, NULL otherwise
*/
PCSTR mrc_Http_GetResponseField(PSOCKET socket, PCSTR field);
/**
* \brief Get http response head content
*
*\param socket the http socket handle
* \param buffer the http head point
*\param size the http head data length
* \return the value of MR_SUCCESS on success, MR_FAILED otherwise
*/
int mrc_Http_GetResponseHead(PSOCKET socket,uint8** buf, uint32* size);
#endif

Binary file not shown.

BIN
sky_fontmaker_v2.0.0616.rar Normal file

Binary file not shown.

414
smp_stylebox.c Normal file
View File

@@ -0,0 +1,414 @@
#include "smp_stylebox.h"
#include "smp.h"
#include "bmp.h"
#include "mrc_exb.h"
#include "types.h"
#define SMP_BOX_RECOVER_SPEED 3 //<2F><><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ļ<EFBFBD><C4BC>ٶȣ<D9B6><C8A3><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F>Σ<EFBFBD>
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD>Ϣ*/
typedef struct SMP_ItemData{
int index; //<2F><><EFBFBD><EFBFBD>
int width; //<2F><><EFBFBD><EFBFBD>
int height; //<2F>߶<EFBFBD>
HBITMAP hBmp; //ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>
}SMPITEMDATA, *PSMPITEMDATA;
/*<2A><><EFBFBD>ڽṹ<DABD><E1B9B9>*/
typedef struct
{
int num; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BOOL focus; //<2F>Ƿ<EFBFBD><C7B7>н<EFBFBD><D0BD><EFBFBD>
int onewidth; //һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int oneheight;
int rows; //<2F><>
int stand; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int topmagin; //<2F><><EFBFBD><EFBFBD>ʱ <20><><EFBFBD><EFBFBD><EFBFBD>߾<EFBFBD>
int leftmagin;
int highlight; //<2F>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD>
}BOXDATA, *PBOXDATA;
#define SMP_STYLEBOX_MAX 10
static SMPITEMDATA BoxItem[SMP_STYLEBOX_MAX]; //<2F>Ź<EFBFBD><C5B9><EFBFBD>ÿһ<C3BF><D2BB>
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ*/
VOID SMP_Stylewnd_SetItem(HWND hWnd, const DWORD* bmps, int size)
{
PBOXDATA pBoxData = _GET_WINDATA(hWnd, PBOXDATA);
int i;
if(size>SMP_STYLEBOX_MAX || !bmps)
return;
for (i=0; i<size; i++)
{
BoxItem[i].index = i;
BoxItem[i].hBmp = SGL_LoadBitmap(bmps[i], &BoxItem[i].width, &BoxItem[i].height);
}
pBoxData->num = size;
pBoxData->highlight = 4; //Ĭ<><C4AC><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD>ý<EFBFBD><C3BD><EFBFBD>
pBoxData->onewidth = _WIDTH(hWnd)/3;
pBoxData->oneheight = _HEIGHT(hWnd)/3;
pBoxData->topmagin = 0;
pBoxData->leftmagin = 0;
pBoxData->rows = 3; //Ĭ<><C4AC>3*3 <20>Ź<EFBFBD><C5B9><EFBFBD>
pBoxData->stand = 3;
}
VOID SMP_Update_OneBox(HWND hWnd, int index)
{
int hx, hy; //<2F><><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>꣨hx, hy<68><79>
PBOXDATA pBoxData = _GET_WINDATA(hWnd, PBOXDATA);
hx = _LEFT(hWnd) + pBoxData->onewidth*(index%3);
hy = _TOP(hWnd) + pBoxData->oneheight*(index/3);
if (hy + pBoxData->topmagin >= _TOP(hWnd) && hy+pBoxData->topmagin+pBoxData->highlight <= _TOP(hWnd)+_HEIGHT(hWnd))
{
if (pBoxData->highlight == index)//<2F><><EFBFBD><EFBFBD>
GAL_FillRoundRrct(hx+(pBoxData->onewidth - BoxItem[index].width)/2 + pBoxData->leftmagin-3,
hy+(pBoxData->oneheight - BoxItem[index].height)/2 + pBoxData->topmagin-2,
BoxItem[index].width+6, BoxItem[index].height+4, COLOR_focus);
else
GAL_FillBox(PHYSICALGC, hx, hy, pBoxData->onewidth, pBoxData->oneheight, _BGCOLOR(hWnd));
mrc_bitmapShowEx(BoxItem[index].hBmp,
hx+(pBoxData->onewidth - BoxItem[index].width)/2 + pBoxData->leftmagin,
hy+(pBoxData->oneheight - BoxItem[index].height)/2 + pBoxData->topmagin,
BoxItem[index].width, BoxItem[index].width, BoxItem[index].height, BM_TRANSPARENT, 0, 0);
GAL_FlushRegion(PHYSICALGC, hx + pBoxData->leftmagin, hy + pBoxData->topmagin, pBoxData->onewidth, pBoxData->oneheight);
}
}
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEA3AC>Ҫ<EFBFBD><D2AA>ƽ<EFBFBD><C6BD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD>ʱ<EFBFBD><CAB1>
* û<>в<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD>ˢ<EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD>ػ<EFBFBD>ˢ<EFBFBD><CBA2>
*/
VOID SMP_DrawStyleBox(HWND hWnd)
{
int i, j, index = 0;
int x, y, w, h; //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EAA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int hx, hy; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
PBOXDATA pBoxData = _GET_WINDATA(hWnd, PBOXDATA);
x = _LEFT(hWnd);
y = _TOP(hWnd);
w = _WIDTH(hWnd);
h = _HEIGHT(hWnd);
hy = y;
for (i=0; i<pBoxData->rows; i++)//<2F><>
{
hx = x;
for (j=0; j<pBoxData->stand; j++)//<2F><>
{
if (pBoxData->highlight == index)//<2F><><EFBFBD><EFBFBD>
GAL_FillRoundRrct(hx+(pBoxData->onewidth - BoxItem[index].width)/2 + pBoxData->leftmagin-3,
hy+(pBoxData->oneheight - BoxItem[index].height)/2 + pBoxData->topmagin-2,
BoxItem[index].width+6, BoxItem[index].height+4, COLOR_focus);
mrc_bitmapShowEx(BoxItem[index].hBmp,
hx+(pBoxData->onewidth - BoxItem[index].width)/2 + pBoxData->leftmagin,
hy+(pBoxData->oneheight - BoxItem[index].height)/2 + pBoxData->topmagin,
BoxItem[index].width, BoxItem[index].width, BoxItem[index].height, BM_TRANSPARENT, 0, 0);
hx+=pBoxData->onewidth;
index++;
}
hy+=pBoxData->oneheight;
}
}
/*<2A><><EFBFBD>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD> <20>ڱ<EFBFBD><DAB1><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD>¼<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>(int)lParam<61><6D><EFBFBD>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
int SMP_Box_GetHilightId(HWND hWnd)
{
PBOXDATA pBoxData = _GET_WINDATA(hWnd, PBOXDATA);
return pBoxData->highlight;
}
/*<2A>ɿ<EFBFBD><C9BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭλ<D4AD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ָ<EFBFBD>ԭλ*/
VOID SMP_Box_RecoverLoaction(HWND hWnd)
{
PBOXDATA pBoxData = _GET_WINDATA(hWnd, PBOXDATA);
int i;
//int x_step = 1;
int y_step = 1; //<2F><EFBFBD><E4B5B1><EFBFBD>ٶ<EFBFBD>
if(pBoxData->leftmagin==0 && pBoxData->topmagin==0)
return;
if(pBoxData->topmagin>0)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
for (i=0; i<=pBoxData->topmagin; i++, y_step+=SMP_BOX_RECOVER_SPEED)//<2F><> <20>ٶ<EFBFBD>Ϊ1
{
if(pBoxData->topmagin - y_step<0)
pBoxData->topmagin = 0;
else
pBoxData->topmagin-= y_step;
SGL_TRACE("%d", pBoxData->topmagin);
SGL_UpdateWindow(hWnd);
}
}else if(pBoxData->topmagin<0)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
for(i=0; i>=pBoxData->topmagin; i--, y_step+=SMP_BOX_RECOVER_SPEED)
{
if(pBoxData->topmagin + y_step>0)
pBoxData->topmagin = 0;
else
pBoxData->topmagin+=y_step;
SGL_TRACE("%d", pBoxData->topmagin);
SGL_UpdateWindow(hWnd);
}
}
}
LRESULT SMP_Box_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
PBOXDATA pBoxData = _GET_WINDATA(hWnd, PBOXDATA);
//static int start_x = 0;
static int start_y = 0;
static int click_count = 0;
static int key_step = 0; //<2F><><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><E2BBAC><EFBFBD>ٶ<EFBFBD>
switch(Msg)
{
case WM_CREATE:
{
//request memory and initialize members
pBoxData = (PBOXDATA)SGL_MALLOC(sizeof(BOXDATA));
if(!pBoxData){
SGL_TRACE("%s, %d: memory out\n", __FILE__, __LINE__);
return 1;
}
SGL_MEMSET(pBoxData, 0, sizeof(BOXDATA));
_SET_WINDATA(hWnd, pBoxData);
return 0;
}
case WM_DESTROY:
{
if(pBoxData) SGL_FREE(pBoxData);
return 0;
}
case WM_SHOW:
{
return 0;
}
case WM_PAINT:
{
_BGCOLOR(hWnd) = 0x00ddeeff;
GAL_FillBox(PHYSICALGC, _LEFT(hWnd), _TOP(hWnd), _WIDTH(hWnd), _HEIGHT(hWnd), _BGCOLOR(hWnd));
SMP_DrawStyleBox(hWnd);
return 0;
}
case WM_MOUSEDOWN:
{
int index_x = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD>Ŷ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>(index_x,index_y)
int index_y = 0;
int oldhl = pBoxData->highlight; //<2F>ɸ<EFBFBD><C9B8><EFBFBD>ͼ<EFBFBD><CDBC>
index_x = ((int)wParam)/pBoxData->onewidth;
index_y = ((int)lParam)/pBoxData->oneheight;
pBoxData->highlight = (index_x+3*index_y);
if (oldhl == pBoxData->highlight)
{
click_count ++;
SGL_NotifyParent(hWnd, SMP_BOXI_CLICKED, pBoxData->highlight);
}
else if (oldhl != pBoxData->highlight)//<2F><><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>
{
click_count = 1;
SMP_Update_OneBox(hWnd, oldhl); //ˢ<><CBA2>ͼ<EFBFBD><CDBC>
SMP_Update_OneBox(hWnd, pBoxData->highlight);
SGL_NotifyParent(hWnd, SMP_BOXI_HILICHANGED, pBoxData->highlight);
}
//λ<>ø<EFBFBD>ԭ
if (!pBoxData->leftmagin|| !pBoxData->topmagin)
SMP_Box_RecoverLoaction(hWnd);
//////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>ǰ<EFBFBD><C7B0>Y<EFBFBD><59><EFBFBD><EFBFBD>
start_y = (int)lParam;
return 0;
}
case WM_MOUSEMOVE:
{
//pBoxData->leftmagin = ((int)wParam - start_x);
pBoxData->topmagin = ((int)lParam - start_y);
SGL_UpdateWindow(hWnd);
SGL_NotifyParent(hWnd, SMP_BOXI_MOUSEMOVE, 0);
return 0;
}
case WM_MOUSEUP:
{
int index_x = 0;
int index_y = 0;
int oldhl = pBoxData->highlight;
index_x = ((int)wParam)/pBoxData->onewidth;
index_y = ((int)lParam)/pBoxData->oneheight;
pBoxData->highlight = (index_x+3*index_y);
if (oldhl == pBoxData->highlight)
{
if (click_count == 2)//<2F>ڶ<EFBFBD><DAB6>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿ<EFBFBD>
{
click_count = 1;
SGL_NotifyParent(hWnd, SMP_BOXI_SELECTED, pBoxData->highlight);
}
}else if (oldhl != pBoxData->highlight)//<2F><><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>
{
SMP_Update_OneBox(hWnd, oldhl); //ˢ<><CBA2>ͼ<EFBFBD><CDBC>
SMP_Update_OneBox(hWnd, pBoxData->highlight);
SGL_NotifyParent(hWnd, SMP_BOXI_HILICHANGED, pBoxData->highlight);
}
//λ<>ø<EFBFBD>ԭ
if (!pBoxData->leftmagin|| !pBoxData->topmagin)
SMP_Box_RecoverLoaction(hWnd);
return 0;
}
case WM_KEYDOWN:
case WM_KEYDOWNREPEAT:
{
int oldhl = pBoxData->highlight;
switch(wParam)
{
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>*/
case MR_KEY_UP:
{
if (pBoxData->highlight>2)
pBoxData->highlight-=3;
else
pBoxData->highlight+=6;
SMP_Update_OneBox(hWnd, oldhl); //ˢ<><CBA2>ͼ<EFBFBD><CDBC>
SMP_Update_OneBox(hWnd, pBoxData->highlight);
SGL_NotifyParent(hWnd, SMP_BOXI_HILICHANGED, pBoxData->highlight);
return 1;
}
case MR_KEY_DOWN:
{
if (pBoxData->highlight<6)
pBoxData->highlight+=3;
else
pBoxData->highlight-=6;
SMP_Update_OneBox(hWnd, oldhl); //ˢ<><CBA2>ͼ<EFBFBD><CDBC>
SMP_Update_OneBox(hWnd, pBoxData->highlight);
SGL_NotifyParent(hWnd, SMP_BOXI_HILICHANGED, pBoxData->highlight);
return 1;
}
case MR_KEY_LEFT:
{
if (pBoxData->highlight>0)
pBoxData->highlight--;
else
pBoxData->highlight = 8;
SMP_Update_OneBox(hWnd, oldhl); //ˢ<><CBA2>ͼ<EFBFBD><CDBC>
SMP_Update_OneBox(hWnd, pBoxData->highlight);
SGL_NotifyParent(hWnd, SMP_BOXI_HILICHANGED, pBoxData->highlight);
return 1;
}
case MR_KEY_RIGHT:
{
if (pBoxData->highlight<8)
pBoxData->highlight++;
else
pBoxData->highlight = 0;
SMP_Update_OneBox(hWnd, oldhl); //ˢ<><CBA2>ͼ<EFBFBD><CDBC>
SMP_Update_OneBox(hWnd, pBoxData->highlight);
SGL_NotifyParent(hWnd, SMP_BOXI_HILICHANGED, pBoxData->highlight);
return 1;
}
case MR_KEY_2://<2F><><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><E2A3AC><EFBFBD>ϻ<EFBFBD><CFBB><EFBFBD>
{
if(pBoxData->topmagin>(-_HEIGHT(hWnd))+30)
{
key_step +=5;
pBoxData->topmagin -= key_step;
SGL_UpdateWindow(hWnd);
SGL_NotifyParent(hWnd, SMP_BOXI_MOUSEMOVE, 0);
}
return 1;
}
case MR_KEY_8://<2F><><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><E2A3AC><EFBFBD>»<EFBFBD><C2BB><EFBFBD>
{
if(pBoxData->topmagin<_HEIGHT(hWnd)-30)
{
key_step +=5;
pBoxData->topmagin += key_step;
SGL_UpdateWindow(hWnd);
SGL_NotifyParent(hWnd, SMP_BOXI_MOUSEMOVE, 0);
}
return 1;
}
}
return 0;
}
case WM_KEYUP:
{
/*ѡ<><D1A1>*/
if(wParam == MR_KEY_SELECT)
{
SGL_NotifyParent(hWnd, SMP_BOXI_SELECTED, pBoxData->highlight);
return 1;
}
//λ<>ø<EFBFBD>ԭ
if (!pBoxData->leftmagin|| !pBoxData->topmagin)
SMP_Box_RecoverLoaction(hWnd);
key_step = 0;
}
// case WM_COMMAND:
// {
// WORD id = LOWORD(wParam);
// WORD code = HIWORD(wParam);
// switch(id)
// {
// case WM_COMMAND:
// {
// if (code == WM_COMMAND)
// {
// //
// }
// break;
// }
// }
// return 0;
// }
case WM_SETFOCUS:
case WM_KILLFOCUS:
{
SGL_UpdateWindow(hWnd);
break;
}
}
return 0;
}

24
smp_stylebox.h Normal file
View File

@@ -0,0 +1,24 @@
#ifndef _SMP_STYLEBOX_H
#define _SMP_STYLEBOX_H
#include "window.h"
#define SMP_BOXI_HILICHANGED 0x0001 //<2F><><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>
#define SMP_BOXI_CLICKED 0x0002 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define SMP_BOXI_SELECTED 0x0003 //ѡ<><D1A1>
#define SMP_BOXI_MOUSEMOVE 0x0004 //<2F><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>
/*<2A><><EFBFBD>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
int SMP_Box_GetHilightId(HWND hWnd);
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ*/
VOID SMP_Stylewnd_SetItem(HWND hWnd, const DWORD* bmps, int size);
LRESULT SMP_Box_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
#endif

BIN
字库Demo.7z Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.