00001 <?php
00002
00007 class ZhClient {
00008 var $mHost, $mPort, $mFP, $mConnected;
00009
00015 function ZhClient($host, $port) {
00016 $this->mHost = $host;
00017 $this->mPort = $port;
00018 $this->mConnected = $this->connect();
00019 }
00020
00024 function isconnected() {
00025 return $this->mConnected;
00026 }
00027
00033 function connect() {
00034 wfSuppressWarnings();
00035 $errno = $errstr = '';
00036 $this->mFP = fsockopen($this->mHost, $this->mPort, $errno, $errstr, 30);
00037 wfRestoreWarnings();
00038 if(!$this->mFP) {
00039 return false;
00040 }
00041 return true;
00042 }
00043
00049 function query($request) {
00050 if(!$this->mConnected)
00051 return false;
00052
00053 fwrite($this->mFP, $request);
00054
00055 $result=fgets($this->mFP, 1024);
00056
00057 list($status, $len) = explode(" ", $result);
00058 if($status == 'ERROR') {
00059
00060 print "zhdaemon error $len<br />\n";
00061 return false;
00062 }
00063 $bytesread=0;
00064 $data='';
00065 while(!feof($this->mFP) && $bytesread<$len) {
00066 $str= fread($this->mFP, $len-$bytesread);
00067 $bytesread += strlen($str);
00068 $data .= $str;
00069 }
00070
00071 if(strlen($data) != $len)
00072 return false;
00073 return $data;
00074 }
00075
00083 function convert($text, $tolang) {
00084 $len = strlen($text);
00085 $q = "CONV $tolang $len\n$text";
00086 $result = $this->query($q);
00087 if(!$result)
00088 $result = $text;
00089 return $result;
00090 }
00091
00098 function convertToAllVariants($text) {
00099 $len = strlen($text);
00100 $q = "CONV ALL $len\n$text";
00101 $result = $this->query($q);
00102 if(!$result)
00103 return false;
00104 list($infoline, $data) = explode('|', $result, 2);
00105 $info = explode(";", $infoline);
00106 $ret = array();
00107 $i=0;
00108 foreach($info as $variant) {
00109 list($code, $len) = explode(' ', $variant);
00110 $ret[strtolower($code)] = substr($data, $i, $len);
00111 $i+=$len;
00112 }
00113 return $ret;
00114 }
00121 function segment($text) {
00122 $len = strlen($text);
00123 $q = "SEG $len\n$text";
00124 $result = $this->query($q);
00125 if(!$result) {
00126 $result = ZhClientFake::segment($text);
00127 }
00128 return $result;
00129 }
00130
00134 function close() {
00135 fclose($this->mFP);
00136 }
00137 }