View Issue Details

IDProjectCategoryView StatusLast Update
0001823WishesViewerpublic2013-02-03 00:33
ReporterMaximus Assigned To2useven10  
PrioritynormalSeverityfeatureReproducibilityhave not tried
Status closedResolutionfixed 
Product Version3.0 
Fixed in Version3.0 
Summary0001823: Автообновление вьювера на флешках
DescriptionВьювер не реагирует на изменения файлов (логов, например) расположенных на флешках. Добавил опцию в настройки вьювера.
TagsNo tags attached.
Build2221

Activities

Maximus

2011-07-03 20:31

reporter  

Viewer110703.diff (2,933 bytes)   
Index: config.hpp
===================================================================
--- config.hpp	(revision 6399)
+++ config.hpp	(working copy)
@@ -319,6 +319,7 @@
 	int UseExternalViewer;
 	int ShowKeyBar; // $ 15.07.2000 tran + ShowKeyBar
 	int AnsiCodePageAsDefault;
+	int RefreshOnRemovable;
 	int ShowTitleBar;
 	int SearchRegexp;
 	int MaxLineSize; // 100..100000, default=10000
Index: viewer.cpp
===================================================================
--- viewer.cpp	(revision 6399)
+++ viewer.cpp	(working copy)
@@ -400,7 +400,7 @@
 		DriveType = DRIVE_CDROM;
 	switch (DriveType) //??? make it configurable
 	{
-		case DRIVE_REMOVABLE: update_check_period = -1;  break; // flash drive or floppy: never
+		case DRIVE_REMOVABLE: update_check_period = ViOpt.RefreshOnRemovable ? 500 : -1; break; // flash drive or floppy: 0.5 sec
 		case DRIVE_FIXED:     update_check_period = +1;  break; // hard disk: 1 msec
 		case DRIVE_REMOTE:    update_check_period = 500; break; // network drive: 0.5 sec
 		case DRIVE_CDROM:     update_check_period = -1;  break; // cd/dvd: never
Index: config.cpp
===================================================================
--- config.cpp	(revision 6399)
+++ config.cpp	(working copy)
@@ -442,6 +442,7 @@
 		Builder.AddEmptyLine();
 		Builder.AddCheckbox(MViewAutoDetectCodePage, &ViOpt.AutoDetectCodePage);
 		Builder.AddCheckbox(MViewConfigAnsiCodePageAsDefault, &ViOpt.AnsiCodePageAsDefault);
+		Builder.AddCheckbox(MViewConfigRefreshOnRemovable, &ViOpt.RefreshOnRemovable);
 	}
 	Builder.AddOKCancel();
 	if (Builder.ShowDialog())
@@ -590,6 +591,7 @@
 	{1, GeneralConfig::TYPE_INTEGER, NKeyViewer,L"Wrap",&Opt.ViOpt.ViewerWrap,0, 0},
 	{1, GeneralConfig::TYPE_INTEGER, NKeyViewer,L"PersistentBlocks",&Opt.ViOpt.PersistentBlocks,0, 0},
 	{1, GeneralConfig::TYPE_INTEGER, NKeyViewer,L"AnsiCodePageAsDefault",&Opt.ViOpt.AnsiCodePageAsDefault,1, 0},
+	{1, GeneralConfig::TYPE_INTEGER, NKeyViewer,L"RefreshOnRemovable",&Opt.ViOpt.RefreshOnRemovable,0, 0},
 
 	{0, GeneralConfig::TYPE_INTEGER, NKeyViewer,L"MaxLineSize",&Opt.ViOpt.MaxLineSize,ViewerOptions::eDefLineSize, 0},
 	{0, GeneralConfig::TYPE_INTEGER, NKeyViewer,L"SearchEditFocus",&Opt.ViOpt.SearchEditFocus,0, 0},
Index: farlang.templ.m4
===================================================================
--- farlang.templ.m4	(revision 6399)
+++ farlang.templ.m4	(working copy)
@@ -2248,6 +2248,15 @@
 "&Otwieraj pliki w kodowaniu Windows"
 "Usar código ANS&I por defecto"
 
+MViewConfigRefreshOnRemovable
+"Авто&обновление на сменных носителях"
+"Auto&refresh on removable drives"
+upd:"Autorefresh on removable drives"
+upd:"Autorefresh on removable drives"
+upd:"Autorefresh on removable drives"
+upd:"Autorefresh on removable drives"
+upd:"Autorefresh on removable drives"
+
 MEditConfigTitle
 l:
 "Редактор"
