#include <CoinMessageHandler.hpp>
Public Member Functions | |
Virtual methods that the derived classes may provide | |
virtual int | print () |
Constructors etc | |
CoinMessageHandler () | |
Constructor. | |
CoinMessageHandler (FILE *fp) | |
Constructor to put to file pointer (won't be closed). | |
virtual | ~CoinMessageHandler () |
CoinMessageHandler (const CoinMessageHandler &) | |
CoinMessageHandler & | operator= (const CoinMessageHandler &) |
virtual CoinMessageHandler * | clone () const |
Clone. | |
gets and sets methods | |
int | logLevel () const |
void | setLogLevel (int value) |
void | setPrefix (bool yesNo) |
Switch on or off prefix. | |
bool | prefix () const |
double | doubleValue (int position) const |
values in message | |
int | numberDoubleFields () const |
int | intValue (int position) const |
int | numberIntFields () const |
char | charValue (int position) const |
int | numberCharFields () const |
std::string | stringValue (int position) const |
int | numberStringFields () const |
CoinOneMessage | currentMessage () const |
Current message. | |
std::string | currentSource () const |
Source of current message. | |
const char * | messageBuffer () const |
Output buffer. | |
int | highestNumber () const |
Highest message number (indicates any errors). | |
FILE * | filePointer () const |
Set new file pointer. | |
void | setFilePointer (FILE *fp) |
Actions to create a message | |
CoinMessageHandler & | message (int messageNumber, const CoinMessages &messages) |
Start a message. | |
CoinMessageHandler & | message () |
returns current (if you want to make more uniform in look) | |
char * | nextPerCent (char *start, const bool initial=false) |
CoinMessageHandler & | operator<< (int intvalue) |
Adds into message. | |
CoinMessageHandler & | operator<< (long longvalue) |
CoinMessageHandler & | operator<< (double doublevalue) |
CoinMessageHandler & | operator<< (std::string stringvalue) |
CoinMessageHandler & | operator<< (char charvalue) |
CoinMessageHandler & | operator<< (const char *stringvalue) |
CoinMessageHandler & | operator<< (CoinMessageMarker) |
int | finish () |
CoinMessageHandler & | printing (bool onOff) |
CoinMessageHandler & | message (int externalNumber, const char *header, const char *msg, char severity) |
Private Attributes | |
Private member data | |
double | doubleValue_ [10] |
values in message | |
long | longValue_ [10] |
char | charValue_ [10] |
std::string | stringValue_ [10] |
int | logLevel_ |
Log level. | |
int | prefix_ |
Whether we want prefix (may get more subtle so is int). | |
CoinOneMessage | currentMessage_ |
Current message. | |
int | internalNumber_ |
Internal number for use with enums. | |
char * | format_ |
Format string for message (remainder). | |
int | numberDoubleFields_ |
Number fields filled in, 0 in constructor then incremented. | |
int | numberIntFields_ |
int | numberCharFields_ |
int | numberStringFields_ |
char | messageBuffer_ [1000] |
Output buffer. | |
char * | messageOut_ |
Position in output buffer. | |
std::string | source_ |
Current source of message. | |
int | printStatus_ |
int | highestNumber_ |
Highest message number (indicates any errors). | |
FILE * | fp_ |
File pointer. |
The default behavior is just to print. Inherit to change that This is a first attempt and it shows. messages <3000 are informational <6000 warnings <9000 errors - but will try and carry on or return code >=9000 stops Where there are derived classes I have started message numbers at 1001
Messages can be printed with or without a prefix e.g. Clp0102I. A prefix makes the messages look less nimble but is very useful for "grep" etc.
Definition at line 183 of file CoinMessageHandler.hpp.
|
Destructor Definition at line 305 of file CoinMessageHandler.cpp.
00306 { 00307 } |
|
The copy constructor Definition at line 309 of file CoinMessageHandler.cpp. References charValue_, currentMessage_, doubleValue_, format_, fp_, highestNumber_, internalNumber_, logLevel_, longValue_, CoinOneMessage::message(), messageBuffer_, messageOut_, numberCharFields_, numberDoubleFields_, numberIntFields_, numberStringFields_, prefix_, printStatus_, source_, and stringValue_.
00310 { 00311 logLevel_=rhs.logLevel_; 00312 prefix_ = rhs.prefix_; 00313 currentMessage_=rhs.currentMessage_; 00314 internalNumber_=rhs.internalNumber_; 00315 int i; 00316 numberDoubleFields_ = rhs.numberDoubleFields_; 00317 for (i=0;i<numberDoubleFields_;i++) 00318 doubleValue_[i]=rhs.doubleValue_[i]; 00319 numberIntFields_ = rhs.numberIntFields_; 00320 for (i=0;i<numberIntFields_;i++) 00321 longValue_[i]=rhs.longValue_[i]; 00322 numberCharFields_ = rhs.numberCharFields_; 00323 for (i=0;i<numberCharFields_;i++) 00324 charValue_[i]=rhs.charValue_[i]; 00325 numberStringFields_ = rhs.numberStringFields_; 00326 for (i=0;i<numberStringFields_;i++) 00327 stringValue_[i]=rhs.stringValue_[i]; 00328 int offset = rhs.format_ - rhs.currentMessage_.message(); 00329 format_ = currentMessage_.message()+offset; 00330 strcpy(messageBuffer_,rhs.messageBuffer_); 00331 offset = rhs.messageOut_-rhs.messageBuffer_; 00332 messageOut_= messageBuffer_+offset; 00333 printStatus_= rhs.printStatus_; 00334 highestNumber_= rhs.highestNumber_; 00335 fp_ = rhs.fp_; 00336 source_ = rhs.source_; 00337 } |
|
Stop (and print) - or use eol Definition at line 470 of file CoinMessageHandler.cpp. References format_, internalNumber_, messageBuffer_, messageOut_, numberDoubleFields_, print(), and printStatus_.
00471 { 00472 if (messageOut_!=messageBuffer_) { 00473 // put out last message 00474 print(); 00475 } 00476 numberDoubleFields_=0; 00477 numberIntFields_=0; 00478 numberCharFields_=0; 00479 numberStringFields_=0; 00480 internalNumber_=-1; 00481 format_ = NULL; 00482 messageBuffer_[0]='\0'; 00483 messageOut_=messageBuffer_; 00484 printStatus_=true; 00485 return 0; 00486 } |
|
Amount of print out: 0 - none 1 - minimal 2 - normal low 3 - normal high 4 - verbose above that 8,16,32 etc just for selective debug and are for printf messages in code Definition at line 220 of file CoinMessageHandler.hpp. References logLevel_.
00221 { return logLevel_;} |
|
The following is to help existing codes interface Starts message giving number and complete text Definition at line 423 of file CoinMessageHandler.cpp. References currentMessage_, highestNumber_, internalNumber_, messageBuffer_, messageOut_, numberDoubleFields_, prefix_, print(), printStatus_, CoinOneMessage::setExternalNumber(), and source_.
00425 { 00426 if (messageOut_!=messageBuffer_) { 00427 // put out last message 00428 print(); 00429 } 00430 numberDoubleFields_=0; 00431 numberIntFields_=0; 00432 numberCharFields_=0; 00433 numberStringFields_=0; 00434 internalNumber_=externalNumber; 00435 currentMessage_= CoinOneMessage(); 00436 currentMessage_.setExternalNumber(externalNumber); 00437 source_ = source; 00438 // mark so will not update buffer 00439 printStatus_=2; 00440 highestNumber_ = max(highestNumber_,externalNumber); 00441 // If we get here we always print 00442 if (prefix_) { 00443 sprintf(messageOut_,"%s%4.4d%c ",source_.c_str(), 00444 externalNumber, 00445 severity); 00446 } 00447 strcat(messageBuffer_,msg); 00448 messageOut_=messageBuffer_+strlen(messageBuffer_); 00449 return *this; 00450 } |
|
Gets position of next field in format if initial then copies until first Definition at line 490 of file CoinMessageHandler.cpp. References messageOut_, nextPerCent(), and printStatus_. Referenced by message(), nextPerCent(), operator<<(), and printing().
00491 { 00492 if (start) { 00493 bool foundNext=false; 00494 while (!foundNext) { 00495 char * nextPerCent = strchr(start,'%'); 00496 if (nextPerCent) { 00497 // %? is skipped over as it is just a separator 00498 if (nextPerCent[1]!='?') { 00499 if (initial&&!printStatus_) { 00500 int numberToCopy=nextPerCent-start; 00501 strncpy(messageOut_,start,numberToCopy); 00502 messageOut_+=numberToCopy; 00503 } 00504 start=nextPerCent; 00505 if (start[1]!='%') { 00506 foundNext=true; 00507 if (!initial) 00508 *start='\0'; //zap 00509 } else { 00510 start+=2; 00511 if (initial) { 00512 *messageOut_='%'; 00513 messageOut_++; 00514 } 00515 } 00516 } else { 00517 foundNext=true; 00518 // skip to % and zap 00519 start=nextPerCent; 00520 *start='\0'; 00521 } 00522 } else { 00523 if (initial&&!printStatus_) { 00524 strcpy(messageOut_,start); 00525 messageOut_+=strlen(messageOut_); 00526 } 00527 start=0; 00528 foundNext=true; 00529 } 00530 } 00531 } 00532 return start; 00533 } |
|
assignment operator. Definition at line 340 of file CoinMessageHandler.cpp. References charValue_, currentMessage_, doubleValue_, format_, fp_, highestNumber_, internalNumber_, logLevel_, longValue_, CoinOneMessage::message(), messageBuffer_, messageOut_, numberCharFields_, numberDoubleFields_, numberIntFields_, numberStringFields_, prefix_, printStatus_, source_, and stringValue_.
00341 { 00342 if (this != &rhs) { 00343 logLevel_=rhs.logLevel_; 00344 prefix_ = rhs.prefix_; 00345 currentMessage_=rhs.currentMessage_; 00346 internalNumber_=rhs.internalNumber_; 00347 int i; 00348 numberDoubleFields_ = rhs.numberDoubleFields_; 00349 for (i=0;i<numberDoubleFields_;i++) 00350 doubleValue_[i]=rhs.doubleValue_[i]; 00351 numberIntFields_ = rhs.numberIntFields_; 00352 for (i=0;i<numberIntFields_;i++) 00353 longValue_[i]=rhs.longValue_[i]; 00354 numberCharFields_ = rhs.numberCharFields_; 00355 for (i=0;i<numberCharFields_;i++) 00356 charValue_[i]=rhs.charValue_[i]; 00357 numberStringFields_ = rhs.numberStringFields_; 00358 for (i=0;i<numberStringFields_;i++) 00359 stringValue_[i]=rhs.stringValue_[i]; 00360 int offset = rhs.format_ - rhs.currentMessage_.message(); 00361 format_ = currentMessage_.message()+offset; 00362 strcpy(messageBuffer_,rhs.messageBuffer_); 00363 offset = rhs.messageOut_-rhs.messageBuffer_; 00364 messageOut_= messageBuffer_+offset; 00365 printStatus_= rhs.printStatus_; 00366 highestNumber_= rhs.highestNumber_; 00367 fp_ = rhs.fp_; 00368 source_ = rhs.source_; 00369 } 00370 return *this; 00371 } |
|
Print message, return 0 normally. At present this is the only virtual method Definition at line 215 of file CoinMessageHandler.cpp. References currentMessage_, fp_, messageBuffer_, messageOut_, and CoinOneMessage::severity_. Referenced by finish(), and message().
00216 { 00217 if (messageOut_>messageBuffer_) { 00218 *messageOut_=0; 00219 //take off trailing spaces and commas 00220 messageOut_--; 00221 while (messageOut_>=messageBuffer_) { 00222 if (*messageOut_==' '||*messageOut_==',') { 00223 *messageOut_=0; 00224 messageOut_--; 00225 } else { 00226 break; 00227 } 00228 } 00229 fprintf(fp_,"%s\n",messageBuffer_); 00230 if (currentMessage_.severity_=='S') { 00231 fprintf(fp_,"Stopping due to previous errors.\n"); 00232 //Should do walkback 00233 abort(); 00234 } 00235 } 00236 return 0; 00237 } |
|
Allows for skipping printing of part of message, but putting in data Definition at line 454 of file CoinMessageHandler.cpp. References format_, nextPerCent(), and printStatus_.
00455 { 00456 // has no effect if skipping or whole message in 00457 if (printStatus_<2) { 00458 assert(format_[1]=='?'); 00459 if (onOff) 00460 printStatus_=0; 00461 else 00462 printStatus_=1; 00463 format_ = nextPerCent(format_+2,true); 00464 } 00465 return *this; 00466 } |
|
0 - normal, 1 - put in values, move along format, no print 2 - put in values, no print 3 - skip message Definition at line 329 of file CoinMessageHandler.hpp. Referenced by CoinMessageHandler(), finish(), message(), nextPerCent(), operator<<(), operator=(), and printing(). |