#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");

笔者试过,不可行。

cocos2dx 3.x lua 网络加载并且保存资源(unix、linux)的更多相关文章

  1. cocos2dx lua 热加载实现

    [Q]原创 2015-08-30 在公司使用cocos2dx+lua 开发游戏有一段时间了,刚好lua的热更新交给我负责.以前热更新的lua脚本大部分都是在下载之后加载.最近策划又有新需求,需要在游戏 ...

  2. XLua 网络加载(基础操作)

    LoadGameMethod  网上资源加载更新:加载场景中另建协程用来加载; public void LoadGameMethod() { StartCoroutine(start());      ...

  3. android快捷开发之Retrofit网络加载框架的简单使用

    大家都知道,安卓最大的特点就是开源化,这自然会产生很多十分好用的第三方API,而基本每一个APP都会与网络操作和缓存处理机制打交道,当然,你可以自己通过HttpUrlConnection再通过返回数据 ...

  4. android 网络加载图片,对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存

    经常会用到 网络文件 比如查看大图片数据 资源优化的问题,当然用开源的项目  Android-Universal-Image-Loader  或者 ignition 都是个很好的选择. 在这里把原来 ...

  5. ios -网络加载json和本地加载json

    1网络加载json的时候,要在模型的实现文件里写: - (void)setValue:(id)value forKey:(NSString *)key { } 2本地加载json的时候,要在模型的实现 ...

  6. iOS网络加载图片缓存策略之ASIDownloadCache缓存优化

    iOS网络加载图片缓存策略之ASIDownloadCache缓存优化   在我们实际工程中,很多情况需要从网络上加载图片,然后将图片在imageview中显示出来,但每次都要从网络上请求,会严重影响用 ...

  7. lua State加载部分库

    lua State加载部分库 在lua中,通常我们用luaL_openlibs(L)加载所有的lub标准库,但是有时候我们想只加载部分,有没有什么好的办法呢?在luaproc看到如下办法: stati ...

  8. IOS空数据页面,网络加载失败以及重新登陆View的封装(不需要继承)

    一.问题 对于B2C和B2B项目的开发者,可能会有一个订单列表为空,或者其他收藏页面为空,用户token失效,判断用户要重新登陆,以及后台服务错误等提示.本篇课文,看完大约10分钟. 原本自己不想写空 ...

  9. swift 基础小结01 --delegate、Optional、GCD的使用、request请求、网络加载图片并保存到沙箱、闭包以及桥接

    本文主要记录swift中delegate的使用.“?!”Optional的概念.GCD的使用.request请求.网络加载图片并保存到沙箱.闭包以及桥接. 一.delegate的使用 swift中de ...

随机推荐

  1. 洛谷P1549 棋盘问题(2)

    P1549 棋盘问题(2) 题目描述 在N*N的棋盘上(1≤N≤10),填入1,2,…,N*N共N*N个数,使得任意两个相邻的数之和为素数. 例如:当N=2时,有: 其相邻数的和为素数的有: 1+2, ...

  2. 洛谷P4218 [CTSC2010]珠宝商(后缀自动机+点分治)

    传送门 这题思路太清奇了……->题解 //minamoto #include<iostream> #include<cstdio> #include<cstring ...

  3. Ajax遇到的那些坑

    提前说明:这里我用的是Windows系统,所以解决问题的方法也是仅限Windows系统,浏览器使用Chrome 第一个坑:Access to XMLHttpRequest at 'file:///C: ...

  4. 利用正则取出Stirng中“”引号内的内容

    // 取出所有""中间的内容,正则如下 Pattern pattern1 = Pattern.compile("(?<=\")([\\S]+?)(?=\& ...

  5. PartTime_网址_内

    http://www.360doc.com/content/15/0930/12/28012971_502432950.shtml 2015所有适合程序员接私活的网站 请把 @ 换成 . 猪八戒    ...

  6. RL_RTX函数

    1 延时:os_itv_set(usFrequency) //设置延时周期,配合os_itv_wait使用:os_itv_wait() 是绝对延迟是包含调用前的时间, os_dly_wait() 是相 ...

  7. AD7606笔记

    V1~V8共8个ADC通道: REFIN/OUT:基准电源,可选择内部(REF_SLECT=1)的或者外部的(REF_SLECT=0) VDIRVE:MCU的的VCC,2.3~5V.逻辑电平指的是需要 ...

  8. Sam's Numbers 矩阵快速幂优化dp

    https://www.hackerrank.com/contests/hourrank-21/challenges/sams-numbers 设dp[s][i]表示产生的总和是s的时候,结尾符是i的 ...

  9. MyBatis配置文件之概述

    MyBatis配置文件所有元素 <?xml version="1.0" encoding="UTF-8"?> <configuration&g ...

  10. Java Lambda表达式教程与示例

    Lambda表达式是Java 8中引入的一个新特性.一个lambda表达式是一个匿名函数,而且这个函数没有名称且不属于任何类.lambda表达式的概念最初是在LISP编程语言中引入的. Java La ...