You are here

function PclZip::privParseOptions in Quiz 6.6

Same name and namespace in other branches
  1. 6.5 includes/moodle/lib/pclzip/pclzip.lib.php \PclZip::privParseOptions()
5 calls to PclZip::privParseOptions()
PclZip::add in includes/moodle/lib/pclzip/pclzip.lib.php
PclZip::create in includes/moodle/lib/pclzip/pclzip.lib.php
PclZip::delete in includes/moodle/lib/pclzip/pclzip.lib.php
PclZip::extract in includes/moodle/lib/pclzip/pclzip.lib.php
PclZip::extractByIndex in includes/moodle/lib/pclzip/pclzip.lib.php

File

includes/moodle/lib/pclzip/pclzip.lib.php, line 1446

Class

PclZip

Code

function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options = false) {

  //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privParseOptions", "");
  $v_result = 1;

  // ----- Read the options
  $i = 0;
  while ($i < $p_size) {

    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Looking for table index $i, option = '".PclZipUtilOptionText($p_options_list[$i])."(".$p_options_list[$i].")'");

    // ----- Check if the option is supported
    if (!isset($v_requested_options[$p_options_list[$i]])) {

      // ----- Error log
      PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '" . $p_options_list[$i] . "' for this method");

      // ----- Return

      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
      return PclZip::errorCode();
    }

    // ----- Look for next option
    switch ($p_options_list[$i]) {

      // ----- Look for options that request a path value
      case PCLZIP_OPT_PATH:
      case PCLZIP_OPT_REMOVE_PATH:
      case PCLZIP_OPT_ADD_PATH:

        // ----- Check the number of parameters
        if ($i + 1 >= $p_size) {

          // ----- Error log
          PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'");

          // ----- Return

          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
          return PclZip::errorCode();
        }

        // ----- Get the value
        $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i + 1], false);

        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
        $i++;
        break;
      case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION:

        // ----- Check the number of parameters
        if ($i + 1 >= $p_size) {

          // ----- Error log
          PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'");

          // ----- Return

          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
          return PclZip::errorCode();
        }

        // ----- Get the value
        if (is_string($p_options_list[$i + 1]) && $p_options_list[$i + 1] != '') {
          $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i + 1], false);

          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
          $i++;
        }
        else {

          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." set with an empty value is ignored.");
        }
        break;

      // ----- Look for options that request an array of string for value
      case PCLZIP_OPT_BY_NAME:

        // ----- Check the number of parameters
        if ($i + 1 >= $p_size) {

          // ----- Error log
          PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'");

          // ----- Return

          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
          return PclZip::errorCode();
        }

        // ----- Get the value
        if (is_string($p_options_list[$i + 1])) {
          $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i + 1];
        }
        else {
          if (is_array($p_options_list[$i + 1])) {
            $v_result_list[$p_options_list[$i]] = $p_options_list[$i + 1];
          }
          else {

            // ----- Error log
            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'");

            // ----- Return

            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
            return PclZip::errorCode();
          }
        }

        ////--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
        $i++;
        break;

      // ----- Look for options that request an EREG or PREG expression
      case PCLZIP_OPT_BY_EREG:
      case PCLZIP_OPT_BY_PREG:

        //case PCLZIP_OPT_CRYPT :

        // ----- Check the number of parameters
        if ($i + 1 >= $p_size) {

          // ----- Error log
          PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'");

          // ----- Return

          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
          return PclZip::errorCode();
        }

        // ----- Get the value
        if (is_string($p_options_list[$i + 1])) {
          $v_result_list[$p_options_list[$i]] = $p_options_list[$i + 1];
        }
        else {

          // ----- Error log
          PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'");

          // ----- Return

          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
          return PclZip::errorCode();
        }

        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
        $i++;
        break;

      // ----- Look for options that takes a string
      case PCLZIP_OPT_COMMENT:
      case PCLZIP_OPT_ADD_COMMENT:
      case PCLZIP_OPT_PREPEND_COMMENT:

        // ----- Check the number of parameters
        if ($i + 1 >= $p_size) {

          // ----- Error log
          PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'");

          // ----- Return

          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
          return PclZip::errorCode();
        }

        // ----- Get the value
        if (is_string($p_options_list[$i + 1])) {
          $v_result_list[$p_options_list[$i]] = $p_options_list[$i + 1];
        }
        else {

          // ----- Error log
          PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'");

          // ----- Return

          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
          return PclZip::errorCode();
        }

        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
        $i++;
        break;

      // ----- Look for options that request an array of index
      case PCLZIP_OPT_BY_INDEX:

        // ----- Check the number of parameters
        if ($i + 1 >= $p_size) {

          // ----- Error log
          PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'");

          // ----- Return

          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
          return PclZip::errorCode();
        }

        // ----- Get the value
        $v_work_list = array();
        if (is_string($p_options_list[$i + 1])) {

          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Index value is a string '".$p_options_list[$i+1]."'");

          // ----- Remove spaces
          $p_options_list[$i + 1] = strtr($p_options_list[$i + 1], ' ', '');

          // ----- Parse items
          $v_work_list = explode(",", $p_options_list[$i + 1]);
        }
        else {
          if (is_integer($p_options_list[$i + 1])) {

            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Index value is an integer '".$p_options_list[$i+1]."'");
            $v_work_list[0] = $p_options_list[$i + 1] . '-' . $p_options_list[$i + 1];
          }
          else {
            if (is_array($p_options_list[$i + 1])) {

              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Index value is an array");
              $v_work_list = $p_options_list[$i + 1];
            }
            else {

              // ----- Error log
              PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'");

              // ----- Return

              //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
              return PclZip::errorCode();
            }
          }
        }

        // ----- Reduce the index list
        // each index item in the list must be a couple with a start and
        // an end value : [0,3], [5-5], [8-10], ...
        // ----- Check the format of each item
        $v_sort_flag = false;
        $v_sort_value = 0;
        for ($j = 0; $j < sizeof($v_work_list); $j++) {

          // ----- Explode the item
          $v_item_list = explode("-", $v_work_list[$j]);
          $v_size_item_list = sizeof($v_item_list);

          // ----- TBC : Here we might check that each item is a
          // real integer ...
          // ----- Look for single value
          if ($v_size_item_list == 1) {

            // ----- Set the option value
            $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0];
            $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[0];
          }
          elseif ($v_size_item_list == 2) {

            // ----- Set the option value
            $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0];
            $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[1];
          }
          else {

            // ----- Error log
            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Too many values in index range for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'");

            // ----- Return

            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
            return PclZip::errorCode();
          }

          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extracted index item = [".$v_result_list[$p_options_list[$i]][$j]['start'].",".$v_result_list[$p_options_list[$i]][$j]['end']."]");

          // ----- Look for list sort
          if ($v_result_list[$p_options_list[$i]][$j]['start'] < $v_sort_value) {

            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The list should be sorted ...");
            $v_sort_flag = true;

            // ----- TBC : An automatic sort should be writen ...
            // ----- Error log
            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Invalid order of index range for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'");

            // ----- Return

            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
            return PclZip::errorCode();
          }
          $v_sort_value = $v_result_list[$p_options_list[$i]][$j]['start'];
        }

        // ----- Sort the items
        if ($v_sort_flag) {

          // TBC : To Be Completed

          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "List sorting is not yet write ...");
        }

        // ----- Next option
        $i++;
        break;

      // ----- Look for options that request no value
      case PCLZIP_OPT_REMOVE_ALL_PATH:
      case PCLZIP_OPT_EXTRACT_AS_STRING:
      case PCLZIP_OPT_NO_COMPRESSION:
      case PCLZIP_OPT_EXTRACT_IN_OUTPUT:
      case PCLZIP_OPT_REPLACE_NEWER:
      case PCLZIP_OPT_STOP_ON_ERROR:
        $v_result_list[$p_options_list[$i]] = true;

        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
        break;

      // ----- Look for options that request an octal value
      case PCLZIP_OPT_SET_CHMOD:

        // ----- Check the number of parameters
        if ($i + 1 >= $p_size) {

          // ----- Error log
          PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'");

          // ----- Return

          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
          return PclZip::errorCode();
        }

        // ----- Get the value
        $v_result_list[$p_options_list[$i]] = $p_options_list[$i + 1];

        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
        $i++;
        break;

      // ----- Look for options that request a call-back
      case PCLZIP_CB_PRE_EXTRACT:
      case PCLZIP_CB_POST_EXTRACT:
      case PCLZIP_CB_PRE_ADD:
      case PCLZIP_CB_POST_ADD:

        /* for futur use
           case PCLZIP_CB_PRE_DELETE :
           case PCLZIP_CB_POST_DELETE :
           case PCLZIP_CB_PRE_LIST :
           case PCLZIP_CB_POST_LIST :
           */

        // ----- Check the number of parameters
        if ($i + 1 >= $p_size) {

          // ----- Error log
          PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'");

          // ----- Return

          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
          return PclZip::errorCode();
        }

        // ----- Get the value
        $v_function_name = $p_options_list[$i + 1];

        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "call-back ".PclZipUtilOptionText($p_options_list[$i])." = '".$v_function_name."'");

        // ----- Check that the value is a valid existing function
        if (!function_exists($v_function_name)) {

          // ----- Error log
          PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '" . $v_function_name . "()' is not an existing function for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'");

          // ----- Return

          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
          return PclZip::errorCode();
        }

        // ----- Set the attribute
        $v_result_list[$p_options_list[$i]] = $v_function_name;
        $i++;
        break;
      default:

        // ----- Error log
        PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Unknown parameter '" . $p_options_list[$i] . "'");

        // ----- Return

        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
        return PclZip::errorCode();
    }

    // ----- Next options
    $i++;
  }

  // ----- Look for mandatory options
  if ($v_requested_options !== false) {
    for ($key = reset($v_requested_options); $key = key($v_requested_options); $key = next($v_requested_options)) {

      // ----- Look for mandatory option
      if ($v_requested_options[$key] == 'mandatory') {

        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Detect a mandatory option : ".PclZipUtilOptionText($key)."(".$key.")");

        // ----- Look if present
        if (!isset($v_result_list[$key])) {

          // ----- Error log
          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter " . PclZipUtilOptionText($key) . "(" . $key . ")");

          // ----- Return

          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
          return PclZip::errorCode();
        }
      }
    }
  }

  // ----- Return

  //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  return $v_result;
}