Ejemplo n.º 1
0
    public function getUsers($nick)
    {
        $connection = $this->getConnection();
        $now = time();
        $sqlQuery = '
			UPDATE
				`' . XOAD_CHAT_USERS_TABLE_NAME . '`
			SET
				`time` = ' . $now . '
			WHERE
				`nick` = \'' . $this->escapeString($nick, $connection) . '\'
		';
        mysql_query($sqlQuery, $connection);
        $sqlQuery = '
			SELECT
				`nick`
			FROM
				`' . XOAD_CHAT_USERS_TABLE_NAME . '`
			WHERE
				`time` < ' . ($now - 30) . '
			ORDER BY
				`time` ASC,
				`nick` ASC
		';
        $sqlResult = mysql_query($sqlQuery);
        $oldUsers = array();
        while (($row = mysql_fetch_assoc($sqlResult)) != false) {
            $oldUsers[] = $row['nick'];
        }
        mysql_free_result($sqlResult);
        $sqlQuery = '
			DELETE FROM
				`' . XOAD_CHAT_USERS_TABLE_NAME . '`
			WHERE
				`time` < ' . ($now - 30) . '
		';
        mysql_query($sqlQuery);
        $sqlQuery = '
			SELECT
				`nick`
			FROM
				`' . XOAD_CHAT_USERS_TABLE_NAME . '`
			ORDER BY
				`nick` ASC
		';
        $sqlResult = mysql_query($sqlQuery, $connection);
        $users = array();
        while (($row = mysql_fetch_assoc($sqlResult)) != false) {
            $users[] = $row['nick'];
        }
        mysql_free_result($sqlResult);
        $storage =& XOAD_Events_Storage::getStorage();
        foreach ($oldUsers as $nick) {
            $storage->postEvent('onUserLeave', 'ChatClient', null, $nick);
        }
        $this->closeConnection($connection);
        return $users;
    }
Ejemplo n.º 2
0
 /**
  * Filters the events in the container using multiple criterias.
  *
  * <p>Valid keys for each event are:</p>
  * - event		- the event name (case-sensitive);
  * - className	- the class that is the source of the event;
  * - filter		- the event filter data (case-insensitive);
  * 				  using this argument you can filter events with
  *				  the same name but with different filter data;
  * - time		- the event start time (seconds since the Unix
  *				  Epoch (January 1 1970 00:00:00 GMT).
  *
  * @access	public
  *
  * @param	array	$eventsData		Array containing associative arrays
  *									with information for each event.
  *
  * @return	array	Sequental array that contains all events that match the
  *					supplied criterias, ordered by time (ascending).
  *
  */
 public function filterMultipleEvents($eventsData)
 {
     $events = array();
     $containerData = @file($this->getFileName());
     if (empty($containerData)) {
         return $events;
     }
     foreach ($eventsData as $event) {
         if (!parent::filterMultipleEvents($event)) {
             continue;
         }
         foreach ($containerData as $row) {
             list($eventName, $className, $time, $endTime, $filter, $rowData) = explode($this->separator, $row, 6);
             $filter = unserialize($filter);
             $match = strcmp($eventName, $event['event']) == 0;
             $match &= strcasecmp($className, $event['className']) == 0;
             $match &= $time > $event['time'];
             if (isset($event['filter'])) {
                 $match &= $filter == $event['filter'];
             }
             if ($match) {
                 $rowData = unserialize($rowData);
                 $events[] = array('event' => $eventName, 'className' => $className, 'filter' => $filter, 'time' => (double) $time, 'endTime' => (double) $endTime, 'eventData' => array('sender' => isset($rowData['sender']) ? $rowData['sender'] : null, 'data' => isset($rowData['data']) ? $rowData['data'] : null));
             }
         }
     }
     if (!empty($events)) {
         usort($events, array('XOAD_Events_Storage_File', 'sortEvents'));
     }
     return $events;
 }
Ejemplo n.º 3
0
 /**
  * Retrieves an instanse to the configurated XOAD Events storage provider.
  *
  * <p>Example:</p>
  * <code>
  * <?php
  *
  * require_once('xoad.php');
  *
  * $storage =& XOAD_Events_Storage::getStorage();
  *
  * $storage->postEvent('event', 'class');
  *
  * ?>
  * </code>
  *
  * @access	public
  *
  * @return	object	Singleton {@link XOAD_Events_Storage} inherited class based
  *					on the configuration (see {@link XOAD_EVENTS_STORAGE_DSN}).
  *
  * @static
  *
  */
 public static function &getStorage()
 {
     if (!isset(self::$instance)) {
         $className = null;
         $classParameters = null;
         $separator = '://';
         $position = strpos(XOAD_EVENTS_STORAGE_DSN, $separator);
         if ($position === false) {
             $className = XOAD_EVENTS_STORAGE_DSN;
         } else {
             $className = substr(XOAD_EVENTS_STORAGE_DSN, 0, $position);
             $classParameters = substr(XOAD_EVENTS_STORAGE_DSN, $position + strlen($separator));
         }
         if (empty($className)) {
             return null;
         }
         $fileName = XOAD_BASE . '/classes/events/storage/' . $className . '.class.php';
         /**
          * Load the file that defines the events storage provider.
          */
         require_once $fileName;
         $realClassName = 'XOAD_Events_Storage_' . $className;
         if (!class_exists($realClassName)) {
             return null;
         }
         self::$instance = new $realClassName($classParameters);
     }
     return self::$instance;
 }
