Kopie zapasowe pulpitu

Autor: Przemysław Pawełczyk

Zdjęcia ekranu:

REXX-PP00.GIF - Czołówka z dokumentacji ROBOSAVE 
REXX-PP01.GIF - Folder ROBOSAVE
REXX-PP02.GIF - Program IniMaint do obsługi plików INI
REXX-PP03.GIF - MultiMaint to zestaw programów.

Programy ratunkowe dla Pulpitu

Przed uszkodzeniami Pulpitu możemy zabezpieczyć się na trzy sposoby. Pierwszy polega na wykorzystaniu programów mogących tworzyć kopie zapasowe katalogu Desktop i wszystkich plików systemu odpowiedzialnych za wygląd oraz zachowanie się Pulpitu. W tym plików OS2.INI, OS2SYS.INI oraz atrybutów rozszerzonych katalogów i plików. Drugi sposób, uboższy, polega na napisaniu programów w języku REXX, które chociaż częściowo przywróciłyby ustawienia na Pulpicie (a raczej wykonały te ustawienia i powiązania na nowo). I wreszcie sposób trzeci, korzystający z plików *.RC i systemowego programu MAKEINI.EXE. Przyjrzyjmy się im pokrótce.

Programy archiwizujące

Proste

Posłużę się kilkoma przykładami. Zacznijmy od dwóch programów przeznaczonych wyłącznie do wykonywania kopii Pulpitu. Jednym z nich jest shareware'owy program Workplace Shell Backup Utility 4.01, napisany przez p. Dave'a Lestera, a drugim freeware'owy ROBOSAVE Version 3.04, napisany i rozprowadzany w ramach programów EWS 1), przez pp. R. R. Kurtza i J. G. Knautha.

Rys.1. Czołówka z dokumentacji ROBOSAVE.

W obu definiujemy pliki podlegające archiwzacji. Nie muszą to być tylko pliki z katalogu Desktop. Można np. zarchiwizować wszystkie pliki INI występujące w naszym systemie, a więc i te pochodzące także od naszych aplikacji. Oba omawiane programy pozwalają na odzyskiwanie pojedynczych plików i tworzenie prawie dowolnej liczby generacji kopii zapasowych (kto z nas zapamięta co było w poprzednich np. 256?!). Oba można wykorzystać do przenoszenia Pulpitu na inne komputery, np. sieciowe.

Rys.2. Widok folderu RoboSave.

Odzyskiwanie Pulpitu polega zazwyczaj na uruchomieniu programu RESTORE. Odbywa się to jeszcze przed uruchomieniem programu PMSHELL.EXE. Dlatego użytkownik OS/2 musi uruchomić system tylko do poziomu znakowego. Na przykład podczys startu systemu, poprzez naciśnięcie klawiszy Alt-F1, i wybraniu opcji C (jest to zwykła procedura ratunkowa Warpa, opisana w angielskim podręczniku na stronie 204).

Pamiętajmy, że nie wszystkie tego typu programy, w tym i ROBOSAVE, pozwolą na migrację Pulpitu do innej wersji OS/2, albo i tej samej, ale za to z łatką (po zastosowaniu CSD [Corrective Service Diskette]). Nie wszystki też potrafią zachować informacje o pracujących aplikacjach, tak że po odzyskaniu Pulpitu użytkownik będzie musiał to zrobić samemu.

Zaawansowane

Pozostałe do omówienia dwa programy są w zasadzie pakietami narzędziowymi, bardziej zaawansowanymi od dwóch poprzednich, gdyż zawierają programy ingerujące w pliki INI plus programy do obsługi systemu. Są przez to niebezpieczne, a w rękach niedoświadczonych użytkowników mogą wręcz doprowadzić do katastrofy i ponownego konfigurowania Pulpitu, jego obiektów i wzajemnych połączeć. Tymi programami są shareware'owy pakiet MultiMaint firmy Carry Associates i freeware'owy pakiet WPTOOLS, napisany przez p.Henka Keldera.

Rys.3. Program IniMaint do obsługi plików INI.

