Назначение
Функции реализованы в FServDLL.dll.
Функции рассчитаны на использование посредством интерпретатора сценариев FSHELL.exe.
Вышеуказанные функции могут вести протокол своей работы, в файл журнала заносятся сведения о действиях программы и сообщения об ошибках, возникающих в процессе работы.
Формат командной строки запуска сценария: Fshell.exe <XPacker.bas>
Где XPacker.bas — имя файла сценария (программа на языке FOSIC);
Файл-сценарий составляется на языке FOSIC. Часть файла-сценария, которая содержит часто употребляемые подпрограммы, составленные на языке FOSIC, может быть вынесена в файл «fpkapi.fh» или «utils.fh». Этот файл должен находиться в том же каталоге, где «XPacker.bas».
Функции
_Pack
Формат передаваемых в функцию параметров:
_Pack(Mask, OutDir, FMailAdr)
где:
- Mask – используется при поиске файлов (файлы, которые не удовлетворяют заданной маске, упаковываться не будут).
- OutDir – папка, в которой будет осуществляться поиск файлов на упаковку.
- FMailAdr – адрес получателя в формате X400.
(например: «C:UA/ADMD:EAST_Region/PRMD:KHARKOV/ORG:FOSS/OU:DEPARTMENT/PN:SEM»).
Схема работы:
Функция _Pack выбирает по маске Mask из каталога OutDir файлы для отправки. Затем из этих файлов формируется файл почтовой корреспонденции (ФПК) и кладется в каталог QUEUEDir (который задается функцией _SetXPackerQUEUEDir(QUEUEDir) см. ниже). ФПК из каталога QUEUEDir отправляются клиентской программой TcpFoss по каналу связи.
При формировании ФПК учитываются следующие ограничения:
1) Размер ФПК, в kB, меньше MaxFilesLen (задается _SetXPackMaxFSize(MaxFilesLen)
2) Количество файлов в ФПК д.б. не больше MaxFilesNum (задается _SetXPackMaxFNum(MaxFilesNum)
При формировании конверта ФПК учитываются атрибуты ФПК задаваемые функциями: _SetSelfAdr, _SetFPKPriorityLevel, _SetXPackRepType.
Файлы, на которые запрошен отчет, копируются также в OutTmpDir, и будут находиться там до получения отчета о доставке (см. _UnPack).
_XPack
Формат передаваемых в функцию параметров:
_XPack(Mask, OutDir)
где:
- Mask – используется при поиске файлов (файлы, которые не удовлетворяют заданной маске, упаковываться не будут).
- OutDir – папка, в которой будет осуществляться поиск файлов на упаковку.
Схема работы:
Функция _XPack выбирает по маске Mask из каталога OutDir файлы для отправки. Они переносятся в каталог UserOutTmp. Затем из этих файлов формируется файл почтовой корреспонденции (ФПК) и кладется в каталог QUEUEDir. ФПК из каталога QUEUEDir забирает маршрутизатор системы FossMail и отправляет их по каналу связи.
Все в описании функции _Pack относится и к _XPack, кроме следующего:
принципиальное отличие в способе формирования адреса получателя и темы ФПК.
Для _Pack адрес получателя передается в качестве параметра.
_XPack формирует эти поля конверта по четырем символам в имени файла, выбранного по маске Mask из каталога OutDir.
Формирование адреса получателя происходит в соответствии с информацией из файла xpacker.dat. (дан в качестве примера). Если сформировать адрес по имени с помощью xpacker.dat не удается, такой файл остается в OutDir.
Тема ФПК формируется так: «От <SelfAdr> к <четыре символа имени>.». Например, если SetSelfAdr(“C:UA/ADMD:EAST_Region/PRMD:KHARKOV/ORG:FOSS/OU:DEPARTMENT/PN:SEM”) и пакуется файл UUARUUAL.S32, то тема: «От SEM к UUAL.»
_UnPack
Формат передаваемых в функцию параметров:
_UnPack(FPKDir, FilesDir)
где:
- FPKDir – папка, из которой будут браться файлы на распаковку.
- OutDir – папка, в которую будут помещаться распакованные файлы.
Схема работы:
Система FossMail доставляет полученные по каналам связи ФПК в почтовый ящик пользователя (каталог FPKDir). Функция _UnPack обрабатывает присланные ФПК и создает по ним отчет (отчет запрошен и, если ФПК сам не является отчетом), а файлы выкладывает в каталоги FilesDir.
Количество ФПК, обработанных при одном вызове _UnPack д.б. меньше MaxFpkNum (задается SetXUnPackNum(MaxFpkNum)). По умолчанию UnPack завершает работу после полной обработки FPKDir.
1) Если к _UnPacker попадает не ФПК, он перекладывается в BadDir (задается _SetXPackerBadDir(BadDir));
2) Если к _UnPacker попадает поврежденный ФПК, он перекладывается в BadDir. При этом, если известен адрес отправителя, будет сформирован в QUEUEDir отчет с кодом доставки 101:
.RCODE = 101
.ERCODE = 11 — в ФПК не обнаружено CRC
или
12 — ошибка CRC информационной части
или
13 — ошибка CRC конверта
3) Если к _UnPacker попадает ФПК-отчет, функция проверяет код доставки. Если файлы НЕ доставлены, они из OutTmpDir перекладываются в UnDeliveredDir. Если файлы доставлены, они из OutTmpDir перекладываются в DeliveredDir, а если он не задан, удаляются (задается _SetXPackerDeliver_UnDeliverDir(DeliveredDir,UndeliveredDir)).
4) Если к _UnPack попадает ФПК с файлами, то
- a) ФПК распаковывается в каталог OutDir и удаляется
- b) При распаковке в OutDir у файлов с одинаковыми именами изменяется расширение или распаковка данного ФПК откладывается (в зависимости от установок, функция _SetXUnPackRewriteMode(Mode)).
Если произошел сбой при распаковке, функция сообщает об этом в файле журнала и восстанавливает ситуацию.
Отчет формируется после распаковки с кодом доставки 0:
.RCODE = 0
.ERCODE = 0
_UnPackFPK
Формат передаваемых в функцию параметров:
_UnPackFPK(fh, FilesDir)
где:
- fh – дескриптор предварительно открытого и загруженного конверта (fpk_open(fh), fpk_load_ex(fh) ).
- OutDir – папка, в которую будут помещаться распакованные файлы.
Схема работы:
Та же, что и в _UnPack, за исключением того, что файлы конвертов не удаляются и должны открываться извне.
_UnPackCondition
Формат передаваемых в функцию параметров:
_UnPackCondition(FPKDir, FilesDir,Condition)
где:
- FPKDir – папка, из которой будут браться файлы на распаковку.
- OutDir – папка, в которую будут помещаться распакованные файлы.
- Condition – строка, описывающая условия, при которых происходит распаковка конверта.
Схема работы:
Алгоритм работы — см. _UnPack с одной поправкой — распаковка происходит только при выполнении условия Condition
формат Condition:
<SubCond1><MergerOperator><SubCond2>…<SubCondN>
где:
- <SubCond> — см. ниже
- <MergerOperator> — оператор объединения подусловий, поддерживаются один оператор &
формат SubCond: <KeyField><Operator><Condition>, где:
- <KeyField> — поле конверта
- <Operator> — оператор, поддерживается 4 оператора
- == — поле удовлетворяет условию
- != — поле не удовлетворяет условию
- =~ — поле удовлетворяет условию, условие проверяется без учета регистра
- !~ — поле не удовлетворяет условию, условие проверяется без учета регистра
- <Condition> — маска содержимого поля, см. _CheckConditioni
Пример:
_UnPackCondition(«.\Fpk»,».\In»,».TH==*@UUIU & .DL==*FMAIL*»)
— распаковать из каталога «.\Fpk» в «.\In» все конверты маской темы «*@UUIU» и маской адреса отправителя «*FMAIL*»
_CheckCondition
Формат передаваемых в функцию параметров:
_CheckCondition (Fh,KeyFld,Condition)
где:
- Fh – дескриптор конверта
- KeyFld – поле конверта, на значение которого накладывается условие
- Condition – маска условия : ключевые символы ‘*’ – все; ‘?’ – любой символ
Схема работы:
Если маска накладывается на значение поля – функция возвращает не 0, иначе — 0
Например: «Это поле конверта» — «Э?о п*е конв?рт*» — возврат 1
_CheckConditioni
то же, что и _CheckCondition, но условие проверяется без учета регистра букв
_SetXUnPackNum
Формат передаваемых в функцию параметров:
_SetXUnPackNum (NumFpk)
где:
- NumFpk – количество ФПК, которое будет распаковано за один вызов функции
_SetXPackerOutTmpDir
Формат передаваемых в функцию параметров:
_SetXPackerOutTmpDir (OutTmpDir)
где:
- OutTmpDir – папка для хранения ФПК, ждущих отчет
- Схема работы:
Если данную функцию не вызывать, то в текущей директории будет создана директория с именем «OutTmpDir\»
_SetFPKPriorityLevel
Формат передаваемых в функцию параметров:
_SetFPKPriorityLevel (PLevel);
где:
- PLevel – уровень приоритета формируемых ФПК
Где:
0 – L (низкий)
1 – N (обычный)
2 – H (высокий)
3 – A (абсолютный)
_SetXUnPackBadDir
Формат передаваемых в функцию параметров:
_SetXPackerBadDir (BadFpkDir)
где:
- BadFpkDir – папка для ФПК, которые функция_UnPack не смогла по какой-либо причине обработать
Примечание:
Если каталог не задан, то эти ФПК просто удаляются.
_SetXUnPackRewriteMode
Формат передаваемых в функцию параметров:
_SetXUnPackRewriteMode (RMode)
где:
- Rmode – режим распаковки файлов с одинаковыми именами:
- 0 – распаковка ФПК, содержащего одноименные файлы, откладывается до следующего вызова _UnPack
- 1 – в распаковываемом одноименном файле изменяется расширение
например: read.me => read.000 (read.001,read.002 и т.д.).
По умолчанию Rmode = 0;
_SetXUnPackMode
Формат передаваемых в функцию параметров:
_SetXUnPackMode (Mode)
где:
- Mode – режим распаковки файлов с длинными именами:
- 0 & Mode – распаковка файла с коротким именем
- 1 & Mode – распаковка файла с длинным именем
- Примечание:
По умолчанию Mode = 0;
_SetXPackerDeliver_UnDeliverDir
Формат передаваемых в функцию параметров:
_SetXPackerDeliver_UnDeliverDir (DeliveredFpkDir, UnDeliveredFpkDir)
где:
- DeliveredFpkDir – папка, в которую будут помещаться ФПК, на которые пришел отчет о доставке.
- UnDeliveredFpkDir – папка, в которую будут помещаться ФПК, на которые пришел отчет с кодом ошибки.
- Примечание:
Если данные папки не проинициализированы – данная категория ФПК уничтожается.
_SetXPackerQUEUEDir
Формат передаваемых в функцию параметров:
_SetXPackerQUEUEDir (QUEUEDir)
где:
- QUEUEDir – входной каталог маршрутизатора FossMail
_SetXPackMaxFSize
Формат передаваемых в функцию параметров:
_SetXPackMaxFSize (MaxFileLen)
где:
- MaxFileLen – суммарная длина файлов (в kB) в ФПК, по достижению которой оставшиеся файлы упаковываются в следующий ФПК.
- Примечание:
По умолчанию – без ограничений.
Размер задается в килобайтах.
_SetXPackMaxFNum
Формат передаваемых в функцию параметров:
_SetXPackMaxFNum (MaxFileNum)
где:
- MaxFileNum – суммарное количество файлов в ФПК, по достижению которого оставшиеся файлы упаковываются в следующий ФПК.
По умолчанию – без ограничений.
_SetXPackLogLevel
Формат передаваемых в функцию параметров:
_SetXPackLogLevel (LogLevel)
где:
- LogLevel – степень отчетности (0 — минимальная)
По умолчанию – LogLevel = 0;
_SetXPackRepType
Формат передаваемых в функцию параметров:
_SetXPackRepType (RepType)
где:
- RepType – тип запрашиваемого отчета для формируемых ФПК.
- 0 – отчет не требуется
- 1 – отчет от маршрутизатора (т.е. о доставке)
- 2 – отчет от программы распаковки (т.е. о прочтении)
- 3 – отчет от маршрутизатора и программы распаковки
По умолчанию RepType = 2
_LoadXPackerDat
Формат передаваемых в функцию параметров:
_LoadXPackerDat (FileNeme)
где:
- FileNeme – имя файла, содержащего информацию по преобразованию NBU => X400
- Примечание:
По умолчанию производится попытка поднять файл Xpacker.dat в текущей директории.
_SetXPackLogDir
- Формат передаваемых в функцию параметров:
_SetXPackLogDir (LogDir)
где:
- LogDir – папка, в которой будет вестись лог-файл
Имя лог-файла формируется по следующему принципу YYMMDDXp
Где
- YY – год
- MM – месяц
- DD – день
По умолчанию – лог-файл не ведется.
_XCheckBreakSignal(int * lpiSignal)
где:
- lpiSignal – код полученного сигнала. NULL – не возвращать код сигнала.
- Возвращаемое значение:
TRUE (не 0) – получен сигнал на прерывание выполнения программы.
FALSE (0) – сигнал на прерывание выполнения программы не приходил.
При выполнении в консольном окне перехватываются следующие сигналы:
- CTRL_C_EVENT
- CTRL_BREAK_EVENT
- CTRL_CLOSE_EVENT
- CTRL_LOGOFF_EVENT
- CTRL_SHUTDOWN_EVENT
Код сигнала возвращается в параметре lpiSignal, если функция вернула код TRUE.
_SetSelfAdr
Формат передаваемых в функцию параметров:
_SetSelfAdr (DL)
где:
- DL – адрес отправителя для формируемых ФПК
_XPackAdd
Формат передаваемых в функцию параметров:
_XPackAdd (Key, Value)
где:
- Key – ключ
- Value – значение.
Добавляет произвольное поле в конверт.
Очищается после каждого вызова _XPack и _Pack.
Формат файла журнала
—— [ START XPACKER FpkAPI(v 4.0.10.0) 29/05/2015 14:54:26] —————- | Запись о запуске программы: Здесь указана версия и текущие дата-время. |
—[ Packed ]———————————-[ 29/05/2015 14:54:26 ]- FPK : G~20150529145426AASRGBWWWGIWGUG 1024 29/05/2015 14:54:26 TYPE: Message FROM: C:UA/ADMD:FMAIL/PRMD:KHARKOV/ORG:FOSS/OU:ПОД-ФИРМА/PN:USER1 TO : C:UA/ADMD:FMAIL/PRMD:KHARKOV/ORG:FOSS/OU:ПОД-ФИРМА/PN:USER2 RT : 3 «deliver & read» Subj: Speed test File: «&&_0.txt» 130 22/05/2015 16:20:26 FPK Name:»N309587.fpk» |
Запись об упаковке ФПК |
—[ Unpacked ]———————————-[ 29/05/2015 14:55:28 ]- FPK : G~20150529145426A0SRGBWWWGIWGUG 1059 29/05/2015 14:54:26 TYPE: Message FROM: C:UA/ADMD:FMAIL/PRMD:KHARKOV/ORG:FOSS/OU:ПОД-ФИРМА/PN:USER1 TO : C:UA/ADMD:FMAIL/PRMD:KHARKOV/ORG:FOSS/OU:ПОД-ФИРМА/PN:USER2 RT : 3 «deliver & read» Subj: Speed test File: «&&_1002.txt» 133 22/05/2015 16:20:28 «In\&&_1002.txt» FPK Name:»G~20150529145426A0SRGBWWWGIWGUGMN_N3094B7.FPK» |
Запись о распаковке ФПК |
—[ Unpacked ]———————————-[ 29/05/2015 14:55:28 ]- FPK : G~20150529145426A1SRGBWWWGIWGUG 0 29/05/2015 14:54:42 TYPE: Report CODE: 0 «delivered» C:UA/ADMD:FMAIL/PRMD:KHARKOV/ORG:FOSS/OU:ПОД-ФИРМА/PN:USER2 29/05/2015 14:54:42 FROM: HOST:FM_TEST TO : C:UA/ADMD:FMAIL/PRMD:KHARKOV/ORG:FOSS/OU:ПОД-ФИРМА/PN:USER1 RT : 1 «deliver» Subj: Speed test FPK Name:»G~20150529145426A1SRGBWWWGIWGUGRR_12m9cOK.rep» |
Запись о распаковке отчета |
—— [ STOP 29/05/2015 15:25:36 ] ——————————— | Запись об остановке программы |
Формат записи об ошибках в файле журнала
Сообщение об ошибочной ситуации всегда (что облегчает поиск в файле) начинается со знака ‘===>’, затем идет текст сообщения.
ERROR ==> Received bad FPK — File.doc
ERROR ==> Code -2
Код | Значение кода |
При упаковке | |
1 | Файл с именем ФПК уже есть |
2 | Не удалось создать файл архива |
3 | Ошибка записи в архив |
4 | Ошибка при открывании пакуемого файла |
5 | Ошибка чтения пакуемого файла |
6 | Ошибка выделения памяти |
14 | Ошибка SHARE-open! Файл архива открыт другой программой |
15 | Ошибка SHARE-open! Пакуемый файл открыт другой программой |
16 | Слишком много открытых файлов |
20 | Ошибка LSEEK |
При распаковке | |
1 | Не найден ФПК |
2 | Сбой чтения ФПК |
3 | Сбой при создании распаковываемого файла |
4 | Ошибка записи файла |
5 | Каталог не найден |
6 | Недостаточно памяти для буфера |
7 | Неизвестная структура архива (ошибочная сигнатура) |
11 | В ФПК не обнаружено CRC |
12 | Ошибка CRC информационной части |
13 | Ошибка CRC конверта |
14 | Ошибка SHARE-open! Файл архива открыт другой программой |
15 | Ошибка SHARE-open! Пакуемый файл открыт другой программой |
16 | Слишком много открытых файлов |
17 | Распаковка прервана: ошибка при конфликте имен (при формировании имени в каталог предыдущего уровня) |
20 | Ошибка LSEEK |
30 | Распаковка прервана |
При копировании | |
1 | Ошибка Open Src-файла |
2 | Ошибка Open Dest-файла |
3 | Ошибка записи Dest-файла |
4 | Ошибка при открывании пакуемого файла |
5 | Ошибка чтения Src-файла |
6 | Ошибка выделения памяти |
14 | Ошибка SHARE-open! Src-файл открыт другой программой |
15 | Ошибка SHARE-open! Dest-файл открыт другой программой |
16 | Слишком много открытых файлов |
20 | Ошибка LSEEK |
При загрузке файла XPACKER.DAT | |
1 | Нет файла |
2 | Недостаточно ОЗУ |
3 | Ошибка в формате Xpacker.Dat |