Svdrp-php

Aus VDR Wiki
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
K (Hob den Schutz von „Svdrp-php“ auf)
 
(16 dazwischenliegende Versionen von 12 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 
<pre>
 
<pre>
<?php
+
<?php
 
   
 
   
// SVDRP is a class do communicate with a vdr via svdrp
+
// SVDRP is a class do communicate with a vdr via svdrp
class SVDRP
+
class SVDRP
{
+
{
var $cfgServer;
+
var $cfgServer;
var $cfgPort;  
+
var $cfgPort;  
var $cfgTimeOut;
+
var $cfgTimeOut;
 +
 
 +
var $handle;
 +
var $debug;
 +
 +
function SVDRP($server = "localhost", $port=2001, $timeout = 30, $debug = 0)
 +
{
 +
$this->cfgServer = $server;
 +
$this->cfgPort = $port;
 +
$this->cfgTimeOut = $timeout;
 +
$this->debug = $debug;
 +
$this->handle = 0;
 +
}
 +
 
 +
function DebugMessage($msg)
 +
{
 +
if($this->debug) echo ($msg);
 +
}
 +
 
 +
function Connect()
 +
{
 +
if($this->handle) Disconnect();
 +
$errno = 0;
 +
$errstr = "";
 +
$this->handle = fsockopen($this->cfgServer, $this->cfgPort, &$errno, &$errstr, $this->cfgTimeOut);
 +
 
 +
if(!$this->handle)
 +
{
 +
$this->DebugMessage("error $errno: $errstr");
 +
return false;
 +
}
 +
 +
$this->DebugMessage("handle: $this->handle<br>\n");
 +
 
 +
 +
$input = fgets($this->handle,128);
 +
 +
if(!preg_match("/^220 /", $input) || $input == "")
 +
{
 +
$this->DebugMessage("wrong welcome message: '$input'<br>\n");
 +
$this->Disconnect();
 +
return false;
 +
}
 +
 +
 +
$this->DebugMessage("Welcome message: $input<br><br>\n");
 +
 +
return true;
 +
}
 +
 
 +
function Command($cmd)
 +
{
 +
if(!$this->handle) return false;
 +
 +
$ret = array();
 +
 +
$this->DebugMessage("Kommando $cmd<br><pr"."e>");
 +
fputs($this->handle, $cmd . "\n");
 +
$s = "";
 +
$nline = 0;
 +
while($s .= fgets($this->handle,2048))
 +
{
 +
$nline++;
 +
 +
                        $this->DebugMessage($s);
 +
if(!preg_match("/^(\\d{3})([ -])(.*)$/", $s, $data))
 +
{
 +
continue;
 +
}
 +
 +
 +
 +
 +
$number = $data[1];
 +
// TODO: Fehlernummer bearbeiten
 +
$ret[] = $data[3];
 +
if($data[2] != "-" && $nline == 1) $ret =  $data[3] ;
 +
if($data[2] != "-") break;
 +
$s = "";
 +
 +
}
 +
 +
$this->DebugMessage("</pr"."e>");
 +
return $ret;
 +
}
 +
 
 +
function ListChannels($numberorname="")
 +
{
 +
if(!$this->handle) return false;
 +
$channels = array();
 +
$lines = $this->Command("LSTC$numberorname");
 +
if(!$lines) return false;
 +
foreach($lines as $a => $l)
 +
{
 +
$a = split(":", $l);
 +
$name = $a[0];
 +
$freq = $a[1];
 +
$b = split(";", $name);
 +
$name = $b[0];
 +
if(!isset($b[1])) $b[1] = $name;
 +
$group = $b[1];
 +
 
 +
 +
$c["name"] = $name;
 +
$c["group"] = $group;
 +
$c["frequency"] = $freq;
 +
 +
$channels[] = $c;
 +
 +
 +
}
 +
return $channels;
 +
}
 +
 +
function Help()
 +
{
 +
return $this->Command("HELP");
 +
}
 +
function Disconnect()
 +
{
 +
if(!$this->handle) return;
 +
$this->Command("QUIT");
 +
 +
fclose($this->handle);
 +
$this->handle = 0;
 +
$this->DebugMessage("disconnected");
 +
}
 +
function ClearEpg()
 +
{
 +
if(!$this->handle) return false;
 +
$this->Command("CLRE");
 +
return true;
 +
}
 +
function SwitchUp()
 +
{
 +
if(!$this->handle) return false;
 +
$this->Command("CHAN +");
 +
return true;
 +
}
 +
function SwitchDown()
 +
{
 +
if(!$this->handle) return false;
 +
$this->Command("CHAN -");
 +
return true;
 +
}
 +
function SwitchChannel($channel)
 +
{
 +
if(!$this->handle) return false;
 +
$this->Command("CHAN $channel");
 +
return true;
 +
}
 +
function DeleteChannel($id)
 +
{
 +
if(!$this->handle) return false;
 +
$this->Command("DELC $id");
 +
return true;
 +
}
 +
function DeleteRecord($id)
 +
{
 +
if(!$this->handle) return false;
 +
$this->Command("DELR $id");
 +
return true;
 +
}
 +
 +
function GrabImage($filename, $type="jpeg", $quality="", $width="", $height)
 +
{
 +
if(!$this->handle) return false;
 +
$this->Command("GRAB $filename $type $quality $width $height");
 +
return true;
 +
}
 +
function HitKey($key)
 +
{
 +
if(!$this->handle) return false;
 +
$this->Command("HITK $key");
 +
return true;
 +
}
 +
function PowerOff()
 +
{
 +
if(!$this->handle) return false;
 +
$this->Command("HITK Power");
 +
return true;
 +
 +
}
 +
function GetKeys()
 +
{
 +
if(!$this->handle) return false;
 +
 
 +
$lines = $this->Command("HITK");
 +
$keys = array();
 +
foreach($lines as $l)
 +
{
 +
if(!preg_match("/^ {4}(.*)$/", $l, $m)) continue;
 +
$keys[] = $m[1];
 +
}
 +
 +
return $keys;
 +
}
 +
function ListEPG($pStrChannel="", $pStrTime="")
 +
{
 +
if(!$this->handle) return false;
 +
$lines = $this->Command("LSTE");
 +
 
 +
$epg = array ();
 +
$channel = array();
 +
$event = array();
 +
 
 +
$channelname = "";
 +
foreach($lines as $l)
 +
{
 +
preg_match("/^(.)\\s*(.*)$/", $l, $m);
 +
$type = $m[1];
 +
$text = $m[2];
 +
switch($type)
 +
{
 +
case 'C': // Channel
 +
list( $channeldata, $channelname ) = explode( ' ', $text, 2 );
 +
 +
break;
 +
case 'E': // new Event
 +
sscanf($text, "%u %ld %d %X", $event["EventID"], $event["StartTime"], $event["Duration"], $event["TableID"]);
 +
 +
break;
 +
case 'T': // Title
 +
$event["Title"] = $text;
 +
break;
 +
case 'S': // Short text
 +
$event["Shottext"] = $text;
 +
break;
 +
case 'D': // Description
 +
$event["Desc"] = $text;
 +
break;
 +
case 'V': // VPS
 +
$event["VPS"] = $text;
 +
break;
 +
case 'e': // Event end
 +
if ((trim($pStrTime) != '') && (( $event['StartTime'] > $pStrTime ) || ($event['StartTime'] + $event["Duration"] < $pStrTime)))
 +
continue;
 +
 
 +
$channel[] = $event;
 +
$event = array();
 +
 +
break;
 +
case 'c': // Channel end
 +
if ((trim($pStrChannel) != '') && ($channelname != $pStrChannel))
 +
continue;
 +
 
 +
$epg[$channelname] = $channel;
 +
$channel = array();
 +
 +
break;
 +
}
 +
 
 +
}
 +
if ((trim($pStrTime) == '') || (( $event['StartTime'] < $pStrTime ) && ($event['StartTime'] + $event["Duration"] > $pStrTime)))
 +
$channel[] = $event;
 +
 +
if ((trim($pStrChannel) != '') || ($channelname == $pStrChannel))
 +
$epg[$channelname] = $channel;
 +
 
 +
return $epg;
 +
}
 +
 
 +
function Message($msg)
 +
{
 +
if(!$this->handle) return false;
 +
$this->Command("MESG $msg");
 +
return true;
 +
}
 +
 
 +
 +
// Volume commands
 +
function ToggleMute()
 +
{
 +
if(!$this->handle) return false;
 +
$this->Command("VOLU mute");
 +
return true;
 +
}
 +
function VolumeUp()
 +
{
 +
if(!$this->handle) return false;
 +
$this->Command("VOLU +");
 +
return true;
 +
}
 +
function VolumeDown()
 +
{
 +
if(!$this->handle) return false;
 +
$this->Command("VOLU -");
 +
return true;
 +
}
 +
function SetVolume($v)
 +
{
 +
if(!$this->handle) return false;
 +
$this->Command("VOLU $v");
 +
return true;
 +
}
 +
function GetVolume()
 +
{
 +
if(!$this->handle) return false;
 +
$v = $this->Command("VOLU");
 +
if($v == "Audio is mute") return 0;
 +
if(!preg_match("/Audio volume is (.*)/", $v, $m)) return false;
 +
 +
return $m[1];
 +
}
 +
function GetDiskStat()
 +
{
 +
if(!$this->handle) return false;
 +
$stat = $this->Command("STAT DISK");
 +
sscanf($stat, "%dMB %dMB %d%%", $FreeMUsedMB, $FreeMB, $Percent);
 +
$ret["FreeMB + UsedMB"] = $FreeMUsedMB;
 +
$ret["FreeMB"] = $FreeMB;
 +
$ret["UsedMB"] = $FreeMUsedMB - $FreeMB;
 +
$ret["Percent"] = $Percent;
 +
return $ret;
 +
}
 +
function StartScan()
 +
{
 +
if(!$this->handle) return false;
 +
$this->Command("SCAN");
 +
return true;
 +
}
 +
function MoveChannel($number, $to)
 +
{
 +
if(!$this->handle) return false;
 +
$this->Command("MOVC $number $to");
 +
return true;
 +
 +
}
 +
 +
function DeleteTimer($id)
 +
{
 +
if(!$this->handle) return false;
 +
$this->Command("DELT $id");
 +
return true;
 +
}
 +
 +
function MoveTimer($number, $to)
 +
{
 +
if(!$this->handle) return false;
 +
$this->Command("MOVT $number $to");
 +
return true;
 +
}
 +
 +
function TimerOnOff($n, $state = "on")
 +
{
 +
if(!$this->handle) return false;
 +
//if($state == "1") $state = "on";
 +
//if($state == "0") $state = "off";
 +
//if($state == false) $state = "off";
 +
// if($state == true) $state = "on";
 +
switch($state)
 +
{
 +
case false:
 +
case "off":
 +
case "0":
 +
$state = "off";
 +
break;
 +
default:
 +
$state = "on";
 +
break;
 +
}
 +
 +
return $this->Command("MODT $n $state");
 +
}
 +
 +
function ListTimers()
 +
{
 +
 +
}
 +
 +
function ShowMessage($msg = "")
 +
{
 +
if(!$this->handle) return false;
 +
return $this->Command("MESG $msg");
 +
}
 +
 +
function ListRecords()
 +
{
 +
if(!$this->handle) return false;
 +
 +
$lines = $this->Command("LSTR");
 +
$records = array();
 +
foreach($lines as $l)
 +
{
 +
 +
if(!preg_match("/^(\\d)\s(\\d*)\\.(\\d*)\\.(\\d*) (\\d*)\\:(\\d*).\s(.*)$/", $l, $m)) continue;
 +
$id = $m[1];
 +
$m["id"] = $m[1];
 +
$m["day"] = $m[2];
 +
$m["month"] = $m[3];
 +
$m["year"] = $m[4];
 +
$m["hour"] = $m[5];
 +
$m["minute"] = $m[6];
 +
$m["desc"] = $m[7];
 +
 +
$records[$id] = $m;
 +
}
 +
 +
return $records;
 +
 
 +
}
 +
 +
// TODO: perhaps better implementation
 +
function ListRecord($n)
 +
{
 +
if(!$this->handle) return false;
 +
$m = $this->Command("LSTR $n");
 +
return $m[0];
 +
}
 +
 +
 +
 +
//TODO: Implement following commands:
 +
/*
 +
 +
 
 +
LSTT    MODT NEWT UPDT 
 +
MODC  NEWC
 +
    NEXT
 +
PUTE
 
   
 
   
var $handle;
+
*/
var $debug;
+
}
+
 
function SVDRP($server = "localhost", $port=2001, $timeout = 30, $debug = 1)
+
// Small Example
{
+
/*
$this->cfgServer = $server;
+
echo "<pr"."e>";
$this->cfgPort = $port;
+
$a = new SVDRP();
$this->cfgTimeOut = $timeout;
+
$a->Connect();
$this->debug = $debug;
+
print_r($a->Help());
$this->handle = 0;
+
print_r($a->ListChannels());
}
+
$a->GetKeys();
+
print_r($a->GetVolume());
function DebugMessage($msg)
+
print_r($a->GetDiskStat());
{
+
$a->Disconnect();
if($this->debug) echo ($msg);
+
*/
}
+
?>
+
 
function Connect()
+
 
{
+
if($this->handle) Disconnect();
+
$errno = 0;
+
$errstr = "";
+
$this->handle = fsockopen($this->cfgServer, $this->cfgPort, &$errno, &$errstr, $this->cfgTimeOut);
+
+
if(!$this->handle)
+
{
+
$this->DebugMessage("error $errno: $errstr");
+
return false;
+
}
+
+
$this->DebugMessage("handle: $this->handle<br>\n");
+
+
+
$input = fgets($this->handle,128);
+
+
if(!preg_match("/^220 /", $input) || $input == "")
+
{
+
$this->DebugMessage("wrong welcome message: '$input'<br>\n");
+
$this->Disconnect();
+
return false;
+
}
+
+
+
$this->DebugMessage("Welcome message: $input<br><br>\n");
+
+
return true;
+
}
+
+
function Command($cmd)
+
{
+
if(!$this->handle) return false;
+
+
$ret = array();
+
+
$this->DebugMessage("Kommando $cmd<br><pr"."e>");
+
fputs($this->handle, $cmd . "\n");
+
+
while($s = fgets($this->handle,512))
+
{
+
+
                          $this->DebugMessage($s);
+
preg_match("/^(\\d{3})(.)(.*)$/", $s, $data);
+
$number = $data[1];
+
// TODO: Fehlernummer bearbeiten
+
$ret[] = $data[3];
+
  if($data[2] != "-") break;
+
+
}
+
$this->DebugMessage("</p"."re>");
+
return $ret;
+
}
+
+
function ListChannels($numberorname="")
+
{
+
if(!$this->handle) return false;
+
$channels = array();
+
$lines = $this->Command("LSTC$numberorname");
+
if(!$lines) return false;
+
foreach($lines as $a => $l)
+
{
+
$a = split(":", $l);
+
$name = $a[0];
+
$freq = $a[1];
+
$b = split(";", $name);
+
$name = $b[0];
+
if(!isset($b[1])) $b[1] = $name;
+
$group = $b[1];
+
+
+
$c["name"] = $name;
+
$c["group"] = $group;
+
$c["frequency"] = $freq;
+
+
$channels[] = $c;
+
+
+
}
+
return $channels;
+
}
+
+
function Help()
+
{
+
return $this->Command("HELP");
+
}
+
function Disconnect()
+
{
+
if(!$this->handle) return;
+
$this->Command("quit");
+
+
fclose($this->handle);
+
$this->handle = 0;
+
$this->DebugMessage("disconnected");
+
}
+
}
+
+
// Small Example
+
$a = new SVDRP();
+
$a->Connect();
+
print_r($a->Help());
+
print_r($a->ListChannels());
+
$a->Disconnect();
+
?>
+
 
</pre>
 
</pre>
  
 
[[Kategorie:svdrp-anwendungen]]
 
[[Kategorie:svdrp-anwendungen]]

Aktuelle Version vom 5. März 2011, 12:09 Uhr

<?php
 
// SVDRP is a class do communicate with a vdr via svdrp
class SVDRP
{
	var $cfgServer;
	var $cfgPort; 
	var $cfgTimeOut;

	var $handle;
	var $debug;
	
	function SVDRP($server = "localhost", $port=2001, $timeout = 30, $debug = 0)
	{	
		$this->cfgServer = $server;
		$this->cfgPort = $port;
		$this->cfgTimeOut = $timeout;	
		$this->debug = $debug;
		$this->handle = 0;
	} 	

	function DebugMessage($msg)
	{
		if($this->debug) echo ($msg);
	}

	function Connect()
	{
		if($this->handle) Disconnect();
		$errno = 0;
		$errstr = "";
		$this->handle = fsockopen($this->cfgServer, $this->cfgPort, &$errno, &$errstr, $this->cfgTimeOut);

		if(!$this->handle)
		{
			$this->DebugMessage("error $errno: $errstr");
			return false;
		}
		
		$this->DebugMessage("handle: $this->handle<br>\n");

		
		$input = fgets($this->handle,128);
		
		if(!preg_match("/^220 /", $input) || $input == "")
		{
			$this->DebugMessage("wrong welcome message: '$input'<br>\n");
			$this->Disconnect();
			return false;
		}
		
		
		$this->DebugMessage("Welcome message: $input<br><br>\n");
		
		return true;
	}

	function Command($cmd)
	{
		if(!$this->handle) return false;
		
		$ret = array();
		
		$this->DebugMessage("Kommando $cmd<br><pr"."e>");
		fputs($this->handle, $cmd . "\n");
		$s = "";
		$nline = 0;
		while($s .= fgets($this->handle,2048))
		{
			$nline++;
			 
                         $this->DebugMessage($s);
			 if(!preg_match("/^(\\d{3})([ -])(.*)$/", $s, $data))
			 {
			 	continue;
			 }
			 
			 
			 	
			 
			 $number = $data[1];
			 // TODO: Fehlernummer bearbeiten
			 $ret[] = $data[3];
			 if($data[2] != "-" && $nline == 1) $ret =  $data[3] ;
 			 if($data[2] != "-") break; 
			 $s = "";
			 
		}
		
		$this->DebugMessage("</pr"."e>");
		return $ret;
	}

	function ListChannels($numberorname="")
	{
		if(!$this->handle) return false;
		$channels = array();	
		$lines = $this->Command("LSTC$numberorname");
		if(!$lines) return false;
		foreach($lines as $a => $l)
		{
			$a = split(":", $l);
			$name = $a[0];
			$freq = $a[1];
			$b = split(";", $name);
			$name = $b[0];
			if(!isset($b[1])) $b[1] = $name;
			$group = $b[1];

			
			$c["name"] = $name;
			$c["group"] = $group;
			$c["frequency"] = $freq;
	
			$channels[] = $c;
		
			
		}
		return $channels;
	}
	
	function Help()
	{
		return $this->Command("HELP");
	}
	function Disconnect()
	{
		if(!$this->handle) return;
		$this->Command("QUIT");
		
		fclose($this->handle);
		$this->handle = 0;
		$this->DebugMessage("disconnected");
	}
	function ClearEpg()
	{
		if(!$this->handle) return false;
		$this->Command("CLRE");
		return true;
	}
	function SwitchUp()
	{
		if(!$this->handle) return false;
		$this->Command("CHAN +");
		return true;
	}
	function SwitchDown()
	{
		if(!$this->handle) return false;
		$this->Command("CHAN -");
		return true;
	}
	function SwitchChannel($channel)
	{
		if(!$this->handle) return false;
		$this->Command("CHAN $channel");
		return true;
	}
	function DeleteChannel($id)
	{
		if(!$this->handle) return false;
		$this->Command("DELC $id");
		return true;
	}
	function DeleteRecord($id)
	{
		if(!$this->handle) return false;
		$this->Command("DELR $id");
		return true;
	}
	
	function GrabImage($filename, $type="jpeg", $quality="", $width="", $height)
	{
		if(!$this->handle) return false;
		$this->Command("GRAB $filename $type $quality $width $height");
		return true;
	}
	function HitKey($key)
	{
		if(!$this->handle) return false;
		$this->Command("HITK $key");
		return true;
	}
	function PowerOff()
	{	
		if(!$this->handle) return false;
		$this->Command("HITK Power");
		return true;
	
	}
	function GetKeys()
	{
		if(!$this->handle) return false;

		$lines = $this->Command("HITK");
		$keys = array();
		foreach($lines as $l)
		{
			if(!preg_match("/^ {4}(.*)$/", $l, $m)) continue;
			$keys[] = $m[1];
		}
		
		return $keys;
	}
	function ListEPG($pStrChannel="", $pStrTime="")
	{
		if(!$this->handle) return false;
		$lines = $this->Command("LSTE");

		$epg = array ();
		$channel = array();
		$event = array();

		$channelname = "";
		foreach($lines as $l)
		{
			preg_match("/^(.)\\s*(.*)$/", $l, $m);
			$type = $m[1];
			$text = $m[2];
			switch($type)
			{
			case 'C': // Channel
				list( $channeldata, $channelname ) = explode( ' ', $text, 2 );
				
				break;
			case 'E': // new Event
				sscanf($text, "%u %ld %d %X", $event["EventID"], $event["StartTime"], $event["Duration"], $event["TableID"]);
								
				break;
			case 'T': // Title
				$event["Title"] = $text;
				break;
			case 'S': // Short text
				$event["Shottext"] = $text;
				break;
			case 'D': // Description
				$event["Desc"] = $text;
				break;
			case 'V': // VPS
				$event["VPS"] = $text;
				break;
			case 'e': // Event end
				if ((trim($pStrTime) != '') && (( $event['StartTime'] > $pStrTime ) || ($event['StartTime'] + $event["Duration"] < $pStrTime)))
					continue;

				$channel[] = $event;
				$event = array();
				 
				break;
			case 'c': // Channel end
				if ((trim($pStrChannel) != '') && ($channelname != $pStrChannel))
					continue;

				$epg[$channelname] = $channel;
				$channel = array();
				
				break;
			}

		}
		if ((trim($pStrTime) == '') || (( $event['StartTime'] < $pStrTime ) && ($event['StartTime'] + $event["Duration"] > $pStrTime)))
			$channel[] = $event;
		 
		if ((trim($pStrChannel) != '') || ($channelname == $pStrChannel))
			$epg[$channelname] = $channel;

		return $epg;
	}

	function Message($msg)
	{
		if(!$this->handle) return false;
		$this->Command("MESG $msg");
		return true;
	}

	
	// Volume commands
	function ToggleMute()
	{
		if(!$this->handle) return false;
		$this->Command("VOLU mute");
		return true;
	}
	function VolumeUp()
	{
		if(!$this->handle) return false;
		$this->Command("VOLU +");
		return true;
	}
	function VolumeDown()
	{
		if(!$this->handle) return false;
		$this->Command("VOLU -");
		return true;
	}
	function SetVolume($v)
	{
		if(!$this->handle) return false;
		$this->Command("VOLU $v");
		return true;
	}
	function GetVolume()
	{
		if(!$this->handle) return false;
		$v = $this->Command("VOLU");
		if($v == "Audio is mute") return 0;
		if(!preg_match("/Audio volume is (.*)/", $v, $m)) return false;
		
		return $m[1];
	}
	function GetDiskStat()
	{
		if(!$this->handle) return false;
		$stat = $this->Command("STAT DISK");
		sscanf($stat, "%dMB %dMB %d%%", $FreeMUsedMB, $FreeMB, $Percent); 
		$ret["FreeMB + UsedMB"] = $FreeMUsedMB;
		$ret["FreeMB"] = $FreeMB;
		$ret["UsedMB"] = $FreeMUsedMB - $FreeMB;
		$ret["Percent"] = $Percent;
		return $ret;
	}
	function StartScan()
	{
		if(!$this->handle) return false;
		$this->Command("SCAN");
		return true;
	}
	function MoveChannel($number, $to)
	{
		if(!$this->handle) return false;
		$this->Command("MOVC $number $to");
		return true;
		
	}
	
	function DeleteTimer($id)
	{
		if(!$this->handle) return false;
		$this->Command("DELT $id");
		return true;
	}
	
	function MoveTimer($number, $to)
	{
		if(!$this->handle) return false;
		$this->Command("MOVT $number $to");
		return true;
	}
	
	function TimerOnOff($n, $state = "on")
	{
		if(!$this->handle) return false;
		//if($state == "1") $state = "on";
		//if($state == "0") $state = "off";
		//if($state == false) $state = "off";
		// if($state == true) $state = "on";
		switch($state)
		{
		case false:
		case "off":
		case "0":
		$state = "off";
		break;
		default:
		$state = "on";
		break;
		}
		
		return $this->Command("MODT $n $state");
	}	
	
	function ListTimers()
	{
		
	}
	
	function ShowMessage($msg = "")
	{
		if(!$this->handle) return false;
		return $this->Command("MESG $msg");
	}	
	
	function ListRecords()
	{
		if(!$this->handle) return false;
		
		$lines = $this->Command("LSTR");
		$records = array();
		foreach($lines as $l)
		{
		
			if(!preg_match("/^(\\d)\s(\\d*)\\.(\\d*)\\.(\\d*) (\\d*)\\:(\\d*).\s(.*)$/", $l, $m)) continue;
			$id = $m[1];
			$m["id"] 		= $m[1];
			$m["day"] 		= $m[2];
			$m["month"] 	= $m[3];
			$m["year"] 		= $m[4];
			$m["hour"] 		= $m[5];
			$m["minute"] 	= $m[6];
			$m["desc"] 		= $m[7];
			
			$records[$id] = $m;
		}
		
		return $records;

	}
	
	// TODO: perhaps better implementation
	function ListRecord($n)
	{
		if(!$this->handle) return false;
		$m = $this->Command("LSTR $n");
		return $m[0];
	}	
	
	
	
	//TODO: Implement following commands:
	/*
	
	  
	LSTT    MODT 	NEWT UPDT   
	MODC  NEWC
	    NEXT
	PUTE 
 
	*/
}

// Small Example
/*
echo "<pr"."e>";
$a = new SVDRP();
$a->Connect();
print_r($a->Help());
print_r($a->ListChannels());
$a->GetKeys();
print_r($a->GetVolume());
print_r($a->GetDiskStat());
$a->Disconnect();
*/
?>