#ifndef _H_CDSA_CLIENT_MULTIDLDB
#define _H_CDSA_CLIENT_MULTIDLDB 1
#include <Security/dlclient.h>
#include <Security/DLDBList.h>
namespace Security
{
namespace CssmClient
{
class MultiDLDbImpl : public ObjectImpl, public DbCursorMaker
{
public:
struct List : public vector<DLDbIdentifier>, public RefCount
{
List(const vector<DLDbIdentifier> &list) : vector<DLDbIdentifier>(list) {}
};
struct ListRef : public RefPointer<List>
{
ListRef() {}
ListRef(const vector<DLDbIdentifier> &list) : RefPointer<List>(new List(list)) {}
};
MultiDLDbImpl(const vector<DLDbIdentifier> &list, bool useSecureStorage, const Cssm &cssm);
MultiDLDbImpl(const vector<DLDbIdentifier> &list, bool useSecureStorage);
virtual ~MultiDLDbImpl();
Cssm cssm() const { return parent<Cssm>(); }
Db database(const DLDbIdentifier &dlDbIdentifier);
ListRef listRef() { return mListRef; }
void list(const vector<DLDbIdentifier> &list);
const vector<DLDbIdentifier> &list() { return *mListRef; }
virtual DbCursorImpl *newDbCursor(const CSSM_QUERY &query, CssmAllocator &allocator);
virtual DbCursorImpl *newDbCursor(uint32 capacity, CssmAllocator &allocator);
protected:
void activate();
void deactivate();
private:
typedef map<DLDbIdentifier, Db> DbMap;
Mutex mLock;
ListRef mListRef;
DbMap mDbMap;
bool mUseSecureStorage;
};
class MultiDLDb : public Object
{
public:
typedef MultiDLDbImpl Impl;
explicit MultiDLDb(Impl *impl) : Object(impl) {}
MultiDLDb(const vector<DLDbIdentifier> &list, bool useSecureStorage, const Cssm &cssm)
: Object(new Impl(list, useSecureStorage, cssm)) {}
MultiDLDb(const vector<DLDbIdentifier> &list, bool useSecureStorage)
: Object(new Impl(list, useSecureStorage)) {}
Impl *operator ->() const { return &impl<Impl>(); }
Impl &operator *() const { return impl<Impl>(); }
operator DbCursorMaker &() { return impl<Impl>(); }
};
};
}
#endif // _H_CDSA_CLIENT_MULTIDLDB