SASGIS

Веб-картография и навигация

Тип плагинов: Простой экспорт в файл

Форум для обсуждения деталей разработки программы SAS.Планета

Модераторы: vdemidov, Tolik

Re: Тип плагинов: Простой экспорт в файл

Сообщение vdemidov » 19 авг 2010, 22:16

zed писал(а):Сегодня уже некогда погонять, но на первый взгляд должно работать. Завтра если будет время напишу тестовую утиль и погоняю под нагрузкой.

Отлично. Наконец то хоть какое-то движение в этом разделе. А то уж думал всем наплевать. Пока тестируй, а я постараюсь этот экспорт в ближайший следующий релиз добавить.
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Аватара пользователя
vdemidov
Гуру
 
Сообщения: 1687
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 191 раз.
Поблагодарили: 136 раз.

Re: Тип плагинов: Простой экспорт в файл

Сообщение DJ VK » 20 авг 2010, 09:20

Еще один архиватор 7-zip. Delphi SDK - http://www.birtles.org.uk/programming/LZMA.442b.7z

Процесс архивации примерно такой (без учета подготовки и записи потоков)
Код: Выделить всё
dictionary:integer;
inStream:TBufferedFS;
outStream:TBufferedFS;
eos:boolean;
encoder:TLZMAEncoder;
filesize:int64;
i:integer;
properties:array[0..4] of byte;
decoder:TLZMADecoder;
outSize:int64;
v:byte;
const propertiessize=5;

set compression mode - [0, 1], default: 1 (max)\n' +
set dictionary - [0,28], default: 23 (8MB)'#10 +
set number of fast bytes - [5, 273], default: 128'#10 +
set number of literal context bits - [0, 8], default: 3'#10 +
set number of literal pos bits - [0, 4], default: 0'#10 +
set number of pos bits - [0, 4], default: 2'#10 +
set Match Finder: [bt2, bt4], default: bt4'#10 +
write End Of Stream marker'#10

inStream:=TBufferedFS.Create(params.InFile,fmOpenRead or fmsharedenynone);
outStream:=TBufferedFS.Create(params.OutFile,fmcreate);
eos := params.Eos;
encoder:=TLZMAEncoder.Create;
if not encoder.SetAlgorithm(params.Algorithm) then raise Exception.Create('Incorrect compression mode');
if not encoder.SetDictionarySize(params.DictionarySize) then raise Exception.Create('Incorrect dictionary size');
if not encoder.SeNumFastBytes(params.Fb) then raise Exception.Create('Incorrect -fb value');
if not encoder.SetMatchFinder(params.MatchFinder) then raise Exception.Create('Incorrect -mf value');
if not encoder.SetLcLpPb(params.Lc, params.Lp, params.Pb) then raise Exception.Create('Incorrect -lc or -lp or -pb value');
encoder.SetEndMarkerMode(eos);
encoder.WriteCoderProperties(outStream);
if eos then fileSize := -1 else fileSize := inStream.Size;
for i := 0 to 7 do
        WriteByte(outStream,(fileSize shr (8 * i)) and $FF);
        encoder.Code(inStream, outStream, -1, -1);
        encoder.free;
end


Осталось понять как пихать не 1 входной файл (ну или буфер), а несколько
Аватара пользователя
DJ VK
Гуру
 
Сообщения: 1468
Зарегистрирован: 16 апр 2009, 13:57
Откуда: 8 км. от МКАД
Благодарил (а): 82 раз.
Поблагодарили: 300 раз.

Re: Тип плагинов: Простой экспорт в файл

Сообщение vmax » 20 авг 2010, 11:01

zed писал(а):Сегодня уже некогда погонять, но на первый взгляд должно работать. Завтра если будет время напишу тестовую утиль и погоняю под нагрузкой.


Zed, огромное спасибо за выложенные сорцы плагина.
Увы в Дельфях я полный чайник (както за 20 лет программерского стажа руки не доходили до дельфей )
но по образу и подобию с вашими сорцами все стало более менее понятно. Попробую написать свой плагинчик.
Буду крайне признателен если выложите еще сорцы тестовой утилиты что-бы было чем плагинчик потестить.
vmax
Новичок
 
Сообщения: 40
Зарегистрирован: 02 фев 2010, 12:33
Благодарил (а): 0 раз.
Поблагодарили: 5 раз.

Re: Тип плагинов: Простой экспорт в файл

Сообщение zed » 20 авг 2010, 12:46

