[#1] Volume name z urządzenia
Hej, kolejne pytanie :) Jak odczytać nazwę dysku wlozonego do stacji? Przeszukałem trackdisk.device i dos.library i nie natknąłem się na nic wprost, a przecież musi tu być coś czym się da to zrobić?
[#2] Re: Volume name z urządzenia

@vojo, post #1

Może Lock("DF0:") i potem NameFromLock().
[#3] Re: Volume name z urządzenia

@Krashan, post #2

Też tak myślałem, ale prawdopodobnie trzeba skorzystać z LockDosList() i zablokować listę woluminów.

Tutaj opis tej funkcji z przykładem jak zablokować listę woluminów i szukać ich po nazwie:

http://amigadev.elowar.com/read/ADCD_2.1/Includes_and_Autodocs_3._guide/node0187.html
[#4] Re: Volume name z urządzenia

@Krashan, post #2

Może Lock("DF0:") i potem NameFromLock().


Generalnie działa, ale ma jedną wadę - generuje systemowe requestery w sytuacji jeśli w stacji nie ma dysku ('Pease insert disk'), lub jest niedosowy ('NDOS disk inerted') , co nie jest dobre w sytuacji kiedy chcemy "po cichu" sprawdzić jaka jest sytuacja w posiadanych stacjach.

Co do LockDosList() - to tez mi sie nie udało, albo pobieram liste urządzeń (DF0, DF1, itd ) albo volumenow (SYSTEM, WORK itd). A nie widzę jak zmatchować np 'DH0' do 'SYSTEM' :/

EDIT:
trackdiskiem mozna sprawdzic wczescniej czy dysk jest wlozony, zostaje rozpoznanie czy dysk jest DOSowy. Tylko ze wydawaloby sie prosta operacja zaczyna się komplikowac :)

Ostatnia aktualizacja: 16.03.2019 19:53:37 przez vojo

Ostatnia aktualizacja: 16.03.2019 19:54:38 przez vojo
[#5] Re: Volume name z urządzenia

@vojo, post #4

Weź zobacz program doslist z aminetu. Listujesz listę volumenów i sprawdzasz nazwę z dol_Name i nazwę device poprzez (struct Task *)dl->dol_Task->mp_SigTask->tc_Node.ln_Name). Brak dysku - nie ma go na liście. Nie wiem jak będzie z NDOS.
[#6] Re: Volume name z urządzenia

@cholok, post #5

A nie widzę jak zmatchować np 'DH0' do 'SYSTEM' :/

Być może da się prościej. Można użyć funkcji Info() na zablokowanym dysku lub jakimkolwiek pliku na dysku. Np. za pomocą Lock("DF0:") tak jak sugerował Krashan.

Następnie należy ze struktury InfoData wyłuskać wskaźnik (uwaga: wskaźnik jest typu BPTR) id_VolumeNode za pomocą makra BADDR(info->id_VolumeNode) i stamtąd wziąć nazwę woluminu dl_Name.

Nota: Żeby "po cichu" sprawdzać dyski musisz zrobić:
task = FindTask(NULL);
task->pr_WindowPtr = (APTR)-1;

Wtedy requestery DOS nie będą się pojawiać.

Myślę, że to może być dobry sposób, bo przecież tak działa komenda systemowa Info. Oczywiście można to robić też na zablokowanej liście za pomocą LockDosList().

Ostatnia aktualizacja: 16.03.2019 21:14:33 przez Hexmage960
[#7] Re: Volume name z urządzenia

@Hexmage960, post #6

Dzięki Panowie, jesteście niezawodni:)
Ostatecznie poniższe realizuje to co chciałem:

MODULE 	'dos/dos',
		'dos/dosextens'
		
PROC main()

DEF _lock=NIL, _i,
	_label[40]:STRING, 	
	_driveName[5]:STRING, 
	_process=NIL:PTR TO process, 
	_oldWindowPtr:LONG
	
	
	_process:=FindTask(NIL)
	_oldWindowPtr:=_process.windowptr
	_process.windowptr:=-1
	
	FOR _i:=0 TO 3 
		StringF(_driveName, 'DF\d:', _i)	
		_lock:=Lock (_driveName, ACCESS_READ)
		IF _lock
			NameFromLock(_lock, _label, 40)
			UnLock(_lock)
			WriteF('\s \s \n', _driveName, _label)
		ELSE
			PrintFault(IoErr(), _driveName)
		ENDIF
	ENDFOR
	
	_process.windowptr:=_oldWindowPtr
	
ENDPROC


dla sytuacji:
DF0 - brak dysku
DF1 - dyskietka niedosowa
DF2 - dyskietka dosowa
DF3 - brak stacji

rezultat jest nastepujący:

DF0:: brak dysku w napędzie
DF1:: to nie jest dysk w formacie DOS-u
DF2: Lasermania 2: 
DF3:: urządzenie (lub wolumen) nie jest zamontowane
[#8] Re: Volume name z urządzenia

@vojo, post #4

Mozesz sprobowac tez tak - troche bardziej skomplikowany kod ale w tym przypadku nie trzeba blokowac requesterow.

doslist=LockDosList(LDF_DEVICES|LDF_VOLUMES|LDF_READ);
dosentry=FindDosEntry(doslist, "DF0", LDF_DEVICES);
if (dosentry)
{
      while (doslist=NextDosEntry(doslist, LDF_VOLUMES))
     {
         if (dosentry->dol_Task==doslist->dol_Task)
        {
// doslist->dol_Name to nazwa wolumenu
        }
     }
}
UnlockDosList(LDF_DEVICES|LDF_VOLUMES|LDF_READ);


Najpierw wyszukujesz device o okreslonej nazwie, pozniej przeszukujesz liste wolumenow, ktore maja ten sam handler i masz jego nazwe. Trzeba by tylko sprawdzic, jaki bedzie to dzialac gdy dyskietki nie bedzie w stacji, czy nie znajdzie na liscie wolumenow czy np. nazwa bedzie 0 :)

Ostatnia aktualizacja: 17.03.2019 00:33:09 przez docent
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem