*-----------------------------------------------*
*	@GetSomeVolumes				*
*-----------------------------------------------*

GetSomeVolumes:
	lea	LaiteLista(a4),a3
	move.l	dos(a4),a6
	move.l	#LDF_DEVICES!LDF_READ,d1
	jsr	_LVOLockDosList(a6)
	move.l	d0,d7

.loop1	move.l	dos(a4),a6
	move.l	d7,d1
	move.l	#LDF_DEVICES!LDF_READ,d2
	jsr	_LVONextDosEntry(a6)
	move.l	d0,a2
	move.l	d0,d7
	beq.b	.valmis

	tst.l	dol_Task(a2)
	beq.b	.loop1

	move.l	dol_Name(a2),d1
	lsl.l	#2,d1
	jsr	_LVOIsFileSystem(a6)
	tst.l	d0
	beq.b	.loop1

	move.l	#Laite_SIZEOF,d0
	bsr	AllocVecPooled
	move.l	d0,(a3)
	beq.b	.loop1
	move.l	d0,a3
	move.l	dol_Task(a2),ll_MsgPort(a3)
	move.l	dol_Name(a2),a0
	lea	ll_DeviceName(a3),a1
	bsr	copy_name

	move.b	#':',(a1)+
	clr.b	(a1)
	bra.b	.loop1

.valmis	move.l	#LDF_DEVICES!LDF_READ,d1
	jsr	_LVOUnLockDosList(a6)

	move.l	task(a4),a0
	move.l	pr_WindowPtr(a0),d6
	move.l	#-1,pr_WindowPtr(a0)

	lea	LaiteLista(a4),a3
.loop3	move.l	(a3),d0
	beq.b	.jatka
	move.l	d0,a3

	bsr	HaeLaiteTiedot2
	tst.l	d0
	beq.b	.loop3

	move.l	a3,AddSorted-t(a5)
	move.l	sfs_version-t(a5),ll_Version(a3)

	bsr	ResolveVolumeData
	beq.b	.loop3

	addq.l	#1,LaiteLkm(a4)
	TEE_METODI	LV_LaiteLista-t(a5),AddEntrySorted
	bra.b	.loop3

.jatka	move.l	task(a4),a0
	move.l	d6,pr_WindowPtr(a0)
	rts

copy_name:
	add.l	a0,a0
	moveq	#0,d0
	add.l	a0,a0
	move.b	(a0)+,d0
	beq.b	.x
	subq.l	#1,d0
.loop2	move.b	(a0)+,(a1)+
	dbf	d0,.loop2
.x	rts

*-----------------------------------------------*
*	@ResolveVolumeData			*
*-----------------------------------------------*

ResolveVolumeData:
	lea	ll_DeviceName(a3),a1
	move.l	#ACCESS_READ,d2
	move.l	a1,d1
	jsr	_LVOLock(a6)
	move.l	d0,d7
	beq.b	.x

	lea	MyInfoData(a4),a0
	move.l	d0,d1
	move.l	a0,d2
	jsr	_LVOInfo(a6)

	move.l	MyInfoData+id_VolumeNode(a4),a2
	lea	MyDateTime(a4),a1
	add.l	a2,a2
	lea	ll_CreationDate(a3),a0
	add.l	a2,a2
	move.l	a0,dat_StrDate(a1)
	lea	ll_CreationTime(a3),a0
	move.l	a0,dat_StrTime(a1)

	move.l	dol_VolumeDate+ds_Days(a2),ds_Days(a1)
	move.l	dol_VolumeDate+ds_Minute(a2),ds_Minute(a1)
	move.l	dol_VolumeDate+ds_Tick(a2),ds_Tick(a1)
	move.l	a1,d1
	jsr	_LVODateToStr(a6)

	lea	ll_VolumeName(a3),a1
	move.l	dol_Name(a2),a0
	bsr	copy_name
	clr.b	(a1)

	move.l	d7,d1
	jsr	_LVOUnLock(a6)

	move.l	a3,d3
	move.l	MyInfoData+id_NumBlocksUsed(a4),d0
	mulu.l	#100,d0
	lea	putchar(pc),a2
	divu.l	MyInfoData+id_NumBlocks(a4),d0
	move.l	exec(a4),a6
	move.w	d0,(a4)
	lea	DiskUsageFormat-t(a5),a0
	move.l	a4,a1
	lea	ll_DiskUsage(a3),a3
	jsr	_LVORawDoFmt(a6)
	move.l	d3,a3

	moveq	#-1,d0
.x	rts

*-----------------------------------------------*
*	@LoadConfig				*
*-----------------------------------------------*

LoadConfig:
	clr.b	bfConfigExists(a4)
	lea	EnvConfigName-t(a5),a1
	bsr	GetConfig
	bne.b	.x
	lea	EnvarcConfigName-t(a5),a1
	bra	GetConfig
.x	rts

*-----------------------------------------------*
*	@GetConfig				*
*-----------------------------------------------*

GetConfig:
	move.l	dos(a4),a6
	move.l	a1,d1
	move.l	#MODE_OLDFILE,d2
	jsr	_LVOOpen(a6)
	move.l	d0,d7
	beq.b	.x
	move.l	d0,d1
	lea	ConfigData(a4),a2
	move.l	#3*32,d3
	move.l	a2,d2
	jsr	_LVORead(a6)
	move.l	d7,d1
	jsr	_LVOClose(a6)

	lea	PenSpec1(a4),a3
	moveq	#3,d0
