Changeset View
Changeset View
Standalone View
Standalone View
src/core/slavebase.cpp
Show First 20 Lines • Show All 55 Lines • ▼ Show 20 Line(s) | |||||
56 | #include "slaveinterface.h" | 56 | #include "slaveinterface.h" | ||
57 | #include "kpasswdserverclient.h" | 57 | #include "kpasswdserverclient.h" | ||
58 | #include "kiocoredebug.h" | 58 | #include "kiocoredebug.h" | ||
59 | 59 | | |||
60 | #ifdef Q_OS_UNIX | 60 | #ifdef Q_OS_UNIX | ||
61 | #include <KAuth> | 61 | #include <KAuth> | ||
62 | #endif | 62 | #endif | ||
63 | 63 | | |||
64 | #if KIO_ASSERT_SLAVE_STATES | ||||
65 | #define KIO_STATE_ASSERT(cond, where, what) Q_ASSERT_X(cond, where, what) | ||||
66 | #else | ||||
67 | #define KIO_STATE_ASSERT(cond, where, what) qCWarning(KIO_CORE) << what | ||||
dfaure: Don't you mean if(!cond) { qCWarning... } ? Otherwise the warning will be shown every time, no… | |||||
68 | #endif | ||||
69 | | ||||
64 | extern "C" { | 70 | extern "C" { | ||
65 | static void sigpipe_handler(int sig); | 71 | static void sigpipe_handler(int sig); | ||
66 | } | 72 | } | ||
67 | 73 | | |||
68 | using namespace KIO; | 74 | using namespace KIO; | ||
69 | 75 | | |||
70 | typedef QList<QByteArray> AuthKeysList; | 76 | typedef QList<QByteArray> AuthKeysList; | ||
71 | typedef QMap<QString, QByteArray> AuthKeysMap; | 77 | typedef QMap<QString, QByteArray> AuthKeysMap; | ||
▲ Show 20 Lines • Show All 46 Lines • ▼ Show 20 Line(s) | 88 | public: | |||
118 | QUrl onHoldUrl; | 124 | QUrl onHoldUrl; | ||
119 | 125 | | |||
120 | QElapsedTimer lastTimeout; | 126 | QElapsedTimer lastTimeout; | ||
121 | QElapsedTimer nextTimeout; | 127 | QElapsedTimer nextTimeout; | ||
122 | qint64 nextTimeoutMsecs; | 128 | qint64 nextTimeoutMsecs; | ||
123 | KIO::filesize_t totalSize; | 129 | KIO::filesize_t totalSize; | ||
124 | KRemoteEncoding *remotefile; | 130 | KRemoteEncoding *remotefile; | ||
125 | enum { Idle, InsideMethod, FinishedCalled, ErrorCalled } m_state; | 131 | enum { Idle, InsideMethod, FinishedCalled, ErrorCalled } m_state; | ||
132 | bool m_finalityCommand = true; // whether finished() or error() may/must be called | ||||
126 | QByteArray timeoutData; | 133 | QByteArray timeoutData; | ||
127 | 134 | | |||
128 | KPasswdServerClient *m_passwdServerClient; | 135 | KPasswdServerClient *m_passwdServerClient; | ||
129 | bool m_rootEntryListed = false; | 136 | bool m_rootEntryListed = false; | ||
130 | 137 | | |||
131 | bool m_confirmationAsked; | 138 | bool m_confirmationAsked; | ||
132 | QSet<QString> m_tempAuths; | 139 | QSet<QString> m_tempAuths; | ||
133 | QString m_warningCaption; | 140 | QString m_warningCaption; | ||
▲ Show 20 Lines • Show All 46 Lines • ▼ Show 20 Line(s) | 179 | { | |||
180 | } | 187 | } | ||
181 | 188 | | |||
182 | end = q->mIncomingMetaData.constEnd(); | 189 | end = q->mIncomingMetaData.constEnd(); | ||
183 | for (MetaData::ConstIterator it = q->mIncomingMetaData.constBegin(); it != end; ++it) { | 190 | for (MetaData::ConstIterator it = q->mIncomingMetaData.constBegin(); it != end; ++it) { | ||
184 | configGroup->writeEntry(it.key(), it->toUtf8(), KConfigGroup::WriteConfigFlags()); | 191 | configGroup->writeEntry(it.key(), it->toUtf8(), KConfigGroup::WriteConfigFlags()); | ||
185 | } | 192 | } | ||
186 | } | 193 | } | ||
187 | 194 | | |||
195 | bool finalState() const | ||||
196 | { | ||||
197 | return ((m_state == FinishedCalled) || (m_state == ErrorCalled)); | ||||
198 | } | ||||
199 | | ||||
188 | void verifyState(const char *cmdName) | 200 | void verifyState(const char *cmdName) | ||
189 | { | 201 | { | ||
190 | if ((m_state != FinishedCalled) && (m_state != ErrorCalled)) { | 202 | KIO_STATE_ASSERT(finalState(), | ||
191 | qCWarning(KIO_CORE) << cmdName << "did not call finished() or error()! Please fix the" << QCoreApplication::applicationName() << "KIO slave"; | 203 | Q_FUNC_INFO, | ||
204 | qUtf8Printable(QStringLiteral("%1 did not call finished() or error()! Please fix the %2 KIO slave") | ||||
205 | .arg(cmdName) | ||||
206 | .arg(QCoreApplication::applicationName()))); | ||||
207 | // Force the command into finished state. We'll not reach this for Debug builds | ||||
208 | // that fail the assertion. For Release builds we'll have made sure that the | ||||
dfaure: typo: Release | |||||
209 | // command is actually finished after the verification regardless of what | ||||
dfaure: typo: verification | |||||
210 | // the slave did. | ||||
211 | if (!finalState()) { | ||||
212 | q->finished(); | ||||
192 | } | 213 | } | ||
193 | } | 214 | } | ||
194 | 215 | | |||
195 | void verifyErrorFinishedNotCalled(const char *cmdName) | 216 | void verifyErrorFinishedNotCalled(const char *cmdName) | ||
196 | { | 217 | { | ||
197 | if (m_state == FinishedCalled || m_state == ErrorCalled) { | 218 | KIO_STATE_ASSERT(!finalState(), | ||
198 | qCWarning(KIO_CORE) << cmdName << "called finished() or error(), but it's not supposed to! Please fix the" << QCoreApplication::applicationName() << "KIO slave"; | 219 | Q_FUNC_INFO, | ||
199 | } | 220 | qUtf8Printable(QStringLiteral("%1 called finished() or error(), but it's not supposed to! Please fix the %2 KIO slave") | ||
221 | .arg(cmdName) | ||||
222 | .arg(QCoreApplication::applicationName()))); | ||||
200 | } | 223 | } | ||
201 | 224 | | |||
202 | KPasswdServerClient *passwdServerClient() | 225 | KPasswdServerClient *passwdServerClient() | ||
203 | { | 226 | { | ||
204 | if (!m_passwdServerClient) { | 227 | if (!m_passwdServerClient) { | ||
205 | m_passwdServerClient = new KPasswdServerClient; | 228 | m_passwdServerClient = new KPasswdServerClient; | ||
206 | } | 229 | } | ||
207 | 230 | | |||
▲ Show 20 Lines • Show All 245 Lines • ▼ Show 20 Line(s) | |||||
453 | { | 476 | { | ||
454 | sendMetaData(); | 477 | sendMetaData(); | ||
455 | send(MSG_OPENED); | 478 | send(MSG_OPENED); | ||
456 | d->inOpenLoop = true; | 479 | d->inOpenLoop = true; | ||
457 | } | 480 | } | ||
458 | 481 | | |||
459 | void SlaveBase::error(int _errid, const QString &_text) | 482 | void SlaveBase::error(int _errid, const QString &_text) | ||
460 | { | 483 | { | ||
484 | KIO_STATE_ASSERT(d->m_finalityCommand, | ||||
485 | Q_FUNC_INFO, | ||||
486 | qUtf8Printable(QStringLiteral("error() was called, but it's not supposed to! Please fix the %1 KIO slave") | ||||
dfaure: should be %1, not %2 | |||||
487 | .arg(QCoreApplication::applicationName()))); | ||||
488 | | ||||
461 | if (d->m_state == d->ErrorCalled) { | 489 | if (d->m_state == d->ErrorCalled) { | ||
462 | qCWarning(KIO_CORE) << "error() called twice! Please fix the" << QCoreApplication::applicationName() << "KIO slave"; | 490 | KIO_STATE_ASSERT(false, | ||
491 | Q_FUNC_INFO, | ||||
492 | qUtf8Printable(QStringLiteral("error() called twice! Please fix the %1 KIO slave") | ||||
493 | .arg(QCoreApplication::applicationName()))); | ||||
463 | return; | 494 | return; | ||
464 | } else if (d->m_state == d->FinishedCalled) { | 495 | } else if (d->m_state == d->FinishedCalled) { | ||
465 | qCWarning(KIO_CORE) << "error() called after finished()! Please fix the" << QCoreApplication::applicationName() << "KIO slave"; | 496 | KIO_STATE_ASSERT(false, | ||
497 | Q_FUNC_INFO, | ||||
498 | qUtf8Printable(QStringLiteral("error() called after finished()! Please fix the %1 KIO slave") | ||||
499 | .arg(QCoreApplication::applicationName()))); | ||||
466 | return; | 500 | return; | ||
467 | } | 501 | } | ||
468 | 502 | | |||
469 | d->m_state = d->ErrorCalled; | 503 | d->m_state = d->ErrorCalled; | ||
470 | mIncomingMetaData.clear(); // Clear meta data | 504 | mIncomingMetaData.clear(); // Clear meta data | ||
471 | d->rebuildConfig(); | 505 | d->rebuildConfig(); | ||
472 | mOutgoingMetaData.clear(); | 506 | mOutgoingMetaData.clear(); | ||
473 | KIO_DATA << static_cast<qint32>(_errid) << _text; | 507 | KIO_DATA << static_cast<qint32>(_errid) << _text; | ||
Show All 23 Lines | 525 | if (!d->m_rootEntryListed) { | |||
497 | entry.fastInsert(KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IXOTH); | 531 | entry.fastInsert(KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IXOTH); | ||
498 | d->pendingListEntries.append(entry); | 532 | d->pendingListEntries.append(entry); | ||
499 | } | 533 | } | ||
500 | 534 | | |||
501 | listEntries(d->pendingListEntries); | 535 | listEntries(d->pendingListEntries); | ||
502 | d->pendingListEntries.clear(); | 536 | d->pendingListEntries.clear(); | ||
503 | } | 537 | } | ||
504 | 538 | | |||
539 | KIO_STATE_ASSERT(d->m_finalityCommand, | ||||
540 | Q_FUNC_INFO, | ||||
541 | qUtf8Printable(QStringLiteral("finished() was called, but it's not supposed to! Please fix the %2 KIO slave") | ||||
542 | .arg(QCoreApplication::applicationName()))); | ||||
543 | | ||||
505 | if (d->m_state == d->FinishedCalled) { | 544 | if (d->m_state == d->FinishedCalled) { | ||
506 | qCWarning(KIO_CORE) << "finished() called twice! Please fix the" << QCoreApplication::applicationName() << "KIO slave"; | 545 | KIO_STATE_ASSERT(false, | ||
546 | Q_FUNC_INFO, | ||||
547 | qUtf8Printable(QStringLiteral("finished() called twice! Please fix the %1 KIO slave") | ||||
548 | .arg(QCoreApplication::applicationName()))); | ||||
507 | return; | 549 | return; | ||
508 | } else if (d->m_state == d->ErrorCalled) { | 550 | } else if (d->m_state == d->ErrorCalled) { | ||
509 | qCWarning(KIO_CORE) << "finished() called after error()! Please fix the" << QCoreApplication::applicationName() << "KIO slave"; | 551 | KIO_STATE_ASSERT(false, | ||
552 | Q_FUNC_INFO, | ||||
553 | qUtf8Printable(QStringLiteral("finished() called after error()! Please fix the %1 KIO slave") | ||||
554 | .arg(QCoreApplication::applicationName()))); | ||||
510 | return; | 555 | return; | ||
511 | } | 556 | } | ||
512 | 557 | | |||
513 | d->m_state = d->FinishedCalled; | 558 | d->m_state = d->FinishedCalled; | ||
514 | mIncomingMetaData.clear(); // Clear meta data | 559 | mIncomingMetaData.clear(); // Clear meta data | ||
515 | d->rebuildConfig(); | 560 | d->rebuildConfig(); | ||
516 | sendMetaData(); | 561 | sendMetaData(); | ||
517 | send(MSG_FINISHED); | 562 | send(MSG_FINISHED); | ||
▲ Show 20 Lines • Show All 539 Lines • ▼ Show 20 Line(s) | |||||
1057 | 1102 | | |||
1058 | void SlaveBase::dispatch(int command, const QByteArray &data) | 1103 | void SlaveBase::dispatch(int command, const QByteArray &data) | ||
1059 | { | 1104 | { | ||
1060 | QDataStream stream(data); | 1105 | QDataStream stream(data); | ||
1061 | 1106 | | |||
1062 | QUrl url; | 1107 | QUrl url; | ||
1063 | int i; | 1108 | int i; | ||
1064 | 1109 | | |||
1110 | d->m_finalityCommand = true; // default | ||||
1111 | | ||||
1065 | switch (command) { | 1112 | switch (command) { | ||
1066 | case CMD_HOST: { | 1113 | case CMD_HOST: { | ||
1067 | QString passwd; | 1114 | QString passwd; | ||
1068 | QString host, user; | 1115 | QString host, user; | ||
1069 | quint16 port; | 1116 | quint16 port; | ||
1070 | stream >> host >> port >> user >> passwd; | 1117 | stream >> host >> port >> user >> passwd; | ||
1071 | d->m_state = d->InsideMethod; | 1118 | d->m_state = d->InsideMethod; | ||
1119 | d->m_finalityCommand = false; | ||||
1072 | setHost(host, port, user, passwd); | 1120 | setHost(host, port, user, passwd); | ||
1073 | d->verifyErrorFinishedNotCalled("setHost()"); | | |||
1074 | d->m_state = d->Idle; | 1121 | d->m_state = d->Idle; | ||
1075 | } break; | 1122 | } break; | ||
1076 | case CMD_CONNECT: { | 1123 | case CMD_CONNECT: { | ||
1077 | openConnection(); | 1124 | openConnection(); | ||
1078 | } break; | 1125 | } break; | ||
1079 | case CMD_DISCONNECT: { | 1126 | case CMD_DISCONNECT: { | ||
1080 | closeConnection(); | 1127 | closeConnection(); | ||
1081 | } break; | 1128 | } break; | ||
1082 | case CMD_SLAVE_STATUS: { | 1129 | case CMD_SLAVE_STATUS: { | ||
1083 | d->m_state = d->InsideMethod; | 1130 | d->m_state = d->InsideMethod; | ||
1131 | d->m_finalityCommand = false; | ||||
1084 | slave_status(); | 1132 | slave_status(); | ||
1085 | // TODO verify that the slave has called slaveStatus()? | 1133 | // TODO verify that the slave has called slaveStatus()? | ||
1086 | d->verifyErrorFinishedNotCalled("slave_status()"); | | |||
1087 | d->m_state = d->Idle; | 1134 | d->m_state = d->Idle; | ||
1088 | } break; | 1135 | } break; | ||
1089 | case CMD_SLAVE_CONNECT: { | 1136 | case CMD_SLAVE_CONNECT: { | ||
1090 | d->onHold = false; | 1137 | d->onHold = false; | ||
1091 | QString app_socket; | 1138 | QString app_socket; | ||
1092 | QDataStream stream(data); | 1139 | QDataStream stream(data); | ||
1093 | stream >> app_socket; | 1140 | stream >> app_socket; | ||
1094 | d->appConnection.send(MSG_SLAVE_ACK); | 1141 | d->appConnection.send(MSG_SLAVE_ACK); | ||
Show All 10 Lines | 1147 | case CMD_SLAVE_HOLD: { | |||
1105 | d->onHold = true; | 1152 | d->onHold = true; | ||
1106 | disconnectSlave(); | 1153 | disconnectSlave(); | ||
1107 | d->isConnectedToApp = false; | 1154 | d->isConnectedToApp = false; | ||
1108 | // Do not close connection! | 1155 | // Do not close connection! | ||
1109 | connectSlave(d->poolSocket); | 1156 | connectSlave(d->poolSocket); | ||
1110 | } break; | 1157 | } break; | ||
1111 | case CMD_REPARSECONFIGURATION: { | 1158 | case CMD_REPARSECONFIGURATION: { | ||
1112 | d->m_state = d->InsideMethod; | 1159 | d->m_state = d->InsideMethod; | ||
1160 | d->m_finalityCommand = false; | ||||
1113 | reparseConfiguration(); | 1161 | reparseConfiguration(); | ||
1114 | d->verifyErrorFinishedNotCalled("reparseConfiguration()"); | | |||
1115 | d->m_state = d->Idle; | 1162 | d->m_state = d->Idle; | ||
1116 | } break; | 1163 | } break; | ||
1117 | case CMD_CONFIG: { | 1164 | case CMD_CONFIG: { | ||
1118 | stream >> d->configData; | 1165 | stream >> d->configData; | ||
1119 | d->rebuildConfig(); | 1166 | d->rebuildConfig(); | ||
1120 | delete d->remotefile; | 1167 | delete d->remotefile; | ||
1121 | d->remotefile = nullptr; | 1168 | d->remotefile = nullptr; | ||
1122 | } break; | 1169 | } break; | ||
▲ Show 20 Lines • Show All 361 Lines • Show Last 20 Lines |
Don't you mean if(!cond) { qCWarning... } ? Otherwise the warning will be shown every time, no matter what the condition says.
Or more precisely,
for the usual brace nesting problem.