#ifndef _SP_TRANSACTION_CONTEXT_H__ #define _SP_TRANSACTION_CONTEXT_H__ #pragma once #include "SpBase.h" #include "sp_ses.h" class SpEntity; class SpTransactionContext : public ITransactionContext { public: SpTransactionContext(sp_ses_uas_t *uas, int info, int method_id, int method_sig, int expire_time, iobuffer_t **p_pkt, int tsx_id); virtual ~SpTransactionContext(); virtual bool IsOneWayCall(); virtual DWORD GetRequestID(); virtual ErrorCodeEnum GetReceiveBuffer(DWORD &dwMessageID, DWORD &dwMessageSignature, CAutoBuffer &Buffer); virtual ErrorCodeEnum SendAnswer(CAutoBuffer Buffer, bool bEnd=true); virtual ErrorCodeEnum SendAnswer(ErrorCodeEnum eErrorCode, DWORD dwUserError = 0, CSimpleString str = ""); virtual ErrorCodeEnum SetExpireTime(DWORD dwMS); virtual ErrorCodeEnum GetExpireTime(DWORD &dwWholeTime,DWORD &dwLeftTime); DWORD GetExpireLeftTime(); virtual ErrorCodeEnum GetLinkContext(linkContext& curLink); private: int m_info; int m_method_id; int m_method_sig; int m_expire_time; int m_timeout; iobuffer_t *m_pkt; sp_tsx_uas_t *m_tsx; }; // for OnPreStart, OnPrePause, OnPreContinue, OnPreClose class SpMUITransactionContext : public ITransactionContext { public: enum { OP_START, OP_PAUSE, OP_SELFTEST, OP_CLOSE, OP_CONTINUE, OP_MOCK }; SpMUITransactionContext(SpEntity *pEntity, int op) : m_pEntity(pEntity), m_op(op) {} virtual ~SpMUITransactionContext(){}; virtual bool IsOneWayCall() { return false; } virtual DWORD GetRequestID() { return 0; } virtual ErrorCodeEnum GetReceiveBuffer(DWORD &dwMessageID, DWORD &dwMessageSignature, CAutoBuffer &Buffer) { return Error_NotImpl; } virtual ErrorCodeEnum SendAnswer(CAutoBuffer Buffer, bool bEnd=true) { return Error_NotInit; } virtual ErrorCodeEnum SendAnswer(ErrorCodeEnum eErrorCode, DWORD dwUserError = 0, CSimpleString str = ""); virtual ErrorCodeEnum SetExpireTime(DWORD dwMS) { return Error_NotImpl; } virtual ErrorCodeEnum GetExpireTime(DWORD &dwWholeTime,DWORD &dwLeftTime) { return Error_NotImpl; } ErrorCodeEnum GetLinkContext(linkContext& curLink){ return Error_NotImpl; } private: SpEntity *m_pEntity; int m_op; }; /*! * @class SpMockTransactionContext * @brief the class used to simulate the communication between entities * @note the input param SpEntity* would be nullptr, and we do not need it at current time. */ class SpMockTransactionContext : public SpMUITransactionContext { public: SpMockTransactionContext(SpEntity* unused) :SpMUITransactionContext(unused, SpMUITransactionContext::OP_MOCK) ,m_lastErrorCode(Error_IgnoreAll),m_dwLastUserCode(0) {} virtual ~SpMockTransactionContext() {}; virtual ErrorCodeEnum SendAnswer(ErrorCodeEnum eErrorCode, DWORD dwUserError = 0, CSimpleString str = "") { m_lastErrorCode = eErrorCode; m_dwLastUserCode = dwUserError; return Error_Succeed; } ErrorCodeEnum GetExpireTime(DWORD& dwWholeTime, DWORD& dwLeftTime) { ErrorCodeEnum lastErrorCode = m_lastErrorCode; dwWholeTime = m_dwLastUserCode; /** Because the TestCase mechanism use SpMockTransactionContext as singleton instance * So we have to reset it. [5/19/2020 Gifur] */ m_lastErrorCode = Error_IgnoreAll; return lastErrorCode; } ErrorCodeEnum SendAnswer(CAutoBuffer Buffer, bool bEnd = true) { return SendAnswer(Error_Succeed, 0); } private: ErrorCodeEnum m_lastErrorCode; DWORD m_dwLastUserCode; }; #endif //_SP_TRANSACTION_CONTEXT_H__