xref; //get the url from the gedcom $this->url = get_gedcom_value("URL",1,$gedrec); $this->gedfile = get_gedcom_value("_DBID", 1, $gedrec); $this->title = get_gedcom_value("TITL", 1, $gedrec); $this->username = get_gedcom_value("_USER", 2, $gedrec); $this->password = get_gedcom_value("_PASS", 2, $gedrec); $this->type = "remote"; if (empty($this->url) && empty($this->gedfile)) return null; } /** * check if the service returned an error */ static function isError($result) { if (PEAR::isError($result) || isset($result->faultcode) || isset($result->message) || get_class($result)=='SOAP_Fault') { return true; } return false; } /** * get the title of this source record * @return string */ function getTitle() { if (empty($this->title)) return i18n::translate('unknown'); return $this->title; } function getURL() { return $this->url; } /** * get the gedcom file */ function getGedfile() { return $this->gedfile; } /** * authenticate the client */ function authenticate() { if (!empty($this->SID)) return $this->SID; if (is_null($this->soapClient)) { if (!class_exists('Soap_Client') || $this->client_type=='PEAR:SOAP') { require_once './SOAP/Client.php'; // get the wsdl and cache it $wsdl = new SOAP_WSDL($this->url); //change the encoding style $this->__change_encoding($wsdl); $this->soapClient = $wsdl->getProxy(); } else { //AddtoLog("Using SOAP Extension"); //-- don't use exceptions in PHP 4 $this->soapClient = new Soap_Client($this->url, array('exceptions' => 0)); } } if ($this->soapClient!=null && !$this->isError($this->soapClient)) { $res = $this->soapClient->Authenticate($this->username, $this->password, $this->gedfile, ""); if (!is_object($res)) { return false; } if (!isset($res->SID)) { return false; } $this->SID = $res->SID; return $this->SID; } else { addToLog("Unable to generate web service proxy from WSDL. ".print_r($this->soapClient, true)); return false; } } /** * Get a record from the remote site * @param string $remoteid the id of the record to get */ function getRemoteRecord($remoteid) { if (!is_object($this->soapClient)) $this->authenticate(); if (!is_object($this->soapClient)||$this->isError($this->soapClient)) return false; $rec = $this->soapClient->getGedcomRecord($this->SID, $remoteid); if (is_string($rec)) { $rec = preg_replace("/@([^#@\s]+)@/", "@".$this->xref.":$1@", $rec); return $rec; } else { return ""; } } /** * get the title for this service * @return string */ function getServiceTitle() { if (!empty($this->title)) return $this->title; $this->authenticate(); $info = $this->soapClient->ServiceInfo(); //print_r($info); foreach($info->gedcoms as $ind=>$gedobj) { if ($gedobj->ID==$this->gedfile) break; } $this->title = $gedobj->title; return $this->title; } /** * Merge people together. */ function _merge($record1, $record2) { // Returns second record if first is empty, no merge needed if (empty($record1)) return $record2; // Returns first record if second is empty, no merge needed if (empty($record2)) return $record1; $remoterecs = get_all_subrecords($record2, "", false, false); $localrecs = get_all_subrecords($record1, "", false, false); $newrecs = array(); //-- make sure we don't get circular links foreach($remoterecs as $ind2=>$subrec2) { if (strpos($subrec2, "1 RFN")===false) { $newrecs[] = $subrec2; } } foreach($localrecs as $ind=>$subrec) { $found = false; if (strpos($subrec, "1 CHAN")===false) { $subrec = trim($subrec); $orig_subrec = $subrec; $subrec = preg_replace("/\s+/", " ", $subrec); foreach($remoterecs as $ind2=>$subrec2) { $subrec2 = trim($subrec2); $subrec2 = preg_replace("/\s+/", " ", $subrec2); if ($subrec2 == $subrec) { $found = true; break; } } } else { $found = true; } if (!$found) { $newrecs[] = $orig_subrec; } } //-- start with the first line from the local record $pos1 = strpos($record1, "\n1"); if ($pos1!==false) $localrec = substr($record1, 0, $pos1+1); else $localrec = $record1; //-- update the type of the remote record $ct = preg_match("/0 @(.*)@ (\w*)/", $record2, $match); if ($ct>0) $localrec = preg_replace("/0 @(.*)@ (\w*)/", "0 @$1@ ".trim($match[2]), $localrec); //-- add all of the new records foreach($newrecs as $ind=>$subrec) { $localrec .= trim($subrec)."\n"; } $localrec = trim($localrec); //print "[
$localrec
]"; // Update the last change time $pos1 = strpos($localrec, "1 CHAN"); if ($pos1!==false) { $pos2 = strpos($localrec, "\n1", $pos1+4); if ($pos2===false) $pos2 = strlen($localrec); $newgedrec = substr($localrec, 0, $pos1); $newgedrec .= "1 CHAN\n2 DATE ".date("d M Y")."\n"; $newgedrec .= "3 TIME ".date("H:i:s")."\n"; $newgedrec .= "2 _WT_USER @".$this->xref."@\n"; $newgedrec .= trim(substr($localrec, $pos2+1)); $localrec = $newgedrec; } else { $newgedrec = "\n1 CHAN\n2 DATE ".date("d M Y")."\n"; $newgedrec .= "3 TIME ".date("H:i:s")."\n"; $newgedrec .= "2 _WT_USER @".$this->xref."@"; $localrec .= $newgedrec; } //print "merged record is ".$localrec; return $localrec; } /** * Updates Family Records such as children, spouse, and parents */ function UpdateFamily($record1,$record2){ // This makes sure there is a record in both the server and client else it returns the record that // exist if any if (empty($record1)) { return $record2; } elseif (empty($record2)) { return $record1; } $this->authenticate(); //this makes sure that the person is the one that was clicked so that this methade is not called more then ti needs to be $ct = preg_match("/0 @(.*)@ (.*)/", $record1, $match); $personId1=null; if ($ct>0) { $personId1 = $match[1]; $type1 = trim($match[2]); if ($type1!="INDI"){ return $record1; } } $ct = preg_match("/0 @(.*)@ (.*)/", $record2, $match); if ($ct>0) { $personId2 = $match[1]; $type2 = trim($match[2]); if ($type2!="INDI"){ return $record1; } } //-- remove all remote family links added in _merge() so that we can add them back in if we need to $record1 = preg_replace("/\d FAM[SC] @".$this->xref.":[\w\d]+@\r?\n/", "", $record1); //debug_print_backtrace(); // holds the arrays of the current individual Familys $List1FamilyChildID = find_families_in_record($record1, "FAMC"); $List2FamilyChildID = find_families_in_record($record2, "FAMC"); $List1FamilySpouseID = find_families_in_record($record1, "FAMS"); $List2FamilySpouseID = find_families_in_record($record2, "FAMS"); $FamilyListSpouse = array(); $FamilyListChild = array(); // bools used to make sure the same children and/or familys are not counted more then twice $firstTimeFamily=true; // starting the comparisons for family as child if(empty($List1FamilyChildID)){ //-- add all remote ids foreach($List2FamilyChildID as $famc=>$famCild2){ $FamilyListChild[] = $famCild2; } } elseif(empty($List2FamilyChildID)){ //-- nothing to do if there are no remote families } else { // Creating the first family foreach($List1FamilyChildID as $famc=>$famCild1){ if(!empty($famCild1)){ // Creating the Secound Family foreach($List2FamilyChildID as $famc=>$famCild2){ if(!empty($famCild2)){ if(!$this->CompairForUpdateFamily($famCild1,$famCild2)){ if($firstTimeFamily){ $FamilyListChild[] = $famCild2; } } else { $this->MergeForUpdateFamily($famCild1,$famCild2,$FamilyListChild,$FamilyListChild); } } } } } } // starting the comparisons for family as spouse if(empty($List1FamilySpouseID)){ //-- add all remote ids foreach($List2FamilySpouseID as $fams=>$famSpouse2){ if(!empty($famSpouse2)){ $FamilyListSpouse[] = $famSpouse2; } } } elseif(empty($List2FamilySpouseID)){ //-- don't do anything if there are no remote families } else { // Creating the first family foreach($List1FamilySpouseID as $fams=>$famSpouse1){ if(!empty($famSpouse1)){ // Creating the Secound Family foreach($List2FamilySpouseID as $fams=>$famSpouse2){ if(!empty($famSpouse2)){ if(!$this->CompairForUpdateFamily($famSpouse1,$famSpouse2)){ if($firstTimeFamily){ $FamilyListSpouse[] = $famSpouse2; } } else { $this->MergeForUpdateFamily($famSpouse1,$famSpouse2,$FamilyListSpouse,$FamilyListSpouse); } } } } } } // This Adds any new familys to the person. if (count($FamilyListChild)>0){ for ($i=0;$ixref)!==0) $record1 .= $this->xref.":"; $record1 .= $FamilyListChild[$i]."@"; } } if(count($FamilyListSpouse)>0){ for($i=0;$ixref)!==0) $record1 .= $this->xref.":"; $record1 .= $FamilyListSpouse[$i]."@"; } } return $record1; } /** * This mergest the the two familys together */ function MergeForUpdateFamily($Family1,$Family2,$Familylist,&$FamilyListReturn){ global $GEDCOM; require_once WT_ROOT.'includes/functions/functions_edit.php'; //print "
In MergeForUpdateFamily ".$Family1." ".$Family2; //print_r($Familylist); $FamilyListReturn=$Familylist; $famrec1 = find_gedcom_record($Family1, get_id_from_gedcom($GEDCOM), true); $ct = preg_match("/(\w+):(.+)/", $Family2, $match); if ($ct>0) { $servid = trim($match[1]); $remoteid = trim($match[2]); $famrec2 = $this->getRemoteRecord($remoteid); } else { return $famrec1; } // Creating the familys from the xref $family1 = Family::getInstance($Family1); $family2 = new Family($famrec2); // Creat the fathers if their is some $father1 = $family1->getHusband(); $father2 = $family2->getHusband(); // Creat the mothers if their is some $mother1=$family1->getWife(); $mother2=$family2->getWife(); // Creat an array of Children $children1=$family1->getChildren(); $children2=$family2->getChildren(); if(count($FamilyListReturn)>0){ // removes the updated family from the list so it does not get added later. $index=null; for($i=0; $i$Child2){ if(!empty($Child2)) { //print "
child 2 Xref ".$Child2->getXref()."-".$childID2; $found = false; //-- compare to children in local family foreach($children1 as $childID1=>$Child1){ if(!empty($Child1)){ //print "
child 2 Xref ".$Child2->getXref()." == ".$Child1->getXref(); $found=$this->ComparePeople($Child1,$Child2); if ($found) break; } } if($found){ $childrec = $Child1->getGedcomRecord(); if (strpos($childrec, "1 RFN ".$this->xref.":")===false) { $childrec .= "\n1 RFN ".$Child2->getXref(); //print "
repalcing for child ".$Child1->getXref(); replace_gedrec($Child1->getXref(), WT_GED_ID, $childrec); $this->setSameId($Child1->getXref(), $Child2->getXref()); } } else { $famupdated = true; $famrec1 .="\n1 CHIL @".$Child2->getXref()."@"; //print "
adding for child ".$Child2->getXref(); } } } } //-- update the family record if (strpos($famrec1, "1 RFN ".$this->xref.":")===false) { $famrec1 .= "\n1 RFN ".$family2->getXref(); $famupdated = true; } if ($famupdated) { //print "
updating family record ".$family1->getXref(); replace_gedrec($family1->getXref(), WT_GED_ID, $famrec1); } // Merge Father basicly they just add the rfn numer and let the merge handle it latter if(empty($father1)){ if(!empty($father2)){ $father1=$father2; $famrec1 .="\n1 HUSB @".$father1->getXref()."@"; //print "
adding for fahter ".$father1->getXref(); replace_gedrec($family1->getXref(), WT_GED_ID, $famrec1); } } elseif(!empty($father2)){ if($this->ComparePeople($father1,$father2)){ $fatherrec = $father1->getGedcomRecord(); if (strpos($fatherrec, "1 RFN ".$this->xref.":")===false) { $fatherrec .= "\n1 RFN ".$father2->getXref(); //print "
repalcing for father ".$father1->getXref(); replace_gedrec($father1->getXref(), WT_GED_ID, $fatherrec); $this->setSameId($father1->getXref(), $father2->getXref()); } } } // Merge Mother if(empty($mother1)){ if(!empty($mother2)){ $mother1=$mother2; $famrec1 .="\n1 WIFE @".$mother1->getXref()."@"; //print "
adding for mother ".$mother1->getXref(); replace_gedrec($family1->getXref(), WT_GED_ID, $famrec1); } } else if(!empty($mother2)){ if($this->ComparePeople($mother1,$mother2)){ $motherrec = $mother1->getGedcomRecord(); if (strpos($motherrec, "1 RFN ".$this->xref.":")===false) { $motherrec .= "\n1 RFN ".$mother2->getXref(); //print "
repalcing for mother ".$mother1->getXref(); replace_gedrec($mother1->getXref(), WT_GED_ID, $motherrec); $this->setSameId($mother1->getXref(), $mother2->getXref()); } } } $this->setSameId($Family1, $Family2); } /** * Compairs familys and then returns true if the have 50% or more chance of being the same family. * Other wise it returns false. */ function CompairForUpdateFamily($family1,$family2) { global $GEDCOM; // Values used to calculate the Percent of likley hood that the family is the same. $ChanceSameFamily=0.0; $CountFamily1=0.0; $CountFamily2=0.0; $ChanceSame=0.0; $firstTimeChildren=true; $famrec1 = find_family_record($family1, get_id_from_gedcom($GEDCOM)); $ct = preg_match("/(\w+):(.+)/", $family2, $match); if ($ct>0) { $servid = trim($match[1]); $remoteid = trim($match[2]); $famrec2 = $this->getRemoteRecord($remoteid); } else return false; $family1 = Family::getInstance($family1); if (is_null($family1)) return false; $family2 = new Family($famrec2); if (!is_null($family1)) { // Creat the fathers if their is some $father1 = $family1->getHusband(); $CountFamily1+=1.0; $mother1=$family1->getWife(); $CountFamily1+=1.0; } $father2 = $family2->getHusband(); $CountFamily2+=1.0; if(empty($father1)){ unset($father1); $CountFamily1-=1.0; } if(empty($father2)){ unset($father2); $CountFamily2-=1.0; } // Creat the mothers if their is some $mother2=$family2->getWife(); $CountFamily2+=1.0; if(empty($mother1)){ unset($mother1); $CountFamily1-=1.0; } if(empty($mother2)){ unset($mother2); $CountFamily2-=1.0; } // Creat an array of Children $children1=$family1->getChildren(); $children2=$family2->getChildren(); // finds the probablity that they are the same family Bassed of both sites information $CountFamily1 += count($children1); $CountFamily2 += count($children2); foreach($children1 as $childID1=>$Person1){ if (!empty($Person1)) { foreach($children2 as $childID2=>$Person2){ if(!empty($Person2)){ if($this->ComparePeople($Person1,$Person2)){ $ChanceSameFamily+=1.0; //print "
".$Person1->getXref()." equals ".$Person2->getXref(); break; } } } } } if(empty($father1)) { } elseif(empty($father2)){ } else { if($this->ComparePeople($father1,$father2)){ $ChanceSameFamily+=1.0; } } if(empty($mother1)) { } elseif(empty($mother2)) { } else { if($this->ComparePeople($mother1,$mother2)){ $ChanceSameFamily+=1.0; } } if($CountFamily1!=0&&$CountFamily2!=0){ $ChanceSame=(($ChanceSameFamily/$CountFamily1)+($ChanceSameFamily/$CountFamily2))/2; //print "
chancesame=".$ChanceSameFamily." count1=".$CountFamily1." count2=".$CountFamily2." ".$family1->getXref()." compared to ".$family2->getXref()." is ".$ChanceSame; } else return false; if($ChanceSame<0.5){ // If the probabilty is less then 0.5 or 50% then the current family is stored here to be added later return false; } else { return true; } } /** * set two ids in the same person * @param string $local The local id * @param string $remote the remote id that matches the $local id */ static function setSameId($local, $remote) { global $GEDCOM; if ($local == $remote) { debug_print_backtrace(); return; } //-- check if the link already exists $gid=get_remote_id($remote); if (empty($gid)) { WT_DB::prepare("INSERT INTO `##remotelinks` (r_gid, r_linkid, r_file) VALUES (? ,? ,?)") ->execute(array($local, $remote, get_id_from_gedcom($GEDCOM))); } } /** * Compares to see if two people are the same, and it returns true if they are, but * false if they are not. It only compares the name, sex birthdate, and deathdate * of the person */ static function ComparePeople(&$Person1,&$Person2){ $PersonName1=$Person1->getFullName(); $PersonSex1=$Person1->getSex(); $PersonBirth1=$Person1->getEstimatedBirthDate(); $PersonDeath1=$Person1->getEstimatedDeathDate(); $PersonName2=$Person2->getFullName(); $PersonSex2=$Person2->getSex(); $PersonBirth2=$Person2->getEstimatedBirthDate(); $PersonDeath2=$Person2->getEstimatedDeathDate(); $count=0; $Probability=0; if (!empty($PersonName1)&&!empty($PersonName2)){ $lev = levenshtein(utf8_strtolower($PersonName1), utf8_strtolower($PersonName2)); if($lev<4){ $Probability+=2; } else $Probability-=2; $count+=2; } $sex_prob=array('UU'=>0, 'UF'=>0, 'UM'=>0, 'MU'=>0, 'FU'=>0, 'MM'=>1, 'FF'=>1,'MF'=>-2, 'FM'=>-2); $Probability+=$sex_prob[$PersonSex1.$PersonSex2]; $count++; if ($PersonBirth1->isOK() && $PersonBirth2->isOK()) { $diff=abs($PersonBirth1->JD() - $PersonBirth2->JD()); if ($diff==0) { $Probability+=2; } elseif ($diff<366) { $Probability+=1; } else { $Probability-=1; } $count++; } if ($PersonDeath1->isOK() && $PersonDeath2->isOK()) { $diff=abs($PersonDeath1->JD() - $PersonDeath2->JD()); if ($diff==0) { $Probability+=2; } elseif ($diff<366) { $Probability+=1; } else { $Probability-=1; } $count++; } $prob=$Probability/$count; if($prob<0.5){ return false; } else { return true; } } /** * check if any there are any stub records with RFN tags that match the * ids in the gedcom record * @param string $gedrec * @return string */ function checkIds($gedrec) { $ids_checked = array(); $ct = preg_match_all("/@(".$this->xref.":.*)@/", $gedrec, $match, PREG_SET_ORDER); for($i=0; $i<$ct; $i++) { $id = trim($match[$i][1]); if (isset($ids_checked[$id])) continue; $ids_checked[$id]=true; $gid=get_remote_id($id); if ($gid) $gedrec = str_replace("@".$id."@", "@".$gid."@", $gedrec); } return $gedrec; } /** * merge a local gedcom record with the information from the remote site * @param string $xref the remote ID to merge with * @param string $localrec the local gedcom record to merge the remote record with * @param boolean $isStub whether or not this is a stub record * @param boolean $firstLink is this the first time this record is being linked */ function mergeGedcomRecord($xref, $localrec, $isStub=false, $firstLink=false) { global $GEDCOM; if (!$isStub) { $gedrec = find_gedcom_record($this->xref.":".$xref, get_id_from_gedcom($GEDCOM)); if (!empty($gedrec)) $localrec = $gedrec; } //-- used to force an update on the first time linking a person if ($firstLink) { $this->authenticate(); $result = $this->soapClient->getGedcomRecord($this->SID, $xref); if (PEAR::isError($result) || isset($result->faultcode) || get_class($result)=='SOAP_Fault' || is_object($result)) { if (isset($result->faultstring)) { AddToLog($result->faultstring, 'error'); print $result->faultstring; } return $localrec; } $gedrec = $result; $gedrec = preg_replace("/@([^#@\s]+)@/", "@".$this->xref.":$1@", $gedrec); $gedrec = $this->checkIds($gedrec); $localrec = $this->_merge($localrec, $gedrec); require_once WT_ROOT.'includes/functions/functions_edit.php'; $localrec = $this->UpdateFamily($localrec,$gedrec); $ct=preg_match("/0 @(.*)@/", $localrec, $match); if ($ct>0) { $pid = trim($match[1]); replace_gedrec($pid, WT_GED_ID, $localrec); } } //-- get the last change date of the record $change_date = get_gedcom_value("CHAN:DATE", 1, $localrec, '', false); if (empty($change_date)) { $this->authenticate(); if (!is_object($this->soapClient) || $this->isError($this->soapClient)) return false; $result = $this->soapClient->getGedcomRecord($this->SID, $xref); if (PEAR::isError($result) || isset($result->faultcode) || is_object($result) && get_class($result)=='SOAP_Fault') { if (isset($result->faultstring)) { AddToLog($result->faultstring, 'error'); print $result->faultstring; } return $localrec; } $gedrec = $result; $gedrec = preg_replace("/@([^#@\s]+)@/", "@".$this->xref.":$1@", $gedrec); $gedrec = $this->checkIds($gedrec); $localrec = $this->_merge($localrec, $gedrec); $ct=preg_match("/0 @(.*)@/", $localrec, $match); if ($ct>0) { $pid = trim($match[1]); if ($isStub) { require_once WT_ROOT.'includes/functions/functions_edit.php'; $localrec = $this->UpdateFamily($localrec,$gedrec); replace_gedrec($pid, WT_GED_ID, $localrec); } else { update_record($localrec, get_id_from_gedcom($GEDCOM), false); } } } else { $chan_date = new GedcomDate($change_date); $chan_time_str = get_gedcom_value("CHAN:DATE:TIME", 1, $localrec, '', false); $chan_time = parse_time($chan_time_str); $change_time = mktime($chan_time[0], $chan_time[1], $chan_time[2], $chan_date->date1->m, $chan_date->date1->d, $chan_date->date1->y); /** * @todo make the timeout a config option */ // Time Clock (determines how often a record is checked) if ($change_time < time()-(60*60*24*14)) // if the last update (to the remote individual) was made more than 14 days ago { //$change_date= "1 JAN 2000"; $this->authenticate(); if (!is_object($this->soapClient) || $this->isError($this->soapClient)) return false; $person = $this->soapClient->checkUpdatesByID($this->SID, $xref, $change_date); // If there are no changes between the local and remote copies if (PEAR::isError($person) || isset($person->faultcode) || get_class($person)=='SOAP_Fault' || isset($person->error_message_prefix)) { if (isset($person->faultstring)) AddToLog($person->faultstring, 'error'); else AddToLog($person->message, 'edit'); //-- update the last change time $pos1 = strpos($localrec, "1 CHAN"); if ($pos1!==false) { $pos2 = strpos($localrec, "\n1", $pos1+4); if ($pos2===false) $pos2 = strlen($localrec); $newgedrec = substr($localrec, 0, $pos1); $newgedrec .= "1 CHAN\n2 DATE ".date("d M Y")."\n"; $newgedrec .= "3 TIME ".date("H:i:s")."\n"; $newgedrec .= "2 _WT_USER @".$this->xref."@\n"; $newgedrec .= substr($localrec, $pos2); $localrec = $newgedrec; } else { $newgedrec = "\n1 CHAN\n2 DATE ".date("d M Y")."\n"; $newgedrec .= "3 TIME ".date("H:i:s")."\n"; $newgedrec .= "2 _WT_USER @".$this->xref."@"; $localrec .= $newgedrec; } update_record($localrec, get_id_from_gedcom($GEDCOM), false); } // If changes have been made to the remote record else { $gedrec = $person->gedcom; $gedrec = preg_replace("/@([^#@\s]+)@/", "@".$this->xref.":$1@", $gedrec); $gedrec = $this->checkIds($gedrec); $ct=preg_match("/0 @(.*)@/", $localrec, $match); if ($ct>0) { $pid = trim($match[1]); $localrec = find_gedcom_record($pid, get_id_from_gedcom($GEDCOM), true); $localrec = $this->_merge($localrec, $gedrec); if ($isStub) { require_once WT_ROOT.'includes/functions/functions_edit.php'; $localrec = $this->UpdateFamily($localrec,$gedrec); replace_gedrec($pid, WT_GED_ID, $localrec); } else { update_record($localrec, get_id_from_gedcom($GEDCOM), false); } } } } } return $localrec; } /** * get a singleton instance of the results * returned by the soapClient search method * * @param string $query - the query to search on * @param integer $start - the start index of the results to return * @param integer $max - the maximum number of results to return */ function search($query, $start=0, $max=100) { $this->authenticate(); $result = $this->soapClient->search($this->SID, $query, $start, $max); return $result; } /*** * Change encoding style to literal * used when calling a java service * * @param object $wsdl SOAP_WSDL object * @returns object modified wsdl object */ function __change_encoding(&$wsdl) { $namespace = array_keys($wsdl->bindings); if (isset($namespace[0]) && isset($wsdl->bindings[$namespace[0]]['operations'])) { $operations = array_keys($wsdl->bindings[$namespace[0]]['operations']); for($i = 0; $ibindings[$namespace[0]]['operations'][$operations[$i]]['input']['use'] = 'literal'; $wsdl->bindings[$namespace[0]]['operations'][$operations[$i]]['output']['use'] = 'literal'; } } } /** * get a singleton instance of this client * @return ServiceClient */ static function &getInstance($id) { global $WT_SERVERS, $GEDCOM; $ged_id=get_id_from_gedcom($GEDCOM); if (isset($WT_SERVERS[$id])) return $WT_SERVERS[$id]; $gedrec = find_gedcom_record($id, $ged_id, true); if (!empty($gedrec)) { $url = get_gedcom_value("URL",1,$gedrec); $gedfile = get_gedcom_value("_DBID", 1, $gedrec); if (empty($url) && empty($gedfile)) return null; if (!empty($url) && (strtolower($url)!=strtolower(WT_SERVER_NAME.WT_SCRIPT_PATH))) { $server = new ServiceClient($gedrec); } else { require_once WT_ROOT.'includes/classes/class_localclient.php'; $server = new LocalClient($gedrec); } $WT_SERVERS[$id] = $server; return $server; } return null; } } ?>