Viewer110703.diff (2,933 bytes)   

2useven10

2011-07-05 22:20

developer   bugnote:0007246

Last edited: 2011-07-06 08:53

View 2 revisions

imho надо отличать флэшку от флопа, и если уж конфигурить - то для всех типов, не только removable. ну и вряд ли надо менять дефолтное поведение.

samlyukov

2011-07-07 07:30

reporter   bugnote:0007252

думаю, что опция не нужна, включить всегда. если пользователь сказал создать лог ТАМ, зачем Фару вмешиваться?

Maximus

2011-07-07 07:37

reporter   bugnote:0007253

Подозреваю, автообновление было отключено, чтобы не горела постоянно лампочка на дисководе A:, хотя проверить надо, вот только дискету найду :)
А так как фар пока не умеет отличать дисковод от флешки - то и опция. Мало ли...

DrKnS

2011-07-07 08:05

administrator   bugnote:0007254

А что, у кого-то ещё есть дисководы?
И находятся уникумы, которые на дискеты пишут логи, и, более того, смотрят их фаром в процессе записи?

2useven10

2011-07-07 09:04

developer   bugnote:0007255

samlykov: фар вмешается если будет постоянно долбить флоп при просмотре файла (чего раньше не было)
DrKnS: ещё есть, у фара нет операции view_log при просмотре readme размером в один экран автообновление будет работать
Maximus: если без конфига, то на мой взгяд как-то так... (аттач)

2useven10

2011-07-07 09:05

developer  

Viewer_Floppy-FlashDrive_Autorefresh.diff (1,773 bytes)   
Index: viewer.cpp
===================================================================
--- viewer.cpp	(revision 6429)
+++ viewer.cpp	(working copy)
@@ -245,7 +245,28 @@
 	//InitHex=VM.Hex;
 }
 
