/* * * NOTES: * * REVISIONS: * pcy29Nov92: New defines from codes.h * sja08Dec92: Changed #define BATTERY_TYPE to RATED_BATTERY_VOLTAGE * jod13Jan93: Added eventList to InterpretMessage * jod28Jan93: Added fixes for support of Data and Decrement Sets * pcy02Feb93: InterpretSetMessage needs to return a value * ane03Feb93: Changed BuildPollTransactionGroupMessages to check IsPollSet * differently * jod14Feb93: Handle mulit char sets (@ddd, KK, etc) * pcy16Feb92: Move UPS_STATE_SET define to err.h to avoid conflicts * pcy16Feb92: Allow gets of UpsState params * pcy16Feb93: Made battery test results pollable * pcy21Apr93: OS/2 2.0 FE Merge * jod05Apr93: Added changes for Deep Discharge * jod14May93: Added Matrix changes. * cad10Jun93: Added Mups parms * cad22Jul93: Fixed up destructor conflicts and omissions * cad27Aug93: Added MeasureUPS firmware poll param * cad07Oct93: Plugging Memory Leaks * pcy08Apr94: Trim size, use static iterators, dead code removal * mwh01Jun94: port for INTERACTIVE * jps14Jul94: commented out INCL_NOPMAPI * ajr15Feb96: Sinix Merge * cgm23Jul97: BuildStandardSetMessage creates Message(aCode,SET) * * v-stebe 29Jul2000 Fixed PREfix errors (bugs #46353-#46355) */ #define INCL_BASE #define INCL_NOPM /* #define INCL_NOPMAPI jwa */ #include "cdefine.h" extern "C" { #if (C_OS & C_OS2) #include #include #endif #include #if (!(C_OS & C_INTERACTIVE)) #include #endif #include #include } #include "_defs.h" #include "event.h" #include "codes.h" #include "message.h" #include "pollparm.h" #include "trans.h" #include "protsimp.h" #include "err.h" #if (C_OS & C_UNIX) #include "utils.h" #endif SimpleUpsProtocol:: SimpleUpsProtocol() : Protocol() { InitProtocol(); } SimpleUpsProtocol:: ~SimpleUpsProtocol() { } VOID SimpleUpsProtocol::InitProtocol() { char buffer[5]; for(int i=0; iGetFirstTransactionItem(); while ((theItem != NULL) && (err == ErrNO_ERROR)) { if (ProtoList[theItem->GetCode()] != (PollParam*)NULL) { PollParam* poll_param = ProtoList[theItem->GetCode()]; /******************************************************** * * * There is no test for POLLABLE in the Simple Protocol * * * *********************************************************/ } else err = ErrNOT_POLLABLE; theItem = aTransactionGroup->GetNextTransactionItem(); } if (err == ErrNO_ERROR) { err = BuildTransactionGroupMessages(aTransactionGroup); } return err; } INT SimpleUpsProtocol :: BuildTransactionGroupMessages(PTransactionGroup aTransactionGroup) { int err = ErrNO_ERROR; PTransactionItem theItem = aTransactionGroup->GetFirstTransactionItem(); while ((theItem != NULL) && (err == ErrNO_ERROR)) { List* msglist = BuildTransactionMessageList(theItem->GetType(), theItem->GetCode(), theItem->GetValue()); if (msglist) { ListIterator iterator(*msglist); PMessage msg = (PMessage)&(iterator.Current()); while (msg) { theItem->AddMessage(msg); PMessage copy_msg = new Message(msg); aTransactionGroup->AddMessage(copy_msg); msg = (PMessage)iterator.Next(); } // don't flush list, we just gave away all the elements delete msglist; msglist = NULL; } else { theItem->SetErrorCode(ErrBUILD_FAILED); err = ErrBUILD_FAILED; } theItem = aTransactionGroup->GetNextTransactionItem(); } return err; } List* SimpleUpsProtocol :: BuildTransactionMessageList(Type aType, INT aCode, CHAR* aValue) { List* msglist; PollParam* poll_param = ProtoList[aCode]; if(poll_param == NULL) { return (List*)NULL; } switch(aType) { case GET: msglist = BuildGetMessage(aCode); break; case SET: msglist = BuildStandardSetMessage(aCode, aValue); break; } return msglist; } List* SimpleUpsProtocol :: BuildGetMessage(INT aCode) { List* msglist = NULL; PMessage msg = new Message(aCode); if (msg) { PollParam* poll_param = ProtoList[aCode]; PCHAR cmd = poll_param->Query(); msg->setSubmit(cmd); msg->setTimeout(poll_param->GetTime()); msglist = new List(); msglist->Append(msg); free(cmd); } else { ;// setError(ErrMESSAGE_CREATE_FAILED); } return msglist; } List* SimpleUpsProtocol :: BuildStandardSetMessage(INT aCode, CHAR* aValue) { List* msglist = new List(); // Really only action type stuff. How will we deal with commands that // require two letters (S, wait 1 seconds, S). Possibly use // TURN_OFF_UPS as the code, and set an inter character delay as part of // protocol message. For now this only handles the simple stuff. PollParam* poll_param = ProtoList[aCode]; PMessage msg = new Message(aCode,SET); CHAR submit_string[50]; *submit_string = '\0'; PCHAR cmd = poll_param->Query(); if (cmd != NULL) { strcpy(submit_string,cmd); free(cmd); } if(poll_param->GetSetType() != SIMPLE_SET) { if (aValue) { strcat(submit_string,aValue); } } if (msg != NULL) { msg->setSubmit(submit_string); msg->setTimeout(poll_param->GetTime()); msglist->Append(msg); } return msglist; } INT SimpleUpsProtocol :: InterpretMessage(Message* msg, List* eventList, List* newmsglist) { PList tiList = theCurrentTransactionGroup->GetTransactionItemList(); TransactionItem tmpti(GET,msg->getId()); PTransactionItem trans_item = (PTransactionItem)tiList->Find(&tmpti); if (trans_item) { trans_item->SetErrorCode(msg->getErrcode()); trans_item->SetValue(msg->getResponse()); } #if 0 PEvent event = new Event(msg->getId(), msg->getResponse()); // event->setResponse(msg->getResponse()); eventList->Append(event); #endif return ErrNO_ERROR; }