Ejemplo n.º 4
0
 /**
  * Dispatches a client callback to the server.
  *
  * @access	public
  *
  * @return	string	Outputs JavaString code that contains the result
  *					and the output of the callback.
  *
  * @static
  *
  */
 public static function dispatch()
 {
     if (empty($GLOBALS['_XOAD_SERVER_REQUEST_BODY'])) {
         return false;
     }
     $requestBody =& $GLOBALS['_XOAD_SERVER_REQUEST_BODY'];
     if (!XOAD_Server::notifyObservers('dispatchEnter', array('request' => &$requestBody))) {
         return false;
     }
     if (isset($requestBody['eventPost'])) {
         $callbackResponse = array();
         $storage =& XOAD_Events_Storage::getStorage();
         $callbackResponse['status'] = $storage->postEvent($requestBody['event'], $requestBody['className'], $requestBody['sender'], $requestBody['data'], $requestBody['filter']);
         if (XOAD_Server::notifyObservers('dispatchLeave', array('request' => &$requestBody, 'response' => &$callbackResponse))) {
             if (!empty($callbackResponse['status'])) {
                 print XOAD_Client::register($callbackResponse);
             }
         }
     } else {
         if (isset($requestBody['eventsCallback'])) {
             $eventsQuery = array();
             foreach ($requestBody['data'] as $event) {
                 $eventsQuery[] = array('event' => $event['event'], 'className' => $event['className'], 'filter' => $event['filter'], 'time' => $requestBody['time']);
             }
             $callbackResponse = array();
             $storage =& XOAD_Events_Storage::getStorage();
             $storage->cleanEvents();
             $callbackResponse['result'] = $storage->filterMultipleEvents($eventsQuery);
             if (XOAD_Server::notifyObservers('dispatchLeave', array('request' => &$requestBody, 'response' => &$callbackResponse))) {
                 if (!empty($callbackResponse['result'])) {
                     print XOAD_Client::register($callbackResponse);
                 }
             }
         } else {
             $callbackResponse = array();
             $outputBuffering = @ob_start();
             set_error_handler(array('XOAD_Server', 'handleError'));
             $callbackResponse['returnValue'] = call_user_func_array(array(&$requestBody['source'], $requestBody['method']), $requestBody['arguments']);
             if (defined('XOAD_SERVER_EXCEPTION')) {
                 if (XOAD_Server::notifyObservers('dispatchFailed', array('request' => &$requestBody, 'message' => XOAD_SERVER_EXCEPTION))) {
                     XOAD_Server::throwException(XOAD_SERVER_EXCEPTION);
                     return false;
                 }
             }
             $callbackResponse['returnObject'] =& $requestBody['source'];
             if ($outputBuffering) {
                 $output = @ob_get_contents();
                 if (!empty($output)) {
                     $callbackResponse['output'] = $output;
                 }
                 @ob_end_clean();
             }
             restore_error_handler();
             if (XOAD_Server::notifyObservers('dispatchLeave', array('request' => &$requestBody, 'response' => &$callbackResponse))) {
                 print XOAD_Client::register($callbackResponse);
             }
         }
     }
     return true;
 }
Ejemplo n.º 5
0
    /**
     * Filters the events in the database using multiple criterias.
     *
     * <p>Valid keys for each event are:</p>
     * - event		- the event name (case-sensitive);
     * - className	- the class that is the source of the event;
     * - filter		- the event filter data (case-insensitive);
     * 				  using this argument you can filter events with
     *				  the same name but with different filter data;
     * - time		- the event start time (seconds since the Unix
     *				  Epoch (January 1 1970 00:00:00 GMT).
     *
     * @access	public
     *
     * @param	array	$eventsData		Array containing associative arrays
     *									with information for each event.
     *
     * @return	array	Sequental array that contains all events that match the
     *					supplied criterias, ordered by time (ascending).
     *
     */
    public function filterMultipleEvents($eventsData)
    {
        $connection =& $this->getConnection();
        $sqlQuery = '
			SELECT
				`event`,
				`className`,
				`filter`,
				`sender`,
				`data`,
				`time`,
				`endTime`
			FROM
				`' . XOAD_EVENTS_TABLE_NAME . '`
			WHERE
		';
        $index = 0;
        $length = sizeof($eventsData);
        foreach ($eventsData as $event) {
            if (!parent::filterMultipleEvents($event)) {
                continue;
            }
            $sqlQuery .= '(
				`time` > ' . $this->escapeString($event['time'], $connection) . '
				AND
				`event` = \'' . $this->escapeString($event['event'], $connection) . '\'
				AND
				`className` = \'' . $this->escapeString($event['className'], $connection) . '\'
			';
            if (isset($event['filter'])) {
                $sqlQuery .= 'AND `filter` = \'' . $this->escapeString($event['filter'], $connection) . '\'';
            }
            if ($index < $length - 1) {
                $sqlQuery .= ') OR ';
            } else {
                $sqlQuery .= ')';
            }
            $index++;
        }
        $sqlQuery .= '
			ORDER BY
				`time` ASC
		';
        $events = array();
        $sqlResult =& $connection->query($sqlQuery);
        while (($row =& $sqlResult->fetchRow()) != false) {
            $events[] = array('event' => $row['event'], 'className' => $row['className'], 'filter' => $row['filter'], 'time' => (double) $row['time'], 'endTime' => (double) $row['endTime'], 'eventData' => array('sender' => $row['sender'] === null ? null : unserialize($row['sender']), 'data' => $row['data'] === null ? null : unserialize($row['data'])));
        }
        $sqlResult->free();
        $this->closeConnection($connection);
        return $events;
    }