diff --git a/src/utils/Makefile b/src/utils/Makefile index 3e4e0b8..dc02348 100644 --- a/src/utils/Makefile +++ b/src/utils/Makefile @@ -12,6 +12,7 @@ INC += pv/configuration.h INC += pv/likely.h INC += pv/wildcard.h INC += pv/fairQueue.h +INC += pv/requester.h INC += pv/destroyable.h LIBSRCS += hexDump.cpp @@ -20,4 +21,5 @@ LIBSRCS += logger.cpp LIBSRCS += introspectionRegistry.cpp LIBSRCS += configuration.cpp LIBSRCS += referenceCountingLock.cpp +LIBSRCS += requester.cpp LIBSRCS += wildcard.cpp diff --git a/src/utils/pv/requester.h b/src/utils/pv/requester.h new file mode 100644 index 0000000..f27d1ba --- /dev/null +++ b/src/utils/pv/requester.h @@ -0,0 +1,71 @@ +/* requester.h */ +/* + * Copyright information and license terms for this software can be + * found in the file LICENSE that is included with the distribution + */ +/** + * @author mrk + */ +#ifndef REQUESTER_H +#define REQUESTER_H +#include + +#include +#include + +#include + +namespace epics { namespace pvData { + +class Requester; +typedef std::tr1::shared_ptr RequesterPtr; + +enum MessageType { + infoMessage,warningMessage,errorMessage,fatalErrorMessage +}; +#define MESSAGE_TYPE_COUNT 4 + +epicsShareExtern std::string getMessageTypeName(MessageType messageType); + +/** + * @brief Callback class for passing messages to a requester. + * + * This is used by many other classes and also extended by other classes. + * The request is passed a message and a messageType. + * A message is just a string and a messageType is: +@code +enum MessageType { + infoMessage,warningMessage,errorMessage,fatalErrorMessage +}; +@endcode + * + */ + +class epicsShareClass Requester { +public: + POINTER_DEFINITIONS(Requester); + /** + * Destructor + */ + virtual ~Requester(){} + /** + * The requester must have a name. + * @return The requester's name. + */ + virtual std::string getRequesterName() = 0; + /** + * + * A message for the requester. + * @param message The message. + * @param messageType The type of message: + @code + enum MessageType { + infoMessage,warningMessage,errorMessage,fatalErrorMessage + }; + @endcode + */ + virtual void message(std::string const & message,MessageType messageType); +}; + +}} +#endif /* REQUESTER_H */ diff --git a/src/utils/requester.cpp b/src/utils/requester.cpp new file mode 100644 index 0000000..69599a6 --- /dev/null +++ b/src/utils/requester.cpp @@ -0,0 +1,44 @@ +/* requester.cpp */ +/* + * Copyright information and license terms for this software can be + * found in the file LICENSE that is included with the distribution + */ +/** + * @author mrk + */ +#include +#include +#include + +#include + +#define epicsExportSharedSymbols +#include +#include + +using std::string; + +namespace epics { namespace pvData { + +static StringArray messageTypeName(MESSAGE_TYPE_COUNT); + +string getMessageTypeName(MessageType messageType) +{ + // TODO not thread-safe + static Mutex mutex; + Lock xx(mutex); + if(messageTypeName[0].size()==0) { + messageTypeName[0] = "info"; + messageTypeName[1] = "warning"; + messageTypeName[2] = "error"; + messageTypeName[3] = "fatalError"; + } + return messageTypeName[messageType]; +} + +void Requester::message(std::string const & message,MessageType messageType) +{ + std::cerr << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")\n"; +} + +}}