00001
00002
00003 #ifndef CoinMessageHandler_H
00004 #define CoinMessageHandler_H
00005
00006 #if defined(_MSC_VER)
00007
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
00033
00034
00035
00036
00037
00038
00039
00040
00041
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
00204 enum CoinMessageMarker {
00205 CoinMessageEol = 0,
00206 CoinMessageNewline = 1
00207 };
00208
00278
00279
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