Программный интерфейс приложения для плагинов The Bat! общего
назначения (CP API)
Версия:
1.0
Дата:
10 Сентября 2003
Перевод:
18 Сентября 2003, отредактирован 21.09.2003.
Переводчик:
Алексей Виноградов
Внимание: Данный перевод не является
официальным!
1. Общие замечания
Начиная с версии 2 в The Bat! была введена возможность расширения функциональности
за счёт дополнительных подключаемых модулей (плагинов). Данный документ
описывает основные принципы использования подобных модулей, а также то,
какая функциональность может/должна быть в них реализована.
2. Подключаемые модули (плагины)
Подключаемый модуль для The Bat! является 32-разрядной библиотекой динамической
компоновки (DLL). Стандартное расширение файла для плагинов общего назначения
это .TBP (TBP расшифровывается как The Bat Plugin – плагин для The Bat).
Ниже приведён список функций, которые могут быть реализованы в подключаемом
модуле (имена функций чувствительны к регистру):
TBP_Initialize
TBP_Finalize
TBP_GetName
TBP_GetVersion
TBP_GetStatus
TBP_GetInfo
TBP_NeedConfig
TBP_Setup
TBP_SetConfigData
TBP_GetConfigData
TBP_NeedCOM
TBP_GetSpamScore
TBP_FeedSpam
TBP_GetMacroList
TBP_ExecMacro
В минимальной реализации плагина должны быть реализованы следующие функции:
TBP_GetName
TBP_GetStatus
3. Соглашения по программированию
3.1. Модель вызова
Функции плагина должны быть реализованы с использованием стандартной
модели вызова Win32 API, определяемой как WINAPI в языке С и stdcallв
языке Object Pascal
3.2. Безопасность многозадачности
Любая функция плагина может быть вызвана одновременно из разных потоков,
поэтому все функции должны поддерживать многопоточный режим и обеспечивать
надлежащий уровень защиты внутренних данных. Если автор плагина не желает
поддерживать полноценную многозадачность, простейшим выходом в этой ситуации
может быть использование критических секций (EnterCriticalSection в
начале функции и LeaveCriticalSection в конце, убедитесь, что
критическая секция инициализируется в точке входа DLL или в функции TBP_Initialize,
и что код между EnterCriticalSection и LeaveCriticalSection защищён
от исключений)
3.3. Строки, завершающиеся нулевым символом
Если это не оговорено особо, длина строковых буферов НЕ
ДОЛЖНА включать завершающий нулевой символ, а также этот символ НЕ
ДОЛЖЕН добавляться при передаче любых строковых данных от плагинов.
3.4. Контроль «переполнения буфера»
В целях безопасности настоятельно рекомендуется не использовать локальные
массивы переменных и буферы для извлечения данных из объектов, предоставляемых
The Bat! Память под все буферы, передаваемые функциям плагина выделяется
динамически, но всё же настоятельно рекомендуется обратить особое внимание
на проблему «переполнения буфера», чтобы данные программы были в безопасности.
4. Языки программирования
Для создания подключаемых модулей может быть использован любой язык
программирования, который может быть использован для создания модулей
Win32 DLL, удовлетворяющий соглашениям об именах, моделях вызова и многозадачной
безопасности, определяемым в данном документе.
В этом документе находятся определения функций на языках C и Object
Pascal
5. Функции
5.1. Функции общего назначения.
Функции, описанные в этом разделе являются общими для всех типов плагинов.
Они используются для передачи общей информации о плагине и обеспечивают
надлежащий способ инициализации, завершения и конфигурирования плагина.
5.1.1. TBP_Initialize
Синтаксис:
C++:
void WINAPI TBP_Initialize();
Object Pascal:
procedure TBP_Initialize; stdcall;
Описание:
Данная функция вызывается для инициализации плагина. В процессе работы
The Bat! она вызывается лишь однажды, сразу же после загрузки подключаемого
модуля. Используйте TBP_Initialize для инициализации внутренних
данных, необходимых для нормальной работы плагина.
Возвращаемые значения:
Нет. Если во время вызова TBP_Initialize возникает ошибка, критическая
для дальнейшей работы плагина, то функция TBP_GetStatus должна
вернуть код ошибки.
5.1.2. TBP_Finalize
Синтаксис:
C++:
void WINAPI TBP_Finalize();
Object Pascal:
procedure TBP_Finalize; stdcall;
Описание:
Данная функция вызывается один раз, перед тем, как плагин выгружается
из памяти. Используйте TBP_Finalize для освобождения памяти, удаления
временных файлов и т.д.
Возвращаемые значения:
Нет.
5.1.3. TBP_GetName
Синтаксис:
C++
int WINAPI TBP_GetName(char* ABuf, int ABufSize);
Object Pascal:
function TBP_GetName(ABuf: PChar; ABufSize: Integer): Integer;
stdcall;
Описание:
Данная функция вызывается, чтобы получить имя плагина.
Параметры:
ABuf
[out] Указатель на буфер, принимающий строку с именем
плагина. Если ABuf является нулевым указателем, то
функция должна вернуть значение, равное необходимому размеру буфера
в байтах.
ABufSize
[in] Размер строкового буфера, на который указывает ABuf, в
байтах. Если ABufSize отрицательно, функция должна
вернуть значение, равное необходимому размеру буфера в байтах.
Возвращаемые значения:
Положительное число
число байт, записанных в ABuf или необходимый
размер буфера
Нуль или отрицательное число
функция не поддерживается
5.1.4. TBP_GetVersion
Синтаксис:
C++
int WINAPI TBP_GetVersion(char* ABuf, int ABufSize);
Object Pascal:
function TBP_GetVersion(ABuf: PChar; ABufSize: Integer):
Integer; stdcall;
Описание:
Данная функция вызывается, чтобы получить имя версии плагина. Одобряется
возвращать в этой функции любую значимую информацию о текущем состоянии
плагина вдобавок к имени версии.
Параметры:
ABuf
[out] Указатель на буфер, принимающий строку с именем
плагина. Если ABuf является нулевым указателем, то
функция должна вернуть значение, равное необходимому размеру буфера
в байтах.
ABufSize
[in] Размер строкового буфера, на который указывает ABuf, в
байтах. Если ABufSize отрицательно, функция должна
вернуть значение, равное необходимому размеру буфера в байтах.
Возвращаемые значения:
Положительное число
число байт, записанных в ABuf или необходимый размер
буфера
Нуль или отрицательное число
функция не поддерживается
5.1.5. TBP_GetStatus
Синтаксис:
C++
int WINAPI TBP_GetStatus();
Object Pascal:
function TBP_GetStatus: Integer; stdcall;
Описание:
Данная фуркция вызывается, чтобы определить, что плагин функционирует
должным образом.
Возвращаемые значения:
0 (нуль)
Плагин функционирует нормально
Не-нуль
код ошибки (будет зафиксирован в журнале)
5.1.6. TBP_GetInfo
Синтаксис:
C++
int WINAPI TBP_GetInfo(char* ABuf, int ABufSize);
Object Pascal:
function TBP_GetInfo(ABuf: PChar; ABufSize: Integer): Integer;
stdcall;
Описание:
Данная функция вызывается, чтобы получить дополнительную информацию
о плагине. Эта информация будет отображена когда пользователь нажмёт
кнопку «Информация» в окне настройки плагинов.
Замечание: Если текст с информацией начинается
тэгом <HTML>, он будет отображён
как документ HTML.
Параметры:
ABuf
[out] Указатель на строковый буфер, принимающий
строку с информацией о плагине. Если ABuf является
нулевым указателем, то функция должна вернуть значение, равное необходимому
размеру буфера в байтах.
ABufSize
[in] Размер строкового буфера, на который указывает ABuf, в
байтах. Если ABufSize отрицательно, функция должна
вернуть значение, равное необходимому размеру буфера в байтах.
Возвращаемые значения:
Положительное число
число байт, записанных в ABuf или необходимый размер буфера
Нуль или отрицательное число
функция не поддерживается
5.1.7. TBP_NeedConfig
Синтаксис:
C++:
int WINAPI TBP_NeedConfig();
Object Pascal:
function TBP_NeedConfig: Integer; stdcall;
Описание:
Данная функция вызывается, чтобы определить, может ли плагин быть настроен
из The Bat! Пользователь может настроить плагин, нажав на кнопку «Настроить»
в окне настройки плагинов.
Возвращаемые значения:
0 (нуль)
Плагин не может быть настроен из The Bat!
Не-нуль
Плагин может быть настроен из The Bat!
5.1.8. TBP_Setup
Синтаксис:
C++
int WINAPI TBP_Setup();
Object Pascal:
function TBP_Setup: Integer; stdcall;
Описание:
Данная функция может быть вызвана для настройки плагина из окна настройки
The Bat! через нажатие кнопки «Настроить», или сразу же после установки
плагина. TBP_Setup может быть вызвана The Bat! только в том случае,
если TBP_ConfigNeeded вернула нулевой результат. Хэндл вызывающего
окна может быть получен при помощи функции Win32 API GetActiveWindow.
Возвращаемые значения:
0 (нуль)
Плагин был успешно настроен
Не-нуль
Плагин не был настроен, вероятный код ошибки (возможно, в будущем
будет фиксироваться в журнале)
5.1.9. TBP_SetConfigData
Синтаксис:
C++
int WINAPI TBP_SetConfigData(void* ABuf, int ABufSize);
Object Pascal:
function TBP_SetConfigData (const ABuf; ABufSize: Integer):
Integer; stdcall;
Описание:
Данная функция используется для передачи плагину данных о конфигурации
из файла конфигурации плагинов.
Никаких специальных требований к формату конфигурационных данных нет;
они трактуются как двоичные данные и могут содержать любые символы.
Функция TBP_SetConfigData вызывается после загрузки и инициализации
плагина во время запуска программы.
Параметры:
ABuf
[in] Указатель на двоичный буфер, содержащий данные о конфигурации
плагина.
ABufSize
[in] Размер двоичного буфера, на который указывает ABuf, в байтах.
Возвращаемые значения:
0 (нуль)
Функция успешно завершилась
Не-нуль
во время работы функции возник сбой, код ошибки (возможно, в будущем
будет фиксироваться в журнале)
5.1.10. TBP_GetConfigData
Синтаксис:
C++
int WINAPI TBP_GetConfigData(void* ABuf, int ABufSize);
Object Pascal:
function TBP_GetConfigData (var ABuf; ABufSize: Integer):
Integer; stdcall;
Описание:
Данная функция используется для получения данных о конфигурации плагина
после того, как он был настроен при помощи функции TBP_Setup,
с целью соранить эти данные в файле конфигурации плагинов.
Никаких специальных требований к формату конфигурационных данных нет;
они трактуются как двоичные данные и могут содержать любые символы.
Функция TBP_GetConfigData вызывается в том случае, если функция TBP_Setup вернула
нулевое значение.
Параметры:
ABuf
[out] Указатель на двоичный буфер, содержащий данные о конфигурации
плагина. Если ABuf является нулевым указателем, то
функция должна вернуть значение, равное необходимому размеру буфера
в байтах.
ABufSize
[in] Размер двоичного буфера, на который указывает ABuf, в
байтах. Если ABufSize отрицательно, функция должна
вернуть значение, равное необходимому размеру буфера в байтах.
Возвращаемые значения:
Положительное число
число байт, записанных в ABuf или необходимый размер
буфера
Нуль или отрицательное число
функция не поддерживается
5.1.11. TBP_NeedCOM
Синтаксис:
C++
int WINAPI TBP_NeedCOM();
Object Pascal:
function TBP_NeedCOM: Integer; stdcall;
Описание:
Данная функция вызывается, чтобы запросить плагин о необходимости инициализировать
подсистему COM, т.е. о необходимости вызвать функцию CoInitialize перед
использованием функций плагина в потоке.
Если в плагине реализованы функции, работающие с интерфейсом ITBPDataProvider,
значение, возвращаемое этой функцией игнорируется, поскольку COM будет
инициализирован в любом случае.
Возвращаемые значения:
0 (нуль)
Плагин не требует инициализации COM
Не-нуль
Плагин требует инициализации COM
5.2. Анти-спам
Данный раздел содержит информацию об анти-спамовых функциях плагинов.
5.2.1. TBP_GetSpamScore
Синтаксис:
C++
int WINAPI TBP_GetSpamScore(int MsgID, TBPGetDataProc* GetData);
Object Pascal:
function TBP_GetSpamScore(MsgID: Integer; GetData: TBPGetDataProc):
Integer; stdcall;
Описание:
Данная функция вычисляет спамовую оценку письма. Функция TBP_GetSpamScore вызывается
для каждого плагина непосредственно перед сохранением письма в базу писем
после его получения. Общая оценка вычисляется согласно настройкам пользователя. TBP_GetSpamScore должна
возвращать оценку, присвоенную плагином письму, по 100-балльной шкале.
Нулевая оценка означает, что письмо было расценено как легитимное, 100
баллов присваиваются письмам, которые безусловно являются спамом. Если
возвращается отрицательная оценка, The Bat! расценивает это как указание,
что письмо не было обработано плагином, и не учитывает эту оценку пои
подсчёте итоговой оценки для данного письма (например, если установлено
два плагина, и один из них вернул -1 а другой – 80, то средняя оценка
будет 80; если оба вернули -1, средняя оценка будет 0)
Функция TBP_GetSpamScore также может быть использована для любой
предварительной обработки письма (например, для извлечения некоторых
данных из всех входящих писем и сохранения их в базе данных).
Параметры:
MsgID
[in] Идентификатор обрабатываемого письма. MsgID передаётся
как параметр в функцию GetData вместе с идентификатором свойств,
чтобы получить необходимые данные о письме. Этот идентификатор уникален
внутри The Bat! и не может быть более использован после выхода из
функции TBP_GetSpamScore.
GetData
[in] Указатель на функцию TBPGetDataProc, которая используется
для получения данных о письме
Возвращаемые значения:
0-100
Спамовая оценка (по 100-балльной шкале), назначенная плагином письму
Отрицательное число
Письмо не было обработано плагином
5.2.2. TBP_FeedSpam
Синтаксис:
C++
int WINAPI TBP_FeedSpam(int MsgID, int IsSpam, TBPGetDataProc*
GetData);
Object Pascal:
function TBP_FeedSpam(MsgID, IsSpam: Integer; GetData: TBPGetDataProc):
Integer; stdcall;
Описание:
Данная функция может быть реализована в плагине с целью «обучения» его
спамовым и не-спамовым письмам согласно предпочтениям пользователя. Функция TBP_FeedSpam вызывается,
когда пользователь выделяет письма и использует команды “Mark as Junk”
(«Пометить как нежелательное») или “Mark as not Junk” («Пометить как
желательное»).
Реализация функции TBP_FeedSpam не является обязательной и зависит
от алгоритма, используемого для определения спама.
Плагин должен сохранять собранные данные отдельно от конфигурационных
данных, передаваемых функцией TBP_GetConfigData
Параметры:
MsgID
[in] Идентификатор обрабатываемого письма. MsgID передаётся
как параметр в функцию GetData вместе с идентификатором свойств,
чтобы получить необходимые данные о письме. Этот идентификатор уникален
внутри The Bat! и не может быть более использован после выхода из
функции TBP_FeedSpam.
IsSpam
[in] Если параметр IsSpam нулевой, то письмо следует расценивать
как спам, иначе оно является легитимным
GetData
[in] Указатель на функцию TBPGetDataProc, которая используется
для получения данных о письме
Возвращаемые значения:
0 (нуль)
Плагин собрал новую информацию о письме
Не-нуль
Письмо не было обработано, или никакой новой информации не получено
5.2.3. Функция обратного вызова (callback) TBPGetDataProc
Синтаксис:
C++
typedef int (WINAPI *TBPGetDataProc)(int MsgID, int DataID,
char* Buf, int BufSize);
Функция обратного вызова (callback) TBPGetDataProc передаётся
как параметр при вызове функций TBP_GetSpamScore и
TBP_FeedSpam для обеспечения доступа к данным обрабатываемого
письма.
При помощи этой функции возможно получить практически всю необходимую
информацию о письме без необходимости анализировать исходное письмо в
«сыром» виде. Данные, возвращаемые этой функцией могут считаться текстовыми
(хотя некоторые части могут быть закодированы согласно различным стандартам)
Параметры:
MsgID
[in] Идентификатор обрабатываемого письма.
DataID
[in] Идентификатор свойства, которое следует получить. Таблица
возможных свойств приведена в разделе 5.2.4
Buf
[out] Указатель на строковый буфер, принимающий данные элемента,
определяемого DataID; Если Buf является
нулевым указателем, TBPGetDataProc возвращает необходимый
размер буфера.
BufSize
[in] Размер строкового буфера, на который указывает Buf, в
байтах. Если ABufSize отрицательно, TBPGetDataProc возвращает
необходимый размер буфера.
Возвращаемые значения:
0 (нуль) или положительное число
число байт, записанных в буфер, на который указывает параметр Buf или
необходимый размер буфера в байтах
Отрицательное число
функция выдала ошибку или элемент, заданный параметром DataID не
существует
5.2.4. Идентификаторы свойств письма
Нижеследующая таблица описывает определённые в настоящий момент идентификаторы
частей письма
Имя
Значение
Используется для получения…
mpidMessageHeader
100000
Заголовок письма в формате RFC 822
mpidMessageBody
100001
Декодированный текст письма, конвертированный в локальную кодовую
страницу Windows
mpidMessageAttachments
100002
Список вложений, разделённый нулевым символом. Конец списка определён
двойным нулевым символом
mpidMessageSender
100003
Декодированный список отправителей, конвертированный в локальную
кодовую страницу Windows
mpidMessageSubject
100004
Декодированная тема письма, конвертированная в локальную кодовую
страницу Windows
mpidRawMessage
100005
Исходный текст письма без каких-либо преобразований. Это может
быть полезно, если плагин анализирует письма самостоятельно.
Другие идентификаторы, которые могут быть использованы плагином (с понятными
именами и значениями) таковы:
midxSubject
1
midxDate
2
midxComment
3
midxInReplyTo
4
midxMessageID
5
midxNewsgroups
6
midxMailer
7
midxContentType
8
midxContentSubType
9
midxExpireDate
10
midxOrganization
11
midxContentID
12
midxContentMD5
13
midxPriority
14
midxImportance
15
midxContentLocation
16
midxEncoding
17
midxCharset
18
midxBoundary
19
midxMsgEncoding
20
midxC_Name
21
midxCD_Name
22
midxReportType
23
midxReferences
24
midxC_Description
25
midxContentDisposition
26
midxContentLanguage
27
midxC_ID
29
midxC_AccessType
30
midxC_Expiration
31
midxC_Size
32
midxC_Permission
33
midxC_Site
34
midxC_Directory
35
midxC_Mode
36
midxC_Server
37
midxC_Subject
38
midx_Files
39
midx_Msgs
40
midxReturnPath
41
midxFromName
42
midxFromAddr
43
midxReplyName
44
midxReplyAddr
45
midxToName
46
midxToAddr
47
midxServerID
48
midxRRC
49
midxRRQ
50
midxFileSubst
51
midxC_Number
52
midxC_Total
53
midxXCFile
54
midxMDN_To
55
midxMDN_Options
56
midxRefList
57
midxC_MICAlg
58
midxC_SMIMEType
59
midxC_Protocol
60
midxC_ProtocolType
61
midxC_ProtocolSubType
62
midxMatter
63
midxListHelp
64
midxListUnsub
65
midxListSub
66
midxListPost
67
midxListOwner
68
midxListArchive
69
midxDecodedFrom
70
midxDecodedTo
71
midxDecodedSubj
72
midxDecodedToEtc
73
midxFrom
74
midxTo
75
midxCC
76
midxBCC
77
midxReplyTo
78
midxSender
79
midxXSender
80
Примечание: Идентификаторы с именами на «midxC_» используются для получения
значений, соответствующих RFC параметрам Content-Type (тип содержимого)
5.3. Пользовательские макросы
Данный раздел содержит описания функций, позволяющих добавить новые
макросы в существующий набор макросов шаблонов (найти полный список встроенных
макросов можно в справке The Bat!)
5.3.1. TBP_GetMacroList
Синтаксис:
C++
int WINAPI TBP_GetMacroList(char* ABuf, int ABufSize);
Object Pascal:
function TBP_GetMacroList(ABuf: PChar; ABufSize: Integer):
Integer; stdcall;
Описание:
Данная функция вызывается с целью получить разделённый символами переноса
строки (CR LF или “\n\r”) список макросов, реализованных в плагине.
Этот список используется Шаблонным Процессором The Bat! для нахождения
плагинов, реализующих неизвестные макросы. Учтите, что плагины не могут
перезаписывать какие-либо встроенные макросы, поэтому перед именованием
макроса обязательно следует убедиться, что имена новых макросов не конфликтуют
со встроенными.
Имя макроса может состоять из любого количества символов; множество
допустимых знаков ограничено Латинскими буквами и десятичными цифрами.
Регистр в именах значения не имеет.
Параметры:
ABuf
[out] Указатель на строковый буфер, принимающий строку, содержащую список
макросов, реализованных в плагине, разделённый парами CR LF (\n\r). Если ABuf является
нулевым указателем, то функция должна вернуть значение, равное необходимому
размеру буфера в байтах.
ABufSize
[in] Размер строкового буфера, на который указывает ABuf, в
байтах. Если ABufSize отрицательно, функция должна вернуть
значение, равное необходимому размеру буфера в байтах.
Возвращаемые значения:
Положительное число
число байт, записанных в буфер ABuf или необходимый размер буфера
Нуль или отрицательное число
функция не поддерживается
5.3.2. TBP_ExecMacro
Синтаксис:
C++
int WINAPI TBP_ExecMacro(char* AMacro, int MaxLen, ITBPDataProvider*
Template, ITBPDataProvider* Params): Integer; stdcall;
Object Pascal:
function TBP_ExecMacro(AMacro: PChar; MaxLen: Integer; Template,
Params: ITBPDataProvider): Integer; stdcall;
Описание:
Данная функция вызывается каждый раз, когда Шаблонный Процессор выполняет
макрос, зарегистрированный плагином. Плагин должен выполнить макрос согласно
собственным правилам и вернуть либо индекс объекта Шаблона, в котором
следует заменить текст, либо отрицательное число, в случае, если макрос
заменён пустой строкой.
Параметры:
AMacro
[in] Указатель на строковый буфер, содержащий строку, заканчивающуюся
нулевым символом и содержащую имя макроса, который следует выполнить.
MaxLen
[in] Максимальная длина имени макроса, находящегося в AMacro.
Template
[in] Указатель на объект Шаблонного Процессора; раздел 5.3.3 содержит
список допустимых идентификаторов, которые могут быть использованы для
задания и получения информации. Метод Template.ExecuteMacro может
быть использован для вычисления простых шаблонов (это может быть особенно
полезным для получения информации из адресной книги при помощи макросов
%ABnnnPPP, использования регулярных выражений, задания значений пользовательских
полей в заголовках письма), объект OutData применяется для возвращения
результата выполнения шаблона, индекс данных результата равен 0.
Params
[in] Указатель на объект списка параметров. Метод Params.ItemCount возвращает
число параметров, переданных в макрос. Для получения значения параметров
следует вызвать Params.GetDataByID(Index,…),
где параметр Index задаёт индекс параметра, начиная с нуля. Обратите
внимание, что параметры, передаваемые в макрос сами по себе являются
шаблонами; они вычисляются один раз и только в том случае, если запрашиваются
через метод Params.GetDataByID.
Возвращаемые значения:
0 (нуль) или допустимое значение
Индекс в объекте
Template, куда следует поместить результирующую строку
Отрицательное значение
Макрос был выполнен,
но должен быть заменён пустой строкой
5.3.3. Индекс объектов шаблона
Ниже приведён список индексов, которые могут быть использованы для задания
и получения информации для параметра-объекта Template, передаваемого
в функцию TBP_ExecMacro. Назначение индексов должно быть понятно
из их имён.
Строковые индексы (строковые данные доступны через методы ITBPDataProvider::GetDataByID и ITBPDataProvider::SetDataByID):
tpxQuotePrefix
200 // Текущий префикс цитирования в
том виде, как он отображается в тексте
tpxCharset
211
tpxAccount
214
tpxFrom
215
tpxReplyTo
216
tpxReturnPath
217
tpxTo
218
tpxCC
219
tpxBCC
220
tpxOrg
221
tpxSubject
222
tpxFullSubject
223
tpxComment
224
tpxOldTo
225
tpxOldFrom
226
tpxOldReplyTo
227
tpxOldCC
228
tpxOldBCC
229
tpxOldSubject
230
tpxOldComment
231
tpxMatter
232
tpxOldMatter
233
tpxMsgID
234
tpxOldMsgID
235
tpxOldDate
236
tpxOldRcvDate
237
tpxOldReturn
238
tpxOldOrg
239
tpxOldText
240
tpxText
241 // Текст изначального сообщения (выделенная
часть, если вызвана команда «Ответить с цитированием выделенного текста»)
tpxHeaders
243
tpxAttachments
244
tpxOldAttachments
245
tpxOldCharset
247
tpxTracking
248 // Номер для отслеживания письма
tpxQuoteStyle
249 // Заданный стиль цитирования, пустая
строка
tpxRegExpPattern
251
tpxRegExpText
252
tpxFullText
254 // Полный текст изначального сообщения
tpxLastAddress
257
tpxCursorHeader
261
Целочисленные и булевые индексы (целочисленные данные доступны через
методы ITBPDataProvider::GetIntValue и ITBPDataProvider::SetIntValue).
Для булевых данных нулевое значение означает «Ложь», любое ненулевое
означает «Истина».
Индекс
ID
Тип
Значение
tpxWrapJustify
201
Булевое
Если «истина», все последовательные вызовы макроса %Wrapped выдадут
перенесённый текст, выровненный по правому и левому краю
tpxClear
202
Булевое
Если «истина», текст, созданный шаблоном, полностью заменит текст
в редакторе письма
tpxIsSignature
203
Булевое
Если «истина», текст, созданный шаблоном, заменит текущую подпись
в редакторе письма
tpxSignComplete
204
Целое
< 0 Не подписывать письмо по завершении
=0 Использовать настройки подписывания по умолчанию
> 0 Подписать письмо по завершении
tpxEncryptComplete
205
Целое
< 0 Не зашифровывать письмо по завершении
=0 Использовать настройки по умолчанию
> 0 Зашифровать письмо по завершении
tpxUseSMIME
206
Целое
< 0 Не использовать S/MIME
=0 Использовать настройки по умолчанию
> 0 Использовать S/MIME
tpxUsePGP
207
Целое
< 0 Не использовать OpenPGP
=0 Использовать настройки по умолчанию
> 0 Использовать OpenPGP
tpxRCR
208
Целое
< 0 Не требовать подтверждения доставки
=0 Использовать настройки по умолчанию
> 0 Запросить подтверждения доставки
tpxRRQ
209
Целое
< 0 Не требовать подтверждения прочтения
=0 Использовать настройки по умолчнаию
> 0 Запросить подтверждение о прочтении
tpxSplit
210
Целое
< 0 Не разделять длинное письмо
=0 Использовать настройки по умолчанию
> 0 Разделять длинное письмо
tpxPriority
212
Целое
< 0 Письмо имеет низкий приоритет
=0 Письмо имеет обычный приоритет
> 0 Письмо имеет высокий приоритет
tpxTotalPages
262
Целое
(Только на печатаемых колонтитулах) Общее число страниц
tpxCurrentPage
263
Целое
(Только на печатаемых колонтитулах) Текущий номер страницы
tpxFullTextDifferent
259
Булевое
«истина», если данные, получаемые по идентификаторам tpxText и
tpxFullText различны, иначе «ложь».
tpxCursorBody
260
Целое
1 – курсор должен быть установлен в теле сообщения
100 – курсор был установлен, но не в теле
Замечатие по поводу использования метода ITBPDataProvider::SetDataByID: постарайтесь,
насколько это возможно, использовать метод ITBPDataProvider::ExecuteMacro для
установки стандартных свойств шаблона.
6. Универсальный интерфейс обмена данными ITBPDataProvider
ITBPDataProvider является универсальным интерфейсом для обмена
данными и командами между The Bat! и плагинами. Этот интерфейс поддерживается
всеми объектами The Bat!, которые доступны либо будут доступны плагинам
для упрощения (и тем самым повышения надёжности) связи с плагинами.
Синтаксис:
C++:
interface DECLSPEC_UUID("9DD91B89-A551-4180-8A81-2CCF584CD4BF")
ITBPDataProvider : public IUnknown
{
virtual int WINAPI GetDataByID(int ID, char* ABuf, int ABufSize)
= 0;
virtual int WINAPI SetDataByID(int ID, char* ABuf, int ABufSize)
= 0;
virtual int WINAPI GetIntValue(int ID) = 0;
virtual int WINAPI SetIntValue(int ID, int Value) = 0;
virtual int WINAPI GetIDType(int ID) = 0;
virtual int WINAPI ItemCount() = 0;
virtual HRESULT WINAPI ExecuteMacro(char* AMacro, int MaxLen,
ITBPDataProvider* InData, ITBPDataProvider* OutData) = 0;
}
Object Pascal:
ITBPDataProvider = interface ['{9DD91B89-A551-4180-8A81-2CCF584CD4BF}']
function GetDataByID(ID: Integer; ABuf: PChar; ABufSize: Integer):
Integer; stdcall;
function SetDataByID(ID: Integer; ABuf: PChar; ABufSize: Integer):
Integer; stdcall;
function GetIntValue(ID: Integer): Integer; stdcall;
function SetIntValue(ID, Value: Integer): Integer; stdcall;
function GetIDType(ID: Integer): Integer; stdcall;
function ItemCount: Integer; stdcall;
function ExecuteMacro(AMacro: Pointer; MaxLen: Integer; InData,
OutData: ITBPDataProvider): HResult; stdcall;
end;
6.1. ITBPDataProvider::GetDataByID
Синтаксис:
C++:
virtual int WINAPI GetDataByID(int ID, char* ABuf, int ABufSize);
Object Pascal:
function GetDataByID(ID: Integer; ABuf: PChar; ABufSize:
Integer): Integer; stdcall;
Описание:
Данная функция предназначена для получения данных от объекта. Каждое
читаемое свойство объекта должно быть по крайней мере доступным для чтения
при помощи этой функции. Формат получаемых данных определяется типом,
возвращаемым методом GetIDType и описанным в разделе 6.5
Параметры:
ID
[in] Идентификатор запрашиваемого свойства.
ABuf
[out] Указатель на строковый буфер, содержащий полученные данные. Если ABuf является
нулевым указателем, то функция должна вернуть значение, равное необходимому
размеру буфера в байтах.
ABufSize
[in] Размер строкового буфера, на который указывает ABuf, в
байтах. Если ABufSize отрицательно, функция должна вернуть
значение, равное необходимому размеру буфера в байтах.
Возвращаемые значения:
Нуль или положительное число:
число байт, записанных в ABuf или
необходимый размер буфера
Отрицательное число:
функция не поддерживается
6.2. ITBPDataProvider::SetDataByID
Синтаксис:
C++:
virtual int WINAPI SetDataByID(int ID, char* ABuf, int ABufSize);
Object Pascal:
function SetDataByID(ID: Integer; ABuf: PChar; ABufSize:
Integer): Integer; stdcall;
Описание:
Данная функция предназначена для назначения данных свойствам объекта.
Формат данных, которые могут быть сохранены в свойствах, определяется
типом, возвращаемым методом GetIDType
Примечание: некоторые объекты могут предоставлять к своим свойствам
доступ только для чтения
Параметры:
ID
[in] Идентификатор свойства для изменения
ABuf
[in] Указатель на буфер памяти, содержащий данные для свойства.
ABufSize
[in] Размер буфера, на который указывает ABuf, в байтах
Возвращаемые значения:
Нуль или положительное число
число байт, записанное
в целевое свойство
Отрицательное значение
функция не поддерживается
6.3. ITBPDataProvider::GetIntValue
Синтаксис:
C++:
virtual int WINAPI GetIntValue(int ID);
Object Pascal:
function GetIntValue(ID: Integer): Integer; stdcall;
Описание:
Данная функция возвращает целочисленное значение свойства. Даже в том
случае, если свойство не является численным, предполагается, что реализация
постарается преобразовать необходимые данные в числовой формат. Например,
если строковое свойство содержит ‘1001’, результат выполнения GetIntValue с
ID-значением этого свойства должен быть 1001. Булевые данные должны быть
преобразованы в целочисленные значения согласно общепринятым соглашениям
(0 (нуль) означает Ложь, любое не нулевое значение означает Истину)
Параметры:
ID
[in] Идентификатор запрашиваемого свойства.
Возвращаемые значения:
Функция всегда должна возвращать значение, соответствующее запрошенному
индексу (ID) свойства. Для несуществующих свойств должен возвращаться
0 (нуль)
6.4. ITBPDataProvider::SetIntValue
Синтаксис:
C++:
virtual int WINAPI SetIntValue(int ID, int Value);
Object Pascal:
function SetIntValue(ID, Value: Integer): Integer; stdcall;
Описание:
Данная функция предназначена для присваивания 32-битных целочисленных
значений заданному свойству объекта.
Примечание: некоторые объекты могут предоставлять к своим свойствам
доступ только для чтения
Параметры:
ID
[in] Идентификатор изменяемого свойства.
Value
[in] 32-битное целочисленное значение для присваивания его заданному
свойству.
Возвращаемые значения:
0 (нуль)
Целочисленное свойство было успешно задано.
Любое другое
Объект не может изменить заданное свойство.
6.5. ITBPDataProvider::GetIDType
Синтаксис:
C++:
virtual int WINAPI GetIDType(int ID);
Object Pascal:
function GetIDType(ID: Integer): Integer; stdcall;
Описание:
Данная функция возвращает идентификатор типа для свойства, заданного
параметром ID;
Параметры:
ID
[in] Идентификатор целевого свойства
Возвращаемые значения:
Идентификатор типа свойства
Ниже приведён список определённых в настоящий момент типов идентификаторов:
Имя
Значение
Описание
GetDataByID / SetDataByID Преобразование
dtcChar
0
Строковые данные
Как есть
dtcInt
1
32-битное целое
Текстовое представление числа
dtcInt64
2
64-битное целое
Текстовое представление числа
dtcWChar
3
Текст в формате UNICODE
Текст, конвертированный в локальную страницу кодировки
dtcBool
5
Булевское
‘0’ для «Ложь», ‘1’ для «Истина»
dtcBinary
6
Двоичные данные
Текстовые данные, кодированные в Base64
dtcFloat
7
Вещественное число
Текстовое представление числа
Отрицательное значение Свойство ещё
не определено
6.6. ITBPDataProvider::ItemCount
Синтаксис:
C++:
virtual int WINAPI ItemCount();
Object Pascal:
function ItemCount: Integer; stdcall;
Описание:
Данная функция возвращает число сохранённых свойств для объекта-списка
(такого, как параметр Params в функции TBP_ExecMacro)
function ExecuteMacro(AMacro: PChar; MaxLen: Integer; InData,
OutData: ITBPDataProvider): HResult; stdcall;
Описание:
Данная функция предназначена для обеспечения удобного расширенного доступа
к возможностям, предоставляемым объектом. Каждый объект, реализующий
интерфейс ITBPDataProvider может включать собственный набор макросов,
документированных именно для этого объекта.
Ниже приведён список объектов с документированным поведением метода
ExecuteMacro:
Объект
Где документирован
Объекты Шаблонного Процессора
Раздел.5.3.2
Параметры:
AMacro
[in] Указатель на строковый буфер, содержащий строку, завершающуюся
нулевым символом и содержащую текст макроса, который нужно выполнить.
MaxLen
[in] Максимальная длина текста макроса, находящегося в AMacro.
InData
[in] Указатель на объект ITBPDataProvider, содержащий входные
данные для выполнения макроса, если требуется. Индексы свойств и их значения
должны быть документированы для каждой реализации. В большинстве случаев, InData представляет
собой нумерованный список параметров.
OutData
[out] Указатель на объект ITBPDataProvider, содержащий результат
выполнения макроса, если требуется. Индексы свойств и их значения должны
быть документированы для каждой реализации.
В большинстве случаев, свойство с нулевым индексом содержит результат
выполнения макроса.
Возвращаемые значения:
Должны быть отдельно документированы для каждой реализации.