/*
 * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
 *
 * @APPLE_LICENSE_HEADER_START@
 * 
 * The contents of this file constitute Original Code as defined in and
 * are subject to the Apple Public Source License Version 1.1 (the
 * "License").  You may not use this file except in compliance with the
 * License.  Please obtain a copy of the License at
 * http://www.apple.com/publicsource and read it before using this file.
 * 
 * This 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 OR NON-INFRINGEMENT.  Please see the
 * License for the specific language governing rights and limitations
 * under the License.
 * 
 * @APPLE_LICENSE_HEADER_END@
 */
/*
 * Copyright (c) 2002 Apple Computer, Inc.  All rights reserved.
 *
 */

#ifndef _I2CUSERCLIENTPRIVATE_H
#define _I2CUSERCLIENTPRIVATE_H

#include <IOKit/IOUserClient.h>
#include "PPCI2CInterface.h"
#include "I2CUserClient.h"

#ifdef DLOG
#undef DLOG
#endif

// Uncomment to enable debug output
// #define I2CUSERCLIENT_DEBUG 1

#ifdef I2CUSERCLIENT_DEBUG
#define DLOG(fmt, args...)	IOLog(fmt, ## args)
#else
#define DLOG(fmt, args...)
#endif

class I2CUserClient : public IOUserClient
{
	OSDeclareDefaultStructors(I2CUserClient)

	private:
		task_t			fOwningTask;
		PPCI2CInterface	*fProvider;
		IOLock			*fIsOpenLock;
		bool			fIsOpen;
		
	public:
		virtual bool start(IOService *provider);
		virtual void stop(IOService *provider);

		virtual IOExternalMethod *getTargetAndMethodForIndex(
				IOService **target, UInt32 Index);

		virtual IOReturn clientClose(void);

		virtual bool init(OSDictionary *dict);
		virtual bool initWithTask(task_t owningTask, void *security_id,
				UInt32 type);
		virtual void free(void);
		virtual bool attach(IOService *provider);
		virtual void detach(IOService *provider);

		// Externally accessible methods
		IOReturn userClientOpen(void);
		IOReturn userClientClose(void);
		IOReturn read( void *inStruct, void *outStruct,
				void *inCount, void *outCount, void *p5, void *p6 );
		IOReturn write( void *inStruct, void *outStruct,
				void *inCount, void *outCount, void *p5, void *p6 );
		IOReturn rmw( void *inStruct, void *inCount,
				void *p3, void *p4, void *p5, void *p6 );
};

#endif