Najbardziej rozbudowany jest pakiet MultiMaint, który jest nadzbiorem pakietu SysMaint, a ten z kolei pakietu IniMaint. Na zdjęciu pokazany jest program IniMaint, gdyż tylko taki jest dostępny w shareware, pomimo rozprowadzania pakietów o nazwie MultiMaint (zawarte w nim programy pozostają nieaktywne do czasu rejestracji). Nas najbardziej interesuje pakiet MultiMaint. Jego podstawowe funkcje sprowadzają się do trzech zadań - edycji plików INI, edycji atrybutów rozszerzonych i wykonywanie kopii archiwizacyjnych Pulpitu.

Rys.4. MultiMaint to zestaw programów.
Ten drugi, WPTOOLS, potrafi zarchiwizować i odzyskać Pulpit, usunąć z plików *.INI zestarzałe sią już informacje dotyczące WPSa, poprawić niektóre błędy związane z WPSem, itp. A poza tym, korzystając z biblioteki WPTOOLS.DLL umożliwia odczytywanie ustawień wszystkich obiektów WPSa.

Korzystajmy z REXXa

Drugi sposób odtwarzania Pulpitu, mniej wygodny i mniej wszechstronny, polega na wykorzystaniu REXXowej procedury, zawierającej całe sekwencje poleceń służących do tworzenia "pulpitowych" obiektów. Ze względu na złożoność metoda ta jest wygodna jedynie w przypadku prostego Pulpitu, posiadającego niewiele obiektów. Jednak taka możliwość istnieje i sam z niej ostatnio korzystałem, odtwarzając własne Wyrzutnie w Wyrzutni (Wyrzutnię Główną z umieszczonymi w niej następnymi Wyrzutniami).
Ponieważ nie będę się wgłębiał w budowę poleceń języka REXX (uczyniłem to w artykule REXX? Ależ to bardzo proste., w jednym z numerów Electry), gdyż zajęłoby to zbyt dużo miejsca, radzę zajrzeć do odpowiedniej książki pomocy, zatytułowanej REXX. Opiszę tylko jak działa taki program.
Program MYDESK.CMD składa się z wielu modułów wykorzystujących jedno rexxowe polecenie: SysCreateObject (myślę, że nazwa mówi sama za siebie). W przypadku tworzenia wyrzutni i nadania jej nowych wartości, moduły są bardziej skomplikowane, ale tylko poprzez mnogość parametrów i ich wzajemne pwiązania. Samo tworzenie obiektu odbywa się również przy pomocy tego polecenia. Nota bene złożoność ta wynika z możliwości wypełnienia samej wyrzutni jak i jej szuflad. Proces ten opiszę w dziale Dla Praktyków, tutaj chciałbym tylko wspomnieć o wykorzystaniu REXXa do odtwarzania Pulpitu.
Pokażę tylko trzy moduły z tego programu, aby wykazać, że tworzenie obiektów z pmocą języka REXX jest podobne do metody wykorzystywanej w pliku INI.RC, który opisałem w dalszej części artykułu.
Pierwszy tworzy 10 nowych wyrzutni w moim własnym folderze przeznaczonym dla wyrzutni (o identyfikatorze <MY_LAUNCHPADS_FOLDER>). Każda z nowych wyrzutni zawiera na razie tylko Szatkownicę. Nowe wyrzutnie tworzone są w pętli przy pomocy SysCreateObject.
Moduł 1
/*--------------------------------------------------------*/
classname = 'WPLaunchPad'
location = '<MY_LAUNCHPADS_FOLDER>'
base_setup =,
          'CCVIEW=NO;'                      ||,
          'HELPPANEL=#2253;'                ||,
          'LPACTIONSTYLE=OFF;'              ||,
          'LPCLOSEDRAWER=YES;'              ||,
          'LPDRAWERTEXT=NO;'                ||,
          'LPFLOAT=NO;'                     ||,
          'LPHIDECTRLS=YES;'                ||,
          'LPSMALLICONS=NO;'                ||,
          'LPTEXT=NO;'                      ||,
          'LPVERTICAL=NO;'                  ||,
          'NOPRINT=YES;'