+static bool IsDriveTypeFLOPPY( const string &strRoot ) // media have to be inserted...
+{
+	bool floppy = true; // returns true if can't open drive
 
+	string drive = HasPathPrefix(strRoot) ? strRoot : L"\\\\?\\" + strRoot;
+	DeleteEndSlash(drive, false);
+
+	HANDLE hDevice = ::CreateFileW(
+		drive.CPtr(),
+		GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_DELETE, nullptr, OPEN_EXISTING, 0, nullptr
+	);
+	if ( INVALID_HANDLE_VALUE != hDevice )
+	{
+		DISK_GEOMETRY g;
+		DWORD dwOutBytes;
+		if ( DeviceIoControl(hDevice, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL,0, &g,(DWORD)sizeof(g), &dwOutBytes,NULL)	)
+			floppy = ( g.MediaType != FixedMedia && g.MediaType != RemovableMedia );
+		CloseHandle(hDevice);
+	}
+	return floppy;
+}
+
 int Viewer::OpenFile(const wchar_t *Name,int warning)
 {
 	VM.CodePage=DefCodePage;
@@ -398,9 +419,9 @@
 	int DriveType = FAR_GetDriveType(strRoot);
 	if (IsDriveTypeCDROM(DriveType))
 		DriveType = DRIVE_CDROM;
-	switch (DriveType) //??? make it configurable
-	{
-		case DRIVE_REMOVABLE: update_check_period = -1;  break; // flash drive or floppy: never
+	switch (DriveType)
+	{                                                    // floppy: never, flash drive: 0.5 sec
+		case DRIVE_REMOVABLE: update_check_period	= IsDriveTypeFLOPPY(strRoot) ? -1 : 500; break;
 		case DRIVE_FIXED:     update_check_period = +1;  break; // hard disk: 1 msec
 		case DRIVE_REMOTE:    update_check_period = 500; break; // network drive: 0.5 sec
 		case DRIVE_CDROM:     update_check_period = -1;  break; // cd/dvd: never

DrKnS

2011-07-07 09:11

administrator   bugnote:0007256

Зачем вообще вьювер лезет проверять время и размер сам, по таймеру?

Есть же FindFirstChangeNotification.

alexy

2011-07-07 09:15

administrator   bugnote:0007257

Так он же на всю папку, и может генерить не меньше траффика да и вполне может не работать для разных сетевых дисков да и вообще зачем эта заморочка с тредами и т.п. И так всё хорошо работает.

2useven10

2011-07-07 09:19

developer   bugnote:0007258

Last edited: 2011-07-07 09:20

View 2 revisions

кроме того эта схема работала и на win95, когда viewer был написан было существенно...

2useven10

2011-07-07 09:35

developer  

Viewer_Floppy-FlashDrive_Autorefresh2.diff (1,790 bytes)   
Index: viewer.cpp
===================================================================
--- viewer.cpp	(revision 6429)
+++ viewer.cpp	(working copy)
@@ -245,7 +245,28 @@
 	//InitHex=VM.Hex;
 }
 
+static bool IsDriveTypeFLOPPY( const string &strRoot ) // media have to be inserted...
+{
+	bool floppy = true; // returns true if can't open drive
 
+	string drive = HasPathPrefix(strRoot) ? strRoot : L"\\\\?\\" + strRoot;
+	DeleteEndSlash(drive, false);
+
+	HANDLE hDevice = ::CreateFileW(
+		drive.CPtr(),
+		GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, nullptr, OPEN_EXISTING, 0, nullptr
+	);
+	if ( INVALID_HANDLE_VALUE != hDevice )
+	{
+		DISK_GEOMETRY g;
+		DWORD dwOutBytes;
+		if ( DeviceIoControl(hDevice, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL,0, &g,(DWORD)sizeof(g), &dwOutBytes,NULL)	)
+			floppy = ( g.MediaType != FixedMedia && g.MediaType != RemovableMedia );
+		CloseHandle(hDevice);
+	}
+	return floppy;
+}
+
 int Viewer::OpenFile(const wchar_t *Name,int warning)
 {
 	VM.CodePage=DefCodePage;
@@ -398,9 +419,9 @@
 	int DriveType = FAR_GetDriveType(strRoot);
 	if (IsDriveTypeCDROM(DriveType))
 		DriveType = DRIVE_CDROM;
-	switch (DriveType) //??? make it configurable
-	{
-		case DRIVE_REMOVABLE: update_check_period = -1;  break; // flash drive or floppy: never
+	switch (DriveType)
+	{                                                    // floppy: never, flash drive: 0.5 sec
+		case DRIVE_REMOVABLE: update_check_period	= IsDriveTypeFLOPPY(strRoot) ? -1 : 500; break;
 		case DRIVE_FIXED:     update_check_period = +1;  break; // hard disk: 1 msec
 		case DRIVE_REMOTE:    update_check_period = 500; break; // network drive: 0.5 sec
 		case DRIVE_CDROM:     update_check_period = -1;  break; // cd/dvd: never

2useven10

2011-07-07 09:36

developer   bugnote:0007259

шару на запись пропустил... (добавлено в новом аттаче)

2useven10

2011-08-27 08:12

developer   bugnote:0007555

хотелось бы увидеть реакцию на последний из предлагаемых апдейтов...

samlyukov

2011-09-10 08:02

reporter   bugnote:0007634

да. так лучше.

2useven10

2011-10-14 15:02

developer   bugnote:0007883

build 2221

Issue History

Date Modified Username Field Change
2011-07-03 20:31 Maximus New Issue
2011-07-03 20:31 Maximus File Added: Viewer110703.diff
2011-07-05 22:20 2useven10 Note Added: 0007246
2011-07-06 08:53 2useven10 Note Edited: 0007246 View Revisions
2011-07-07 07:30 samlyukov Note Added: 0007252
2011-07-07 07:37 Maximus Note Added: 0007253
2011-07-07 08:05 DrKnS Note Added: 0007254
2011-07-07 09:04 2useven10 Note Added: 0007255
2011-07-07 09:05 2useven10 File Added: Viewer_Floppy-FlashDrive_Autorefresh.diff
2011-07-07 09:11 DrKnS Note Added: 0007256
2011-07-07 09:15 alexy Note Added: 0007257
2011-07-07 09:19 2useven10 Note Added: 0007258
2011-07-07 09:20 2useven10 Note Edited: 0007258 View Revisions
2011-07-07 09:35 2useven10 File Added: Viewer_Floppy-FlashDrive_Autorefresh2.diff
2011-07-07 09:36 2useven10 Note Added: 0007259
2011-08-27 08:12 2useven10 Note Added: 0007555
2011-09-10 08:02 samlyukov Note Added: 0007634
2011-10-14 15:02 2useven10 Note Added: 0007883
2011-10-14 15:03 2useven10 Assigned To => 2useven10
2011-10-14 15:03 2useven10 Status new => feedback
2012-05-21 12:07 2useven10 Build => 2221
2012-05-21 12:07 2useven10 Status feedback => closed
2012-05-21 12:07 2useven10 Resolution open => fixed
2012-05-21 12:07 2useven10 Fixed in Version => 3.0
2013-02-03 00:33 alexy Severity minor => feature