Adding initial RPC baseline functionality. The delete message request does in fact...
[squirrelmail.git] / functions / global.php
index a5259ce754a406cba4eccd8741cf5686c798cd1a..47625ac8429b382af8bb91461520c3b8647500bc 100644 (file)
@@ -129,6 +129,91 @@ function sqsession_is_registered ($name) {
     return $result;
 }
 
+
+/**
+  * Retrieves a form variable, from a set of possible similarly named
+  * form variables, based on finding a different, single field.  This
+  * is intended to allow more than one same-named inputs in a single 
+  * <form>, where the submit button that is clicked tells us which 
+  * input we should retrieve.  An example is if we have:
+  *     <select name="startMessage_1">
+  *     <select name="startMessage_2">
+  *     <input type="submit" name="form_submit_1">
+  *     <input type="submit" name="form_submit_2">
+  * and we want to know which one of the select inputs should be 
+  * returned as $startMessage (without the suffix!), this function
+  * decides by looking for either "form_submit_1" or "form_submit_2"
+  * (both should not appear).  In this example, $name should be
+  * "startMessage" and $indicator_field should be "form_submit".
+  *
+  * NOTE that form widgets must be named with the suffix "_1", "_2", "_3"
+  *      and so on, or this function will not work.
+  *
+  * If more than one of the indicator fields is found, the first one
+  * (numerically) will win.
+  *
+  * If an indicator field is found without a matching input ($name) 
+  * field, FALSE is returned.
+  *
+  * If no indicator fields are found, a field of $name *without* any 
+  * suffix is searched for (but only if $fallback_no_suffix is TRUE), 
+  * and if not found, FALSE is ultimately returned.
+  *
+  * It should also be possible to use the same string for both
+  * $name and $indicator_field to look for the first possible
+  * widget with a suffix that can be found (and possibly fallback
+  * to a widget without a suffix).
+  *
+  * @param string name the name of the var to search
+  * @param mixed value the variable to return
+  * @param string indicator_field the name of the field upon which to base
+  *                               our decision upon (see above)
+  * @param int search constant defining where to look
+  * @param bool fallback_no_suffix whether or not to look for $name with
+  *                                no suffix when nothing else is found
+  * @param mixed default the value to assign to $value when nothing is found
+  * @param int typecast force variable to be cast to given type (please
+  *                     use SQ_TYPE_XXX constants or set to FALSE (default)
+  *                     to leave variable type unmolested)
+  *
+  * @return bool whether variable is found.
+  */
+function sqGetGlobalVarMultiple($name, &$value, $indicator_field, 
+                                $search = SQ_INORDER, 
+                                $fallback_no_suffix=TRUE, $default=NULL, 
+                                $typecast=FALSE) {
+
+    // Set arbitrary max limit -- should be much lower except on the
+    // search results page, if there are many (50 or more?) mailboxes
+    // shown, this may not be high enough.  Is there some way we should
+    // automate this value?
+    //
+    $max_form_search = 100;
+
+    for ($i = 1; $i <= $max_form_search; $i++) {
+        if (sqGetGlobalVar($indicator_field . '_' . $i, $temp, $search)) {
+            return sqGetGlobalVar($name . '_' . $i, $value, $search, $default, $typecast);
+        }
+    }
+
+
+    // no indicator field found; just try without suffix if allowed
+    //
+    if ($fallback_no_suffix) {
+        return sqGetGlobalVar($name, $value, $search, $default, $typecast);
+    }
+
+
+    // no dice, set default and return FALSE
+    //
+    if (!is_null($default)) {
+        $value = $default;
+    }
+    return FALSE;
+
+}
+
+
 /**
  * Search for the var $name in $_SESSION, $_POST, $_GET, $_COOKIE, or $_SERVER
  * and set it in provided var.
@@ -147,9 +232,11 @@ function sqsession_is_registered ($name) {
  * @param string name the name of the var to search
  * @param mixed value the variable to return
  * @param int search constant defining where to look
+ * @param mixed default the value to assign to $value when nothing is found
  * @param int typecast force variable to be cast to given type (please
  *                     use SQ_TYPE_XXX constants or set to FALSE (default)
  *                     to leave variable type unmolested)
+ *
  * @return bool whether variable is found.
  */
 function sqgetGlobalVar($name, &$value, $search = SQ_INORDER, $default = NULL, $typecast = false) {
@@ -432,31 +519,53 @@ function php_self () {
 
 
 /**
-  * Find files in a given directory optionally limited to only
-  * those with the given file extension.  If the directory is 
-  * not found or cannot be opened, no error is generated; only
-  * an empty file list is returned.
+  * Find files and/or directories in a given directory optionally 
+  * limited to only those with the given file extension.  If the 
+  * directory is not found or cannot be opened, no error is generated; 
+  * only an empty file list is returned.
 FIXME: do we WANT to throw an error or a notice or... or return FALSE?
   *
-  * @param string $directory_path The path (relative or absolute) 
-  *                               to the desired directory.
-  * @param string $extension      The file extension filter (optional;
-  *                               default is to return all files.
-  * @param boolean $return_filenames_only When TRUE, only file names
+  * @param string $directory_path         The path (relative or absolute) 
+  *                                       to the desired directory.
+  * @param string $extension              The file extension filter (optional;
+  *                                       default is to return all files (dirs).
+  * @param boolean $return_filenames_only When TRUE, only file/dir names
   *                                       are returned, otherwise the
   *                                       $directory_path string is
-  *                                       prepended to each file in
+  *                                       prepended to each file/dir in
   *                                       the returned list (optional;
-  *                                       default is filename only)
+  *                                       default is filename/dirname only)
+  * @param boolean $include_directories   When TRUE, directories are
+  *                                       included (optional; default 
+  *                                       DO include directories).
+  * @param boolean $directories_only      When TRUE, ONLY directories 
+  *                                       are included (optional; default 
+  *                                       is to include files too).
+  * @param boolean $separate_files_and_directories When TRUE, files and
+  *                                                directories are returned
+  *                                                in separate lists, so
+  *                                                the return value is
+  *                                                formatted as a two-element
+  *                                                array with the two keys
+  *                                                "FILES" and "DIRECTORIES",
+  *                                                where corresponding values
+  *                                                are lists of either all
+  *                                                files or all directories
+  *                                                (optional; default do not
+  *                                                split up return array).
+  *                                       
   *
-  * @return array The requested file list.
+  * @return array The requested file/directory list(s).
   *
   * @since 1.5.2
   *
   */
-function list_files($directory_path, $extension='', $return_filenames_only=TRUE) {
+function list_files($directory_path, $extension='', $return_filenames_only=TRUE,
+                    $include_directories=TRUE, $directories_only=FALSE, 
+                    $separate_files_and_directories=FALSE) {
 
     $files = array();
+    $directories = array();
 
 //FIXME: do we want to place security restrictions here like only allowing
 //       directories under SM_PATH?
@@ -464,28 +573,54 @@ function list_files($directory_path, $extension='', $return_filenames_only=TRUE)
     // 
     if (empty($directory_path) 
      || !is_dir($directory_path) 
-     || !is_readable($directory_path)
      || !($DIR = opendir($directory_path))) {
         return $files;
     }
 
+
+    if (!empty($extension)) $extension = '.' . trim($extension, '.');
+    $directory_path = rtrim($directory_path, '/');
+
+
     // parse through the files
     //
-    $extension = empty($extension) ? '' : '.' . trim($extension, '.');
     while (($file = readdir($DIR)) !== false) {
 
         if ($file == '.' || $file == '..') continue;
 
-        if (empty($extension)
-         || strrpos($file, $extension) === (strlen($file) - strlen($extension))) {
+        if (!empty($extension)
+         && strrpos($file, $extension) !== (strlen($file) - strlen($extension))) 
+            continue;
+
+        // only use is_dir() if we really need to (be as efficient as possible)
+        //
+        $is_dir = FALSE;
+        if (!$include_directories || $directories_only 
+                                  || $separate_files_and_directories) {
+            if (is_dir($directory_path . '/' . $file)) {
+                if (!$include_directories) continue;
+                $is_dir = TRUE;
+                $directories[] = ($return_filenames_only 
+                               ? $file
+                               : $directory_path . '/' . $file);
+            } 
+            if ($directories_only) continue;
+        }
+
+        if (!$separate_files_and_directories 
+         || ($separate_files_and_directories && !$is_dir)) {
             $files[] = ($return_filenames_only 
-                        ? $file
-                        : $directory_path . '/' . $file);
+                     ? $file
+                     : $directory_path . '/' . $file);
         }
 
     }
     closedir($DIR);
 
+
+    if ($directories_only) return $directories;
+    if ($separate_files_and_directories) return array('FILES' => $files,
+                                                      'DIRECTORIES' => $directories);
     return $files;
 
 }