#
# Start of posixfile.py
#

#
# Extended file operations
#
# f = posixfile.open(filename, mode)
#	will create a new posixfile object
#
# f = posixfile.fileopen(fileobject)
#	will create a posixfile object from a builtin file object
#
# f.file()
#	will return the original builtin file object
#
# f.dup()
#	will return a new file object based on a new filedescriptor
#
# f.dup2(fd)
#	will return a new file object based on the given filedescriptor
#
# f.flags(mode)
#	will turn on the associated flag (merge)
#	mode can contain the following characters:
#
#   (character representing a flag)
#	a	append only flag
#	c	close on exec flag
#	n	no delay flag
#	s	synchronization flag
#   (modifiers)
#	!	turn flags 'off' instead of default 'on'
#	=	copy flags 'as is' instead of default 'merge'
#	?	return a string in which the characters represent the flags
#		that are set
#
#	note: - the '!' and '=' modifiers are mutually exclusive.
#	      - the '?' modifier will return the status of the flags after they
#		have been changed by other characters in the mode string
#
# f.lock(mode [, len [, start [, whence]]])
#	will (un)lock a region
#	mode can contain the following characters:
#
#   (character representing type of lock)
#	u	unlock
#	r	read lock
#	w	write lock
#   (modifiers)
#	|	wait until the lock can be granted
#	?	return the first lock conflicting with the requested lock
#		or 'None' if there is no conflict. The lock returned is in the
#		format (mode, len, start, whence, pid) where mode is a
#		character representing the type of lock ('r' or 'w')
#
#	note: - the '?' modifier prevents a region from being locked; it is
#		query only
#

class _posixfile_:
    states = ['open', 'closed']

    #
    # Internal routines
    #
    def __repr__(self):
	file = self._file_
	return "<%s posixfile '%s', mode '%s' at %s>" % \
		(self.states[file.closed], file.name, file.mode, \
		 hex(id(self))[2:])

    def __del__(self):
	self._file_.close()

    #
    # Initialization routines
    #
    def open(self, name, mode):
	import __builtin__
	return self.fileopen(__builtin__.open(name, mode))

    def fileopen(self, file):
	if `type(file)` != "<type 'file'>":
	    raise TypeError, 'posixfile.fileopen() arg must be file object'
	self._file_  = file
	# Copy basic file methods
	for method in file.__methods__:
	    setattr(self, method, getattr(file, method))
	return self

    #
    # New methods
    #
    def file(self):
	return self._file_

    def dup(self):
	import posix

	try: ignore = posix.fdopen
	except: raise AttributeError, 'dup() method unavailable'

	return posix.fdopen(posix.dup(self._file_.fileno()), self._file_.mode)

    def dup2(self, fd):
	import posix

	try: ignore = posix.fdopen
	except: raise AttributeError, 'dup() method unavailable'

	posix.dup2(self._file_.fileno(), fd)
	return posix.fdopen(fd, self._file_.mode)

    def flags(self, *which):
	import fcntl, FCNTL

	if which:
	    if len(which) > 1:
		raise TypeError, 'Too many arguments'
	    which = which[0]
	else: which = '?'

	l_flags = 0
	if 'n' in which: l_flags = l_flags | FCNTL.O_NDELAY
	if 'a' in which: l_flags = l_flags | FCNTL.O_APPEND
	if 's' in which: l_flags = l_flags | FCNTL.O_SYNC

	file = self._file_

	if '=' not in which:
	    cur_fl = fcntl.fcntl(file.fileno(), FCNTL.F_GETFL, 0)
	    if '!' in which: l_flags = cur_fl & ~ l_flags
	    else: l_flags = cur_fl | l_flags

	l_flags = fcntl.fcntl(file.fileno(), FCNTL.F_SETFL, l_flags)

	if 'c' in which:	
	    arg = ('!' not in which)	# 0 is don't, 1 is do close on exec
	    l_flags = fcntl.fcntl(file.fileno(), FCNTL.F_SETFD, arg)

	if '?' in which:
	    which = ''			# Return current flags
	    l_flags = fcntl.fcntl(file.fileno(), FCNTL.F_GETFL, 0)
	    if FCNTL.O_APPEND & l_flags: which = which + 'a'
	    if fcntl.fcntl(file.fileno(), FCNTL.F_GETFD, 0) & 1:
		which = which + 'c'
	    if FCNTL.O_NDELAY & l_flags: which = which + 'n'
	    if FCNTL.O_SYNC & l_flags: which = which + 's'
	    return which
	
    def lock(self, how, *args):
	import struct, fcntl, FCNTL

	if 'w' in how: l_type = FCNTL.F_WRLCK
	elif 'r' in how: l_type = FCNTL.F_WRLCK
	elif 'u' in how: l_type = FCNTL.F_UNLCK
	else: raise TypeError, 'no type of lock specified'

	if '|' in how: cmd = FCNTL.F_SETLKW
	elif '?' in how: cmd = FCNTL.F_GETLK
	else: cmd = FCNTL.F_SETLK

	l_whence = 0
	l_start = 0
	l_len = 0

	if len(args) == 1:
	    l_len = args[0]
	elif len(args) == 2:
	    l_len, l_start = args
	elif len(args) == 3:
	    l_len, l_start, l_whence = args
	elif len(args) > 3:
	    raise TypeError, 'too many arguments'

	flock = struct.pack('hhllhh', l_type, l_whence, l_start, l_len, 0, 0)
	flock = fcntl.fcntl(self._file_.fileno(), cmd, flock)

	if '?' in how:
	    l_type, l_whence, l_start, l_len, l_sysid, l_pid = \
		struct.unpack('hhllhh', flock)
	    if l_type != FCNTL.F_UNLCK:
		if l_type == FCNTL.F_RDLCK:
		    return 'r', l_len, l_start, l_whence, l_pid
		else:
		    return 'w', l_len, l_start, l_whence, l_pid

#
# Public routine to obtain a posixfile object
#
def open(name, mode):
    return _posixfile_().open(name, mode)

def fileopen(file):
    return _posixfile_().fileopen(file)

#
# Constants
#
SEEK_SET = 0
SEEK_CUR = 1
SEEK_END = 2

#
# End of posixfile.py
#
