Browse Source
* Added command scheduler, currently it only calls option handler.
* Added command scheduler, currently it only calls option handler.
git-svn-id: svn://rakshasa.no/libtorrent/trunk/rtorrent@609 e378c898-3ddf-0310-93e7-cc216c733640pull/30/head
17 changed files with 540 additions and 50 deletions
-
123rak/functional_fun.h
-
26rak/priority_queue_default.h
-
4src/Makefile.am
-
106src/command_scheduler.cc
-
77src/command_scheduler.h
-
59src/command_scheduler_item.cc
-
80src/command_scheduler_item.h
-
8src/control.cc
-
14src/control.h
-
2src/core/manager.h
-
2src/display/window.h
-
45src/main.cc
-
2src/option_file.cc
-
10src/option_handler.cc
-
3src/option_handler.h
-
26src/option_handler_rules.cc
-
3src/option_handler_rules.h
@ -0,0 +1,106 @@ |
|||
// rTorrent - BitTorrent client
|
|||
// Copyright (C) 2005, Jari Sundell
|
|||
//
|
|||
// This program is free software; you can redistribute it and/or modify
|
|||
// it under the terms of the GNU General Public License as published by
|
|||
// the Free Software Foundation; either version 2 of the License, or
|
|||
// (at your option) any later version.
|
|||
//
|
|||
// This program is distributed in the hope that it will be useful,
|
|||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|||
// GNU General Public License for more details.
|
|||
//
|
|||
// You should have received a copy of the GNU General Public License
|
|||
// along with this program; if not, write to the Free Software
|
|||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|||
//
|
|||
// In addition, as a special exception, the copyright holders give
|
|||
// permission to link the code of portions of this program with the
|
|||
// OpenSSL library under certain conditions as described in each
|
|||
// individual source file, and distribute linked combinations
|
|||
// including the two.
|
|||
//
|
|||
// You must obey the GNU General Public License in all respects for
|
|||
// all of the code used other than OpenSSL. If you modify file(s)
|
|||
// with this exception, you may extend this exception to your version
|
|||
// of the file(s), but you are not obligated to do so. If you do not
|
|||
// wish to do so, delete this exception statement from your version.
|
|||
// If you delete this exception statement from all source files in the
|
|||
// program, then also delete it here.
|
|||
//
|
|||
// Contact: Jari Sundell <jaris@ifi.uio.no>
|
|||
//
|
|||
// Skomakerveien 33
|
|||
// 3185 Skoppum, NORWAY
|
|||
|
|||
#include "config.h"
|
|||
|
|||
#include <algorithm>
|
|||
#include <rak/functional.h>
|
|||
#include <torrent/exceptions.h>
|
|||
|
|||
#include "command_scheduler.h"
|
|||
#include "command_scheduler_item.h"
|
|||
|
|||
CommandScheduler::~CommandScheduler() { |
|||
std::for_each(begin(), end(), rak::call_delete<CommandSchedulerItem>()); |
|||
} |
|||
|
|||
CommandScheduler::iterator |
|||
CommandScheduler::find(const std::string& key) { |
|||
return std::find_if(begin(), end(), rak::equal(key, std::mem_fun(&CommandSchedulerItem::key))); |
|||
} |
|||
|
|||
CommandScheduler::iterator |
|||
CommandScheduler::insert(const std::string& key) { |
|||
if (key.empty()) |
|||
throw torrent::input_error("Scheduler received an empty key."); |
|||
|
|||
iterator itr = find(key); |
|||
|
|||
if (itr == end()) |
|||
itr = base_type::insert(end(), NULL); |
|||
else |
|||
delete *itr; |
|||
|
|||
*itr = new CommandSchedulerItem(key); |
|||
(*itr)->set_slot(rak::bind_mem_fn(this, &CommandScheduler::call_item, *itr)); |
|||
|
|||
return itr; |
|||
} |
|||
|
|||
void |
|||
CommandScheduler::erase(iterator itr) { |
|||
if (itr == end()) |
|||
return; |
|||
|
|||
delete *itr; |
|||
base_type::erase(itr); |
|||
} |
|||
|
|||
void |
|||
CommandScheduler::call_item(value_type item) { |
|||
if (item->is_queued()) |
|||
throw torrent::internal_error("CommandScheduler::call_item(...) called but item is still queued."); |
|||
|
|||
if (std::find(begin(), end(), item) == end()) |
|||
throw torrent::internal_error("CommandScheduler::call_item(...) called but the item isn't in the scheduler."); |
|||
|
|||
// Remove the item before calling the command if it should be
|
|||
// removed.
|
|||
|
|||
try { |
|||
m_slotCommand(item->command()); |
|||
|
|||
} catch (torrent::input_error& e) { |
|||
if (m_slotErrorMessage.is_valid()) |
|||
m_slotErrorMessage("Scheduled command failed: " + item->key() + ": " + e.what()); |
|||
} |
|||
|
|||
uint32_t interval = item->interval(); |
|||
|
|||
// Enable if we caught a torrrent::input_error?
|
|||
if (interval != 0) |
|||
item->enable(interval); |
|||
} |
@ -0,0 +1,77 @@ |
|||
// rTorrent - BitTorrent client |
|||
// Copyright (C) 2005, Jari Sundell |
|||
// |
|||
// This program is free software; you can redistribute it and/or modify |
|||
// it under the terms of the GNU General Public License as published by |
|||
// the Free Software Foundation; either version 2 of the License, or |
|||
// (at your option) any later version. |
|||
// |
|||
// This program is distributed in the hope that it will be useful, |
|||
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
// GNU General Public License for more details. |
|||
// |
|||
// You should have received a copy of the GNU General Public License |
|||
// along with this program; if not, write to the Free Software |
|||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|||
// |
|||
// In addition, as a special exception, the copyright holders give |
|||
// permission to link the code of portions of this program with the |
|||
// OpenSSL library under certain conditions as described in each |
|||
// individual source file, and distribute linked combinations |
|||
// including the two. |
|||
// |
|||
// You must obey the GNU General Public License in all respects for |
|||
// all of the code used other than OpenSSL. If you modify file(s) |
|||
// with this exception, you may extend this exception to your version |
|||
// of the file(s), but you are not obligated to do so. If you do not |
|||
// wish to do so, delete this exception statement from your version. |
|||
// If you delete this exception statement from all source files in the |
|||
// program, then also delete it here. |
|||
// |
|||
// Contact: Jari Sundell <jaris@ifi.uio.no> |
|||
// |
|||
// Skomakerveien 33 |
|||
// 3185 Skoppum, NORWAY |
|||
|
|||
#ifndef RTORRENT_COMMAND_SCHEDULER_H |
|||
#define RTORRENT_COMMAND_SCHEDULER_H |
|||
|
|||
#include <vector> |
|||
#include <string> |
|||
#include <rak/functional_fun.h> |
|||
|
|||
class CommandSchedulerItem; |
|||
|
|||
class CommandScheduler : public std::vector<CommandSchedulerItem*> { |
|||
public: |
|||
typedef rak::function1<void, const std::string&> SlotString; |
|||
typedef std::vector<CommandSchedulerItem*> base_type; |
|||
|
|||
using base_type::value_type; |
|||
using base_type::begin; |
|||
using base_type::end; |
|||
|
|||
CommandScheduler() {} |
|||
~CommandScheduler(); |
|||
|
|||
void set_slot_command(SlotString::base_type* s) { m_slotCommand.set(s); } |
|||
void set_slot_error_message(SlotString::base_type* s) { m_slotErrorMessage.set(s); } |
|||
|
|||
// slot_error_message or something. |
|||
|
|||
iterator find(const std::string& key); |
|||
|
|||
// If the key already exists then the old item is deleted. It is |
|||
// safe to call erase on end(). |
|||
iterator insert(const std::string& key); |
|||
void erase(iterator itr); |
|||
|
|||
private: |
|||
void call_item(value_type item); |
|||
|
|||
SlotString m_slotCommand; |
|||
SlotString m_slotErrorMessage; |
|||
}; |
|||
|
|||
#endif |
@ -0,0 +1,59 @@ |
|||
// rTorrent - BitTorrent client
|
|||
// Copyright (C) 2005, Jari Sundell
|
|||
//
|
|||
// This program is free software; you can redistribute it and/or modify
|
|||
// it under the terms of the GNU General Public License as published by
|
|||
// the Free Software Foundation; either version 2 of the License, or
|
|||
// (at your option) any later version.
|
|||
//
|
|||
// This program is distributed in the hope that it will be useful,
|
|||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|||
// GNU General Public License for more details.
|
|||
//
|
|||
// You should have received a copy of the GNU General Public License
|
|||
// along with this program; if not, write to the Free Software
|
|||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|||
//
|
|||
// In addition, as a special exception, the copyright holders give
|
|||
// permission to link the code of portions of this program with the
|
|||
// OpenSSL library under certain conditions as described in each
|
|||
// individual source file, and distribute linked combinations
|
|||
// including the two.
|
|||
//
|
|||
// You must obey the GNU General Public License in all respects for
|
|||
// all of the code used other than OpenSSL. If you modify file(s)
|
|||
// with this exception, you may extend this exception to your version
|
|||
// of the file(s), but you are not obligated to do so. If you do not
|
|||
// wish to do so, delete this exception statement from your version.
|
|||
// If you delete this exception statement from all source files in the
|
|||
// program, then also delete it here.
|
|||
//
|
|||
// Contact: Jari Sundell <jaris@ifi.uio.no>
|
|||
//
|
|||
// Skomakerveien 33
|
|||
// 3185 Skoppum, NORWAY
|
|||
|
|||
#include "config.h"
|
|||
|
|||
#include "command_scheduler_item.h"
|
|||
|
|||
CommandSchedulerItem::~CommandSchedulerItem() { |
|||
priority_queue_erase(&taskScheduler, &m_task); |
|||
} |
|||
|
|||
void |
|||
CommandSchedulerItem::enable(uint32_t first) { |
|||
if (is_queued()) |
|||
disable(); |
|||
|
|||
// If 'first' is zero then we execute the task
|
|||
// immediately. ''interval()'' will not return zero so we never end
|
|||
// up in an infinit loop.
|
|||
priority_queue_insert(&taskScheduler, &m_task, (cachedTime + ((int64_t)first * 1000000)).round_seconds()); |
|||
} |
|||
|
|||
void |
|||
CommandSchedulerItem::disable() { |
|||
priority_queue_erase(&taskScheduler, &m_task); |
|||
} |
@ -0,0 +1,80 @@ |
|||
// rTorrent - BitTorrent client |
|||
// Copyright (C) 2005, Jari Sundell |
|||
// |
|||
// This program is free software; you can redistribute it and/or modify |
|||
// it under the terms of the GNU General Public License as published by |
|||
// the Free Software Foundation; either version 2 of the License, or |
|||
// (at your option) any later version. |
|||
// |
|||
// This program is distributed in the hope that it will be useful, |
|||
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
// GNU General Public License for more details. |
|||
// |
|||
// You should have received a copy of the GNU General Public License |
|||
// along with this program; if not, write to the Free Software |
|||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|||
// |
|||
// In addition, as a special exception, the copyright holders give |
|||
// permission to link the code of portions of this program with the |
|||
// OpenSSL library under certain conditions as described in each |
|||
// individual source file, and distribute linked combinations |
|||
// including the two. |
|||
// |
|||
// You must obey the GNU General Public License in all respects for |
|||
// all of the code used other than OpenSSL. If you modify file(s) |
|||
// with this exception, you may extend this exception to your version |
|||
// of the file(s), but you are not obligated to do so. If you do not |
|||
// wish to do so, delete this exception statement from your version. |
|||
// If you delete this exception statement from all source files in the |
|||
// program, then also delete it here. |
|||
// |
|||
// Contact: Jari Sundell <jaris@ifi.uio.no> |
|||
// |
|||
// Skomakerveien 33 |
|||
// 3185 Skoppum, NORWAY |
|||
|
|||
#ifndef RTORRENT_COMMAND_SCHEDULER_ITEM_H |
|||
#define RTORRENT_COMMAND_SCHEDULER_ITEM_H |
|||
|
|||
#include "globals.h" |
|||
|
|||
class CommandSchedulerItem { |
|||
public: |
|||
typedef rak::function0<void> Slot; |
|||
|
|||
CommandSchedulerItem(const std::string& key) : m_key(key), m_interval(0) {} |
|||
~CommandSchedulerItem(); |
|||
|
|||
bool is_queued() const { return m_task.is_queued(); } |
|||
|
|||
//void enable() { enable(interval()); } |
|||
void enable(uint32_t first); |
|||
void disable(); |
|||
|
|||
const std::string& key() const { return m_key; } |
|||
|
|||
const std::string& command() const { return m_command; } |
|||
void set_command(const std::string& s) { m_command = s; } |
|||
|
|||
// 'interval()' should in the future return some more dynamic values. |
|||
uint32_t interval() const { return m_interval; } |
|||
void set_interval(uint32_t v) { m_interval = v; } |
|||
|
|||
void set_slot(Slot::base_type* s) { m_task.set_slot(s); } |
|||
|
|||
private: |
|||
CommandSchedulerItem(const CommandSchedulerItem&); |
|||
void operator = (const CommandSchedulerItem&); |
|||
|
|||
std::string m_key; |
|||
std::string m_command; |
|||
|
|||
uint32_t m_interval; |
|||
|
|||
rak::priority_item m_task; |
|||
|
|||
// Flags for various things. |
|||
}; |
|||
|
|||
#endif |
Write
Preview
Loading…
Cancel
Save
Reference in new issue