/* CIRCDDB - ircDDB client library in C++ Copyright (C) 2010-2011 Michael Dirska, DL1BFF (dl1bff@mdx.de) Copyright (C) 2011,2012 Jonathan Naylor, G4KLX This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #if !defined(_IRCDDBMULTICLIENT_H) #define _IRCDDBMULTICLIENT_H #include "IRCDDB.h" #include #include //Small data container to keep track of queries with sent to the inner clients class CIRCDDBMultiClientQuery { public: CIRCDDBMultiClientQuery(const wxString& user, const wxString& repeater, const wxString& gateway, const wxString& address, const wxString& timestamp, IRCDDB_RESPONSE_TYPE type) : m_user(user.Clone()), m_repeater(repeater.Clone()), m_gateway(gateway.Clone()), m_address(address.Clone()), m_timestamp(timestamp.Clone()), m_type(type), m_responseCount(0) { } wxString getUser() const { return m_user; } wxString getRepeater() const { return m_repeater; } wxString getGateway() const { return m_gateway; } wxString getAddress() const { return m_address; } wxString getTimestamp() const { return m_timestamp; } unsigned int getResponseCount() { return m_responseCount; } unsigned int incrementResponseCount() { ++m_responseCount; //wxLogMessage(wxT("Resp Count : %s %d"), toString(), m_responseCount); return m_responseCount; } /* Updates the entry, but only if the timestamp is newer. if an address was already specified it is kept. */ void Update(const wxString& user, const wxString& repeater, const wxString& gateway, const wxString& address, const wxString& timestamp) { //wxLogMessage(wxT("Before : %s"), toString()); if (timestamp.IsEmpty() || timestamp.Cmp(m_timestamp) >= 0) { m_user = user.Clone(); m_repeater = repeater.Clone(); m_gateway = gateway.Clone(); m_timestamp = timestamp.Clone(); if(m_address.IsEmpty() && !address.IsEmpty()) m_address = address.Clone(); } //wxLogMessage(wxT("After : %s"), toString()); } IRCDDB_RESPONSE_TYPE getType() { return m_type; } wxString toString() { return wxString::Format(wxT("%s %s %s %s %s"), m_user, m_repeater, m_gateway, m_address, m_timestamp); } private: wxString m_user; wxString m_repeater; wxString m_gateway; wxString m_address; wxString m_timestamp; IRCDDB_RESPONSE_TYPE m_type; unsigned int m_responseCount; }; WX_DECLARE_STRING_HASH_MAP(CIRCDDBMultiClientQuery*, CIRCDDBMultiClientQuery_HashMap); WX_DEFINE_ARRAY_PTR(CIRCDDBMultiClientQuery*, CIRCDDBMultiClientQuery_Array); class CIRCDDBMultiClient : public CIRCDDB { public: CIRCDDBMultiClient(const CIRCDDB_Array& clients); ~CIRCDDBMultiClient(); // Inherited via CIRCDDB virtual bool open(); virtual void rptrQTH(const wxString & callsign, double latitude, double longitude, const wxString & desc1, const wxString & desc2, const wxString & infoURL); virtual void rptrQRG(const wxString & callsign, double txFrequency, double duplexShift, double range, double agl); virtual void kickWatchdog(const wxString & callsign, const wxString & wdInfo); virtual int getConnectionState() ; virtual bool sendHeard(const wxString & myCall, const wxString & myCallExt, const wxString & yourCall, const wxString & rpt1, const wxString & rpt2, unsigned char flag1, unsigned char flag2, unsigned char flag3); virtual bool sendHeardWithTXMsg(const wxString & myCall, const wxString & myCallExt, const wxString & yourCall, const wxString & rpt1, const wxString & rpt2, unsigned char flag1, unsigned char flag2, unsigned char flag3, const wxString & network_destination, const wxString & tx_message); virtual bool sendHeardWithTXStats(const wxString & myCall, const wxString & myCallExt, const wxString & yourCall, const wxString & rpt1, const wxString & rpt2, unsigned char flag1, unsigned char flag2, unsigned char flag3, int num_dv_frames, int num_dv_silent_frames, int num_bit_errors); virtual bool findGateway(const wxString & gatewayCallsign); virtual bool findRepeater(const wxString & repeaterCallsign); virtual bool findUser(const wxString & userCallsign); virtual IRCDDB_RESPONSE_TYPE getMessageType(); virtual bool receiveRepeater(wxString & repeaterCallsign, wxString & gatewayCallsign, wxString & address); virtual bool receiveGateway(wxString & gatewayCallsign, wxString & address); virtual bool receiveUser(wxString & userCallsign, wxString & repeaterCallsign, wxString & gatewayCallsign, wxString & address); virtual bool receiveUser(wxString & userCallsign, wxString & repeaterCallsign, wxString & gatewayCallsign, wxString & address, wxString & timeStamp); virtual void close(); // private : CIRCDDB_Array m_clients; wxMutex m_queriesLock, m_responseQueueLock; CIRCDDBMultiClientQuery_HashMap m_userQueries; CIRCDDBMultiClientQuery_HashMap m_repeaterQueries; CIRCDDBMultiClientQuery_HashMap m_gatewayQueries; CIRCDDBMultiClientQuery_Array m_responseQueue; CIRCDDBMultiClientQuery * checkAndGetNextResponse(IRCDDB_RESPONSE_TYPE expectedType, wxString errorMessage); void pushQuery(IRCDDB_RESPONSE_TYPE type, const wxString& key, CIRCDDBMultiClientQuery * query); CIRCDDBMultiClientQuery * popQuery(IRCDDB_RESPONSE_TYPE type, const wxString& key); CIRCDDBMultiClientQuery_HashMap * getQueriesHashMap(IRCDDB_RESPONSE_TYPE type); }; #endif