集成cocos2dx中的CHttpClient到lua中
2014-01-29 16:11
357 查看
不知道为什么cocos2dx中似乎没有把extensions/network里的HttpClient集成进去,自己试了一下DIY也不是很难,现总结如下
首先CCHttpRequest中的setResponseCallback需要处理一下,因为这里我们需要的是一个lua的回调而并非c++的,
处理方案参考CCSchduler中的scheduleScriptFunc,采用lua的handler来解决
最终代码如下:
pkg文件
LuaHttpRequest.h
LuaHttpRequest.cpp
注意使用tolua++的时候需要注意一下-L basic.lua
最终使用的lua代码如下
首先CCHttpRequest中的setResponseCallback需要处理一下,因为这里我们需要的是一个lua的回调而并非c++的,
处理方案参考CCSchduler中的scheduleScriptFunc,采用lua的handler来解决
最终代码如下:
pkg文件
class CCHttpClient : CCObject { static CCHttpClient *getInstance(); static void destroyInstance(); void send(CCHttpRequest* request); void setTimeoutForConnect(int value); int getTimeoutForConnect(); void setTimeoutForRead(int value); int getTimeoutForRead(); }; class CCHttpRequest : CCObject { typedef enum { kHttpGet, kHttpPost, kHttpPut, kHttpDelete, kHttpUnkown, } HttpRequestType; void setRequestType(HttpRequestType type); HttpRequestType getRequestType(); void setUrl(const char* url); const char* getUrl(); void setRequestData(const char* buffer, unsigned int len); char* getRequestData(); int getRequestDataSize(); void setTag(const char* tag); const char* getTag(); }; class CCLuaHttpRequest: CCHttpRequest { void setResponseScriptCallback(LUA_FUNCTION aHandler); static CCLuaHttpRequest* create(); static bool mkdirs(std::string aDir); };
LuaHttpRequest.h
#ifndef CCLUAHTTPREQUEST_H_ #define CCLUAHTTPREQUEST_H_ #include <network/HttpClient.h> USING_NS_CC; USING_NS_CC_EXT; class CCLuaHttpRequest: public CCHttpRequest { public: CCLuaHttpRequest(); virtual ~CCLuaHttpRequest(); public: static CCLuaHttpRequest* create(); static bool mkdirs(std::string aDir); /** * 设置一个用于回调的lua函数 */ void setResponseScriptCallback(unsigned int aHandler); private: /** * 默认的用于c++的回调,由这里统一处理到lua的回调 */ void responseScriptCallback(CCHttpClient* apClient, CCHttpResponse* apResponse); private: /** * 当前保存的handler */ unsigned int mHandler; }; #endif /* CCLUAHTTPREQUEST_H_ */
LuaHttpRequest.cpp
#include "LuaHttpRequest.h" #include "CCLuaEngine.h" #include <sys/stat.h> #include <sys/types.h> #include <errno.h> CCLuaHttpRequest::CCLuaHttpRequest() : mHandler(0) { } CCLuaHttpRequest::~CCLuaHttpRequest() { } CCLuaHttpRequest* CCLuaHttpRequest::create() { return new CCLuaHttpRequest; } bool CCLuaHttpRequest::mkdirs(std::string aDir) { if (aDir.size() == 0) { return true; } CCLOG("creating dir:%s", aDir.c_str()); bool isFirst = aDir[0] == '/'; bool isLast = false; for (unsigned int i = 1; i < aDir.size(); i++) { if (aDir[i] == '/') { if (isLast) { continue; } isLast = true; if (isFirst) { isFirst = false; continue; } std::string path = aDir.substr(0, i); if (CCFileUtils::sharedFileUtils()->isFileExist(path.c_str())) { CCLOG("path:%s exist", path.c_str()); continue; } int ret = mkdir(path.c_str(), 0700); if (ret && errno != EEXIST) { CCLOG("mkdir:%s failed", path.c_str()); return false; } else { CCLOG("path:%s created", path.c_str()); } } else { isLast = false; } } return true; } void CCLuaHttpRequest::setResponseScriptCallback(unsigned int aHandler) { mHandler = aHandler; setResponseCallback(this, httpresponse_selector(CCLuaHttpRequest::responseScriptCallback)); } void CCLuaHttpRequest::responseScriptCallback(CCHttpClient* apClient, CCHttpResponse* apResponse) { CCLuaEngine* pEngine = dynamic_cast<CCLuaEngine*>(CCScriptEngineManager::sharedManager()->getScriptEngine()); CCLuaStack* pStack = pEngine->getLuaStack(); bool isSucceed = apResponse->isSucceed(); int status = apResponse->getResponseCode(); const char* errorBuffer = apResponse->getErrorBuffer(); std::vector<char>* headerBuffer = apResponse->getResponseHeader(); std::vector<char>* bodyBuffer = apResponse->getResponseData(); std::string header(headerBuffer->begin(), headerBuffer->end()); std::string body(bodyBuffer->begin(), bodyBuffer->end()); pStack->pushCCObject(apResponse->getHttpRequest(), "CCHttpRequest"); pStack->pushBoolean(isSucceed); //是否成功 pStack->pushString(body.c_str(), body.size()); //body pStack->pushString(header.c_str()); //header pStack->pushInt(status); //状态码 pStack->pushString(errorBuffer); //错误描述 pStack->executeFunctionByHandler(mHandler, 6); pStack->clean(); }
注意使用tolua++的时候需要注意一下-L basic.lua
最终使用的lua代码如下
local request = CCLuaHttpRequest:create() request:setUrl(url) request:setTag(tag) request:setRequestType(CCHttpRequest.kHttpGet) request:setResponseScriptCallback(dlImageCallback) CCHttpClient:getInstance():send(request) request:release()
相关文章推荐
- 集成cocos2dx中的CHttpClient到lua中
- 【cocos2dx开发技巧7】脚本lua的使用--集成cocosbuilder
- cocos2dx lua集成protobuf
- 【cocos2dx开发技巧7】脚本lua的使用--集成cocosbuilder
- cocos2dx-lua用原生httpClient实现http请求
- cocos2dx-详细剖析lua(如何与lua集成,如何导出lua api,如何与lua交互)
- cocos2dx 高性能高斯模糊(包含lua接口)
- Mac下cocos2dx3.1用Cocos IDE写的Lua binding篇01
- 【步兵 cocos2dx】教你搭建一个嗖嗖的lua项目
- cocos2dx-lua 加载和绑定ccbi 中对象
- visual studio集成lua,语法高亮
- cocos2dx lua Sprite和ImageView切换图片
- Cocos2d-x lua 3.x VS集成Babelua 环境搭建与代码调试
- cocos2dx3.1-lua移植android流程
- cocos2dx 屏蔽3d功能导出到lua
- cocos2dx-lua中如何使用自定义类以及tolua++的使用
- [COCOS2DX-LUA]0-002.在C++中如何接收Lua方法,然后tolua
- cocos2dx lua 文件模板
- Cocos2d-x游戏开发之lua编辑器 Sublime 搭建,集成cocos2dLuaApi和自有类
- cocos2dx-lua绑定之代码编辑器