Rev 589 | Details | Compare with Previous | 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; |
||
631 | diamond | 7 | Версия интерфейса kfar, на которую рассчитан плагин. Сейчас должна быть 2. |
589 | diamond | 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 - усечь файл до нулевой длины |
||
631 | diamond | 23 | void* open2; // HANDLE __stdcall open2(int plugin_id, HANDLE plugin_instance, |
24 | // const char* name, int mode); |
||
25 | // аналогично open, но открывает файл с панели плагина |
||
26 | // open2(0, |
||
589 | diamond | 27 | void* read; // unsigned __stdcall read(HANDLE hFile, void* buf, unsigned size); |
28 | void* write; // ещё не реализовано |
||
29 | void* seek; // void __stdcall seek(HANDLE hFile, int method, __int64 newpos); |
||
631 | diamond | 30 | void* tell; // __int64 __stdcall tell(HANDLE hFile); |
589 | diamond | 31 | void* flush; // ещё не реализовано |
32 | void* filesize; // __int64 __stdcall filesize(HANDLE hFile); |
||
33 | void* close; // void __stdcall close(HANDLE hFile); |
||
34 | /* Функции работы с памятью (постранично): */ |
||
35 | void* pgalloc; // in: ecx=size, out: eax=pointer or NULL |
||
36 | // при нехватке памяти сообщает пользователю и возвращает NULL |
||
37 | void* pgrealloc; // in: edx=pointer, ecx=new size, out: eax=pointer or NULL |
||
38 | // при нехватке памяти сообщает пользователю и возвращает NULL |
||
39 | void* pgfree; // in: ecx=pointer |
||
40 | void* getfreemem; // unsigned __stdcall getfreemem(void); |
||
41 | // возвращает размер свободной оперативной памяти в Кб |
||
42 | void* pgalloc2; // void* __stdcall pgalloc2(unsigned size); |
||
43 | void* pgrealloc2; // void* __stdcall pgrealloc2(void* pointer, unsigned size); |
||
44 | void* pgfree2; // void __stdcall pgfree2(void* pointer); |
||
45 | /* Функции работы с диалогами: */ |
||
46 | void* menu; // int __stdcall menu(void* variants, const char* title, unsigned flags); |
||
47 | // variants указывает на текущий элемент в двусвязном списке |
||
48 | void* menu_centered_in; // int __stdcall menu_centered_in(unsigned left, unsigned top, |
||
49 | // unsigned width, unsigned height, |
||
50 | // void* variants, const char* title, unsigned flags); |
||
51 | void* DialogBox; // int __stdcall DialogBox(DLGDATA* dlg); |
||
52 | void* SayErr; // int __stdcall SayErr(int num_strings, const char** strings, |
||
53 | // int num_buttons, const char** buttons); |
||
54 | void* Message; // int __stdcall Message(const char* title, |
||
55 | // int num_strings, const char** strings, |
||
56 | // int num_buttons, const char** buttons); |
||
57 | // may be x=-1 and/or y=-1 |
||
58 | struct {unsigned width;unsigned height;}* cur_console_size; |
||
59 | } kfar_info; |
||
60 | Возвращаемое значение: |
||
61 | |||
62 | 1 = ошибка инициализации (kfar выдаст сообщение пользователю) |
||
63 | 2 = ошибка инициализации (kfar продолжит без сообщений) |
||
64 | |||
65 | void __stdcall plugin_unload(void); |
||
66 | Вызывается при выгрузке плагина (в процессе завершения работы kfar). |
||
67 | |||
631 | diamond | 68 | HANDLE __stdcall OpenFilePlugin(HANDLE basefile, |
69 | const void* attr, const void* data, int datasize, |
||
70 | int baseplugin_id, HANDLE baseplugin_instance, const char* name); |
||
589 | diamond | 71 | Открывает плагин, эмулирующий файловую систему на базе файла (например, архива). |
631 | diamond | 72 | |
589 | diamond | 73 | basefile - хэндл файла (к которому применимы функции read и seek из kfar_info) |
74 | attr - указатель на структуру с атрибутами файла в формате системной функции 70.1 |
||
75 | data - буфер, содержащий данные из начала файла (может использоваться для определения типа файла) |
||
76 | datasize - размер данных в data. В текущей реализации min(1024,размер файла) |
||
631 | diamond | 77 | baseplugin_id - идентификатор плагина, на панели которого располагается открываемый файл; |
78 | |||
79 | baseplugin_instance - хэндл, возвращённый из функции GetOpenPluginInfo плагина, |
||
80 | определяемого по baseplugin_id |
||
81 | name - имя файла (во временном буфере) (полное имя относительно baseplugin) |
||
82 | |||
589 | diamond | 83 | Если плагин обрабатывает переданный файл, то он должен вернуть новый описатель, |
84 | который в дальнейшем будет использовать kfar для обращения к плагину. В этом случае |
||
85 | плагин должен самостоятельно закрыть basefile функцией close из kfar_info (например, |
||
86 | при закрытии описателя плагина в ClosePlugin или непосредственно в OpenFilePlugin, |
||
87 | если basefile вообще впоследствии не нужен). |
||
88 | Если плагин не обрабатывает переданный файл, должен возвращаться 0. |
||
89 | Если операция прервана пользователем, должно возвращаться значение -1. |
||
90 | |||
91 | void __stdcall ClosePlugin(HANDLE hPlugin); |
||
92 | Закрывает созданный в OpenFilePlugin описатель. |
||
93 | |||
94 | void __stdcall GetOpenPluginInfo(HANDLE hPlugin, OpenPluginInfo* Info); |
||
95 | Получить информацию об открытом экземпляре плагина. |
||
96 | typedef struct |
||
97 | { |
||
98 | unsigned flags; // бит 0: добавлять элемент '..', если он отсутствует |
||
99 | // бит 1: копирование обрабатывается функцией GetFiles |
||
100 | } OpenPluginInfo; |
||
101 | |||
102 | void __stdcall GetPanelTitle(HANDLE hPlugin, char title[1024], |
||
103 | const char* host_file, const char* curdir); |
||
104 | Получить заголовок панели плагина. Параметр host_file совпадает с именем файла, переданным |
||
105 | в OpenFilePlugin. Параметр curdir совпадает с текущей папкой, устанавливаемой в SetFolder. |
||
106 | |||
107 | int __stdcall ReadFolder(HANDLE hPlugin, unsigned dirinfo_start, |
||
108 | unsigned dirinfo_size, void* dirdata); |
||
109 | Читает текущую папку. hPlugin - возвращённый из OpenFilePlugin описатель. |
||
110 | dirinfo_start - с какого файла читать, dirinfo_size - сколько файлов читать. |
||
111 | Возвращаемое значение и возвращаемые в dirdata данные должны соответствовать функции 70.1. |
||
112 | |||
113 | bool __stdcall SetFolder(HANDLE hPlugin, const char* relative_path, const char* absolute_path); |
||
114 | Установить текущую папку. relative_path - относительный путь (".." или имя подпапки), |
||
115 | absolute_path - абсолютный путь (папка эмулируемой плагином файловой системы). |
||
116 | |||
117 | void __stdcall GetFiles(HANDLE hPlugin, int NumItems, void* items[], void* addfile, void* adddir); |
||
118 | bool __stdcall addfile(const char* name, void* bdfe_info, HANDLE hFile); |
||
119 | bool __stdcall adddir(const char* name, void* bdfe_info); |
||
120 | Вызывается для копирования, если во флагах, возвращаемых GetOpenPluginInfo, установлен бит 1. |
||
121 | Эту функцию рекомендуется реализовывать в случае, если стандартный рекурсивный обход папок |
||
122 | неудобен. |
||
123 | hPlugin - описатель, созданный в OpenFilePlugin. |
||
124 | NumItems - число копируемых элементов. |
||
125 | items - массив копируемых элементов, каждый из которых задаётся указателем на структуру BDFE. |
||
126 | Специальный случай NumItems=-1, items=NULL означает "все файлы" (в текущей папке и подпапках). |
||
127 | addfile, adddir - callback-функции kfar'а. Возврат false означает "прервать копирование". |
||
128 | Параметр name должен задавать имя относительно текущей папки. Параметр bdfe_info - |
||
129 | указатель на сокращённую (40 байт) запись в формате функции 70.5. |
||
130 | Открытием и закрытием описателя hFile должен заниматься плагин. Функция addfile будет |
||
131 | вызывать только функцию read. |
||
132 | |||
133 | int __stdcall getattr(HANDLE hPlugin, const char* filename, void* info); |
||
134 | Получить информацию о файле. Возвращаемое значение и данные в info должны соответствовать |
||
135 | функции 70.5. |
||
136 | |||
137 | HANDLE __stdcall open(HANDLE hPlugin, const char* filename, int mode); |
||
138 | Открыть файл filename. Параметр mode зарезервирован и в текущей версии kfar всегда равен 1. |
||
139 | |||
140 | unsigned __stdcall read(HANDLE hFile, void* buf, unsigned size); |
||
141 | Чтение size байт в буфер buf из файла hFile, ранее открытого через open. |
||
142 | kfar гарантирует, что size кратен 512 байт. |
||
143 | Возвращаемое значение: число прочитанных байт, -1 при ошибке. |
||
144 | |||
145 | void __stdcall setpos(HANDLE hFile, __int64 pos); |
||
146 | Установить текущую позицию в файле hFile, ранее открытого через open, в pos. |
||
147 | Гарантируется, что pos кратно 512 байт. |
||
148 | |||
149 | void __stdcall close(HANDLE hFile); |