DirectoryOpus - część 3 z 10
Jarosław Horodecki
Wersja HTML -
Zapoznaliśmy się już z ogólnymi zasadami działania
Directory Opusa. Wiemy również, jak konstruować za pomocą
programu konfiguracyjnego własne funkcje ukryte pod gadżetami.
Tym razem zajmiemy się rozpoznawaniem typów plików oraz
przykładami wykorzystania tej bardzo przydatnej funkcji
realizowanej przez DOpus.
Obsługą różnych typów plików zajmuje się menu Filetypes
programu konfiguracyjnego DOpusa. Dzieki zawartym w nim opcjom
możemy również definiować wzorce plików, jakie program ma
rozpoznawać, oraz działania, jakie ma podejmować po ich
odnalezieniu.
Zacznijmy więc od definicji typów plików. Potrzebne opcje
znajdują się w drugim rozwijanym menu, nazwanym CLASSES. Dostępne
są w nim opcje umożliwiające tworzenie nowych typów (NEW), edycję
już istniejących (EDIT) oraz kilka innych, nie wymagających chyba
specjalnego objaśniania, funkcji. Przy definiowaniu własnych
typów należy się oczywiście posłużyć opcją NEW. Powoduje ona
przejście do ekranu zawierającego wszystkie opcje, za pomocą
których podajemy DOpusowi parametry, na jakich podstawie będzie
on rozpoznawał dany typ plików.
Na początku definiujemy nazwę grupy plików, wpisując ją w okienku
podpisanym FILE CLASS, następnie należy podać skrótową nazwę
określonego typu (CLASS ID). Można już przystąpić do definicji
charakterystycznych cech danego typu plików. Dokonujemy tego
poprzez wpisywanie odpowiednich komend do znajdującego się
poniżej okienka. Pewną pomocą służyć tu może ich lista, dostępna
po skorzystaniu z gadżetu z symbolem lupy.
Oto skrótowe opisy kolejnych komend:
MATCH -- umożliwia porównywanie z podanym wzorcem odpowiedniej
liczby bajtów sprawdzanego pliku. Po tej komendzie umieszczamy
łańcuch znaków, z którym dany plik będzie porównywany. Oprócz
liter i innych znaków ASCII można również korzystać z kodów
szesnastkowych, kodów dziesiętnych oraz jokera "?" mogącego
zastąpić dowolny bajt. Przykładowo plik IFF można rozpoznać za
pomocą sekwencji "form????ilbm". Każdy obrazek w IFF-ie zaczyna
się właśnie od takich znaków. Oczywiście w miejscu znaku "?"
normalnie występują znaki charakterystyczne dla danego obrazka,
które jednak są przy rozpoznawaniu ignorowane. Inny przykład
użycia tejże komendy to wpisanie sekwencji "$000003f3" -- tak
właśnie zaczynają się wszystkie pliki uruchamialne z poziomu
AmigaDOS-u (tzw. executables).
MATCHBITS -- sprawdza ustawienia bitów analizowanego pliku.
Składnię tego rozkazu najlepiej chyba wyjaśnią proste przykłady:
"+rw -e" -- muszą być włączone bity read oraz write, natomiast
bit executable musi być wyłączony, ustawienia pozostałych bitów
nie mają znaczenia. Na tej samej zasadzie można stworzyć dowolne
ustawienia bitów odpowiadające tworzonemu typowi plików.
MATCHCOMMENT -- porównanie tekstu podanego jako argument z
tekstem w komentarzu do danego pliku. Można oczywiście korzystać
z dowolnych jokerów, takich jak znaki "#" oraz "?".
MATCHDATE -- porównanie podanego wzoru daty z datą analizowanego
pliku. Jako argument można podać zarówno konkretną datę, jak i
pewien przedział. Sposób określania przedziałów dat najprościej
chyba będzie poznać na przykładzie. Gdy chcemy brać pod uwagę
przy naszej selekcji jedynie pliki utworzone pomiędzy 14 sierpnia
1993, a 22 stycznia 1994, musimy podać następujący argument:
"14-sept-93 < 22-jan-94". Znak "<" nie jest tu znakiem "mniejszy
niż", ale po prostu oddziela podane daty graniczne. Można również
wpisywać sekwencje: "< 22-jan-94", co spowoduje odnalezienie
plików utworzonych do dnia 22 stycznia 1994 lub "14-sept-93 <",
co z koleji spowoduje branie pod uwagę jedynie plików utworzonych
po 14 sierpnia 1993 do dnia dzisiejszego.
MATCHNAME -- odnajdywanie pliku na podstawie jego nazwy. Dostępne
są zarówno jokery typowe dla AmigaDOS-u ("#" oraz "?"), jak i
znak "*". Rozpoznawanie plików na podstawie ich nazwy stosowane
jest najczęściej i jest najprostszym, ale zarazem najbardziej
zawodnym, sposobem. Zwykle w ten sposób można rozpoznawać na
przykład archiwa ("*.lzh", "*.zip", "*.lha") czy moduły muzyczne
("mod.*").
MATCHSIZE -- rozpoznawanie pliku na podstawie jego długości.
Można podać zarówno dokładną długość pliku, jak i pewien
przedział. W argumencie tej komendy można korzystać ze znaków
"<", ">" oraz "=".
Są to już wszystkie komendy porównań. Warto jednak zwrócić uwagę,
iż komenda MATCH odnosi się jedynie do pierwszych bajtów danego
pliku. Co jednak zrobić, kiedy o przynależności danego pliku do
tworzonego typu plików decydują nie pierwsze jego bajty, ale ich
sekwencje położone w innej części pliku lub też po prostu samo
wystąpienie pewnej sekwencji bajtów w całej strukturze pliku.
Otóż umożliwia to cały zestaw specjalnie do tego celu
przygotowanych komend:
MOVETO -- przemieszczenie aktualnej pozycji sprawdzania do
podanego miejsca. Jako argument podajemy miejsce w pliku, do
jakiego ma zostać przemieszczony znacznik dla komendy MATCH.
MOVE -- komenda ta ma podobne działanie do MOVETO, z tym że
zamiast przesuwania do zadanej pozycji bezwzględnej w danym
pliku, znacznik przesuwany jest względem ostatniej pozycji o
podaną liczbę bajtów (tzw. przesunięcie względne). Oczywiście
dupuszczalne są tu również argumenty ujemne, aby dokonać
przesunięcia do początku pliku.
SEARCHFOR -- poszukuje podanego łańcucha znaków, a po jego
odnalezieniu ustawia znacznik na pozycji pierwszego bajtu z
podanego łańcucha. Argument dla tej komendy jest podawany w
ten sam sposób, co w komendzie MATCH.
Oprócz wymienionych komend istnieją jeszcze dwie instrukcje
logiczne, służące do łączenia różnych kryteriów określających
przynależność badanego pliku do danej grupy. Są to instrukcje:
AND -- połączone za pomocą tej instrukcji warunki muszą być
spełnione. W przeciwnym wypadku analizowany plik nie jest brany
pod uwagę.
OR -- tylko co najmniej jeden z połączonych warunków musi być
spełniony, aby plik został sklasyfikowany jako przynależący do
danego typu.
Po tej dość dużej dawce teorii warto chyba spróbować skonstruować
własną grupę plików. W DOpusie jest już kilka typów
zdefiniowanych standardowo, jednak z wyjątkiem typu "ikona"
stosowana jest najprostsza metoda definicji, z rozpoznawaniem na
podstawie nazwy pliku.
Proponuję więc stworzyć typ pliku odpowiadający obrazkom w
formacie JPG. Najpierw musimy więc określić nazwę grupy plików
oraz jej skrót (proponuję odpowiednio: "JPG Picture" oraz "JPG").
Następnie przechodzimy do podawania kryteriów służących do
identyfikacji typu.
Pierwszą metodą będzie oczywiście
odnalezienie rozszerzenia JPG, typowego dla tychże obrazków.
Drugą, znacznie doskonalszą, rozpoznanie obrazka JPG poprzez
odnalezienie w nim sekwencji znaków JFIF znajdującej się na
określonej pozycji. Zaczynamy więc od wpisania komendy NATCHFILE
*.JPG. Dzięki niej rozpoznajemy plik, odnajdując rozszerzenie.
Następnie należy skorzystać z komendy OR, ponieważ posługujemy
się dwoma równorzędnymi warunkami. Kolejną rzeczą będzie
oczywiście odnalezienie sekwencji JFIF.
Aby prawidłowo określić pozycję tegoż łańcucha znaków,
najprościej będzie posłużyć się narzędziem zajmującym całą górną
część ekranu edycji typów plików, nazwanym FILE VIEWER. Za pomocą
gadżetu z lupą wybieramy dowolny obrazek w formacie JPG i
wczytujemy go. W dużym oknie pokaże się zawartość tego pliku
(sposób jego wyświetlenia jest podobny do działania komendy HEX
READ DOpusa). Teraz za pomocą myszy podwójnie klikamy nad literką
J (początek JFIF). W okienku POSITION pokaże się liczba 6, co
oznacza, że potrzebna nam sekwencja zaczyna się od siódmego
(pozycje w pliku liczymy od zera) bajtu tego pliku. Aby ją
odnaleźć, musimy więc skorzystać z komendy MOVETO 06, którą
wstawiamy zaraz po OR. Na koniec wystarczy jeszcze zwykłe
porównanie: MATCH JFIF. Należy pamiętać, aby argument tej
ostatniej komendy był wpisany wielką literą. W ten sposób
stworzyliśmy nowy typ pliku. Warto teraz zająć się praktycznym
jego wykorzystaniem. W tym celu jednak musimy jeszcze zapoznać
się z drugim edytorem, służącym do przyporządkowywania konkretnym
rodzajom plików stosownych do nich działań.
Wybierzmy więc opcję NEW, znajdującą się w dolnej części ekranu w
głównym menu FILETYPES. Pojawi się okienko z wyszczególnionymi
dostępnymi rodzajami plików. Wybieramy oczywiście nasz "JPG
Picture".
Pojawi się nie znany nam dotychczas ekran, pod pewnymi
względami podobny jednak do omawianego w poprzedniej części
edytora funkcji gadżetów. Właściwie to jedynie górna jego część
różni się od dokładnie już omówionego edytora. Z samą definicją
poszczególnych operacji nie powinno więc być większych problemów.
Także gadżet EDIT CLASS, znajdujący się w prawej górnej części
ekranu, nie wymaga już chyba omówienia. Po jego wybraniu po
prostu przechodzimy do edycji typu plików, którą już szczegółowo
omówiłem.
Pozostaje więc okienko w środkowej części ekranu, nazwane EVENTS.
Znajduje się w nim spis możliwych do zdefiniowania działań, które
mają być rozpoczęte po wykryciu danego typu plików. Pierwsze dwa
ich rodzaje to reakcja na kliknięcie myszą nad danym plikiem, a
następnie w drugim okienku oraz zwykłe podwójne kliknięcie nad
danym plikiem. W wypadku naszego przykładowego obrazka w formacie
JPG zdefiniujemy oczywiście reakcje na podwójne kliknięcie.
Wybieramy więc z listy "double-click" i definiujemy odpowiednie
działania. Do wyświetlania obrazków JPG bardzo dobrym narzędziem
jest program ViewTek, którym posługuję się bardzo często. Warto
więc podstawić go jako procedurę wyświetlającą obrazki JPG.
Korzystając z informacji podanych w poprzedniej części, wpisujemy
odpowiednie instrukcje oraz zgrywamy całą konfigurację na dysk.
Można już przetestować działanie zdefiniowanej komendy.
Wybieramy z katalogu dowolny obrazek w formacie JPG i dwukrotnie
klikamy nad nim myszką. Na ekranie powinien się po chwili pokazać
wybrany obrazek. Warto zwrócić uwagę, iż dzięki rozpoznawaniu
formatu JPG poprzez szukanie sekwencji JFIF DOpus prawidłowo
rozpoznaje i wyświetla także obrazki bez odpowiedniego
rozszerzenia w nazwie.
Spróbujmy jednak dodać do dowolnego innego pliku (na przykład
tekstowego) rozszerzenie JPG -- DOpus, niestety, potraktuje ten
plik jako obrazek i będzie próbował go wyświetlić. Jest jednak na
to bardzo prosta rada. Można mianowicie z powodzeniem wyrzucić z
definicji typu JPG rozpoznawanie go poprzez odnajdywanie
odpowiedniego rozszezrzenia. Z powodzeniem wystarczy przecież
odnalezienie sekwencji JFIF. Wykonajmy więc odpowiednie zmiany.
Teraz już wszystko będzie działać prawidłowo.
Oczywiście nie jest to jedyne zastosowanie mechanizmu
definiowania typów plików. Możliwości jest o wiele więcej,
zwłaszcza gdy definiowanie typów plików połączymy z definicją
własnych gadżetów. Więcej na temat zastosowania tego potężnego
narzędzia w praktyce dowiemy się z następnej części cyklu.