Allow multiple connections to backend servers which have cleared the single instance flag

master
Timothy Pearson 12 years ago
parent 962bc5cda4
commit 26a027c939

@ -638,7 +638,7 @@ AC_DEFUN([KDE_SUBST_PROGRAMS],
if test -n "$trinity14ornewer"; then if test -n "$trinity14ornewer"; then
KDE_FIND_PATH(tdeconfig_compiler, KCONFIG_COMPILER, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(tdeconfig_compiler)]) KDE_FIND_PATH(tdeconfig_compiler, KCONFIG_COMPILER, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(tdeconfig_compiler)])
KDE_FIND_PATH(dcopidlng, DCOPIDLNG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidlng)]) KDE_FIND_PATH(dcopidlng, DCOPIDLNG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidlng)])
KDE_FIND_PATH(makekdewidgets, MAKEKDEWIDGETS, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(makekdewidgets)]) KDE_FIND_PATH(maketdewidgets, MAKEKDEWIDGETS, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(maketdewidgets)])
AC_SUBST(MAKEKDEWIDGETS) AC_SUBST(MAKEKDEWIDGETS)
fi fi
KDE_FIND_PATH(xmllint, XMLLINT, [${prefix}/bin ${exec_prefix}/bin], [XMLLINT=""]) KDE_FIND_PATH(xmllint, XMLLINT, [${prefix}/bin ${exec_prefix}/bin], [XMLLINT=""])
@ -2319,7 +2319,7 @@ if test $kde_qtver = 4; then
AC_SUBST(LIB_KJS, "-lkjs") AC_SUBST(LIB_KJS, "-lkjs")
AC_SUBST(LIB_SMB, "-lsmb") AC_SUBST(LIB_SMB, "-lsmb")
AC_SUBST(LIB_KAB, "-lkab") AC_SUBST(LIB_KAB, "-lkab")
AC_SUBST(LIB_KABC, "-lkabc") AC_SUBST(LIB_TDEABC, "-ltdeabc")
AC_SUBST(LIB_TDEHTML, "-ltdehtml") AC_SUBST(LIB_TDEHTML, "-ltdehtml")
AC_SUBST(LIB_KSPELL, "-ltdespell") AC_SUBST(LIB_KSPELL, "-ltdespell")
AC_SUBST(LIB_KPARTS, "-ltdeparts") AC_SUBST(LIB_KPARTS, "-ltdeparts")
@ -2345,7 +2345,7 @@ elif test $kde_qtver = 3; then
AC_SUBST(LIB_KJS, "-lkjs") AC_SUBST(LIB_KJS, "-lkjs")
AC_SUBST(LIB_SMB, "-lsmb") AC_SUBST(LIB_SMB, "-lsmb")
AC_SUBST(LIB_KAB, "-lkab") AC_SUBST(LIB_KAB, "-lkab")
AC_SUBST(LIB_KABC, "-lkabc") AC_SUBST(LIB_TDEABC, "-ltdeabc")
AC_SUBST(LIB_TDEHTML, "-ltdehtml") AC_SUBST(LIB_TDEHTML, "-ltdehtml")
AC_SUBST(LIB_KSPELL, "-ltdespell") AC_SUBST(LIB_KSPELL, "-ltdespell")
AC_SUBST(LIB_KPARTS, "-ltdeparts") AC_SUBST(LIB_KPARTS, "-ltdeparts")

