--- /dev/null
+<?php
+/*
+ * sac-a-push - Obj/transports.phh
+ *
+ * Copyright (C) 2012 Matteo Nastasi
+ * mailto: nastasi@alternativeoutput.it
+ * matteo.nastasi@milug.org
+ * web: http://www.alternativeoutput.it
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABLILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details. You should have received a
+ * copy of the GNU General Public License along with this program; if
+ * not, write to the Free Software Foundation, Inc, 59 Temple Place -
+ * Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+class Transport_template {
+
+ function Transport_template() {
+ }
+
+ function init($enc, &$header_out, $init_string, $base, $step)
+ {
+ }
+
+ static function fini($init_string, $blockerr)
+ {
+ }
+
+ function chunk($step, $cont)
+ {
+ }
+}
+
+class Transport_xhr {
+
+ function Transport_xhr() {
+ }
+
+ function init($enc, &$header_out, $init_string, $base, $step)
+ {
+ }
+
+ static function fini($init_string, $blockerr)
+ {
+ }
+
+ function chunk($step, $cont)
+ {
+ }
+}
+
+class Transport_iframe {
+
+ function Transport_iframe() {
+ }
+
+ function init($enc, &$header_out, $init_string, $base, $step)
+ {
+ $ret = "";
+
+ if ($enc != 'plain')
+ $header_out['Content-Encoding'] = $enc;
+ $header_out['Cache-Control'] = 'no-cache, must-revalidate'; // HTTP/1.1
+ $header_out['Expires'] = 'Mon, 26 Jul 1997 05:00:00 GMT'; // Date in the past
+ $header_out['Content-type'] = 'text/html; charset="utf-8"';
+
+ $ret .= sprintf("<html>
+<head>
+<script type=\"text/javascript\" src=\"%scommons.js\"></script>
+<script type=\"text/javascript\" src=\"%sxynt-streaming-ifra.js\"></script>
+<script type=\"text/javascript\">
+var xynt_streaming = \"ready\";", $base, $base);
+ if ($step > 0)
+ $ret .= sprintf("last_clean = %d;\n", ($step-1));
+ $ret .= sprintf("
+window.onload = function () { if (xynt_streaming != \"ready\") { xynt_streaming.reload(); } };
+</script>
+</head>
+<body>");
+ $ret .= sprintf("<!-- \n%s -->\n", $init_string);
+
+ return ($ret);
+ }
+
+ static function fini($init_string, $blockerr)
+ {
+ $ret = "";
+ $ret .= sprintf("<html>
+<head>
+<script type=\"text/javascript\" src=\"%scommons.js\"></script>
+<script type=\"text/javascript\" src=\"%sxynt-streaming-ifra.js\"></script>
+<script type=\"text/javascript\">
+var xynt_streaming = \"ready\";", self::base_get(), self::base_get());
+ $ret .= sprintf("
+window.onload = function () { if (xynt_streaming != \"ready\") { xynt_streaming.reload(); } };
+</script>
+</head>
+<body>");
+ $ret .= sprintf("<!-- \n%s -->\n", $init_string);
+ $ret .= sprintf("<script id='hs%d' type='text/javascript'><!--
+push(\"%s\");
+// -->
+</script>", 0, escpush($blockerr) );
+ return ($ret);
+ }
+
+ function chunk($step, $cont)
+ {
+ if ($cont == NULL) {
+ return sprintf("<script id='hs%d' type='text/javascript'><!--
+push(null);\n// -->\n</script>", $step);
+ }
+ else {
+ return sprintf("<script id='hs%d' type='text/javascript'><!--
+push(\"%s\");\n// -->\n</script>", $step, escpush($cont) );
+ }
+ }
+}
+?>
\ No newline at end of file
* Suite 330, Boston, MA 02111-1307, USA.
*/
+require_once("${G_base}Obj/transports.phh");
+
+
// User flags
define('USER_FLAG_AUTH', 0x02);
var $rd_kalive; // if no message are sent after RD_KEEPALIVE_TOUT secs we send a keepalive from server
var $rd_cache; // place where store failed fwrite data
var $rd_zls; // zlibstream object handle if compressed stream, else FALSE
+ var $rd_transp; // class that define stream encapsulation type (iframe, xhr, ...)
var $comm; // commands array
// var $asta_card; //
$thiz->rd_kalive = -1;
$thiz->rd_cache = "";
$thiz->rd_zls = FALSE;
+ $thiz->rd_transp = NULL;
$thiz->asta_card = -2;
$thiz->asta_pnt = -1;
$this->rd_scristp = 0;
$this->rd_kalive = $curtime + RD_KEEPALIVE_TOUT;
$this->rd_zls = ZLibStream::create($enc);
+ $this->rd_transp = new Transport_iframe();
}
function rd_socket_get() {
public static function stream_fini($init_string, $is_unrecoverable)
{
- $cla = get_called_class();
printf("xXx user::stream_fini\n");
- // IF IFRAME THEN:
- $body = "";
- $body .= sprintf("<html>
-<head>
-<script type=\"text/javascript\" src=\"%scommons.js\"></script>
-<script type=\"text/javascript\" src=\"%sxynt-streaming-ifra.js\"></script>
-<script type=\"text/javascript\">
-var xynt_streaming = \"ready\";", self::base_get(), self::base_get());
- $body .= sprintf("
-window.onload = function () { if (xynt_streaming != \"ready\") { xynt_streaming.reload(); } };
-</script>
-</head>
-<body>");
- $body .= sprintf("<!-- \n%s -->\n", $init_string);
- $body .= sprintf("<script id='hs%d' type='text/javascript'><!--
-push(\"%s\");
-// -->
-</script>", 0, escpush(static::blocking_error($is_unrecoverable)) );
+ // FIXME: dynamic "Transport_" type
+ $tans_class = "Transport_iframe";
+ $body = $tansclass::fini($init_string, static::blocking_error($is_unrecoverable));
+
// ELSE IF XHR THEN:
// return (static::blocking_error($is_unrecoverable));
return ($body);
// (webservers_exceeded() || stristr($HTTP_USER_AGENT, "Mozilla/5.0 (Windows NT 6.1; rv:5.0)") || stristr($HTTP_USER_AGENT, "MSIE") || stristr($HTTP_USER_AGENT, "CHROME") ? TRUE : FALSE);
- if ($enc != 'plain')
- $header_out['Content-Encoding'] = $enc;
- $header_out['Cache-Control'] = 'no-cache, must-revalidate'; // HTTP/1.1
- $header_out['Expires'] = 'Mon, 26 Jul 1997 05:00:00 GMT'; // Date in the past
- $header_out['Content-type'] = 'text/html; charset="utf-8"';
-
log_load("index_rd_ifra_init.php");
if (($from = gpcs_var('from', $get, $post, $cookie)) === FALSE)
unset($step);
$this->rd_data_set($curtime, $enc, $stat, $subst, $step, $from);
- $cc = get_called_class();
-
- $body .= sprintf("<html>
-<head>
-<script type=\"text/javascript\" src=\"%scommons.js\"></script>
-<script type=\"text/javascript\" src=\"%sxynt-streaming-ifra.js\"></script>
-<script type=\"text/javascript\">
-var xynt_streaming = \"ready\";", self::base_get(), self::base_get());
- if ($this->rd_scristp > 0)
- $body .= sprintf("last_clean = %d;\n", ($this->rd_scristp-1));
- $body .= sprintf("
-window.onload = function () { if (xynt_streaming != \"ready\") { xynt_streaming.reload(); } };
-</script>
-</head>
-<body>");
- $body .= sprintf("<!-- \n%s -->\n", $init_string);
+ $body .= $this->rd_transp->init($enc, &$header_out, $init_string, self::base_get(), $this->rd_scristp);
+
return TRUE;
}
$old_step = $this->rd_step;
printf("xXx PRE : rd_step %d\n", $this->rd_step);
if (($ret = $this->maincheck($old_stat, $old_subst, $old_step, $this->rd_stat, $this->rd_subst, $this->rd_step, $splashdate, $table_idx, $table_token)) != FALSE) {
- $body .= sprintf("<script id='hs%d' type='text/javascript'><!--
-push(\"%s\");
-// -->
-</script>", $this->rd_scristp++, escpush($ret) );
-
+ $body .= $this->rd_transp->chunk( $this->rd_scristp++, $ret);
log_rd2(0, 'index_rd.php: after mop_flush (begin: '.sprintf("%f", $pre_main).')');
}
printf("xXx POST: rd_step %d\n", $this->rd_step);
function stream_keepalive($with_ping)
{
- $ret = (sprintf("<script id='hs%d' type='text/javascript'><!--
-push(%s);
-// -->
-</script>", $this->rd_scristp++, ($with_ping ? "\"act_ping();\"" : "null")));
-
- return ($ret);
+ return ($this->rd_transp->chunk( $this->rd_scristp++, ($with_ping ? "act_ping();" : NULL)));
}
static function base_get()
window.onbeforeunload = null;
window.onunload = null;
// nonunload = true;
- act_logout();
+ act_logout(0);
};
--- /dev/null
+<?php
+
+function mop_flush()
+{
+ for ($i = 0; $i < ob_get_level(); $i++)
+ ob_end_flush();
+ ob_implicit_flush(1);
+ flush();
+}
+
+$escpush_from = array("\\", "\"");
+$escpush_to = array("\\\\", "\\\"");
+function escpush($s)
+{
+ GLOBAL $escpush_from, $escpush_to;
+
+ return str_replace($escpush_from, $escpush_to, $s);
+}
+
+if ($isstream == "true") {
+
+ require_once("Obj/transports.phh");
+
+
+ // TODO: what stream ?
+ // iframe, htmlfile, xhr
+
+ $transp = new Transport_iframe();
+
+ $header_out = array();
+
+ $init_string = "";
+ for ($i = 0 ; $i < 4096 ; $i++) {
+ if (($i % 128) == 0)
+ $init_string .= "\n";
+ else
+ $init_string .= chr(mt_rand(65, 90));
+ }
+
+ $body = $transp->init("plain", $header_out, $init_string, "", "0");
+
+ foreach ($header_out as $key => $value) {
+ header(sprintf("%s: %s", $key, $value));
+ }
+ print($body);
+ mop_flush();
+
+ for ($i = 1 ; $i < 20 ; $i++) {
+ $chunk = $transp->chunk($i, sprintf("\$('container').innerHTML = '%d';", $i));
+ print($chunk);
+ mop_flush();
+
+ // exit(123);
+ sleep(1);
+ }
+ exit;
+}
+?>
+<html>
+<head>
+<title>XYNT TEST01</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<script type="text/javascript" src="xynt-streaming.js"></script>
+<script type="text/javascript" src="commons.js"></script>
+
+<!-- <script type="text/javascript" src="myconsole.js"></script> -->
+<!--
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript" src="ticker.js"></script>
+<script type="text/javascript" src="heartbit.js"></script>
+<script type="text/javascript" src="room.js"></script>
+<script type="text/javascript" src="preload_img.js"></script>
+<script type="text/javascript" src="AC_OETags.js"></script>
+<script type="text/javascript" src="probrowser.js"></script>
+-->
+<SCRIPT type="text/javascript"><!--
+ var sess = "for_test";
+ var stat = "";
+ var subst = "";
+ var gst = new globst();
+ window.onload = function() {
+ xstm = new xynt_streaming(window, "iframe", null /* console */, gst, 'xynt_test01_php', 'sess', sess, null, 'xynt_test01.php?isstream=true', function(com){eval(com);});
+ /* xstm.hbit_set(heartbit); */
+ xstm.start();
+ }
+ //-->
+</SCRIPT>
+</head>
+<!-- if myconsole <body onunload="deconsole();"> -->
+<body>
+<div id="container">
+BEGIN
+</div>
+</body>
+</html>