// $Id$ // // The contents of this file are subject to the BOINC Public License // Version 1.0 (the "License"); you may not use this file except in // compliance with the License. You may obtain a copy of the License at // http://boinc.berkeley.edu/license_1.0.txt // // Software distributed under the License is distributed on an "AS IS" // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the // License for the specific language governing rights and limitations // under the License. // // The Original Code is the Berkeley Open Infrastructure for Network Computing. // // The Initial Developer of the Original Code is the SETI@home project. // Portions created by the SETI@home project are Copyright (C) 2002 // University of California at Berkeley. All Rights Reserved. // // Contributor(s): // // Revision History: // // $Log$ // Revision 1.9 2004/07/13 06:10:32 rwalton // Fixed a typo // // Revision 1.8 2004/07/13 05:56:01 rwalton // Hooked up the Project and Work tab for the new GUI. // // Revision 1.7 2004/07/12 08:46:25 rwalton // Document parsing of the message // // Revision 1.6 2004/06/25 22:50:56 rwalton // Client spamming server hotfix // // Revision 1.5 2004/05/17 22:15:09 rwalton // *** empty log message *** // // #if defined(__GNUG__) && !defined(__APPLE__) #pragma implementation "MainDocument.h" #endif #include "stdwx.h" #include "MainDocument.h" #include "error_numbers.h" IMPLEMENT_DYNAMIC_CLASS(CMainDocument, CXMLParser) CMainDocument::CMainDocument() { m_pSocket = new wxSocketClient(wxSOCKET_WAITALL); m_bCachedStateLocked = false; m_dtCachedStateLockTimestamp = wxDateTime::Now(); m_dtCachedStateTimestamp = 0; } CMainDocument::~CMainDocument() { m_dtCachedStateTimestamp = wxDateTime::Now(); m_dtCachedStateLockTimestamp = wxDateTime::Now(); m_bCachedStateLocked = false; if (m_pSocket) delete m_pSocket; } wxInt32 CMainDocument::SendMessageToCore(wxString& strMessage, wxTextInputStream** pTextInput) { if (!m_pSocket->IsConnected()) { wxIPV4address addr; addr.Hostname("localhost"); addr.Service(31416); if (!m_pSocket->Connect(addr, TRUE)) { return ERR_CONNECT; } m_pSocketOutput = new wxSocketOutputStream(*m_pSocket); if (!m_pSocketOutput) return ERR_MALLOC; m_pSocketInput = new wxSocketInputStream(*m_pSocket); if (!m_pSocketInput) return ERR_MALLOC; m_pTextOutput = new wxTextOutputStream(*m_pSocketOutput, wxEOL_UNIX); if (!m_pTextOutput) return ERR_MALLOC; m_pTextInput = new wxTextInputStream(*m_pSocketInput); if (!m_pTextInput) return ERR_MALLOC; } m_pTextOutput->WriteString(strMessage); (*pTextInput) = m_pTextInput; return 0; } wxInt32 CMainDocument::CachedStateLock() { m_bCachedStateLocked = true; m_dtCachedStateLockTimestamp = wxDateTime::Now(); return 0; } wxInt32 CMainDocument::CachedStateUnlock() { m_bCachedStateLocked = false; return 0; } wxInt32 CMainDocument::GetProjectCount() { CachedStateUpdate(); return m_Projects.GetCount(); } wxString CMainDocument::GetProjectName(wxInt32 iIndex) { CachedStateUpdate(); return m_Projects.Item(iIndex).GetProjectName(); } wxString CMainDocument::GetProjectAccountName(wxInt32 iIndex) { CachedStateUpdate(); return m_Projects.Item(iIndex).GetUserName(); } wxString CMainDocument::GetProjectTotalCredit(wxInt32 iIndex) { CachedStateUpdate(); return wxString::Format(_T("%0.2f"), m_Projects.Item(iIndex).GetUserTotalCredit()); } wxString CMainDocument::GetProjectAvgCredit(wxInt32 iIndex) { CachedStateUpdate(); return wxString::Format(_T("%0.2f"), m_Projects.Item(iIndex).GetUserExpAvgCredit()); } wxString CMainDocument::GetProjectResourceShare(wxInt32 iIndex) { CachedStateUpdate(); return wxString::Format(_T("%0.2f%%"), m_Projects.Item(iIndex).GetResourceShare()); } wxInt32 CMainDocument::GetResultCount() { CachedStateUpdate(); return m_Results.GetCount(); } wxString CMainDocument::GetResultProjectName(wxInt32 iIndex) { CachedStateUpdate(); return m_Results.Item(iIndex).GetProject()->GetProjectName(); } wxString CMainDocument::GetResultApplicationName(wxInt32 iIndex) { CachedStateUpdate(); return m_Results.Item(iIndex).GetApp()->GetName(); } wxString CMainDocument::GetResultName(wxInt32 iIndex) { CachedStateUpdate(); return m_Results.Item(iIndex).GetName(); } wxString CMainDocument::GetResultCPUTime(wxInt32 iIndex) { CachedStateUpdate(); return wxString::Format(_T("---")); } wxString CMainDocument::GetResultProgress(wxInt32 iIndex) { CachedStateUpdate(); return wxString::Format(_T("---")); } wxString CMainDocument::GetResultTimeToCompletion(wxInt32 iIndex) { CachedStateUpdate(); return wxString::Format(_T("---")); } wxString CMainDocument::GetResultReportDeadline(wxInt32 iIndex) { CachedStateUpdate(); wxDateTime dtReportDeadline; dtReportDeadline.Set((time_t)m_Results.Item(iIndex).GetReportDeadline()); return dtReportDeadline.Format(); } wxString CMainDocument::GetResultStatus(wxInt32 iIndex) { CachedStateUpdate(); return wxString::Format(_T("---")); } wxInt32 CMainDocument::CachedStateUpdate() { wxTextInputStream* pTextInput = NULL; CProject* pProject = NULL; wxString strBuffer; wxString strMessage; wxTimeSpan ts(m_dtCachedStateLockTimestamp - m_dtCachedStateTimestamp); if (!m_bCachedStateLocked && (ts > wxTimeSpan::Seconds(300))) { wxLogTrace("CMainDocument::CachedStateUpdate - State Cache Updating..."); m_dtCachedStateTimestamp = m_dtCachedStateLockTimestamp; strMessage = ""; SendMessageToCore(strMessage, &pTextInput); m_Projects.Empty(); m_Apps.Empty(); m_AppVersions.Empty(); m_Workunits.Empty(); m_Results.Empty(); m_FileInfos.Empty(); m_ActiveTasks.Empty(); while (strBuffer = pTextInput->ReadLine()) { if (match_tag(strBuffer, "")) break; else if (match_tag(strBuffer, "")) { pProject = new CProject; pProject->Parse(pTextInput); m_Projects.Add(pProject); continue; } else if (match_tag(strBuffer, "")) { CApp* pApp = new CApp; pApp->Parse(pTextInput); pApp->SetProject(pProject); m_Apps.Add(pApp); continue; } else if (match_tag(strBuffer, "")) { CAppVersion* pAppVersion = new CAppVersion; pAppVersion->Parse(pTextInput); pAppVersion->SetProject(pProject); pAppVersion->SetApp(LookupApp(pAppVersion->GetName())); m_AppVersions.Add(pAppVersion); continue; } else if (match_tag(strBuffer, "")) { CWorkunit* pWorkunit = new CWorkunit; pWorkunit->Parse(pTextInput); pWorkunit->SetProject(pProject); pWorkunit->SetApp(LookupApp(pWorkunit->GetApplicationName())); pWorkunit->SetAppVersion(LookupAppVersion(pWorkunit->GetApplicationName(), pWorkunit->GetApplicationVersion())); m_Workunits.Add(pWorkunit); continue; } else if (match_tag(strBuffer, "")) { CResult* pResult = new CResult; pResult->Parse(pTextInput); pResult->SetProject(pProject); pResult->SetWorkunit(LookupWorkunit(pResult->GetWorkunitName())); pResult->SetApp(pResult->GetWorkunit()->GetApp()); m_Results.Add(pResult); continue; } else if (match_tag(strBuffer, "")) { CFileInfo* pFileInfo = new CFileInfo; pFileInfo->Parse(pTextInput); pFileInfo->SetProject(pProject); m_FileInfos.Add(pFileInfo); continue; } else if (match_tag(strBuffer, "")) { CActiveTask* pActiveTask = new CActiveTask; pActiveTask->Parse(pTextInput); pActiveTask->SetProject(pProject); pActiveTask->SetResult(LookupResult(pActiveTask->GetName())); m_ActiveTasks.Add(pActiveTask); continue; } else if (match_tag(strBuffer, "")) { m_ProxyInfo.Parse(pTextInput); continue; } } wxLogTrace("CMainDocument::CachedStateUpdate - State Cache Updated..."); } return 0; } CApp* CMainDocument::LookupApp(wxString& strName) { unsigned int i; CApp* pApp = NULL; for (i=0; i