#ifndef _H_PROCESS
#define _H_PROCESS
#include "securityserver.h"
#include "SecurityAgentClient.h"
#include <Security/osxsigning.h>
#include <Security/refcount.h>
#include "key.h"
#include "notifications.h"
#include <string>
using MachPlusPlus::Port;
using MachPlusPlus::TaskPort;
class Session;
class AuthorizationToken;
class Process {
public:
Process(Port servicePort, TaskPort tPort, const char *identity, uid_t uid, gid_t gid);
#if 0
Process(Process &prior); #endif
virtual ~Process();
uid_t uid() const { return mUid; }
gid_t gid() const { return mGid; }
pid_t pid() const { return mPid; }
TaskPort taskPort() const { return mTaskPort; }
CodeSigning::OSXCode *clientCode() const { return mClientCode; }
bool verifyCodeSignature(const CodeSigning::Signature *signature);
void addAuthorization(AuthorizationToken *auth);
bool removeAuthorization(AuthorizationToken *auth);
void beginConnection(Connection &);
bool endConnection(Connection &);
bool kill();
void addDatabase(Database *database);
void removeDatabase(Database *database);
void requestNotifications(Port port, Listener::Domain domain, Listener::EventMask events);
void stopNotifications(Port port);
void postNotification(Listener::Domain domain, Listener::Event event, const CssmData &data);
Session &session;
private:
Mutex mLock; uint32 mBusyCount; bool mDying;
TaskPort mTaskPort; pid_t mPid; uid_t mUid; gid_t mGid;
RefPointer<CodeSigning::OSXCode> mClientCode;
typedef multiset<AuthorizationToken *> AuthorizationSet;
AuthorizationSet mAuthorizations;
typedef set<Database *> DatabaseSet;
DatabaseSet mDatabases; };
#endif //_H_PROCESS