SetDirectoryInfo::UserData

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

SetDirectoryInfo::UserData

Post by Skirda »

В Писании относительно 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: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: SetDirectoryInfo::UserData

Post by zg »

ответ тут.
если я правильно помню, реально из 5 мест вызова SetDirectory, только в одном она есть по факту. в остальных её надо откуда-то брать. и не всегда понятно — откуда.
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: SetDirectoryInfo::UserData

Post by Skirda »

Правильно я понимаю, что SetDirectoryInfo::UserData должна была иметь значение из PluginPanelItem::UserData.Data для "этого" виртуального каталога, в который вваливам?
We are the Borg. You will be assimilated.
So Say We All!
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: SetDirectoryInfo::UserData

Post by NightRoman »

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

Но есть и хитрые ситуации, например, диалог результатов поиска, юзер жмакает на найденном элементе, Фар зовет SetDirectory. Что передавать? По аналогии надо бы заполнить UserData родительского элемента. Но это технически сложней реализовать. Но можно и UserData самого элемента, а уж плагин разберется, что там за директория у него. Но тогда надо отмечать этот факт каким-то дополнительным флагом.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: SetDirectoryInfo::UserData

Post by NightRoman »

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

Только у меня есть одно пожелание. UserData везде сохранять полностью, а именно и указатель на данные, и ф-ю, которая освобождает. И в плагин давать и то, и то (как плагин, собственно, и давал в Фар 2 "указателя"). Для плагина этот второй указатель может играть роль типа данных для проверок, что это за данные (если используются 2+ типов). Это будет удобно. Иначе придется выдумывать другие способы различения данных, чего можно избежать в простых случаях. (Но если сложно технически, то фиг с ним, это не фатально, и плагин выкрутится, конечно, и по одному указателю.)
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: SetDirectoryInfo::UserData

Post by Skirda »

Так, в 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: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: SetDirectoryInfo::UserData

Post by Skirda »

Эээ... тут такое дело.
Есть вызовы такие:
  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: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: SetDirectoryInfo::UserData

Post by Skirda »

We are the Borg. You will be assimilated.
So Say We All!
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: SetDirectoryInfo::UserData

Post by NightRoman »

IMHO, передавать UserData имеет смысл только для последнего варианта, в остальных случаях ноль. В остальных вариантах я что-то ума не дам откуда брать UserData.
Пока это выглядит единственно разумным подходом, на мой взгляд. Если выясним, что есть нюансы, тогда и поглядим. Но думается, что их не будет. Если UserData NULL, а плагин передавал не NULL, то это сигнал, что имеет место специальный случай (один из 4-х). Случай проверяется по имени.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: SetDirectoryInfo::UserData

Post by NightRoman »

Skirda wrote:На пробу.
Скоро проверю, но не совсем скоро, пока в делах.
Спасибо за работу надо очень важной фичей.
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: SetDirectoryInfo::UserData

Post by Skirda »

NightRoman wrote:Если UserData NULL, а плагин передавал не NULL, то это сигнал, что имеет место специальный случай (один из 4-х). Случай проверяется по имени.
Логично.
NightRoman wrote:Скоро проверю, но не совсем скоро, пока в делах.
Ок.
We are the Borg. You will be assimilated.
So Say We All!
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: SetDirectoryInfo::UserData

Post by NightRoman »

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

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

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

Два момента:

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

2. Вопрос (связанный): а при SetDirectory из диалога результатов поиска UserData какого элемента будет передаваться? Если родительского, то он точно еще живой? В том, как было сделано zg до этого, удаляющий колбэк для родителя уже вызван еще до диалога результатов поиска (ну если родитель сам не попал в диалог результатов, конечно, но в общем случае это не так).
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: SetDirectoryInfo::UserData

Post by NightRoman »

В принципе это безобидное изменение, плагины-то пока не пользуют эту фичу. Только не делать ее гласной, пока не отшлифуется (на Фарнете пока). Я протестирую, как следует.
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: SetDirectoryInfo::UserData

Post by Skirda »

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: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: SetDirectoryInfo::UserData

Post by NightRoman »

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

Return to “Development”