summary refs log blame commit diff stats
path: root/code/entry.rb
blob: f2871847e3255f13cd5bb6113dcf38d6cc1bf346 (plain) (tree)











































































































































                                                                                        
require 'code/directory'

class Directory::Entry
	# Let's just cache every shit, because i don't want
	# to call File methods all the time

	BAD_TIME = Time.at(0)
	MOVIE_EXTENSIONS = %w(avi mpg mpeg mp4 mp5 ogv ogm wmv mkv flv fid vob div divx)
	
	def initialize(dirname, basename=nil)
		if basename
			@path = File.join(dirname, basename)
			@dirname = dirname
			@basename = basename
		else
			@path = dirname
			@dirname = File.dirname(dirname)
			@basename = File.basename(dirname)
		end
		@name, @ext = @basename.split_at_last_dot
#			@ext = @basename.from_last('.') || ''
		@movie = MOVIE_EXTENSIONS.include?(@ext)
		@size = 0
		@exists = false
		@rights = '----------'
		@readlink = ''
		@symlink = false
		@writable = false
		@infostring = ''
		@executable = false
		@type = :nonexistent
		@mtime = BAD_TIME
		@ctime = BAD_TIME
		@marked = false
	end

	attr_reader(*%w{
		basename mtime rights type path ext
		infostring readlink basename size ctime name
	})

	attr_accessor(:marked)
	
	def to_s() @path end
	def exists?() @exists end
	def marked?() @marked end
	def symlink?() @symlink end
	def movie?() @movie end
	def broken_symlink?() @symlink and !@exists end
	def dir?() @type == :dir end
	def file?() @type == :file end
	def writable?() @writable end
	def executable?() @executable end
	def mimetype()
		if @type == :dir
			nil
		else
			Fm::MIMETYPES[@ext]
		end
	end

	def delete!
		if @type == :dir
			Dir.delete(@path) rescue nil
		else
			File.delete(@path) rescue nil
		end
	end

	def refresh
		if File.exists?(@path)
			if File.ctime(@path) != @ctime
				get_data
			end
		else
			get_data
		end
	end

	def sh
		@path.sh
	end

	def in? path
		to_s[0, path.size] == path
	end

	def get_data
		@size = 0
		@infostring = ''

		@exists = File.exists?(@path)
		if @exists
			@writable = File.writable?(@path)
			@symlink = File.symlink?(@path)
			if @symlink
				@readlink = File.readlink(@path)
			end
			if File.directory?(@path)
				@type = :dir
				begin
					sz = Dir.entries(@path).size - 2
					@size = sz
				rescue
					sz = "?"
				end
				@infostring << "#{sz}"
			elsif File.socket?(@path)
				@type = :socket
			else
				@type = :file
				@size = File.size(@path)
				if File.size?(@path)
					@infostring << " #{File.size(@path).bytes 2}"
				else
					@infostring << ""
				end
			end
			@rights = File.modestr(@path)
			@executable = File.executable?(@path)
			@mtime = File.mtime(@path)
			@ctime = File.ctime(@path)

		else
			if File.symlink?(@path)
				@readlink = File.readlink(@path) rescue nil
				@infostring = '->'
				@symlink = true
			else
				@symlink = false
			end
			@executable = false
			@writable = false
			@type = :nonexistent
			@rights = '----------'
			@mtime = BAD_TIME
			@ctime = BAD_TIME
		end
	end
end