View Issue Details

IDProjectCategoryView StatusLast Update
0002206Far ManagerMacropublic2012-11-27 14:55
ReporterDAtaManAssigned Toshmuel 
PrioritynormalSeverityminorReproducibilityN/A
Status closedResolutionfixed 
Product Version3.0 
Target VersionFixed in Version3.0 
Summary0002206: Соответствие структуры таблицы FindData со структурой PluginPanelItem
DescriptionХотелось бы, чтобы были добавлены все отсутствующие поля.
TagsNo tags attached.
Build2971

Activities

shmuel

2012-11-23 00:47

developer   bugnote:0009751

Last edited: 2012-11-23 00:53

View 2 revisions

Эти же структуры не сами по себе, они заполняются функциями в соответствии с Far API. Если API предоставляет FindData, то где взять недостающие поля? Приведите практический пример: в какой функции нужны эти поля.

DAtaMan

2012-11-23 00:55

reporter  

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;
 }
FindData.diff (2,942 bytes)

DAtaMan

2012-11-23 00:55

reporter   bugnote:0009752

>в какой функции нужны эти поля
В far.RecursiveSearch, для получения списка файлов со всей доступной информацией по ним.

Если ничего не напутал, то примерный патч приложил.

shmuel

2012-11-23 01:05

developer   bugnote:0009753

Теперь понятно, спасибо. Сегодня-завтра поправлю.

DrKnS

2012-11-23 01:12

administrator   bugnote:0009754

В api FindData нет давно, лучше переименовать для единообразия.

DAtaMan

2012-11-23 12:27

reporter   bugnote:0009755

Мда, стало понятно, что проще всего можно добавить только ChangeTime.

shmuel

2012-11-23 14:48

developer   bugnote:0009756

Сделал соответствие, проверяйте. Проверять желательно на билде не ниже 2971, иначе возможны падения.

DAtaMan

2012-11-23 18:21

reporter   bugnote:0009757

Спасибо.
Пока потестировал только 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 на числовой.
Это и на производительности положительно скажется, если в папке куча файлов.

shmuel

2012-11-23 19:03

developer   bugnote:0009758

Если поле не заполняется Фаром, значит оно и не нужно (т.е. скорее всего не имеет смысла в данном контексте). Так что проблемы в этом не вижу. Кроме того, LuaFAR не играет в этом никакой роли: те же незаполненные поля увидят и плагины "на Си". (До билда 2971 в них вообще был мусор).

Насчёт FileAttributes предложение не принимается: ухудшится наглядность кода, поломаются существующие скрипты. Что касается улучшения производительности - это только кажется. (Предполагаю, что общее время исполнения far.RecursiveSearch в папке с большим количеством файлов может уменьшиться примерно на 0.1%).

DAtaMan

2012-11-27 14:27

reporter   bugnote:0009766

>Если поле не заполняется Фаром, значит оно и не нужно

Так и я о том же: может незаполненные поля исключить?

shmuel

2012-11-27 14:54

developer   bugnote:0009767

> может незаполненные поля исключить?

Пусть будут. Плагины на Си ведь видят эти поля, и ничего. A LuaFAR в большинстве случаев просто передаёт то, что пришло от Фара, в Lua-скрипт. В любом случае, плагинописатель/макрописатель должен знать, что он делает.

Issue History

Date Modified Username Field Change
2012-11-22 23:08 DAtaMan New Issue
2012-11-23 00:47 shmuel Note Added: 0009751
2012-11-23 00:53 shmuel Note Edited: 0009751 View Revisions
2012-11-23 00:55 DAtaMan File Added: FindData.diff
2012-11-23 00:55 DAtaMan Note Added: 0009752
2012-11-23 01:05 shmuel Note Added: 0009753
2012-11-23 01:12 DrKnS Note Added: 0009754
2012-11-23 12:27 DAtaMan Note Added: 0009755
2012-11-23 14:48 shmuel Note Added: 0009756
2012-11-23 14:48 shmuel Assigned To => shmuel
2012-11-23 14:48 shmuel Status new => feedback
2012-11-23 18:21 DAtaMan Note Added: 0009757
2012-11-23 18:21 DAtaMan Status feedback => assigned
2012-11-23 19:03 shmuel Note Added: 0009758
2012-11-24 10:35 shmuel Status assigned => feedback
2012-11-27 14:27 DAtaMan Note Added: 0009766
2012-11-27 14:27 DAtaMan Status feedback => assigned
2012-11-27 14:27 DAtaMan Status assigned => resolved
2012-11-27 14:54 shmuel Note Added: 0009767
2012-11-27 14:55 shmuel Build => 2971
2012-11-27 14:55 shmuel Status resolved => closed
2012-11-27 14:55 shmuel Resolution open => fixed
2012-11-27 14:55 shmuel Fixed in Version => 3.0