// HAdptvCntr.h -- Handle Card ConTeXt class declaration // (c) Copyright Schlumberger Technology Corp., unpublished work, created // 1999. This computer program includes Confidential, Proprietary // Information and is a Trade Secret of Schlumberger Technology Corp. All // use, disclosure, and/or reproduction is prohibited unless authorized // in writing. All Rights Reserved. #if !defined(SLBCSP_HADPTVCNTR_H) #define SLBCSP_HADPTVCNTR_H #include #include #include #include "slbRCPtr.h" #include "Securable.h" #include "CachingObj.h" #include "ACntrReg.h" #include "Secured.h" #include "Container.h" // Forward declaration necessary to satisfy HAdaptiveContainer's declaration class AdaptiveContainer; class HAdaptiveContainer : public slbRefCnt::RCPtr { public: // Types // C'tors/D'tors HAdaptiveContainer(AdaptiveContainer *pacntr = 0); explicit HAdaptiveContainer(AdaptiveContainerKey const &rKey); // Operators // Operations // Access // Predicates protected: // Types // C'tors/D'tors // Operators // Operations // Access // Predicates // Variables private: // Types // C'tors/D'tors // Operators // Operations // Access // Predicates // Variables }; // Adaptive Container is a reference counted wrapper to a CCI // Container providing several features the CCI ignores. The first is // adapting to the CCI container that currently represents the // physical container on the card. This is necessary in case the // cards state changed between transactions and card's contents // changed. If the container no longer exists, then an exception is // thrown; otherwise the Adaptive Container references the (refreshed) // CCI container reference. // // Second, one unique adaptive container is maintained for all threads since // the CCI does not reflect changes made to one CContainer in all // CContainer objects that refer to the same container. // // Third, an adaptive container cannot be created unless the container // it represents is exists on the card. When instantiating, the // container is created if it doesn't exist. // // An adaptive container provides a Securable interface to lock // transactions to the container (card) it represents. class AdaptiveContainer : public Lockable, private Securable, public AdaptiveContainerRegistrar, public Container { public: // Types // Friends friend void Retained::DoAcquire(); friend void Secured::DoAcquire(); friend void Retained::DoRelease(); friend void Secured::DoRelease(); friend EnrolleeType AdaptiveContainerRegistrar::Instance(KeyType const &rkey); // C'tors/D'tors // Operators // Operations void ClearCache(); // Access cci::CContainer TheCContainer(); HCardContext CardContext(bool Reconnect = true); static EnrolleeType Find(AdaptiveContainerKey const &rKey); std::string Name() const; void NullifyCard(); // Predicates protected: // Types // C'tors/D'tors explicit AdaptiveContainer(AdaptiveContainerKey const &rKey); ~AdaptiveContainer(); // Operators // Operations void ClearCardContext(); void DiscardHook(); static EnrolleeType DoInstantiation(AdaptiveContainerKey const &rKey); void EnrollHook(); // Access // Predicates bool KeepEnrolled(); void ReconnectOnError(scu::OsException const &rExc, Retained &rhcardctx); // Variables private: // Types // C'tors/D'tors // Operators // Operations void Abandon(); void Expire(); void RefreshContainer(); void Relinquish(); void Retain(); void Secure(); // Access // Predicates // Variables // The card could be derived from the CCI container object but // since the CCI allows card objects to be reused, the card may // not be the container originally found. The CardContext class // tries to mitigate that problem by storing an HCardContext in a // container's context object. HAdaptiveContainerKey m_hacKey; bool m_fValidContext; std::list > m_stkRetainedCardContexts; std::list > m_stkSecuredCardContexts; }; #endif // SLBCSP_HADPTVCNTR_H