@ -417,6 +417,7 @@ void AuthSocket::commandLoop() {
while (m_databaseStationsCursor->next()) { while (m_databaseStationsCursor->next()) {
bool authorized = false; bool authorized = false;
bool in_use = false; bool in_use = false;
bool multi_use = false;
int ngroups = 0; int ngroups = 0;
gid_t *groups; gid_t *groups;
@ -462,7 +463,7 @@ void AuthSocket::commandLoop() {
} }
} }
if ((authorized) && (!in_use)) { if (authorized) {
StationType st; StationType st;
st.id = m_databaseStationsCursor->value("pk").toInt(); st.id = m_databaseStationsCursor->value("pk").toInt();
st.name = m_databaseStationsCursor->value("name").toString(); st.name = m_databaseStationsCursor->value("name").toString();
@ -480,6 +481,7 @@ void AuthSocket::commandLoop() {
char tempchar; char tempchar;
tempchar = m_databaseServiceTypesCursor->value("single_instance").toInt(); tempchar = m_databaseServiceTypesCursor->value("single_instance").toInt();
svt.singleInstance = (tempchar != 0); svt.singleInstance = (tempchar != 0);
if (!svt.singleInstance) multi_use = true;
} }
if (svt.name == "") { if (svt.name == "") {
svt.name = i18n("<unknown>"); svt.name = i18n("<unknown>");
@ -490,9 +492,11 @@ void AuthSocket::commandLoop() {
st.services.append(svt); st.services.append(svt);
} }
if ((!in_use) || (multi_use)) {
m_slist.append(st); m_slist.append(st);
} }
} }
}
ds << m_slist; ds << m_slist;
writeEndOfFrame(); writeEndOfFrame();
@ -573,19 +577,48 @@ void AuthSocket::commandLoop() {
} }
else { else {
// Find the service ID for the specified client library name // Find the service ID for the specified client library name
TQ_INT32 sid = -1; TQInt32List sidList;
m_databaseServiceTypesCursor->select(TQString("client_library='%1'").arg(libname)); m_databaseServiceTypesCursor->select(TQString("client_library='%1'").arg(libname));
if (m_databaseServiceTypesCursor->next()) { if (m_databaseServiceTypesCursor->next()) {
sid = m_databaseServiceTypesCursor->value("serviceid").toInt(); sidList.append(m_databaseServiceTypesCursor->value("serviceid").toInt());
} }
if (sid < 0) { if (sidList.empty()) {
ds << TQString("ERRNOSERV"); ds << TQString("ERRNOSERV");
writeEndOfFrame(); writeEndOfFrame();
} }
else { else {
// Attempt to connect to the backend server // Attempt to connect to the backend server
m_databaseServicesCursor->select(TQString("servicetype=%1 AND station=%2").arg(sid).arg(m_stationID)); TQ_INT32 sid = -1;
while (1) {
m_databaseServicesCursor->select(TQString("servicetype=%1 AND station=%2").arg(sidList[0]).arg(m_stationID));
if (m_databaseServicesCursor->next()) { if (m_databaseServicesCursor->next()) {
sid = sidList[0];
break;
}
sidList.remove(sidList.at(0));
if (sidList.isEmpty()) {
break;
}
}
if (sid != -1) {
// Enforce single instance flags
bool available = true;
m_databaseServiceTypesCursor->select(TQString("serviceid=%1").arg(sid));
if (m_databaseServiceTypesCursor->next()) {
char tempchar;
tempchar = m_databaseServiceTypesCursor->value("single_instance").toInt();
if (tempchar != 0) {
// Verify that service is not already in use
m_databaseActivityCursor->select(TQString("station=%1 AND serviceid=%2").arg(m_databaseStationsCursor->value("pk").toInt()).arg(sid));
while (m_databaseActivityCursor->next()) {
if (m_databaseActivityCursor->value("username").toString() != "") {
available = false;
}
}
}
}
if (available) {
m_srvServiceHostName = m_databaseServicesCursor->value("hostname").toString(); m_srvServiceHostName = m_databaseServicesCursor->value("hostname").toString();
m_srvServicePort = m_databaseServicesCursor->value("port").toInt(); m_srvServicePort = m_databaseServicesCursor->value("port").toInt();
@ -617,6 +650,11 @@ void AuthSocket::commandLoop() {
writeEndOfFrame(); writeEndOfFrame();
} }
} }
else {
ds << TQString("ERRNOSERV");
writeEndOfFrame();
}
}
} }
} }
} }

Loading…
Cancel
Save