<?php
/**
 * IBSE
 *
 * Information Bot Service Engine
 *
 * @package        IBSE
 * @author        HSDN Team
 * @copyright    Copyright (c) 2006-2010, Information Networks Ltd.
 * @link        http://www.hsdn.org
 * @since        Version 4.0
 */

/**
 * IBCTS
 *
 * Information Bot Carrier Transporting Service
 *
 * @package        IBSE
 * @author        HSDN Team
 * @copyright    Copyright (c) 2006-2010, Information Networks Ltd.
 * @since        Version 4.0
 */

// ------------------------------------------------------------------------

/**
 * Класс Ibtp
 *
 * @category    Libraries
 * @author        HSDN Team
 */
class Ibtp
{
    
/*
     * Операционные коды уровня RRTP
     *
     * @access    private
     */
    
private static $rrtp_opcodes = array
    (
        
'MSG_ERROR'        => 0x01,
        
'MSG_SINGLE'    => 0x02,
        
'MSG_MULTIPLY'    => 0x03
    
);

    
/*
     * Идентификатор сессии
     *
     * @access    private
     */
    
private static $session_id 0;


    
/**
     * Установка идентификатора сессии
     *
     * @access    public
     * @param    int
     * @return    void
     */
    
public static function set_session($session_id)
    {
        
self::$session_id = (int) $session_id;
    }

    
/**
     * Парсинг RRTP пакета
     *
     * @access    public
     * @param    string
     * @return    array
     */
    
public static function parse_rrtp($rrtp_data)
    {
        
// Код операции
        
$opcode Packet::unpack_byte($rrtp_data);

        
// Идентификатор сессии
        
$session_id Packet::unpack_qword($rrtp_data);

        
// Иднтификатор поставщика
        
$carrier_id Packet::string($rrtp_dataPacket::unpack_word($rrtp_data));

        
// Иднтификатор клиента
        
$client_id Packet::string($rrtp_dataPacket::unpack_word($rrtp_data));

        return array
        (
            
'opcode' => $opcode,
            
'session_id' => $session_id,
            
'carrier_id' => $carrier_id,
            
'client_id' => $client_id,
            
'msg_data' => self::parse_msp($rrtp_data// Данные MSP
        
);
    }

    
/**
     * Парсинг MSP сегмента
     *
     * @access    private
     * @param    string
     * @return    array
     */
    
private static function parse_msp($msp_data)
    {
        
$msp_data_array = array();

        while (
strlen($msp_data) > 0)
        {
            
// Код операции
            
$opcode Packet::unpack_word($msp_data);

            
// Длина данных
            
$data_len Packet::unpack_word($msp_data);

            
// Данные
            
$data substr($msp_data0$data_len);

            
$msp_data_array[] = array
            (
                
'opcode' => $opcode,
                
'data' => $data
            
);
        }

        return 
$msp_data_array;
    }

    
/**
     * Создание сообщения об ошибке
     *
     * @access    public
     * @param    string
     * @param    string
     * @param    string
     * @return    mixed
     */
    
public static function build_error($carrier_id$client_id$content$msp_opcode 0x0001)
    {
        return 
self::gen_rrtp('MSG_ERROR'$carrier_id$client_idself::gen_msp($msp_opcode$content));
    }

    
/**
     * Создание монолитного сообщения
     *
     * @access    public
     * @param    string
     * @param    string
     * @param    string
     * @return    mixed
     */
    
public static function build_single($carrier_id$client_id$content$msp_opcode 0x0001)
    {
        return 
self::gen_rrtp('MSG_SINGLE'$carrier_id$client_idself::gen_msp($msp_opcode$content));
    }

    
/**
     * Создание разделенного сообщения
     *
     * @access    public
     * @param    string
     * @param    string
     * @param    array
     * @return    mixed
     */
    
public static function build_multiply($carrier_id$client_id$content_array$msp_opcode 0x0001)
    {
        if (!
is_array($content_array))
        {
            return 
FALSE;
        }

        
$rrtp_data '';

        foreach (
$content_array as $content)
        {
            
$rrtp_data .= self::gen_msp($msp_opcode$content);
        }

        return 
self::gen_rrtp('MSG_MULTIPLY'$carrier_id$client_id$rrtp_data);
    }

    
/**
     * Генерация RRTP пакета
     *
     * @access    private
     * @param    int
     * @param    string
     * @param    string
     * @param    string
     * @return    mixed
     */
    
private static function gen_rrtp($opcode$carrier_id$client_id$rrtp_data)
    {
        if (
self::$session_id === NULL)
        {
            return 
FALSE;
        }

        return 
            
Packet::pack_byte(self::$rrtp_opcodes[$opcode]).    // Код операции
            
Packet::pack_qword(self::$session_id).                // Идентификатор сессии
            
Packet::pack_word(strlen($carrier_id)).                // Длина иднтификатора поставщика
            
$carrier_id.                                        // Иднтификатор поставщика
            
Packet::pack_word(strlen($client_id)).                // Длина днтификатора клиента
            
$client_id.                                            // Иднтификатор клиента
            
$rrtp_data;                                            // Данные MSP
    
}

    
/**
     * Генерация MSP сегмента
     *
     * @access    private
     * @param    int
     * @param    string
     * @return    string
     */
    
private static function gen_msp($opcode$msp_data)
    {
        return 
            
Packet::pack_word($opcode).                            // Код операции
            
Packet::pack_word(strlen($msp_data)).                // Длина данных
            
$msp_data;                                            // Данные
    
}
}

/* EOF Ibtp.class.php */