gnu-social/plugins/Aim/extlib/phptoclib/dconnection.php
2010-01-27 13:48:35 -05:00

230 lines
4.7 KiB
PHP
Executable File

<?php
//The following class was created June 30th 2004 by Jeremy(pickle)
//This class is designed to handle a direct connection
class Dconnect
{
var $sock;
var $lastReceived;
var $lastMessage;
var $connected;
var $cookie;
var $type=2;
var $connectedTo;
function Dconnect($ip,$port)
{
if(!$this->connect($ip,$port))
{
sEcho("Connection failed constructor");
$this->connected=false;
}
else
$this->connected=true;
$this->lastMessage="";
$this->lastReceived="";
}
function readDIM()
{
/*
if(!$this->stuffToRead())
{
sEcho("Nothing to read");
$this->lastMessage=$this->lastReceived="";
return false;
}
*/
$head=fread($this->sock,6);
if(strlen($head)<=0)
{
sEcho("The direct connection has been closed");
return false;
}
$minihead=unpack("a4ver/nsize",$head);
if($minihead['size'] <=0)
return;
$headerinfo=unpack("nchan/nsix/nzero/a6cookie/Npt1/Npt2/npt3/Nlen/Npt/npt0/ntype/Nzerom/a*sn",fread($this->sock,($minihead['size']-6)));
$allheader=array_merge($minihead,$headerinfo);
sEcho($allheader);
if($allheader['len']>0 && $allheader['len'] <= MAX_DIM_SIZE)
{
$left=$allheader['len'];
$stuff="";
$nonin=0;
while(strlen($stuff) < $allheader['len'] && $nonin<3)
{
$stuffg=fread($this->sock,$left);
if(strlen($stuffg)<0)
{
$nonin++;
continue;
}
$left=$left - strlen($stuffg);
$stuff.=$stuffg;
}
$data=unpack("a*decoded",$stuff);
}
else if($allheader['len'] > MAX_DIM_SIZE)
{
$data['decoded']="too big";
}
else
$data['decoded']="";
$all=array_merge($allheader,$data);
$this->lastReceived=$all;
$this->lastMessage=$all['decoded'];
//$function=$this->DimInf . "(\$all);";
//eval($function);
return $all;
}
function sendMessage($message,$sn)
{
//Make the "mini header"
$minihead=pack("a4n","ODC2",76);
$header=pack("nnna6NNnNNnnNa*",1,6,0,$this->cookie,0,0,0,strlen($message),0,0,96,0,$sn);
$bighead=$minihead . $header;
while(strlen($bighead)<76)
$bighead.=pack("c",0);
$tosend=$bighead . pack("a*",$message);
$w=array($this->sock);
stream_select($r=NULL,$w,$e=NULL,NULL);
//Now send it all
fputs($this->sock,$tosend,strlen($tosend));
}
function stuffToRead()
{
//$info=stream_get_meta_data($this->sock);
//sEcho($info);
$s=array($this->sock);
$changed=stream_select($s,$fds=NULL,$m=NULL,0,20000);
return ($changed>0);
}
function close()
{
$this->connected=false;
return fclose($this->sock);
}
function connect($ip,$port)
{
$this->sock=fsockopen($ip,$port,$en,$es,3);
if(!$this->sock)
{ sEcho("Connection failed");
$this->sock=null;
return false;
}
return true;
}
}
class FileSendConnect
{
var $sock;
var $lastReceived;
var $lastMessage;
var $connected;
var $cookie;
var $tpye=3;
function FileSendConnect($ip,$port)
{
if(!$this->connect($ip,$port))
{
sEcho("Connection failed constructor");
$this->connected=false;
}
else
$this->connected=true;
$this->lastMessage="";
$this->lastReceived="";
}
function readDIM()
{
if(!$this->stuffToRead())
{
sEcho("Nothing to read");
$this->lastMessage=$this->lastReceived="";
return;
}
$minihead=unpack("a4ver/nsize",fread($this->sock,6));
if($minihead['size'] <=0)
return;
$headerinfo=unpack("nchan/nsix/nzero/a6cookie/Npt1/Npt2/npt3/Nlen/Npt/npt0/ntype/Nzerom/a*sn",fread($this->sock,($minihead['size']-6)));
$allheader=array_merge($minihead,$headerinfo);
sEcho($allheader);
if($allheader['len']>0)
$data=unpack("a*decoded",fread($this->sock,$allheader['len']));
else
$data['decoded']="";
$all=array_merge($allheader,$data);
$this->lastReceived=$all;
$this->lastMessage=$all['decoded'];
//$function=$this->DimInf . "(\$all);";
//eval($function);
return $all;
}
function sendMessage($message,$sn)
{
//Make the "mini header"
$minihead=pack("a4n","ODC2",76);
$header=pack("nnna6NNnNNnnNa*",1,6,0,$this->cookie,0,0,0,strlen($message),0,0,96,0,$sn);
$bighead=$minihead . $header;
while(strlen($bighead)<76)
$bighead.=pack("c",0);
$tosend=$bighead . pack("a*",$message);
//Now send it all
fwrite($this->sock,$tosend,strlen($tosend));
}
function stuffToRead()
{
//$info=stream_get_meta_data($this->sock);
//sEcho($info);
$s=array($this->sock);
$changed=stream_select($s,$fds=NULL,$m=NULL,1);
return ($changed>0);
}
function close()
{
$this->connected=false;
fclose($this->sock);
unset($this->sock);
return true;
}
function connect($ip,$port)
{
$this->sock=fsockopen($ip,$port,$en,$es,3);
if(!$this->sock)
{ sEcho("Connection failed to" . $ip . ":" . $port);
$this->sock=null;
return false;
}
return true;
}
}