CoinMessageHandler.hpp
Go to the documentation of this file.
1 /* $Id: CoinMessageHandler.hpp 1239 2009-12-10 16:16:11Z ladanyi $ */
2 // Copyright (C) 2002, International Business Machines
3 // Corporation and others. All Rights Reserved.
4 #ifndef CoinMessageHandler_H
5 #define CoinMessageHandler_H
6 
7 #if defined(_MSC_VER)
8 // Turn off compiler warning about long names
9 # pragma warning(disable:4786)
10 #endif
11 
12 
13 #include <iostream>
14 #include <cstdio>
15 #include <string>
16 #include <vector>
17 #include "CoinFinite.hpp"
18 
33 /*
34  I (jjf) am strongly in favo(u)r of language support for an open
35  source project, but I have tried to make it as lightweight as
36  possible in the sense that only a subset of messages need to be
37  defined - the rest default to US English. There will be different
38  sets of messages for each component - so at present there is a
39  Clp component and a Coin component.
40 
41  Because messages are only used in a controlled environment and have no
42  impact on code and are tested by other tests I have include tests such
43  as language and derivation in other unit tests.
44 */
45 
57 
58 public:
65  const char * message);
73 
76  void replaceMessage(const char * message);
79 
83  inline int externalNumber() const
84  {return externalNumber_;}
90  inline void setExternalNumber(int number)
91  {externalNumber_=number;}
93  inline char severity() const
94  {return severity_;}
96  inline void setDetail(int level)
97  {detail_=static_cast<char> (level);}
99  inline int detail() const
100  {return detail_;}
102  inline char * message() const
103  {return message_;}
105 
108  int externalNumber_;
111  char detail_;
113  char severity_;
115  mutable char message_[400];
117 };
118 
127 
128 public:
134  enum Language {
135  us_en = 0,
138  };
139 
143  CoinMessages(int numberMessages=0);
145  ~CoinMessages();
147  CoinMessages(const CoinMessages&);
151 
159  void addMessage(int messageNumber, const CoinOneMessage & message);
165  void replaceMessage(int messageNumber, const char * message);
167  inline Language language() const
168  {return language_;}
170  void setLanguage(Language newlanguage)
171  {language_ = newlanguage;}
173  void setDetailMessage(int newLevel, int messageNumber);
181  void setDetailMessages(int newLevel, int numberMessages,
182  int * messageNumbers);
184  void setDetailMessages(int newLevel, int low, int high);
186  inline int getClass() const
187  { return class_;}
189  void toCompact();
191  void fromCompact();
193 
196  int numberMessages_;
201  char source_[5];
203  int class_;
211 };
212 
213 // for convenience eol
217 };
218 
310 /*
311  Where there are derived classes I (jjf) have started message numbers at 1001.
312 */
313 
315 
316 friend bool CoinMessageHandlerUnitTest () ;
317 
318 private:
320  void gutsOfCopy(const CoinMessageHandler& rhs);
321 
322 public:
327  virtual int print() ;
330  virtual void checkSeverity() ;
332 
338  CoinMessageHandler(FILE *fp);
340  virtual ~CoinMessageHandler();
346  virtual CoinMessageHandler * clone() const;
348 
350  inline int detail(int messageNumber, const CoinMessages &normalMessage) const
352  { return normalMessage.message_[messageNumber]->detail();}
354  inline int logLevel() const
355  { return logLevel_;}
373  void setLogLevel(int value);
375  inline int logLevel(int which) const
376  { return logLevels_[which];}
381  void setLogLevel(int which, int value);
383  void setPrefix(bool yesNo);
385  bool prefix() const;
391  inline double doubleValue(int position) const
392  { return doubleValue_[position];}
397  inline int numberDoubleFields() const
398  {return static_cast<int>(doubleValue_.size());}
404  inline int intValue(int position) const
405  { return longValue_[position];}
410  inline int numberIntFields() const
411  {return static_cast<int>(longValue_.size());}
417  inline char charValue(int position) const
418  { return charValue_[position];}
423  inline int numberCharFields() const
424  {return static_cast<int>(charValue_.size());}
430  inline std::string stringValue(int position) const
431  { return stringValue_[position];}
436  inline int numberStringFields() const
437  {return static_cast<int>(stringValue_.size());}
438 
441  {return currentMessage_;}
443  inline std::string currentSource() const
444  {return source_;}
446  inline const char * messageBuffer() const
447  {return messageBuffer_;}
449  inline int highestNumber() const
450  {return highestNumber_;}
452  inline FILE * filePointer() const
453  { return fp_;}
455  inline void setFilePointer(FILE * fp)
456  { fp_ = fp;}
458 
467  CoinMessageHandler & message(int messageNumber,
468  const CoinMessages & messages);
483  CoinMessageHandler & message(int externalNumber,const char * header,
484  const char * msg,char severity);
489  CoinMessageHandler & operator<< (int intvalue);
490 #if COIN_BIG_INDEX==1
491 
495  CoinMessageHandler & operator<< (long longvalue);
496 #endif
497 #if COIN_BIG_INDEX==2
498 
502  CoinMessageHandler & operator<< (long long longvalue);
503 #endif
504 
508  CoinMessageHandler & operator<< (double doublevalue);
513  CoinMessageHandler & operator<< (const std::string& stringvalue);
518  CoinMessageHandler & operator<< (char charvalue);
523  CoinMessageHandler & operator<< (const char *stringvalue);
533  int finish();
543  CoinMessageHandler & printing(bool onOff);
544 
549  char * nextPerCent(char * start , const bool initial=false);
554  int internalPrint();
556 
566 #define COIN_NUM_LOG 4
567 #define COIN_MESSAGE_HANDLER_MAX_BUFFER_SIZE 1000
568 protected:
571  std::vector<double> doubleValue_;
573  std::vector<int> longValue_;
574  std::vector<char> charValue_;
575  std::vector<std::string> stringValue_;
581  int prefix_;
587  char * format_;
591  char * messageOut_;
593  std::string source_;
603  FILE * fp_;
605 };
606 
607 //#############################################################################
613 bool
615 
616 #endif
void setDetailMessage(int newLevel, int messageNumber)
Change detail level for one message.
char severity() const
Severity.
int finish()
Finish (and print) the message.
FILE * fp_
File pointer.
void setExternalNumber(int number)
Set message ID number.
char * messageOut_
Position in output buffer.
void setDetailMessages(int newLevel, int numberMessages, int *messageNumbers)
Change detail level for several messages.
virtual ~CoinMessageHandler()
Destructor.
Base class for message handling.
double doubleValue(int position) const
Values of double fields already processed.
Language language_
Language.
void setFilePointer(FILE *fp)
Set new file pointer.
int externalNumber() const
Get message ID number.
int internalNumber_
Internal number for use with enums.
CoinMessageHandler & printing(bool onOff)
Enable or disable printing of an optional portion of a message.
int numberCharFields() const
Number of char fields already processed.
void toCompact()
Moves to compact format.
std::vector< char > charValue_
values in message
char charValue(int position) const
Values of char fields already processed.
int lengthMessages_
Length of fake CoinOneMessage array.
char * nextPerCent(char *start, const bool initial=false)
Internal function to locate next format code.
int prefix_
Whether we want prefix (may get more subtle so is int)
CoinOneMessage & operator=(const CoinOneMessage &)
assignment operator.
int detail() const
Get detail level.
char severity_
Severity.
int logLevel() const
Get current log (detail) level.
std::vector< int > longValue_
values in message
void gutsOfCopy(const CoinMessageHandler &rhs)
The body of the copy constructor and the assignment operator.
CoinOneMessage ** message_
Messages.
CoinMessageHandler()
Constructor.
int getClass() const
Returns class.
CoinOneMessage()
Default constructor.
const char * messageBuffer() const
Output buffer.
~CoinMessages()
Destructor.
void setPrefix(bool yesNo)
Switch message prefix on or off.
void setDetail(int level)
Set detail level.
std::string stringValue(int position) const
Values of string fields already processed.
#define COIN_MESSAGE_HANDLER_MAX_BUFFER_SIZE
void setLanguage(Language newlanguage)
Set language.
int externalNumber_
number to print out (also determines severity)
CoinMessageHandler & operator=(const CoinMessageHandler &)
Assignment operator.
int highestNumber() const
Highest message number (indicates any errors)
CoinMessageMarker
virtual CoinMessageHandler * clone() const
Clone.
Language language() const
Language.
CoinMessageHandler & operator<<(int intvalue)
Process an integer parameter value.
std::vector< std::string > stringValue_
values in message
CoinMessageHandler & message()
Start or continue a message.
bool CoinMessageHandlerUnitTest()
A function that tests the methods in the CoinMessageHandler class.
bool prefix() const
Current setting for printing message prefix.
int numberStringFields() const
Number of string fields already processed.
virtual void checkSeverity()
Check message severity - if too bad then abort.
std::string source_
Current source of message.
char detail_
Will only print if detail matches.
int intValue(int position) const
Values of integer fields already processed.
int internalPrint()
Internal printing function.
#define COIN_NUM_LOG
Log levels will be by type and will then use type given in CoinMessage::class_.
void addMessage(int messageNumber, const CoinOneMessage &message)
Installs a new message in the specified index position.
FILE * filePointer() const
Get current file pointer.
Class to hold and manipulate an array of massaged messages.
virtual int print()
Print message, return 0 normally.
CoinOneMessage currentMessage_
Current message.
char * message() const
Return the message text.
char source_[5]
Source (null-terminated string, maximum 4 characters).
int logLevels_[COIN_NUM_LOG]
Log levels.
int detail(int messageNumber, const CoinMessages &normalMessage) const
Get detail level of a message.
char messageBuffer_[COIN_MESSAGE_HANDLER_MAX_BUFFER_SIZE]
Output buffer.
char * format_
Format string for message (remainder)
void setLogLevel(int value)
Set current log (detail) level.
void replaceMessage(const char *message)
Replace message text (e.g., text in a different language)
std::vector< double > doubleValue_
values in message
int numberIntFields() const
Number of integer fields already processed.
int class_
Class - see later on before CoinMessageHandler.
friend bool CoinMessageHandlerUnitTest()
A function that tests the methods in the CoinMessageHandler class.
CoinOneMessage currentMessage() const
Current message.
int highestNumber_
Highest message number (indicates any errors)
CoinMessages(int numberMessages=0)
Constructor with number of messages.
int logLevel(int which) const
Get alternative log level.
Class for one massaged message.
~CoinOneMessage()
Destructor.
int printStatus_
0 - normal, 1 - put in values, move along format, no print 2 - put in values, no print 3 - skip messa...
CoinMessages & operator=(const CoinMessages &)
assignment operator.
Language
Supported languages.
int numberMessages_
Number of messages.
void replaceMessage(int messageNumber, const char *message)
Replaces the text of the specified message.
char message_[400]
Messages (in correct language) (not all 400 may exist)
std::string currentSource() const
Source of current message.
void fromCompact()
Moves from compact format.
int numberDoubleFields() const
Number of double fields already processed.