php_core_lib.cpp
来自「wxWidgets写的电驴」· C++ 代码 · 共 1,791 行 · 第 1/4 页
CPP
1,791 行
speed = array_get_by_str_key(result, "speed_limit_up"); value_value_free(&speed->value); speed->value.type = PHP_VAL_INT; speed->value.int_val = stats->GetTagByName(EC_TAG_STATS_UL_SPEED_LIMIT)->GetInt32Data(); speed = array_get_by_str_key(result, "speed_limit_down"); value_value_free(&speed->value); speed->value.type = PHP_VAL_INT; speed->value.int_val = stats->GetTagByName(EC_TAG_STATS_DL_SPEED_LIMIT)->GetInt32Data(); delete stats;#else cast_value_array(result); PHP_VAR_NODE *id = array_get_by_str_key(result, "id"); cast_value_dnum(&id->value); id->value.int_val = 1234567;#endif}void php_get_amule_categories(PHP_VALUE_NODE *result){ cast_value_array(result);#ifndef PHP_STANDALONE_EN CECPacket req(EC_OP_GET_PREFERENCES); req.AddTag(CECTag(EC_TAG_SELECT_PREFS, (uint32)EC_PREFS_CATEGORIES)); const CECPacket *reply = CPhPLibContext::g_curr_context->WebServer()->webInterface->SendRecvMsg_v2(&req); if ( !reply ) { return ; } const CECTag *cats_tag = reply->GetTagCount() ? reply->GetTagByIndex(0) : 0; if ( cats_tag && cats_tag->GetTagCount() ) { for (int i = 0; i < cats_tag->GetTagCount(); i++) { const CECTag *tag = cats_tag->GetTagByIndex(i); const CECTag *categoryTitle = tag->GetTagByName(EC_TAG_CATEGORY_TITLE); PHP_VAR_NODE *cat = array_get_by_int_key(result, i); value_value_free(&cat->value); cat->value.type = PHP_VAL_STRING; cat->value.str_val = strdup(unicode2UTF8(categoryTitle->GetStringData())); } } else { PHP_VAR_NODE *cat = array_get_by_int_key(result, 0); value_value_free(&cat->value); cat->value.type = PHP_VAL_STRING; cat->value.str_val = strdup("all"); } delete reply;#else for (int i = 0; i < 5; i++) { PHP_VAR_NODE *cat = array_get_by_int_key(result, i); value_value_free(&cat->value); cat->value.type = PHP_VAL_STRING; cat->value.str_val = strdup("some_cat"); }#endif}#ifndef PHP_STANDALONE_ENtypedef struct { char *php_name; ec_opcode_t tagname; int opsize;} PHP_2_EC_OPT_DEF;PHP_2_EC_OPT_DEF g_connection_opt_defs[] = { { "max_line_up_cap", EC_TAG_CONN_UL_CAP, 4}, { "max_line_down_cap", EC_TAG_CONN_DL_CAP, 4}, { "max_up_limit", EC_TAG_CONN_MAX_UL, 2}, { "max_down_limit", EC_TAG_CONN_MAX_DL, 2}, { "slot_alloc", EC_TAG_CONN_SLOT_ALLOCATION, 2}, { "tcp_port", EC_TAG_CONN_TCP_PORT, 2}, { "udp_port", EC_TAG_CONN_UDP_PORT, 2}, { "udp_dis", EC_TAG_CONN_UDP_DISABLE, 0}, { "max_file_src", EC_TAG_CONN_MAX_FILE_SOURCES, 2}, { "max_conn_total", EC_TAG_CONN_MAX_CONN, 2}, { "autoconn_en", EC_TAG_CONN_AUTOCONNECT, 0}, { "reconn_en", EC_TAG_CONN_RECONNECT, 0}, {0, 0, 0}};PHP_2_EC_OPT_DEF g_file_opt_defs[] = { { "ich_en", EC_TAG_FILES_ICH_ENABLED, 0}, { "aich_trust", EC_TAG_FILES_AICH_TRUST, 0}, { "new_files_paused", EC_TAG_FILES_NEW_PAUSED, 0}, { "new_files_auto_dl_prio", EC_TAG_FILES_NEW_AUTO_DL_PRIO, 0}, { "preview_prio", EC_TAG_FILES_PREVIEW_PRIO, 0}, { "new_files_auto_ul_prio", EC_TAG_FILES_NEW_AUTO_UL_PRIO, 0}, { "upload_full_chunks", EC_TAG_FILES_UL_FULL_CHUNKS, 0}, { "first_last_chunks_prio", EC_TAG_FILES_PREVIEW_PRIO, 0}, { "start_next_paused", EC_TAG_FILES_START_NEXT_PAUSED, 0}, { "resume_same_cat", EC_TAG_FILES_RESUME_SAME_CAT, 0}, { "save_sources", EC_TAG_FILES_SAVE_SOURCES, 0}, { "extract_metadata", EC_TAG_FILES_EXTRACT_METADATA, 0}, { "alloc_full_chunks", EC_TAG_FILES_ALLOC_FULL_CHUNKS, 0}, { "alloc_full", EC_TAG_FILES_ALLOC_FULL_SIZE, 0}, { "check_free_space", EC_TAG_FILES_CHECK_FREE_SPACE, 0}, { "min_free_space", EC_TAG_FILES_MIN_FREE_SPACE, 4}, {0, 0, 0}};PHP_2_EC_OPT_DEF g_webserver_opt_defs[] = { { "use_gzip", EC_TAG_WEBSERVER_USEGZIP, 0}, { "autorefresh_time", EC_TAG_WEBSERVER_REFRESH, 4}, {0, 0, 0}};PHP_2_EC_OPT_DEF g_coretweak_opt_defs[] = { { "max_conn_5sec", EC_TAG_CORETW_MAX_CONN_PER_FIVE, 2}, {0, 0, 0}};void set_array_int_val(PHP_VALUE_NODE *array, std::string arrkey, int value){ PHP_VAR_NODE *key = array_get_by_str_key(array, arrkey); PHP_VALUE_NODE intval; intval.type = PHP_VAL_INT; intval.int_val = value; value_value_assign(&key->value, &intval);}void ec_tag_2_php(const CECTag *cattag, PHP_2_EC_OPT_DEF *opts, PHP_VAR_NODE *catvar){ for(PHP_2_EC_OPT_DEF *def = opts; def->php_name; def++) { int val; switch(def->opsize) { case 0: val = cattag->GetTagByName(def->tagname) ? 1 : 0; break; case 1: val = cattag->GetTagByNameSafe(def->tagname)->GetInt8Data(); break; case 2: val = cattag->GetTagByNameSafe(def->tagname)->GetInt16Data(); break; case 4: val = cattag->GetTagByNameSafe(def->tagname)->GetInt32Data(); break; default: val = -1; } wxASSERT(val != -1); set_array_int_val(&catvar->value, def->php_name, val); }}#endif/* * Return hash of amule options. * Key: option name * Value: option value (string) */void php_get_amule_options(PHP_VALUE_NODE *result){ cast_value_array(result);#ifndef PHP_STANDALONE_EN CECPacket req(EC_OP_GET_PREFERENCES); req.AddTag(CECTag(EC_TAG_SELECT_PREFS, (uint32)0xffffffff)); const CECPacket *reply = CPhPLibContext::g_curr_context->WebServer()->webInterface->SendRecvMsg_v2(&req); if ( !reply || !reply->GetTagCount()) { return ; } const CECTag *cattag = 0; PHP_VALUE_NODE intval; intval.type = PHP_VAL_INT; if ((cattag = reply->GetTagByName(EC_TAG_PREFS_GENERAL)) != 0) { PHP_VAR_NODE *key = array_get_by_str_key(result, "nick"); value_value_free(&key->value); key->value.type = PHP_VAL_STRING; key->value.str_val = strdup(unicode2UTF8(cattag->GetTagByNameSafe(EC_TAG_USER_NICK)->GetStringData())); } if ((cattag = reply->GetTagByName(EC_TAG_PREFS_CONNECTIONS)) != 0) { PHP_VAR_NODE *cat = array_get_by_str_key(result, "connection"); cast_value_array(&cat->value); ec_tag_2_php(cattag, g_connection_opt_defs, cat); } if ((cattag = reply->GetTagByName(EC_TAG_PREFS_FILES)) != 0) { PHP_VAR_NODE *cat = array_get_by_str_key(result, "files"); cast_value_array(&cat->value); ec_tag_2_php(cattag, g_file_opt_defs, cat); } if ((cattag = reply->GetTagByName(EC_TAG_PREFS_REMOTECTRL)) != 0) { PHP_VAR_NODE *cat = array_get_by_str_key(result, "webserver"); cast_value_array(&cat->value); ec_tag_2_php(cattag, g_webserver_opt_defs, cat); } if ((cattag = reply->GetTagByName(EC_TAG_PREFS_CORETWEAKS)) != 0) { PHP_VAR_NODE *cat = array_get_by_str_key(result, "coretweaks"); cast_value_array(&cat->value); ec_tag_2_php(cattag, g_coretweak_opt_defs, cat); } #endif}#ifndef PHP_STANDALONE_ENbool php_2_ec_tag(CECTag *cattag, PHP_2_EC_OPT_DEF *opts, PHP_VALUE_NODE *catvar){ for(PHP_2_EC_OPT_DEF *def = opts; def->php_name; def++) { PHP_VAR_NODE *opt_var = array_get_by_str_key(catvar, def->php_name); if ( opt_var->value.type == PHP_VAL_NONE ) { continue; } cast_value_dnum(&opt_var->value); switch(def->opsize) { case 0: // always transmit ! case 1: cattag->AddTag(CECTag(def->tagname ,(uint8)opt_var->value.int_val)); break; case 2: cattag->AddTag(CECTag(def->tagname ,(uint16)opt_var->value.int_val)); break; case 4: cattag->AddTag(CECTag(def->tagname ,(uint32)opt_var->value.int_val)); break; default: return false; } } return true;}#endif/* * Set amule options from given array. Argument looks like "amule_get_options" result */void php_set_amule_options(PHP_VALUE_NODE *){ PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); if ( !si || (si->var->value.type != PHP_VAL_ARRAY)) { php_report_error(PHP_ERROR, "Invalid or missing argument 1 (options array)"); return; }#ifndef PHP_STANDALONE_EN CECPacket req(EC_OP_SET_PREFERENCES); PHP_VAR_NODE *opt_group_array = 0; // files opt_group_array = array_get_by_str_key(&si->var->value, "files"); if ( opt_group_array->value.type == PHP_VAL_ARRAY ) { CECEmptyTag filePrefs(EC_TAG_PREFS_FILES); php_2_ec_tag(&filePrefs, g_file_opt_defs, &opt_group_array->value); req.AddTag(filePrefs); } // connection opt_group_array = array_get_by_str_key(&si->var->value, "connection"); if ( opt_group_array->value.type == PHP_VAL_ARRAY ) { CECEmptyTag connPrefs(EC_TAG_PREFS_CONNECTIONS); php_2_ec_tag(&connPrefs, g_connection_opt_defs, &opt_group_array->value); req.AddTag(connPrefs); } // webserver opt_group_array = array_get_by_str_key(&si->var->value, "webserver"); if ( opt_group_array->value.type == PHP_VAL_ARRAY ) { CECEmptyTag webPrefs(EC_TAG_PREFS_REMOTECTRL); php_2_ec_tag(&webPrefs, g_webserver_opt_defs, &opt_group_array->value); req.AddTag(webPrefs); // also apply settings localy PHP_VAR_NODE *pref = array_get_by_str_key(&opt_group_array->value, "use_gzip"); cast_value_dnum(&pref->value); CPhPLibContext::g_curr_context->WebServer()->webInterface->m_UseGzip = pref->value.int_val != 0; pref = array_get_by_str_key(&opt_group_array->value, "autorefresh_time"); cast_value_dnum(&pref->value); CPhPLibContext::g_curr_context->WebServer()->webInterface->m_PageRefresh = pref->value.int_val; } CPhPLibContext::g_curr_context->WebServer()->Send_Discard_V2_Request(&req); #endif}/* * Download 1 of search results. Params: hash, category (default=0) */void php_native_search_download_cmd(PHP_VALUE_NODE *){ PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); if ( !si || (si->var->value.type != PHP_VAL_STRING)) { php_report_error(PHP_ERROR, "Invalid or missing argument 1 (file hash)"); return; } char *str_hash = si->var->value.str_val; si = get_scope_item(g_current_scope, "__param_1"); if ( !si || (si->var->value.type != PHP_VAL_STRING)) { php_report_error(PHP_ERROR, "Invalid or missing argument 2 (category)"); return; } cast_value_dnum(&si->var->value); int cat = si->var->value.int_val;#ifndef PHP_STANDALONE_EN CPhPLibContext::g_curr_context->WebServer()->Send_DownloadSearchFile_Cmd( wxString(char2unicode(str_hash)), cat);#else printf("php_native_search_download_cmd: hash=%s category=%d\n", str_hash, cat);#endif}void php_native_search_start_cmd(PHP_VALUE_NODE *){ PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); if ( !si || (si->var->value.type != PHP_VAL_STRING)) { php_report_error(PHP_ERROR, "Invalid or missing argument 1 (search term)"); return; } char *search = si->var->value.str_val; if ( !(si = get_scope_item(g_current_scope, "__param_1")) || (si->var->value.type != PHP_VAL_STRING)) { php_report_error(PHP_ERROR, "Invalid or missing argument 2 (file extension)"); return; } char *ext = si->var->value.str_val; if ( !(si = get_scope_item(g_current_scope, "__param_2")) || (si->var->value.type != PHP_VAL_STRING)) { php_report_error(PHP_ERROR, "Invalid or missing argument 3 (file type)"); return; } char *type = si->var->value.str_val; if ( !(si = get_scope_item(g_current_scope, "__param_3")) ) { php_report_error(PHP_ERROR, "Invalid or missing argument 4 (search type)"); return; } cast_value_dnum(&si->var->value); EC_SEARCH_TYPE search_type; switch(si->var->value.int_val) { case 0: search_type = EC_SEARCH_LOCAL; break; case 1: search_type = EC_SEARCH_GLOBAL; break; case 2: search_type = EC_SEARCH_KAD; break; default: php_report_error(PHP_ERROR, "Invalid search type %d", si->var->value.int_val); return; } if ( !(si = get_scope_item(g_current_scope, "__param_4")) ) { php_report_error(PHP_ERROR, "Invalid or missing argument 5 (availability)"); return; } cast_value_dnum(&si->var->value); int avail = si->var->value.int_val; if ( !(si = get_scope_item(g_current_scope, "__param_5")) ) { php_report_error(PHP_ERROR, "Invalid or missing argument 6 (min size)"); return; } cast_value_dnum(&si->var->value); int min_size = si->var->value.int_val; if ( !(si = get_scope_item(g_current_scope, "__param_6")) ) { php_report_error(PHP_ERROR, "Invalid or missing argument 7 (max size)"); return; } cast_value_dnum(&si->var->value); int max_size = si->var->value.int_val;#ifndef PHP_STANDALONE_EN CPhPLibContext::g_curr_context->WebServer()->Send_Search_Cmd( wxString(char2unicode(search)), wxString(char2unicode(ext)), wxString(char2unicode(type)), search_type, avail, min_size, max_size);#else printf("php_native_search_start_cmd: search=%s \n", search);#endif}/* * Request contents of log */void php_get_log(PHP_VALUE_NODE *result){ value_value_free(result); PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); bool rst; if ( !si ) { rst = false; } else { cast_value_dnum(&si->var->value); rst = si->var->value.int_val != 0; }#ifndef PHP_STANDALONE_EN if ( rst ) { CECPacket req(EC_OP_RESET_LOG); CPhPLibContext::g_curr_context->WebServer()->Send_Discard_V2_Request(&req); } CECPacket req(EC_OP_GET_LOG); const CECPacket *response = CPhPLibContext::g_curr_context->WebServer()->webInterface->SendRecvMsg_v2(&req); if (response) { wxString serverInfoString(_SpecialChars(response->GetTagByIndexSafe(0)->GetStringData())); delete response; result->type = PHP_VAL_STRING; result->str_val = strdup((const char *)unicode2UTF8(serverInfoString)); }#else printf("php_get_log: reset=%d\n", rst);#endif}/* * Request contents of server info */void php_get_serverinfo(PHP_VALUE_NODE *result){ value_value_free(result); PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); bool rst; if ( !si ) { rst = false; } else { cast_value_dnum(&si->var->value); rst = si->var->value.int_val != 0; }#ifndef PHP_STANDALONE_EN if ( rst ) { CECPacket req(EC_OP_CLEAR_SERVERINFO); CPhPLibContext::g_curr_context->WebServer()->Send_Discard_V2_Request(&req); } CECPacket req(EC_OP_GET_SERVERINFO); const CECPacket *response = CPhPLibContext::g_curr_context->WebServer()->webInterface->SendRecvMsg_v2(&req); if (response) { wxString serverInfoString(_SpecialChars(response->GetTagByIndexSafe(0)->GetStringData())); delete response; result->type = PHP_VAL_STRING; result->str_val = strdup((const char *)unicode2UTF8(serverInfoString)); }#else printf("php_get_serverinfo: reset=%d\n", rst);#endif}/* * Download ed2k link. Params: link, category (default=0) */void php_native_ed2k_download_cmd(PHP_VALUE_NODE *result){ PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); if ( !si || (si->var->value.type != PHP_VAL_STRING)) { php_report_error(PHP_ERROR, "Invalid or missing argument 1 (file link)"); return; } char *str_link = si->var->value.str_val; si = get_scope_item(g_current_scope, "__param_1"); if ( !si || (si->var->value.type != PHP_VAL_STRING)) { php_report_error(PHP_ERROR, "Invalid or missing argument 2 (category)"); return; } cast_value_dnum(&si->var->value); int cat = si->var->value.int_val;#ifndef PHP_STANDALONE_EN bool cmd_result = CPhPLibContext::g_curr_context->WebServer()->Send_DownloadEd2k_Cmd( wxString(char2unicode(str_link)), cat); if ( result ) { cast_value_bool(result); result->int_val = cmd_result; }#else
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?