/home/coin/SVN-release/Cbc-1.1.1/CoinUtils/src/CoinMessageHandler.hpp

Go to the documentation of this file.
00001 // Copyright (C) 2002, International Business Machines
00002 // Corporation and others.  All Rights Reserved.
00003 #ifndef CoinMessageHandler_H
00004 #define CoinMessageHandler_H
00005 
00006 #if defined(_MSC_VER)
00007 // Turn off compiler warning about long names
00008 #  pragma warning(disable:4786)
00009 #endif
00010 
00011 
00012 #include <iostream>
00013 #include <cstdio>
00014 #include <string>
00015 #include "CoinFinite.hpp"
00016 
00031 /*
00032  I (jjf) am strongly in favo(u)r of language support for an open
00033  source project, but I have tried to make it as lightweight as
00034  possible in the sense that only a subset of messages need to be
00035  defined - the rest default to US English.  There will be different
00036  sets of messages for each component - so at present there is a
00037  Clp component and a Coin component.
00038 
00039  Because messages are only used in a controlled environment and have no
00040  impact on code and are tested by other tests I have include tests such
00041  as language and derivation in other unit tests.
00042 */
00043 
00054 class CoinOneMessage {
00055 
00056 public:
00060   CoinOneMessage();
00062   CoinOneMessage(int externalNumber, char detail,
00063                 const char * message);
00065   ~CoinOneMessage();
00067   CoinOneMessage(const CoinOneMessage&);
00069   CoinOneMessage& operator=(const CoinOneMessage&);
00071 
00074 
00075   void replaceMessage(const char * message);
00077 
00081   inline int externalNumber() const
00082   {return externalNumber_;}
00088   inline void setExternalNumber(int number) 
00089   {externalNumber_=number;}
00091   inline char severity() const
00092   {return severity_;}
00094   inline void setDetail(int level)
00095   {detail_=level;}
00097   inline int detail() const
00098   {return detail_;}
00100    char * message() const
00101   {return message_;}
00103 
00106 
00107     int externalNumber_;
00109     char detail_;
00111     char severity_;
00113   char * message_;
00115 };
00116 
00124 class CoinMessages {
00125 
00126 public:
00132   enum Language {
00133     us_en = 0,
00134     uk_en,
00135     it
00136   };
00137 
00141   CoinMessages(int numberMessages=0);
00143   ~CoinMessages();
00145   CoinMessages(const CoinMessages&);
00147   CoinMessages& operator=(const CoinMessages&);
00149 
00157   void addMessage(int messageNumber, const CoinOneMessage & message);
00163   void replaceMessage(int messageNumber, const char * message);
00165   inline Language language() const
00166   {return language_;}
00168   void setLanguage(Language language)
00169   {language_ = language;}
00171   void setDetailMessage(int newLevel, int messageNumber);
00179   void setDetailMessages(int newLevel, int numberMessages,
00180                          int * messageNumbers);
00182   void setDetailMessages(int newLevel, int low, int high);
00184   inline int getClass() const
00185   { return class_;};
00187 
00190 
00191   int numberMessages_;
00193   Language language_;
00195   char source_[5];
00197   int class_;
00199   CoinOneMessage ** message_;
00201 };
00202 
00203 // for convenience eol
00204 enum CoinMessageMarker {
00205   CoinMessageEol = 0,
00206   CoinMessageNewline = 1
00207 };
00208 
00278 /*
00279   Where there are derived classes I (jjf) have started message numbers at 1001.
00280 */
00281 
00282 class CoinMessageHandler  {
00283 
00284 friend void CoinMessageHandlerUnitTest () ;
00285   
00286 public:
00291   virtual int print() ;
00294   virtual void checkSeverity() ;
00296 
00299 
00300   CoinMessageHandler();
00302   CoinMessageHandler(FILE *fp);
00304   virtual ~CoinMessageHandler();
00306   CoinMessageHandler(const CoinMessageHandler&);
00308   CoinMessageHandler& operator=(const CoinMessageHandler&);
00310   virtual CoinMessageHandler * clone() const;
00312 
00314 
00315   inline int detail(int messageNumber, const CoinMessages &normalMessage) const
00316   { return normalMessage.message_[messageNumber]->detail();};
00318   inline int logLevel() const
00319           { return logLevel_;}
00337   void setLogLevel(int value);
00339   inline int logLevel(int which) const
00340   { return logLevels_[which];}
00345   void setLogLevel(int which, int value);
00347   void setPrefix(bool yesNo);
00349   bool  prefix() const;
00355   inline double doubleValue(int position) const
00356   { return doubleValue_[position];}
00361   inline int numberDoubleFields() const
00362   {return numberDoubleFields_;}
00368   inline int intValue(int position) const
00369   { return longValue_[position];}
00374   inline int numberIntFields() const
00375   {return numberIntFields_;}
00381   inline char charValue(int position) const
00382   { return charValue_[position];}
00387   inline int numberCharFields() const
00388   {return numberCharFields_;}
00394   inline std::string stringValue(int position) const
00395   { return stringValue_[position];}
00400   inline int numberStringFields() const
00401   {return numberStringFields_;}
00402 
00404   inline CoinOneMessage  currentMessage() const
00405   {return currentMessage_;}
00407   inline std::string currentSource() const
00408   {return source_;}
00410   inline const char * messageBuffer() const
00411   {return messageBuffer_;}
00413   inline int highestNumber() const
00414   {return highestNumber_;}
00416   inline FILE * filePointer() const
00417   { return fp_;}
00419   inline void setFilePointer(FILE * fp)
00420   { fp_ = fp;}
00422   
00431   CoinMessageHandler & message(int messageNumber,
00432                               const CoinMessages & messages);
00440   CoinMessageHandler & message();
00447   CoinMessageHandler & message(int externalNumber,const char * header,
00448                               const char * msg,char severity);
00453   CoinMessageHandler & operator<< (int intvalue);
00454 #if COIN_BIG_INDEX==1
00455 
00459   CoinMessageHandler & operator<< (long longvalue);
00460 #endif
00461 #if COIN_BIG_INDEX==2
00462 
00466   CoinMessageHandler & operator<< (long long longvalue);
00467 #endif
00468 
00472   CoinMessageHandler & operator<< (double doublevalue);
00477   CoinMessageHandler & operator<< (std::string stringvalue);
00482   CoinMessageHandler & operator<< (char charvalue);
00487   CoinMessageHandler & operator<< (const char *stringvalue);
00492   CoinMessageHandler & operator<< (CoinMessageMarker);
00497   int finish();
00507   CoinMessageHandler & printing(bool onOff);
00508 
00513   char * nextPerCent(char * start , const bool initial=false);
00518   int internalPrint();
00520 
00530 #define COIN_NUM_LOG 4
00531 private:
00534 
00535   double doubleValue_[10];
00536   long longValue_[10];
00537   char charValue_[10];
00538   std::string stringValue_[10];
00540   int logLevel_;
00542   int logLevels_[COIN_NUM_LOG];
00544   int prefix_;
00546   CoinOneMessage  currentMessage_;
00548   int internalNumber_;
00550   char * format_;
00552   int numberDoubleFields_;
00553   int numberIntFields_;
00554   int numberCharFields_;
00555   int numberStringFields_;
00557   char messageBuffer_[1000];
00559   char * messageOut_;
00561   std::string source_;
00567   int printStatus_;
00569   int highestNumber_;
00571   FILE * fp_;
00573 };
00574 
00575 //#############################################################################
00581 void
00582 CoinMessageHandlerUnitTest();
00583 
00584 #endif

Generated on Thu May 15 21:59:05 2008 by  doxygen 1.4.7