void Respond(agsXMPP.protocol.client.Message msg) { QBCommandsHandler qbCH = null; bool responded = false; string toJid = msg.From.Bare + "/" + msg.From.Resource; string command = msg.Body.Trim(); try { ThreadPool.QueueUserWorkItem(Waiter, Thread.CurrentThread); switch (command) { case "/Status": Send(toJid, "<Status>Alive</Status>"); responded = true; break; case "/ConnectorVersion": //temporally hard coded Send(toJid, "<ConnectorVersion>" + 0.1 + "</ConnectorVersion>"); responded = true; break; case "/Shutdown": Send(toJid, "<Status>ShuttingDown</Status>"); responded = true; break; case "/SyncDone": //temp solution if (m_syncHandler != null) m_syncHandler.SyncDone(); Send(toJid, "<Status>Alive</Status>"); responded = true; break; default: if (command.StartsWith("/QB/")) { //To debug the timeout //Thread.Sleep(m_timeout*2); qbCH = new QBCommandsHandler(); if (qbCH.ConnectToQB()) { QBSession(toJid, command, qbCH); qbCH.DisconnectFromQB(); } else Send(toJid, "<QuickbooksError>Failed to begin QuickBook session!</QuickbooksError>"); responded = true; } break; } //abort from inside will only raise an exception //Thread.CurrentThread.Abort(); } catch (ThreadAbortException ex) { LogHelper.Error(ex); if (responded == false) //For thread is aborted from outside, e.Message.Equals("Timeout!") will not return true Send(toJid, "<QuickbooksError>Timeout!</QuickbooksError>"); } finally { if (qbCH != null) { if (qbCH.Ticket != null) qbCH.DisconnectFromQB(); } //Thread.CurrentThread.Abort(); } }
private void QBSession(String toJid, string command, QBCommandsHandler qbCH) { if (qbCH.Ticket == null) { Send(toJid, "<QuickbooksError>Null m_ticket Error!</QuickbooksError>"); return; } switch (command) { case "/QB/Status": //Send(toJid, "<QBStatus>Alive</QBStatus>"); Send(toJid, qbCH.QBStatus()); break; case "/QB/QBXMLVersionsForSession": Send(toJid, qbCH.QBXMLVersion()); break; case "/QB/CompanyFileName": //Send(toJid, "<Status>Alive</Status>"); Send(toJid, qbCH.QBCompanyFileName()); break; default: if (command.StartsWith("/QB/ProcessRequest")) //Send(toJid, "<Status>Alive</Status>"); Send(toJid, qbCH.QBProcessRequest(command.Replace("/QB/ProcessRequest", ""))); /* * the validation would be responsed through Http else if (command.StartsWith("/QB/CompanyMarkerValidation")) //Send(toJid, "<Status>Alive</Status>"); qbCH.QBProcessPlainXML("CompanyMarkerValidation", command.Replace("/QB/CompanyMarkerValidation", "")); else if (command.StartsWith("/QB/SyncMarkerValidation")) //Send(toJid, "<Status>Alive</Status>"); qbCH.QBProcessPlainXML("CompanyMarkerValidation", command.Replace("/QB/SyncMarkerValidation", "")); */ //else if (command.StartsWith("/QB/SyncDone")) //Send(toJid, "<Status>Alive</Status>"); //qbCH.QBProcessPlainXML("SyncDone", command.Replace("/QB/SyncDone", "")); //wake up the timer of synchandler //m_syncHandler.SyncDone(); //without receiving any response, the xmpp connection won't get poped from the queue //Send(toJid, qbCH.QBStatus()); break; } }