diff --git a/livesupport/modules/htmlUI/var/templates/masterpanel.tpl b/livesupport/modules/htmlUI/var/templates/masterpanel.tpl
index 68ce2c877..a71204f6f 100755
--- a/livesupport/modules/htmlUI/var/templates/masterpanel.tpl
+++ b/livesupport/modules/htmlUI/var/templates/masterpanel.tpl
@@ -48,6 +48,9 @@
{include file="playlist/simpleManagement.tpl"}
{/if}
+{if $showScheduler}
+ {include file="scheduler/main.tpl"}
+{/if}
diff --git a/livesupport/modules/htmlUI/var/templates/menu_top.tpl b/livesupport/modules/htmlUI/var/templates/menu_top.tpl
index f60aa174d..43045e1db 100755
--- a/livesupport/modules/htmlUI/var/templates/menu_top.tpl
+++ b/livesupport/modules/htmlUI/var/templates/menu_top.tpl
@@ -6,6 +6,7 @@
[PL Editor]
[Search]
[Browse]
+ [Scheduler]
{tra 0='[User/Groups]'}
[StationPrefs]
diff --git a/livesupport/modules/htmlUI/var/templates/scheduler/calendar.tpl b/livesupport/modules/htmlUI/var/templates/scheduler/calendar.tpl
new file mode 100755
index 000000000..b7c378809
--- /dev/null
+++ b/livesupport/modules/htmlUI/var/templates/scheduler/calendar.tpl
@@ -0,0 +1,31 @@
+{$SCHEDULER->buildMonth()}
+{$SCHEDULER->buildWeek()}
+
+
+{$SCHEDULER->curr.year}-{$SCHEDULER->curr.month}-{$SCHEDULER->curr.day} |
+ |
+ {foreach from=$SCHEDULER->Week item="_Weekday"}
+ {$_Weekday.label.short} |
+ {/foreach}
+
+{foreach from=$SCHEDULER->Month item="_Day"}
+ {if $_Day.isFirst}
+
+ {$_Day.week} |
+ {/if}
+
+ {if $_Day.isEmpty}
+
+ {elseif $_Day.isSelected}
+ {$_Day.day}
+ {else}
+ {$_Day.day}
+ {/if}
+
+ |
+ {if $_Day.isLast}
+
+ {/if}
+{/foreach}
+
+
diff --git a/livesupport/modules/htmlUI/var/templates/scheduler/day.tpl b/livesupport/modules/htmlUI/var/templates/scheduler/day.tpl
new file mode 100755
index 000000000..e69de29bb
diff --git a/livesupport/modules/htmlUI/var/templates/scheduler/input.tpl b/livesupport/modules/htmlUI/var/templates/scheduler/input.tpl
new file mode 100755
index 000000000..34749d2e7
--- /dev/null
+++ b/livesupport/modules/htmlUI/var/templates/scheduler/input.tpl
@@ -0,0 +1,21 @@
+{SEARCH->getResult assign=_results}
+
+{if $_results.cnt > 0}
+
+ {foreach from=$_results.items item=i}
+
+
+ {if $PLAYLIST.id == $i.id}
+ {$i.title|truncate:30}
+ {else}
+ {$i.title|truncate:30}
+ {/if}
+ |
+ {$i.type} |
+ {$i.gunid} |
+
+ {/foreach}
+
+{else}
+ No match found.
+{/if}
diff --git a/livesupport/modules/htmlUI/var/templates/scheduler/main.tpl b/livesupport/modules/htmlUI/var/templates/scheduler/main.tpl
new file mode 100755
index 000000000..156c78c9a
--- /dev/null
+++ b/livesupport/modules/htmlUI/var/templates/scheduler/main.tpl
@@ -0,0 +1,14 @@
+
+{include file="sub/x.tpl"}
+
+
+
+
+
+
+{include file="scheduler/calendar.tpl"}
+
+{assign var="view" value=$SCHEDULER->curr.view}
+{include file="scheduler/$view.tpl"}
+
+
diff --git a/livesupport/modules/htmlUI/var/templates/scheduler/month.tpl b/livesupport/modules/htmlUI/var/templates/scheduler/month.tpl
new file mode 100755
index 000000000..6aea23fdd
--- /dev/null
+++ b/livesupport/modules/htmlUI/var/templates/scheduler/month.tpl
@@ -0,0 +1,30 @@
+{$SCHEDULER->buildMonth()}
+{$SCHEDULER->buildWeek()}
+
+Month View
+
+
+
+
+ {foreach from=$SCHEDULER->Week item="_Weekday"}
+ {$_Weekday.label.full} |
+ {/foreach}
+
+
+{foreach from=$SCHEDULER->Month item="_Day"}
+ {if $_Day.isFirst}
+
+ {/if}
+
+ {if $_Day.isEmpty}
+ |
+ {else}
+ {$_Day.day} |
+ {/if}
+
+ {if $_Day.isLast}
+
+ {/if}
+{/foreach}
+
+
diff --git a/livesupport/modules/htmlUI/var/templates/scheduler/week.tpl b/livesupport/modules/htmlUI/var/templates/scheduler/week.tpl
new file mode 100755
index 000000000..e69de29bb
diff --git a/livesupport/modules/htmlUI/var/templates/script/basics.js.tpl b/livesupport/modules/htmlUI/var/templates/script/basics.js.tpl
index 6b0322eb1..7f3f7ef00 100755
--- a/livesupport/modules/htmlUI/var/templates/script/basics.js.tpl
+++ b/livesupport/modules/htmlUI/var/templates/script/basics.js.tpl
@@ -42,10 +42,10 @@
window.popupwin.focus();
}
- function hpopup(url, name) //hidden popup!
+ function hpopup(url, name) //hidden popup! 'width=1, height=1'
{
- popupwin = window.open(url, name, 'width=1, height=1');
- window.parent.focus();
+ popupwin = window.open(url, name);
+ //window.parent.focus();
}
{/literal}
diff --git a/livesupport/modules/htmlUI/var/ui_base.inc.php b/livesupport/modules/htmlUI/var/ui_base.inc.php
index 018f377b0..74fc4523b 100644
--- a/livesupport/modules/htmlUI/var/ui_base.inc.php
+++ b/livesupport/modules/htmlUI/var/ui_base.inc.php
@@ -107,6 +107,7 @@ class uiBase
$this->SEARCH =& new uiSearch($this);
$this->BROWSE =& new uiBrowse($this);
$this->PLAYLIST =& new uiPlaylist($this);
+ $this->SCHEDULER =& new uiScheduler($this);
}
diff --git a/livesupport/modules/htmlUI/var/ui_browse.class.php b/livesupport/modules/htmlUI/var/ui_browse.class.php
index 0e15e9c94..e6997e0f3 100755
--- a/livesupport/modules/htmlUI/var/ui_browse.class.php
+++ b/livesupport/modules/htmlUI/var/ui_browse.class.php
@@ -6,6 +6,7 @@ class uiBrowse
$this->Base =& $uiBase;
$this->col =& $_SESSION[UI_BROWSE_SESSNAME]['col'];
$this->criteria =& $_SESSION[UI_BROWSE_SESSNAME]['criteria'];
+ $this->results =& $_SESSION[UI_BROWSE_SESSNAME]['results'];
$this->reloadUrl = UI_BROWSER.'?popup[]=_reload_parent&popup[]=_close';
$this->criteria['limit'] ? NULL : $this->criteria['limit'] = 5;
@@ -27,6 +28,17 @@ class uiBrowse
}
+ function getCriteria()
+ {
+ return $this->criteria;
+ }
+
+
+ function getResult()
+ {
+ return $this->results;
+ }
+
function browseForm($id, $mask2)
{
@@ -79,11 +91,12 @@ class uiBrowse
function setValue($formdata)
{
+ $this->criteria['offset'] = 0;
$which = $formdata['col'];
$next = $which + 1;
$this->col[$which]['form_value'] = $formdata['value'][0];
if ($formdata['value'][0] == '%%all%%') {
- $this->col[$next]['criteria'] = NULL;
+ $this->col[$next]['criteria'] = array('operator' => 'and');
} else {
$this->col[$next]['criteria'] = array(
'operator' => 'and',
@@ -105,6 +118,7 @@ class uiBrowse
#echo "\nvalues: "; print_r($this->col[$next]['values']);
$this->clearHierarchy($next);
+ $this->searchDB();
$this->Base->redirUrl = UI_BROWSER.'?act=BROWSE';
}
@@ -131,9 +145,10 @@ class uiBrowse
}
- function getResult()
+ function searchDB()
{
- $this->results = NULL;
+ $this->results = array('page' => $this->criteria['offset']/$this->criteria['limit']);
+ $this->criteria['conditions'] = array();
for($col=4; $col>=1; $col--) {
if (is_array($this->col[$col]['criteria'])) {
$this->criteria = array_merge ($this->criteria, $this->col[$col]['criteria']);
@@ -141,33 +156,36 @@ class uiBrowse
}
}
$results = $this->Base->gb->localSearch($this->criteria, $this->Base->sessid);
- #$this->results['count'] = $results['cnt'];
+ $this->results['cnt'] = $results['cnt'];
foreach ($results['results'] as $rec) {
$this->results['items'][] = $this->Base->_getMetaInfo($this->Base->gb->_idFromGunid($rec));
}
$this->pagination($results);
+ #print_r($this->criteria);
#print_r($this->results);
- return $this->results;
+ return TRUE;
}
function pagination(&$results)
{
- if (sizeof($this->results) == 0) {
+ if (sizeof($this->results['items']) == 0) {
return FALSE;
}
- $this->results['count'] = $results['cnt'];
- $this->results['next'] = $results['cnt'] > $this->criteria['offset'] + $this->criteria['limit'] ? TRUE : FALSE;
- $this->results['prev'] = $this->criteria['offset'] > 0 ? TRUE : FALSE;
+ $currp = ($this->criteria['offset']/$this->criteria['limit']) + 1; # current page
+ $maxp = ceil($results['cnt'] / $this->criteria['limit']); # maximum page
- $p = 1;
- for ($n = 1; $n <= ceil($results['cnt'] / $this->criteria['limit']); $n = $n+$p) {
- $p = bcpow(10, floor($n/10));
- $this->results['pages'][$n-1] = $n;
+ for ($n = 1; $n <= $maxp; $n = $n+$width) {
+ $width = pow(10, floor(($n)/10));
+ $this->results['pagination'][$n] = $n;
}
- array_pop($this->results['pages']);
- $this->results['pages'][ceil($results['cnt'] / $this->criteria['limit'])-1] = '>>';
+ #array_pop($this->results['pagination']);
+ $this->results['pagination'][1] = '|<<';
+ $this->results['pagination'][$maxp] = '>>|';
+ $this->results['next'] = $results['cnt'] > $this->criteria['offset'] + $this->criteria['limit'] ? TRUE : FALSE;
+ $this->results['prev'] = $this->criteria['offset'] > 0 ? TRUE : FALSE;
+ ksort($this->results['pagination']);
}
@@ -182,7 +200,7 @@ class uiBrowse
$this->criteria['orderby'] = $by;
$this->setReload();
- #$this->searchDB();
+ $this->searchDB();
}
@@ -196,22 +214,24 @@ class uiBrowse
} elseif ($page == 'prev') {
$o -= $l;
} elseif (is_numeric($page)) {
- $o = $l * $page;
+ $o = $l * ($page-1);
}
$this->setReload();
- #$this->searchDB();
+ $this->searchDB();
}
function setLimit($limit)
{
$this->criteria['limit'] = $limit;
$this->setReload();
+ $this->searchDB();
}
function setFiletype($filetype)
{
$this->criteria['filetype'] = $filetype;
$this->setReload();
+ $this->searchDB();
}
}
?>
diff --git a/livesupport/modules/htmlUI/var/ui_browser_init.php b/livesupport/modules/htmlUI/var/ui_browser_init.php
index 61febde86..e063c3ce0 100644
--- a/livesupport/modules/htmlUI/var/ui_browser_init.php
+++ b/livesupport/modules/htmlUI/var/ui_browser_init.php
@@ -8,9 +8,11 @@ require_once dirname(__FILE__).'/ui_browser.class.php';
require_once dirname(__FILE__).'/ui_scratchpad.class.php';
require_once dirname(__FILE__).'/ui_playlist.class.php'; #
require_once dirname(__FILE__).'/ui_search.class.php';
-require_once dirname(__FILE__).'/ui_browse.class.php';
+require_once dirname(__FILE__).'/ui_browse.class.php';
require_once dirname(__FILE__).'/../../storageServer/var/GreenBox.php';
require_once dirname(__FILE__).'/formmask/general.inc.php';
+require_once dirname(__FILE__).'/ui_calendar.class.php';
+require_once dirname(__FILE__).'/ui_scheduler.class.php';
## well known classes ###############################################
require_once dirname(__FILE__).'/Smarty/libs/Smarty.class.php';
diff --git a/livesupport/modules/htmlUI/var/ui_calendar.class.php b/livesupport/modules/htmlUI/var/ui_calendar.class.php
new file mode 100755
index 000000000..f0fd260f4
--- /dev/null
+++ b/livesupport/modules/htmlUI/var/ui_calendar.class.php
@@ -0,0 +1,92 @@
+firstDayOfWeek = 1;
+ }
+
+
+ function buildMonth()
+ {
+ if (is_array($this->Month)) return FALSE;
+
+ require_once 'Calendar/Calendar.php';
+ require_once 'Calendar/Month/Weekdays.php';
+ require_once 'Calendar/Day.php';
+
+ $Month = new Calendar_Month_Weekdays($this->curr['year'], $this->curr['month'], $this->firstDayOfWeek);
+ # mark today #
+ $sel = new Calendar_Day($this->curr['year'], $this->curr['month'], $this->curr['day']);
+ $selection = array($sel);
+
+ $Month->build($selection);
+ while ($Day = $Month->fetch()) {
+ $this->Month[] = array(
+ 'day' => $this->Base->_twoDigits($Day->thisDay()),
+ 'week' => $this->_getWeekNr($Day),
+ 'isEmpty' => $Day->isEmpty(),
+ 'isFirst' => $Day->isFirst(),
+ 'isLast' => $Day->isLast(),
+ 'isSelected' => $Day->isSelected()
+ );
+ }
+ }
+
+
+ function buildWeek()
+ {
+ if (is_array($this->Week)) return FALSE;
+
+ require_once 'Calendar/Week.php';
+
+ $Week = new Calendar_Week ($this->curr['year'], $this->curr['month'], $this->curr['day'], $this->firstDayOfWeek);
+ $Week->build();
+ while ($Day = $Week->fetch()) {
+ $this->Week[] = array(
+ 'day' => $this->Base->_twoDigits($Day->thisDay()),
+ 'label' => $this->_getDayName($Day),
+ );
+ }
+
+ }
+
+ function buildDay()
+ {
+ require_once 'Calendar/Day.php';
+
+ $Day = new Calendar_Day ($this->curr['year'], $this->curr['month'], $this->curr['day']);
+ $Day->build();
+ while ($Hour = $Day->fetch()) {
+ $this->Day[] = $Hour->thisHour();
+ }
+
+ }
+
+ function buildHour()
+ {
+ require_once 'Calendar/Hour.php';
+
+ $Hour = new Calendar_Hour ($this->curr['year'], $this->curr['month'], $this->curr['day'], $this->curr['hour']);
+ $Hour->build();
+ while ($Min = $Hour->fetch()) {
+ $this->Hour[] = $Min->thisMinute();
+ }
+ }
+
+ function _getWeekNr(&$date) {
+ $timestamp = mktime($date->thisHour(), $date->thisMinute(), $date->thisSecond(), $date->thisMonth(), $date->thisDay(), $date->thisYear());
+ #echo $date->thisHour().$date->thisMinute().$date->thisSecond().$date->thisYear().$date->thisMonth().$date->thisDay().$timestamp." ";
+ return date("W", $timestamp);
+ }
+
+
+ function _getDayName(&$date) {
+ $timestamp = mktime($date->thisHour(), $date->thisMinute(), $date->thisSecond(), $date->thisMonth(), $date->thisDay(), $date->thisYear());
+ #echo $date->thisHour().$date->thisMinute().$date->thisSecond().$date->thisYear().$date->thisMonth().$date->thisDay().$timestamp." ";
+ return array('short' => strftime("%a", $timestamp),
+ 'full' => strftime("%A", $timestamp));
+ }
+}
+?>
diff --git a/livesupport/modules/htmlUI/var/ui_handler_init.php b/livesupport/modules/htmlUI/var/ui_handler_init.php
index 438a4d480..6ab5f71ad 100644
--- a/livesupport/modules/htmlUI/var/ui_handler_init.php
+++ b/livesupport/modules/htmlUI/var/ui_handler_init.php
@@ -9,9 +9,11 @@ require_once dirname(__FILE__).'/ui_handler.class.php';
require_once dirname(__FILE__).'/ui_scratchpad.class.php';
require_once dirname(__FILE__).'/ui_playlist.class.php';
require_once dirname(__FILE__).'/ui_search.class.php';
-require_once dirname(__FILE__).'/ui_browse.class.php';
+require_once dirname(__FILE__).'/ui_browse.class.php';
require_once dirname(__FILE__).'/../../storageServer/var/GreenBox.php';
require_once dirname(__FILE__).'/formmask/general.inc.php';
+require_once dirname(__FILE__).'/ui_calendar.class.php';
+require_once dirname(__FILE__).'/ui_scheduler.class.php';
## well known classes ###############################################
require_once 'DB.php';
diff --git a/livesupport/modules/htmlUI/var/ui_scheduler.class.php b/livesupport/modules/htmlUI/var/ui_scheduler.class.php
new file mode 100755
index 000000000..bf6263731
--- /dev/null
+++ b/livesupport/modules/htmlUI/var/ui_scheduler.class.php
@@ -0,0 +1,44 @@
+curr =& $_SESSION[UI_CALENDAR_SESSNAME]['current'];
+ if (!is_array($this->curr)) {
+ $this->curr['view'] = 'month';
+ $this->curr['year'] = date("Y");
+ $this->curr['month'] = date("m");
+ $this->curr['day'] = date('d');
+ }
+
+ $this->Base =& $uiBase;
+ $this->reloadUrl = UI_BROWSER.'?popup[]=_reload_parent&popup[]=_close';
+
+ $this->uiCalendar();
+ }
+
+
+ function setReload()
+ {
+ $this->Base->redirUrl = $this->reloadUrl;
+ }
+
+ function set($arr)
+ {
+ extract($arr);
+ if ($view) $this->curr['view'] = $view;
+ if ($day) $this->curr['day'] = $day;
+ }
+
+
+ function uploadPL($gunid)
+ {
+ require_once dirname(__FILE__).'ui_xmlrpcwrapper.class.php';
+
+
+ }
+
+
+
+}
+?>
diff --git a/livesupport/modules/htmlUI/var/ui_search.class.php b/livesupport/modules/htmlUI/var/ui_search.class.php
index 421ed1d81..5f0f52222 100755
--- a/livesupport/modules/htmlUI/var/ui_search.class.php
+++ b/livesupport/modules/htmlUI/var/ui_search.class.php
@@ -20,6 +20,13 @@ class uiSearch
return $this->results;
}
+
+ function getCriteria()
+ {
+ return $this->criteria;
+ }
+
+
function searchForm($id, &$mask2)
{
include dirname(__FILE__).'/formmask/metadata.inc.php';
@@ -91,12 +98,14 @@ class uiSearch
function searchDB()
{
- $this->results = NULL;
+ $this->results = array('page' => $this->criteria['offset']/$this->criteria['limit']);
$results = $this->Base->gb->localSearch($this->criteria, $this->Base->sessid);
foreach ($results['results'] as $rec) {
$this->results['items'][] = $this->Base->_getMetaInfo($this->Base->gb->_idFromGunid($rec));
}
- #print_r($this->criteria); print_r($this->results);
+ $this->results['cnt'] = $results['cnt'];
+ #print_r($this->criteria);
+ #print_r($this->results);
$this->pagination($results);
}
@@ -106,18 +115,28 @@ class uiSearch
if (sizeof($this->results) == 0) {
return FALSE;
}
- $this->results['count'] = $results['cnt'];
- $this->results['next'] = $results['cnt'] > $this->criteria['offset'] + $this->criteria['limit'] ? TRUE : FALSE;
- $this->results['prev'] = $this->criteria['offset'] > 0 ? TRUE : FALSE;
- $p = 1;
- for ($n = 1; $n <= ceil($results['cnt'] / $this->criteria['limit']); $n = $n+$p) {
- $p = bcpow(10, floor($n/10));
- $this->results['pages'][$n-1] = $n;
+ $pot = 0; # potence
+ $lpr = 10; # links pro range
+ $width = 1; # width bettween pages
+ $currp = ($this->criteria['offset']/$this->criteria['limit']) +1 ; # current page
+ $maxp = ceil($results['cnt']/$this->criteria['limit']); # maximum page
+
+ for ($n = 1; $n <= $maxp; $n = $n+$width) {
+ if ($n<$currp)
+ $width = pow($lpr, floor(log10(abs($n-$currp))));
+ else
+ $width = pow($lpr, floor(log10(abs($n-$currp)+1)));
+ $this->results['pagination'][$n] = $n;
+
}
- array_pop($this->results['pages']);
- $this->results['pages'][ceil($results['cnt'] / $this->criteria['limit'])-1] = '>>';
+ #array_pop($this->results['pagination']);
+ $this->results['pagination'][$maxp] = '>>|';
+ $this->results['pagination'][1] = '|<<';
+ $this->results['next'] = $results['cnt'] > $this->criteria['offset'] + $this->criteria['limit'] ? TRUE : FALSE;
+ $this->results['prev'] = $this->criteria['offset'] > 0 ? TRUE : FALSE;
+ ksort($this->results['pagination']);
}
@@ -154,7 +173,7 @@ class uiSearch
} elseif ($page == 'prev') {
$o -= $l;
} elseif (is_numeric($page)) {
- $o = $l * $page;
+ $o = $l * ($page-1);
}
$this->setReload();
$this->searchDB();
diff --git a/livesupport/modules/htmlUI/var/ui_xmlrpcwrapper.class.php b/livesupport/modules/htmlUI/var/ui_xmlrpcwrapper.class.php
new file mode 100755
index 000000000..70de0c9b6
--- /dev/null
+++ b/livesupport/modules/htmlUI/var/ui_xmlrpcwrapper.class.php
@@ -0,0 +1,489 @@
+
+ * m full method name (include optional prefix)
+ * p array of input parameter names
+ * r array of result element names (not used there at present)
+ * e array of error codes/messages (not used there at present)
+ *
+ */
+$mdefs = array(
+ "AddAudioClipToPlaylistMethod" => array(
+ 'm'=>'AddAudioClipToPlaylistMethod',
+ 'p'=>array('sessionId'/*string*/, 'playlistId'/*string*/, 'audioClipId'/*string*/, 'relativeOffset'/*int*/),
+ 'r'=>array('playlistElementId'/*string*/),
+ 'e'=>array(
+ '301'=>'invalid argument format',
+ '302'=>'missing playlist ID argument',
+ '303'=>'missing audio clip ID argument',
+ '304'=>'missing relative offset argument',
+ '305'=>'playlist not found',
+ '306'=>'playlist has not been opened for editing',
+ '307'=>'audio clip does not exist',
+ '308'=>'two audio clips at the same relative offset',
+ '320'=>'missing session ID argument',
+ )
+ ),
+ "CreatePlaylistMethod" => array(
+ 'm'=>'CreatePlaylistMethod',
+ 'p'=>array('sessionId'/*string*/),
+ 'r'=>array('playlist'/*string*/),
+ 'e'=>array(
+ '201'=>'invalid argument format',
+ '202'=>'could not create playlist',
+ '220'=>'missing session ID argument',
+ )
+ ),
+ "DeletePlaylistMethod" => array(
+ 'm'=>'DeletePlaylistMethod',
+ 'p'=>array('sessionId'/*string*/, 'playlistId'/*string*/),
+ 'r'=>array(),
+ 'e'=>array(
+ '901'=>'invalid argument format',
+ '902'=>'missing playlist ID argument',
+ '903'=>'playlist not found',
+ '904'=>'playlist is locked',
+ '905'=>'playlist could not be deleted',
+ '920'=>'missing session ID argument',
+ )
+ ),
+ "DisplayAudioClipMethod" => array(
+ 'm'=>'DisplayAudioClipMethod',
+ 'p'=>array('sessionId'/*string*/, 'audioClipId'/*string*/),
+ 'r'=>array('audioClip'/*string*/),
+ 'e'=>array(
+ '601'=>'invalid argument format',
+ '602'=>'argument is not an audio clip ID',
+ '603'=>'audio clip not found',
+ '620'=>'missing session ID argument',
+ )
+ ),
+ "DisplayAudioClipsMethod" => array(
+ 'm'=>'DisplayAudioClipsMethod',
+ 'p'=>array('sessionId'/*string*/),
+ 'r'=>array(array('audioClip'/*string*/)),
+ 'e'=>array(
+ '1801'=>'invalid argument format',
+ '1802'=>'XML-RPC error',
+ '1820'=>'missing session ID argument',
+ )
+ ),
+ "DisplayPlaylistMethod" => array(
+ 'm'=>'DisplayPlaylistMethod',
+ 'p'=>array('sessionId'/*string*/, 'playlistId'/*string*/),
+ 'r'=>array('playlist'/*string*/),
+ 'e'=>array(
+ '1001'=>'invalid argument format',
+ '1002'=>'argument is not a playlist ID',
+ '1003'=>'playlist not found',
+ '1020'=>'missing session ID argument',
+ )
+ ),
+ "DisplayPlaylistsMethod" => array(
+ 'm'=>'DisplayPlaylistsMethod',
+ 'p'=>array('sessionId'/*string*/),
+ 'r'=>array(array('playlist'/*string*/)),
+ 'e'=>array(
+ '1701'=>'invalid argument format',
+ '1702'=>'XML-RPC error',
+ '1720'=>'missing session ID argument',
+ )
+ ),
+ "DisplayScheduleMethod" => array(
+ 'm'=>'DisplayScheduleMethod',
+ 'p'=>array('sessionId'/*string*/, 'from'/*datetime*/, 'to'/*datetime*/),
+ 'r'=>array(array('id'/*int*/, 'playlistId'/*string*/, 'start'/*datetime*/, 'end'/*datetime*/)),
+ 'e'=>array(
+ '1101'=>'invalid argument format',
+ '1102'=>"missing or invalid 'from' argument",
+ '1103'=>"missing or invalid 'to' argument",
+ '1120'=>'missing session ID argument',
+ )
+ ),
+ "GeneratePlayReportMethod" => array(
+ 'm'=>'GeneratePlayReportMethod',
+ 'p'=>array('sessionId'/*string*/, 'from'/*datetime*/, 'to'/*datetime*/),
+ 'r'=>array(array('audioClipId'/*string*/, 'timestamp'/*datetime*/)),
+ 'e'=>array(
+ '1501'=>'invalid argument format',
+ '1502'=>"missing or invalid 'from' argument",
+ '1503'=>"missing or invalid 'to' argument",
+ '1520'=>'missing session ID argument',
+ )
+ ),
+ "GetSchedulerTimeMethod" => array(
+ 'm'=>'GetSchedulerTimeMethod',
+ 'p'=>array(),
+ 'r'=>array('schedulerTime'/*datetime*/),
+ 'e'=>array(
+)
+ ),
+ "GetVersionMethod" => array(
+ 'm'=>'GetVersionMethod',
+ 'p'=>array(),
+ 'r'=>array('version'/*string*/),
+ 'e'=>array()
+ ),
+ "LoginMethod" => array(
+ 'm'=>'LoginMethod',
+ 'p'=>array('login'/*string*/, 'password'/*string*/),
+ 'r'=>array('sessionId'/*string*/),
+ 'e'=>array(
+ '2001'=>'invalid argument format',
+ '2002'=>'missing login argument',
+ '2003'=>'missing password argument',
+ '2004'=>'the authentication server reported an error',
+ )
+ ),
+ "LogoutMethod" => array(
+ 'm'=>'LogoutMethod',
+ 'p'=>array('sessionId'/*string*/),
+ 'r'=>array(),
+ 'e'=>array(
+ '2101'=>'invalid argument format',
+ '2120'=>'missing session ID argument',
+ '2104'=>'the authentication server reported an error',
+ )
+ ),
+ "OpenPlaylistForEditingMethod" => array(
+ 'm'=>'OpenPlaylistForEditingMethod',
+ 'p'=>array('sessionId'/*string*/, 'playlistId'/*string*/),
+ 'r'=>array('playlist'/*string*/),
+ 'e'=>array(
+ '101'=>'invalid argument format',
+ '102'=>'argument is not a playlist ID',
+ '104'=>'could not open playlist for editing',
+ '120'=>'missing session ID argument',
+ )
+ ),
+ "RemoveAudioClipFromPlaylistMethod" => array(
+ 'm'=>'RemoveAudioClipFromPlaylistMethod',
+ 'p'=>array('sessionId'/*string*/, 'playlistId'/*string*/, 'playlistElementId'/*string*/),
+ 'r'=>array(),
+ 'e'=>array(
+ '401'=>'invalid argument format',
+ '402'=>'missing playlist ID argument',
+ '403'=>'missing relative offset argument',
+ '404'=>'playlist does not exist',
+ '405'=>'playlist has not been opened for editing',
+ '406'=>'no audio clip at the specified relative offset',
+ '420'=>'missing session ID argument',
+ )
+ ),
+ "RemoveFromScheduleMethod" => array(
+ 'm'=>'RemoveFromScheduleMethod',
+ 'p'=>array('sessionId'/*string*/, 'scheduleEntryId'/*string*/),
+ 'r'=>array(),
+ 'e'=>array(
+ '1201'=>'invalid argument format',
+ '1202'=>'missing schedule entry ID argument',
+ '1203'=>'schedule entry not found',
+ '1220'=>'missing session ID argument',
+ )
+ ),
+ "RescheduleMethod" => array(
+ 'm'=>'RescheduleMethod',
+ 'p'=>array('sessionId'/*string*/, 'scheduleEntryId'/*string*/, 'playtime'/*datetime*/),
+ 'r'=>array(),
+ 'e'=>array(
+ '1301'=>'invalid argument format',
+ '1302'=>'missing schedule entry ID argument',
+ '1303'=>'missing playtime argument',
+ '1304'=>'schedule entry not found',
+ '1305'=>'could not reschedule entry',
+ '1320'=>'missing session ID argument',
+ )
+ ),
+ "ResetStorageMethod" => array(
+ 'm'=>'ResetStorageMethod',
+ 'p'=>array(),
+ 'r'=>array(),
+ 'e'=>array('3001'=>'storage client reported an error'),
+ ),
+ "RevertEditedPlaylistMethod" => array(
+ 'm'=>'RevertEditedPlaylistMethod',
+ 'p'=>array('sessionId'/*string*/, 'playlistId'/*string*/),
+ 'r'=>array(),
+ 'e'=>array(
+ '801'=>'invalid argument format',
+ '802'=>'argument is not a playlist ID',
+ '803'=>'playlist not found',
+ '804'=>'could not revert playlist',
+ '820'=>'missing session ID argument',
+ )
+ ),
+ "SavePlaylistMethod" => array(
+ 'm'=>'SavePlaylistMethod',
+ 'p'=>array('sessionId'/*string*/, 'playlistId'/*string*/),
+ 'r'=>array(),
+ 'e'=>array(
+ '701'=>'invalid argument format',
+ '702'=>'argument is not a playlist ID',
+ '703'=>'playlist not found',
+ '705'=>'could not save playlist',
+ '720'=>'missing session ID argument',
+ )
+ ),
+ "UpdateFadeInFadeOutMethod" => array(
+ 'm'=>'UpdateFadeInFadeOutMethod',
+ 'p'=>array('sessionId'/*string*/, 'playlistId'/*string*/, 'playlistElementId'/*string*/, 'fadeIn'/*int*/, 'fadeOut'/*int*/),
+ 'r'=>array(),
+ 'e'=>array(
+ '1601'=>'invalid argument format',
+ '1602'=>'missing playlist ID argument',
+ '1603'=>'missing playlist element ID argument',
+ '1604'=>'missing fade in argument',
+ '1605'=>'missing fade out argument',
+ '1606'=>'playlist does not exist',
+ '1607'=>'playlist has not been opened for editing',
+ '1608'=>'error executing setFadeInfo() method',
+ '1620'=>'missing session ID argument',
+ )
+ ),
+ "UploadPlaylistMethod" => array(
+ 'm'=>'UploadPlaylistMethod',
+ 'p'=>array('sessionId'/*string*/, 'playlistId'/*string*/, 'playtime'/*datetime*/),
+ 'r'=>array('scheduleEntryId'/*string*/),
+ 'e'=>array(
+ '1401'=>'invalid argument format',
+ '1402'=>'missing playlist ID argument',
+ '1403'=>'missing playtime argument',
+ '1404'=>'playlist not found',
+ '1405'=>'timeframe not available',
+ '1406'=>'could not schedule playlist',
+ '1420'=>'missing session ID argument',
+ )
+ ),
+ "ValidatePlaylistMethod" => array(
+ 'm'=>'ValidatePlaylistMethod',
+ 'p'=>array('sessionId'/*string*/, 'playlistId'/*string*/),
+ 'r'=>array('valid'/*bool*/),
+ 'e'=>array(
+ '501'=>'invalid argument format',
+ '502'=>'missing playlist ID argument',
+ '503'=>'playlist does not exist',
+ '504'=>'playlist has not been opened for editing',
+ '520'=>'missing session ID argument',
+ )
+ ),
+ "LoginGB" => array(
+ 'm'=>'locstor.login',
+ 'p'=>array('login'/*string*/, 'pass'/*string*/),
+ 'r'=>array('sessid'/*string*/),
+ 'e'=>array(
+ '2001'=>'invalid argument format',
+ '2002'=>'missing login argument',
+ '2003'=>'missing password argument',
+ '2004'=>'the authentication server reported an error',
+ )
+ ),
+ "LogoutGB" => array(
+ 'm'=>'locstor.logout',
+ 'p'=>array('sessid'/*string*/),
+ 'r'=>array('status'/*boolean*/),
+ 'e'=>array(
+ '2001'=>'invalid argument format',
+ '2002'=>'missing login argument',
+ '2003'=>'missing password argument',
+ '2004'=>'the authentication server reported an error',
+ )
+ ),
+);
+
+/* ======================================================== class definitions */
+
+class SchedulerPhpClient{
+ /**
+ * Databases object reference
+ */
+ var $dbc = NULL;
+ /**
+ * Array with methods description
+ */
+ var $mdefs = array();
+ /**
+ * Confiduration array from ../conf.php
+ */
+ var $config = array();
+ /**
+ * XMLRPC client object reference
+ */
+ var $client = NULL;
+ /**
+ * Verbosity flag
+ */
+ var $verbose = FALSE;
+ /**
+ * XMLRPC debug flag
+ */
+ var $debug = 0;
+ /**
+ * Constructor - pelase DON'T CALL IT, use factory method instead
+ *
+ * @param dbc object, database object reference
+ * @param mdefs array, hash array with methods description
+ * @param config array, hash array with configuration
+ * @param debug int, XMLRPC debug flag
+ * @param verbose boolean, verbosity flag
+ * @return this
+ */
+ function SchedulerPhpClient(
+ &$dbc, $mdefs, $config, $debug=0, $verbose=FALSE)
+ {
+ $this->dbc = $dbc;
+ $this->mdefs = $mdefs;
+ $this->config = $config;
+ $this->debug = $debug;
+ $this->verbose = $verbose;
+ $confPrefix = "scheduler";
+ // $confPrefix = "storage";
+ $serverPath =
+ "http://{$config["{$confPrefix}UrlHost"]}:{$config["{$confPrefix}UrlPort"]}".
+ "{$config["{$confPrefix}UrlPath"]}/{$config["{$confPrefix}XMLRPC"]}";
+ #$serverPath = "http://localhost:80/livesupportStorageServerCVS/xmlrpc/xrLocStor.php";
+ if($this->verbose) echo "serverPath: $serverPath\n";
+ $url = parse_url($serverPath);
+ $this->client = new XML_RPC_Client($url['path'], $url['host']);
+ }
+
+ /**
+ * Factory, create object instance
+ *
+ * In fact it doesn't create instance of SchedulerPhpClient, but
+ * dynamically extend this class with set of methods based on $mdefs array
+ * (using eval function) and instantiate resulting class
+ * SchedulerPhpClientCore instead.
+ * Each new method in this subclass accepts parameters according to $mdefs
+ * array, call wrapper callMethod(methodname, parameters) and return its
+ * result.
+ *
+ * @param dbc object, database object reference
+ * @param mdefs array, hash array with methods description
+ * @param config array, hash array with configuration
+ * @param debug int, XMLRPC debug flag
+ * @param verbose boolean, verbosity flag
+ * @return object, created object instance
+ */
+ function &factory(&$dbc, $mdefs, $config, $debug=0, $verbose=FALSE){
+ $f = '';
+ foreach($mdefs as $fn=>$farr){
+ $f .=
+ ' function '.$fn.'(){'."\n".
+ ' $pars = func_get_args();'."\n".
+ ' $r = $this->callMethod("'.$fn.'", $pars);'."\n".
+ ' return $r;'."\n".
+ ' }'."\n";
+ }
+ $e =
+ "class SchedulerPhpClientCore extends SchedulerPhpClient{\n".
+ "$f\n".
+ "}\n";
+# echo $e;
+ if(FALSE === eval($e)) return $dbc->raiseError("Eval failed");
+ $spc =& new SchedulerPhpClientCore(
+ $dbc, $mdefs, $config, $debug, $verbose);
+ return $spc;
+ }
+
+ /**
+ * XMLRPC methods wrapper
+ * Encode XMLRPC request message, send it, receive and decode response.
+ *
+ * @param method string, method name
+ * @param gettedPars array, returned by func_get_args() in called method
+ * @return array, PHP hash with response
+ */
+ function callMethod($method, $gettedPars)
+ {
+ $parr = array();
+ foreach($this->mdefs[$method]['p'] as $i=>$p){
+ $parr[$p] = $gettedPars[$i];
+ }
+ $fullmethod = $this->mdefs[$method]['m'];
+ $msg = new XML_RPC_Message($fullmethod, array(XML_RPC_encode($parr)));
+ if($this->verbose){
+ echo "parr:\n";
+ var_dump($parr);
+ echo "message:\n";
+ echo $msg->serialize()."\n";
+ }
+ $this->client->setDebug($this->debug);
+ $res = $this->client->send($msg);
+ if($res->faultCode() > 0) {
+ return $this->dbc->raiseError(
+ "SchedulerPhpClient::$method:".$res->faultString()." ".
+ $res->faultCode()."\n", $res->faultCode()
+ );
+ }
+ if($verbose){
+ echo "result:\n";
+ echo $res->serialize();
+ }
+ $resp = XML_RPC_decode($res->value());
+ return $resp;
+ }
+
+}
+
+/* ======================================================== class definitions */
+
+/**
+ * Example of use:
+ *
+ */
+
+/*
+// db object handling:
+$dbc = DB::connect($config['dsn'], TRUE);
+$dbc->setFetchMode(DB_FETCHMODE_ASSOC);
+$dbc->setErrorHandling(PEAR_ERROR_RETURN);
+
+// scheduler client instantiation:
+$spc =& SchedulerPhpClient::factory($dbc, $mdefs, $config);
+
+// call of chosen function by name according to key values in $mdefs array:
+// (for testing on storageServer XMLRPC I've changes confPrefix in
+// SchedulerPhpClient constructor from 'scheduler' to 'storage' value)
+$r = $spc->LoginGB('root', 'q'); var_dump($r);
+#$r = $spc->LogoutGB(''); var_dump($r);
+*/
+
+?>
\ No newline at end of file
|