锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
鎻愰珮緙栬瘧閫熷害灝濊瘯浜嗗緢澶氭柟娉?
1.涔版洿蹇殑鏈哄櫒
2.鏇存崲緙栬瘧鍣紝vc6榪樻槸鑳戒繚鎸佹渶蹇殑閫熷害錛寁s2008絳夌瓑瓚婃潵瓚婂瀮鍦?br>3.鏇存崲鎿嶄綔緋葷粺 win2003
4.浣跨敤鏈嶅姟鍣ㄧ紪璇戯紝鐢?錛?鍙版満鍣ㄥ崗鍚岃繘鏉ョ紪璇戝伐紼?
浠ヤ笂鍧囦笉鑳借鎴戞湁婊℃剰鐨勬晥鏋?br>閭f渶濂界殑鏂瑰紡灝辨槸璋冩暣鑷繁鐨勪唬鐮佺粨鏋勪簡錛宑緙栬瘧鍣ㄤ負浣曞鑰佺墰鑸悆鍔涳紝灝辨槸鐢變簬c璇█鐏墊椿甯︽潵鐨勯棶棰橈紝涓嶅悓瀵硅薄鏂囦歡鍏寵仈涓嶆褰撳皢澶уぇ澧炲ぇ浜嗙紪璇戞椂闂淬?br>鎵浠ュ湪瀹氫箟宸ョ▼瀵硅薄渚濊禆鍏崇郴鏃訛紝蹇呴』娉ㄦ剰<include> 銆?br>鎴戜竴鑸殑鍋氭硶鏄細
class A,class B, 閭e湪 a.h 涓厛澹版槑 class B,鐒跺悗瀹氫箟涓涓狟*鍗沖彲
鍙湁鍦╝.c鍐呰鐢ㄥ埌B緇撴瀯鏃舵墠鍔犱笂include "b.h"
榪欐牱浠g爜鍏寵仈灝辨病鏈夐偅涔堢揣瀵嗕簡錛岀紪璇戝櫒涔熶細鍙樼殑鑱槑鐐逛簡錛屼笉浼氱敱浜庝竴涓棤鍏崇揣瑕佺殑淇敼錛屽鑷村ぇ鎵歸噺鐨勬簮鏂囦歡琚噸鏂扮紪璇戙?br>
]]>
]]>
]]>
2
3 2010.3.25 zhangbin
4 1.create,瀹氫箟game-core鐨勭綉緇滄帴鍙?br> 5
6 鍗忓畾:
7 1.鏁版嵁綾誨瀷鍚嶇О灝鵑儴娣誨姞T
8
9 2010.3.27 zhangin
10
11 2010.3.29 zhangbin
12 1. 鍙栨秷宸ヤ綔鍗旼ameWorkSheetT緇撴瀯
13 2. 淇敼 ISecureService.auth()瀹夊叏璁よ瘉鐨勬暟鎹被鍨?br> 14 2010.3.30 zhangbin
15 1. heartbeat()縐誨姩鍒癐Service鎺ュ彛
16 */
17
18
19 #ifndef _GTR_ICE
20 #define _GTR_ICE
21
22
23 module gtr {
24
25 dictionary<string,string> HashValueSet;
26 dictionary<string,string> ReturnValueT;
27 sequence<byte> ByteStreamT;
28 sequence<string> StringListT;
29 sequence<HashValueSet> HashValueListT;
30 sequence<int> IntListT;
31 sequence<StringListT> StringListListT;
32
33 struct CallReturnT{
34 bool succ;
35 string msg;
36 HashValueSet props;
37 };
38
39 const int IMAGEJPEG = 1;
40 const int IMAGEPNG =2 ;
41 const int IMAGEBMP = 3 ;
42
43
44 //鍥懼儚鏁版嵁
45 struct ImageDataT{
46 int type;
47 ByteStreamT bytes;
48 int width;
49 int height;
50 };
51
52 struct GameAuthDataT{
53 int type; // 1- 鍥劇墖 ,2 - 鍧愭爣
54 ImageDataT image; //縐樺疂鍥劇墖
55 string seckey; //縐樺疂鍧愭爣
56 };
57
58
59 struct GameIdentifyT{
60 string id; //娓告垙緙栧彿
61 string tradeNo; //浜ゆ槗鍗曞彿
62 };
63
64 struct ServiceIdentifyT{
65 string id;
66 string version;
67 };
68
69
70 interface IService{
71 int getType(); //
72 ServiceIdentifyT getId(); //service module id
73 int getTimestamp(); //鑾峰彇緋葷粺鏃墮挓 1970涔嬪悗縐掓暟
74 void shutdown();
75 void heartbeat(string senderType,string senderId); //鍙戦佽呯被鍨嬪拰Id
76 };
77
78 /*
79 enum LogMsgLevelT{
80 logDEBUG,
81 logINFO,
82 logCRITICAL,
83 logERROR
84 };
85 */
86
87 struct LogMessageT{
88 int xclass; //娑堟伅綾誨瀷
89 string msg;
90 };
91
92 //鏃ュ織鍔熻兘
93 interface ILogger {
94 void gameMsg(GameIdentifyT gameId,int timetick,LogMessageT msg); // timetick - 1970~ s
95 void gameImage(GameIdentifyT gameId,int timetick,string opName,ImageDataT image); //鎶撳浘 opName - 鎵ц娓告垙姝ラ鍚嶇О
96 };
97
98 //瀹夊叏綆$悊錛屽寘鎷瀹濊璇佺瓑
99 interface ISecure {
100 string auth(GameIdentifyT gameId,GameAuthDataT data);
101 };
102
103 //鏃ュ織鏈嶅姟鍣?/span>
104 interface ILogServer extends ILogger,IService{
105
106 };
107
108 interface ISecureServer extends ISecure,IService{
109 };
110
111
112 //涓涓父鎴忎換鍔$浉鍏崇殑淇℃伅
113 enum GameWorkSheetTypeT{
114 gwsPost, //閭瘎
115 gwsAccountAudit, //甯愬彿瀹℃牳
116 gwsVerify //楠岃瘉
117 };
118
119
120 //閭瘎
121 struct GameWorkSheetPostT {
122 long money;
123 };
124 //瀹℃牳
125 struct GameWorkSheetAccountAuditT {
126 string any;
127 };
128 //楠岃瘉
129 struct GameWorkSheetVerifyT {
130 string any;
131 };
132
133 //浜ゆ槗浠誨姟淇℃伅
134 //Tasklet鍖呭惈鎵鏈夌殑涓氬姟澶勭悊綾誨瀷錛屼絾鍚屾椂鍙湁涓縐嶆湁鏁?/span>
135 struct GameTaskletT{
136 string id; //浠誨姟緙栧彿
137 int type; //澶勭悊綾誨瀷
138 string no; //鍗曞彿
139 string gameId; //娓告垙緙栧彿
140 string account; //甯愬彿
141 string password;
142 string area; //鍖?/span>
143 string server; //鏈嶅姟鍣?/span>
144 string lineName;//綰胯礬鍚嶇О(涓虹┖鍒檒ineNo)
145 short lineNo; //綰胯礬緙栧彿
146 string createTime;
147
148 GameWorkSheetPostT post; //閭瘎
149 GameWorkSheetAccountAuditT audit;
150 GameWorkSheetVerifyT verify;
151 };
152
153 struct GameTaskResultT{
154 string id; //浠誨姟緙栧彿
155 string no; //鍗曞彿 (鍐椾綑)
156 string gameId; //娓告垙緙栧彿(鍐椾綑)
157 int result; //澶勭悊緇撴灉
158 string errmsg; //鎻愮ず淇℃伅
159 };
160
161 //gtr鎺у埗鏈嶅姟绔帴鍙?/span>
162 interface IGameHost extends IService,ILogger,ISecure{
163 GameTaskletT getTask(); //鑾峰彇浠誨姟
164 void completeTask(GameTaskResultT result); //
165
166 };
167
168
169
170 };
171
172
173 #endif
174
175
]]>
濡傛灉鐩存帴鐢╯ocket鍙堝珜澶夯鐑︿簡,涓嶅悓鐨勫簲鐢ㄩ兘鏄湪閲嶅鐨勮繘琛屽紑鍙戦氫俊鍗忚,瑙e寘鍜屾墦鍖呰姳閿寰堝緢澶氱殑綺懼姏,榪欎簺宸ヤ綔閮芥槸閲嶅鐨?娌℃湁鎶鏈惈閲忚屼笖瀹規槗鍑洪敊.
涔嬪墠寮鍙戣繃mtslib閫氫俊搴撴潵瑙e喅socket閫氫俊闂,浣夸袱绔兘鏄互娑堟伅鍖呯殑褰㈠紡榪涜閫氫俊,瑙e喅浜唖ocket涓ゆbuffer鐨勭鐞?br>涔熺湅榪噄ce鐨勪唬鐮佸疄鐜?slice2cpp鐢▂acc&lex榪涜璇嶆硶璇硶鐨勫鐞?br>瀵硅薄鐨勮嚜鍔ㄥ簭鍒楀寲榪欐槸鎴戞墍鎰熷叴瓚g殑,鍚宨ce涓鏍鋒彁渚涗竴涓氫俊鐜,鐒跺悗鐢ㄦ埛鍙互鑷畾涔夎嚜宸辯殑閫氫俊鏁版嵁,閫氳繃idl鐨勫艦寮忚嚜鍔ㄤ駭鐢熷簭鍒楀寲浠g爜騫剁紪璇戣繘鐢ㄦ埛宸ョ▼.
榪欑鏂瑰紡涓巌ce鍙堜笉鍚屽湪浜庢病鏈夐偅涔堝偦鐡滃寲,浣嗙畝鍖栦簡鐢ㄦ埛澶勭悊娑堟伅鎶ョ殑榪囩▼.
榪欐牱瑕佸畬鎴愪竴涓被浼糹ce鐨剅pc璋冪敤涔熸槸娌℃湁閭d箞綆鍗?br>yacc/lex,lemon,
]]>
褰撳垵鑰冭檻鍒版斁寮冧箣鍓嶇殑涓滆タ鑰冭檻鐨勯棶棰樻湁寰堝錛屽綋鐒舵湁鍏徃鐨勭煡璇嗕駭鏉冮棶棰橈紝鏈涓昏鐨勬槸涔嬪墠鐨勪駭鍝佹妧鏈疄鍦ㄦ槸璁捐鐨勬湁鐐圭碂緋曘傚仛寮鍙戠殑鐭ラ亾鐪嬪埆浜虹殑浠g爜騫朵笖鍦ㄨ繖鍩虹涓婂幓鍙戞壃鍏夊ぇ榪欐椂闂村緢澶村ぇ鍜岀棝鑻︾殑浜嬫儏錛岀壒鍒槸紕板埌閭d簺鍘熸湰灝辨槸姣旇緝灝侀棴鍜屽樊鍔茬殑涓滆タ銆?br>鍑熻嚜宸辯殑鐨勫緢澶氭兂娉曞紑濮嬪紑鍙憇wMap欏圭洰錛屼互鍓嶇殑涓滆タ閮芥姏寮冩病鏈夊仛鍙傝冿紝浠庡師濮嬪湴鍥懼姞宸ヨ璁°佸湴鍥炬覆鏌撴湇鍔″櫒寮鍙戙佺劧鍚庡氨鏄熀浜嶱c鍜學ince鐨勫鎴風寮鍙戯紝鏀寔鏈湴鍜岃繙紼嬪姞杞藉湴鍥劇殑鏂瑰紡錛岄噸鏂拌璁$殑鏁版嵁瀛樺偍鏂瑰紡闄や簡淇濈暀綆鍗曠殑緗戞牸瀛樺偍鍜屾悳瀵伙紝宸茬粡鎶婂湴鍥炬暟鎹繘琛岀渷浠界殑鍒嗗壊錛岃屼笉鍍忎互鍓嶅繀欏誨姞杞藉崟鐙殑涓涓叏鍥藉湴鍥炬暟鎹寘錛涘湴鍥劇綉鏍間篃璁捐鎴愪簡澶氱綉鏍煎ぇ灝忓艦寮忥紝浠ヤ究鏀寔鍚屼竴涓湴鍥炬枃浠朵腑浠繪剰澶氱殑緙╂斁姣斿拰鍦板浘灞傘?br>寮鍙戞繪槸寰堣緵鑻︼紝姣忓ぉ閮芥槸瑕佸仛鍒板娣變漢闈?br>瀛︿範浜嗗緢澶氫笢瑗匡紝鎬濊冧簡寰堝涓滆タ錛屽弽澶嶇殑涔熸湁寰堝錛屾渶緇堣繕鏄嚟鍊熻嚜宸辨瘮杈冨鐨勭煡璇嗛潰錛岃繍鐢ㄤ簡寰堝opensource鐨勬妧鏈紝鏃墮棿鍜屾晥鐜囧綋鐒舵槸闈炲父閲嶈鐨勶紝鎵浠ユ病鏈夎嚜宸卞幓閲嶆柊瀹炵幇涓浜涘熀紜鐨勪笢瑗匡紝姣斿matrix灝辨槸浠巆airo搴撲腑鐩存帴鎶勮繃鏉ョ殑銆?br>鍦ㄧ敤c++寮鍙戝湴鍥炬湇鍔″櫒鍜屽鎴風鏃跺欎篃鑰冭檻浜嗕笉鍚岀殑閫氫俊鏂瑰紡鍜屾搷浣滅郴緇熺幆澧冿紝灝藉彲鑳界殑鍙互鏀寔鏇村鐨勮繍琛岀幆澧冦?br>鍘熸湰璁″垝鍦ㄦ槰鏅歸ince鐗堟湰涔嬪悗椹笂鏀寔symbian鎿嶄綔緋葷粺錛屼絾瀵箂ymbian鐨勫紑鍙戠爺絀朵簡涔嬪悗璁╂垜澶уけ鎵鏈涳紝鍏跺紑鍙戞槸闈炲父浣庢晥鐨勪笖閫氱敤鎬ц兘澶樊錛屽悗鏉ョ綉涓婂緱鐭okia椹笂灝嗘姏寮僺ymbian鑰屾鎶眑inux浜嗭紝榪欎護鎴戞垜椹笂鑰冭檻浜嗙Щ妞峫inux鐨勬兂娉?br>寰堝浜鴻窡鎴戞彁鍒伴潤鎬佺綉欏靛湴鍥炬柟寮忥紝褰撶劧鎴戜笉鑳藉仛鍒板儚google錛宱penlayers榪欎箞寮虹殑瀹㈡埛绔錛屼篃娌$簿鍔涘幓鏀寔ogc閭d箞鐨刧is鍗忚鍦ㄥ湴鍥炬湇鍔″櫒涓婏紝鎵浠ヨ兘婕旂ず鍩虹鐨勫湴鍥懼姛鑳藉紑鍙戜簡php鐨勫睍紺虹銆?br>flex鍜宻liverlight閮芥槸闈炲父濂界殑鎶鏈紝浣嗗浜巑s涓鐩存病鏈夊ソ鎰燂紝鎵浠lex褰㈡垚浜嗘垜閫夋嫨鍙︿竴涓睍紺哄鎴風鐨勬兂娉曘?br>緗戜笂涓嬩簡涓鍫嗙殑flex鏁版嵁錛屽墠鍚庝粠鎺ヨЕactionscript鍒板仛濂絪wFlex瀹㈡埛绔竴鍏辮姳浜?澶╂椂闂達紝鍙戣瓚婃潵瓚婂枩嬈㈣繖涓笢瑗夸簡錛岀湅鏉ヤ互鍚庣殑鍓嶇寮鍙戣鍏ㄦ崲鎴恌lex騫沖彴浜嗐?br>鐩墠鍋氬緱swMap鐨勫姛鑳介潪甯告湁闄愶紝鍦板浘澶勭悊涔熸槸寰堢畝鍗曪紝鐢氳嚦榪炴枃鏈爣娉ㄩ兘娌℃湁娣誨姞錛屽彧鏄彁渚涗簡25涓浘灞?6綰у埆緙╂斁姣斿湪瀹㈡埛绔睍紺恒?br>鎴戞兂寰呮垜鏈夋椂闂達紝鎴戝皢榪欎簺閮戒細瀹屽杽璧鋒潵
鍘熸湰寰堝甯﹀紑鍙戠殑鎶鏈篃娌℃湁鍘誨仛錛屾瘮濡俛gg錛屽湴鍥?鍙夋爲銆丷Tree錛孉*璺敱綆楁硶
鏈嬪弸緇欐垜鐨勫嚑涓狦ps妯″潡璁懼榪欏嚑澶╄璋冮氬茍鏀劇疆鍒板湴鍥句笂鍘?br>
]]>
]]>
CString strText(pText,sizeof(pText));
SaveMultString(HKEY_LOCAL_MACHINE,_T("Loader"),_T("SystemPath"),strText,sizeof(pText));
DeleteKey(HKEY_LOCAL_MACHINE,_T("SOFTWARE\\sample\\PLAY"));
}
]]>
]]>
string str = "";
int n = a;
for (int i=2*sizeof(char) - 1; i>=0; i--)
{
str += "0123456789ABCDEF"[((n >> i*4) & 0xF)];
}
return str;
}
]]>
t={[0]=1;["name"]="ultra"}
t.a, t.b , t[0] , t["name"]
琛ㄦ搷浣滃嚱鏁?
ipairs,pairs榪唬鍑芥暟
table.getn(t) len of table
================================================================
function() 鍙互鎺ュ彈浠繪剰澶氱殑鍙傛暟錛屽鏋滃疄鍙傛暟榪囧灝嗕涪寮冿紝榪囧皯灝嗛粯璁よ緗負nil
鍚屾牱鍙互榪斿洖澶氫釜鍙傛暟
a,b=foo()
琛ㄤ綔涓哄弬鏁頒紶閫掑埌function
function rename( arg ) os.rename(arg.old,arg.new) end
rename{old="";new=""}
鍖垮悕鍑芥暟(lambda in python )
foo = function(x) return x*2 end
灞閮ㄥ嚱鏁?local f=function(x) ... end
================================================================
for n=start,end,step do ... end
while b do ... end
repeat do .... until
if then .. elseif then ... end;
鏈夋剰鎬濈殑璇硶琛ㄨ揪寮?
print a or b or c 濡傛灉a=false,灝濊瘯b...
娉ㄩ噴: -- --{ --}
瀛楃涓叉搷浣? .. 榪炴帴
==================================================
io 鍑芥暟:
loadfile('test.lua')() execute external lua script
loadstring('print 100')()
浠g爜嫻嬭瘯:
=======================
c紼嬪簭璋冪敤lua鍑芥暟
c 紼嬪簭:
void call_lua_func(){
lua_State *s = lua_open();
luaL_openlibs(s);
int c = lua_gettop(s);
luaL_dofile(s,"/nandflashpartition/test1.lua");
lua_getglobal(s,"add");
lua_pushnumber(s,0.25);
lua_pushnumber(s,8);
if( lua_pcall(s,2,1,0)){
std::cout<< lua_tostring(s,-1)<<std::endl;
}
double r;
r = lua_tonumber(s,-1);
lua_close(s);
}
lua紼嬪簭:
function add(x,y)
return x*y
end
--------------------------------
lua璁塊棶c紼嬪簭絀洪棿鍙橀噺
1.瀹氫箟鍙橀噺student.h
extern char * gender;
extern int class_count;
2.鍒涘緩pkg鏂囦歡 student.pkg
$#include "student.h"
extern char * gender;
extern int class_count;
3.浜х敓tolua++瀛樻牴妗嗘灦
tolua++ -o student.pkg
4.鍒涘緩lua嫻嬭瘯浠g爜 call_c.lua
print(gender)
print(class_count) 璁塊棶c 絀洪棿鐨勫彉閲?br>
5.c嫻嬭瘯浠g爜
char * gender;
int class_count;
void lua_call_c(){
int tolua_student_open (lua_State* tolua_S);
lua_State * s = lua_open();
luaopen_base(s);
gender ="my gender is male!";
class_count = 100;
tolua_student_open(s);
luaL_dofile(s,"/nandflashpartition/call_c.lua");
lua_close(s);
}
6.build && test it!
]]>
#define IN
#define INIT_LIST_HEAD(x)聽聽 聽
#define btsc_TRUE 聽聽 聽0
#define btsc_FALSE聽聽 聽1
#define btsc_NULL 聽聽 聽0
struct list_head{
聽聽 聽struct list_head* prev,*next;
};
struct btsc_Property{
聽聽 聽char * 聽聽 聽聽聽 聽name;
聽聽 聽char * 聽聽 聽聽聽 聽value;聽聽 聽聽聽 聽
};
struct btsc_Packet{
聽聽 聽/*struct list_head聽聽 聽list;*/
聽聽 聽struct btsc_Property** 聽聽 聽properties;
聽聽 聽int聽聽 聽聽聽 聽聽聽 聽聽聽 聽size;
聽聽 聽int聽聽 聽聽聽 聽聽聽 聽聽聽 聽capacity;
聽聽 聽struct btsc_Context聽聽 聽*聽聽 聽ctx;
};
struct btsc_Packet* 聽聽 聽btsc_Packet_Alloc(struct btsc_Context* );
void聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽btsc_Packet_Free(struct btsc_Packet*);
struct btsc_Property*聽聽 聽btsc_Property_Alloc(struct btsc_Context* ,char * name,char * value);
void聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽btsc_Property_Free(struct btsc_Property*);
struct btsc_Property* 聽聽 聽btsc_Property_Get(struct btsc_Packet* packet,char * name); 聽聽 聽
void聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽btsc_Property_Append(struct btsc_Packet* packet,struct btsc_Property * );
struct btsc_Context{
聽聽 聽void (*tx)(struct btsc_Context*,unsigned char * data,int len);聽聽 聽聽聽 聽
聽聽 聽int (*notifier)(struct btsc_Packet* packet);/*澶栭儴閲婃斁packet,榪斿洖NULL*/聽聽 聽聽聽 聽
聽聽 聽int聽聽 聽聽聽 聽packet_cached_size;
聽聽 聽int聽聽 聽聽聽 聽recv_cached_capacity;聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽
聽聽 聽char*聽聽 聽recv_buff;聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽
聽聽 聽int聽聽 聽聽聽 聽recv_size;聽聽 聽聽聽 聽
聽聽 聽void*聽聽 聽user;聽聽 聽// 澶栭儴鏁版嵁浼犻捖犅?聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽
};
int 聽聽 聽btsc_init(struct btsc_Context* IN ctx);聽聽 聽
void 聽聽 聽btsc_cleanup(struct btsc_Context* IN ctx);
int聽聽 聽聽聽 聽btsc_Pack(struct btsc_Context* IN ctx,struct btsc_Packet* packet,unsigned char * INOUT buff,int* INOUT size);聽聽 聽
void聽聽 聽btsc_Parse(struct btsc_Context* , char * data,int len);
#define BTSC_PACKET_BEGIN(ctx) {\
聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽struct btsc_Context* _ctx_internel;\
聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽struct btsc_Packet * _pkt ;\
聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽_ctx_internel= (ctx);\
聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽_pkt = btsc_Packet_Alloc(_ctx_internel);
聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽
/* key is not suitable for vairable*/聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽
#define BTSC_NEW_PROPERTY(key,value)聽聽 聽{\
聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽struct btsc_Property * _ppt =btsc_Property_Alloc(_ctx_internel,key,value);\
聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽btsc_Property_Append(_pkt,_ppt);\
聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽}
#define BTSC_PACKET_END()聽聽 聽聽聽 聽btsc_Pack(_ctx_internel,_pkt,btsc_NULL,0);\
聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽btsc_Packet_Free(_pkt);\
聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽}
#define BTSC_FOREACH(packet,ppt)聽聽 聽{\
聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽int n;\
聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽for(n=0;n<packet->size;n++){\
聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽ppt = packet->properties[n];
#define BTSC_END_FOREACH()聽聽 聽聽聽 聽聽聽 聽}\
聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽}
/*
聽聽聽 name:聽聽聽 聽聽聽 聽聽聽 btsc
聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 serial communicating聽 with bluetooth and app-user
聽聽聽 desc:聽聽聽 聽聽聽 聽聽聽 pair parameter codec
聽聽聽
聽聽聽 聽聽聽 packet=[ key:name,...]
聽聽聽 聽聽聽
聽聽聽 implemented: 聽聽聽 zhangbin ,聽 3 hours occupied
聽聽聽 date:聽聽聽 聽聽聽 聽聽聽 2007-01-26
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef _UNIX
#include <unistd.h>
#endif
#include "btsc.h"
#define PACKET_HEAD聽聽聽 聽聽聽 '<'
#define PACKET_TAIL聽聽聽 聽聽聽 '>'
#define PROPERTY_DELIMITER聽聽聽 ','
#define PAIR_DELIMITER聽聽聽 聽聽聽 '='
#define ESCAPE_CHAR聽聽聽 聽聽聽 聽聽聽 '\\'
int calcEscapleLength(char * str);
char* escape_copy(char * dest,char * src);
void trim_escape_copy(char * dest,char * src,int size);
int聽 calcPacketLength(struct btsc_Packet* pkt);
int聽聽聽 is_escape_char(char c);
void parseProperty(struct btsc_Packet * pkt,char * s,char * e);
void parsePacket(struct btsc_Context* ctx,char * s,char* e);
char* 聽聽聽 __memchr(char * s,char* e,char c);
char escape_ch_table[]={PACKET_HEAD,PACKET_TAIL,PROPERTY_DELIMITER,PAIR_DELIMITER,ESCAPE_CHAR,'\0'};
struct btsc_Packet* 聽聽聽 btsc_Packet_Alloc(struct btsc_Context* ctx){聽聽聽
聽聽聽 struct btsc_Packet * pt = malloc(sizeof(struct btsc_Packet));聽聽聽 聽聽聽
聽聽聽 pt->size = 0;
聽聽聽 pt->capacity = ctx->packet_cached_size;
聽聽聽 pt->properties=malloc(pt->capacity*sizeof(struct btsc_Property*));聽聽聽
聽聽聽 pt->ctx = ctx;
聽聽聽 return pt;聽聽聽
}
void聽聽聽 btsc_Packet_Free(struct btsc_Packet* pt){聽聽聽
聽聽聽 struct btsc_Property** tmp;
聽聽聽 if( !pt ) 聽聽聽 return ;
聽聽聽 tmp = pt->properties;
聽聽聽 while(pt->size--){
聽聽聽 聽聽聽 btsc_Property_Free(*tmp++);聽聽聽 聽聽聽 聽聽聽 聽聽聽
聽聽聽 }聽聽聽 聽聽聽
聽聽聽 if( pt->properties){
聽聽聽 聽聽聽 free(pt->properties);聽
聽聽聽 }
聽聽聽 free(pt);
}
struct btsc_Property*聽聽聽 btsc_Property_Alloc(struct btsc_Context* ctx,char * name,char * value){
聽聽聽 struct btsc_Property * ppt;
聽聽聽 printf("enter btsc_Property_Alloc()\n");
聽聽聽 ppt = malloc( sizeof( struct btsc_Property) );
聽聽聽 if(!ppt)聽聽聽 printf("error: malloc failed (s1)\n");
聽聽聽 ppt->name = malloc( strlen(name)+1);
聽聽聽 if( !ppt->name ) printf("error: malloc failed (s2)\n");
聽聽聽 strcpy(ppt->name,name);聽聽聽
聽聽聽 ppt->value = malloc( strlen(value)+1);
聽聽聽 if( !ppt->value) printf("error: malloc failed (s3),str:%s, len: %d\n",value,strlen(value)+1);
聽聽聽 strcpy( ppt->value,value);
聽聽聽 return ppt;
}
void聽聽聽 聽聽聽 btsc_Property_Free(struct btsc_Property* ppt){
聽聽聽 if( !ppt )聽聽聽 return;
聽聽聽 free( ppt->name);
聽聽聽 free( ppt->value);
聽聽聽 free( ppt);
}
/* scan pointer array */
struct btsc_Property* 聽聽聽 btsc_Property_Get(struct btsc_Packet* pkt,char * name){
聽聽聽 int size;
聽聽聽 struct btsc_Property* ppt;
聽聽聽 size = pkt->size;
聽聽聽 while(size--){
聽聽聽 聽聽聽 ppt = pkt->properties[size];
聽聽聽 聽聽聽 if( !strcmp( name, ppt->name ) ){
聽聽聽 聽聽聽 聽聽聽 return ppt;/*that's ok */
聽聽聽 聽聽聽 }
聽聽聽 }
聽聽聽 return btsc_NULL;
}
/* low effeciency, memory allocation,more costs*/
void聽聽聽 btsc_Property_Append(struct btsc_Packet* pt,struct btsc_Property * ppt){
聽聽聽 struct btsc_Property** tmpppt;
聽聽聽 if( pt->size==pt->capacity){ 聽聽聽 聽聽聽
聽聽聽 聽聽聽 pt->capacity += pt->ctx->packet_cached_size;聽聽聽
聽聽聽 聽聽聽 tmpppt = pt->properties;聽聽聽 聽聽聽
聽聽聽 聽聽聽 pt->properties = malloc( pt->capacity * sizeof( struct btsc_Property**) );
聽聽聽 聽聽聽 memcpy( pt->properties, tmpppt, pt->size * sizeof( struct btsc_Property**));
聽聽聽 聽聽聽 free( tmpppt);
聽聽聽 }
聽聽聽 pt->properties[pt->size++]=ppt;聽聽聽
}
int 聽聽聽 btsc_init(struct btsc_Context* ctx){聽聽聽
聽聽聽 ctx->packet_cached_size = 10;聽聽聽
聽聽聽 if( ctx->recv_cached_capacity==0){
聽聽聽 聽聽聽 ctx->recv_cached_capacity = 1024*2;聽聽聽
聽聽聽 }
聽聽聽 ctx->recv_buff = malloc( ctx->recv_cached_capacity );
聽聽聽 ctx->recv_size = 0;
聽聽聽 return btsc_TRUE;
}
void 聽聽聽 btsc_cleanup(struct btsc_Context* ctx){
聽聽聽 free(ctx->recv_buff);聽聽聽
}
/*
**聽聽聽 name:聽聽聽 calcEscapleLength
**聽聽聽 desc:聽聽聽 璁$畻鍚漿涔夊瓧絎︿覆闀垮害
*/
int 聽聽聽 calcEscapleLength(char * str){
聽聽聽 int len;
聽聽聽 char * pesc;
聽聽聽 len = 0;聽聽聽
聽聽聽 while( *str ){
聽聽聽 聽聽聽 pesc = escape_ch_table;
聽聽聽 聽聽聽 while( *pesc ){
聽聽聽 聽聽聽 聽聽聽 if( *pesc==*str){
聽聽聽 聽聽聽 聽聽聽 聽聽聽 len++;
聽聽聽 聽聽聽 聽聽聽 聽聽聽 break;
聽聽聽 聽聽聽 聽聽聽 }
聽聽聽 聽聽聽 聽聽聽 pesc++;
聽聽聽 聽聽聽 }聽聽聽 聽聽聽
聽聽聽 聽聽聽 str++;
聽聽聽 }聽聽聽
聽聽聽 return len;
}
char* escape_copy(char * dest,char * src){
聽聽聽 char * pesc;
聽聽聽 while( *src ){
聽聽聽 聽聽聽 pesc = escape_ch_table;
聽聽聽 聽聽聽 while( *pesc ){
聽聽聽 聽聽聽 聽聽聽 if( *pesc==*src){
聽聽聽 聽聽聽 聽聽聽 聽聽聽 *dest++=ESCAPE_CHAR;
聽聽聽 聽聽聽 聽聽聽 聽聽聽 break;
聽聽聽 聽聽聽 聽聽聽 }
聽聽聽 聽聽聽 聽聽聽 pesc++;
聽聽聽 聽聽聽 }
聽聽聽 聽聽聽 *dest++=*src++;聽聽聽 聽聽聽 聽聽聽 聽聽聽
聽聽聽 }聽聽聽
聽聽聽 return dest;聽聽聽
}
void trim_escape_copy(char * dest,char * src,int size){
聽聽聽 int last_escape = btsc_FALSE;
聽聽聽 while( size--){
聽聽聽 聽聽聽 if( *src == ESCAPE_CHAR && last_escape != btsc_TRUE){聽聽聽 聽聽聽
聽聽聽 聽聽聽 聽聽聽 last_escape = btsc_TRUE聽聽聽 ;
聽聽聽 聽聽聽 聽聽聽 src++;
聽聽聽 聽聽聽 聽聽聽 continue;
聽聽聽 聽聽聽 }
聽聽聽 聽聽聽 last_escape = btsc_FALSE;
聽聽聽 聽聽聽 *dest++=*src++;聽聽聽 聽聽聽
聽聽聽 }
}
int聽聽 聽聽聽 calcPacketLength(struct btsc_Packet* pkt){
聽聽聽 int len;
聽聽聽 int size;
聽聽聽 struct btsc_Property* ppt;聽聽聽
聽聽聽 len = 0;
聽聽聽 size = pkt->size;
聽聽聽 while( size--){
聽聽聽 聽聽聽 ppt = pkt->properties[size];聽聽聽
聽聽聽 聽聽聽 len+=strlen(ppt->name)+strlen(ppt->value);聽聽聽
聽聽聽 聽聽聽 len+= calcEscapleLength(ppt->name);
聽聽聽 聽聽聽 len+= calcEscapleLength(ppt->value);聽聽聽
聽聽聽 }
聽聽聽 len+= pkt->size*2+1;
聽聽聽 return聽 len;
}
int聽聽聽 聽聽聽 btsc_Pack(struct btsc_Context*聽 ctx,struct btsc_Packet* pkt,unsigned char * obuff,int* osize){
聽聽聽 struct btsc_Property* ppt;
聽聽聽 int size;
聽聽聽 int len;
聽聽聽 unsigned char * buff;
聽聽聽 char * pbuff;
聽聽聽 len = calcPacketLength( pkt);
聽聽聽 buff = malloc( len );
聽聽聽 size = pkt->size;
聽聽聽 pbuff = (char*)buff;
聽聽聽 *pbuff++=PACKET_HEAD;聽聽聽
聽聽聽 while( size--){
聽聽聽 聽聽聽 ppt = pkt->properties[size];聽聽聽
聽聽聽 聽聽聽 pbuff = escape_copy(pbuff,ppt->name);
聽聽聽 聽聽聽 *pbuff++=PAIR_DELIMITER;
聽聽聽 聽聽聽 pbuff = escape_copy(pbuff,ppt->value);
聽聽聽 聽聽聽 if( size ){
聽聽聽 聽聽聽 聽聽聽 *pbuff++=PROPERTY_DELIMITER;聽聽聽 聽聽聽 聽聽聽
聽聽聽 聽聽聽 }
聽聽聽 }
聽聽聽 *pbuff = PACKET_TAIL;
聽聽聽 if( ctx->tx ){
聽聽聽 聽聽聽 ctx->tx(ctx,buff,len);
聽聽聽 }
聽聽聽 if( obuff && *osize >=len){
聽聽聽 聽聽聽 memcpy( obuff, buff ,len);
聽聽聽 聽聽聽 *osize = len;
聽聽聽 }
聽聽聽 free(buff);
聽聽聽 return btsc_TRUE;聽聽聽
}
/* e not in range*/
char* 聽聽聽 __memchr(char * s,char* e,char c){
聽聽聽 while( s!=e){
聽聽聽 聽聽聽 if( *s == c){
聽聽聽 聽聽聽 聽聽聽 return s;
聽聽聽 聽聽聽 }聽聽聽 聽聽聽
聽聽聽 聽聽聽 s++;
聽聽聽 }
聽聽聽 return btsc_NULL;
}
int聽聽聽 聽聽聽 is_escape_char(char c){
聽聽聽 return btsc_FALSE;聽聽聽
}
/*
聽聽聽 name: parseProperty
聽聽聽 desc: 鎸囧畾鍐呭瓨鑼冨洿涓彁鍙栧睘鎬?key=>value
聽聽聽 聽聽聽 鎼滅儲鍖呭惈e
聽聽聽 params:聽聽聽
聽聽聽 聽聽聽 pkt聽聽聽 --聽聽聽 娑堟伅鏁版嵁鍖?br />聽聽聽 聽聽聽 s聽聽聽 --聽聽聽 璧峰鍐呭瓨鍦板潃
聽聽聽 聽聽聽 e聽聽聽 --聽聽聽 緇撴潫鍦板潃 ,
*/
void parseProperty(struct btsc_Packet * pkt,char * s,char * e){
聽聽聽 char * p1,*p2;
聽聽聽 int n;
聽聽聽 struct btsc_Property*聽聽聽 ppt;
聽聽聽 p1 = s ;
聽聽聽 p2 = e;
__REPEAT:聽聽聽
聽聽聽 p1 = __memchr(p1,e+1,PAIR_DELIMITER);
聽聽聽 if( p1 ){
聽聽聽 聽聽聽 if( *(p1-1) == ESCAPE_CHAR ){
聽聽聽 聽聽聽 聽聽聽 p1++;
聽聽聽 聽聽聽 聽聽聽 goto __REPEAT;
聽聽聽 聽聽聽 }
聽聽聽 聽聽聽 ppt = malloc( sizeof( struct btsc_Property ));
聽聽聽 聽聽聽 n = p1-s; 聽聽聽 聽聽聽
聽聽聽 聽聽聽 ppt->name = malloc( n+1 );
聽聽聽 聽聽聽 memset(ppt->name,0,n+1);聽聽聽 聽聽聽
聽聽聽 聽聽聽 trim_escape_copy(ppt->name,s,n);
聽聽聽 聽聽聽
聽聽聽 聽聽聽 n =e-p1;
聽聽聽 聽聽聽 ppt->value = malloc( n+1);
聽聽聽 聽聽聽 memset(ppt->value,0,n+1);
聽聽聽 聽聽聽 trim_escape_copy(ppt->value,p1+1,n);
聽聽聽 聽聽聽
聽聽聽 聽聽聽 btsc_Property_Append(pkt,ppt);
聽聽聽 }
}
/*
聽聽聽 name: parsePacket
聽聽聽 desc:聽聽聽 鍒嗚В鎸囧畾鍐呭瓨鍒板寘緇撴瀯
聽聽聽 聽聽聽 聽聽聽 鎴愬姛鍒嗚В鍑哄寘绔嬪埢鍥為佸埌搴旂敤鎺ユ敹鑰?( btsc_Context::notifier)
聽聽聽 param:
聽聽聽 聽聽聽 s,e 聽聽聽 鍐呭瓨鍦板潃 (澶別)
** 緙撳啿鍖鴻繕闇榪涗竴姝ユ祴璇?鍖呮嫭緙撳啿鍖哄ぇ灝忚皟鑺? 涓嶅畬鏁村崗璁寘鏍煎紡鐨勫閿?br />*/
void 聽聽聽 parsePacket(struct btsc_Context* ctx,char * s,char* e){
聽聽聽 char *p,*p1,*p2;
聽聽聽 struct btsc_Packet * pkt;
聽聽聽 if( e-s <=1 ){
聽聽聽 聽聽聽 return ;
聽聽聽 }
聽聽聽 pkt = btsc_Packet_Alloc(ctx);
聽聽聽
聽聽聽 p1 = s+1;
聽聽聽 p2 = e-1;
聽聽聽 p = p1;
__REPEAT:聽聽聽
聽聽聽 p = __memchr(p,e,PROPERTY_DELIMITER);
聽聽聽 if( p ){
聽聽聽 聽聽聽 if( *(p-1)==ESCAPE_CHAR){
聽聽聽 聽聽聽 聽聽聽 p = p+1;
聽聽聽 聽聽聽 聽聽聽 goto __REPEAT;
聽聽聽 聽聽聽 }
聽聽聽 聽聽聽 parseProperty(pkt,p1,p-1);
聽聽聽 聽聽聽 p1 = ++p;
聽聽聽 聽聽聽 goto __REPEAT;
聽聽聽 }
聽聽聽 /*allow one property reside in*/
聽聽聽 parseProperty(pkt,p1,e-1);
聽聽聽 if( ctx->notifier ){
聽聽聽聽聽聽聽 if(ctx->notifier(pkt)){ /* nonzero value錛?delete internal*/
聽聽聽聽聽聽聽聽聽聽聽 btsc_Packet_Free(pkt);聽聽聽 聽聽聽聽聽聽聽
聽聽聽聽聽聽聽 }
聽聽聽 }else{
聽聽聽 聽聽 btsc_Packet_Free(pkt);聽聽聽
聽聽聽 }
}
void聽聽聽 btsc_Parse(struct btsc_Context* ctx, char * data,int size){
聽聽聽 int len ;
_RESTART:
聽聽聽 while( size ){
聽聽聽 聽聽聽 len = ctx->recv_cached_capacity - ctx->recv_size;
聽聽聽 聽聽聽 if( len >0){
聽聽聽 聽聽聽 聽聽聽 if( size <= len){
聽聽聽 聽聽聽 聽聽聽 聽聽聽 len = size;
聽聽聽 聽聽聽 聽聽聽 聽聽聽 size = 0;
聽聽聽 聽聽聽 聽聽聽 }else{
聽聽聽 聽聽聽 聽聽聽 聽聽聽 size-=len;
聽聽聽 聽聽聽 聽聽聽 }
聽聽聽 聽聽聽 聽聽聽 memcpy( ctx->recv_buff+ctx->recv_size,data,len);
聽聽聽 聽聽聽 聽聽聽 ctx->recv_size+=len;
聽聽聽 聽聽聽 聽聽聽 data+=len;
聽聽聽 聽聽聽 }聽聽聽
聽聽聽 聽聽聽
聽聽聽 聽聽聽 {
聽聽聽 聽聽聽 聽聽聽 char * p1,*p2;聽聽聽 聽聽聽 聽聽聽
_RESCAN:聽聽聽 聽聽聽 聽聽聽
聽聽聽 聽聽聽 聽聽聽 p1 = ctx->recv_buff;
_RESCAN_HEAD:聽聽聽 聽聽聽 聽聽聽 聽
聽聽聽 聽聽聽 聽聽聽 p1 = __memchr(p1,ctx->recv_buff+ctx->recv_size,PACKET_HEAD);聽聽聽 聽聽聽 聽聽聽
聽聽聽 聽聽聽 聽聽聽 if( !p1 ){
聽聽聽 聽聽聽 聽聽聽 聽聽聽 ctx->recv_size =0;
聽聽聽 聽聽聽 聽聽聽 聽聽聽 if( size ){
聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 goto _RESTART;
聽聽聽 聽聽聽 聽聽聽 聽聽聽 }
聽聽聽 聽聽聽 聽聽聽 }
聽聽聽 聽聽聽 聽聽聽 if( p1>ctx->recv_buff && *(p1-1)==ESCAPE_CHAR){ /* "\<" */
聽聽聽 聽聽聽 聽聽聽 聽聽聽 p1++;
聽聽聽 聽聽聽 聽聽聽 聽聽聽 goto _RESCAN_HEAD;聽聽聽
聽聽聽 聽聽聽 聽聽聽 }
聽聽聽 聽聽聽 聽聽聽
聽聽聽 聽聽聽 聽聽聽 /*move backward*/
聽聽聽 聽聽聽 聽聽聽 ctx->recv_size -=(p1-ctx->recv_buff);
聽聽聽 聽聽聽 聽聽聽 memmove(ctx->recv_buff,p1, ctx->recv_size);
聽聽聽 聽聽聽 聽聽聽 p1=ctx->recv_buff;
聽聽聽 聽聽聽 聽聽聽 p2 = p1+1;
_RESCAN_TAIL:聽聽聽 聽聽聽 聽聽聽
聽聽聽 聽聽聽 聽聽聽 p2 = __memchr(p2,ctx->recv_buff+ctx->recv_size,PACKET_TAIL);
聽聽聽 聽聽聽 聽聽聽 if( !p2 ){
聽聽聽 聽聽聽 聽聽聽 聽聽聽 if( ctx->recv_size == ctx->recv_cached_capacity ){
聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 ctx->recv_size聽 = 0;
聽聽聽 聽聽聽 聽聽聽 聽聽聽 }
聽聽聽 聽聽聽 聽聽聽 聽聽聽 goto _RESTART;
聽聽聽 聽聽聽 聽聽聽 }
聽聽聽 聽聽聽 聽聽聽 if( *(p2-1) == ESCAPE_CHAR ){
聽聽聽 聽聽聽 聽聽聽 聽聽聽 p2++;
聽聽聽 聽聽聽 聽聽聽 聽聽聽 goto _RESCAN_TAIL;聽聽聽
聽聽聽 聽聽聽 聽聽聽 }
聽聽聽 聽聽聽 聽聽聽
聽聽聽 聽聽聽 聽聽聽 parsePacket(ctx,p1,p2);
聽聽聽 聽聽聽 聽聽聽 ctx->recv_size -=p2-p1+1;
聽聽聽 聽聽聽 聽聽聽 if( ctx->recv_size ){
聽聽聽 聽聽聽 聽聽聽 聽聽聽 memmove(ctx->recv_buff,p2+1,ctx->recv_size);
聽聽聽 聽聽聽 聽聽聽 聽聽聽 goto _RESCAN;
聽聽聽 聽聽聽 聽聽聽 }聽聽聽 聽聽聽 聽聽聽 聽
聽聽聽 聽聽聽 }聽聽聽 聽聽聽
聽聽聽 }
}
/*聽聽 debug */
#ifdef _DEBUGX
void tx(unsigned char * data,int len);
void notifier(struct btsc_Packet* packet);
/*鍒濆鍖栦笂涓嬫枃錛?tx=鍙戦佸鐞嗗嚱鏁?notifier=鎺ユ敹鍑芥暟*/
struct btsc_Context c={tx:tx,notifier:notifier};
/*嫻嬭瘯鏁版嵁鎺ユ敹騫惰В鏋?/
void rx(){聽聽聽
聽聽聽 聽char * msg="<MSG=HELLO,NAME=SCOTT>"
聽聽聽 聽聽聽聽 聽聽聽 聽聽聽 "<MSG2=HELLO2,NAME2=SCOTT2>"
聽聽聽 聽聽聽聽 聽聽聽 聽聽聽 "<MSG3=HELLO3,NAME3=SCOTT3>"; /*simulating data*/
聽聽聽 int len = strlen(msg);
聽聽聽 btsc_Parse(&c,msg,len);
}
/*鍙戦佸鐞嗚繃紼?/
void tx(unsigned char * buff,int len){聽聽聽
聽聽聽 char *outmsg = malloc(1024*10);
聽聽聽 memset(outmsg,0,1024*10);
聽聽聽 memcpy(outmsg,buff,len);
聽聽聽 printf("encode str: %s\n",outmsg);
聽聽聽 free(outmsg);
聽聽聽 btsc_Parse(&c,buff,len);
}
void notifier(struct btsc_Packet* packet){
聽聽聽 struct btsc_Property * ppt;
聽聽聽 ppt = btsc_Property_Get(packet,"MSG");
聽聽聽 if(ppt)
聽聽聽 聽聽聽 printf("property get: MSG=>%s\n",ppt->value);
聽聽聽 /*閬嶅巻鍖呭唴灞炴у弬鏁?/
聽聽聽 BTSC_FOREACH(packet,ppt);
聽聽聽 printf("packet: %s=>%s\n",ppt->name,ppt->value);
聽聽聽 BTSC_END_FOREACH();
}
int main(){
聽聽聽 int r;
聽聽聽 /*optional*/
聽聽聽 c.recv_cached_capacity = 1024; /*鍒濆鍖栨帴鏀剁紦鍐插尯澶у皬 byte*/
聽聽聽 c.packet_cached_size = 5;聽聽聽 /*娑堟伅鍖呯紦鍐插睘鎬т釜鏁?/
聽聽聽 btsc_init(&c);聽聽聽 聽聽聽 聽聽聽 /*涓婁笅鏂囧垵濮嬪寲*/
聽聽聽 puts("test rx()...");
聽聽聽 rx();聽聽聽 /*鎺?/
聽聽聽 puts("escape testing...");聽聽聽
聽聽聽 do{
聽聽聽 聽聽聽 /*鏋勯犳秷鎭寘,騫跺畬鎴愬彂閫?/
聽聽聽 聽聽聽 BTSC_PACKET_BEGIN(&c);
聽聽聽 聽聽聽 BTSC_NEW_PROPERTY("MSG","calling");
聽聽聽 聽聽聽 BTSC_PACKET_END();聽聽聽
聽聽聽 聽聽聽 usleep(1000*50);
聽聽聽 聽聽聽 printf(">>seq:%d\n",r);
聽聽聽 }while(0);
聽聽聽 聽聽聽
聽聽聽 btsc_cleanup(&c);聽聽聽
聽聽聽
聽聽聽 return 0;
}
#endif
]]>
#include <windows.h>
class btworkThread{
public:
聽聽 聽btworkThread( void(*entry)(btworkThread* ,void*),void* user){聽聽 聽聽聽 聽
聽聽 聽聽聽 聽_entry = entry;聽聽 聽聽聽 聽
聽聽 聽聽聽 聽_param = user;
聽聽 聽聽聽 聽_thandle = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)btworkThread::run,user,NULL,&_tid);
聽聽 聽}
聽聽 聽void聽聽 聽stop(){
聽聽 聽聽聽 聽_loop = false;
聽聽 聽}
聽聽 聽void聽聽 聽wait(){
聽聽 聽聽聽 聽while(!_end){
聽聽 聽聽聽 聽聽聽 聽Sleep(20);
聽聽 聽聽聽 聽}
聽聽 聽聽聽 聽Sleep(20);聽 // ensure that thread has terminated
聽聽 聽}
聽聽 聽void聽聽 聽stopAndWait(){
聽聽 聽聽聽 聽stop();wait();
聽聽 聽}
聽聽 聽bool聽聽 聽loop(){
聽聽 聽聽聽 聽return _loop;
聽聽 聽}
聽聽 聽void聽聽 聽code_begin(){
聽聽 聽聽聽 聽_loop = true; _begin = true;_end=false;
聽聽 聽}
聽聽 聽void聽聽 聽code_end(){
聽聽 聽聽聽 聽_loop = false; _begin = false;_end=true;
聽聽 聽聽聽 聽CloseHandle(_thandle);
聽聽 聽}
protected:
聽聽 聽static void聽聽 聽run(btworkThread* thread){
聽聽 聽聽聽 聽thread->_entry(thread,thread->_param);
聽聽 聽}
private:
聽聽 聽volatile bool聽聽 聽_loop,_begin,_end;
聽聽 聽void (*_entry)(btworkThread* ,void*);
聽聽 聽void*聽聽 聽_param;
聽聽 聽DWORD聽聽 聽_tid;
聽聽 聽HANDLE聽聽 聽_thandle;
};
]]>
template <typename T>
class SmartHandlePtr{
聽聽聽 struct Handle{
聽聽聽 聽聽聽 Handle(){
聽聽聽 聽聽聽 聽聽聽 ptr = NULL;
聽聽聽 聽聽聽 聽聽聽 cnt = 0;
聽聽聽 聽聽聽 }
聽聽聽 聽聽聽 void*聽聽聽 ptr;
聽聽聽 聽聽聽 int聽聽聽 聽聽聽 cnt;
聽聽聽 聽聽聽 btLock聽聽聽 lock;
聽聽聽 聽聽聽 void聽聽聽 inc(){
聽聽聽 聽聽聽 聽聽聽 btScopeLock sl(lock);
聽聽聽 聽聽聽 聽聽聽 cnt++;
聽聽聽 聽聽聽 }
聽聽聽 聽聽聽 void聽聽聽 dec(){
聽聽聽 聽聽聽 聽聽聽 btScopeLock sl(lock);
聽聽聽 聽聽聽 聽聽聽 cnt--;
聽聽聽 聽聽聽 }
聽聽聽 };
public:
聽聽聽 SmartHandlePtr(const T* p){
聽聽聽 聽聽聽 _ph = new Handle;
聽聽聽 聽聽聽 _ph->ptr =(void*) p;
聽聽聽 聽聽聽 _ph->inc();
聽聽聽 }
聽聽聽 ~SmartHandlePtr(){
聽聽聽 聽聽聽 if( _ph ){
聽聽聽 聽聽聽 聽聽聽 _ph->dec();
聽聽聽 聽聽聽 聽聽聽 if( _ph->cnt==0){
聽聽聽 聽聽聽 聽聽聽 聽聽聽 T* p;
聽聽聽 聽聽聽 聽聽聽 聽聽聽 p = (T*)_ph->ptr;
聽聽聽 聽聽聽 聽聽聽 聽聽聽 if( p ){
聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 delete p;
聽聽聽 聽聽聽 聽聽聽 聽聽聽 }
聽聽聽 聽聽聽 聽聽聽 聽聽聽 delete _ph;
聽聽聽 聽聽聽 聽聽聽 }聽聽聽 聽聽聽 聽聽聽
聽聽聽 聽聽聽 }
聽聽聽 }
聽聽聽 SmartHandlePtr(const SmartHandlePtr& shp){
聽聽聽 聽聽聽 if( _ph ){
聽聽聽 聽聽聽 聽聽聽 _ph->dec();
聽聽聽 聽聽聽 聽聽聽 if( _ph->cnt==0){
聽聽聽 聽聽聽 聽聽聽 聽聽聽 T* p;
聽聽聽 聽聽聽 聽聽聽 聽聽聽 p = (T*)_ph->ptr;
聽聽聽 聽聽聽 聽聽聽 聽聽聽 if( p){
聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 delete p;
聽聽聽 聽聽聽 聽聽聽 聽聽聽 }
聽聽聽 聽聽聽 聽聽聽 聽聽聽 delete _ph;
聽聽聽 聽聽聽 聽聽聽 }聽聽聽 聽聽聽 聽聽聽
聽聽聽 聽聽聽 }
聽聽聽 聽聽聽 _ph = _ph;
聽聽聽 聽聽聽 _ph->inc();
聽聽聽 }
聽聽聽 bool operator==(const T* p) {
聽聽聽 聽聽聽 return _ph->ptr == p;
聽聽聽 }
聽聽聽 bool operator==(const SmartHandlePtr& shp){
聽聽聽 聽聽聽 return _ph == shp._ph;
聽聽聽 }
聽聽聽 T* operator->(){
聽聽聽 聽聽聽 return (T*)_ph->ptr;
聽聽聽 }
聽聽聽 T* get(){
聽聽聽 聽聽聽 if( _ph && _ph->ptr){
聽聽聽 聽聽聽 聽聽聽 return (T*)_ph->ptr;
聽聽聽 聽聽聽 }
聽聽聽 聽聽聽 return NULL;
聽聽聽 }
private:
聽聽聽 Handle*聽聽聽 _ph;
};
]]>