Files
LayaNative2.0/Conch/source/conch/JSWrapper/LayaWrap/JSGlobalExportCFun.cpp
T
2020-11-11 16:17:13 +08:00

528 lines
18 KiB
C++

/**
@file JSGlobalExportCFun.cpp
@brief
@author James
@version 1.0
@date 2013_11_12
*/
#include "JSGlobalExportCFun.h"
#include "../JSInterface/JSInterface.h"
#include <util/Log.h>
#include <util/JCCommonMethod.h>
#include <fileSystem/JCFileSystem.h>
#include <util/JCMemorySurvey.h>
#include <util/JCLayaUrl.h>
#include <util/JCCrypto.h>
#include <util/Log.h>
#include "JSConsole.h"
#include "XMLHttpRequest.h"
#include "JSConchConfig.h"
#include "JSXmlNode.h"
#include "JSXmlAttr.h"
#include "JSDOMParser.h"
#include "JSAudio.h"
#include "JSAppCache.h"
#include "JSWebSocket.h"
#include "JSFileSystem.h"
#include "JSZip.h"
#include "JSNotify.h"
#ifdef ANDROID
#include "JSAndroidEditBox.h"
#include "../../CToJavaBridge.h"
#elif WIN32
#include <Windows.h>
#include "JSWindowEditBox.h"
#elif __APPLE__
#include "JSIOSEditBox.h"
#include "CToObjectC.h"
#endif
#include "JSRuntime.h"
#include "../../JCConch.h"
#include <downloadCache/JCFileSource.h>
#include "JSImage.h"
#include "JSHistory.h"
#include "JSTextMemoryCanvas.h"
#include <downloadMgr/JCDownloadMgr.h>
#include "JSLayaGL.h"
#include "JSShaderActiveInfo.h"
#include "JSTextBitmapInfo.h"
#include "JSShaderPrecisionFormat.h"
#include "JSCallbackFuncObj.h"
#include "Bullet/bullet_glue.h"
#include "Video/JSVideo.h"
#include <LayaGL/JCLayaGLDispatch.h>
#include "JCWebGLPlus.h"
#include "Bullet/LayaBulletExport.h"
extern int g_nInnerWidth ;
extern int g_nInnerHeight ;
extern bool g_bGLCanvasSizeChanged;
#ifdef WIN32
int g_bEnableTouch = false;
#elif ANDROID
int g_bEnableTouch = true;
#elif __APPLE__
int g_bEnableTouch = true;
#endif
std::string g_sExePath = "";
/** @brief 这个函数是为了实现comman库中的alert函数
* 不定长的函数
*/
void alert(const char* fmt, ...)
{
char buf[1024];
char* pBuf = NULL;
va_list args;
va_start(args, fmt);
int len = vsprintf(buf, fmt, args);
if (len < 0) {
pBuf = new char[4096];
len = vsprintf(pBuf, fmt, args);
}
va_end(args);
laya::LayaAlert(pBuf ? pBuf : buf);
if (pBuf)
{
delete[] pBuf;
}
}
namespace laya
{
//下载大文件,zip用的
struct JSFuncWrapper :public JsObjBase
{
enum { onprogid, oncompid };
static JsObjClassInfo JSCLSINFO;
JsObjHandle funcOnProg;
JsObjHandle funcOnComp;
bool stop;
JSFuncWrapper(JSValueAsParam onprog, JSValueAsParam onComp)
{
createJSObj();
funcOnProg.set(onprogid, this, onprog);
funcOnComp.set(oncompid, this, onComp);
stop = false;
}
};
ADDJSCLSINFO(JSFuncWrapper, JSObjNode);
void downloadBig_onProg_js(JSFuncWrapper* pWrapper, unsigned int total, unsigned int now, float speed)
{
if (pWrapper->funcOnProg.Empty())return;
pWrapper->funcOnProg.Call(total, now, speed);
pWrapper->stop = __TransferToCpp<bool>::ToCpp(pWrapper->funcOnProg.m_pReturn);
}
int downloadBig_onProg(unsigned int total, unsigned int now, float speed, JSFuncWrapper* pWrapper)
{
if (pWrapper && pWrapper->stop)return 1;
JCScriptRuntime::s_JSRT->m_pPoster->postToJS(std::bind(downloadBig_onProg_js, pWrapper, total, now, speed));
return 0;
}
void downloadBig_onComp_js(int curlret, int httpret, JSFuncWrapper* pWrapper)
{
if (!pWrapper->IsMyJsEnv()){
delete pWrapper;
return;
}
if (!pWrapper->funcOnComp.Empty())
{
pWrapper->funcOnComp.Call(curlret,httpret);
}
delete pWrapper;
}
void downloadBig_onComp(JCBuffer& buff, const std::string& localip,const std::string& svip, int curlret, int httpret,const std::string& httpresheader, JSFuncWrapper* pWrapper)
{
JCScriptRuntime::s_JSRT->m_pPoster->postToJS(std::bind(downloadBig_onComp_js, curlret,httpret, pWrapper));
}
long _downloadBigFile(const char* p_pszUrl, const char* p_pszLocal, JSValueAsParam p_ProgCb,JSValueAsParam p_CompleteCb, int p_nTryNum, int p_nOptTimeout)
{
/*
if (!canWrite(pCurProcess->getFSPermission(p_pszLocal))) {
JSP_THROW("downloadBigFile to this localfile is forbidden!");
LOGE("本用户不允许在%s目录下写文件", p_pszLocal);
return 0;
}
*/
JCDownloadMgr* dmgr = JCDownloadMgr::getInstance();
JSFuncWrapper* pJSObj = new JSFuncWrapper(p_ProgCb, p_CompleteCb);
dmgr->downloadBigFile(p_pszUrl, p_pszLocal,
std::bind(downloadBig_onProg, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, pJSObj),
std::bind(downloadBig_onComp, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, pJSObj),
p_nTryNum, p_nOptTimeout);;
return (long)pJSObj;
}
void downloadHeader_onComp_js(char* pBuff, int curlret, int httpret, JSFuncWrapper* pWrapper)
{
if (!pWrapper->IsMyJsEnv())
{
delete pWrapper;
return;
}
if (!pWrapper->funcOnComp.Empty())
{
if (pBuff)
{
pWrapper->funcOnComp.Call(curlret, httpret, pBuff);
delete [] pBuff;
}
else
{
pWrapper->funcOnComp.Call(curlret, httpret);
}
}
delete pWrapper;
}
void downloadHeader_onComp(JCBuffer& buff, const std::string& localip,
const std::string& svip, int curlret, int httpret,
const std::string& httpresheader, JSFuncWrapper* pWrapper)
{
char* pBuff = nullptr;
if (buff.m_pPtr && buff.m_nLen)
{
//这个肯定是字符串
pBuff = new char[buff.m_nLen+1];
memcpy(pBuff, buff.m_pPtr, buff.m_nLen);
pBuff[buff.m_nLen] = 0;
}
JCScriptRuntime::s_JSRT->m_pPoster->postToJS(std::bind(downloadHeader_onComp_js, pBuff, curlret, httpret, pWrapper));
}
long _downloadGetHeader(const char* p_pszUrl, JSValueAsParam p_CompleteCb, int p_nTryNum, int p_nOptTimeout)
{
JCDownloadMgr* dmgr = JCDownloadMgr::getInstance();
JSFuncWrapper* pJSObj = new JSFuncWrapper(p_CompleteCb, p_CompleteCb);//第一个没有用
dmgr->getHeader(p_pszUrl,
std::bind(downloadHeader_onComp, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, pJSObj),
p_nTryNum, p_nOptTimeout);
return (long)pJSObj;
}
void setTouchEvtFunc(JSValueAsParam pObj)
{
}
void setKeyEvtFunc(JSValueAsParam pObj)
{
}
void setJoystickEvtFunc(JSValueAsParam pObj)
{
}
void evalJS(const char* p_sSource)
{
JSP_RUN_SCRIPT(p_sSource);
}
void JSPrint(const char* p_sBuffer)
{
int nLen = strlen(p_sBuffer) + 3;
unsigned short* ucStr = new unsigned short[nLen];
int nlen = UTF8StrToUnicodeStr((unsigned char*)p_sBuffer, ucStr, nLen);
LOGI("%ws\n", (wchar_t*)ucStr);
delete[] ucStr;
ucStr = NULL;
}
void LayaAlert(const char* p_sBuffer)
{
#ifdef WIN32
int nLen = strlen(p_sBuffer) + 3;
unsigned short* ucStr = new unsigned short[nLen];
int nlen = UTF8StrToUnicodeStr((unsigned char*)p_sBuffer, ucStr, nLen);
delete[] ucStr;
ucStr = NULL;
std::wstring wsBuffer = (wchar_t*)utf8_unicode(p_sBuffer).c_str();
MessageBoxW(NULL, wsBuffer.c_str(), L"alert", MB_OK);
#elif ANDROID
std::string strBuffer = p_sBuffer;
CToJavaBridge::JavaRet kRet;
CToJavaBridge::GetInstance()->callMethod(CToJavaBridge::JavaClass.c_str(), "alert", strBuffer.c_str(), kRet);
#elif __APPLE__
CToObjectCAlert(p_sBuffer);
#endif
}
void JSAlert(const char* p_sBuffer)
{
LayaAlert(p_sBuffer);
#ifndef WIN32
LOGI("alert=%s", p_sBuffer);
#endif
}
int getInnerWidth()
{
return g_nInnerWidth;
}
int getInnerHeight()
{
return g_nInnerHeight;
}
int getDevicePixelRatio()
{
#ifdef WIN32
return 1.0;
#elif ANDROID
return 1.0;
#elif __APPLE__
return 1.0;// CToObjectCGetDevicePixelRatio();
#endif
}
JsValue getExePath()
{
#ifdef WIN32
TCHAR szPath[MAX_PATH];
::GetModuleFileName(NULL, szPath, MAX_PATH);
::GetFullPathName(szPath, MAX_PATH, szPath, NULL);
g_sExePath = szPath;
return JSP_TO_JS(const char*, g_sExePath.c_str());
#elif __APPLE__
return JSP_TO_JS_NULL;
#else
return JSP_TO_JS_NULL;
#endif
}
void PerfAddData(int nID, int nColor, float fScale, float fAlert )
{
if (g_kSystemConfig.m_nThreadMODE == THREAD_MODE_DOUBLE)
{
JCScriptRuntime::s_JSRT->flushSharedCmdBuffer();
JCCommandEncoderBuffer* pCmd = JCScriptRuntime::s_JSRT->m_pRenderCmd;
pCmd->append(LAYA_PERFADDDATA);
pCmd->append(nID);
pCmd->append(nColor);
pCmd->append(fScale);
pCmd->append(fAlert);
}
else
{
JCPerfHUD::addData(nID, nColor, fScale, fAlert);
}
}
void PerfUpdateDt(int nID, float nSpace)
{
if (g_kSystemConfig.m_nThreadMODE == THREAD_MODE_DOUBLE)
{
JCScriptRuntime::s_JSRT->flushSharedCmdBuffer();
JCCommandEncoderBuffer* pCmd = JCScriptRuntime::s_JSRT->m_pRenderCmd;
pCmd->append(LAYA_PERFUPDATEDT);
pCmd->append(nID);
pCmd->append(nSpace);
}
else
{
JCPerfHUD::updateData(nID, nSpace);
}
}
void PerfShow(float f)
{
JCPerfHUD::m_fGlobalScale = f;
JCPerfHUD::init();
JCConch::s_pConchRender->m_fShowPerfScale = f;
}
void writeStrFileSync(const char* p_pszFile, const char* p_pString )
{
JCBuffer buf((char*)p_pString, strlen(p_pString), false, false);
writeFileSync(p_pszFile, buf, JCBuffer::utf8);
}
void reloadCurJSThread()
{
#ifdef __APPLE__
CToObjectCRunStopJSLoop();
#endif
if (JCConch::s_pConch)
{
JCConch::s_pConch->postCmdToMainThread(JCConch::CMD_ReloadProcess, 0, 0);
}
}
std::string readTextAsset(const char* p_pszFile)
{
char* sBuffer = NULL;
int nSize = 0;
if (JCConch::s_pAssetsFiles->loadFileContent(p_pszFile, sBuffer, nSize))
{
std::string rsBuffer = sBuffer;
delete[] sBuffer;
return rsBuffer;
}
return "";
}
bool gbAlertException = true;
void showAlertOnJsException(bool show)
{
gbAlertException = show;
}
std::string calcMD5(unsigned char* buf, int len)
{
JCMD5 imd5;
imd5.GenerateMD5(buf, len);
return imd5.ToString();
}
std::string calcMD5_JSAB(JSValueAsParam pjs)
{
char* pABPtr = NULL;
int nABLen = 0;
if (!extractJSAB(pjs, pABPtr, nABLen))return "";
std::string ret = calcMD5((unsigned char*)pABPtr, nABLen);
return ret;
}
static std::string toBase64(const char* type, float encoderOptions, JSValueAsParam ab, int w, int h, bool flipY)
{
char* pPixels = NULL;
int nABLen = 0;
bool bIsArrayBuffer = extractJSAB(ab, pPixels, nABLen);
int size = sizeof(GLubyte) * w * h * 4;
if (!bIsArrayBuffer || w == 0 || h == 0 || size != nABLen)
{
const char* pstrHeader = "data:";
int length = strlen(pstrHeader);
std::unique_ptr<char[]> pDest(new char[length + 1]);
memcpy(pDest.get(), pstrHeader, length);
pDest.get()[length] = '\0';
return string(pDest.get());
}
if (flipY)
{
laya::flipPixelsY((uint8_t*)pPixels, w * 4, h);
}
string strType(type);
int length = (size + 2) / 3 * 4;
std::unique_ptr<char[]> pDest(new char[length]);
memset(pDest.get(), 0, length);
char *pCurrent = pDest.get();
std::pair<unsigned char*, unsigned long> result;
if (strType == "image/jpeg")
{
const char* pstrHeader = "data:image/jpeg;base64,";
int length = strlen(pstrHeader);
for (int i = 0; i < length; i++)
{
*pCurrent = pstrHeader[i];
pCurrent++;
}
result = convertBitmapToJpeg((const char*)pPixels, w, h, 32);
}
else
{
const char* pstrHeader = "data:image/png;base64,";
int length = strlen(pstrHeader);
for (int i = 0; i < length; i++)
{
*pCurrent = pstrHeader[i];
pCurrent++;
}
result = laya::convertBitmapToPng((const char*)pPixels, w, h, 8);
}
base64Encode(pCurrent, (const char*)result.first, result.second);
delete[] result.first;
return string(pDest.get());
}
std::string conchToBase64FlipY(const char* type, float encoderOptions, JSValueAsParam ab, int w, int h)
{
return toBase64(type, encoderOptions, ab, w, h, true);
}
std::string conchToBase64(const char* type, float encoderOptions, JSValueAsParam ab, int w, int h)
{
return toBase64(type, encoderOptions, ab, w, h, false);
}
void JSGlobalExportC()
{
JSP_GLOBAL_START1();
JSRuntime* pJSRuntime = new JSRuntime();
pJSRuntime->exportJS();
JSHistory* pJsHistory = new JSHistory();
pJsHistory->exportJS();
JSConsole::exportJS();
JSImage::exportJS();
XMLHttpRequest::exportJS();
JSConchConfig::getInstance()->exportJS();
JSXmlDocument::exportJS();
JSXmlNode::exportJS();
JSXmlAttr::exportJS();
JSDOMParser::exportJS();
JSAudio::exportJS();
JsAppCache::exportJS();
JSWebSocket::exportJS();
JSZip::exportJS();
JSNotify::exportJS();
if (JSLayaGL::s_pLayaGL != NULL)
{
delete JSLayaGL::s_pLayaGL;
JSLayaGL::s_pLayaGL = NULL;
}
JSLayaGL::getInstance()->exportJS();
JSShaderActiveInfo::exportJS();
JSShaderPrecisionFormat::exportJS();
#ifdef WIN32
JSWindowEditBox::exportJS();
#elif ANDROID
JSAndroidEditBox::exportJS();
#elif __APPLE__
JSIOSEditBox::exportJS();
#endif
//JSTextCanvas
JSTextBitmapInfo::exportJS();
if (JSTextMemoryCanvas::ms_pTextMemoryCanvas != NULL)
{
delete JSTextMemoryCanvas::ms_pTextMemoryCanvas;
JSTextMemoryCanvas::ms_pTextMemoryCanvas = NULL;
}
JSTextMemoryCanvas::getInstance()->exportJS();
JSCallbackFuncObj::exportJS();
#ifdef __APPLE__
JSContextRef ctx = laya::__TlsData::GetInstance()->GetCurContext();
JCWebGLPlus::getInstance()->exportJS((void*)ctx, JSContextGetGlobalObject(ctx));
#else
v8::Isolate* isolate = v8::Isolate::GetCurrent();
v8::Local<v8::Context> context = isolate->GetCurrentContext();
//v8::Local<v8::Object> object = v8::Object::New(isolate);
//context->Global()->Set(v8::String::NewFromUtf8(isolate, "qq"), object);
v8::Local<v8::Object> object = context->Global();
JCWebGLPlus::getInstance()->exportJS((void*)NULL, &object);
#endif
JSVideo::exportJS();
//以下是全局函数
//------------------------------------------------------------------------------
JSP_ADD_GLOBAL_FUNCTION(setTouchEvtFunction, setTouchEvtFunc, JSValueAsParam);
JSP_ADD_GLOBAL_FUNCTION(setKeyEvtFunction, setKeyEvtFunc, JSValueAsParam);
JSP_ADD_GLOBAL_FUNCTION(setJoystickEvtFunction, setJoystickEvtFunc, JSValueAsParam);
JSP_ADD_GLOBAL_FUNCTION(tmGetCurms, tmGetCurms);
JSP_ADD_GLOBAL_FUNCTION(reloadJS, reloadCurJSThread);
JSP_ADD_GLOBAL_FUNCTION(getExePath, getExePath);
JSP_ADD_GLOBAL_FUNCTION(getInnerHeight, getInnerHeight);
JSP_ADD_GLOBAL_FUNCTION(getInnerWidth, getInnerWidth);
JSP_ADD_GLOBAL_FUNCTION(getDevicePixelRatio, getDevicePixelRatio);
JSP_ADD_GLOBAL_PROPERTY(enableTouch, g_bEnableTouch);
JSP_ADD_GLOBAL_FUNCTION(alert, JSAlert, const char*);
JSP_ADD_GLOBAL_FUNCTION(print, JSPrint, const char*);
JSP_ADD_GLOBAL_FUNCTION(evalJS, evalJS, const char*);
JSP_ADD_GLOBAL_FUNCTION(PerfShow, PerfShow, int);
JSP_ADD_GLOBAL_FUNCTION(PerfAddData, PerfAddData, int,int,float,float);
JSP_ADD_GLOBAL_FUNCTION(PerfUpdateDt, PerfUpdateDt, int,float);
JSP_ADD_GLOBAL_FUNCTION(readFileSync, readFileSync1, const char*, const char*);
JSP_ADD_GLOBAL_FUNCTION(writeStrFileSync, writeStrFileSync, const char*, const char*);
JSP_ADD_GLOBAL_FUNCTION(readTextAsset, readTextAsset, const char*);
JSP_ADD_GLOBAL_FUNCTION(fs_exists, JSFileSystem::exists, const char*);
JSP_ADD_GLOBAL_FUNCTION(fs_mkdir, JSFileSystem::mkdir, const char*);
JSP_ADD_GLOBAL_FUNCTION(fs_rm, JSFileSystem::rm, const char*);
JSP_ADD_GLOBAL_FUNCTION(fs_rmDir, JSFileSystem::rmDir);
JSP_ADD_GLOBAL_FUNCTION(fs_rmDirSync, JSFileSystem::rmDirSync);
JSP_ADD_GLOBAL_FUNCTION(fs_readdirSync, JSFileSystem::readdirSync);
JSP_ADD_GLOBAL_FUNCTION(fs_lstatSync, JSFileSystem::lstatSync);
JSP_ADD_GLOBAL_FUNCTION(fs_writeFileSync, JSFileSystem::JSWriteFileSync);
JSP_ADD_GLOBAL_FUNCTION(decodeTemp, UrlDecode);//以后实现各和JS一样的这个就可以删了
JSP_ADD_GLOBAL_FUNCTION(showAlertOnJsException, showAlertOnJsException,bool);
JSP_ADD_GLOBAL_FUNCTION(fs_readFileSync, JSFileSystem::readBinFileSync, const char*);//这个返回的是ArrayBuffer接口
JSP_ADD_GLOBAL_FUNCTION(downloadBigFile, _downloadBigFile);
JSP_ADD_GLOBAL_FUNCTION(downloadGetHeader, _downloadGetHeader);
JSP_ADD_GLOBAL_FUNCTION(calcmd5, calcMD5_JSAB);
JSP_ADD_GLOBAL_FUNCTION(conchToBase64, conchToBase64);
JSP_ADD_GLOBAL_FUNCTION(conchToBase64FlipY, conchToBase64FlipY);
ExportJS_bullet();
JSLayaConchBullet::exportJS();
}
}
//------------------------------------------------------------------------------
//-----------------------------END FILE--------------------------------