array(extension=>array( array('basetag'=>basetag,'tag'=>tag,'addpri'=>addpri,'cmd'=>cmd) ))) * ( $_exts[$section][$extension][$priority] ) */ var $_exts; /** Hints * special cases of priorities */ var $_hints; var $_sorted; /** The filename to write this configuration to */ function get_filename() { return "extensions_additional.conf"; } /** Add an entry to the extensions file * @param $section The section to be added to * @param $extension The extension used * @param $tag A tag to use (to reference with basetag), use false or '' if none * @param $command The command to execute * @param $basetag The tag to base this on. Only used in conjunction with $addpriority * priority. Defaults to false. * @param $addpriority Finds the priority of the tag called $basetag, and adds this * value to it to use as the priority for this command. * @return */ function add($section, $extension, $tag, $command, $basetag = false, $addpriority = false) { if ($basetag || $addpriority) { if (!is_int($addpriority) || ($addpriority < 1)) { trigger_error(E_ERROR, "\$addpriority must be >= 1 in extensions::add()"); return false; } if (empty($basetag)) { trigger_error(E_ERROR, "\$basetag is required with \$addpriority in extensions::add()"); return false; } } if (empty($basetag)) { // no basetag, we need to make one if (!isset($this->_exts[$section][$extension])) { // first entry, use 1 $basetag = '1'; } else { // anything else just n $basetag = 'n'; } } $new = array( 'basetag' => $basetag, 'tag' => $tag, 'addpri' => $addpriority, 'cmd' => $command, ); $this->_exts[$section][$extension][] = $new; } /** Sort sections, extensions and priorities alphabetically */ function sort() { foreach (array_keys($this->_exts) as $section) { foreach (array_keys($this->_exts[$section]) as $extension) { // sort priorities ksort($this->_exts[$section][$extension]); } // sort extensions ksort($this->_exts[$section]); } // sort sections ksort($this->_exts); $this->_sorted = true; } function addHint($section, $extension, $hintvalue) { $this->_hints[$section][$extension][] = $hintvalue; } function addGlobal($globvar, $globval) { $this->_globals[$globvar] = $globval; } function addInclude($section, $incsection) { $this->_includes[$section][] = $incsection; } /* This function allows new priorities to be injected into already generated dialplan * usage: $ext->splice($context, $exten, $priority_number, new ext_goto('1','s','ext-did')); */ function splice($section, $extension, $priority, $command) { if($priority == 0) { $basetag = '1'; // we'll be defining a new pri "1", so change existing "1" to "n" $this->_exts[$section][$extension][0]['basetag'] = 'n'; } else { $basetag = 'n'; } $newcommand = array( 'basetag' => $basetag, 'tag' => '', 'addpri' => '', 'cmd' => $command ); /* This little routine from http://ca.php.net/array_splice overcomes * problems that array_splice has with multidmentional arrays */ $array = $this->_exts[$section][$extension]; $ky = $priority; $val = $newcommand; $n = $ky; foreach($array as $key => $value) { $backup_array[$key] = $array[$key]; } $upper_limit = count($array); while($n <= $upper_limit) { if($n == $ky) { $array[$n] = $val; // echo $n; } else { $i = $n - "1"; $array[$n] = $backup_array[$i]; } $n++; } // apply our newly modified array //echo "Splicing [$section] $extension\n"; $this->_exts[$section][$extension] = $array; //print_r($this->_exts[$section][$extension]); } /** Generate the file * @return A string containing the extensions.conf file */