View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0002206 | Far Manager | Macro | public | 2012-11-22 19:08 | 2012-11-27 10:55 |
Reporter | DAtaMan | Assigned To | shmuel | ||
Priority | normal | Severity | minor | Reproducibility | N/A |
Status | closed | Resolution | fixed | ||
Product Version | 3.0 | ||||
Fixed in Version | 3.0 | ||||
Summary | 0002206: Соответствие структуры таблицы FindData со структурой PluginPanelItem | ||||
Description | Хотелось бы, чтобы были добавлены все отсутствующие поля. | ||||
Tags | No tags attached. | ||||
Build | 2971 | ||||
|
Эти же структуры не сами по себе, они заполняются функциями в соответствии с Far API. Если API предоставляет FindData, то где взять недостающие поля? Приведите практический пример: в какой функции нужны эти поля. |
|
FindData.diff (2,942 bytes)
Index: plugins/luamacro/luafar/service.c =================================================================== --- plugins/luamacro/luafar/service.c (revision 9015) +++ plugins/luamacro/luafar/service.c (working copy) @@ -395,16 +395,21 @@ { PutAttrToTable(L, (int)PanelItem->FileAttributes); PutNumToTable(L, "FileSize", (double)PanelItem->FileSize); + PutNumToTable(L, "AllocationSize", (double)PanelItem->AllocationSize); PutFileTimeToTable(L, "LastWriteTime", PanelItem->LastWriteTime); PutFileTimeToTable(L, "LastAccessTime", PanelItem->LastAccessTime); PutFileTimeToTable(L, "CreationTime", PanelItem->CreationTime); + PutFileTimeToTable(L, "ChangeTime", PanelItem->ChangeTime); + PutNumToTable(L, "NumberOfLinks", (double)PanelItem->NumberOfLinks); + PutNumToTable(L, "CRC32", (double)PanelItem->CRC32); PutWStrToTable(L, "FileName", PanelItem->FileName, -1); PutWStrToTable(L, "AlternateFileName", PanelItem->AlternateFileName, -1); - PutNumToTable(L, "AllocationSize", (double)PanelItem->AllocationSize); + PutWStrToTable(L, "Description", PanelItem->Description, -1); + PutWStrToTable(L, "Owner", PanelItem->Owner, -1); } // on entry : the table's on the stack top -// on exit : 2 strings added to the stack top (don't pop them!) +// on exit : 4 strings added to the stack top (don't pop them!) static void GetFarFindData(lua_State *L, struct PluginPanelItem *PanelItem) { //memset(PanelItem, 0, sizeof(*PanelItem)); //TODO @@ -414,10 +419,17 @@ PanelItem->LastWriteTime = GetFileTimeFromTable(L, "LastWriteTime"); PanelItem->LastAccessTime = GetFileTimeFromTable(L, "LastAccessTime"); PanelItem->CreationTime = GetFileTimeFromTable(L, "CreationTime"); + PanelItem->ChangeTime = GetFileTimeFromTable(L, "ChangeTime"); + PanelItem->NumberOfLinks = GetFileSizeFromTable(L, "NumberOfLinks"); + PanelItem->CRC32 = GetFileSizeFromTable(L, "CRC32"); lua_getfield(L, -1, "FileName"); // +1 PanelItem->FileName = opt_utf8_string(L, -1, L""); // +1 lua_getfield(L, -2, "AlternateFileName"); // +2 PanelItem->AlternateFileName = opt_utf8_string(L, -1, L""); // +2 + lua_getfield(L, -3, "Description"); // +3 + PanelItem->Description = opt_utf8_string(L, -1, L""); // +3 + lua_getfield(L, -4, "Owner"); // +4 + PanelItem->Owner = opt_utf8_string(L, -1, L""); // +4 } //--------------------------------------------------------------------------- @@ -4529,9 +4541,9 @@ struct PluginPanelItem ffd; PSInfo *Info = GetPluginData(L)->Info; HANDLE h = CheckValidFileFilter(L, 1); - luaL_checktype(L, 2, LUA_TTABLE); - lua_settop(L, 2); // +2 - GetFarFindData(L, &ffd); // +4 + luaL_checktype(L, 4, LUA_TTABLE); + lua_settop(L, 4); // +4 + GetFarFindData(L, &ffd); // +6 lua_pushboolean(L, Info->FileFilterControl(h, FFCTL_ISFILEINFILTER, 0, &ffd) != 0); return 1; } |
|
>в какой функции нужны эти поля В far.RecursiveSearch, для получения списка файлов со всей доступной информацией по ним. Если ничего не напутал, то примерный патч приложил. |
|
Теперь понятно, спасибо. Сегодня-завтра поправлю. |
|
В api FindData нет давно, лучше переименовать для единообразия. |
|
Мда, стало понятно, что проще всего можно добавить только ChangeTime. |
|
Сделал соответствие, проверяйте. Проверять желательно на билде не ниже 2971, иначе возможны падения. |
|
Спасибо. Пока потестировал только far.RecursiveSearch, т.к. как работать с панелями, пока не изучал. Имеется тестовая папка с одним файлом "changelog" и макрос: local function printObj(o) if type(o) == "number" then print(o) elseif type(o) == "string" then print(string.format("%q", o)) elseif type(o) == "table" then print("{\n") for k,v in pairs(o) do print("["); printObj(k); print("] = ") printObj(v) print(",\n") end print("}\n") else print("cannot print a " .. type(o)) end end FileList={} far.RecursiveSearch(APanel.Path, '*', function(Item, FullPath) table.insert(FileList, {FullPath, Item}) return false end, "FRS_RECUR") printObj(FileList) ------------------------------------------------------------------------- Запускаем в редакторе и... { [1] = { [1] = "D:\\Test\\changelog", [2] = { ["ChangeTime"] = 12998141845506, ["LastAccessTime"] = 12998152643315, ["FileName"] = "changelog", ["FileAttributes"] = "a", ["FileSize"] = 638078, ["CRC32"] = 0, ["AlternateFileName"] = "CHANGE~1", ["NumberOfLinks"] = 0, ["Flags"] = 0, ["CreationTime"] = 12998152643315, ["LastWriteTime"] = 12998141845484, ["AllocationSize"] = 638976, } , } , } ------------------------------------------------------------------------- То есть, касательно far.RecursiveSearch некоторые поля лишние, т.к. не заполняются Far'ом. И попутно предложение: поменять тип FileAttributes на числовой. Это и на производительности положительно скажется, если в папке куча файлов. |
|
Если поле не заполняется Фаром, значит оно и не нужно (т.е. скорее всего не имеет смысла в данном контексте). Так что проблемы в этом не вижу. Кроме того, LuaFAR не играет в этом никакой роли: те же незаполненные поля увидят и плагины "на Си". (До билда 2971 в них вообще был мусор). Насчёт FileAttributes предложение не принимается: ухудшится наглядность кода, поломаются существующие скрипты. Что касается улучшения производительности - это только кажется. (Предполагаю, что общее время исполнения far.RecursiveSearch в папке с большим количеством файлов может уменьшиться примерно на 0.1%). |
|
>Если поле не заполняется Фаром, значит оно и не нужно Так и я о том же: может незаполненные поля исключить? |
|
> может незаполненные поля исключить? Пусть будут. Плагины на Си ведь видят эти поля, и ничего. A LuaFAR в большинстве случаев просто передаёт то, что пришло от Фара, в Lua-скрипт. В любом случае, плагинописатель/макрописатель должен знать, что он делает. |
Date Modified | Username | Field | Change |
---|---|---|---|
2012-11-22 19:08 | DAtaMan | New Issue | |
2012-11-22 20:47 | shmuel | Note Added: 0009751 | |
2012-11-22 20:53 | shmuel | Note Edited: 0009751 | |
2012-11-22 20:55 | DAtaMan | File Added: FindData.diff | |
2012-11-22 20:55 | DAtaMan | Note Added: 0009752 | |
2012-11-22 21:05 | shmuel | Note Added: 0009753 | |
2012-11-22 21:12 | DrKnS | Note Added: 0009754 | |
2012-11-23 08:27 | DAtaMan | Note Added: 0009755 | |
2012-11-23 10:48 | shmuel | Note Added: 0009756 | |
2012-11-23 10:48 | shmuel | Assigned To | => shmuel |
2012-11-23 10:48 | shmuel | Status | new => feedback |
2012-11-23 14:21 | DAtaMan | Note Added: 0009757 | |
2012-11-23 14:21 | DAtaMan | Status | feedback => assigned |
2012-11-23 15:03 | shmuel | Note Added: 0009758 | |
2012-11-24 06:35 | shmuel | Status | assigned => feedback |
2012-11-27 10:27 | DAtaMan | Note Added: 0009766 | |
2012-11-27 10:27 | DAtaMan | Status | feedback => assigned |
2012-11-27 10:27 | DAtaMan | Status | assigned => resolved |
2012-11-27 10:54 | shmuel | Note Added: 0009767 | |
2012-11-27 10:55 | shmuel | Build | => 2971 |
2012-11-27 10:55 | shmuel | Status | resolved => closed |
2012-11-27 10:55 | shmuel | Resolution | open => fixed |
2012-11-27 10:55 | shmuel | Fixed in Version | => 3.0 |