windows-nt/Source/XPSP1/NT/ds/netapi/svcdlls/upssvc/apcsmart/protsimp.cxx
2020-09-26 16:20:57 +08:00

266 lines
6.9 KiB
C++

/*
*
* 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 <process.h>
#include <os2.h>
#endif
#include <stdlib.h>
#if (!(C_OS & C_INTERACTIVE))
#include <malloc.h>
#endif
#include <string.h>
#include <time.h>
}
#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; i<PROTOSIZE; i++) {
ProtoList[i]=(PollParam*)NULL;
}
ProtoList[UTILITY_LINE_CONDITION] = new SimplePollParam(UTILITY_LINE_CONDITION, _itoa(UTILITY_LINE_CONDITION,buffer,10), 0, POLL);
ProtoList[BATTERY_CONDITION] = new SimplePollParam(BATTERY_CONDITION, _itoa(BATTERY_CONDITION,buffer,10), 0, POLL);
ProtoList[TURN_OFF_UPS] = new SimplePollParam(TURN_OFF_UPS, _itoa(TURN_OFF_UPS,buffer,10), 0, NO_POLL);
ProtoList[TURN_ON_SMART_MODE] = new SimplePollParam(TURN_ON_SMART_MODE, _itoa(TURN_ON_SMART_MODE,buffer,10), 0, NO_POLL);
ProtoList[TURN_OFF_UPS_ON_BATTERY] = new SimplePollParam(TURN_OFF_UPS_ON_BATTERY, _itoa(TURN_OFF_UPS_ON_BATTERY,buffer,10), 0, NO_POLL);
return;
}
INT SimpleUpsProtocol :: BuildMessage(Message*, List* )
{
return 1;
}
INT SimpleUpsProtocol :: BuildPollTransactionGroupMessages(PTransactionGroup aTransactionGroup)
{
int err = ErrNO_ERROR;
PTransactionItem theItem = aTransactionGroup->GetFirstTransactionItem();
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;
}