Wszystkie przykłady
Automatyczna aktualizacja katalogów przez FTP
| Pobierz pliki |
UltimateNetExample_1.zip
- Opis:
- Pliki źródłowe do tego przykładu
- Rozmiar:
- 115 kB
- Wymagania:
- Director MX 2004
UltimateNet Xtra 1.1
|
Załóżmy, że mamy prezentację wyświetlającą teksty i grafiki pobierane z zewnętrznych plików, oraz otwierającą
osobne filmy zapisane w plikach .dir. Wszystkie te pliki znajdują się w katalogu "data". Chcemy, aby przy każdym
uruchomieniu prezentacja sprawdzała, czy na określonym serwerze FTP w katalogu "/pub/data" są dostępne nowsze wersje
tych plików. W przypadku znalezienia nowych wersji powinno zostać wyświetlone okno dialogowe z pytaniem "Czy dokonać aktualizacji danych?".
W przypadku, gdy użytkownik zaakceptuje aktualizację, powinno się rozpocząć pobieranie (ang. download) wszystkich wymaganych
plików z katalogu "/pub/data" wraz z podkatalogami do katalogu "data" na komputerze lokalnym. Użytkownik powinien
mieć możliwość obserwacji postępu w pobieraniu plików oraz przerwania pobierania w dowolnym momencie.
Pokażemy, jak łatwe i szybkie jest wykonanie tego zadania przy użyciu xtrasa
UltimateNet Xtra.
Wszystkie główne operacje są przeprowadzane we wnętrzu xtrasa, nam pozostaje tylko zainicjować je w kodzie Lingo.
Otwieramy (lub tworzymy nowy) projekt wykorzystujący dane z zewnętrznych plików (teksty, grafiki) oraz
uruchamiający inne filmy .dir. Na początek dodamy UltimateNet Xtra i ustawimy jego właściwości w oknie dialogowym.
Dodanie UltimateNet Xtra
Wybieramy z menu
Insert > StarSoft Xtras pozycję
UltimateNet Xtra. W oknie dialogowym xtrasa, które się pojawi, będzie
nas interesowała tylko zakładka
FTP. Wprowadzamy w niej wszystkie dane potrzebne do nawiązania połączenia
z naszym kontem na serwerze FTP. Przykładowo, ustawienia te mogą wyglądać następująco:
Jeśli z bieżącego komputera jesteśmy w stanie połączyć się z danym kontem FTP, sprawdzamy poprawność wprowadzonych
ustawień wciskając przycisk
Test connection. Pomyślne nawiązanie połączenia wg wprowadzonych ustawień zostanie
potwierdzone komunikatem:
Po zamknięciu okna dialogowego xtrasa przyciskiem
OK, zostanie on dodany jako cast member do bieżącego cast-u.
Domyślna nazwa cast membera xtrasa to "UltimateNet1".
Nawiązanie połączenia FTP
Teraz musimy zdecydować, w którym miejscu prezentacji zainicjować całą operację aktualizacji. Możemy to zrobić tuż
po starcie prezentacji, w jej pierwszej klatce, w zdarzeniu
on exitFrame. Tak więc dodajemy do pierwszej klatki
(za pomocą okna Score, kanał Frame Scripts) następujący skrypt:
on exitFrame me
-- ...
member("UltimateNet1").FtpConnect()
-- ...
end
Uwaga. Ciąg "-- ..." oznacza dowolne inne instrukcje, które możemy umieścić dla potrzeb naszej prezentacji, ale w tej
chwili dla nas nieistotne.
Tak więc po opuszczeniu pierwszej klatki zostanie zainicjowane połączenie z serwerem FTP. Jak wiadomo z
podręcznika
do UltimateNet Xtra, wszystkie operacje sieciowe w tym xtrasie są asynchroniczne, czyli są realizowane "w tle" bez
zatrzymywania działania prezentacji. Tak więc funkcja
FtpConnect zakończy się prawie natychmiast po jej wywołaniu,
natomiast wynik jej działania zostanie zgłoszony po nieokreślonym czasie jako zdarzenie Lingo o nazwie
FtpConnect. Obsługa tego zdarzenia
musi mieć miejsce w skrypcie cast membera UltimateNet Xtra.
Przygotowanie aktualizacji
Właściwa aktualizacja, czyli pobranie nowszych wersji plików z serwera FTP, musi być poprzedzona porównaniem
zawartości dwóch katalogów: źródłowego na serwerze FTP i docelowego na komputerze lokalnym. Służy do tego
funkcja
FtpPrepareForUpdateDir.
Funkcja ta tworzy listę plików FTP, które mają nowsze daty lub inny rozmiar niż pliki lokalne.
Otwieramy więc okno skryptu cast membera UltimateNet Xtra i dodajemy poniższy kod:
on FtpConnect Result
FTPDIR = "pub/data" -- FTP source directory
LOCALDIR = "data" -- Local destination directory
if Result[#Error] = "OK" then
-- ...
member("UltimateNet1").FtpPrepareForUpdateDir(LOCALDIR, FTPDIR)
else
-- Error handling here
end if
end
Kod ten działa następująco: jeśli nawiązywanie połączenia z serwerem FTP przebiegło pomyślnie, następuje przygotowanie
aktualizacji dla katalogu lokalnego "data", natomiast źródłowym katalogiem FTP jest "pub/data".
Funkcja
FtpPrepareForUpdateDir
jest operacją asynchroniczną, tak więc wyniki jej działania odbierzemy w zdarzeniu o tej samej nazwie.
Potwierdzenie aktualizacji
Zanim rozpoczniemy właściwą aktualizację, damy użytkownikowi możliwość odpowiedzi na pytanie "Czy dokonać aktualizacji?".
Wykorzystamy do tego osobne okno dialogowe typu MIAW o nazwie "dialog.dir", umieszczone w katalogu "internal".
O tym, czy w ogóle znaleziono jakieś pliki do aktualizacji, informuje nas parametr
Result[#Modified].
Jeśli ma on wartość 1 (true), to wyświetlamy nasze okno dialogowe z pytaniem.
on FtpPrepareForUpdateDir Result
if Result[#Error] = "OK" then
if Result[#Modified] then
-- ...
window("internal/dialog").open()
else
-- No files to update
-- ...
end if
else
-- Error handling here
end if
end
Aktualizacja
Gdy użytkownik naciśnie przycisk "Tak" w oknie dialogowym, spowoduje to wywołanie globalnej funkcji "UpdateYes"
w głównym pliku prezentacji. Możemy wstawić do tej funkcji kod rozpoczynający właściwą aktualizację, czyli
pobieranie zmodyfikowanych plików z serwera FTP.
Całą operację pobierania realizuje bezparametrowa funkcja
FtpUpdateDir, która
wykorzystuje listę plików uzyskaną przez funkcję
FtpPrepareForUpdateDir.
on UpdateYes
-- ...
member("UltimateNet1").FtpUpdateDir()
-- ...
end
Informację o zakończeniu aktualizacji uzyskamy w zdarzeniu
FtpUpdateDir. W funkcji obsługi tego zdarzenia
powinniśmy zakończyć połączenie FTP oraz ewentualnie odświeżyć obiekty wyświetlane na scenie, możemy także wyświetlić komunikat
informujący o poprawnie zakończonej aktualizacji. Na przykład:
on FtpUpdateDir Result
if Result[#Error] = "OK" then
UpdateMembers() -- Our custom function
member("editUpdateStatus").text = "Update done successfully"
else
member("editUpdateStatus").text = "Error: " & Result[#ErrorText]
end if
member("UltimateNet1").FtpDisconnect()
end
Wskaźnik postępu aktualizacji
Dzięki zdarzeniu
on FtpProgress możemy łatwo utworzyć
wskaźnik informujący o postępie w pobieraniu plików.
Oto jeden z najprostszych przykładów:
-- Movie script:
on UpdateFTPProgressBar Percentage
UpdateProgressBar(Percentage, sprite("ProgressBar"))
end
on UpdateProgressBar Percentage, progressBar
progressFrame = sprite(progressBar.spriteNum - 1)
-- Count new progress bar dimensions
rightBound = progressFrame.left + progressFrame.width * Percentage / 100
progressBar.rect = rect(progressFrame.left + 1, progressFrame.top + 1, \
rightBound , progressFrame.bottom - 1)
end
-- UltimateNet Xtra cast member script:
on FtpProgress Result
UpdateFTPProgressBar(Result[#BytesSoFar] * 100 / Result[#BytesTotal])
end
Zakładamy tutaj, że wskaźnik jest zbudowany z dwóch sprite'ów - ramki ograniczającej i paska o zmiennej długości.
Sprite paska ma nazwę "ProgressBar", natomiast sprite ramki leży w kanale o jeden numer niższym niż sprite paska.
Wymiary paska są obliczane na podstawie wymiarów ramki oraz aktualnego postępu pobierania wyrażonego w procentach.
Plik .dir dołączony do tego przykładu (przeznaczony dla Directora MX 2004) zawiera wszystkie powyższe skrypty, a oprócz tego
demonstruje kilka innych zagadnień przydatnych dla użytkowników Directora, którzy chcą wyposażyć swoje prezentacje
w opcję automatycznej aktualizacji FTP.
Komentarze? -
Wszystkie przykłady