Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
589 | diamond | 1 | Плагин представляет собой стандартную для Колибри динамическую библиотеку (формата COFF), |
2 | экспортирующую следующие функции и переменные (некоторые функции могут отсутствовать). |
||
3 | Функции могут разрушать любые регистры. kfar гарантирует сброшенный флаг направления DF |
||
4 | при вызове экспортируемых функций и ожидает того же для callback-функций. |
||
5 | |||
6 | int version; |
||
7 | Версия интерфейса kfar, на которую рассчитан плагин. Сейчас должна быть 1. |
||
8 | |||
9 | int __stdcall plugin_load(kfar_info* info); |
||
10 | Вызывается при загрузке плагина. |
||
11 | typedef struct |
||
12 | { |
||
13 | int StructSize; // = sizeof(kfar_info) |
||
14 | int kfar_ver; // 10000h*major + minor |
||
15 | /* Все callback-функции сохраняют все регистры, за исключением eax. */ |
||
16 | /* Функции работы с файлами: */ |
||
17 | void* open; // HANDLE __stdcall open(const char* name, int mode); |
||
18 | // mode - комбинация битовых флагов |
||
19 | // O_READ = 1 - доступ для чтения |
||
20 | // O_WRITE = 2 - доступ для записи |
||
21 | // O_CREATE = 4 - если файл не существует, создать его |
||
22 | // O_TRUNCATE = 8 - усечь файл до нулевой длины |
||
23 | void* read; // unsigned __stdcall read(HANDLE hFile, void* buf, unsigned size); |
||
24 | void* write; // ещё не реализовано |
||
25 | void* seek; // void __stdcall seek(HANDLE hFile, int method, __int64 newpos); |
||
26 | void* flush; // ещё не реализовано |
||
27 | void* filesize; // __int64 __stdcall filesize(HANDLE hFile); |
||
28 | void* close; // void __stdcall close(HANDLE hFile); |
||
29 | /* Функции работы с памятью (постранично): */ |
||
30 | void* pgalloc; // in: ecx=size, out: eax=pointer or NULL |
||
31 | // при нехватке памяти сообщает пользователю и возвращает NULL |
||
32 | void* pgrealloc; // in: edx=pointer, ecx=new size, out: eax=pointer or NULL |
||
33 | // при нехватке памяти сообщает пользователю и возвращает NULL |
||
34 | void* pgfree; // in: ecx=pointer |
||
35 | void* getfreemem; // unsigned __stdcall getfreemem(void); |
||
36 | // возвращает размер свободной оперативной памяти в Кб |
||
37 | void* pgalloc2; // void* __stdcall pgalloc2(unsigned size); |
||
38 | void* pgrealloc2; // void* __stdcall pgrealloc2(void* pointer, unsigned size); |
||
39 | void* pgfree2; // void __stdcall pgfree2(void* pointer); |
||
40 | /* Функции работы с диалогами: */ |
||
41 | void* menu; // int __stdcall menu(void* variants, const char* title, unsigned flags); |
||
42 | // variants указывает на текущий элемент в двусвязном списке |
||
43 | void* menu_centered_in; // int __stdcall menu_centered_in(unsigned left, unsigned top, |
||
44 | // unsigned width, unsigned height, |
||
45 | // void* variants, const char* title, unsigned flags); |
||
46 | void* DialogBox; // int __stdcall DialogBox(DLGDATA* dlg); |
||
47 | void* SayErr; // int __stdcall SayErr(int num_strings, const char** strings, |
||
48 | // int num_buttons, const char** buttons); |
||
49 | void* Message; // int __stdcall Message(const char* title, |
||
50 | // int num_strings, const char** strings, |
||
51 | // int num_buttons, const char** buttons); |
||
52 | // may be x=-1 and/or y=-1 |
||
53 | struct {unsigned width;unsigned height;}* cur_console_size; |
||
54 | } kfar_info; |
||
55 | Возвращаемое значение: |
||
56 | |||
57 | 1 = ошибка инициализации (kfar выдаст сообщение пользователю) |
||
58 | 2 = ошибка инициализации (kfar продолжит без сообщений) |
||
59 | |||
60 | void __stdcall plugin_unload(void); |
||
61 | Вызывается при выгрузке плагина (в процессе завершения работы kfar). |
||
62 | |||
63 | HANDLE __stdcall OpenFilePlugin(HANDLE basefile, const char* name, |
||
64 | const void* attr, const void* data, int datasize); |
||
65 | Открывает плагин, эмулирующий файловую систему на базе файла (например, архива). |
||
66 | basefile - хэндл файла (к которому применимы функции read и seek из kfar_info) |
||
67 | name - имя файла (во временном буфере) |
||
68 | attr - указатель на структуру с атрибутами файла в формате системной функции 70.1 |
||
69 | data - буфер, содержащий данные из начала файла (может использоваться для определения типа файла) |
||
70 | datasize - размер данных в data. В текущей реализации min(1024,размер файла) |
||
71 | Если плагин обрабатывает переданный файл, то он должен вернуть новый описатель, |
||
72 | который в дальнейшем будет использовать kfar для обращения к плагину. В этом случае |
||
73 | плагин должен самостоятельно закрыть basefile функцией close из kfar_info (например, |
||
74 | при закрытии описателя плагина в ClosePlugin или непосредственно в OpenFilePlugin, |
||
75 | если basefile вообще впоследствии не нужен). |
||
76 | Если плагин не обрабатывает переданный файл, должен возвращаться 0. |
||
77 | Если операция прервана пользователем, должно возвращаться значение -1. |
||
78 | |||
79 | void __stdcall ClosePlugin(HANDLE hPlugin); |
||
80 | Закрывает созданный в OpenFilePlugin описатель. |
||
81 | |||
82 | void __stdcall GetOpenPluginInfo(HANDLE hPlugin, OpenPluginInfo* Info); |
||
83 | Получить информацию об открытом экземпляре плагина. |
||
84 | typedef struct |
||
85 | { |
||
86 | unsigned flags; // бит 0: добавлять элемент '..', если он отсутствует |
||
87 | // бит 1: копирование обрабатывается функцией GetFiles |
||
88 | } OpenPluginInfo; |
||
89 | |||
90 | void __stdcall GetPanelTitle(HANDLE hPlugin, char title[1024], |
||
91 | const char* host_file, const char* curdir); |
||
92 | Получить заголовок панели плагина. Параметр host_file совпадает с именем файла, переданным |
||
93 | в OpenFilePlugin. Параметр curdir совпадает с текущей папкой, устанавливаемой в SetFolder. |
||
94 | |||
95 | int __stdcall ReadFolder(HANDLE hPlugin, unsigned dirinfo_start, |
||
96 | unsigned dirinfo_size, void* dirdata); |
||
97 | Читает текущую папку. hPlugin - возвращённый из OpenFilePlugin описатель. |
||
98 | dirinfo_start - с какого файла читать, dirinfo_size - сколько файлов читать. |
||
99 | Возвращаемое значение и возвращаемые в dirdata данные должны соответствовать функции 70.1. |
||
100 | |||
101 | bool __stdcall SetFolder(HANDLE hPlugin, const char* relative_path, const char* absolute_path); |
||
102 | Установить текущую папку. relative_path - относительный путь (".." или имя подпапки), |
||
103 | absolute_path - абсолютный путь (папка эмулируемой плагином файловой системы). |
||
104 | |||
105 | void __stdcall GetFiles(HANDLE hPlugin, int NumItems, void* items[], void* addfile, void* adddir); |
||
106 | bool __stdcall addfile(const char* name, void* bdfe_info, HANDLE hFile); |
||
107 | bool __stdcall adddir(const char* name, void* bdfe_info); |
||
108 | Вызывается для копирования, если во флагах, возвращаемых GetOpenPluginInfo, установлен бит 1. |
||
109 | Эту функцию рекомендуется реализовывать в случае, если стандартный рекурсивный обход папок |
||
110 | неудобен. |
||
111 | hPlugin - описатель, созданный в OpenFilePlugin. |
||
112 | NumItems - число копируемых элементов. |
||
113 | items - массив копируемых элементов, каждый из которых задаётся указателем на структуру BDFE. |
||
114 | Специальный случай NumItems=-1, items=NULL означает "все файлы" (в текущей папке и подпапках). |
||
115 | addfile, adddir - callback-функции kfar'а. Возврат false означает "прервать копирование". |
||
116 | Параметр name должен задавать имя относительно текущей папки. Параметр bdfe_info - |
||
117 | указатель на сокращённую (40 байт) запись в формате функции 70.5. |
||
118 | Открытием и закрытием описателя hFile должен заниматься плагин. Функция addfile будет |
||
119 | вызывать только функцию read. |
||
120 | |||
121 | int __stdcall getattr(HANDLE hPlugin, const char* filename, void* info); |
||
122 | Получить информацию о файле. Возвращаемое значение и данные в info должны соответствовать |
||
123 | функции 70.5. |
||
124 | |||
125 | HANDLE __stdcall open(HANDLE hPlugin, const char* filename, int mode); |
||
126 | Открыть файл filename. Параметр mode зарезервирован и в текущей версии kfar всегда равен 1. |
||
127 | |||
128 | unsigned __stdcall read(HANDLE hFile, void* buf, unsigned size); |
||
129 | Чтение size байт в буфер buf из файла hFile, ранее открытого через open. |
||
130 | kfar гарантирует, что size кратен 512 байт. |
||
131 | Возвращаемое значение: число прочитанных байт, -1 при ошибке. |
||
132 | |||
133 | void __stdcall setpos(HANDLE hFile, __int64 pos); |
||
134 | Установить текущую позицию в файле hFile, ранее открытого через open, в pos. |
||
135 | Гарантируется, что pos кратно 512 байт. |
||
136 | |||
137 | void __stdcall close(HANDLE hFile); |