#ifndef _H_TOKEN
#define _H_TOKEN
#include "structure.h"
#include "tokencache.h"
#include "tokenacl.h"
#include "tokend.h"
#include <security_utilities/pcsc++.h>
#include <securityd_client/ssnotify.h>
class Reader;
class TokenDbCommon;
class Token : public PerGlobal, public virtual TokenAcl, public FaultRelay {
public:
class Access; friend class Access;
public:
Token();
~Token();
::Reader &reader() const;
TokenDaemon &tokend();
GenericHandle tokenHandle() const;
uint32 subservice() const { return mSubservice; }
std::string printName() const { return mPrintName; }
TokenCache::Token &cache() const { return *mCache; }
void insert(::Reader &slot, RefPointer<TokenDaemon> tokend);
void remove();
void notify(NotificationEvent event);
void fault(bool async);
void kill();
IFDUMP(void dumpNode());
static RefPointer<Token> find(uint32 ssid);
void getAcl(const char *tag, uint32 &count, AclEntryInfo *&acls);
ResetGeneration resetGeneration() const;
bool resetGeneration(ResetGeneration rg) const { return rg == resetGeneration(); }
void resetAcls();
public:
AclKind aclKind() const;
Token &token();
void relayFault(bool async);
public:
class Access {
public:
Access(Token &token);
~Access();
Token &token;
TokenDaemon &tokend() const { return *mTokend; }
TokenDaemon &operator () () const { return tokend(); }
private:
RefPointer<TokenDaemon> mTokend;
};
public:
void addCommon(TokenDbCommon &dbc);
void removeCommon(TokenDbCommon &dbc);
private:
RefPointer<TokenDaemon> chooseTokend();
private:
bool mFaulted; RefPointer<TokenDaemon> mTokend; RefPointer<TokenCache::Token> mCache; std::string mPrintName;
Guid mGuid; uint32 mSubservice; PCSC::ReaderState mState;
TokenDaemon::Score mScore;
private:
typedef map<uint32, Token *> SSIDMap;
static SSIDMap mSubservices;
static Mutex mSSIDLock;
typedef set<TokenDbCommon *> CommonSet;
CommonSet mCommons;
ResetGeneration mResetLevel;
};
#endif //_H_TOKEN