private void DealQuest(Quest quest) { if (questProcessor != null) { QuestProcessDelegate process = questProcessor.GetQuestProcessDelegate(quest.Method()); if (process != null) { RunQuestProcessor(quest, process); } else { if (quest.IsTwoWay()) { Answer answer = new Answer(quest); answer.FillErrorInfo(ErrorCode.FPNN_EC_CORE_UNKNOWN_METHOD, "This method is not supported by client."); SendAnswer(answer); } } } else { if (quest.IsTwoWay()) { Answer answer = new Answer(quest); answer.FillErrorInfo(ErrorCode.FPNN_EC_CORE_INVALID_PACKAGE, "Client without quest processor."); SendAnswer(answer); } } }
//----------------[ Quest & Answer Processing ]-----------------------// private void RunQuestProcessor(Quest quest, QuestProcessDelegate process) { TCPConnection conn = this; ClientEngine.RunTask(() => { Answer answer = null; bool asyncAnswered = false; AdvancedAnswerInfo.Reset(conn, quest); try { answer = process(connectionId, endpoint.ToString(), quest); } catch (Exception ex) { if (errorRecorder != null) { errorRecorder.RecordError("Run quest process for method: " + quest.Method(), ex); } } finally { asyncAnswered = AdvancedAnswerInfo.Answered(); } if (quest.IsTwoWay() && !asyncAnswered) { if (answer == null) { answer = new Answer(quest); answer.FillErrorInfo(ErrorCode.FPNN_EC_CORE_UNKNOWN_ERROR, "Two way quest " + quest.Method() + " lose an answer."); } SendAnswer(answer); } else { if (answer != null) { if (errorRecorder != null) { if (quest.IsOneWay()) { errorRecorder.RecordError("Answer created for one way quest: " + quest.Method()); } else { errorRecorder.RecordError("Answer created reduplicated for two way quest: " + quest.Method()); } } } } }); }