/**
 * multi
 *
 * @param $action
 */
function dispatcher_multi($action)
{
    global $cfg;
    // is enabled ?
    if ($cfg["enable_multiops"] != 1) {
        AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: " . $cfg["user"] . " tried to use multi-op " . $action);
        @error("multiops are disabled", "", "");
    }
    // messages-ary
    $dispatcherMessages = array();
    // loop
    if (empty($_POST['transfer'])) {
        return;
    }
    foreach ($_POST['transfer'] as $key => $element) {
        // url-decode
        $transfer = urldecode($element);
        // is valid transfer ? + check permissions
        $invalid = true;
        if (tfb_isValidTransfer($transfer) === true) {
            if (substr($transfer, -8) == ".torrent") {
                // this is a torrent-client
                $invalid = false;
            } else {
                if (substr($transfer, -5) == ".wget") {
                    // this is wget.
                    $invalid = false;
                    // is enabled ?
                    if ($cfg["enable_wget"] == 0) {
                        $invalid = true;
                        AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: " . $cfg["user"] . " tried to use wget");
                        array_push($dispatcherMessages, "wget is disabled : " . $transfer);
                    } else {
                        if ($cfg["enable_wget"] == 1) {
                            if (!$cfg['isAdmin']) {
                                $invalid = true;
                                AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: " . $cfg["user"] . " tried to use wget");
                                array_push($dispatcherMessages, "wget is disabled for users : " . $transfer);
                            }
                        }
                    }
                } else {
                    if (substr($transfer, -4) == ".nzb") {
                        // This is nzbperl.
                        $invalid = false;
                        if ($cfg["enable_nzbperl"] == 0) {
                            $invalid = true;
                            AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: " . $cfg["user"] . " tried to use nzbperl");
                            array_push($dispatcherMessages, "nzbperl is disabled : " . $transfer);
                        } else {
                            if ($cfg["enable_nzbperl"] == 1) {
                                if (!$cfg['isAdmin']) {
                                    $invalid = true;
                                    AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: " . $cfg["user"] . " tried to use nzbperl");
                                    array_push($dispatcherMessages, "nzbperl is disabled for users : " . $transfer);
                                }
                            }
                        }
                    }
                }
            }
        }
        if ($invalid) {
            AuditAction($cfg["constants"]["error"], "INVALID TRANSFER: " . $cfg["user"] . " tried to " . $action . " " . $transfer);
            array_push($dispatcherMessages, "Invalid Transfer : " . $transfer);
            continue;
        }
        // client
        $client = getTransferClient($transfer);
        // is transfer running ?
        $tRunningFlag = isTransferRunning($transfer);
        // action switch
        switch ($action) {
            case "transferStart":
                /* transferStart */
                if (!$tRunningFlag) {
                    $ch = ClientHandler::getInstance($client);
                    $ch->start($transfer, false, FluxdQmgr::isRunning());
                    if (count($ch->messages) > 0) {
                        $dispatcherMessages = array_merge($dispatcherMessages, $ch->messages);
                    }
                }
                break;
            case "transferStop":
                /* transferStop */
                if ($tRunningFlag) {
                    $ch = ClientHandler::getInstance($client);
                    $ch->stop($transfer);
                    if (count($ch->messages) > 0) {
                        $dispatcherMessages = array_merge($dispatcherMessages, $ch->messages);
                    }
                }
                break;
            case "transferEnQueue":
                /* transferEnQueue */
                if (!$tRunningFlag) {
                    // enqueue it
                    $ch = ClientHandler::getInstance($client);
                    $ch->start($transfer, false, true);
                    if (count($ch->messages) > 0) {
                        $dispatcherMessages = array_merge($dispatcherMessages, $ch->messages);
                    }
                }
                break;
            case "transferDeQueue":
                /* transferDeQueue */
                if (!$tRunningFlag) {
                    // dequeue it
                    FluxdQmgr::dequeueTransfer($transfer, $cfg['user']);
                }
                break;
            case "transferResetTotals":
                /* transferResetTotals */
                $msgs = resetTransferTotals($transfer, false);
                if (count($msgs) > 0) {
                    $dispatcherMessages = array_merge($dispatcherMessages, $msgs);
                }
                break;
            default:
                if ($tRunningFlag) {
                    // stop first
                    $ch = ClientHandler::getInstance($client);
                    $ch->stop($transfer);
                    if (count($ch->messages) > 0) {
                        $dispatcherMessages = array_merge($dispatcherMessages, $ch->messages);
                    }
                    // is transfer running ?
                    $tRunningFlag = isTransferRunning($transfer);
                }
                // if it was running... hope the thing is down...
                // only continue if it is
                if (!$tRunningFlag) {
                    switch ($action) {
                        case "transferWipe":
                            /* transferWipe */
                            $msgsDelete = deleteTransferData($transfer);
                            if (count($msgsDelete) > 0) {
                                $dispatcherMessages = array_merge($dispatcherMessages, $msgsDelete);
                            }
                            $msgsReset = resetTransferTotals($transfer, true);
                            if (count($msgsReset) > 0) {
                                $dispatcherMessages = array_merge($dispatcherMessages, $msgsReset);
                            }
                            break;
                        case "transferData":
                            /* transferData */
                            $msgsDelete = deleteTransferData($transfer);
                            if (count($msgsDelete) > 0) {
                                $dispatcherMessages = array_merge($dispatcherMessages, $msgsDelete);
                            }
                        case "transfer":
                            /* transfer */
                            $ch = ClientHandler::getInstance($client);
                            $ch->delete($transfer);
                            if (count($ch->messages) > 0) {
                                $dispatcherMessages = array_merge($dispatcherMessages, $ch->messages);
                            }
                    }
                }
        }
        // end switch
    }
    // end loop
    // error if messages
    if (count($dispatcherMessages) > 0) {
        @error("There were Problems", "", "", $dispatcherMessages);
    }
}
 /**
  * Wipe Transfer
  *
  * @param $transfer
  * @return mixed
  */
 function _transferWipe($transfer)
 {
     global $cfg;
     // check transfer
     if (!transferExists($transfer)) {
         $this->_outputError("transfer does not exist.\n");
         return false;
     }
     $this->_outputMessage("Wipe " . $transfer . " ...\n");
     // set user
     $cfg["user"] = getOwner($transfer);
     // wipe
     $ch = ClientHandler::getInstance(getTransferClient($transfer));
     $tRunningFlag = isTransferRunning($transfer);
     if ($tRunningFlag) {
         // stop transfer first
         $this->_outputMessage("transfer is running, stopping first...\n");
         $ch->stop($transfer);
         $tRunningFlag = isTransferRunning($transfer);
     }
     if (!$tRunningFlag) {
         $this->_outputMessage("Deleting...\n");
         $msgsDelete = deleteTransferData($transfer);
         $countDelete = count($msgsDelete);
         $msgsReset = resetTransferTotals($transfer, true);
         $countReset = count($msgsReset);
         if ($countDelete + $countReset == 0) {
             $this->_outputMessage("done.\n");
             return true;
         } else {
             $this->_outputError("there were problems: " . ($countDelete > 0 ? implode("\n", $msgsDelete) . "\n" : "") . ($countReset > 0 ? implode("\n", $msgsReset) : "") . "\n");
             return false;
         }
     } else {
         $this->_outputError("transfer still up... cannot delete\n");
         return false;
     }
 }