Упаковщик/распаковщик сообщений

Назначение

Функции реализованы в 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 попадает ФПК с файлами, то

  1. a) ФПК распаковывается в каталог OutDir и удаляется
  2. 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 оператора
  1. == — поле удовлетворяет условию
  2. != — поле не удовлетворяет условию
  3. =~ — поле удовлетворяет условию, условие проверяется без учета регистра
  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

Пример файла скриптов script.bas