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 
77  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 
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 
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 
335 
338  CoinMessageHandler(FILE *fp);
340  virtual ~CoinMessageHandler();
346  virtual CoinMessageHandler * clone() const;
348 
350 
351  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 
572  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