Так-с, протестировал - всё работает как задумано (с upd исходниками).
При экспорте в tar данным плагином, следует учитывать, что а) архив создаётся с перезаписью; б) если вдруг SAS скормит два тайла с одинаковыми именами, то в архиве окажется два одинаковых файла (будут только временем создания отличаться). Конечно, при распаковке один тайл перезапишет другой и в итоге останется как и положено всего один, но вот такая особенность присутствует.
zed
Гуру
 
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз.
Поблагодарили: 525 раз.

Re: Тип плагинов: Простой экспорт в файл

Сообщение vdemidov » 20 авг 2010, 12:58

zed писал(а):а) архив создаётся с перезаписью

Логично. Хотя можно подумать, о том что бы добавить возможность сообщить хост-программе, что он умеет или не умеет добавлять данные в существующий файл.
zed писал(а):б) если вдруг SAS скормит два тайла с одинаковыми именами, то в архиве окажется два одинаковых файла (будут только временем создания отличаться). Конечно, при распаковке один тайл перезапишет другой и в итоге останется как и положено всего один, но вот такая особенность присутствует.

Ну это понятно.
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Аватара пользователя
vdemidov
Гуру
 
Сообщения: 1687
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 191 раз.
Поблагодарили: 136 раз.

Re: Тип плагинов: Простой экспорт в файл

Сообщение zed » 20 авг 2010, 21:49

На будущее, есть предложения по интерфейсам:
1. Перенести переменную ALonLatRect: TDoubleRect из ProcessTile в StartExport. Если я правильно понял то здесь у нас координаты выделенного квадрата который мы экспортируем. Поскольку в процессе экспорта эта переменная меняться не будет, то и передавать её с каждым тайлом нет смысла. Достаточно передать её один раз при инициализации.
2. В ProcessTile добавить переменную ATileDate (TDateTime?) с датой создания тайла. На данный момент дата тайла устанавливается дате добавления его в архив.
3. В ISimpleTileProcessor добавить функцию CheckActiveState:Boolean (см. следующий пункт).
4. Процедуру ProcessTile превратить в функцию. Результатом её должен быть размер экспортированного тайла, либо ноль (при ошибке экспорта). А SAS должна проверять размер тайла с ответом этой функции, и если они не совпадают, то вызывать функцию CheckActiveState. Если результат функции будет False, то экспорт должен завершиться. Это позволит плагину прерывать экспорт при ошибках или из других своих соображений.

И из пожеланий, хотелось бы всё же иметь информацию о имени экспортируемой папки в кэше.
zed
Гуру
 
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз.
Поблагодарили: 525 раз.

Re: Тип плагинов: Простой экспорт в файл

Сообщение vdemidov » 21 авг 2010, 00:00

zed писал(а):1. Перенести переменную ALonLatRect: TDoubleRect из ProcessTile в StartExport. Если я правильно понял то здесь у нас координаты выделенного квадрата который мы экспортируем. Поскольку в процессе экспорта эта переменная меняться не будет, то и передавать её с каждым тайлом нет смысла. Достаточно передать её один раз при инициализации.

Нет. Это именно координаты тайла. И для всех тайлов они будут разные. А область экспорта вполне возможно и даже скорее всего будет не прямоугольной и может быть даже не сплошной. Так что место для параметра абсолютно правильное.

zed писал(а):2. В ProcessTile добавить переменную ATileDate (TDateTime?) с датой создания тайла. На данный момент дата тайла устанавливается дате добавления его в архив.

Да это можно. Не подумал.
zed писал(а):3. В ISimpleTileProcessor добавить функцию CheckActiveState:Boolean (см. следующий пункт).
4. Процедуру ProcessTile превратить в функцию. Результатом её должен быть размер экспортированного тайла, либо ноль (при ошибке экспорта). А SAS должна проверять размер тайла с ответом этой функции, и если они не совпадают, то вызывать функцию CheckActiveState. Если результат функции будет False, то экспорт должен завершиться. Это позволит плагину прерывать экспорт при ошибках или из других своих соображений.

Зачем так сложно? Не проще ли будет просто сразу возвращать логическое значение? А вообще я планирую заюзать Safecall и IErrorInfo.

zed писал(а):И из пожеланий, хотелось бы всё же иметь информацию о имени экспортируемой папки в кэше.

Не. Этого точно не будет. Не пытайтесь сразу все упихать в один тип плагинов. По мере реализации разных экспортов будет видно чего не хватает, тогда и будем придумывать новые интерфесы. Просто сложный интерфейс сложно и использовать. А я к этому не готов. Пока только самое простое.
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Аватара пользователя
vdemidov
Гуру
 
Сообщения: 1687
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 191 раз.
Поблагодарили: 136 раз.

Пред.

Вернуться в Раздел для разработчиков программы SAS.Планета

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1