/*
 *
 * @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@
 */


#ifndef KLOG_H	
#define KLOG_H

#include <IOKit/IOService.h>
#include <IOKit/IOLocks.h>

#include "KLogClient.h"

extern "C" {
    #include <sys/time.h>
}

//================================================================================================
//   Defines
//================================================================================================

#define kLogKextName 	"com_apple_iokit_KLog"

//================================================================================================
//   Configuration constants
//================================================================================================

#define BUFSIZE 	512 	//bytes
#define MAXENTRIES	500
#define MAXUSERS 	5

//================================================================================================
//   Custom Types
//================================================================================================

typedef UInt32 KLogLevel;
typedef UInt32 KLogTag;

//================================================================================================
//   com_apple_iokit_KLog
//================================================================================================

class com_apple_iokit_KLog : public IOService
{

    OSDeclareDefaultStructors(com_apple_iokit_KLog)

    com_apple_iokit_KLogClient *mClientPtr[MAXUSERS+1];

    unsigned char *					mMsgBuffer;
    UInt8 							mClientCount;
    UInt16							mMsgSize;
    bool 							mErrFlag;
    struct timeval *				mTimeVal;
    IOLock *						mLogLock;
    
public:

    static com_apple_iokit_KLog	*	sLogger;
    
	// IOService overrides.
	
    virtual bool 		init(OSDictionary *dictionary = 0);
    virtual void 		free(void);
    
    virtual IOService *	probe(IOService *provider, SInt32 *score);
    virtual bool 		start(IOService *provider);
    virtual void 		stop(IOService *provider);
	
    void 				closeChild(com_apple_iokit_KLogClient *ptr);
    
    virtual IOReturn	newUserClient( task_t owningTask, void * securityID,
										UInt32 type, IOUserClient ** handler );

	// Class specific stuff.
	
	void 				setErr( bool set );

	// Write items into our buffer using these.

	virtual	SInt8		Log( KLogLevel level, KLogTag tag, const char *format, ... );
	virtual	SInt8		vLog( KLogLevel level, KLogTag tag, const char *format, va_list in_va_list );
};

#endif



