Упаковщик/розпаковщик повідомлень

Призначення

Функції реалізовані в 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