public function RCall($code, $include_ini_code = false, $close = false, $debug_syntax = false)
 {
     $command = "";
     if (!$debug_syntax) {
         if ($include_ini_code) {
             $command = $this->get_ini_RCode();
         } else {
             $command .= $this->get_next_ini_RCode();
         }
     }
     $command .= $code;
     if (!$debug_syntax) {
         $command .= $this->get_post_RCode();
     }
     $output = array();
     $return = -999;
     $command_obj = json_encode(array("session_id" => $this->id, "code" => $command, "close" => 0));
     if (TestServer::$debug) {
         TestServer::log_debug("TestSession->RCall --- checking for server");
     }
     if (!TestServer::is_running()) {
         TestServer::start_process();
     }
     if (TestServer::$debug) {
         TestServer::log_debug("TestSession->RCall --- server found, trying to send");
     }
     $response = TestServer::send($command_obj);
     $result = json_decode(trim($response));
     if (TestServer::$debug) {
         TestServer::log_debug("TestSession->RCall --- sent and recieved response");
     }
     $output = explode("\n", $result->output);
     $return = $result->return;
     $thisSession = null;
     $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_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 = "";
     if (!$debug_syntax) {
         $thisSession = TestSession::from_mysql_id($this->id);
         if ($thisSession != null) {
             $status = $thisSession->status;
             $release = $thisSession->release;
             $html = $thisSession->HTML;
             $Template_id = $thisSession->Template_id;
             $debug = $thisSession->debug;
             $hash = $thisSession->hash;
             $time_limit = $thisSession->time_limit;
             $Test_id = $thisSession->Test_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 || $close) {
                 $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->id);
                         $removed = true;
                     } else {
                         $thisSession->serialize();
                     }
                     break;
                 case TestSession::TEST_SESSION_STATUS_ERROR:
                 case TestSession::TEST_SESSION_STATUS_TAMPERED:
                     if ($debug) {
                         TestSession::unregister($thisSession->id);
                         $removed = true;
                     } else {
                         $thisSession->close();
                     }
                     break;
                 case TestSession::TEST_SESSION_STATUS_TEMPLATE:
                     if ($debug) {
                         $html = Template::strip_html($html);
                         if ($release) {
                             TestSession::unregister($thisSession->id);
                         }
                     } else {
                         $head = Template::from_mysql_id($Template_id)->head;
                         if ($release) {
                             $thisSession->serialize();
                         }
                     }
                     break;
             }
         } else {
             $removed = true;
         }
     }
     $test = Test::from_mysql_id($this->Test_id);
     $debug_data = false;
     $logged_user = User::get_logged_user();
     if ($logged_user != null) {
         $debug_data = $logged_user->is_object_readable($test);
     }
     if ($release == 1 || $status == TestSession::TEST_SESSION_STATUS_COMPLETED || $status == TestSession::TEST_SESSION_STATUS_ERROR || $status == TestSession::TEST_SESSION_STATUS_TAMPERED) {
         $finished = 1;
     }
     if (!$debug_syntax) {
         $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_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) {
         for ($i = 0; $i < count($output); $i++) {
             if (strpos($output[$i], "CONCERTO_DB_PASSWORD <-") !== false) {
                 $output[$i] = "[hidden]";
             }
             $output[$i] = htmlspecialchars($output[$i], ENT_QUOTES);
         }
         $command_lines = explode("\n", $command);
         for ($i = 0; $i < count($command_lines); $i++) {
             if (strpos($command_lines[$i], "CONCERTO_DB_PASSWORD <-") !== false) {
                 $command_lines[$i] = "[hidden]";
             }
         }
         $command = implode("\n", $command_lines);
         $command = htmlspecialchars($command, ENT_QUOTES);
         if (!is_array($response)) {
             $response = array();
         }
         $response["debug"] = array("code" => $command, "return" => $return, "output" => $output);
     }
     if (Ini::$timer_tamper_prevention && !$debug_syntax && !$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;
 }