Пример #1
0
void CoasterChannel::dispatchRequest() {
	if (handlers.count(rtag) == 0) {
		// initial request
		string name;
		msg.buf->str(name);

		// Done with data
		msg.deleteBuffer();

		LogDebug << "Handling initial request for " << name << endl;
		Handler* h = handlerFactory->newInstance(name);
		if (h == NULL) {
			LogWarn << "Unknown handler: " << name << endl;
		}
		else {
			registerHandler(rtag, h);
		}
	}
	else {
		Handler* h = handlers[rtag];
		if (rflags & FLAG_SIGNAL) {
			try {
				h->signalReceived(msg.detachBuffer());
			}
			catch (exception &e) {
				LogWarn << "Handler::signalReceived() threw exception: " << e.what() << endl;
			}
			catch (...) {
				LogWarn << "Handler::signalReceived() threw unknown exception" << endl;
			}
			unregisterHandler(h);
		}
		else {
			h->dataReceived(msg.detachBuffer(), rflags);

			if (rflags & FLAG_FINAL) {
				try {
					h->receiveCompleted(rflags);
				}
				catch (exception &e) {
					LogWarn << "Handler::receiveCompleted() threw exception: " << e.what() << endl;
				}
				catch (...) {
					LogWarn << "Handler::receiveCompleted() threw unknown exception" << endl;
				}
				unregisterHandler(h);
			}
		}
	}
}