Модификация библиотеки классов rxFtp из Open Object Rexx для использования в Object Rexx под OS/2
Автор: Виктор Смирнов
Дата: 31.08.2015
Источник: vasm.livejournal.com
Знакомство с библиотекой классов rxFtp из Open Object REXX вызывает закономерное желание использовать её в Object REXX под OS/2 вместо существующей там библиотеки внешних функций rxFtp. Уж очень привлекательные возможности реализованы в этой библиотеке классов. Поскольку сама библиотека классов написана на Open Object REXX, то модифицикация её кода не является проблемой в пределах прав, предоставляемых лицензией Common Public License v1.0 (перевод).
Один из вариантов модификации исходного кода библиотеки, решающий эту задачу, представлен ниже.
Один из вариантов модификации исходного кода библиотеки, решающий эту задачу, представлен ниже.
---
Для того, чтобы использовать библиотеку классов rxFtp из Open Object REXX в Object REXX для OS/2 надо:
- получить файл
rxftp.cls , содержащий исходный код библиотеки классов. Его можно взять из любого доступного на SourceForge дистрибутива. Например, на момент написания заметки самой свежей реализацией была версия4.2.0 , поэтому информация об изменениях относится именно к этой версии.
- отредактировать содержимое
rxftp.cls , заменив новомодные синтаксические конструкции Open Object REXX старомодными функциональными аналогами из Object REXX. Для версии4.2.0 достаточно внести следующие изменения (обоснования приведены следом за предлагаемыми заменами):
строка 61было ::requires "rxsock" LIBRARY -- need the rxsock library available to function стало if RxFuncQuery('SockDropFuncs') then do _rc = RxFuncAdd('SockLoadFuncs', 'rxSock', 'SockLoadFuncs'); _rc = SockLoadFuncs(0); end
Модификатор LIBRARY у директивы ::REQUIRES отсутствует в Object REXX, а в Open Object REXX впервые появился в версии4.0.0 . Данная директива в формате::REQUIRES "имя_библиотеки" LIBRARY используется для получения доступа к библиотекам внешних функций, заменяя традиционный механизм, основанный на функциях API RXFUNCADD, RXFUNCDROP и RXFUNCQUERY.
строка 948было ::attribute cr_remove unguarded -- .true = remove CR from ASCII downloads стало ::method cr_remove attribute unguarded -- .true = remove CR from ASCII downloads
строка 949было ::attribute debug unguarded -- .false suppresses debug messages стало ::method debug attribute unguarded -- .false suppresses debug messages
Директива ::ATTRIBUTE отсутствует в Object REXX, а в Open Object REXX впервые появилась в версии3.2.0 . В формате::ATTRIBUTE имя без указания модификатора GET или SET является полным функциональным аналогом директивы::METHOD имя ATTRIBUTE .
строка 950было ::attribute bufsize get unguarded -- bufsize for send/receive стало ::method bufsize unguarded -- get bufsize for send/receive expose bufsize return bufsize
строка 951было ::attribute bufsize set стало ::method 'BUFSIZE=' -- set bufsize for send/receive
Модификаторы GET и SET директивы ::ATTRIBUTE позволяют организовать дополнительную обработку как при присвоении значения атрибуту, так и при получении его значения. Традиционно в Object REXX эта задача решается парой методов, задаваемых директивами::METHOD имя и::METHOD 'имя=' .
строка 1943было use arg fname, mode, sharemode='' стало use arg fname, mode, sharemode sharemode=arg(3)
строка 1952было use arg fname, mode, sharemode='', logmode стало use arg fname, mode, sharemode, logmode sharemode=arg(3)
Возможность задать в ключевой инструкцииUSE ARG значение, принимаемое аргументом по умолчанию, отсутствует в Object REXX, а в Open Object REXX впервые появилась в версии3.2.0 . Особенность исполнения ключевой инструкцииUSE ARG состоит в том, что все переменные, перечисленные в списке аргументов, деинициализируются перед приёмом значений параметров. Если какое-либо значение будет пропущено при передаче параметров, то соответствующая переменная из списка аргументов ключевой инструкцииUSE ARG останется неинициализированной. В то же время функция ARG возвращает пустую строку в качестве значения для пропущенных параметров.
- поместить изменённый
rxftp.cls в один из каталогов, перечисленных в переменной окружения PATH.
Эта модификация полностью сохраняет всю существующую функциональность библиотеки (включая ошибки :)).
В качестве примера работы модифицированной библиотеки классов rxFtp приведено приложение, отображающее на экране содержимое каталога
Пример:
/* ftpSample.cmd - the ooReXX rxFtp Class Library is modified for OS/2 oReXX */ parse version _ver say _ver say 'The Operating System is' .system~name _mode = 'PASSIVE' -- or 'ACTIVE' _host = 'hobbes.nmsu.edu' _user = 'anonymous' _pass = 'nobody@nowhere.com' _path = './pub' _log = 'trace.log' _ftp = .rxftp~new say 'rxFtp Class Library version ' _ftp~FtpVersion _rc = _ftp~FtpTrace _rc = _ftp~FtpTraceLog(_log, 'R') If _rc = 0 then say 'Replies will be written to log file: ' _log else say 'Unable to write to log file: ' _log _rc = _ftp~FtpSetUser(_host, _user, _pass) _rc = _ftp~FtpSetMode(_mode) _rc = _ftp~FtpDir(_path) if _rc = 0 then do _line over _ftp~Response say _line end _rc = _ftp~FtpLogoff() _rc = _ftp~FtpTraceLogoff() _rc = SockDropFuncs() exit ::requires "rxftp.cls" |
Выполнение примера:
C:\>ftpSample.cmd OBJREXX 6.00 18 May 1999 The Operating System is OS/2 rxFtp Class Library version 4.2.0 Replies will be written to log file: trace.log USER anonymous PASS XXXX SYST PASV LIST -aL ./pub drwxr-sr-x 11 502 502 4096 May 25 15:29 . drwxr-xr-x 3 502 502 4096 Feb 17 2012 .. -rw-r--r-- 1 502 502 2332 Aug 31 2008 .file.idx -rw-r--r-- 1 502 502 159537 Sep 01 2008 .ls-lR.gz -rw-r--r-- 1 502 502 2910825 Sep 01 2008 .search.idx -rw-r--r-- 1 502 502 602 Aug 18 2008 00README.UPGRADE -rw-r--r-- 1 502 502 308855 Sep 01 2008 00global.gz drwxr-sr-x 2 0 502 4096 Sep 11 2008 delayed drwxr-xr-x 2 502 502 4096 Sep 01 2008 dos drwsrwsr-t 4 502 502 69632 Sep 03 15:47 incoming drwxr-xr-x 7 502 502 4096 Sep 01 2008 java drwxr-xr-x 9 502 502 4096 Sep 01 2008 multimedia drwxr-xr-x 2 502 502 4096 Sep 02 07:01 new drwxr-xr-x 10 502 502 4096 Nov 02 2014 os2 drwxr-sr-x 2 502 502 4096 Aug 29 07:01 text-archives drwxr-xr-x 2 502 502 4096 Dec 01 2014 windows QUIT |
Содержимое файла trace.log после выполнения примера:
220-If your FTP client crashes or hangs shortly after login, please try 220-using a dash (-) as the first character of your password. This 220-will turn off the informational messages that may be confusing your 220-FTP client. 220- 220-New uploads should be placed in /pub/incoming. 220- 220-OS/2, Java, and various forms of multimedia archives are accepted. 220- 220-NMSU is an educational institution which permits free access to its 220-ftp archives. No money is charged for access to the archives or the 220-distribution of its contents. NMSU has no affiliation with Walnut 220-Creek, makers of the Hobbes OS/2 CD-ROM. 220- 220-You are user 1 out of a possible 255 220- 220-Please send mail to archiver@hobbes.nmsu.edu if you experience any problems. 220- 220-If you have a web browser, please access Hobbes through the website, which 220-is much more powerful and navigable, at https://hobbes.nmsu.edu instead. 220-If you were linked here from a webpage, please notify whomever you got the 220-link from to link to the https:// instead of ftp:// form of the URL. If 220-you're experiencing slow downloads, try a mirror site (listed in the file 220-/0mirrors.txt). 220- 220-Login: anonymous password: [your email address] 220 USER anonymous 331 Please specify the password. PASS XXXX 230 Login successful. SYST 215 UNIX Type: L8 PASV 227 Entering Passive Mode (128,123,34,6,229,57). LIST -aL ./pub 150 Here comes the directory listing. 226 Directory send OK. QUIT 221 Goodbye. |