phpgroupware-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Phpgroupware-cvs] phpgwapi/inc/functions.inc.php, 1.176


From: nomail
Subject: [Phpgroupware-cvs] phpgwapi/inc/functions.inc.php, 1.176
Date: Thu, 30 Dec 2004 07:47:31 +0100

Update of /phpgwapi/inc
Added Files:
        Branch: 
          functions.inc.php

date: 2004/12/30 06:47:31;  author: skwashd;  state: Exp;  lines: +186 -363

Log Message:
new HEAD
=====================================================================
<?php
        /**
        * Has a few functions, but primary role is to load the phpgwapi
        * @author Dan Kuykendall <address@hidden>
        * @author Joseph Engo <address@hidden>
        * @copyright Copyright (C) 2000-2004 Free Software Foundation, Inc. 
http://www.fsf.org/
        * @license http://www.fsf.org/licenses/lgpl.html GNU Lesser General 
Public License
        * @package phpgwapi
        * @subpackage utilities
        * @version $Id: functions.inc.php,v 1.176 2004/12/30 06:47:31 skwashd 
Exp $
        */

        
        
/****************************************************************************\
        * If running in PHP3, then force admin to upgrade                       
     *
        
\****************************************************************************/

        if (!function_exists('version_compare'))//version_compare() is only 
available in PHP4.1+
        {
                echo 'phpGroupWare now requires PHP 4.1 or greater.<br>';
                echo 'Please contact your System Administrator';
                exit;
        }

        include_once(PHPGW_API_INC.'/common_functions.inc.php');
        
        /*!
         @function lang
         @abstract function to handle multilanguage support
        */
        function 
