* @revision 03 * @license http://creativecommons.org/licenses/by-sa/3.0/de/ Creative Commons Attribution-Share Alike 3.0 Germany * @homepage http://oss.tiggerswelt.net/oscar/ * @copyright Copyright © 2009 tiggersWelt.net */ require_once ("oscar/writer.php"); require_once ("oscar/common.php"); class Oscar_SNAC extends Oscar_Writer { /* Family/Service-Types */ const SERVICE_GENERIC = 0x0001; const SERVICE_LOCATION = 0x0002; const SERVICE_ROSTER = 0x0003; /* SNAC Flags */ const FLAG_TLV_PRESENT = 0x8000; const FLAG_REPLIES_FOLLOW = 0x0001; /* General SNAC-Header */ public $ServiceID = 0x0000; public $SubtypeID = 0x0000; public $Flags = 0x0000; public $RequestID = 0x00000000; /* Plain data of this packet */ public $Data = ""; // {{{ __constuct /** * Create such object * * @param object $Parent (optional) * * @access public * @return void */ public function __construct ($Parent = null) { parent::__construct ($Parent); $Class = get_class ($this); if ($Class == __CLASS__) trigger_error ("Creating unknown SNAC-Type", E_USER_WARNING); if (defined ($c = $Class . "::SNAC_FAMILY")) $this->ServiceID = constant ($c); if (defined ($c = $Class . "::SNAC_SERVICE")) $this->SubtypeID = constant ($c); } // }}} // {{{ parseSNAC /** * Parse incomming SNAC-Data and create new object * * @param string $Data * @param object $Parent (optional) * * @access public * @return object */ public static function parseSNAC ($Data, $Parent = null) { // Extract Class-Info from packet $ServiceID = OSCAR_Common::str2int16 ($Data, 0); $SubtypeID = OSCAR_Common::str2int16 ($Data, 2); // Find best suitable class $Classes = get_declared_classes (); $Class = "OSCAR_SNAC"; foreach ($Classes as $cClass) if (is_subclass_of ($cClass, __CLASS__) && defined ($c = $cClass . "::SNAC_FAMILY") && (constant ($c) == $ServiceID) && defined ($c = $cClass . "::SNAC_SERVICE") && (constant ($c) == $SubtypeID)) { $Class = $cClass; break; } // Create new packet $Packet = new $Class ($Parent); $Packet->ServiceID = $ServiceID; $Packet->SubtypeID = $SubtypeID; $Packet->Flags = OSCAR_Common::str2int16 ($Data, 4); $Packet->RequestID = OSCAR_Common::str2int32 ($Data, 6); $Packet->Data = substr ($Data, 10); // Try to parse additional Data if (is_callable (array ($Packet, "parse"))) $Packet->parse (); return $Packet; } // }}} // {{{ generate /** * Generate a packet for submission over the wire * * @access public * @return string */ public function generate () { return OSCAR_Common::int16tostr ($this->ServiceID) . OSCAR_Common::int16tostr ($this->SubtypeID) . OSCAR_Common::int16tostr ($this->Flags) . OSCAR_Common::int32tostr ($this->RequestID) . $this->Data; } // }}} } // Load helper-SNACs require_once ("oscar/snac/helper/tlv.php"); // Load our more specific SNAC-Types require_once ("oscar/snac/helper/error.php"); require_once ("oscar/snac/auth.php"); require_once ("oscar/snac/generic.php"); require_once ("oscar/snac/locate.php"); require_once ("oscar/snac/invite.php"); require_once ("oscar/snac/buddy.php"); require_once ("oscar/snac/icbm.php"); require_once ("oscar/snac/privacy.php"); require_once ("oscar/snac/stats.php"); require_once ("oscar/snac/ssi.php"); require_once ("oscar/snac/rate.php"); require_once ("oscar/snac/icqsrv.php"); require_once ("oscar/snac/dummy.php"); ?>