File indexing completed on 2024-05-12 17:26:17

0001 <?php
0002 
0003 /*
0004  *   TRT GFX 4.0.0
0005  * 
0006  *   support: happy.snizzo@gmail.com
0007  *   website: https://projects.kde.org/projects/playground/www/ocs-server
0008  *   credits: Claudio Desideri
0009  *   
0010  *   This software is released under the GPLv3 License.
0011  *   http://opensource.org/licenses/GPL-3.0
0012  */ 
0013 
0014 
0015 /*
0016  * Static class used as a helper for managing xml output in
0017  * order to be OCS compliant.
0018  */
0019 class OCSXML{
0020   
0021   /*
0022    * Function originally ported from reference implementation.
0023    * Useful to print server generated OCS server compliant xml.
0024    * 
0025    * Example:
0026    * 
0027      $xml['version']=EConfig::$data["ocsserver"]["version"];;
0028        $xml['website']=EConfig::$data["ocsserver"]["website"];
0029      $xml['host']=EConfig::$data["ocsserver"]["host"];;
0030      $xml['contact']=EConfig::$data["ocsserver"]["contact"];;
0031      $xml['ssl']=EConfig::$data["ocsserver"]["ssl"];;
0032      echo(OCSXML::generatexml($format,'ok',100,'',$xml,'config','',1));
0033    * 
0034    */
0035   static public function generatexml($format,$status,$statuscode,$message,$data=array(),$tag='',$tagattribute='',$dimension=-1,$itemscount='',$itemsperpage='') {
0036     if($format=='json') {
0037 
0038       $json=array();
0039       $json['status']=$status;
0040       $json['statuscode']=$statuscode;
0041       $json['message']=$message;
0042       $json['totalitems']=$itemscount;
0043       $json['itemsperpage']=$itemsperpage;
0044       $json['data']=$data;
0045       return(json_encode($json));
0046 
0047 
0048     }else{
0049       $txt='';
0050       $writer = xmlwriter_open_memory();
0051       xmlwriter_set_indent( $writer, 2 );
0052       xmlwriter_start_document($writer );
0053       xmlwriter_start_element($writer,'ocs');
0054       xmlwriter_start_element($writer,'meta');
0055       xmlwriter_write_element($writer,'status',$status);
0056       xmlwriter_write_element($writer,'statuscode',$statuscode);
0057       xmlwriter_write_element($writer,'message',$message);
0058       if($itemscount<>'') xmlwriter_write_element($writer,'totalitems',$itemscount);
0059       if(!empty($itemsperpage)) xmlwriter_write_element($writer,'itemsperpage',$itemsperpage);
0060       xmlwriter_end_element($writer);
0061       //echo($dimension);
0062       if($dimension=='0') {
0063         // 0 dimensions
0064         xmlwriter_write_element($writer,'data',$data);
0065 
0066       }elseif($dimension=='1') {
0067         xmlwriter_start_element($writer,'data');
0068         foreach($data as $key=>$entry) {
0069           xmlwriter_write_element($writer,$key,$entry);
0070         }
0071         xmlwriter_end_element($writer);
0072 
0073       }elseif($dimension=='2') {
0074         xmlwriter_start_element($writer,'data');
0075         if(!empty($data)){
0076           foreach($data as $entry) {
0077             xmlwriter_start_element($writer,$tag);
0078             if(!empty($tagattribute)) {
0079               xmlwriter_write_attribute($writer,'details',$tagattribute);
0080             }
0081             foreach($entry as $key=>$value) {
0082               if(is_array($value)){
0083                 foreach($value as $k=>$v) {
0084                   xmlwriter_write_element($writer,$k,$v);
0085                 }
0086               } else {
0087                 xmlwriter_write_element($writer,$key,$value);
0088               }
0089             }
0090             xmlwriter_end_element($writer);
0091           }
0092         }
0093         xmlwriter_end_element($writer);
0094 
0095       }elseif($dimension=='3') {
0096         xmlwriter_start_element($writer,'data');
0097         foreach($data as $entrykey=>$entry) {
0098           xmlwriter_start_element($writer,$tag);
0099           if(!empty($tagattribute)) {
0100             xmlwriter_write_attribute($writer,'details',$tagattribute);
0101           }
0102           foreach($entry as $key=>$value) {
0103             if(is_array($value)){
0104               xmlwriter_start_element($writer,$entrykey);
0105               foreach($value as $k=>$v) {
0106                 xmlwriter_write_element($writer,$k,$v);
0107               }
0108               xmlwriter_end_element($writer);
0109             } else {
0110               xmlwriter_write_element($writer,$key,$value);
0111             }
0112           }
0113           xmlwriter_end_element($writer);
0114         }
0115         xmlwriter_end_element($writer);
0116       }elseif($dimension=='dynamic') {
0117         xmlwriter_start_element($writer,'data');
0118         //$this->toxml($writer,$data,'comment');
0119         if(is_array($data)) OCSXML::toxml($writer,$data,$tag);
0120         xmlwriter_end_element($writer);
0121       }
0122 
0123       xmlwriter_end_element($writer);
0124 
0125       xmlwriter_end_document( $writer );
0126       $txt.=xmlwriter_output_memory( $writer );
0127       unset($writer);
0128       return($txt);
0129     }
0130   }
0131   
0132   /**
0133    * Take an array of any size, and make it into xml
0134    * @param xmlwriter   An xmlwriter instance
0135    * @param array     The array which is to be transformed
0136    * @param mixed     Either a string, or an array of elements defining element names for each level in the XML hierarchy
0137    *            In the case of multiple lists of differently titled items at the same level, adding an array inside the array will allow for this to be constructed.
0138    * @param int     Internal use (the index of the child item in question - corresponds to the index in the second level array above)
0139    */
0140   static public function toxml($writer,$data,$node,$childindex=0) {
0141     $nodename=$node;
0142     if(is_array($node)){
0143       $nodename=array_shift($node);
0144     }
0145 
0146     $childcount=-1;
0147     foreach($data as $key => $value) {
0148       $childcount++;
0149       if (is_numeric($key)) {
0150         if(is_array($nodename)) {
0151           $key = $nodename[$childindex];
0152         } else {
0153           $key = $nodename;
0154         }
0155       }
0156       if (is_array($value)){
0157         xmlwriter_start_element($writer,$key);
0158         OCSXML::toxml($writer,$value,$node,$childcount);
0159         xmlwriter_end_element($writer);
0160       }else{
0161         xmlwriter_write_element($writer,$key,$value);
0162       }
0163     }
0164     if(is_array($node)) {
0165       array_unshift($node,$nodename);
0166     }
0167   }
0168   /*
0169    * Generate a providers.xml file for clients.
0170    * If arguments are empty data will be auto-generated.
0171    */
0172   public static function generate_providers($serverid='',$name='',$location='',$termsofuse='',$register='', $ssl=false)
0173   {
0174     $version = EConfig::$data['ocsserver']['version'];
0175     
0176     $modules = array();
0177     
0178     //preconfigured for future modules
0179     if(class_exists("OCSUser")){ $modules[] = "person"; } //TODO: OCSUser should become OCSPerson
0180     if(class_exists("OCSFriend")){ $modules[] = "friend"; }
0181     if(class_exists("OCSMessage")){ $modules[] = "message"; }
0182     if(class_exists("OCSActivity")){ $modules[] = "activity"; }
0183     if(class_exists("OCSContent")){ $modules[] = "content"; }
0184     if(class_exists("OCSFan")){ $modules[] = "fan"; }
0185     if(class_exists("OCSKnowledgebase")){ $modules[] = "knowledgebase"; }
0186     if(class_exists("OCSEvent")){ $modules[] = "event"; }
0187     
0188     $xml = '';
0189     $xml .= "<providers>
0190       <provider>
0191         <id>$serverid</id>
0192         <location>$location</location>
0193         <name>$name</name>
0194         <icon/>
0195         <termsofuse>$termsofuse</termsofuse>
0196         <register>$register</register>
0197         <services>\n";
0198           foreach($modules as $module){
0199             $xml.= "\t\t\t\t<$module ocsversion=\"$version\"/>\n";
0200           }
0201         $xml .= "\t\t\t\t</services>
0202       </provider>
0203     </providers>";
0204     
0205     return $xml;
0206   }
0207 }
0208 ?>