IDL-описания помещаются в отдельные файлы *.idl
, которые содержат следующие данные:
package <имя пакета>
import <имя пакета>
interface {
<имя интерфейсного метода([параметры])>;
...
}
Каждая сигнатура метода указывается отдельной строкой. Имя метода не может содержать символов подчеркивания _
. Каждый метод в списке имеет уникальное имя. Параметры методов разделяются на входные (in
), выходные (out
) и параметры для передачи сведений об ошибках (error
).
Входные и выходные параметры передаются в IPC-запросах и IPC-ответах соответственно. Error-параметры передаются в IPC-ответах, если сервер не может корректно обработать соответствующие IPC-запросы.
Сервер может информировать клиента об ошибках обработки IPC-запросов как через error-параметры, так и через выходные параметры интерфейсных методов. Если при возникновении ошибки сервер устанавливает флаг ошибки в IPC-ответе, то этот IPC-ответ содержит error-параметры и не содержит выходных параметров. В противном случае этот IPC-ответ содержит выходные параметры так же, как и при корректной обработке запросов. (Для установки флага ошибки в IPC-ответах используется макрос nk_err_reset()
, определенный в заголовочном файле nk/types.h
из состава KasperskyOS SDK.)
Отправка IPC-ответа с установленным флагом ошибки и отправка IPC-ответа со снятым флагом ошибки являются разными видами событий для модуля безопасности Kaspersky Security Module. При описании политики безопасности решения это позволяет удобно разделять обработку событий, которые связаны с корректным и некорректным выполнением IPC-запросов. Если сервер не устанавливает флаг ошибки в IPC-ответах, то для обработки событий, связанных с некорректным выполнением IPC-запросов, модулю безопасности требуется проверять значения выходных параметров, которые сигнализируют об ошибках. (Клиент может проверить состояние флага ошибки в IPC-ответе, даже если соответствующий интерфейсный метод не содержит error-параметров. Для этого клиент использует макрос nk_msg_check_err()
, определенный в заголовочном файле nk/types.h
из состава KasperskyOS SDK.)
Сигнатуры интерфейсных методов не могут импортироваться из других IDL-файлов.
Язык IDL чувствителен к регистру символов.
В IDL-описании могут использоваться однострочные и многострочные комментарии.
В IDL-описании используется как минимум одна опциональная декларация. Если в IDL-описании не использовать ни одной опциональной декларации, то этому описанию будет соответствовать "пустой" пакет, который не задает ни интерфейсных методов, ни типов данных (в том числе из других IDL-описаний).
Некоторые IDL-файлы из состава KasperskyOS SDK не описывают интерфейсные методы, а только содержат определения типов данных. Такие IDL-файлы используются только как экспортеры типов данных.
Если пакет содержит описание интерфейсных методов, то имя интерфейса соответствует имени пакета.
Примеры IDL-файлов
Env.idl
package kl.Env
// Определения типов данных для параметров интерфейсного метода
typedef string<128> Name;
typedef string<256> Arg;
typedef sequence<Arg,256> Args;
// Интерфейс включает один метод.
interface {
Read(in Name name, out Args args, out Args envs);
}
Kpm.idl
package kl.Kpm
// Импорт типов данных для параметров интерфейсных методов
import kl.core.Types
// Определение типа данных для параметров интерфейсных методов
typedef string<64> String;
/* Интерфейс включает несколько методов.
* Часть методов не имеет параметров. */
interface {
Shutdown();
Reboot();
PowerButtonPressedWait();
TerminationSignalWait(in UInt32 entityId, in String entityName);
EntityTerminated(in UInt32 entityId);
Terminate(in UInt32 callingEntityId);
}
MessageBusSubs.idl
package kl.MessageBusSubs
// Импорт типов данных для параметров интерфейсного метода
import kl.MessageBusTypes
/* Интерфейс включает метод, который имеет
* входной и выходные параметры, а также
* error-параметр.*/
interface {
Wait(in ClientId id,
out Message topic,
out BundleId dataId,
error ResultCode result);
}
WaylandTypes.idl
// Пакет содержит только определения типов данных.
package kl.WaylandTypes
typedef UInt32 ClientId;
typedef bytes<8192> Buffer;
typedef string<4096> ConnectionId;
typedef SInt32 SsizeT;
typedef UInt32 SizeT;
typedef SInt32 ShmFd;
typedef SInt32 ShmId;
typedef bytes<16384000> ShmBuffer;
В начало