Notes |
|
|
Чтобы потестить:
1. В params.ini надо добавить что-то типа:
[ScriptControl]
Filename=PerlScriptText.txt
NeedSync=1
Language=PerlScript
Function=sas_main
InputParamNames=x,y,z,q
2. Создать файлик PerlScriptText.txt с содержимым типа приаттаченного (там пример для ч/б нокии) и кинуть его в zmp. |
|
|
|
По поводу параметров:
xy - тайловые координаты
z - зум (от 1)
q - quadkey
v - version
Порядок параметров любой, но должен соответствовать скрипту, обязательных параметров нет.
Имя функции любое (лишь бы она была в скрипте).
Файл скрипта должен быть с расширением txt. |
|
|
(0010758)
|
zed
|
02-03-2013 04:48
|
|
Это типа альтернатива GetUrlScript? Или что куда вообще? |
|
|
|
GetUrlScript можно переименовать, чтобы туда не лазило.
Хотя по идее задумано, что если указано [ScriptControl] и есть файлик - паскальскрипт для этой карты не используется.
Скрипт (функция в нём, с именем из Function) должен получать параметры, указанные в InputParamNames (в примере x,y,z,q, пусть даже первые три и не используются, их можно и убрать, но оставлено, версии тут нет). Чё-то я не подумал, что дефолтный урл из zmp (из params.txt) тоже можно пропихнуть, надо будет сделать.
Функция возвращает либо код ошибки (как int, если надо - можно добавить и заголовки, но придётся смотреть длину массива и типы значений), либо массивчик значений типа кода статуса http, длины ответа, заголовков, собственно ответа, типа контента, там в примере скрипта это прокомментировано. Вернуться должен variant array. Качает тайл и делает всё прочее нужное скрипт сам.
Возвращение из скрипта одного строкового параметра зарезервировано для информирования саса о том, что требуемый тайл уже скачан и лежит там-то, соответственно в этом случае из скрипта передаётся полный путь, и далее логика ровно та же самая, как я делал для протокола file:// - тип контента, размер и тело берётся из файла, то есть тут ничего больше передавать не надо.
Как а) писать на других языках и б) что указывать как Language (PhpScript или VBScript или JScript какой) скорее всего я не подскажу, первое их апологетам известно лучше, второе скорее всего можно найти по ссылке на msdn выше (или вообще примеры в инете). |
|
|
(0010783)
|
zed
|
03-03-2013 17:05
|
|
Приаттачил zmp - почему-то выскакивает InternalError, хотя сам скрипт из командной строки работает нормально. |
|
|
|
>почему-то выскакивает InternalError
Ага, есть такое, с моим приаттаченным тоже бывает. Иной раз скачаешь пяток тайлов - на 6-й раз вылезет, перекачиваешь тайл - нормально скачивает (причём там если синхронизация - используется критическая секция, так что по двое никто никуда не пролезет). Где-то что-то кривится внутри ScriptControl похоже, или сборщик мусора какой-нибудь гадит. Потому и взял попробовать ещё ActiveScript. |
|
|
(0010790)
|
zed
|
04-03-2013 16:34
|
|
>Иной раз скачаешь пяток тайлов
У меня ещё печальнее - ни одного тайла скачать не получается... |
|
|
|
Пописал ScriptControl:
1. Добавил CoInitialize.
2. Параметры скрипта убрал из экземпляра и сделал на стеке как VarArray.
У меня эта ошибка пропала. Даже в режиме кэш+интернет нокия стала грузиться )).
Так что поверяй.
ps. Правда я так и не рискнул пока что многопоточно через ScriptControl качать.
Вариант с ActiveScript недоковырен, там надо Invoke сделать (чтобы функцию с параметрами позвать), но если реализация с ScriptControl заработает и будет устраивать по скорости и надёжности - забью и выпилю ActiveScript. |
|
|
(0010793)
|
zed
|
04-03-2013 19:03
|
|
Выдало ту же ошибку и всё остановилось. Но судя по сниферу, один тайл таки скачать умудрилось.
Глянь скрипт опытным глазом? Я в perl не силён, может крепко нахомутал чё. |
|
|
|
Я пробовал поглядеть - из того, что в глаза бросилось - это \? (зачем там \ не пойму) да вызов функции ym_get_boundary без параметров и без скобок (чего перл не любит в зависимости от фазы луны).
Больше ничего не углядел, но особо и не ковырялся. Убрал \ и добавил скобки - не полегчало, где-то что-то хитрее.
Сделал ActiveScript - так он у меня и на нокии работает
А на твоём яндексе всё то же InternalError.
Чую где-то там косяк, отлаживаться надо...
А вообще погляди у себя какие есть парсеры.
Это смотрится в реестре по разделам вида:
HKEY_CLASSES_ROOT\PerlScript\OLEScript
HKEY_CLASSES_ROOT\VBScript\OLEScript
может есть
HKEY_CLASSES_ROOT\PhpScript\OLEScript
например или
HKEY_CLASSES_ROOT\JScript\OLEScript
Не PerlScript-ом же единым... |
|
|
|
Загрузил mobile.yandex.zmp.rar - вот так работает.
Что называется найдите 10 отличий )))
Вырезал всё и кусками назад затаскивал.
Из важного - перенёс UserAgent и сделал KeepAlive.
Короче говоря через ScriptControl пашет, лажается у меня 1 тайл из нескольких десятков.
А вот через ActiveScript валится чаще.
Переделал в общей ini-шке
[ScriptControl]
UseScriptControl=1
если 1 - ScriptControl, если 2 - ActiveScript, по умолчанию 0 - ничего. |
|
|
|
Ещё б придумать как отладочные сообщения при загрузке скрипта при работе из-под Delphi придушить... |
|
|
(0010806)
|
vasketsov
|
05-03-2013 13:23
(edited on: 05-03-2013 13:37) |
|
Если кому будет интересно:
Для php (ActivePHP) тут:
http://pecl.php.net/package/PHPScript
As of PHP 5.0.1, ActiveScript has been moved to the PECL repository.
The DLL for this PECL extension may be downloaded from either the PHP
Downloads page or from http://pecl4win.php.net/
Но можно забрать отсюда
http://museum.php.net/php4/
в версии php-4.4.9-Win32.zip
Для perl (PerlScript) ставится сразу при установке ActiveState ActivePerl (там же есть активный питон, но мопед не мой...)
VBScript и JScript есть сразу
|
|
|
(0010808)
|
zed
|
05-03-2013 17:21
|
|
Походу этот InternalError только под дебагером вылетает, потому как обычная дебажная версия с EurekaLog качает исправно и без ошибок. Спасибо за фиксы!
>Ещё б придумать как отладочные сообщения при загрузке скрипта при работе из-под Delphi придушить...
Не встречал таких. Что за сообщения?
А вообще, конечно, фигово, что исправно работающий скрипт может глючить через этот ScriptControl. Когда я встраивал php, помницца, таких проблем небыло. Так что может быть и стоит возродить его из пепла, тем более, что для работы там требовалась всего одна dll без какой-либо необходимости регистрации её в системе. |
|
|
|
>Что за сообщения?
Ну OutputDebugString которые, когда из-под delphi запускаешь - внизу в окно валятся, типа DLL заружена, поток создан-убит, так вот при загрузке скрипта туда столько валится, что время запуска саса из-под delphi заметно увеличивается.
>фигово, что исправно работающий скрипт может глючить через этот ScriptControl
ну не сказать что уж прямо сильно глючит ))) скорее это можно охарактеризовать как "полная задница с обработкой информации об ошибках".
>качает исправно и без ошибок
У меня возникла мысль, что ошибка может быть из-за того, что в рабочем потоке не выполнено CoInitialize. Ну не будешь же перед запуском скрипта каждый раз её выполнять ))) а вот при ошибке оно каким-то макаром инициализируется, соответственно тот workaround, который я сделал для пустого ответа из скрипта - и отрабатывает. По крайней мере по косвенным признакам это так (не более 1 ошибки при однопоточном доступе, повторно отрабатывает верно).
>может быть и стоит возродить его из пепла
Так погляди, может и стоит.
В принципе ничего универсальнее не сделаешь, но если будет выигрыш в надёжности или скорости - будет замечательно. |
|
|
|
Пока что рекомендуется использовать ScriptControl.
Но ActiveScript не вырезан (и в частности доступен для тестирования и допиливания).
Если надо будет в скрипты пропихивать объекты из саса, добавить параметры, что-нибудь изменить - пишите отдельными тикетами. А этот работает - и ладно. |
|