do i=1 to 10    
  setup = 'ICONFILE='icpath || icfile.i';'  ||, 
          base_setup                        ||,
          'FPOBJECTS=<WP_SHRED>;'           ||,
          'OBJECTID=<My_LaunchPad_'title.i>;'

  res=SysCreateObject(classname, title.i, location, setup,,
                      option)

  If res <> 1 Then signal CleanUp
end
/*--------------------------------------------------------*/
Dopiero w drugim module nadawane są wyrzutniom nowe obiekty. W opisanym przykładzie wyrzutni o identyfikatorze <My_LaunchPad_Editors>, przeznaczonej dla edytorów (wyrzutnie są pogrupowane tematycznie), nadawane są obiekty edytorów i innych programów z nimi stowarzyszonych. MyLaunchPad_05 nie jest niczym innym, jak zmienną zawierającą zbiór ustawień nadawanych wyrzutni <My_LaunchPad_Editors>. Stąd polecenie SysSetObjectData (Ustaw Dane Obiektu), a nie SysCreateObject (Utwórz Obiekt). Proszę zwrócić uwagę na bardzo częste wykorzystywanie identyfikatorów obiektów (napisy zawarte pomiędzy nawiasami <>). Na przykład <WP_EPM> oznacza edytor Enhanced Editor (szerzej znany jako EPM). <WP_SEEK> to z kolei identyfikator programu do wyszukiwania i przeszukiwania plików (Seek and Scan Files, fizycznie pmseek.exe). Itd.
Moduł 2
/*--------------------------------------------------------*/
MyLaunchPad_05 =,
  'DRAWEROBJECTS=00,'  ||,
  '<WP_EPM>,'          ||,
  '<WP_SYSED>,'        ||,
  '<WP_SEEK>,'         ||,
  '<WP_TEMPS>,'        ||,
  '<MY_MANYCLIP>,'     ||,
  '<MY_PMDIFF>,'       ||,
  '<MY_FONTFOLDER>,'   ||,
  '<MY_GFC>,'          ||,
  '<MY_MAKEIPF>,'      ||,
  '<MY_HEXEDIT>,'      ||,
  ';'
/*------------------------*/

call SysSetObjectData <My_LaunchPad_Editors>', MyLaunchPad_05
/*--------------------------------------------------------*/
Trzeci z przykładów pokazuje uniwersalny moduł tworzący na Pulpicie odnośnik do programu, tutaj programu antywirusowego OS2SCAN.EXE firmy McAfee, nie stowarzyszonego z żadną z wyrzutni (tak też można ;-D ). Dodam tylko, że po wykonaniu programu okno pozostaje na Pulpicie nie zamknięte, po to by móc odczytać rezultat jego działania. Odpowiada za to parametr NOAUTOCLOSE=YES. Natomiast parametr /ADL znajdujący się w linii PARAMETERS służy do poinformowania programu OS2SCAN.EXE aby przeszukał wszystkie dyski twarde w systemie.
Moduł 3
/*--------------------------------------------------------*/
title     = 'OS2 Virus Scan'
setup     = 'EXENAME=E:\TOOLS\MCAFEE\OS2SCAN.EXE;'  ||,
            'STARTUPDIR=E:\TOOLS\MCAFEE;'           ||,
            'PARAMETERS=/ADL;'                      ||,
            'PROGTYPE=WINDOWABLEVIO;'               ||,
            'MAXIMIZED=YES;'                        ||,
            'NOAUTOCLOSE=YES;'                      ||,
            'OBJECTID=<MY_MCAFEE>;'                 ||,
            'ICONFILE='icpath || icfile.15';'

res = SysCreateObject(classname, title, location, setup,,
                      option)

If res <> 1 Then signal CleanUp
/*--------------------------------------------------------*/

Pliki RC

