| File: | rootdir/src/webserver/src/php_amule_lib.cpp |
| Warning: | line 445, column 41 Access of 'g_webserver_opt_defs' at index 3, while it holds only 3 'PHP_2_EC_OPT_DEF' elements |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | // | |||
| 2 | // This file is part of the aMule Project. | |||
| 3 | ||||
| 4 | // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) | |||
| 5 | // Copyright (c) 2005-2011 Froenchenko Leonid ( lfroen@gmail.com / http://www.amule.org ) | |||
| 6 | // | |||
| 7 | // Any parts of this program derived from the xMule, lMule or eMule project, | |||
| 8 | // or contributed by third-party developers are copyrighted by their | |||
| 9 | // respective authors. | |||
| 10 | // | |||
| 11 | // This program is free software; you can redistribute it and/or modify | |||
| 12 | // it under the terms of the GNU General Public License as published by | |||
| 13 | // the Free Software Foundation; either version 2 of the License, or | |||
| 14 | // (at your option) any later version. | |||
| 15 | // | |||
| 16 | // This program is distributed in the hope that it will be useful, | |||
| 17 | // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| 18 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| 19 | // GNU General Public License for more details. | |||
| 20 | // | |||
| 21 | // You should have received a copy of the GNU General Public License | |||
| 22 | // along with this program; if not, write to the Free Software | |||
| 23 | // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | |||
| 24 | // | |||
| 25 | ||||
| 26 | ||||
| 27 | #include <string> // Do_not_auto_remove (g++-4.0.1) | |||
| 28 | ||||
| 29 | #include <sys/types.h> | |||
| 30 | ||||
| 31 | #include "config.h" | |||
| 32 | ||||
| 33 | #include "WebServer.h" | |||
| 34 | #include <ec/cpp/ECSpecialTags.h> | |||
| 35 | ||||
| 36 | #include "php_syntree.h" | |||
| 37 | #include "php_core_lib.h" | |||
| 38 | ||||
| 39 | #include <wx/datetime.h> | |||
| 40 | ||||
| 41 | /* | |||
| 42 | * Built-in php functions. Those are amule-specific functions, accessing EC and internal | |||
| 43 | * datastructure | |||
| 44 | * | |||
| 45 | */ | |||
| 46 | ||||
| 47 | void php_native_shared_file_cmd(PHP_VALUE_NODE *) | |||
| 48 | { | |||
| 49 | PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); | |||
| 50 | if ( !si || (si->var->value.type != PHP_VAL_STRING)) { | |||
| 51 | php_report_error(PHP_ERROR, "Invalid or missing argument 1"); | |||
| 52 | return; | |||
| 53 | } | |||
| 54 | char *str_hash = si->var->value.str_val; | |||
| 55 | ||||
| 56 | si = get_scope_item(g_current_scope, "__param_1"); | |||
| 57 | if ( !si || (si->var->value.type != PHP_VAL_STRING)) { | |||
| 58 | php_report_error(PHP_ERROR, "Invalid or missing argument 2"); | |||
| 59 | return; | |||
| 60 | } | |||
| 61 | char *cmd_name = si->var->value.str_val; | |||
| 62 | si = get_scope_item(g_current_scope, "__param_2"); | |||
| 63 | PHP_VAR_NODE *opt_param = si ? si->var : 0; | |||
| 64 | ||||
| 65 | if ( !strcmp(cmd_name, "prio") && !opt_param ) { | |||
| 66 | php_report_error(PHP_ERROR, "Command 'prio' need 3-rd argument"); | |||
| 67 | return; | |||
| 68 | } | |||
| 69 | ||||
| 70 | ||||
| 71 | CPhPLibContext::g_curr_context->WebServer()->Send_SharedFile_Cmd(wxString(char2unicode(str_hash)), | |||
| 72 | wxString(char2unicode(cmd_name)), | |||
| 73 | opt_param ? opt_param->value.int_val : 0); | |||
| 74 | } | |||
| 75 | ||||
| 76 | void php_native_reload_shared_file_cmd(PHP_VALUE_NODE *) | |||
| 77 | { | |||
| 78 | CPhPLibContext::g_curr_context->WebServer()->Send_ReloadSharedFile_Cmd(); | |||
| 79 | } | |||
| 80 | ||||
| 81 | /* | |||
| 82 | * | |||
| 83 | * Usage: php_native_download_file_cmd($file_hash, "command", $optional_arg) | |||
| 84 | * | |||
| 85 | */ | |||
| 86 | void php_native_download_file_cmd(PHP_VALUE_NODE *) | |||
| 87 | { | |||
| 88 | PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); | |||
| 89 | if ( !si || (si->var->value.type != PHP_VAL_STRING)) { | |||
| 90 | php_report_error(PHP_ERROR, "Invalid or missing argument 1"); | |||
| 91 | return; | |||
| 92 | } | |||
| 93 | char *str_hash = si->var->value.str_val; | |||
| 94 | ||||
| 95 | si = get_scope_item(g_current_scope, "__param_1"); | |||
| 96 | if ( !si || (si->var->value.type != PHP_VAL_STRING)) { | |||
| 97 | php_report_error(PHP_ERROR, "Invalid or missing argument 2"); | |||
| 98 | return; | |||
| 99 | } | |||
| 100 | char *cmd_name = si->var->value.str_val; | |||
| 101 | si = get_scope_item(g_current_scope, "__param_2"); | |||
| 102 | PHP_VAR_NODE *opt_param = si ? si->var : 0; | |||
| 103 | ||||
| 104 | if ( (!strcmp(cmd_name, "prio") || !strcmp(cmd_name, "setcat")) && !opt_param ) { | |||
| 105 | php_report_error(PHP_ERROR, "Commands 'prio' and 'setcat' needs 3-rd argument"); | |||
| 106 | return; | |||
| 107 | } | |||
| 108 | ||||
| 109 | CPhPLibContext::g_curr_context->WebServer()->Send_DownloadFile_Cmd(wxString(char2unicode(str_hash)), | |||
| 110 | wxString(char2unicode(cmd_name)), | |||
| 111 | opt_param ? opt_param->value.int_val : 0); | |||
| 112 | } | |||
| 113 | ||||
| 114 | /* | |||
| 115 | * Usage amule_kad_connect($bootstrap_ip, $bootstrap_port) | |||
| 116 | */ | |||
| 117 | void php_native_kad_connect(PHP_VALUE_NODE *) | |||
| 118 | { | |||
| 119 | PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); | |||
| 120 | if ( !si ) { | |||
| 121 | php_report_error(PHP_ERROR, "Missing or bad argument 1: $bootstrap_ip_addr"); | |||
| 122 | return; | |||
| 123 | } | |||
| 124 | cast_value_dnum(&si->var->value); | |||
| 125 | unsigned int ipaddr = si->var->value.int_val; | |||
| 126 | ||||
| 127 | si = get_scope_item(g_current_scope, "__param_1"); | |||
| 128 | if ( !si ) { | |||
| 129 | php_report_error(PHP_ERROR, "Missing or bad argument 2: $bootstrap_ip_port"); | |||
| 130 | return; | |||
| 131 | } | |||
| 132 | cast_value_dnum(&si->var->value); | |||
| 133 | unsigned int ipport = si->var->value.int_val; | |||
| 134 | ||||
| 135 | CECPacket req(EC_OP_KAD_BOOTSTRAP_FROM_IP); | |||
| 136 | req.AddTag(CECTag(EC_TAG_BOOTSTRAP_IP, ipaddr)); | |||
| 137 | req.AddTag(CECTag(EC_TAG_BOOTSTRAP_PORT, ipport)); | |||
| 138 | CPhPLibContext::g_curr_context->WebServer()->Send_Discard_V2_Request(&req); | |||
| 139 | } | |||
| 140 | ||||
| 141 | void php_native_kad_disconnect(PHP_VALUE_NODE *) | |||
| 142 | { | |||
| 143 | CECPacket req(EC_OP_KAD_STOP); | |||
| 144 | CPhPLibContext::g_curr_context->WebServer()->Send_Discard_V2_Request(&req); | |||
| 145 | } | |||
| 146 | ||||
| 147 | /* | |||
| 148 | * Usage amule_add_server_cmd($server_addr, $server_port, $server_name); | |||
| 149 | */ | |||
| 150 | void php_native_add_server_cmd(PHP_VALUE_NODE *) | |||
| 151 | { | |||
| 152 | PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); | |||
| 153 | if ( !si || (si->var->value.type != PHP_VAL_STRING) ) { | |||
| 154 | php_report_error(PHP_ERROR, "Missing or bad argument 1: $server_addr"); | |||
| 155 | return; | |||
| 156 | } | |||
| 157 | char *addr = si->var->value.str_val; | |||
| 158 | ||||
| 159 | si = get_scope_item(g_current_scope, "__param_1"); | |||
| 160 | if ( !si ) { | |||
| 161 | php_report_error(PHP_ERROR, "Missing argument 2: $server_port"); | |||
| 162 | return; | |||
| 163 | } | |||
| 164 | cast_value_dnum(&si->var->value); | |||
| 165 | int port = si->var->value.int_val; | |||
| 166 | ||||
| 167 | si = get_scope_item(g_current_scope, "__param_2"); | |||
| 168 | if ( !si || (si->var->value.type != PHP_VAL_STRING) ) { | |||
| 169 | php_report_error(PHP_ERROR, "Invalid or missing argument 3: $server_name"); | |||
| 170 | return; | |||
| 171 | } | |||
| 172 | char *name = si->var->value.str_val; | |||
| 173 | ||||
| 174 | CPhPLibContext::g_curr_context->WebServer()->Send_AddServer_Cmd(wxString(char2unicode(addr)), | |||
| 175 | wxString::Format(wxT("%d")L"%d", port), wxString(char2unicode(name))); | |||
| 176 | } | |||
| 177 | ||||
| 178 | /* | |||
| 179 | * Usage amule_server_cmd($server_ip, $server_port, "command"); | |||
| 180 | */ | |||
| 181 | void php_native_server_cmd(PHP_VALUE_NODE *) | |||
| 182 | { | |||
| 183 | PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); | |||
| 184 | if ( !si ) { | |||
| 185 | php_report_error(PHP_ERROR, "Missing argument 1: $server_ip"); | |||
| 186 | return; | |||
| 187 | } | |||
| 188 | cast_value_dnum(&si->var->value); | |||
| 189 | uint32_t ip = si->var->value.int_val; | |||
| 190 | ||||
| 191 | si = get_scope_item(g_current_scope, "__param_1"); | |||
| 192 | if ( !si ) { | |||
| 193 | php_report_error(PHP_ERROR, "Missing argument 2: $server_port"); | |||
| 194 | return; | |||
| 195 | } | |||
| 196 | cast_value_dnum(&si->var->value); | |||
| 197 | int port = si->var->value.int_val; | |||
| 198 | ||||
| 199 | si = get_scope_item(g_current_scope, "__param_2"); | |||
| 200 | if ( !si || (si->var->value.type != PHP_VAL_STRING)) { | |||
| 201 | php_report_error(PHP_ERROR, "Invalid or missing argument 3: $command"); | |||
| 202 | return; | |||
| 203 | } | |||
| 204 | char *cmd = si->var->value.str_val; | |||
| 205 | ||||
| 206 | CPhPLibContext::g_curr_context->WebServer()->Send_Server_Cmd(ip, port, wxString(char2unicode(cmd))); | |||
| 207 | } | |||
| 208 | ||||
| 209 | /* | |||
| 210 | * Query amule status. Return hash containing stats values | |||
| 211 | */ | |||
| 212 | void php_get_amule_stats(PHP_VALUE_NODE *result) | |||
| 213 | { | |||
| 214 | CECPacket stat_req(EC_OP_STAT_REQ, EC_DETAIL_FULL); | |||
| 215 | const CECPacket *stats = CPhPLibContext::g_curr_context->WebServer()->webInterface->SendRecvMsg_v2(&stat_req); | |||
| 216 | if (!stats) { | |||
| 217 | return ; | |||
| 218 | } | |||
| 219 | const CEC_ConnState_Tag *tag = static_cast<const CEC_ConnState_Tag *>(stats->GetTagByName(EC_TAG_CONNSTATE)); | |||
| 220 | if (!tag) { | |||
| 221 | return ; | |||
| 222 | } | |||
| 223 | ||||
| 224 | cast_value_array(result); | |||
| 225 | PHP_VAR_NODE *id = array_get_by_str_key(result, "id"); | |||
| 226 | cast_value_dnum(&id->value); | |||
| 227 | id->value.int_val = tag->GetEd2kId(); | |||
| 228 | const CECTag *server = tag->GetTagByName(EC_TAG_SERVER); | |||
| 229 | if ( server ) { | |||
| 230 | PHP_VAR_NODE *srv_ip = array_get_by_str_key(result, "serv_addr"); | |||
| 231 | value_value_free(&srv_ip->value); | |||
| 232 | srv_ip->value.type = PHP_VAL_STRING; | |||
| 233 | srv_ip->value.str_val =strdup(unicode2UTF8(server->GetIPv4Data().StringIP())); | |||
| 234 | ||||
| 235 | const CECTag *sname = server->GetTagByName(EC_TAG_SERVER_NAME); | |||
| 236 | if ( sname ) { | |||
| 237 | PHP_VAR_NODE *srv_name = array_get_by_str_key(result, "serv_name"); | |||
| 238 | value_value_free(&srv_name->value); | |||
| 239 | srv_name->value.type = PHP_VAL_STRING; | |||
| 240 | srv_name->value.str_val = strdup(unicode2UTF8(sname->GetStringData())); | |||
| 241 | } | |||
| 242 | ||||
| 243 | const CECTag *susers = server->GetTagByName(EC_TAG_SERVER_USERS); | |||
| 244 | if ( susers ) { | |||
| 245 | PHP_VAR_NODE *srv_users = array_get_by_str_key(result, "serv_users"); | |||
| 246 | value_value_free(&srv_users->value); | |||
| 247 | srv_users->value.type = PHP_VAL_INT; | |||
| 248 | srv_users->value.int_val = susers->GetInt(); | |||
| 249 | } | |||
| 250 | ||||
| 251 | } | |||
| 252 | // kademlia | |||
| 253 | PHP_VAR_NODE *kad = array_get_by_str_key(result, "kad_connected"); | |||
| 254 | value_value_free(&kad->value); | |||
| 255 | kad->value.type = PHP_VAL_BOOL; | |||
| 256 | if ( tag->IsConnectedKademlia() ) { | |||
| 257 | kad->value.int_val = 1; | |||
| 258 | PHP_VAR_NODE *kad_fwl = array_get_by_str_key(result, "kad_firewalled"); | |||
| 259 | kad_fwl->value.type = PHP_VAL_BOOL; | |||
| 260 | kad_fwl->value.int_val = tag->IsKadFirewalled(); | |||
| 261 | } else { | |||
| 262 | kad->value.int_val = 0; | |||
| 263 | } | |||
| 264 | // traffic stats | |||
| 265 | PHP_VAR_NODE *speed; | |||
| 266 | speed = array_get_by_str_key(result, "speed_up"); | |||
| 267 | value_value_free(&speed->value); | |||
| 268 | speed->value.type = PHP_VAL_INT; | |||
| 269 | speed->value.int_val = stats->GetTagByName(EC_TAG_STATS_UL_SPEED)->GetInt(); | |||
| 270 | ||||
| 271 | speed = array_get_by_str_key(result, "speed_down"); | |||
| 272 | value_value_free(&speed->value); | |||
| 273 | speed->value.type = PHP_VAL_INT; | |||
| 274 | speed->value.int_val = stats->GetTagByName(EC_TAG_STATS_DL_SPEED)->GetInt(); | |||
| 275 | ||||
| 276 | speed = array_get_by_str_key(result, "speed_limit_up"); | |||
| 277 | value_value_free(&speed->value); | |||
| 278 | speed->value.type = PHP_VAL_INT; | |||
| 279 | speed->value.int_val = stats->GetTagByName(EC_TAG_STATS_UL_SPEED_LIMIT)->GetInt(); | |||
| 280 | ||||
| 281 | speed = array_get_by_str_key(result, "speed_limit_down"); | |||
| 282 | value_value_free(&speed->value); | |||
| 283 | speed->value.type = PHP_VAL_INT; | |||
| 284 | speed->value.int_val = stats->GetTagByName(EC_TAG_STATS_DL_SPEED_LIMIT)->GetInt(); | |||
| 285 | ||||
| 286 | delete stats; | |||
| 287 | } | |||
| 288 | ||||
| 289 | void php_get_amule_categories(PHP_VALUE_NODE *result) | |||
| 290 | { | |||
| 291 | cast_value_array(result); | |||
| 292 | ||||
| 293 | CECPacket req(EC_OP_GET_PREFERENCES); | |||
| 294 | req.AddTag(CECTag(EC_TAG_SELECT_PREFS, (uint32)EC_PREFS_CATEGORIES)); | |||
| 295 | const CECPacket *reply = CPhPLibContext::g_curr_context->WebServer()->webInterface->SendRecvMsg_v2(&req); | |||
| 296 | if ( !reply ) { | |||
| 297 | return ; | |||
| 298 | } | |||
| 299 | const CECTag *cats_tag = reply->GetFirstTagSafe(); | |||
| 300 | if (cats_tag->HasChildTags()) { | |||
| 301 | int i = 0; | |||
| 302 | for (CECTag::const_iterator it = cats_tag->begin(); it != cats_tag->end(); ++it) { | |||
| 303 | const CECTag *categoryTitle = it->GetTagByName(EC_TAG_CATEGORY_TITLE); | |||
| 304 | PHP_VAR_NODE *cat = array_get_by_int_key(result, i++); | |||
| 305 | value_value_free(&cat->value); | |||
| 306 | cat->value.type = PHP_VAL_STRING; | |||
| 307 | cat->value.str_val = strdup(unicode2UTF8(categoryTitle->GetStringData())); | |||
| 308 | } | |||
| 309 | } else { | |||
| 310 | PHP_VAR_NODE *cat = array_get_by_int_key(result, 0); | |||
| 311 | value_value_free(&cat->value); | |||
| 312 | cat->value.type = PHP_VAL_STRING; | |||
| 313 | cat->value.str_val = strdup("all"); | |||
| 314 | } | |||
| 315 | delete reply; | |||
| 316 | } | |||
| 317 | ||||
| 318 | typedef struct { | |||
| 319 | const char *php_name; | |||
| 320 | ECTagNames tagname; | |||
| 321 | int opsize; | |||
| 322 | } PHP_2_EC_OPT_DEF; | |||
| 323 | ||||
| 324 | PHP_2_EC_OPT_DEF g_connection_opt_defs[] = { | |||
| 325 | { "max_line_up_cap", EC_TAG_CONN_UL_CAP, 4}, { "max_line_down_cap", EC_TAG_CONN_DL_CAP, 4}, | |||
| 326 | { "max_up_limit", EC_TAG_CONN_MAX_UL, 2}, { "max_down_limit", EC_TAG_CONN_MAX_DL, 2}, | |||
| 327 | { "slot_alloc", EC_TAG_CONN_SLOT_ALLOCATION, 2}, | |||
| 328 | { "tcp_port", EC_TAG_CONN_TCP_PORT, 2}, { "udp_port", EC_TAG_CONN_UDP_PORT, 2}, | |||
| 329 | { "udp_dis", EC_TAG_CONN_UDP_DISABLE, 0}, | |||
| 330 | { "max_file_src", EC_TAG_CONN_MAX_FILE_SOURCES, 2}, | |||
| 331 | { "max_conn_total", EC_TAG_CONN_MAX_CONN, 2}, | |||
| 332 | { "autoconn_en", EC_TAG_CONN_AUTOCONNECT, 0}, { "reconn_en", EC_TAG_CONN_RECONNECT, 0}, | |||
| 333 | {0, (ECTagNames)0, 0} | |||
| 334 | }; | |||
| 335 | ||||
| 336 | PHP_2_EC_OPT_DEF g_file_opt_defs[] = { | |||
| 337 | { "ich_en", EC_TAG_FILES_ICH_ENABLED, 0}, | |||
| 338 | { "aich_trust", EC_TAG_FILES_AICH_TRUST, 0}, | |||
| 339 | { "new_files_paused", EC_TAG_FILES_NEW_PAUSED, 0}, | |||
| 340 | { "new_files_auto_dl_prio", EC_TAG_FILES_NEW_AUTO_DL_PRIO, 0}, | |||
| 341 | { "preview_prio", EC_TAG_FILES_PREVIEW_PRIO, 0}, | |||
| 342 | { "new_files_auto_ul_prio", EC_TAG_FILES_NEW_AUTO_UL_PRIO, 0}, | |||
| 343 | { "upload_full_chunks", EC_TAG_FILES_UL_FULL_CHUNKS, 0}, | |||
| 344 | { "first_last_chunks_prio", EC_TAG_FILES_PREVIEW_PRIO, 0}, | |||
| 345 | { "start_next_paused", EC_TAG_FILES_START_NEXT_PAUSED, 0}, | |||
| 346 | { "resume_same_cat", EC_TAG_FILES_RESUME_SAME_CAT, 0}, | |||
| 347 | { "save_sources", EC_TAG_FILES_SAVE_SOURCES, 0}, | |||
| 348 | { "extract_metadata", EC_TAG_FILES_EXTRACT_METADATA, 0}, | |||
| 349 | { "alloc_full", EC_TAG_FILES_ALLOC_FULL_SIZE, 0}, | |||
| 350 | { "check_free_space", EC_TAG_FILES_CHECK_FREE_SPACE, 0}, | |||
| 351 | { "min_free_space", EC_TAG_FILES_MIN_FREE_SPACE, 4}, | |||
| 352 | {0, (ECTagNames)0, 0} | |||
| 353 | }; | |||
| 354 | ||||
| 355 | PHP_2_EC_OPT_DEF g_webserver_opt_defs[] = { | |||
| 356 | { "use_gzip", EC_TAG_WEBSERVER_USEGZIP, 0}, | |||
| 357 | { "autorefresh_time", EC_TAG_WEBSERVER_REFRESH, 4}, | |||
| 358 | {0, (ECTagNames)0, 0} | |||
| 359 | }; | |||
| 360 | ||||
| 361 | PHP_2_EC_OPT_DEF g_coretweak_opt_defs[] = { | |||
| 362 | { "max_conn_5sec", EC_TAG_CORETW_MAX_CONN_PER_FIVE, 2}, | |||
| 363 | {0, (ECTagNames)0, 0} | |||
| 364 | }; | |||
| 365 | ||||
| 366 | void set_array_int_val(PHP_VALUE_NODE *array, const std::string &arrkey, int value) | |||
| 367 | { | |||
| 368 | PHP_VAR_NODE *key = array_get_by_str_key(array, arrkey); | |||
| 369 | PHP_VALUE_NODE intval; | |||
| 370 | intval.type = PHP_VAL_INT; | |||
| 371 | intval.int_val = value; | |||
| 372 | value_value_assign(&key->value, &intval); | |||
| 373 | } | |||
| 374 | ||||
| 375 | void ec_tag_2_php(const CECTag *cattag, PHP_2_EC_OPT_DEF *opts, PHP_VAR_NODE *catvar) | |||
| 376 | { | |||
| 377 | for(PHP_2_EC_OPT_DEF *def = opts; def->php_name; def++) { | |||
| 378 | int val; | |||
| 379 | switch(def->opsize) { | |||
| 380 | case 0: val = cattag->GetTagByName(def->tagname) ? 1 : 0; break; | |||
| 381 | case 1: val = cattag->GetTagByNameSafe(def->tagname)->GetInt(); break; | |||
| 382 | case 2: val = cattag->GetTagByNameSafe(def->tagname)->GetInt(); break; | |||
| 383 | case 4: val = cattag->GetTagByNameSafe(def->tagname)->GetInt(); break; | |||
| 384 | default: val = -1; | |||
| 385 | } | |||
| 386 | wxASSERT(val != -1)do { if ( val != -1 ) { } else if ( wxTheAssertHandler && (wxOnAssert("php_amule_lib.cpp", 386, __FUNCTION__, "val != -1" , (const char*)__null), wxTrapInAssert) ) { wxTrapInAssert = false ; asm volatile ("int $3"); } } while ( (void)0, 0 ); | |||
| 387 | //printf("OPT_DEBUG: %s of size %d -> %d\n", def->php_name, def->opsize, val); | |||
| 388 | set_array_int_val(&catvar->value, def->php_name, val); | |||
| 389 | } | |||
| 390 | } | |||
| 391 | ||||
| 392 | /* | |||
| 393 | * Return hash of amule options. | |||
| 394 | * Key: option name | |||
| 395 | * Value: option value (string) | |||
| 396 | */ | |||
| 397 | void php_get_amule_options(PHP_VALUE_NODE *result) | |||
| 398 | { | |||
| 399 | cast_value_array(result); | |||
| 400 | ||||
| 401 | CECPacket req(EC_OP_GET_PREFERENCES); | |||
| 402 | req.AddTag(CECTag(EC_TAG_SELECT_PREFS, (uint32)0xffffffff)); | |||
| 403 | const CECPacket *reply = CPhPLibContext::g_curr_context->WebServer()->webInterface->SendRecvMsg_v2(&req); | |||
| 404 | if ( !reply || !reply->HasChildTags()) { | |||
| 405 | return ; | |||
| 406 | } | |||
| 407 | const CECTag *cattag = 0; | |||
| 408 | if ((cattag = reply->GetTagByName(EC_TAG_PREFS_GENERAL)) != 0) { | |||
| 409 | PHP_VAR_NODE *key = array_get_by_str_key(result, "nick"); | |||
| 410 | value_value_free(&key->value); | |||
| 411 | key->value.type = PHP_VAL_STRING; | |||
| 412 | key->value.str_val = strdup(unicode2UTF8(cattag->GetTagByNameSafe(EC_TAG_USER_NICK)->GetStringData())); | |||
| 413 | } | |||
| 414 | ||||
| 415 | if ((cattag = reply->GetTagByName(EC_TAG_PREFS_CONNECTIONS)) != 0) { | |||
| 416 | PHP_VAR_NODE *cat = array_get_by_str_key(result, "connection"); | |||
| 417 | cast_value_array(&cat->value); | |||
| 418 | ||||
| 419 | ec_tag_2_php(cattag, g_connection_opt_defs, cat); | |||
| 420 | } | |||
| 421 | if ((cattag = reply->GetTagByName(EC_TAG_PREFS_FILES)) != 0) { | |||
| 422 | PHP_VAR_NODE *cat = array_get_by_str_key(result, "files"); | |||
| 423 | cast_value_array(&cat->value); | |||
| 424 | ||||
| 425 | ec_tag_2_php(cattag, g_file_opt_defs, cat); | |||
| 426 | } | |||
| 427 | ||||
| 428 | if ((cattag = reply->GetTagByName(EC_TAG_PREFS_REMOTECTRL)) != 0) { | |||
| 429 | PHP_VAR_NODE *cat = array_get_by_str_key(result, "webserver"); | |||
| 430 | cast_value_array(&cat->value); | |||
| 431 | ||||
| 432 | ec_tag_2_php(cattag, g_webserver_opt_defs, cat); | |||
| 433 | } | |||
| 434 | ||||
| 435 | if ((cattag = reply->GetTagByName(EC_TAG_PREFS_CORETWEAKS)) != 0) { | |||
| 436 | PHP_VAR_NODE *cat = array_get_by_str_key(result, "coretweaks"); | |||
| 437 | cast_value_array(&cat->value); | |||
| 438 | ||||
| 439 | ec_tag_2_php(cattag, g_coretweak_opt_defs, cat); | |||
| 440 | } | |||
| 441 | } | |||
| 442 | ||||
| 443 | bool php_2_ec_tag(CECTag *cattag, PHP_2_EC_OPT_DEF *opts, PHP_VALUE_NODE *catvar) | |||
| 444 | { | |||
| 445 | for(PHP_2_EC_OPT_DEF *def = opts; def->php_name; def++) { | |||
| ||||
| 446 | PHP_VAR_NODE *opt_var = array_get_by_str_key(catvar, def->php_name); | |||
| 447 | if ( opt_var->value.type == PHP_VAL_NONE ) { | |||
| 448 | continue; | |||
| 449 | } | |||
| 450 | cast_value_dnum(&opt_var->value); | |||
| 451 | switch(def->opsize) { | |||
| 452 | case 0: // always transmit ! | |||
| 453 | case 1: cattag->AddTag(CECTag(def->tagname ,(uint8)opt_var->value.int_val)); break; | |||
| 454 | case 2: cattag->AddTag(CECTag(def->tagname ,(uint16)opt_var->value.int_val)); break; | |||
| 455 | case 4: cattag->AddTag(CECTag(def->tagname ,(uint32)opt_var->value.int_val)); break; | |||
| 456 | default: return false; | |||
| 457 | } | |||
| 458 | } | |||
| 459 | return true; | |||
| 460 | } | |||
| 461 | ||||
| 462 | /* | |||
| 463 | * Set amule options from given array. Argument looks like "amule_get_options" result | |||
| 464 | */ | |||
| 465 | void php_set_amule_options(PHP_VALUE_NODE *) | |||
| 466 | { | |||
| 467 | PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); | |||
| 468 | if ( !si || (si->var->value.type != PHP_VAL_ARRAY)) { | |||
| ||||
| 469 | php_report_error(PHP_ERROR, "Invalid or missing argument 1 (options array)"); | |||
| 470 | return; | |||
| 471 | } | |||
| 472 | ||||
| 473 | CECPacket req(EC_OP_SET_PREFERENCES); | |||
| 474 | PHP_VAR_NODE *opt_group_array = 0; | |||
| 475 | ||||
| 476 | // files | |||
| 477 | opt_group_array = array_get_by_str_key(&si->var->value, "files"); | |||
| 478 | if ( opt_group_array->value.type == PHP_VAL_ARRAY ) { | |||
| 479 | CECEmptyTag filePrefs(EC_TAG_PREFS_FILES); | |||
| 480 | php_2_ec_tag(&filePrefs, g_file_opt_defs, &opt_group_array->value); | |||
| 481 | req.AddTag(filePrefs); | |||
| 482 | } | |||
| 483 | // connection | |||
| 484 | opt_group_array = array_get_by_str_key(&si->var->value, "connection"); | |||
| 485 | if ( opt_group_array->value.type == PHP_VAL_ARRAY ) { | |||
| 486 | CECEmptyTag connPrefs(EC_TAG_PREFS_CONNECTIONS); | |||
| 487 | php_2_ec_tag(&connPrefs, g_connection_opt_defs, &opt_group_array->value); | |||
| 488 | req.AddTag(connPrefs); | |||
| 489 | } | |||
| 490 | // webserver | |||
| 491 | opt_group_array = array_get_by_str_key(&si->var->value, "webserver"); | |||
| 492 | if ( opt_group_array->value.type == PHP_VAL_ARRAY ) { | |||
| 493 | CECEmptyTag webPrefs(EC_TAG_PREFS_REMOTECTRL); | |||
| 494 | php_2_ec_tag(&webPrefs, g_webserver_opt_defs, &opt_group_array->value); | |||
| 495 | req.AddTag(webPrefs); | |||
| 496 | // also apply settings localy | |||
| 497 | PHP_VAR_NODE *pref = array_get_by_str_key(&opt_group_array->value, "use_gzip"); | |||
| 498 | cast_value_dnum(&pref->value); | |||
| 499 | CPhPLibContext::g_curr_context->WebServer()->webInterface->m_UseGzip = pref->value.int_val != 0; | |||
| 500 | pref = array_get_by_str_key(&opt_group_array->value, "autorefresh_time"); | |||
| 501 | cast_value_dnum(&pref->value); | |||
| 502 | CPhPLibContext::g_curr_context->WebServer()->webInterface->m_PageRefresh = pref->value.int_val; | |||
| 503 | } | |||
| 504 | CPhPLibContext::g_curr_context->WebServer()->Send_Discard_V2_Request(&req); | |||
| 505 | } | |||
| 506 | ||||
| 507 | /* | |||
| 508 | * Download 1 of search results. Params: hash, category (default=0) | |||
| 509 | */ | |||
| 510 | void php_native_search_download_cmd(PHP_VALUE_NODE *) | |||
| 511 | { | |||
| 512 | PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); | |||
| 513 | if ( !si || (si->var->value.type != PHP_VAL_STRING)) { | |||
| 514 | php_report_error(PHP_ERROR, "Invalid or missing argument 1 (file hash)"); | |||
| 515 | return; | |||
| 516 | } | |||
| 517 | char *str_hash = si->var->value.str_val; | |||
| 518 | ||||
| 519 | si = get_scope_item(g_current_scope, "__param_1"); | |||
| 520 | if ( !si || (si->var->value.type != PHP_VAL_STRING)) { | |||
| 521 | php_report_error(PHP_ERROR, "Invalid or missing argument 2 (category)"); | |||
| 522 | return; | |||
| 523 | } | |||
| 524 | ||||
| 525 | cast_value_dnum(&si->var->value); | |||
| 526 | int cat = si->var->value.int_val; | |||
| 527 | ||||
| 528 | CPhPLibContext::g_curr_context->WebServer()->Send_DownloadSearchFile_Cmd( | |||
| 529 | wxString(char2unicode(str_hash)), cat); | |||
| 530 | } | |||
| 531 | ||||
| 532 | void php_native_search_start_cmd(PHP_VALUE_NODE *) | |||
| 533 | { | |||
| 534 | PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); | |||
| 535 | if ( !si || (si->var->value.type != PHP_VAL_STRING)) { | |||
| 536 | php_report_error(PHP_ERROR, "Invalid or missing argument 1 (search term)"); | |||
| 537 | return; | |||
| 538 | } | |||
| 539 | char *search = si->var->value.str_val; | |||
| 540 | ||||
| 541 | if ( !(si = get_scope_item(g_current_scope, "__param_1")) || (si->var->value.type != PHP_VAL_STRING)) { | |||
| 542 | php_report_error(PHP_ERROR, "Invalid or missing argument 2 (file extension)"); | |||
| 543 | return; | |||
| 544 | } | |||
| 545 | char *ext = si->var->value.str_val; | |||
| 546 | ||||
| 547 | if ( !(si = get_scope_item(g_current_scope, "__param_2")) || (si->var->value.type != PHP_VAL_STRING)) { | |||
| 548 | php_report_error(PHP_ERROR, "Invalid or missing argument 3 (file type)"); | |||
| 549 | return; | |||
| 550 | } | |||
| 551 | char *type = si->var->value.str_val; | |||
| 552 | ||||
| 553 | if ( !(si = get_scope_item(g_current_scope, "__param_3")) ) { | |||
| 554 | php_report_error(PHP_ERROR, "Invalid or missing argument 4 (search type)"); | |||
| 555 | return; | |||
| 556 | } | |||
| 557 | cast_value_dnum(&si->var->value); | |||
| 558 | ||||
| 559 | EC_SEARCH_TYPE search_type; | |||
| 560 | switch(si->var->value.int_val) { | |||
| 561 | case 0: search_type = EC_SEARCH_LOCAL; break; | |||
| 562 | case 1: search_type = EC_SEARCH_GLOBAL; break; | |||
| 563 | case 2: search_type = EC_SEARCH_KAD; break; | |||
| 564 | default: | |||
| 565 | php_report_error(PHP_ERROR, "Invalid search type %" PRIu64"l" "u", si->var->value.int_val); | |||
| 566 | return; | |||
| 567 | } | |||
| 568 | ||||
| 569 | if ( !(si = get_scope_item(g_current_scope, "__param_4")) ) { | |||
| 570 | php_report_error(PHP_ERROR, "Invalid or missing argument 5 (availability)"); | |||
| 571 | return; | |||
| 572 | } | |||
| 573 | cast_value_dnum(&si->var->value); | |||
| 574 | int avail = si->var->value.int_val; | |||
| 575 | ||||
| 576 | if ( !(si = get_scope_item(g_current_scope, "__param_5")) ) { | |||
| 577 | php_report_error(PHP_ERROR, "Invalid or missing argument 6 (min size)"); | |||
| 578 | return; | |||
| 579 | } | |||
| 580 | cast_value_dnum(&si->var->value); | |||
| 581 | int min_size = si->var->value.int_val; | |||
| 582 | ||||
| 583 | if ( !(si = get_scope_item(g_current_scope, "__param_6")) ) { | |||
| 584 | php_report_error(PHP_ERROR, "Invalid or missing argument 7 (max size)"); | |||
| 585 | return; | |||
| 586 | } | |||
| 587 | cast_value_dnum(&si->var->value); | |||
| 588 | int max_size = si->var->value.int_val; | |||
| 589 | ||||
| 590 | ||||
| 591 | CPhPLibContext::g_curr_context->WebServer()->Send_Search_Cmd( | |||
| 592 | wxString(char2unicode(search)), wxString(char2unicode(ext)), wxString(char2unicode(type)), | |||
| 593 | search_type, avail, min_size, max_size); | |||
| 594 | } | |||
| 595 | ||||
| 596 | /* | |||
| 597 | * Request contents of log | |||
| 598 | */ | |||
| 599 | void php_get_log(PHP_VALUE_NODE *result) | |||
| 600 | { | |||
| 601 | value_value_free(result); | |||
| 602 | ||||
| 603 | PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); | |||
| 604 | bool rst; | |||
| 605 | if ( !si ) { | |||
| 606 | rst = false; | |||
| 607 | } else { | |||
| 608 | cast_value_dnum(&si->var->value); | |||
| 609 | rst = si->var->value.int_val != 0; | |||
| 610 | } | |||
| 611 | if ( rst ) { | |||
| 612 | CECPacket req(EC_OP_RESET_LOG); | |||
| 613 | CPhPLibContext::g_curr_context->WebServer()->Send_Discard_V2_Request(&req); | |||
| 614 | } | |||
| 615 | CECPacket req(EC_OP_GET_LOG); | |||
| 616 | const CECPacket *response = CPhPLibContext::g_curr_context->WebServer()->webInterface->SendRecvMsg_v2(&req); | |||
| 617 | if (response) { | |||
| 618 | wxString serverInfoString(_SpecialChars(response->GetFirstTagSafe()->GetStringData())); | |||
| 619 | delete response; | |||
| 620 | result->type = PHP_VAL_STRING; | |||
| 621 | result->str_val = strdup((const char *)unicode2UTF8(serverInfoString)); | |||
| 622 | } | |||
| 623 | } | |||
| 624 | ||||
| 625 | /* | |||
| 626 | * Request contents of server info | |||
| 627 | */ | |||
| 628 | void php_get_serverinfo(PHP_VALUE_NODE *result) | |||
| 629 | { | |||
| 630 | value_value_free(result); | |||
| 631 | ||||
| 632 | PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); | |||
| 633 | bool rst; | |||
| 634 | if ( !si ) { | |||
| 635 | rst = false; | |||
| 636 | } else { | |||
| 637 | cast_value_dnum(&si->var->value); | |||
| 638 | rst = si->var->value.int_val != 0; | |||
| 639 | } | |||
| 640 | ||||
| 641 | if ( rst ) { | |||
| 642 | CECPacket req(EC_OP_CLEAR_SERVERINFO); | |||
| 643 | CPhPLibContext::g_curr_context->WebServer()->Send_Discard_V2_Request(&req); | |||
| 644 | } | |||
| 645 | CECPacket req(EC_OP_GET_SERVERINFO); | |||
| 646 | const CECPacket *response = CPhPLibContext::g_curr_context->WebServer()->webInterface->SendRecvMsg_v2(&req); | |||
| 647 | if (response) { | |||
| 648 | wxString serverInfoString(_SpecialChars(response->GetFirstTagSafe()->GetStringData())); | |||
| 649 | delete response; | |||
| 650 | result->type = PHP_VAL_STRING; | |||
| 651 | result->str_val = strdup((const char *)unicode2UTF8(serverInfoString)); | |||
| 652 | } | |||
| 653 | } | |||
| 654 | ||||
| 655 | ||||
| 656 | /* | |||
| 657 | * Download ed2k link. Params: link, category (default=0) | |||
| 658 | */ | |||
| 659 | void php_native_ed2k_download_cmd(PHP_VALUE_NODE *result) | |||
| 660 | { | |||
| 661 | PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); | |||
| 662 | if ( !si || (si->var->value.type != PHP_VAL_STRING)) { | |||
| 663 | php_report_error(PHP_ERROR, "Invalid or missing argument 1 (file link)"); | |||
| 664 | return; | |||
| 665 | } | |||
| 666 | char *str_link = si->var->value.str_val; | |||
| 667 | ||||
| 668 | si = get_scope_item(g_current_scope, "__param_1"); | |||
| 669 | if ( !si || (si->var->value.type != PHP_VAL_STRING)) { | |||
| 670 | php_report_error(PHP_ERROR, "Invalid or missing argument 2 (category)"); | |||
| 671 | return; | |||
| 672 | } | |||
| 673 | ||||
| 674 | cast_value_dnum(&si->var->value); | |||
| 675 | int cat = si->var->value.int_val; | |||
| 676 | ||||
| 677 | bool cmd_result = CPhPLibContext::g_curr_context->WebServer()->Send_DownloadEd2k_Cmd( | |||
| 678 | wxString(char2unicode(str_link)), cat); | |||
| 679 | if ( result ) { | |||
| 680 | cast_value_bool(result); | |||
| 681 | result->int_val = cmd_result; | |||
| 682 | } | |||
| 683 | } | |||
| 684 | ||||
| 685 | ||||
| 686 | /* | |||
| 687 | * Load amule variables into interpreter scope. | |||
| 688 | * "varname" will tell us, what kind of variables need to load: | |||
| 689 | * "downloads", "uploads", "searchresult", "servers", "options" etc | |||
| 690 | */ | |||
| 691 | template <class C, class T> | |||
| 692 | void amule_obj_array_create(const char *class_name, PHP_VALUE_NODE *result) | |||
| 693 | { | |||
| 694 | if ( !result ) { | |||
| 695 | return; | |||
| 696 | } | |||
| 697 | C *container = T::GetContainerInstance(); | |||
| 698 | ||||
| 699 | container->ReQuery(); | |||
| 700 | ||||
| 701 | typename std::list<T>::const_iterator it = container->GetBeginIterator(); | |||
| 702 | while ( it != container->GetEndIterator()) { | |||
| 703 | PHP_VAR_NODE *var = array_push_back(result); | |||
| 704 | var->value.type = PHP_VAL_OBJECT; | |||
| 705 | var->value.obj_val.class_name = class_name; | |||
| 706 | const T *cur_item = &(*it); | |||
| 707 | var->value.obj_val.inst_ptr = (void *)cur_item; | |||
| 708 | ++it; | |||
| 709 | } | |||
| 710 | } | |||
| 711 | ||||
| 712 | void amule_load_downloads(PHP_VALUE_NODE *result) | |||
| 713 | { | |||
| 714 | amule_obj_array_create<DownloadFileInfo, DownloadFile>("AmuleDownloadFile", result); | |||
| 715 | } | |||
| 716 | ||||
| 717 | void amule_load_servers(PHP_VALUE_NODE *result) | |||
| 718 | { | |||
| 719 | amule_obj_array_create<ServersInfo, ServerEntry>("AmuleServer", result); | |||
| 720 | } | |||
| 721 | ||||
| 722 | void amule_load_shared(PHP_VALUE_NODE *result) | |||
| 723 | { | |||
| 724 | amule_obj_array_create<SharedFileInfo, SharedFile>("AmuleSharedFile", result); | |||
| 725 | } | |||
| 726 | ||||
| 727 | void amule_load_search(PHP_VALUE_NODE *result) | |||
| 728 | { | |||
| 729 | amule_obj_array_create<SearchInfo, SearchFile>("AmuleSearchFile", result); | |||
| 730 | } | |||
| 731 | ||||
| 732 | void amule_load_uploads(PHP_VALUE_NODE *result) | |||
| 733 | { | |||
| 734 | amule_obj_array_create<UploadsInfo, UploadFile>("AmuleUploadFile", result); | |||
| 735 | } | |||
| 736 | ||||
| 737 | void amule_load_stats() | |||
| 738 | { | |||
| 739 | CPhPLibContext::g_curr_context->WebServer()->Reload_Stats(); | |||
| 740 | } | |||
| 741 | ||||
| 742 | /* | |||
| 743 | * Convert CEC_StatTree_Node_Tag into php associative array | |||
| 744 | * | |||
| 745 | * Since data structure is recoursive - we need helper function | |||
| 746 | * to perform conversion | |||
| 747 | */ | |||
| 748 | void ecstats2php(CEC_StatTree_Node_Tag *root, PHP_VALUE_NODE *result) | |||
| 749 | { | |||
| 750 | cast_value_array(result); | |||
| 751 | std::string key(unicode2UTF8(root->GetDisplayString())); | |||
| 752 | PHP_VAR_NODE *v_key = array_get_by_str_key(result, key); | |||
| 753 | for (CECTag::const_iterator it = root->begin(); it != root->end(); ++it) { | |||
| 754 | CEC_StatTree_Node_Tag *tag = (CEC_StatTree_Node_Tag*) & *it; | |||
| 755 | if (tag->GetTagName() == EC_TAG_STATTREE_NODE) { | |||
| 756 | ecstats2php(tag, &v_key->value); | |||
| 757 | } | |||
| 758 | } | |||
| 759 | ||||
| 760 | } | |||
| 761 | ||||
| 762 | void amule_load_stats_tree(PHP_VALUE_NODE *result) | |||
| 763 | { | |||
| 764 | if ( !result ) { | |||
| 765 | return; | |||
| 766 | } | |||
| 767 | value_value_free(result); | |||
| 768 | ||||
| 769 | CECPacket req(EC_OP_GET_STATSTREE, EC_DETAIL_WEB); | |||
| 770 | const CECPacket *response = CPhPLibContext::g_curr_context->WebServer()->webInterface->SendRecvMsg_v2(&req); | |||
| 771 | if ( !response ) { | |||
| 772 | return; | |||
| 773 | } | |||
| 774 | const CECTag *server_ver = response->GetTagByName(EC_TAG_SERVER_VERSION); | |||
| 775 | const CECTag *user_nick = response->GetTagByName(EC_TAG_USER_NICK); | |||
| 776 | if ( !server_ver || !user_nick ) { | |||
| 777 | delete response; | |||
| 778 | return; | |||
| 779 | } | |||
| 780 | const CEC_StatTree_Node_Tag *stats_root = static_cast<const CEC_StatTree_Node_Tag *>(response->GetTagByName(EC_TAG_STATTREE_NODE)); | |||
| 781 | //ecstats2php(stats_root, result); | |||
| 782 | for (CECTag::const_iterator it = stats_root->begin(); it != stats_root->end(); ++it) { | |||
| 783 | CEC_StatTree_Node_Tag *tag = (CEC_StatTree_Node_Tag*) & *it; | |||
| 784 | if (tag->GetTagName() == EC_TAG_STATTREE_NODE) { | |||
| 785 | ecstats2php(tag, result); | |||
| 786 | } | |||
| 787 | } | |||
| 788 | } | |||
| 789 | ||||
| 790 | void php_native_load_amule_vars(PHP_VALUE_NODE *result) | |||
| 791 | { | |||
| 792 | PHP_SCOPE_ITEM *si_str = get_scope_item(g_current_scope, "__param_0"); | |||
| 793 | if ( !si_str ) { | |||
| 794 | php_report_error(PHP_ERROR, "Missing argument 'varname' for 'load_amule_vars'"); | |||
| 795 | return; | |||
| 796 | } | |||
| 797 | PHP_VALUE_NODE *str = &si_str->var->value; | |||
| 798 | if ( str->type != PHP_VAL_STRING ) { | |||
| 799 | php_report_error(PHP_ERROR, "Argument 'varname' for 'load_amule_vars' must be string"); | |||
| 800 | return; | |||
| 801 | } | |||
| 802 | char *varname = str->str_val; | |||
| 803 | if ( result ) { | |||
| 804 | cast_value_array(result); | |||
| 805 | } | |||
| 806 | if ( strcmp(varname, "downloads") == 0 ) { | |||
| 807 | amule_load_downloads(result); | |||
| 808 | } else if ( strcmp(varname, "uploads") == 0 ) { | |||
| 809 | amule_load_uploads(result); | |||
| 810 | } else if ( strcmp(varname, "shared") == 0 ) { | |||
| 811 | amule_load_shared(result); | |||
| 812 | } else if ( strcmp(varname, "searchresult") == 0 ) { | |||
| 813 | amule_load_search(result); | |||
| 814 | } else if ( strcmp(varname, "servers") == 0 ) { | |||
| 815 | amule_load_servers(result); | |||
| 816 | } else if ( strcmp(varname, "stats_graph") == 0 ) { | |||
| 817 | amule_load_stats(); | |||
| 818 | } else if ( strcmp(varname, "stats_tree") == 0 ) { | |||
| 819 | amule_load_stats_tree(result); | |||
| 820 | } else { | |||
| 821 | value_value_free(result); | |||
| 822 | php_report_error(PHP_ERROR, "This type of amule variable is unknown"); | |||
| 823 | } | |||
| 824 | } | |||
| 825 | ||||
| 826 | /* | |||
| 827 | * Amule objects implementations | |||
| 828 | */ | |||
| 829 | void amule_download_file_prop_get(void *ptr, char *prop_name, PHP_VALUE_NODE *result) | |||
| 830 | { | |||
| 831 | if ( !ptr ) { | |||
| 832 | value_value_free(result); | |||
| 833 | return; | |||
| 834 | } | |||
| 835 | DownloadFile *obj = static_cast<DownloadFile *>(ptr); | |||
| 836 | result->type = PHP_VAL_INT; | |||
| 837 | if ( strcmp(prop_name, "name") == 0 ) { | |||
| 838 | result->type = PHP_VAL_STRING; | |||
| 839 | result->str_val = strdup((const char *)unicode2UTF8(obj->sFileName)); | |||
| 840 | } else if ( strcmp(prop_name, "short_name") == 0 ) { | |||
| 841 | result->type = PHP_VAL_STRING; | |||
| 842 | wxString short_name(obj->sFileName.Length() > 60 ? (obj->sFileName.Left(60) + (wxT(" ...")L" ...")) : obj->sFileName); | |||
| 843 | result->str_val = strdup((const char *)unicode2UTF8(short_name)); | |||
| 844 | } else if ( strcmp(prop_name, "hash") == 0 ) { | |||
| 845 | result->type = PHP_VAL_STRING; | |||
| 846 | result->str_val = strdup((const char *)unicode2UTF8(obj->sFileHash)); | |||
| 847 | } else if ( strcmp(prop_name, "progress") == 0 ) { | |||
| 848 | result->type = PHP_VAL_STRING; | |||
| 849 | result->str_val = strdup((const char *)unicode2UTF8(obj->m_Image->GetHTML())); | |||
| 850 | } else if ( strcmp(prop_name, "link") == 0 ) { | |||
| 851 | result->type = PHP_VAL_STRING; | |||
| 852 | result->str_val = strdup((const char *)unicode2UTF8(obj->sED2kLink)); | |||
| 853 | } else if ( strcmp(prop_name, "category") == 0 ) { | |||
| 854 | result->int_val = obj->nCat; | |||
| 855 | } else if ( strcmp(prop_name, "status") == 0 ) { | |||
| 856 | result->int_val = obj->nFileStatus; | |||
| 857 | } else if ( strcmp(prop_name, "size") == 0 ) { | |||
| 858 | result->int_val = obj->lFileSize; | |||
| 859 | } else if ( strcmp(prop_name, "size_done") == 0 ) { | |||
| 860 | result->int_val = obj->lFileCompleted; | |||
| 861 | } else if ( strcmp(prop_name, "size_xfer") == 0 ) { | |||
| 862 | result->int_val = obj->lFileTransferred; | |||
| 863 | } else if ( strcmp(prop_name, "speed") == 0 ) { | |||
| 864 | result->int_val = obj->lFileSpeed; | |||
| 865 | } else if ( strcmp(prop_name, "src_count") == 0 ) { | |||
| 866 | result->int_val = obj->lSourceCount; | |||
| 867 | } else if ( strcmp(prop_name, "src_count_not_curr") == 0 ) { | |||
| 868 | result->int_val = obj->lNotCurrentSourceCount; | |||
| 869 | } else if ( strcmp(prop_name, "src_count_a4af") == 0 ) { | |||
| 870 | result->int_val = obj->lSourceCountA4AF; | |||
| 871 | } else if ( strcmp(prop_name, "src_count_xfer") == 0 ) { | |||
| 872 | result->int_val = obj->lTransferringSourceCount; | |||
| 873 | } else if ( strcmp(prop_name, "prio") == 0 ) { | |||
| 874 | result->int_val = obj->lFilePrio; | |||
| 875 | } else if ( strcmp(prop_name, "prio_auto") == 0 ) { | |||
| 876 | result->int_val = obj->bFileAutoPriority; | |||
| 877 | } else if ( strcmp(prop_name, "last_seen_complete") == 0 ) { | |||
| 878 | result->int_val = obj->wxtLastSeenComplete.GetTicks(); | |||
| 879 | } else { | |||
| 880 | php_report_error(PHP_ERROR, "'DownloadFile' property [%s] is unknown", prop_name); | |||
| 881 | } | |||
| 882 | } | |||
| 883 | ||||
| 884 | void amule_upload_file_prop_get(void *ptr, char *prop_name, PHP_VALUE_NODE *result) | |||
| 885 | { | |||
| 886 | if ( !ptr ) { | |||
| 887 | value_value_free(result); | |||
| 888 | return; | |||
| 889 | } | |||
| 890 | UploadFile *obj = static_cast<UploadFile *>(ptr); | |||
| 891 | result->type = PHP_VAL_INT; | |||
| 892 | if ( strcmp(prop_name, "name") == 0 ) { | |||
| 893 | result->type = PHP_VAL_STRING; | |||
| 894 | SharedFile *sharedfile = SharedFile::GetContainerInstance()->GetByID(obj->nUploadFile); | |||
| 895 | // uploading file we don't share ?! We are either out of sync with core or a shared file has been removed while uploading it | |||
| 896 | if ( !sharedfile ) { | |||
| 897 | SharedFile::GetContainerInstance()->ReQuery(); | |||
| 898 | sharedfile = SharedFile::GetContainerInstance()->GetByID(obj->nUploadFile); | |||
| 899 | } | |||
| 900 | result->str_val = strdup(sharedfile ? (const char *)unicode2UTF8(sharedfile->sFileName) : "???"); | |||
| 901 | } else if ( strcmp(prop_name, "short_name") == 0 ) { | |||
| 902 | result->type = PHP_VAL_STRING; | |||
| 903 | SharedFile *sharedfile = SharedFile::GetContainerInstance()->GetByID(obj->nUploadFile); | |||
| 904 | if ( !sharedfile ) { | |||
| 905 | SharedFile::GetContainerInstance()->ReQuery(); | |||
| 906 | sharedfile = SharedFile::GetContainerInstance()->GetByID(obj->nUploadFile); | |||
| 907 | } | |||
| 908 | wxString short_name; | |||
| 909 | if (sharedfile) { | |||
| 910 | short_name = sharedfile->sFileName.Length() > 60 ? (sharedfile->sFileName.Left(60) + (wxT(" ...")L" ...")) : sharedfile->sFileName; | |||
| 911 | } else { | |||
| 912 | short_name = wxT("???")L"???"; | |||
| 913 | } | |||
| 914 | result->str_val = strdup((const char *)unicode2UTF8(short_name)); | |||
| 915 | } else if ( strcmp(prop_name, "user_name") == 0 ) { | |||
| 916 | result->type = PHP_VAL_STRING; | |||
| 917 | result->str_val = strdup((const char *)unicode2UTF8(obj->sUserName)); | |||
| 918 | } else if ( strcmp(prop_name, "xfer_up") == 0 ) { | |||
| 919 | result->int_val = obj->nTransferredUp; | |||
| 920 | } else if ( strcmp(prop_name, "xfer_down") == 0 ) { | |||
| 921 | result->int_val = obj->nTransferredDown; | |||
| 922 | } else if ( strcmp(prop_name, "xfer_speed") == 0 ) { | |||
| 923 | result->int_val = obj->nSpeed; | |||
| 924 | } else { | |||
| 925 | php_report_error(PHP_ERROR, "'UploadFile' property [%s] is unknown", prop_name); | |||
| 926 | } | |||
| 927 | } | |||
| 928 | ||||
| 929 | void amule_server_prop_get(void *ptr, char *prop_name, PHP_VALUE_NODE *result) | |||
| 930 | { | |||
| 931 | if ( !ptr ) { | |||
| 932 | value_value_free(result); | |||
| 933 | return; | |||
| 934 | } | |||
| 935 | ServerEntry *obj = static_cast<ServerEntry *>(ptr); | |||
| 936 | if ( strcmp(prop_name, "name") == 0 ) { | |||
| 937 | result->type = PHP_VAL_STRING; | |||
| 938 | result->str_val = strdup((const char *)unicode2UTF8(obj->sServerName)); | |||
| 939 | } else if ( strcmp(prop_name, "desc") == 0 ) { | |||
| 940 | result->type = PHP_VAL_STRING; | |||
| 941 | result->str_val = strdup((const char *)unicode2UTF8(obj->sServerDescription)); | |||
| 942 | } else if ( strcmp(prop_name, "addr") == 0 ) { | |||
| 943 | result->type = PHP_VAL_STRING; | |||
| 944 | result->str_val = strdup((const char *)unicode2UTF8(obj->sServerIP)); | |||
| 945 | } else if ( strcmp(prop_name, "users") == 0 ) { | |||
| 946 | result->type = PHP_VAL_INT; | |||
| 947 | result->int_val = obj->nServerUsers; | |||
| 948 | } else if ( strcmp(prop_name, "ip") == 0 ) { | |||
| 949 | result->type = PHP_VAL_INT; | |||
| 950 | result->int_val = obj->nServerIP; | |||
| 951 | } else if ( strcmp(prop_name, "port") == 0 ) { | |||
| 952 | result->type = PHP_VAL_INT; | |||
| 953 | result->int_val = obj->nServerPort; | |||
| 954 | } else if ( strcmp(prop_name, "maxusers") == 0 ) { | |||
| 955 | result->type = PHP_VAL_INT; | |||
| 956 | result->int_val = obj->nServerMaxUsers; | |||
| 957 | } else if ( strcmp(prop_name, "files") == 0 ) { | |||
| 958 | result->type = PHP_VAL_INT; | |||
| 959 | result->int_val = obj->nServerFiles; | |||
| 960 | } else { | |||
| 961 | php_report_error(PHP_ERROR, "'ServerEntry' property [%s] is unknown", prop_name); | |||
| 962 | } | |||
| 963 | } | |||
| 964 | ||||
| 965 | void amule_shared_file_prop_get(void *ptr, char *prop_name, PHP_VALUE_NODE *result) | |||
| 966 | { | |||
| 967 | if ( !ptr ) { | |||
| 968 | value_value_free(result); | |||
| 969 | return; | |||
| 970 | } | |||
| 971 | SharedFile *obj = static_cast<SharedFile *>(ptr); | |||
| 972 | if ( strcmp(prop_name, "name") == 0 ) { | |||
| 973 | result->type = PHP_VAL_STRING; | |||
| 974 | result->str_val = strdup((const char *)unicode2UTF8(obj->sFileName)); | |||
| 975 | } else if ( strcmp(prop_name, "short_name") == 0 ) { | |||
| 976 | result->type = PHP_VAL_STRING; | |||
| 977 | wxString short_name(obj->sFileName.Length() > 60 ? (obj->sFileName.Left(60) + (wxT(" ...")L" ...")) : obj->sFileName); | |||
| 978 | result->str_val = strdup((const char *)unicode2UTF8(short_name)); | |||
| 979 | } else if ( strcmp(prop_name, "hash") == 0 ) { | |||
| 980 | result->type = PHP_VAL_STRING; | |||
| 981 | result->str_val = strdup((const char *)unicode2UTF8(obj->sFileHash)); | |||
| 982 | } else if ( strcmp(prop_name, "size") == 0 ) { | |||
| 983 | result->type = PHP_VAL_INT; | |||
| 984 | result->int_val = obj->lFileSize; | |||
| 985 | } else if ( strcmp(prop_name, "link") == 0 ) { | |||
| 986 | result->type = PHP_VAL_STRING; | |||
| 987 | result->str_val = strdup(unicode2UTF8(obj->sED2kLink)); | |||
| 988 | } else if ( strcmp(prop_name, "xfer") == 0 ) { | |||
| 989 | result->type = PHP_VAL_INT; | |||
| 990 | result->int_val = obj->nFileTransferred; | |||
| 991 | } else if ( strcmp(prop_name, "xfer_all") == 0 ) { | |||
| 992 | result->type = PHP_VAL_INT; | |||
| 993 | result->int_val = obj->nFileAllTimeTransferred; | |||
| 994 | } else if ( strcmp(prop_name, "req") == 0 ) { | |||
| 995 | result->type = PHP_VAL_INT; | |||
| 996 | result->int_val = obj->nFileRequests; | |||
| 997 | } else if ( strcmp(prop_name, "req_all") == 0 ) { | |||
| 998 | result->type = PHP_VAL_INT; | |||
| 999 | result->int_val = obj->nFileAllTimeRequests; | |||
| 1000 | } else if ( strcmp(prop_name, "accept") == 0 ) { | |||
| 1001 | result->type = PHP_VAL_INT; | |||
| 1002 | result->int_val = obj->nFileAccepts; | |||
| 1003 | } else if ( strcmp(prop_name, "accept_all") == 0 ) { | |||
| 1004 | result->type = PHP_VAL_INT; | |||
| 1005 | result->int_val = obj->nFileAllTimeAccepts; | |||
| 1006 | } else if ( strcmp(prop_name, "prio") == 0 ) { | |||
| 1007 | result->type = PHP_VAL_INT; | |||
| 1008 | result->int_val = obj->nFilePriority; | |||
| 1009 | } else if ( strcmp(prop_name, "prio_auto") == 0 ) { | |||
| 1010 | result->type = PHP_VAL_BOOL; | |||
| 1011 | result->int_val = obj->bFileAutoPriority; | |||
| 1012 | } else { | |||
| 1013 | php_report_error(PHP_ERROR, "'SharedFile' property [%s] is unknown", prop_name); | |||
| 1014 | } | |||
| 1015 | } | |||
| 1016 | ||||
| 1017 | void amule_search_file_prop_get(void *ptr, char *prop_name, PHP_VALUE_NODE *result) | |||
| 1018 | { | |||
| 1019 | if ( !ptr ) { | |||
| 1020 | value_value_free(result); | |||
| 1021 | return; | |||
| 1022 | } | |||
| 1023 | SearchFile *obj = static_cast<SearchFile *>(ptr); | |||
| 1024 | if ( strcmp(prop_name, "name") == 0 ) { | |||
| 1025 | result->type = PHP_VAL_STRING; | |||
| 1026 | result->str_val = strdup((const char *)unicode2UTF8(obj->sFileName)); | |||
| 1027 | } else if ( strcmp(prop_name, "short_name") == 0 ) { | |||
| 1028 | result->type = PHP_VAL_STRING; | |||
| 1029 | wxString short_name(obj->sFileName.Length() > 60 ? (obj->sFileName.Left(60) + (wxT(" ...")L" ...")) : obj->sFileName); | |||
| 1030 | result->str_val = strdup((const char *)unicode2UTF8(short_name)); | |||
| 1031 | } else if ( strcmp(prop_name, "hash") == 0 ) { | |||
| 1032 | result->type = PHP_VAL_STRING; | |||
| 1033 | result->str_val = strdup((const char *)unicode2UTF8(obj->sHash)); | |||
| 1034 | } else if ( strcmp(prop_name, "size") == 0 ) { | |||
| 1035 | result->type = PHP_VAL_INT; | |||
| 1036 | result->int_val = obj->lFileSize; | |||
| 1037 | } else if ( strcmp(prop_name, "sources") == 0 ) { | |||
| 1038 | result->type = PHP_VAL_INT; | |||
| 1039 | result->int_val = obj->lSourceCount; | |||
| 1040 | } else if ( strcmp(prop_name, "present") == 0 ) { | |||
| 1041 | result->type = PHP_VAL_BOOL; | |||
| 1042 | result->int_val = obj->bPresent; | |||
| 1043 | } else { | |||
| 1044 | php_report_error(PHP_ERROR, "'SearchFile' property [%s] is unknown", prop_name); | |||
| 1045 | } | |||
| 1046 | } | |||
| 1047 | ||||
| 1048 | #ifndef PACKAGE_VERSION"SVN" | |||
| 1049 | #include <common/ClientVersion.h> | |||
| 1050 | #define PACKAGE_VERSION"SVN" (PACKAGE"amule" " " VERSION"SVN") | |||
| 1051 | #endif | |||
| 1052 | ||||
| 1053 | void amule_version(PHP_VALUE_NODE *val) | |||
| 1054 | { | |||
| 1055 | if ( !val ) { | |||
| 1056 | return; | |||
| 1057 | } | |||
| 1058 | value_value_free(val); | |||
| 1059 | ||||
| 1060 | val->type = PHP_VAL_STRING; | |||
| 1061 | val->str_val = strdup(PACKAGE_VERSION"SVN"); | |||
| 1062 | } | |||
| 1063 | ||||
| 1064 | ||||
| 1065 | PHP_BLTIN_FUNC_DEF amule_lib_funcs[] = { | |||
| 1066 | { | |||
| 1067 | "amule_load_vars", | |||
| 1068 | 1, php_native_load_amule_vars, | |||
| 1069 | }, | |||
| 1070 | { | |||
| 1071 | "amule_get_stats", | |||
| 1072 | 0, php_get_amule_stats, | |||
| 1073 | }, | |||
| 1074 | { | |||
| 1075 | "amule_get_categories", | |||
| 1076 | 0, php_get_amule_categories, | |||
| 1077 | }, | |||
| 1078 | { | |||
| 1079 | "amule_get_options", | |||
| 1080 | 0, php_get_amule_options, | |||
| 1081 | }, | |||
| 1082 | { | |||
| 1083 | "amule_set_options", | |||
| 1084 | 1, php_set_amule_options, | |||
| 1085 | }, | |||
| 1086 | { | |||
| 1087 | "amule_do_server_cmd", | |||
| 1088 | 3, | |||
| 1089 | php_native_server_cmd, | |||
| 1090 | }, | |||
| 1091 | { | |||
| 1092 | "amule_do_add_server_cmd", | |||
| 1093 | 3, | |||
| 1094 | php_native_add_server_cmd, | |||
| 1095 | }, | |||
| 1096 | { | |||
| 1097 | "amule_do_download_cmd", | |||
| 1098 | 3, | |||
| 1099 | php_native_download_file_cmd, | |||
| 1100 | }, | |||
| 1101 | { | |||
| 1102 | "amule_do_shared_cmd", | |||
| 1103 | 3, | |||
| 1104 | php_native_shared_file_cmd, | |||
| 1105 | }, | |||
| 1106 | { | |||
| 1107 | "amule_do_reload_shared_cmd", | |||
| 1108 | 0, php_native_reload_shared_file_cmd, | |||
| 1109 | }, | |||
| 1110 | { | |||
| 1111 | "amule_do_search_download_cmd", | |||
| 1112 | 2, | |||
| 1113 | php_native_search_download_cmd, | |||
| 1114 | }, | |||
| 1115 | { | |||
| 1116 | "amule_do_search_start_cmd", | |||
| 1117 | 7, | |||
| 1118 | php_native_search_start_cmd, | |||
| 1119 | }, | |||
| 1120 | { | |||
| 1121 | "amule_do_ed2k_download_cmd", | |||
| 1122 | 2, | |||
| 1123 | php_native_ed2k_download_cmd, | |||
| 1124 | }, | |||
| 1125 | { | |||
| 1126 | "amule_get_log", | |||
| 1127 | 1, php_get_log, | |||
| 1128 | }, | |||
| 1129 | { | |||
| 1130 | "amule_get_serverinfo", | |||
| 1131 | 1, php_get_serverinfo, | |||
| 1132 | }, | |||
| 1133 | { | |||
| 1134 | "amule_get_version", | |||
| 1135 | 0, amule_version, | |||
| 1136 | }, | |||
| 1137 | { 0, 0, 0, }, | |||
| 1138 | }; | |||
| 1139 | ||||
| 1140 | void php_init_amule_lib() | |||
| 1141 | { | |||
| 1142 | // load function definitions | |||
| 1143 | PHP_BLTIN_FUNC_DEF *curr_def = amule_lib_funcs; | |||
| 1144 | while ( curr_def->name ) { | |||
| 1145 | php_add_native_func(curr_def); | |||
| 1146 | curr_def++; | |||
| 1147 | } | |||
| 1148 | // load object definitions | |||
| 1149 | php_add_native_class("AmuleDownloadFile", amule_download_file_prop_get); | |||
| 1150 | php_add_native_class("AmuleUploadFile", amule_upload_file_prop_get); | |||
| 1151 | php_add_native_class("AmuleServer", amule_server_prop_get); | |||
| 1152 | php_add_native_class("AmuleSharedFile", amule_shared_file_prop_get); | |||
| 1153 | php_add_native_class("AmuleSearchFile", amule_search_file_prop_get); | |||
| 1154 | } | |||
| 1155 | ||||
| 1156 | // File_checked_for_headers |