Ja nå har jeg lagt til det siste touchet på en måte på klassen itreeclient. Ikke så store forandringer fra sist. Det jeg har gjort er å fjerne funksjonen itreeSendRq(...) og så initiailsere alt i __construct(...), med de nødvendige parameterne. Det var egentlig det jeg hadde tenkt på fra begynnelsen av men så er det en bug som jeg ikke klarte å finne. Men "bøggen" hvis man kan kalle det det går på at jeg ikke kan sende noen requests lokalt på maskina. Hele daemonen blir stoppet. Den burde forsvidt takle NULL-verdier eller hva det nå enn er den ikke takler men tror problemet ligger i det at den ikke får de parameterne den skal ha når jeg bruker funksjonen "fsockopen( )" lokalt. Skal se på det senere.

Iallefall: De fleste funksjoner og data er blitt private. Det er bare en måte å få data på, og det er gjennom medlems-funksjonen getData( ). Det er jo greit. Har planer om la den få en eller flere parametere slik at du kan få dataen ut i forskjellige formater. F.eks:

  1. uformatert(som en lang streng)
  2. formatert(streng i 2 dimensjoner)
  3. skrive ut i tabell med css-klasse som en parameter

Disse 3 variantene er mest relevant. Kan ikke se akkurat her og nå at noe annet skal være relevant.

Iallefall. Her er klassen: Nyeste variant:

 

<?php
/**
 * Documentation, License etc.
 *
 * @package itreeclient
 */

error_reporting(E_ALL);
function MAKEULONG($a, $b, $c, $d)
{
	return (($a<<24) | ($b<<16) | ($c<<8) | $d);
}
function BYTE32($dw)
{
	return (($dw & 0xFF000000)>>24);
}
function BYTE24($dw)
{
	return (($dw & 0x00FF0000)>>16);
}
function BYTE16($dw)
{
	return (($dw & 0x0000FF00)>>8);
}
function BYTE8($dw)
{
	return ($dw & 0x000000FF);
}


class itreeClient
{
  //user input
  private $request;
  //string sent to server as a request
  private $data_request;
  //name of the data-tree we want to search.
  private $data_tree;
  private $received_data;
  private $hsocket;
  
  private function writeIData()
  {
	  $CMDIT_DATA_GET = 0x01;
	  $DT_STRING = 0x01;
	  $index = 0;
	  
	  $buf_size = strlen($this->data_request)+1;
	  //pack data into binary/hex-values."C7"=>unsigned char		
	  $data = pack("C7",$CMDIT_DATA_GET, $DT_STRING, BYTE32($buf_size),BYTE24($buf_size),BYTE16($buf_size),BYTE8($buf_size),$index);

	  $n = fwrite($this->hsocket, $data);
	  if(!$n)
	  {
		  echo "First write failed(writeIData). Data: ".$data."...var_dump: ".var_dump($n)."\n";
		  return 0;
	  }
	  else 
	  { //echo "writeIData(data_request):".$this->data_request."\n"; 
		  $str = $this->data_request;
		  $n = fwrite($this->hsocket, $str);
		  if(!$n)
		  {
			  echo "Second write failed(writeIData). Data: $this->data_request...var_dump: ".var_dump($n)."\n";
			  return 0;
		  }
	  }
	  return 1;
  }
  private function readIData()
  {
	  $n = fread($this->hsocket, 7);
	  if(!$n)
	  {
		  "Reading of header-data failed...exiting: var_dump: ".var_dump($n)."\n";
		  return NULL;
	  }
	  else
	  {
		  $pd = unpack('C7', $n);//unpack the header-package	
		  //get first value
		  $response_type = $pd[1];
		  //get second value
		  $data_type = $pd[2];
		  //get ulong value-parts
		  $data_index = $pd[7];
		  $buf_size = MAKEULONG($pd[3],$pd[4],$pd[5],$pd[6]);
		  $itree_data = fread($this->hsocket, $buf_size+4);
		  
		  if(!$itree_data)
		  {
			  echo "Second read failed in readIData...buf_size: $buf_size, var_dump(n): ".var_dump($itree_data)." \n";
			  return NULL;
		  }
		  
	  }//for some reason I'm getting 1 byte more than I ask for at the begining of the data-buffer.
	  //remove it for now..
	  return substr_replace($itree_data, NULL, 0, 1);	
  }
  //constructor..setting most important stuff.
  function __construct($ip, $port, $searchterm=NULL)
  {
    $this->data_tree = "then";
    $this->request = $searchterm;
    if($this->request === NULL)
    {
	    echo "Error: No point in sending NULL. Exiting script.";
	    return NULL;
    }
    $this->data_request = $this->data_tree."&".$this->request."\0";
//    echo $this->data_request;
    $this->hsocket = fsockopen($ip, $port, $errno, $errstr);
    if($this->hsocket === FALSE)
    {
	    echo "Opening socket failed.\n";
	    echo "errno: $errno\n";
	    echo "error_str: $errstr\nExiting with return-value 1";
	    return NULL;
    }	
    if($this->writeIData() === NULL)
    {
	    echo "writeIData returned NULL...exiting";
	    stream_socket_shutdown($this->hsocket, STREAM_SHUT_RDWR);
	    return NULL;
    }
    $this->received_data = $this->readIData();
    if($this->received_data === NULL)
    {
	    echo "readIData returned NULL...exiting";
	    stream_socket_shutdown($this->hsocket, STREAM_SHUT_RDWR);
	    return NULL;
    }
    //echo "Received data:\n".$received_data."\n";
    stream_socket_shutdown($this->hsocket, STREAM_SHUT_RDWR);
  }
 
  public function GetData()
  {
    return $this->received_data;
  }
};

Og her er et eksempel brukt i index.php på nettsiden på hvordan man kan bruke det:

 

include_once("itreeclient.php");
$obj = new itreeClient('84.xx.xx.xx', $portnumber,$searchterm);
$rdata = $obj->GetData();