.loop	move.l	a2,(a3)+
	lea	32(a2),a2
	dbf	d0,.loop
	st	bfConfigExists(a4)
	moveq	#-1,d0
.x	rts

*-----------------------------------------------*
*	@SaveConfig				*
*-----------------------------------------------*

SaveConfig:
	move.l	dos(a4),a6
	move.l	a1,d1
	move.l	#MODE_NEWFILE,d2
	jsr	_LVOOpen(a6)
	move.l	d0,d7
	beq.b	.x
	lea	ConfigData(a4),a2
	move.l	d0,d1
	move.l	a2,d2
	move.l	#3*32,d3
	jsr	_LVOWrite(a6)
	move.l	d7,d1
	jmp	_LVOClose(a6)
.x	rts

*-----------------------------------------------*
*	@TyhjennäRoskakori			*
*-----------------------------------------------*

TyhjennäRoskakori:
	tst.l	lfEmptyRecycled(a4)
	beq.b	.x
	move.l	#ACTION_SFS_LOCATE_OBJECT,d2
	move.l	#RECYCLEDNODE,d3
	move.l	#SHARED_LOCK,d4
	moveq	#0,d5
	bsr	LähetäPaketti
	beq.b	.x				; (hakemistoa ei ole)
	lsr.l	#2,d0
	move.l	d0,d7
	bsr	TyhjennäHakemisto
	move.l	d7,d1
	jmp	_LVOUnLock(a6)
.x	rts

*-----------------------------------------------*
*	@UpdateVolumeDate			*
*-----------------------------------------------*

UpdateVolumeDate:
	tst.l	lfSerialize(a4)
	beq.b	.x
	move.l	DefragEntry(a4),a3
	move.l	#ACTION_SERIALIZE_DISK,d2
	bra	LähetäPaketti
.x	rts

*-----------------------------------------------*
*	@LähetäPaketti				*
*-----------------------------------------------*

LähetäPaketti:
	move.l	dos(a4),a6
	move.l	ll_MsgPort(a3),d1
	moveq	#0,d6
	moveq	#0,d7
	jsr	_LVODoPkt(a6)
	tst.l	d0
	rts

*-----------------------------------------------*
*	@TyhjennäHakemisto			*
*						*
*	D7 - tyhjennettävä hakemisto (lock)	*
*-----------------------------------------------*

TyhjennäHakemisto:
	move.l	d7,d1
	jsr	_LVOCurrentDir(a6)
	move.l	d0,d6
	moveq	#0,d5
	move.l	d7,d1
	move.l	a4,d2
	jsr	_LVOExamine(a6)
	tst.l	d0
	beq.b	.end
	lea	fib_FileName(a4),a2

.loop1	move.l	d7,d1
	jsr	_LVOExNext(a6)
	tst.l	d0
	beq.b	.end			; hakemisto tyhjä
	move.l	a2,d1
	jsr	_LVODeleteFile(a6)
	addq.l	#1,d5
	bra.b	.loop1

.end	move.l	d6,d1
	jmp	_LVOCurrentDir(a6)

*-----------------------------------------------*
*	@AddBuffers				*
*-----------------------------------------------*

AddBuffers:
	lea	ll_DeviceName(a3),a0
	lea	ll_VolumeName(a3),a1
	move.l	a0,DeviceName(a4)
	move.l	a1,VolumeName(a4)

	move.l	intui(a4),a6
	move.l	STR_Prefs_AddBuffers-t(a5),a0
	lea	DAddBufs(a4),a1
	move.l	#MUIA_String_Integer,d0
	jsr	_LVOGetAttr(a6)

	move.l	DAddBufs(a4),d2
	beq.b	.x
	move.l	dos(a4),a6
	move.l	DeviceName(a4),d1
	jsr	_LVOAddBuffers(a6)
	tst.l	d0
	bne.b	.x
	clr.l	DAddBufs(a4)
.x	rts

*-----------------------------------------------*
*	@RemBuffers				*
*-----------------------------------------------*

RemBuffers:
	move.l	DAddBufs(a4),d2
	beq.b	.x
	clr.l	DAddBufs(a4)
	neg.l	d2
	move.l	dos(a4),a6
	move.l	DeviceName(a4),d1
	jmp	_LVOAddBuffers(a6)
.x	rts

*-----------------------------------------------*
*	@LockDevice				*
*-----------------------------------------------*

LockDevice:
	move.l	dos(a4),a6
	move.l	#100,d1
	jsr	_LVODelay(a6)
	move.l	SFSport(a4),d1
	move.l	#ACTION_INHIBIT,d2
	move.l	#DOSTRUE,d3		; Inhibit
	jsr	_LVODoPkt(a6)
	tst.l	d0
	beq.b	.virhe
	st	bfInhibited(a4)
	rts

.virhe	lea	ll_VolumeName(a3),a2
	bsr	GetErrorString
	move.l	a2,(a4)
	GETSTR	MSG_CANT_LOCK
	move.l	d0,a2
	bsr	InfoRequester
	bra	EnableStartDefrag

*-----------------------------------------------*
*	@UnLockDevice				*
*-----------------------------------------------*

UnLockDevice:
	tst.b	bfInhibited(a4)
	beq.b	.x
	clr.b	bfInhibited(a4)
	move.l	dos(a4),a6
	move.l	SFSport_Abort(a4),d1
	move.l	#ACTION_INHIBIT,d2
	moveq	#DOSFALSE,d3			; UnInhibit
	jmp	_LVODoPkt(a6)
.x	rts
