SetDirectoryInfo::UserData

Разработка Far.
User avatar
Skirda
Posts: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 1 time

SetDirectoryInfo::UserData

Post by Skirda » Wed 12 Dec, 2012 09:45

В Писании относительно SetDirectoryInfo::UserData читаем:
UserData
Это поле аналогично значению PluginPanelItem.UserData.Data и может быть использовано плагином для хранения целого значения или указателя на структуру данных. Плагин должен освободить память, занятую такими дополнительными структурами.
В принципе логично, ожидаемо и весьма полезно.
Однако Plugin::SetDirectory() заполняет это поле нулём:

Code: Select all

Info.UserData = 0; //Reserved
Когда этот зарезервированный кусок заработает (создан Date: Mon Mar 7 12:41:53 2011 / New Revision: 5774 / tag build 1899)?
Или смысл иной, нежели чем описан в Писании?
We are the Borg. You will be assimilated.
So Say We All!

User avatar
zg
zero-gravity
Posts: 5313
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 49 times
Contact:

Re: SetDirectoryInfo::UserData

Post by zg » Wed 12 Dec, 2012 13:07

ответ тут.
если я правильно помню, реально из 5 мест вызова SetDirectory, только в одном она есть по факту. в остальных её надо откуда-то брать. и не всегда понятно — откуда.

User avatar
Skirda
Posts: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 1 time

Re: SetDirectoryInfo::UserData

Post by Skirda » Wed 12 Dec, 2012 13:27

Правильно я понимаю, что SetDirectoryInfo::UserData должна была иметь значение из PluginPanelItem::UserData.Data для "этого" виртуального каталога, в который вваливам?
We are the Borg. You will be assimilated.
So Say We All!

User avatar
NightRoman
Posts: 5873
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 9 times
Contact:

Re: SetDirectoryInfo::UserData

Post by NightRoman » Wed 12 Dec, 2012 13:31

Skirda
По идее, да. В простых ситуациях, при навигации юзером в панели, например.

Но есть и хитрые ситуации, например, диалог результатов поиска, юзер жмакает на найденном элементе, Фар зовет SetDirectory. Что передавать? По аналогии надо бы заполнить UserData родительского элемента. Но это технически сложней реализовать. Но можно и UserData самого элемента, а уж плагин разберется, что там за директория у него. Но тогда надо отмечать этот факт каким-то дополнительным флагом.

User avatar
NightRoman
Posts: 5873
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 9 times
Contact:

Re: SetDirectoryInfo::UserData

Post by NightRoman » Wed 12 Dec, 2012 15:19

Skirda, вижу подвижки идут в сорсах. Это очень хорошо, надеюсь на то, что плагины получат свои UserData в конце концов и при SetDirectory.

Только у меня есть одно пожелание. UserData везде сохранять полностью, а именно и указатель на данные, и ф-ю, которая освобождает. И в плагин давать и то, и то (как плагин, собственно, и давал в Фар 2 "указателя"). Для плагина этот второй указатель может играть роль типа данных для проверок, что это за данные (если используются 2+ типов). Это будет удобно. Иначе придется выдумывать другие способы различения данных, чего можно избежать в простых случаях. (Но если сложно технически, то фиг с ним, это не фатально, и плагин выкрутится, конечно, и по одному указателю.)

User avatar
Skirda
Posts: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 1 time

Re: SetDirectoryInfo::UserData

Post by Skirda » Thu 13 Dec, 2012 10:25

Так, в FileList::ChangeDir() сделал.
Это где "Global->CtrlObject->Plugins->SetDirectory(hPlugin,". Плагином проверил - UserData для "этого каталога" передается именно та, что была собрана ФАРом при вызове GetFindDataW().
Пойду далее смотреть.
We are the Borg. You will be assimilated.
So Say We All!

User avatar
Skirda
Posts: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 1 time

Re: SetDirectoryInfo::UserData

Post by Skirda » Thu 13 Dec, 2012 12:00

Эээ... тут такое дело.
Есть вызовы такие:
  1. SetDirectory(0)
  2. SetDirectory("..")
  3. SetDirectory("\")
  4. SetDirectory(ИМЯ)
IMHO, передавать UserData имеет смысл только для последнего варианта, в остальных случаях ноль. В остальных вариантах я что-то ума не дам откуда брать UserData.
Если так устраивает, то соответствующее замечание нужно делать в Писании.
We are the Borg. You will be assimilated.
So Say We All!

User avatar
Skirda
Posts: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 1 time

Re: SetDirectoryInfo::UserData

Post by Skirda » Thu 13 Dec, 2012 12:07

We are the Borg. You will be assimilated.
So Say We All!

User avatar
NightRoman
Posts: 5873
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 9 times
Contact:

Re: SetDirectoryInfo::UserData

Post by NightRoman » Thu 13 Dec, 2012 12:08

IMHO, передавать UserData имеет смысл только для последнего варианта, в остальных случаях ноль. В остальных вариантах я что-то ума не дам откуда брать UserData.
Пока это выглядит единственно разумным подходом, на мой взгляд. Если выясним, что есть нюансы, тогда и поглядим. Но думается, что их не будет. Если UserData NULL, а плагин передавал не NULL, то это сигнал, что имеет место специальный случай (один из 4-х). Случай проверяется по имени.

User avatar
NightRoman
Posts: 5873
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 9 times
Contact:

Re: SetDirectoryInfo::UserData

Post by NightRoman » Thu 13 Dec, 2012 12:11

Skirda wrote:На пробу.
Скоро проверю, но не совсем скоро, пока в делах.
Спасибо за работу надо очень важной фичей.

User avatar
Skirda
Posts: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 1 time

Re: SetDirectoryInfo::UserData

Post by Skirda » Thu 13 Dec, 2012 12:20

NightRoman wrote:Если UserData NULL, а плагин передавал не NULL, то это сигнал, что имеет место специальный случай (один из 4-х). Случай проверяется по имени.
Логично.
NightRoman wrote:Скоро проверю, но не совсем скоро, пока в делах.
Ок.
We are the Borg. You will be assimilated.
So Say We All!

User avatar
NightRoman
Posts: 5873
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 9 times
Contact:

Re: SetDirectoryInfo::UserData

Post by NightRoman » Thu 13 Dec, 2012 13:15

Бегло посмотрел в отладчике. Вроде разумные данные там.

Но для серьезного тестирования мне надо все Фарнет панели перевести на новый подход, т.е. убрать все обходные маневры и задействовать пока сознательно не задействованные вещи. Тогда будет ясно, работает или нет. Удивлюсь, если сразу заработает. Но бывает :)