lang($key,$m1='',$m2='',$m3='',$m4='',$m5='',$m6='',$m7='',$m8='',$m9='',$m10='')
        {
                if(is_array($m1))
                {
                        $vars = $m1;
                }
                else
                {
                        $vars = array($m1,$m2,$m3,$m4,$m5,$m6,$m7,$m8,$m9,$m10);
                }
                $value = 
$GLOBALS['phpgw']->translation->translate("$key",$vars);
                return $value;
        }

        /* Make sure the header.inc.php is current. */
        if ($GLOBALS['phpgw_info']['server']['versions']['header'] < 
$GLOBALS['phpgw_info']['server']['versions']['current_header'])
        {
                $setup_dir = 
ereg_replace($_SERVER['PHP_SELF'],'index.php','setup/');
                echo '<center><b>You need to port your settings to the new 
header.inc.php version. <a href="' . $setup_dir . '">Run setup 
now!</a></b></center>';
                exit;
        }

        /* Make sure the developer is following the rules. */
        if (!isset($GLOBALS['phpgw_info']['flags']['currentapp']))
        {
                /* This object does not exist yet. */
        /*      $GLOBALS['phpgw']->log->write(array('text'=>'W-MissingFlags, 
currentapp flag not set'));*/

                echo '<b>!!! YOU DO NOT HAVE YOUR 
$GLOBALS[\'phpgw_info\'][\'flags\'][\'currentapp\'] SET !!!';
                echo '<br>!!! PLEASE CORRECT THIS SITUATION !!!</b>';
        }

        magic_quotes_runtime(false);
// Can't use this yet - errorlog hasn't been created.
//      print_debug('sane environment','messageonly','api');

        
/****************************************************************************\
        * Multi-Domain support                                                  
     *
        
\****************************************************************************/
        
        /* make them fix their header */
        if (!isset($GLOBALS['phpgw_domain']))
        {
                echo '<center><b>The administrator must upgrade the 
header.inc.php file before you can continue.</b></center>';
                exit;
        }
        reset($GLOBALS['phpgw_domain']);
        list($GLOBALS['phpgw_info']['server']['default_domain']) = 
each($GLOBALS['phpgw_domain']);

        if (isset($_POST['login']))     // on login
        {
                $GLOBALS['login'] = $_POST['login'];
                if (strstr($GLOBALS['login'],'@') === False)
                {
                        $GLOBALS['login'] .= '@' . 
get_var('logindomain',array('POST'),$GLOBALS['phpgw_info']['server']['default_domain']);
                }
                list(,$GLOBALS['phpgw_info']['user']['domain']) = 
explode('@',$GLOBALS['login']);
        }
        else    // on "normal" pageview
        {
                $GLOBALS['phpgw_info']['user']['domain'] = get_var('domain', 
array('GET', 'COOKIE'), FALSE);
        }

        if 
(@isset($GLOBALS['phpgw_domain'][$GLOBALS['phpgw_info']['user']['domain']]))
        {
                $GLOBALS['phpgw_info']['server']['db_host'] = 
$GLOBALS['phpgw_domain'][$GLOBALS['phpgw_info']['user']['domain']]['db_host'];
                $GLOBALS['phpgw_info']['server']['db_name'] = 
$GLOBALS['phpgw_domain'][$GLOBALS['phpgw_info']['user']['domain']]['db_name'];
                $GLOBALS['phpgw_info']['server']['db_user'] = 
$GLOBALS['phpgw_domain'][$GLOBALS['phpgw_info']['user']['domain']]['db_user'];
                $GLOBALS['phpgw_info']['server']['db_pass'] = 
$GLOBALS['phpgw_domain'][$GLOBALS['phpgw_info']['user']['domain']]['db_pass'];
                $GLOBALS['phpgw_info']['server']['db_type'] = 
$GLOBALS['phpgw_domain'][$GLOBALS['phpgw_info']['user']['domain']]['db_type'];
        }
        else
        {
                $GLOBALS['phpgw_info']['server']['db_host'] = 
$GLOBALS['phpgw_domain'][$GLOBALS['phpgw_info']['server']['default_domain']]['db_host'];
                $GLOBALS['phpgw_info']['server']['db_name'] = 
$GLOBALS['phpgw_domain'][$GLOBALS['phpgw_info']['server']['default_domain']]['db_name'];
                $GLOBALS['phpgw_info']['server']['db_user'] = 
$GLOBALS['phpgw_domain'][$GLOBALS['phpgw_info']['server']['default_domain']]['db_user'];
                $GLOBALS['phpgw_info']['server']['db_pass'] = 
$GLOBALS['phpgw_domain'][$GLOBALS['phpgw_info']['server']['default_domain']]['db_pass'];
                $GLOBALS['phpgw_info']['server']['db_type'] = 
$GLOBALS['phpgw_domain'][$GLOBALS['phpgw_info']['server']['default_domain']]['db_type'];
        }

        if ($GLOBALS['phpgw_info']['flags']['currentapp'] != 'login' && ! 
$GLOBALS['phpgw_info']['server']['show_domain_selectbox'])
        {
                unset ($GLOBALS['phpgw_domain']); // we kill this for security 
reasons
        }

// Can't use this yet - errorlog hasn't been created.
//      print_debug('domain',@$GLOBALS['phpgw_info']['user']['domain'],'api');

         
/****************************************************************************\
         * These lines load up the API, fill up the $phpgw_info array, etc      
      *
         
\****************************************************************************/
         /* Load main class */
        $GLOBALS['phpgw'] = CreateObject('phpgwapi.phpgw');
         
/************************************************************************\
         * Load up the main instance of the db class.                           
  *
         
\************************************************************************/
        $GLOBALS['phpgw']->db                = CreateObject('phpgwapi.db');
        $GLOBALS['phpgw']->db->Debug         = $GLOBALS['phpgw']->debug ? 1 : 0;
        $GLOBALS['phpgw']->db->Halt_On_Error = 'no';
        $GLOBALS['phpgw']->adodb             =& $GLOBALS['phpgw']->db->adodb; 
//Reference
        
        
@$GLOBALS['phpgw']->adodb->connect($GLOBALS['phpgw_info']['server']['db_host'],
                                           
$GLOBALS['phpgw_info']['server']['db_user'],
                                           
$GLOBALS['phpgw_info']['server']['db_pass'],
                                           
$GLOBALS['phpgw_info']['server']['db_name']
                                          );
        if(!$GLOBALS['phpgw']->adodb->ErrorMsg())
        {
                $GLOBALS['phpgw']->adodb->query('select count(config_name) from 
phpgw_config');
                if($GLOBALS['phpgw']->adodb->ErrorMsg())
                {
                        $setup_dir = 
ereg_replace($_SERVER['PHP_SELF'],'index.php','setup/');
                        echo '<center><b>Fatal Error:</b> It appears that you 
have not created the database tables for '
                        .'phpGroupWare.  Click <a href="' . $setup_dir . 
'">here</a> to run setup.</center>';
                        exit;
                }
        }
        else
        {
                $setup_dir = 
ereg_replace($_SERVER['PHP_SELF'],'index.php','setup/');
                echo '<center><b>Fatal Error:</b> Unable to connect to database 
server '
                .'Click <a href="' . $setup_dir . '">here</a> to run 
setup.</center>';
                exit;
        }
        $GLOBALS['phpgw']->db->Halt_On_Error = 'yes';

         /* Fill phpgw_info["server"] array */
         // An Attempt to speed things up using cache premise
        $GLOBALS['phpgw']->db->query("select config_value from phpgw_config 
WHERE config_app='phpgwapi' and 
config_name='cache_phpgw_info'",__LINE__,__FILE__);
        if ($GLOBALS['phpgw']->db->num_rows())
        {
                $GLOBALS['phpgw']->db->next_record();
                $GLOBALS['phpgw_info']['server']['cache_phpgw_info'] = 
stripslashes($GLOBALS['phpgw']->db->f('config_value'));
        }

        $cache_query = "select content from phpgw_app_sessions where"
                ." sessionid = '0' and loginid = '0' and app = 'phpgwapi' and 
location = 'config'";

        $GLOBALS['phpgw']->db->query($cache_query,__LINE__,__FILE__);
        $server_info_cache = $GLOBALS['phpgw']->db->num_rows();

        if(@$GLOBALS['phpgw_info']['server']['cache_phpgw_info'] && 
$server_info_cache)
        {
                $GLOBALS['phpgw']->db->next_record();
                $GLOBALS['phpgw_info']['server'] = 
unserialize(stripslashes($GLOBALS['phpgw']->db->f('content')));
        }
        else
        {
/*
This code doesn't unserialize the variables like the code in config does.  This 
was causing problems with
my new logging stuff.  So I changed it. 
                $GLOBALS['phpgw']->db->query("select * from phpgw_config WHERE 
config_app='phpgwapi'",__LINE__,__FILE__);
                while ($GLOBALS['phpgw']->db->next_record())
                {
                        
$GLOBALS['phpgw_info']['server'][$GLOBALS['phpgw']->db->f('config_name')] = 
stripslashes($GLOBALS['phpgw']->db->f('config_value'));
                }
*/
                $c = CreateObject('phpgwapi.config','phpgwapi');
                $c->read_repository();
                foreach ($c->config_data as $k => $v)
                {
                        $GLOBALS['phpgw_info']['server'][$k] = $v;
                }


                if(@isset($GLOBALS['phpgw_info']['server']['cache_phpgw_info']))
                {
                        if($server_info_cache)
                        {
                                $cache_query = "DELETE FROM phpgw_app_sessions 
WHERE sessionid='0' and loginid='0' and app='phpgwapi' and location='config'";
                                
$GLOBALS['phpgw']->db->query($cache_query,__LINE__,__FILE__);                   
        
                        }
                        $cache_query = 'INSERT INTO 
phpgw_app_sessions(sessionid,loginid,app,location,content) VALUES('
                                . 
"'0','0','phpgwapi','config','".addslashes(serialize($GLOBALS['phpgw_info']['server']))."')";
                        
$GLOBALS['phpgw']->db->query($cache_query,__LINE__,__FILE__);
                }
        }
        unset($cache_query);
        unset($server_info_cache);
        if(@isset($GLOBALS['phpgw_info']['server']['enforce_ssl']) && !$HTTPS)
        {
                Header('Location: https://' . 
$GLOBALS['phpgw_info']['server']['hostname'] . 
$GLOBALS['phpgw_info']['server']['webserver_url'] . $_SERVER['REQUEST_URI']);
                exit;
        }

        
/************************************************************************\
        * Required classes                                                      
 *
        
\************************************************************************/
        $GLOBALS['phpgw']->log          = CreateObject('phpgwapi.log');
        include_once(PHPGW_API_INC . '/log_functions.inc.php');
        $GLOBALS['phpgw']->translation  = CreateObject('phpgwapi.translation');
        $GLOBALS['phpgw']->common       = CreateObject('phpgwapi.common');
        $GLOBALS['phpgw']->hooks        = CreateObject('phpgwapi.hooks');
        $GLOBALS['phpgw']->auth         = CreateObject('phpgwapi.auth');
        $GLOBALS['phpgw']->accounts     = CreateObject('phpgwapi.accounts');
        $GLOBALS['phpgw']->acl          = CreateObject('phpgwapi.acl');
        $GLOBALS['phpgw']->session      = CreateObject('phpgwapi.sessions');
        $GLOBALS['phpgw']->preferences  = CreateObject('phpgwapi.preferences');
        $GLOBALS['phpgw']->applications = CreateObject('phpgwapi.applications');
        print_debug('main class loaded', 'messageonly','api');
        // This include was here before for the old error class.  I've left it 
in for the
        // new log_message class with replaced error.  I'm not sure if it is 
needed, though. -doug
        if (! 
isset($GLOBALS['phpgw_info']['flags']['included_classes']['log_message']) ||
                ! 
$GLOBALS['phpgw_info']['flags']['included_classes']['log_message'])
        {
                
include_once(PHPGW_INCLUDE_ROOT.'/phpgwapi/inc/class.log_message.inc.php');
                
$GLOBALS['phpgw_info']['flags']['included_classes']['log_message'] = True;
        }

        
/****************************************************************************\
        * This is a global constant that should be used                         
     *
        * instead of / or \ in file paths                                       
     *
        
\****************************************************************************/
        define('SEP',filesystem_separator());

        
/*****************************************************************************\
        * ACL defines - moved here to work for xml-rpc/soap, also               
      *
        
\*****************************************************************************/
        define('PHPGW_ACL_READ',1);
        define('PHPGW_ACL_ADD',2);
        define('PHPGW_ACL_EDIT',4);
        define('PHPGW_ACL_DELETE',8);
        define('PHPGW_ACL_PRIVATE',16);
        define('PHPGW_ACL_GROUP_MANAGERS',32);
        define('PHPGW_ACL_CUSTOM_1',64);
        define('PHPGW_ACL_CUSTOM_2',128);
        define('PHPGW_ACL_CUSTOM_3',256);

        
/****************************************************************************\
        * Forcing the footer to run when the rest of the script is done.        
     *
        
\****************************************************************************/
        register_shutdown_function(array($GLOBALS['phpgw']->common, 
'phpgw_final'));

        
/****************************************************************************\
        * Stuff to use if logging in or logging out                             
     *
        
\****************************************************************************/
        if ($GLOBALS['phpgw_info']['flags']['currentapp'] == 'login' || 
$GLOBALS['phpgw_info']['flags']['currentapp'] == 'logout')
        {
                if ($GLOBALS['phpgw_info']['flags']['currentapp'] == 'login')
                {
                        if (@$_POST['login'] != '')
                        {
                                list($login) = explode("@",$_POST['login']);
                                print_debug('LID',$login,'app');
                                $login_id = 
$GLOBALS['phpgw']->accounts->name2id($login);
                                print_debug('User ID',$login_id,'app');
                                
$GLOBALS['phpgw']->accounts->accounts($login_id);
                                
$GLOBALS['phpgw']->preferences->preferences($login_id);
                                $GLOBALS['phpgw']->datetime = 
CreateObject('phpgwapi.datetime');
                        }
                }
        
/**************************************************************************\
        * Everything from this point on will ONLY happen if                     
   *
        * the currentapp is not login or logout                                 
   *
        
\**************************************************************************/
        }
        else
        {
                if (! $GLOBALS['phpgw']->session->verify())
                {
                        $GLOBALS['phpgw']->redirect_link('/login.php','cd=10');
                }

                $GLOBALS['phpgw']->datetime = CreateObject('phpgwapi.datetime');

                /* A few hacker resistant constants that will be used throught 
the program */
                define('PHPGW_TEMPLATE_DIR', 
ExecMethod('phpgwapi.phpgw.common.get_tpl_dir', 'phpgwapi'));
                define('PHPGW_IMAGES_DIR', 
ExecMethod('phpgwapi.phpgw.common.get_image_path', 'phpgwapi'));
                define('PHPGW_IMAGES_FILEDIR', 
ExecMethod('phpgwapi.phpgw.common.get_image_dir', 'phpgwapi'));
                define('PHPGW_APP_ROOT', 
ExecMethod('phpgwapi.phpgw.common.get_app_dir'));
                define('PHPGW_APP_INC', 
ExecMethod('phpgwapi.phpgw.common.get_inc_dir'));
                define('PHPGW_APP_TPL', 
ExecMethod('phpgwapi.phpgw.common.get_tpl_dir'));
                define('PHPGW_IMAGES', 
ExecMethod('phpgwapi.phpgw.common.get_image_path'));
                define('PHPGW_APP_IMAGES_DIR', 
ExecMethod('phpgwapi.phpgw.common.get_image_dir'));

                /*      define('PHPGW_APP_IMAGES_DIR', 
$GLOBALS['phpgw']->common->get_image_dir()); */

                /* Moved outside of this logic
                define('PHPGW_ACL_READ',1);
                define('PHPGW_ACL_ADD',2);
                define('PHPGW_ACL_EDIT',4);
                define('PHPGW_ACL_DELETE',8);
                define('PHPGW_ACL_PRIVATE',16);
                */

        
/************************************************************************\
        * Load the menuaction                                                   
 *
        
\************************************************************************/
                $GLOBALS['phpgw_info']['menuaction'] = 
get_var('menuaction',Array('GET','POST'));
                if(!$GLOBALS['phpgw_info']['menuaction'])
                {
                        unset($GLOBALS['phpgw_info']['menuaction']);
                }

                /********* This sets the user variables *********/
                $GLOBALS['phpgw_info']['user']['private_dir'] = 
$GLOBALS['phpgw_info']['server']['files_dir']
                        . '/users/'.$GLOBALS['phpgw_info']['user']['userid'];

                /* This will make sure that a user has the basic default prefs. 
If not it will add them */
                $GLOBALS['phpgw']->preferences->verify_basic_settings();

                /********* Optional classes, which can be disabled for 
performance increases *********/
                while ($phpgw_class_name = 
each($GLOBALS['phpgw_info']['flags']))
                {
                        if (ereg('enable_',$phpgw_class_name[0]))
                        {
                                $enable_class = 
str_replace('enable_','',$phpgw_class_name[0]);
                                $enable_class = 
str_replace('_class','',$enable_class);
                                eval('$GLOBALS["phpgw"]->' . $enable_class . ' 
= createobject(\'phpgwapi.' . $enable_class . '\');');
                        }
                }
                unset($enable_class);
                reset($GLOBALS['phpgw_info']['flags']);

                
/*************************************************************************\
                * These lines load up the templates class                       
          *
                
\*************************************************************************/
                
if(address@hidden'phpgw_info']['flags']['disable_Template_class'])
                {
                        $GLOBALS['phpgw']->template = 
CreateObject('phpgwapi.Template',PHPGW_APP_TPL);
                        $GLOBALS['phpgw']->xslttpl = 
CreateObject('phpgwapi.xslttemplates',PHPGW_TEMPLATE_DIR);
                        $GLOBALS['phpgw']->xslttpl->set_root(PHPGW_APP_TPL);
                }

                
/*************************************************************************\
                * These lines load up the themes                                
          *
                
\*************************************************************************/
                if (! 
$GLOBALS['phpgw_info']['user']['preferences']['common']['theme'])
                {
                        if (@$GLOBALS['phpgw_info']['server']['template_set'] 
== 'user_choice')
                        {
                                
$GLOBALS['phpgw_info']['user']['preferences']['common']['theme'] = 'default';
                        }
                        else
                        {
                                
$GLOBALS['phpgw_info']['user']['preferences']['common']['theme'] = 
$GLOBALS['phpgw_info']['server']['template_set'];
                        }
                }
                if (@$GLOBALS['phpgw_info']['server']['force_theme'] == 
'user_choice')
                {
                        if 
(!isset($GLOBALS['phpgw_info']['user']['preferences']['common']['theme']))
                        {
                                
$GLOBALS['phpgw_info']['user']['preferences']['common']['theme'] = 'default';
                        }
                }
                else
                {
                        if 
(isset($GLOBALS['phpgw_info']['server']['force_theme']))
                        {
                                
$GLOBALS['phpgw_info']['user']['preferences']['common']['theme'] = 
$GLOBALS['phpgw_info']['server']['force_theme'];
                        }
                }

                if(@file_exists(PHPGW_SERVER_ROOT . '/phpgwapi/themes/' . 
$GLOBALS['phpgw_info']['user']['preferences']['common']['theme'] . '.theme'))
                {
                        include(PHPGW_SERVER_ROOT . '/phpgwapi/themes/' . 
$GLOBALS['phpgw_info']['user']['preferences']['common']['theme'] . '.theme');
                }
                elseif(@file_exists(PHPGW_SERVER_ROOT . 
'/phpgwapi/themes/default.theme'))
                {
                        include(PHPGW_SERVER_ROOT . 
'/phpgwapi/themes/default.theme');
                }
                else
                {
                        echo '<body bgcolor="FFFFFF">';
                        echo lang('No themes found');
                        echo '</body>';
                        $GLOBALS['phpgw']->log->write(array('text'=>'F-Abort, 
No themes found'));

                        exit;
                }
                unset($theme_to_load);

                
/*************************************************************************\
                * If they are using frames, we need to set some variables       
          *
                
\*************************************************************************/
                if 
(((isset($GLOBALS['phpgw_info']['user']['preferences']['common']['useframes']) 
&&
                        
$GLOBALS['phpgw_info']['user']['preferences']['common']['useframes']) && 
                        $GLOBALS['phpgw_info']['server']['useframes'] == 
'allowed') ||
                        ($GLOBALS['phpgw_info']['server']['useframes'] == 
'always'))
                {
                        $GLOBALS['phpgw_info']['flags']['navbar_target'] = 
'phpgw_body';
                }

                
/*************************************************************************\
                * Verify that the users session is still active otherwise kick 
them out   *
                
\*************************************************************************/
                if ($GLOBALS['phpgw_info']['flags']['currentapp'] != 'home' &&
                        $GLOBALS['phpgw_info']['flags']['currentapp'] != 
'about')
                {
                        // This will need to use ACL in the future
                        if (! 
$GLOBALS['phpgw_info']['user']['apps'][$GLOBALS['phpgw_info']['flags']['currentapp']]
 ||
                                (@$GLOBALS['phpgw_info']['flags']['admin_only'] 
&&
                                ! 
$GLOBALS['phpgw_info']['user']['apps']['admin']))
                        {
                                $GLOBALS['phpgw']->common->phpgw_header();
                                if ($GLOBALS['phpgw_info']['flags']['noheader'])
                                {
                                        echo parse_navbar();
                                }

                                
$GLOBALS['phpgw']->log->write(array('text'=>'W-Permissions, Attempted to access 
%1','p1'=>$GLOBALS['phpgw_info']['flags']['currentapp']));

                                echo '<p><center><b>'.lang('Access not 
permitted').'</b></center>';
                                $GLOBALS['phpgw']->common->phpgw_exit(True);
                        }
                }

                if(!is_object($GLOBALS['phpgw']->datetime))
                {
                        $GLOBALS['phpgw']->datetime = 
CreateObject('phpgwapi.datetime');
                }
                $GLOBALS['phpgw']->applications->read_installed_apps(); // to 
get translated app-titles
                
                
/*************************************************************************\
                * Load the header unless the developer turns it off             
          *
                
\*************************************************************************/
                if (address@hidden'phpgw_info']['flags']['noheader'])
                {
                        $GLOBALS['phpgw']->common->phpgw_header();
                }

                
/*************************************************************************\
                * Load the app include files if the exists                      
          *
                
\*************************************************************************/
                /* Then the include file */
                if (! preg_match ("/phpgwapi/i", PHPGW_APP_INC) && 
file_exists(PHPGW_APP_INC . '/functions.inc.php') && 
!isset($GLOBALS['phpgw_info']['menuaction']))
                {
                        include_once(PHPGW_APP_INC . '/functions.inc.php');
                }
                if (address@hidden'phpgw_info']['flags']['noheader'] && 
                        address@hidden'phpgw_info']['flags']['noappheader'] &&
                        file_exists(PHPGW_APP_INC . '/header.inc.php') && 
!isset($GLOBALS['phpgw_info']['menuaction']))
                {
                        include_once(PHPGW_APP_INC . '/header.inc.php');
                }
        }
        
        error_reporting(E_ERROR | E_WARNING | E_PARSE);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]