|
|
/*
* REVISIONS: * jod30NOV92 Changes made due to GCIP stuff * ane16DEC92 Added cdefine.h * pcy02Feb93: AddEvent must return a value. Changed to return ErrNO_ERROR * cad29Oct93: added get next attr * cad08Dec93: added extended get/set types * mwh05May94: #include file madness , part 2 * mwh07Jun94: port for NCR * jbc07Nov96: added check to only allow one transaction per code * mds10Jul97: modified Transaction Item Equal() function * mds10Jul97: changed GetFirstAttribute() to const to work with Equal() * mds14Jul97: StrIntCmpI was renamed to ApcStrIntCmpI */
#define INCL_BASE
#define INCL_NOPM
#include "cdefine.h"
#include "_defs.h"
extern "C" { #include <stdlib.h>
#include <string.h>
}
#include "trans.h"
#include "apc.h"
#include "err.h"
#include "event.h"
#include "list.h"
#include "message.h"
#include "utils.h"
#if (C_OS & C_NCR)
# include "incfix.h"
#endif
TransactionObject::TransactionObject(Type type, INT anId) : theType(type), theId(anId), theProtocolMessageList((List*)NULL), thePMIterator((ListIterator*)NULL) { theProtocolMessageList = new List(); if (theProtocolMessageList) thePMIterator = &(RListIterator)(theProtocolMessageList->InitIterator()); else SetObjectStatus(ErrMEMORY); }
TransactionObject:: ~TransactionObject() { if (theProtocolMessageList) theProtocolMessageList->FlushAll(); delete theProtocolMessageList; theProtocolMessageList = (List*)NULL; delete thePMIterator; thePMIterator = NULL; }
VOID TransactionObject::AddMessage(PMessage aMessage) { theProtocolMessageList->Append(aMessage); }
INT TransactionItem::transactionItemCount = 0;
TransactionItem::TransactionItem(Type aType, INT aCode, CHAR* aValue) : TransactionObject(aType, transactionItemCount++), theCode(aCode), theErrorCode(0), theValue((CHAR*)NULL), theAttributeList((List*)NULL), theAttribIterator((ListIterator*)NULL) { SetValue(aValue); theAttributeList = new List(); if (theAttributeList) theAttribIterator = &(RListIterator)(theAttributeList->InitIterator()); }
TransactionItem::~TransactionItem() { if (theValue) free(theValue); theValue = (CHAR*)NULL; if (theAttributeList) theAttributeList->FlushAll(); delete theAttributeList; theAttributeList = (List*)NULL; delete theAttribIterator; theAttribIterator = (ListIterator*)NULL; }
VOID TransactionItem::SetValue(CHAR* aValue) { if (theValue != (CHAR*)NULL) { free(theValue); theValue = (CHAR*)NULL; } if (aValue != (CHAR*)NULL) theValue = _strdup(aValue); }
VOID TransactionItem::AddAttribute(PAttribute anAttribute) { theAttributeList->Append(anAttribute); }
VOID TransactionItem::AddAttribute(INT aCode, CHAR* aValue) { PAttribute attribute = new Attribute(aCode, aValue); AddAttribute(attribute); }
PAttribute TransactionItem:: GetFirstAttribute() const { theAttribIterator->Reset(); return (Attribute*)theAttributeList->GetHead(); }
PAttribute TransactionItem:: GetNextAttribute() { PAttribute ret = (PAttribute)(theAttribIterator->Next()); return ret; }
INT TransactionItem:: Equal(RObj obj) const { INT ret_value = FALSE;
RTransactionItem trans_item = (RTransactionItem) obj; if (trans_item.GetCode() == GetCode()){ ret_value = TRUE; // if the code values are the same, this does not
// necessarily mean that the transaction items are equal
// A transaction item contains a list of attributes, and
// if the first attributes of each transaction item are
// not equal, then the transaction items are not equal.
// get first attributes from the attribute list
PAttribute attrib1 = trans_item.GetFirstAttribute(); PAttribute attrib2 = GetFirstAttribute();
// if both attributes are present
if(attrib1 && attrib2){
// get actual attribute values
PCHAR attrib_str1 = attrib1->GetValue(); PCHAR attrib_str2 = attrib2->GetValue(); // check to make sure that attribute values are not NULL
if(attrib_str1 != NULL && attrib_str2 != NULL){ if(attrib_str1[0] != NULL && attrib_str2[0] != NULL){ // if both of the attribute strings are not equal to
// one another, then return false
if(ApcStrIntCmpI(attrib_str1,attrib_str2) != EQUAL){ ret_value = FALSE; } } } } } return ret_value; }
INT TransactionGroup::transactionGroupCount = 0;
TransactionGroup::TransactionGroup(Type aType) : TransactionObject(aType, transactionGroupCount++), theAuthenticationString((CHAR*)NULL), theResponse((CHAR*)NULL), theEventList((List*)NULL), theEventIterator((ListIterator*)NULL), theTransactionList((List*)NULL), theTransactionIterator((ListIterator*)NULL), InitialSetResponseRepeated(0), InitialSetResponse((CHAR*)NULL), theErrorCode(0), theErrorIndex(0) { theEventList = new List(); theEventIterator = &(RListIterator)(theEventList->InitIterator()); theTransactionList = new List(); theTransactionIterator = &(RListIterator)(theTransactionList->InitIterator()); }
TransactionGroup:: ~TransactionGroup() { if (theAuthenticationString) free (theAuthenticationString); theAuthenticationString =(CHAR*)NULL; if (theResponse) free( theResponse); theResponse =(CHAR*)NULL; if (InitialSetResponse) free(InitialSetResponse); InitialSetResponse = (CHAR*)NULL; theEventList->FlushAll(); delete theEventList; theEventList = (List*)NULL; delete theEventIterator; theEventIterator = NULL; theTransactionList->FlushAll(); delete theTransactionList; theTransactionList = (List*)NULL; delete theTransactionIterator; theTransactionIterator = NULL; }
INT TransactionGroup:: Equal(RObj obj) const { // if (strcmp(obj.IsA(), IsA()))
// return FALSE;
RTransactionGroup tg = (RTransactionGroup)obj; if (tg.GetId() == GetId()) return TRUE; return FALSE; }
VOID TransactionGroup::SetAuthentication(CHAR* aString) { if (theAuthenticationString != (CHAR*)NULL) { free(theAuthenticationString); theAuthenticationString = (CHAR*)NULL; } if (aString != (CHAR*)NULL) theAuthenticationString = _strdup(aString); }
VOID TransactionGroup::SetResponse(CHAR* aString) { if (theResponse != (CHAR*)NULL) { free(theResponse); theResponse = (CHAR*)NULL; } if (aString != (CHAR*)NULL) theResponse = _strdup(aString); }
VOID TransactionGroup:: SetInitialSetResponseRepeated(INT repeat) { InitialSetResponseRepeated = repeat; }
VOID TransactionGroup:: SetErrorIndex(INT index) { theErrorIndex = index; }
VOID TransactionGroup:: SetInitialSetResponse(CHAR* initialResponse) { InitialSetResponse = _strdup(initialResponse); }
INT TransactionGroup::AddTransactionItem(PTransactionItem aTransactionItem) { int err = ErrNO_ERROR; Type addType = aTransactionItem->GetType(); // simple transactions types can be added to complex groups, but
// not vice-versa. This is a completely arbitrary exclusion,
// and could be changed if needed. For now it save a couple
// of lines of code.
//
if ((addType == theType) || ((theType == EXTENDED_GET) && (addType == GET)) || ((theType == EXTENDED_SET) && (addType == SET))) { // Check to see if transaction already exists.
PTransactionItem trans_item = (PTransactionItem)NULL; trans_item = (PTransactionItem)theTransactionList->Find(aTransactionItem); // If the transaction was not found, then add it to theTransactionList
if (trans_item==NULL) { theTransactionList->Append(aTransactionItem); } if (theTransactionIterator == (ListIterator*)NULL) { theTransactionIterator = &(RListIterator)(theTransactionList->InitIterator()); } } else { aTransactionItem->SetErrorCode(ErrTYPE_COMBINATION); err = ErrTYPE_COMBINATION; } return err; }
INT TransactionGroup::AddEvent(PEvent aEvent) { // theEventList->Add(*aEvent);
return ErrNO_ERROR; }
PTransactionItem TransactionGroup::GetCurrentTransaction() { return (PTransactionItem)(& (theTransactionIterator->Current())); }
PTransactionItem TransactionGroup::GetFirstTransactionItem() { theTransactionIterator->Reset(); return (PTransactionItem) theTransactionList->GetHead(); }
PTransactionItem TransactionGroup::GetNextTransactionItem() { return (PTransactionItem) theTransactionIterator->Next(); }
|