• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

cocos2dx3.xlua网络加载并且保存资源(unix、linux)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

#ifndef __DazzleParkour__TextLoader__

#define __DazzleParkour__TextLoader__

 

#include <stdio.h>

#include "cocos2d.h"

#include "network/HttpClient.h"

#include "CCLuaValue.h"

 

using namespace cocos2d::network;

using namespace cocos2d;

using namespace std;

 

class TextLoader

{

public:

    static TextLoader*create(const char* url,const char* requestData,const char* tag,string textName,string savePath,LUA_FUNCTION callback){

        TextLoader * instance = new TextLoader();

        instance->doHttpRequest(url,requestData,tag,textName,savePath,callback);

        return instance;

    }

    void onHttpRequestImageCompleted(HttpClient *sender, HttpResponse *response);

    void doHttpRequest(const char* url,const char* requestData,const char* tag,string textName,string savePath,LUA_FUNCTION callback);

private:

    string m_textName;

    string m_savePath;

    char m_url[500];

    LUA_FUNCTION m_callback;

};

 

#endif

 

//安卓项目需要获取网络权限

#include <stdio.h>

#include "TextLoader.h"

#include "ImageLoader.h"

#include <sys/types.h>

#include <sys/stat.h>

#include <errno.h>

#include <dirent.h>

#include "CCLuaStack.h"

#include "CCLuaEngine.h"

#include "StringUtils.h"

 

 

void TextLoader::onHttpRequestImageCompleted(HttpClient *sender, HttpResponse *response)

{

    if (!response)

    {

        return;

    }

    const char* tag  =  response->getHttpRequest()->getTag();

    

    if (0 != strlen(tag))

    {

        log("%s completed", response->getHttpRequest()->getTag());

    }

    

    if (!response->isSucceed())

    {

        log("error buffer: %s", response->getErrorBuffer());

        log("error buffer: %s",this->m_url

            );

        return;

    }

 //检测当前目录下是否存在保存目录,不存在则创建

    DIR *dir = nullptr;

    dir = opendir (this->m_savePath.c_str());

    if (!dir)

    {

        vector<string> v;

        split(this->m_savePath,v,"/");

        string path = FileUtils::getInstance()->getWritablePath();

        for (size_t i = 0; i < v.size(); ++ i)

        {

            path+=v[i];

            path+="/";

            int ret = mkdir(path.c_str(), S_IRWXU | S_IRWXG | S_IRWXO);

            if(ret!=0)

            {

                log("fail to createDirectory");

            }

        }

       

    }

 

    string path = FileUtils::getInstance()->getWritablePath()+this->m_textName;

    FILE*file=fopen(path.c_str(),"w+");

    

    std::vector<char> *buffer = response->getResponseData();

    string data = string(buffer->begin(),buffer->end());

   

    fwrite(data.c_str(), sizeof(char), data.size(), file);

    fclose(file);

    LuaStack* pStack = LuaEngine::getInstance()->getLuaStack();//调用lua回调函数

    //第一个参数是函数的整数句柄,第二个参数是函数参数个数

    pStack->clean();

    

    pStack->executeFunctionByHandler(this->m_callback,0);

}

 

void TextLoader::doHttpRequest(const char* url,const char* requestData,const char* tag,string textName,string savePath,LUA_FUNCTION callback)

{

    HttpRequest* request = new HttpRequest();

    request->setUrl(url);

    request->setRequestType(HttpRequest::Type::POST);

    

    //这是回调对象和回调函数

    request->setResponseCallback(CC_CALLBACK_2(TextLoader::onHttpRequestImageCompleted, this));

    request->setTag(tag);

    

    //请求的数据

    if(strlen(requestData)!=0){

        request->setRequestData(requestData,strlen(requestData));

    }

    HttpClient::getInstance()->send(request);

    this->m_textName = textName;

    this->m_savePath = savePath;

    this->m_callback = callback;

    strcpy(this->m_url, url);

    //释放内存

    request->release();

}

 

 

注意:在lua取栈的回调函数需要使用调用

LUA_FUNCTION handler =  toluafix_ref_function(tolua_S,栈位置,0);

TextLoader* ret = TextLoader::create(arg0, arg1, arg2, arg3, arg4, handler);

 

自带lua打包工具会使用:

bool ok = luaval_to_int32(tolua_S, 7,(int *)&handler, "TextLoader:create");

笔者试过,不可行。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
nginx+lua设置跨域发布时间:2022-07-22
下一篇:
tolua++实现lua层调用c++技术分析发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap