mac版支持RDP录像回放了。
							parent
							
								
									eeedf21323
								
							
						
					
					
						commit
						838bcb5979
					
				|  | @ -226,10 +226,10 @@ def make_options(): | |||
|     # options = list() | ||||
|     # options_idx = 0 | ||||
| 
 | ||||
|     if ctx.host_os in ['windows', 'macos']: | ||||
|     if ctx.host_os in ['windows']: | ||||
|         add_option('x86', 'ver', 'Update version setting') | ||||
|         add_option('x86', 'pysrt', 'Make Python-Runtime for python%s-x86' % env.py_ver_str) | ||||
|         add_option('x64', 'external', 'Build external dependency') | ||||
|         add_option('x86', 'external', 'Build external dependency') | ||||
|         add_split() | ||||
|         add_option('x86', 'assist-exe', 'Assist Execute [%s]' % ctx.target_path) | ||||
|         # add_option('x86', 'assist-rdp', 'Teleport RDP [%s]' % ctx.target_path) | ||||
|  | @ -238,6 +238,9 @@ def make_options(): | |||
|         add_option('x86', 'server', 'Teleport Server [%s]' % ctx.target_path) | ||||
|         add_split() | ||||
|         add_option('x86', 'installer', 'Teleport Installer for %s' % ctx.host_os) | ||||
|     elif ctx.host_os == 'macos': | ||||
|         add_option('x64', 'assist-exe', 'Assist Execute [%s]' % ctx.target_path) | ||||
|         add_option('x64', 'assist-installer', 'Assist Installer') | ||||
|     else: | ||||
|         add_option('x64', 'ver', 'Update version setting') | ||||
|         add_option('x64', 'pysrt', 'Make Python-Runtime for python%s-x64' % env.py_ver_str) | ||||
|  |  | |||
|  | @ -45,7 +45,7 @@ class BuilderWin(BuilderBase): | |||
|         out_file = os.path.join(env.root_path, 'out', 'client', ctx.bits_path, ctx.target_path, 'tp-player.exe') | ||||
|         if os.path.exists(out_file): | ||||
|             utils.remove(out_file) | ||||
|         utils.qt_build_win(prj_path, 'tp-player', ctx.bits_path, ctx.target_path) | ||||
|         utils.qt_build(prj_path, 'tp-player', ctx.bits_path, ctx.target_path) | ||||
|         utils.ensure_file_exists(out_file) | ||||
| 
 | ||||
|     # def build_rdp(self): | ||||
|  | @ -72,7 +72,6 @@ class BuilderWin(BuilderBase): | |||
| 
 | ||||
|         utils.ensure_file_exists(out_file) | ||||
| 
 | ||||
| 
 | ||||
|     @staticmethod | ||||
|     def _build_installer(): | ||||
|         tmp_path = os.path.join(env.root_path, 'dist', 'client', 'windows', 'assist') | ||||
|  | @ -155,13 +154,28 @@ class BuilderMacOS(BuilderBase): | |||
|         utils.ensure_file_exists(os.path.join(out_file, 'Contents', 'Info.plist')) | ||||
| 
 | ||||
|     def build_player(self): | ||||
|         cc.o('skip build tp_player now...') | ||||
|         cc.i('build tp-player...') | ||||
|         prj_path = os.path.join(env.root_path, 'client', 'tp-player') | ||||
|         out_file = os.path.join(env.root_path, 'out', 'client', ctx.bits_path, ctx.target_path, 'tp-player.app') | ||||
|         if os.path.exists(out_file): | ||||
|             utils.remove(out_file) | ||||
|         utils.qt_build(prj_path, 'tp-player', ctx.bits_path, ctx.target_path) | ||||
|         utils.ensure_file_exists(os.path.join(out_file, 'Contents', 'Info.plist')) | ||||
| 
 | ||||
|         # for deployment | ||||
|         utils.qt_deploy(out_file) | ||||
| 
 | ||||
|     def build_installer(self): | ||||
|         cc.i('make tp_assist dmg file...') | ||||
| 
 | ||||
|         # copy all files of tp-player. | ||||
|         configuration = ctx.target_path.capitalize() | ||||
|         player_path = os.path.join(env.root_path, 'out', 'client', ctx.bits_path, ctx.target_path) | ||||
|         assist_path = os.path.join(env.root_path, 'client', 'tp_assist_macos', 'build', configuration, 'TP-Assist.app') | ||||
|         utils.copy_ex(player_path, assist_path, 'tp-player.app') | ||||
| 
 | ||||
|         json_file = os.path.join(env.root_path, 'dist', 'client', 'macos', 'dmg.json') | ||||
|         dmg_file = os.path.join(env.root_path, 'out', 'client', 'macos', 'teleport-assist-macos-{}.dmg'.format(VER_TP_ASSIST)) | ||||
|         dmg_file = os.path.join(env.root_path, 'out', 'installer', 'teleport-assist-macos-{}.dmg'.format(VER_TP_ASSIST)) | ||||
|         if os.path.exists(dmg_file): | ||||
|             utils.remove(dmg_file) | ||||
| 
 | ||||
|  |  | |||
|  | @ -153,7 +153,11 @@ class Env(object): | |||
|             else: | ||||
|                 self.qt = None | ||||
| 
 | ||||
|         elif self.is_linux or self.is_macos: | ||||
|             if self.qt is None or not os.path.exists(self.qt): | ||||
|                 if warn_miss_tool: | ||||
|                     cc.w(' - can not locate `qt`, so I can not build tp-player.') | ||||
| 
 | ||||
|         elif self.is_linux: | ||||
|             if 'cmake' in _tmp: | ||||
|                 self.cmake = _tmp['cmake'] | ||||
|             else: | ||||
|  | @ -163,6 +167,16 @@ class Env(object): | |||
|                 if warn_miss_tool: | ||||
|                     cc.e(' - can not locate `cmake`, so I can not build binary from source.') | ||||
| 
 | ||||
|         elif self.is_macos: | ||||
|             if 'qt' in _tmp: | ||||
|                 self.qt = _tmp['qt'] | ||||
|             else: | ||||
|                 self.qt = None | ||||
| 
 | ||||
|             if self.qt is None or not os.path.exists(self.qt): | ||||
|                 if warn_miss_tool: | ||||
|                     cc.w(' - can not locate `qt`, so I can not build tp-player.') | ||||
| 
 | ||||
|         return True | ||||
| 
 | ||||
|     def _load_version(self): | ||||
|  |  | |||
|  | @ -300,7 +300,7 @@ def sys_exec(cmd, direct_output=False, output_codec=None): | |||
| 
 | ||||
|     ret = p.wait() | ||||
| 
 | ||||
|     return (ret, output) | ||||
|     return ret, output | ||||
| 
 | ||||
| 
 | ||||
| def msvc_build(sln_file, proj_name, target, platform, force_rebuild): | ||||
|  | @ -320,19 +320,43 @@ def msvc_build(sln_file, proj_name, target, platform, force_rebuild): | |||
|         raise RuntimeError('build MSVC project `{}` failed.'.format(proj_name)) | ||||
| 
 | ||||
| 
 | ||||
| def qt_build_win(prj_path, prj_name, bit_path, target_path): | ||||
|     cc.n(env.visual_studio_path) | ||||
| def qt_build(prj_path, prj_name, bit_path, target_path): | ||||
|     # cc.n(env.qt) | ||||
|     if env.qt is None: | ||||
|         raise RuntimeError('where is `qt`?') | ||||
| 
 | ||||
|     if env.is_win: | ||||
|         tmp_path = os.path.join(env.root_path, 'out', '_tmp_', prj_name, bit_path) | ||||
|         # C:\Windows\System32\cmd.exe /A /Q /K C:\Qt\Qt5.12.0\5.12.0\msvc2017\bin\qtenv2.bat | ||||
|         cmd = 'C:\\Windows\\System32\\cmd.exe /A /Q /C ""{}\qt-helper.bat" "{}\\bin\\qtenv2.bat" "{}VC\\Auxiliary\\Build\\vcvarsall.bat" {} "{}" "{}" {}"'.format(env.build_path, env.qt, env.visual_studio_path, bit_path, tmp_path, prj_path, target_path) | ||||
|         cmd = 'C:\\Windows\\System32\\cmd.exe /A /Q /C ""{}\\qt-helper.bat" "{}\\bin\\qtenv2.bat" "{}VC\\Auxiliary\\Build\\vcvarsall.bat" {} "{}" "{}" {}"'.format(env.build_path, env.qt, env.visual_studio_path, bit_path, tmp_path, prj_path, target_path) | ||||
|         ret, _ = sys_exec(cmd, direct_output=True) | ||||
|         if ret != 0: | ||||
|             raise RuntimeError('build XCode project `{}` failed.'.format(proj_name)) | ||||
|             raise RuntimeError('build XCode project `{}` failed.'.format(prj_name)) | ||||
|     elif env.is_macos: | ||||
|         qmake = os.path.join(env.qt, 'qmake') | ||||
|         pro_file = prj_name + '.pro' | ||||
| 
 | ||||
|         old_p = os.getcwd() | ||||
|         os.chdir(prj_path) | ||||
| 
 | ||||
|         cmd = '"{}" "{}"; make'.format(qmake, pro_file) | ||||
|         ret, _ = sys_exec(cmd, direct_output=True) | ||||
|         if ret != 0: | ||||
|             raise RuntimeError('make Makefile for build `{}` failed.'.format(prj_name)) | ||||
| 
 | ||||
|         os.chdir(old_p) | ||||
| 
 | ||||
| 
 | ||||
| def qt_deploy(app): | ||||
|     if env.qt is None: | ||||
|         raise RuntimeError('where is `qt`?') | ||||
| 
 | ||||
|     if env.is_macos: | ||||
|         qmake = os.path.join(env.qt, 'macdeployqt') | ||||
|         cmd = '"{}" "{}"'.format(qmake, app) | ||||
|         ret, _ = sys_exec(cmd, direct_output=True) | ||||
|         if ret != 0: | ||||
|             raise RuntimeError('make deploy for QT failed.') | ||||
| 
 | ||||
| 
 | ||||
| def xcode_build(proj_file, proj_name, target, force_rebuild): | ||||
|  |  | |||
|  | @ -48,6 +48,8 @@ MainWindow::MainWindow(QWidget *parent) : | |||
| //    setWindowFlags(Qt::FramelessWindowHint | Qt::MSWindowsFixedSizeDialogHint | windowFlags());
 | ||||
| //#endif //__APPLE__
 | ||||
| 
 | ||||
|     setWindowIcon(QIcon(":/tp-player/res/tp-player.png")); | ||||
| 
 | ||||
|     m_pt_normal.load(":/tp-player/res/cursor.png"); | ||||
|     m_default_bg.load(":/tp-player/res/bg.png"); | ||||
| 
 | ||||
|  |  | |||
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 4.6 KiB | 
|  | @ -107,8 +107,8 @@ ThrData::ThrData(MainWindow* mainwin, const QString& res) { | |||
|     m_offset = 0; | ||||
| 
 | ||||
| #ifdef __APPLE__ | ||||
|     m_data_path_base = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); | ||||
|     m_data_path_base += "/tp-testdata/"; | ||||
|     m_data_path_base = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); | ||||
|     m_data_path_base += "/tp-record/"; | ||||
| #else | ||||
|     m_data_path_base = QCoreApplication::applicationDirPath() + "/record"; | ||||
| #endif | ||||
|  |  | |||
|  | @ -36,7 +36,12 @@ RC_FILE += \ | |||
| FORMS += \ | ||||
|     mainwindow.ui | ||||
| 
 | ||||
| 
 | ||||
| win32: { | ||||
|     INCLUDEPATH += $$PWD/../../external/zlib | ||||
|     INCLUDEPATH += $$PWD/../../external/zlib/build | ||||
|     DEPENDPATH += $$PWD/../../external/zlib | ||||
|     DEPENDPATH += $$PWD/../../external/zlib/build | ||||
| } | ||||
| win32:CONFIG(release, debug|release): { | ||||
|     DEFINES += QT_NO_DEBUG_OUTPUT | ||||
|     LIBS += -L$$PWD/../../external/zlib/build/release/ -lzlib | ||||
|  | @ -48,21 +53,30 @@ else:win32:CONFIG(debug, debug|release): { | |||
| } | ||||
| 
 | ||||
| 
 | ||||
| macx: { | ||||
|     INCLUDEPATH += $$PWD/../../external/macos/release/include | ||||
| } | ||||
| macx:CONFIG(release, debug|release): { | ||||
|     DEFINES += QT_NO_DEBUG_OUTPUT | ||||
|     LIBS += -L$$PWD/../../external/zlib/build/release/ -lzlib | ||||
|     DESTDIR = $$PWD/../../out/client/x86/Release | ||||
|     LIBS += -L$$PWD/../../external/macos/release/lib/ -lz | ||||
|     DESTDIR = $$PWD/../../out/client/x64/release | ||||
| 
 | ||||
|     UI_DIR += $$PWD/../../out/_tmp_/tp-player/debug | ||||
|     RCC_DIR += $$PWD/../../out/_tmp_/tp-player/debug | ||||
|     MOC_DIR += $$PWD/../../out/_tmp_/tp-player/debug | ||||
|     OBJECTS_DIR += $$PWD/../../out/_tmp_/tp-player/debug | ||||
| } | ||||
| else:macx:CONFIG(debug, debug|release): { | ||||
|     LIBS += -L$$PWD/../../external/zlib/build/debug/ -lzlibd | ||||
|     DESTDIR = $$PWD/../../out/client/x86/Debug | ||||
|     LIBS += -L$$PWD/../../external/macos/release/lib/ -lz | ||||
|     DESTDIR = $$PWD/../../out/client/x64/debug | ||||
| 
 | ||||
|     UI_DIR += $$PWD/../../out/_tmp_/tp-player/release | ||||
|     RCC_DIR += $$PWD/../../out/_tmp_/tp-player/release | ||||
|     MOC_DIR += $$PWD/../../out/_tmp_/tp-player/release | ||||
|     OBJECTS_DIR += $$PWD/../../out/_tmp_/tp-player/release | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| INCLUDEPATH += $$PWD/../../external/zlib | ||||
| INCLUDEPATH += $$PWD/../../external/zlib/build | ||||
| DEPENDPATH += $$PWD/../../external/zlib | ||||
| DEPENDPATH += $$PWD/../../external/zlib/build | ||||
| 
 | ||||
| #win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/../../external/zlib/build/release/libzlibstatic.a | ||||
| #else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/../../external/zlib/build/debug/libzlibstaticd.a | ||||
|  |  | |||
|  | @ -2,6 +2,7 @@ | |||
|     <qresource prefix="/tp-player"> | ||||
|         <file>res/bg.png</file> | ||||
|         <file>res/cursor.png</file> | ||||
|         <file>res/tp-player.png</file> | ||||
| 
 | ||||
|         <file>res/bar/bg-left.png</file> | ||||
|         <file>res/bar/bg-mid.png</file> | ||||
|  |  | |||
|  | @ -10,8 +10,8 @@ | |||
| #include "csrc/ts_cfg.h" | ||||
| #include "csrc/ts_http_rpc.h" | ||||
| 
 | ||||
| int cpp_main(void* _self, const char* cfg_file, const char* res_path) { | ||||
| 	if(!g_env.init(cfg_file, res_path)) | ||||
| int cpp_main(void* _self, const char* bundle_path, const char* cfg_file, const char* res_path) { | ||||
| 	if(!g_env.init(bundle_path, cfg_file, res_path)) | ||||
| 		return -1; | ||||
| 	if(!g_cfg.init()) | ||||
| 		return -2; | ||||
|  |  | |||
|  | @ -12,6 +12,6 @@ int AppDelegate_start_ssh_client (void *_self, const char* cmd_line, const char* | |||
| int AppDelegate_select_app (void *_self); | ||||
| 
 | ||||
| // for cpp global object initialize.
 | ||||
| int cpp_main(void* _self, const char* cfg_file, const char* res_path); | ||||
| int cpp_main(void* _self, const char* bundle_path, const char* cfg_file, const char* res_path); | ||||
| 
 | ||||
| #endif /* wrap_c_objc_h */ | ||||
|  |  | |||
|  | @ -70,11 +70,14 @@ int AppDelegate_select_app (void *_self) { | |||
|     // Needed to trigger the menuWillOpen event | ||||
|     [menu setDelegate:self]; | ||||
| 	 | ||||
| 	NSString *resPath = [[NSBundle mainBundle] resourcePath]; | ||||
|     NSString *bundlePath = [[NSBundle mainBundle] bundlePath]; | ||||
|     std::string bundle_path = [bundlePath cStringUsingEncoding:NSUTF8StringEncoding]; | ||||
| 
 | ||||
|     NSString *resPath = [[NSBundle mainBundle] resourcePath]; | ||||
| 	std::string cpp_res_path = [resPath cStringUsingEncoding:NSUTF8StringEncoding]; | ||||
| 	std::string cpp_cfg_file = [cfgFile cStringUsingEncoding:NSUTF8StringEncoding]; | ||||
| 	 | ||||
| 	int ret = cpp_main((__bridge void*)self, cpp_cfg_file.c_str(), cpp_res_path.c_str()); | ||||
|     int ret = cpp_main((__bridge void*)self, bundle_path.c_str(), cpp_cfg_file.c_str(), cpp_res_path.c_str()); | ||||
| 	if(ret != 0) { | ||||
|         http_rpc_stop(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -18,13 +18,15 @@ TsEnv::TsEnv() | |||
| TsEnv::~TsEnv() | ||||
| {} | ||||
| 
 | ||||
| bool TsEnv::init(const char* cfg_file, const char* res_path) | ||||
| bool TsEnv::init(const char* bundle_path, const char* cfg_file, const char* res_path) | ||||
| { | ||||
| 	ex_astr2wstr(cfg_file, m_cfg_file); | ||||
|     ex_astr2wstr(bundle_path, m_bundle_path); | ||||
|     ex_astr2wstr(cfg_file, m_cfg_file); | ||||
| 	ex_astr2wstr(res_path, m_res_path); | ||||
| 
 | ||||
| #ifdef EX_DEBUG | ||||
|     m_site_path = L"/Users/apex/work/tp4a/teleport/client/tp_assist_macos/site"; | ||||
|     m_bundle_path = L"/Users/apex/work/tp4a/teleport/out/client/x64/release"; | ||||
| #else | ||||
| 	m_site_path = m_res_path; | ||||
| 	ex_path_join(m_site_path, false, L"site", NULL); | ||||
|  |  | |||
|  | @ -9,9 +9,10 @@ public: | |||
| 	TsEnv(); | ||||
| 	~TsEnv(); | ||||
| 
 | ||||
| 	bool init(const char* cfg_file, const char* res_path); | ||||
| 	bool init(const char* bundle_path, const char* cfg_file, const char* res_path); | ||||
| 
 | ||||
| public: | ||||
|     ex_wstr m_bundle_path; | ||||
| 	ex_wstr m_cfg_file; | ||||
| 	ex_wstr m_res_path; | ||||
| 	 | ||||
|  |  | |||
|  | @ -227,7 +227,7 @@ void TsHttpRpc::_mg_event_handler(struct mg_connection *nc, int ev, void *ev_dat | |||
|         bool b_is_html = false; | ||||
| 
 | ||||
| //         if (uri == "/") {
 | ||||
| //             ex_wstr page = L"<html lang=\"zh_CN\"><head><meta charset=\"utf-8\"/><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/><title>TeleportÖúÊÖ</title>\n<style type=\"text/css\">\n.box{padding:20px;margin:40px;border:1px solid #78b17c;background-color:#e4ffe5;}\n</style>\n</head><body><div class=\"box\">Teleport Assistor works fine.</div></body></html>";
 | ||||
| //             ex_wstr page = L"<html lang=\"zh_CN\"><head><meta charset=\"utf-8\"/><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/><title>Teleport÷˙ ÷</title>\n<style type=\"text/css\">\n.box{padding:20px;margin:40px;border:1px solid #78b17c;background-color:#e4ffe5;}\n</style>\n</head><body><div class=\"box\">Teleport Assistor works fine.</div></body></html>";
 | ||||
| //             ex_wstr2astr(page, ret_buf, EX_CODEPAGE_UTF8);
 | ||||
| //
 | ||||
| //             mg_printf(nc, "HTTP/1.0 200 OK\r\nAccess-Control-Allow-Origin: *\r\nContent-Length: %d\r\nContent-Type: text/html\r\n\r\n%s", ret_buf.size() - 1, &ret_buf[0]);
 | ||||
|  | @ -839,7 +839,102 @@ void TsHttpRpc::_rpc_func_run_client(const ex_astr& func_args, ex_astr& buf) { | |||
| } | ||||
| 
 | ||||
| void TsHttpRpc::_rpc_func_rdp_play(const ex_astr& func_args, ex_astr& buf) { | ||||
| 	_create_json_ret(buf, TPE_NOT_IMPLEMENT); | ||||
|     Json::Value jsRoot; | ||||
| 
 | ||||
|     Json::CharReaderBuilder jcrb; | ||||
|     std::unique_ptr<Json::CharReader> const jreader(jcrb.newCharReader()); | ||||
|     const char *str_json_begin = func_args.c_str(); | ||||
|     ex_astr err; | ||||
| 
 | ||||
|     if (!jreader->parse(str_json_begin, str_json_begin + func_args.length(), &jsRoot, &err)) { | ||||
|         _create_json_ret(buf, TPE_JSON_FORMAT); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     // 判断参数是否正确
 | ||||
|     if (!jsRoot["rid"].isInt() | ||||
|         || !jsRoot["web"].isString() | ||||
|         || !jsRoot["sid"].isString() | ||||
|         ) { | ||||
|         _create_json_ret(buf, TPE_PARAM); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     ex_astrs s_argv; | ||||
| 
 | ||||
|     ex_wstr w_exec_file = g_env.m_bundle_path; | ||||
|     ex_path_join(w_exec_file, false, L"tp-player.app", L"Contents", L"MacOS", L"tp-player", nullptr); | ||||
|     ex_astr exec_file; | ||||
|     ex_wstr2astr(w_exec_file, exec_file); | ||||
|      | ||||
|     s_argv.push_back(exec_file); | ||||
| 
 | ||||
| 
 | ||||
|     int rid = jsRoot["rid"].asInt(); | ||||
|     ex_astr a_url_base = jsRoot["web"].asCString(); | ||||
|     ex_astr a_sid = jsRoot["sid"].asCString(); | ||||
| 
 | ||||
|     char cmd_args[1024] = { 0 }; | ||||
|     ex_strformat(cmd_args, 1023, "%s/%s/%d", a_url_base.c_str(), a_sid.c_str(), rid); | ||||
|     s_argv.push_back(cmd_args); | ||||
| 
 | ||||
|     ex_wstr w_cmd_args; | ||||
|     ex_astr2wstr(cmd_args, w_cmd_args); | ||||
|      | ||||
|     char total_cmd[1024] = {0}; | ||||
|     ex_strformat(total_cmd, 1023, "%s %s", exec_file.c_str(), cmd_args); | ||||
|      | ||||
| //    ex_wstr w_url_base;
 | ||||
| //    ex_astr2wstr(a_url_base, w_url_base);
 | ||||
| //    ex_wstr w_cmd_args;
 | ||||
| //    ex_astr2wstr(cmd_args, w_cmd_args);
 | ||||
| //
 | ||||
| //    ex_wstr w_exe_path;
 | ||||
| //    w_exe_path = _T("\"");
 | ||||
| //    w_exe_path += g_env.m_exec_path + _T("\\tp-player.exe\"");
 | ||||
| //    w_exe_path += _T(" \"");
 | ||||
| //    w_exe_path += w_url_base;
 | ||||
| //    w_exe_path += _T("/");
 | ||||
| //    w_exe_path += w_cmd_args;
 | ||||
| 
 | ||||
|     Json::Value root_ret; | ||||
|     ex_astr utf8_path; | ||||
|     //ex_wstr2astr(total_cmd, utf8_path, EX_CODEPAGE_UTF8);
 | ||||
|     root_ret["cmdline"] = total_cmd; | ||||
| 
 | ||||
|     // EXLOGD(utf8_path.c_str());
 | ||||
| 
 | ||||
|     // for macOS, Create Process should be fork()/exec()...
 | ||||
|     pid_t processId; | ||||
|     if ((processId = fork()) == 0) { | ||||
| 
 | ||||
|         int i = 0; | ||||
|         char** _argv = (char**)calloc(s_argv.size()+1, sizeof(char*)); | ||||
|         if (!_argv) | ||||
|             return; | ||||
| 
 | ||||
|         for (i = 0; i < s_argv.size(); ++i) | ||||
|         { | ||||
|             _argv[i] = ex_strdup(s_argv[i].c_str()); | ||||
|         } | ||||
|         _argv[i] = NULL; | ||||
| 
 | ||||
|         execv(exec_file.c_str(), _argv); | ||||
| 
 | ||||
|         for(i = 0; i < s_argv.size(); ++i) { | ||||
|             if(_argv[i] != NULL) { | ||||
|                 free(_argv[i]); | ||||
|             } | ||||
|         } | ||||
|         free(_argv); | ||||
| 
 | ||||
|     } else if (processId < 0) { | ||||
|         root_ret["code"] = TPE_FAILED; | ||||
|     } else { | ||||
|         root_ret["code"] = TPE_OK; | ||||
|     } | ||||
| 
 | ||||
|     _create_json_ret(buf, root_ret); | ||||
| } | ||||
| 
 | ||||
| void TsHttpRpc::_rpc_func_get_config(const ex_astr& func_args, ex_astr& buf) { | ||||
|  |  | |||
|  | @ -22,13 +22,19 @@ wget = C:\Program Files (x86)\wget\wget.exe | |||
| # if not set msbuild path, default to get it by register. | ||||
| #msbuild = C:\Program Files (x86)\MSBuild\14.0\bin\MSBuild.exe | ||||
| 
 | ||||
| # need qt to build tp-player. | ||||
| # need Qt >= 5.12 to build recorder player. | ||||
| qt = C:\Qt\Qt5.12.0\5.12.0\msvc2017 | ||||
| 
 | ||||
| # ============================================ | ||||
| # for Linux and macOS | ||||
| # for Linux | ||||
| # ============================================ | ||||
| 
 | ||||
| # if not set cmake path, default to '/usr/bin/cmake' | ||||
| cmake = /opt/cmake/bin/cmake | ||||
| 
 | ||||
| # ============================================ | ||||
| # for MacOS | ||||
| # ============================================ | ||||
| 
 | ||||
| # need Qt >= 5.12 to build recorder player. | ||||
| qt = /Users/apex/apps/qt5.13.1/5.13.1/clang_64/bin | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Apex Liu
						Apex Liu