-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathusermanager.cpp
87 lines (68 loc) · 2.28 KB
/
usermanager.cpp
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
#include "usermanager.h"
#include "user.h"
#include "nntpproxy.h"
#include "database.h"
#include <QTcpSocket>
UserManager::UserManager(): MyManager<User>("User"){}
UserManager::~UserManager(){}
User * UserManager::addUser(const QString & aIpAddress, const QString & aLogin){
User * tmpUser = new User(aIpAddress, aLogin);
// Mutex for both find and append
QMutexLocker lock(mMutex);
User * user = find(tmpUser, false);
if (user != Q_NULLPTR)
delete tmpUser;
else {
user = tmpUser;
iList.append(user);
}
user->newInputConnection();
return user;
}
bool UserManager::releaseUser(User *aUser, Database &aDb){
QTextStream &ostream = NntpProxy::acquireLog(iLogPrefix);
ostream << "releasing user: " << *aUser;
NntpProxy::releaseLog();
// User has not been inserted via addUser
if (aUser->getNumberOfInputConnection() == 0) {
_log("Error: user didn't have any input connection");
return false;
}
aUser->delInputConnection();
if (aUser->getNumberOfInputConnection() == 0){
bool err = iList.removeOne(aUser);
if (!err)
_log(QString("Error removing user: ").append(aUser->getLogin()));
aDb.addUserSize(aUser);
delete aUser;
_log("> user deleted...");
return err;
} else {
// User has some connections left
_log("> user has still active thread...");
return true;
}
}
bool UserManager::setUserBlocked(const QString & aLogin, bool blockUser) const{
bool userFound = false;
for (QList<User *>::const_iterator it = iList.cbegin(); it != iList.cend(); ++it){
if ((*it)->getLogin() == aLogin){
userFound = true;
(*it)->setBlocked(blockUser);
// We don't break as we want to block the user for all Ips
}
}
return userFound;
}
User *UserManager::getUserHavingTooMuchNntpConnection_noLock(int aNbMaxOfNntpConByUser) const{
User * user = Q_NULLPTR;
ushort maxNbNntpCon = 0;
for (int i=0; i<iList.size(); ++i){
ushort nbCon = iList[i]->getNumberOfNntpConnection_noLock();
if ( (nbCon > aNbMaxOfNntpConByUser) && (nbCon > maxNbNntpCon) ){
maxNbNntpCon = nbCon;
user = iList[i];
}
}
return user;
}