Jeśli choć trochę znamy język REXX, to nie powinniśmy mieć problemów ze zrozumieniem następnego sposobu odtwarzania Pulpitu, polegającego na modyfikacji pliku systemowego INI.RC. Tu muszę wyraźnie ostrzec użytkowników Warpa. Wszelkie manipulacje w plikach systemowych należy wykonywać ostrożnie, mając na karku wypoczęty łeb i tylko po uprzednim wykonaniu kopii, które na dodatek należy umieścić w łatwo dostępnym miejscu (najlepiej w katalogu "korzennym" (głównym)).
Jeśli zajrzymy do podręcznika użytkownika (User's Guide to OS/2 Warp), to na stronie 209 znajdziemy prosty opis odtwarzania "dziewiczych" plików INI. Tworzy się je z plików tekstowych z rozszerzeniem RC. Są w nich zapisane wszystkie pierwotne ustawienia Pulpitu, jakie pojawią się po pierwszym zainstalowaniu systemu (następne instalacje przejmują zazwyczaj stare ustawienia).
Nic nie stoi na przeszkodzie by je uzupełnić o nasze własne obiekty i ich wzajemne powiązania. Jeżeli do tej pory nikt tego nie robił, to jedynie ze względu na ryzyko spaprania systemu przez niedoświadczonego użytkownika. Poza tym estetyka (etyka?) programowania podpowiada sposób oparty na osobnym (dodatkowym) programie.
Przyjrzyjmy się jak wygląda fragment pliku INI.RC, odpowiedzialny za tworzenie obiektów, który znajduje się w katalogu C:\OS2. Występuje w nim polecenie PM_InstallObject. Jego składnia jest bardzo prosta i przypomina tworzenie obiektów przy pomocy języka REXX.
"PM_InstallObject" "Nazwa obiektu; TypObiektu;<Miejsce>" "Ustawienia"
Nazwa objektu - nazwa, która znajduje się pod ikoną obiektu
TypObiektu - innaczej klasa obiektu np. WPProgram, WPFolder, itp.
Miejsce - miejsce umiejscowienia nowego obiektu podane jako identyfikator miejsca (obiektu), bp. <MY_FOLDER>
Ustawienia - sekwencja parametrów obiektu, wyjaśnienia w tekście, chociaż lepiej jest zaglądnąć do książki pomocy języka REXX.
W rzeczywistości wyrażenia występujące po "PM_InstallObject" pisane są w pliku INI.RC w jednej linii.
(....)
STRINGTABLE REPLACEMODE
BEGIN
  "PM_InstallObject" "Nowhere;WPFolder;?:\"  "OBJECTID=<WP_NOWHERE>"
  "PM_InstallObject" "Information;WPFolder;<WP_DESKTOP>;UPDATE"
     "HELPPANEL=13092;ICONRESOURCE=60 PMWP;ICONPOS=8 52;
     ICONVIEWPOS=10 30 69 50;OBJECTID=<WP_INFO>"

  "PM_InstallObject" "OS/2 System;WPFolder;<WP_DESKTOP>;UPDATE"
     "HELPPANEL=4002;NODELETE=YES;ICONRESOURCE=61 PMWP;
     ICONNRESOURCE=1,35,PMWP;ICONPOS=8 65;
     ICONVIEWPOS=18 45 70 38;OBJECTID=<WP_OS2SYS>"

  "PM_InstallObject" "Productivity;WPFolder;<WP_OS2SYS>"
     "HELPPANEL=13090;OBJECTID=<WP_TOOLS>"
     "PM_InstallObject" "View;WPProgram;<WP_NOWHERE>;UPDATE"
     "EXENAME=?:\OS2\VIEW.EXE;ASSOCFILTER=*.INF;NOTVISIBLE=YES;
     OBJECTID=<WP_VIEWINF>"

  "PM_InstallObject" "Templates;WPTemplates;<WP_DESKTOP>"
     "HELPPANEL=15680;NODELETE=YES;ICONPOS=8 8;OBJECTID=<WP_TEMPS>"

  "PM_InstallObject" "Minimized^Window Viewer;WPMinWinViewer;
     <WP_OS2SYS>" "ALWAYSSORT=YES;OBJECTID=<WP_VIEWER>"

  "PM_InstallObject" "Shredder;WPShredder;<WP_OS2SYS>" "OBJECTID=<WP_SHRED>"
(....)
Są w nim takie same polcenia jakie stosujemy do obsługi obiektów w języku REXX. Przeanalizujmy z naszego fragmentu np. linię 3 od góry, po słowie BEGIN, polecenie utworzenia folderu OS/2 System.
"PM_InstallObject"        - polecnie tworzenia obiektu,
"OS/2 System;             - nazwa nowego obiektu
WPFolder;                 - przynależność do klasy (jest folderem)
<WP_DESKTOP>;             - identyfikator obiektu przyjmującego nowy folder,
                            tutaj - Pulpit
UPDATE"                   - polecenie w razie natrafienia na taki obiekt
"HELPPANEL=4002;          - numer panelu pomocy
NODELETE=YES;             - nie można go usunąć (proszę sprawdzić!)
ICONRESOURCE=61 PMWP;     - ikona folderu zamkniętego i jej numer w
                            bibliotece PMWP.DLL
ICONNRESOURCE=1,35,PMWP;  - ikona folderu otwartego i jej numer w
                            bibliotece PMWP.DLL
ICONPOS=8 65;             - miejsce ikony na Pulpicie x=8%, y=65% wymiarów 
                            ekranu
ICONVIEWPOS=18 45 70 383  - 18% ekranu z lewa, 45% ekranu od dołu,
                            szer.okna 70% szer.ekranu, wys. okna = 38%
                            całkowitej wysokośc) ekranu
