summaryrefslogtreecommitdiffstats
path: root/plugins/scheduler/bwscheduler.h
blob: e752b1d63d01e9ac0ccc36cba9f28529dbc311d5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
/***************************************************************************
 *   Copyright (C) 2006 by Ivan Vasić                                      *
 *   ivasic@gmail.com                                                      *
 *                                                                         *
 *   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.,                                       *
 *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.           *
 ***************************************************************************/
#ifndef KTBWSCHEDULER_H
#define KTBWSCHEDULER_H

#include <interfaces/coreinterface.h>

namespace kt
{
	
	typedef enum bws_category
	{
		CAT_NORMAL,
		CAT_FIRST,
		CAT_SECOND,
		CAT_THIRD,
		CAT_OFF
	}ScheduleCategory;
	
	/**
	 * @author Ivan Vasic <ivasic@gmail.com>
	 * @brief This class represents bandwidth schedule for the week.
	 * It simplifies usage of 2 dimensional schedule (array) and its transfer between classes.
	 */
	class BWS
	{
		///Schedule
		ScheduleCategory** m_schedule;
									   
		///Download categories
		int download[3];
		///Upload categories
		int upload[3];
		
		public:
			BWS();
			BWS& operator=(const BWS& b);
			~BWS();
			
			/**
			 * @brief Resets this schedule.
			 */
			void reset();
			
			
			/**
			 * Gets download rate for category <i>cat</i>.
			 * @param cat download category index
			 * @return Download rate in KB/s
			 */
			int getDownload(int cat);
			
			/**
			 * Gets upload rate for category <i>cat</i>.
			 * @param cat upload category index
			 * @return upload rate in KB/s
			 */
			int getUpload(int cat);
			
			
			/**
			 * @brief Gets category for specified <i>day</i> and <i>hour</i>.
			 * @param day Number of day in a week.
			 * @param hour Hour of the day.
			 * @return ScheduleCategory - category associated with that day/hour.
			 */
			ScheduleCategory getCategory(int day, int hour);
			
			
			/**
			 * @brief Sets download rate for a category.
			 * @param cat Category to set rate to.
			 * @param val Download rate to set to category in KB/s
			 */
			void setDownload(int cat, int val);
			
			/**
			 * @brief Sets upload rate for a category.
			 * @param cat Category to set rate to.
			 * @param val Upload rate to set to category in KB/s
			 */
			void setUpload(int cat, int val);
			
			
			/**
			 * @brief Sets category for specified <i>day</i>/<i>hour</i> combination.
			 * @param day Day of the week.
			 * @param hour Hour of the day.
			 * @param val Category value.
			 */
			void setCategory(int day, int hour, ScheduleCategory val);
			
			///Prints schedule to LogViewer. Used only for debugging.
			void debug();
	};
	
	
	/**
	 * @brief Bandwidth scheduler class.
	 * @author Ivan Vasic <ivasic@gmail.com>
	 * Singleton class. Used to keep bandwidth schedule and change download/upload rate as necessary.
	 */
	class BWScheduler
	{
		public:
			inline static BWScheduler& instance()
			{
				static BWScheduler self;
				return self;
			}
			~BWScheduler();
			
			/**
			 * Triggers bandwidth limit changes (if needed).
			 */
			void trigger();
			
			/**
			 * Sets a new schedule.
			 * @param sch - new BWS schedule.
			 * @note Call trigger() after setting new schedule for changes to take effect.
			 */
			void setSchedule(const BWS& sch);
			
			/**
			 * Sets a pointer to CoreInterface.
			 * Needed for getting global bandwidth limits.
			 * @param core Pointer to CoreInterface
			 */
			void setCoreInterface(CoreInterface* core);
			
			///Pauses all torrents (TURN OFF category)
			void pauseAll();
			
			///Loads schedule from HD
			void loadSchedule();
			///Saves schedule to HD
			void saveSchedule();

	void setEnabled(bool theValue);
	
			
		protected:
			BWScheduler();
			BWScheduler(const BWScheduler&);
			BWScheduler& operator=(const BWScheduler&);
			
			BWS m_schedule;
			CoreInterface* m_core;
			
			bool m_enabled;
	};
}

#endif