public function RCall($values = null, $code = null, $resume_from_last_template = false) { if (Ini::$log_server_events) { TestServer::log_debug("TestSession->RCall --- R call initiated #" . session_id()); } //resume from last template if ($resume_from_last_template) { $response = array("data" => array("HEAD" => $this->head, "HASH" => $this->hash, "TIME_LIMIT" => $this->time_limit, "HTML" => $this->HTML, "TEST_ID" => $this->Test_id, "TEST_SESSION_ID" => $this->id, "STATUS" => TestSession::TEST_SESSION_STATUS_TEMPLATE, "TEMPLATE_ID" => $this->Template_id, "LOADER_TEMPLATE_ID" => $this->loader_Template_id, "FINISHED" => 0, "EFFECT_SHOW" => $this->effect_show, "EFFECT_HIDE" => $this->effect_hide, "EFFECT_SHOW_OPTIONS" => $this->effect_show_options, "EFFECT_HIDE_OPTIONS" => $this->effect_hide_options, "LOADER_HTML" => $this->loader_HTML, "LOADER_HEAD" => $this->loader_head, "LOADER_EFFECT_SHOW" => $this->loader_effect_show, "LOADER_EFFECT_SHOW_OPTIONS" => $this->loader_effect_show_options, "LOADER_EFFECT_HIDE" => $this->loader_effect_hide, "LOADER_EFFECT_HIDE_OPTIONS" => $this->loader_effect_hide_options, "LOADER_HTML" => $this->loader_HTML, "LOADER_HEAD" => $this->loader_head, "LOADER_EFFECT_SHOW" => $this->loader_effect_show, "LOADER_EFFECT_SHOW_OPTIONS" => $this->loader_effect_show_options, "LOADER_EFFECT_HIDE" => $this->loader_effect_hide, "LOADER_EFFECT_HIDE_OPTIONS" => $this->loader_effect_hide_options)); return $response; } //R server connection $command_obj = json_encode(array("workspace_id" => $this->UserWorkspace_id, "session_id" => $this->id, "hash" => $this->hash, "values" => $values, "code" => $code, "type" => 0, "IP" => $_SERVER["REMOTE_ADDR"])); if (Ini::$log_server_events) { TestServer::log_debug("TestSession->RCall --- checking for server"); } if (TestServer::get_server_status() == TestServer::SERVER_STATUS_STOPPED) { TestServer::start_process(); TestServer::wait_until_started(); } else { if (TestServer::get_server_status() == TestServer::SERVER_STATUS_STARTING) { TestServer::wait_until_started(); } } if (Ini::$log_server_events) { TestServer::log_debug("TestSession->RCall --- server found, trying to send"); } $response = TestServer::send($command_obj); $result = json_decode(trim($response)); if (Ini::$log_server_events) { TestServer::log_debug("TestSession->RCall --- sent and recieved response"); } $status = TestSession::TEST_SESSION_STATUS_ERROR; $removed = false; $release = 0; $html = ""; $head = ""; $Template_id = 0; $debug = 0; $hash = ""; $time_limit = 0; $Test_id = 0; $finished = 0; $loader_Template_id = 0; $loader_HTML = ""; $loader_head = ""; $loader_effect_show = "none"; $loader_effect_hide = "none"; $loader_effect_show_options = ""; $loader_effect_hide_options = ""; $effect_show = "none"; $effect_hide = "none"; $effect_show_options = ""; $effect_hide_options = ""; $state = "[]"; $output = ""; $thisSession = TestSession::from_mysql_id($this->id); $return = $result->return; if ($thisSession != null) { $output = $thisSession->output; $error_output = $thisSession->error_output; $state = $thisSession->state; $status = $thisSession->status; $release = $thisSession->release; $html = $thisSession->HTML; $head = $thisSession->head; $Template_id = $thisSession->Template_id; $debug = $thisSession->debug; $hash = $thisSession->hash; $time_limit = $thisSession->time_limit; $Test_id = $thisSession->Test_id; $loader_Template_id = $thisSession->loader_Template_id; $loader_HTML = $thisSession->loader_HTML; $loader_head = $thisSession->loader_head; $loader_effect_hide = $thisSession->loader_effect_hide; $loader_effect_hide_options = $thisSession->loader_effect_hide_options; $loader_effect_show = $thisSession->loader_effect_show; $loader_effect_show_options = $thisSession->loader_effect_show_options; $effect_hide = $thisSession->effect_hide; $effect_hide_options = $thisSession->effect_hide_options; $effect_show = $thisSession->effect_show; $effect_show_options = $thisSession->effect_show_options; if ($return != 0) { $status = TestSession::TEST_SESSION_STATUS_ERROR; } if ($status == TestSession::TEST_SESSION_STATUS_WORKING && $release == 1) { $status = TestSession::TEST_SESSION_STATUS_COMPLETED; } $thisSession->status = $status; $thisSession->mysql_save(); switch ($status) { case TestSession::TEST_SESSION_STATUS_COMPLETED: if ($debug) { TestSession::unregister($thisSession->UserWorkspace_id . "-" . $thisSession->id, $thisSession->UserWorkspace_id); $removed = true; } else { $thisSession->close(); } break; case TestSession::TEST_SESSION_STATUS_ERROR: if ($debug) { TestSession::unregister($thisSession->UserWorkspace_id . "-" . $thisSession->id, $thisSession->UserWorkspace_id); $removed = true; } else { $thisSession->close(); if (Ini::$log_r_errors) { $thisSession->log_error(nl2br(htmlspecialchars($error_output, ENT_QUOTES))); } } break; case TestSession::TEST_SESSION_STATUS_TAMPERED: if ($debug) { TestSession::unregister($thisSession->UserWorkspace_id . "-" . $thisSession->id, $thisSession->UserWorkspace_id); $removed = true; } else { $thisSession->close(); } break; case TestSession::TEST_SESSION_STATUS_TEMPLATE: if ($release) { if ($debug) { TestSession::unregister($thisSession->UserWorkspace_id . "-" . $thisSession->id, $thisSession->UserWorkspace_id); $removed = true; } else { $thisSession->close(); } } break; } } else { $removed = true; } $debug_data = false; $logged_user = User::get_logged_user(); if ($logged_user != null) { $debug_data = true; } if ($release == 1 || $status == TestSession::TEST_SESSION_STATUS_COMPLETED || $status == TestSession::TEST_SESSION_STATUS_ERROR || $status == TestSession::TEST_SESSION_STATUS_TAMPERED) { $finished = 1; } $response = array("data" => array("HEAD" => $head, "HASH" => $hash, "TIME_LIMIT" => $time_limit, "HTML" => $html, "TEST_ID" => $Test_id, "TEST_SESSION_ID" => $this->id, "STATUS" => $status, "TEMPLATE_ID" => $Template_id, "FINISHED" => $finished, "LOADER_TEMPLATE_ID" => $loader_Template_id, "LOADER_HTML" => $loader_HTML, "LOADER_HEAD" => $loader_head, "LOADER_EFFECT_SHOW" => $loader_effect_show, "LOADER_EFFECT_SHOW_OPTIONS" => $loader_effect_show_options, "LOADER_EFFECT_HIDE" => $loader_effect_hide, "LOADER_EFFECT_HIDE_OPTIONS" => $loader_effect_hide_options, "EFFECT_SHOW" => $effect_show, "EFFECT_HIDE" => $effect_hide, "EFFECT_SHOW_OPTIONS" => $effect_show_options, "EFFECT_HIDE_OPTIONS" => $effect_hide_options)); if ($debug_data) { if (!is_array($response)) { $response = array(); } if ($output != null) { if (strpos(trim($output), ">") !== 0 && strpos(trim($output), "[") !== 0) { $output = "> " . trim($output); } } if ($debug) { $state = json_decode($state, true); if ($state != null) { foreach ($state as $k => $v) { $state[$k] = htmlspecialchars($v, ENT_QUOTES); } $state = json_encode($state); } else { $state = "[]"; } $response["debug"] = array("return" => $return, "output" => nl2br(htmlspecialchars($output, ENT_QUOTES)), "error_output" => nl2br(htmlspecialchars($error_output, ENT_QUOTES)), "state" => nl2br($state)); } } if (Ini::$timer_tamper_prevention && !$removed) { $sql = sprintf("UPDATE `%s` SET `time_tamper_prevention`=%d WHERE `id`=%d", TestSession::get_mysql_table(), time(), $this->id); mysql_query($sql); } return $response; }