OBJECTID=<WP_OS2SYS>"     - identyfikator tego folderu
Podobnie tworzy się odnośniki do programów. Rozpatrzmy przykład gry Mahjongg (pogrupowane zgodnie z cudzysłowem):
"PM_InstallObject"

"Mahjongg;                         - nazwa obiektu (napis pod ikoną)
WPProgram;                         - klasa obiektu
<MAH_FOLDER>;                      - miejsce przeznaczenia (ten folder 
                                     został już wcześniej utworzony, stąd
                                     jego identyfikator!)
UPDATE"                            - popraw gdyby obiekt istniał

"EXENAME=?:\OS2\APPS\MAHJONGG.EXE; - nazwa pliku programu wraz ze ścieżką
PROGTYPE=PM;                       - typ programu PM = Presentation Manager
ASSOCFILTER=*.MAH;                 - skojarzone z nim pliki (filtr)
ICONFILE=\OS2\APPS\MAHJONGG.ICO;   - plik ikony nowego obiektu
STARTUPDIR=\OS2\APPS;              - katalog bieżący podczas uruchomienia
HELPPANEL=32219;                   - numer panelu pomocy
OBJECTID=<MAH_EXE>"                - identyfikator obiektu
Przeglądając plik INI.RC zauważymy, że nie wszystkie obiekty zawierają panele pomocy czy inne szczegółowe parametry. Pamiętajmy tylko o tym, by użycie jakiegoś identyfikatora obiektu <...>, było poprzedzone jego utworzeniem. Przed przystąpieniem do eksperymentów powinniśmy wykonać kopię Pulpitu, korzystając z jakiegoś opisanego wcześniej programu. Następnie wykonać kopię pliku INI.RC, np. INI.OLD. Dopiero potem można wprowadzić swoje dane do INI.RC i wykonać procedurę ratunkową, korzystającą z pliku MAKEINI.EXE i pliku INI.RC (opis w Podręczniku Użytkownika na str. 210, podrozdział Recovering the User INI File).

Zakończenie

Mam nadzieję, że choć trochę wyjaśniłem bezwzględną potrzebę archiwizowania Pulpitu, obiektowego systemu OS/2 Warp. Odtwarzałem go ostatnio od podstaw kilkakrotnie, to wiem "czym to boli". Przy okazji chciałem pokazać, że Warp nie jest wcale taki strasznie skomplikowany. Szkoda tylko, że IBM wyposażył Warpa w tak skąpą dokumentację, chociaż... Może właśnie dlatego jest tak pociągający?
1) EWS - IBM OS/2 [Employee Written Software] to programy napisane przez pracowników IBM i rozprowadzane nieodpłatnie.
 
<-Powrót 

Tech/2 strony z poradami technicznymi na temat systemu OS/2