Как это будет в базе, так и займусь.

Два момента:

1. Просто иметь в виду, это должны быть UserData еще не удаленного Фаром файла (не вызван удаляющий колбэк).

2. Вопрос (связанный): а при SetDirectory из диалога результатов поиска UserData какого элемента будет передаваться? Если родительского, то он точно еще живой? В том, как было сделано zg до этого, удаляющий колбэк для родителя уже вызван еще до диалога результатов поиска (ну если родитель сам не попал в диалог результатов, конечно, но в общем случае это не так).

User avatar
NightRoman
Posts: 5873
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 9 times
Contact:

Re: SetDirectoryInfo::UserData

Post by NightRoman » Thu 13 Dec, 2012 13:23

В принципе это безобидное изменение, плагины-то пока не пользуют эту фичу. Только не делать ее гласной, пока не отшлифуется (на Фарнете пока). Я протестирую, как следует.

User avatar
Skirda
Posts: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 1 time

Re: SetDirectoryInfo::UserData

Post by Skirda » Thu 13 Dec, 2012 13:29

NightRoman wrote:1. Просто иметь в виду, это должны быть UserData еще не удаленного Фаром файла (не вызван удаляющий колбэк).
Эээ... вроде как данные беру из текущей панели.
Хотя... есть один могильничек... в FindFiles::SetPluginDirectory() есть такой код:

Code: Select all

  	if (Global->CtrlObject->Plugins->GetFindData(hPlugin,&PanelData,&FileCount,OPM_SILENT))
  	{
+ 		if (*DirPtr)
+ 			UserData=GetUserDataFromPluginItem(DirPtr,&PanelData,FileCount);
  		Global->CtrlObject->Plugins->FreeFindData(hPlugin,PanelData,FileCount,true);
  	}
  	if (*DirPtr)
  	{
! 		Global->CtrlObject->Plugins->SetDirectory(hPlugin,DirPtr,OPM_SILENT,UserData);
  	}
Плюсом отмечены добавленные строки.
Хмм.. Видимо погорячился, ведь никто не запрещает плагину во FreeFindData кильнуть UserData.Data в обход коллбэка.

А в GetPluginDirList() есть момент в котором пока передается 0.
NightRoman wrote:2. Вопрос (связанный): а при SetDirectory из диалога результатов поиска UserData какого элемента будет передаваться? Если родительского, то он точно еще живой? В том, как было сделано zg до этого, удаляющий колбэк для родителя уже вызван еще до диалога результатов поиска (ну если родитель сам не попал в диалог результатов, конечно, но в общем случае это не так).
Упс. Недочитал. Выше :-)
We are the Borg. You will be assimilated.
So Say We All!

User avatar
NightRoman
Posts: 5873
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 9 times
Contact:

Re: SetDirectoryInfo::UserData

Post by NightRoman » Thu 13 Dec, 2012 13:34

Хорошо. Повторю, что писал ранее, может, теперь понятнее будет о чем это я говорил
Но есть и хитрые ситуации, например, диалог результатов поиска, юзер жмакает на найденном элементе, Фар зовет SetDirectory. Что передавать? По аналогии надо бы заполнить UserData родительского элемента. Но это технически сложней реализовать. Но можно и UserData самого элемента, а уж плагин разберется, что там за директория у него. Но тогда надо отмечать этот факт каким-то дополнительным флагом.
Я ожидал, что будет тяжело организовать передачу UserData родителя. Если это так, то нужен вариант с UserData самого элемента, думаю, плагину этого будет достаточно. Но плагин должен этот случай отличать. Может сейчас? Если нет, то нужен новый флажок какой-то.

User avatar
NightRoman
Posts: 5873
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 9 times
Contact:

Re: SetDirectoryInfo::UserData

Post by NightRoman » Thu 13 Dec, 2012 13:37

Пока можно забить на диалог поиска. Пусть там пока передается 0. Если остальное будет работать, то это уже хороший шаг вперед.

Post Reply

Return to “Development”