pcscdserver.h   [plain text]


/*
 * Copyright (c) 2006 Apple Computer, Inc. All Rights Reserved.
 * 
 * @APPLE_LICENSE_HEADER_START@
 * 
 * This file contains Original Code and/or Modifications of Original Code
 * as defined in and that are subject to the Apple Public Source License
 * Version 2.0 (the 'License'). You may not use this file except in
 * compliance with the License. Please obtain a copy of the License at
 * http://www.opensource.apple.com/apsl/ and read it before using this
 * file.
 * 
 * The Original Code and all software distributed under the License are
 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 * Please see the License for the specific language governing rights and
 * limitations under the License.
 * 
 * @APPLE_LICENSE_HEADER_END@
 */

//
// pcscdserver - stripped down securityd main server object
//
#ifndef _H_PCSCDSERVER
#define _H_PCSCDSERVER

#include <security_utilities/machserver.h>
#include <security_utilities/powerwatch.h>
#include <map>

#if defined(__cplusplus)

namespace PCSCD {
//
// The server object itself. This is the "go to" object for anyone who wants
// to access the server's global state. It runs the show.
// There is only one Server, and its name is Server::active().
//

class Server : public MachPlusPlus::MachServer
{
public:
	Server(const char *bootstrapName);
	~Server();
		
    // run the server until it shuts down
	void run();
	
    //
    // Retrieve pieces of the Server's object web.
    // These are all static methods that use the active() Server of this thread.
    //
	static Server &active() { return safer_cast<Server &>(MachServer::active()); }
	static const char *bootstrapName() { return active().mBootstrapName.c_str(); }

protected:
    // implementation methods of MachServer
	boolean_t handle(mach_msg_header_t *in, mach_msg_header_t *out);
	void notifyDeadName(MachPlusPlus::Port port);
	void notifyNoSenders(MachPlusPlus::Port port, mach_port_mscount_t);
	void threadLimitReached(UInt32 count);
	// request port status notifications (override virtual methods below to receive)
	virtual void notifyIfDead(MachPlusPlus::Port port, bool doNotify = true) const;
	virtual void notifyIfUnused(MachPlusPlus::Port port, bool doNotify = true) const;

private:
	class SleepWatcher : public MachPlusPlus::PortPowerWatcher
	{
	public:
		void systemWillSleep();
		void systemIsWaking();
		
		void add(PowerWatcher *client);
		void remove(PowerWatcher *client);

	private:
		set<PowerWatcher *> mPowerClients;
	};

	SleepWatcher sleepWatcher;
	
public:
	using MachServer::add;
	using MachServer::remove;
	void add(MachPlusPlus::PowerWatcher *client)	{ StLock<Mutex> _(mLock); sleepWatcher.add(client); }
	void remove(MachPlusPlus::PowerWatcher *client)	{ StLock<Mutex> _(mLock); sleepWatcher.remove(client); }
    
private:
	// mach bootstrap registration name
	std::string mBootstrapName;
	mutable Mutex mLock;	
};

} // end namespace PCSCD

#endif /* __cplusplus__ */

#endif //_H_PCSCDSERVER