Модификация библиотеки классов rxFtp из Open Object Rexx для использования в Object Rexx под OS/2

Знакомство с библиотекой классов 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 надо:

  1. получить файл rxftp.cls, содержащий исходный код библиотеки классов. Его можно взять из любого доступного на SourceForge дистрибутива. Например, на момент написания заметки самой свежей реализацией была версия 4.2.0, поэтому информация об изменениях относится именно к этой версии.

  2. отредактировать содержимое 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 возвращает пустую строку в качестве значения для пропущенных параметров.

  3. поместить изменённый rxftp.cls в один из каталогов, перечисленных в переменной окружения PATH.
Эта модификация полностью сохраняет всю существующую функциональность библиотеки (включая ошибки :)).

В качестве примера работы модифицированной библиотеки классов rxFtp приведено приложение, отображающее на экране содержимое каталога /pub сайта hobbes.nmsu.edu.

Пример:

 /* 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 http://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 http:// 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.


---