Подробно о файле dbRoot.v5
Последнее изменение: 23/11/2010 13:45:12Общие сведения
dbRoot.v5 - это главный конфигурационный файл-контейнер, в которм определены такие вещи как перечень слоёв, перечень провайдеров (поставщиков контента для слоев и снимков), стили отображения слоёв, список возможных серверов (sky, mars и т.д), номер текущей версии БД и текущий ключ для дешифровки всех передаваемых данных. На данный момент существует 2 редакции данного файла, отличающихся по своей структуре, но несущих в итоге одинаковые данные:
- для клиентов 5.1 и младше (младшие версии клиентов) - первая редакция
- для клиентов 5.2 и старше (старшие версии клиентов) - вторая редакция
Причём, клиент 5.2.1.1329 (первый клиент из линейки 5.2) поддерживает обе редакции файла (вторая редакция - дефолтная, а первая загружается только при недоступности файла второй редакции). Возможно, аналогичное поведение будет и у остальных клиентов старших версий.
Данный файл запрашивается у сервера самым первым. При невозможности загрузить этот файл из интернета, клиент пытается загрузить его из кэша ( файл первой редакции хранится в dbCache.dat, второй редакции - в dbroot_cache ). В случае же, если клиенту не получится загрузить его и из кэша (к примеру, кэш пуст), то работа клиента будет прервана, и будет сообщено, что невозможно соедениться с сервером.
Загрузка данного файла производится каждый раз при запуске клиента (для серверов Небо, Марс и История - раз в сеанс, при переключении в данный режим).
Формат запроса
То, в каком виде клиентом будет сформирован запрос на этот файл зависит от языковых настроек Windows, собственных настроек Google Earth, а так же, для старших версий клиента и от версии и типа клиента. Пример типового запроса для режима просмотра Земля:
Запрос файла первой редакции:
http://kh.google.com/dbRoot.v5?hl=ru-RU&gl=ru
Запрос файла второй редакции:
http://kh.google.com/dbRoot.v5?hl=ru-RU&gl=ru&output=proto&cv=5.2.1.1329&ct=free
где, hl=ru-RU - язык пользователя
gl=ru - расположение пользователя
output=proto - ?
cv=5.2.1.1329 - версия клиента
ct=free - тип клиента (free/pro)
Описание параметров запросов
Параметр hl говорит серверу, на каком языке нужно отдать dbRoot.v5 (на каком языке будут слои/имена серверов в клиенте). Например, если hl=ru-Ru или просто, hl=ru - то слои будут на русском языке, а если hl=en-GB - то на английском. Данный параметр клиент устанавливает самостоятельно, в зависимости от того, какой выбран язык в настройках программы (см. скрин). Если в настройках GE будет указан язык System default (как это сделано по-умолчению), то язык будет взят из настроек windows, т.е. будет использован тот же язык, что и в windows.
Второй параметр gl, говорит серверу о месторасположении пользователя: gl=ru - Россия, gl=US - США и т.д. И в соответствии с этим параметром, глобус, при старте программы, поворачивается именно тем боком, где родина пользователя. Значение берётся из языковых настроек windows: Пуск -> Панель управления -> Язык и региональные стандарты
Поврот глобуса происходит следующим образом: клиент GE определяет месторасположение пользователя, как это показано выше, а затем, загружает kml файл соответствующий этому расположению, который, собственно, и устанавливает камеру в соответствии с параметрами метки, пропасанной в kml. Соответствующие kml файлы находятся в папке res, которая расположена в папке с программой. Для gl=ru соответствует kml файл: \res\ru.country\startinglocation.kml. При желании, содержимое этого файла можно отредактировать, и заставить GE ворочать глобус нужным вам боком, и главное - с нужной высотой камеры.
Параметры cv и ct сообщают серверу о версии и типе клиента. На данный момент всегда отдаётся одинаковый dbRoot.v5, но в будущем, возможно, наполнение этого файла так же будет отличаться для различных версий клиента. Это связано с тем, что на данный момент в файле описаны слои для всех типов клиентов, а уже в описании каждого слоя сделана пометка для какого именно клиента предназначен данный слой. Т.о. с целью оптимизации, в будущем, в файл могут быть включены только те слои, что предназначены/поддерживаются данным клиентом. Всё что касается слоёв, так же справедливо и для всех остальных данных, что передаются в данном файле.
Назначение параметра output пока не ясно. Возможно - формат контейнера.
Формат контейнера dbRoot.v5 первой редакции
Общая структура контейнера:
- type
- TDBRoot = record
- Unk1 : LongWord; // Всегда равно: 94 64 87 4E
- Unk2 : Word; // Всегда равно: 66 00
- Ver : Word; // Версия БД
- Key : array [0..1015] of byte; // Ключ
- Xml : array of byte; // xml-данные - собственно, dbroot
- end;
Версия БД
Версия текущей БД хранится в 7 и 8-м байтах dbRoot.v5. Версия лежит в скрытом виде, открывается она следующим образом:
- V = Ver xor $4200; // Ver: word - 7 и 8-й байты из dbroot
Ключ
Ключ для дешифровки данных начинается с 9-го байта и имеет длину 1016 байт. Для использования в алгоритме дешифровки он должен быть дополнен 8-мью нулями (спереди) до 1024 байт.
Xml-данные
Xml данные - всё остальное после 1024-го байта и до конца файла. Эти данные, как и всё в GE, зашифрованы и упакованы в zlib архив. Для того, чтобы добраться до собственно xml была написана специальная утилитка: MasterRoot - котрая умеет как разобрать dbRoot.v5 на составные части (ключ + xml), так и собрать из этих частей новый dbRoot.
Таким образом появляется возможность ручного редактирования xml данных, да и просто, может быть кому-то интересно посмотреть, чего же там понаписано:) К примеру, правкой dbRoot можно отключить копирайты, подписываемые гуглом внизу окна:
Для этого необходимо удалить все секции "
Формат контейнера dbRoot.v5 второй редакции
Общая структура контейнера:
- type
- TDBRoot2 = record
- RX08 : Byte; // Флаг = 0x08
- Unk : array of byte; // Всегда = 0x00
- RX12 : Byte; // Флаг = 0x12
- KeyLen : array of byte; // Размер ключа
- Key : array [0..KeyLen-1] of byte; // Ключ
- RX1A : Byte; // Флаг = 0x1A
- RootLen : array of byte; // Размер данных dbroot
- Root : array [0..RootLen-1] of byte;// Данные dbroot (соответствует xml)
- end;
То, что в dbRoot первой редакции было xml данными, во второй редакции превратилось в "сырые" данные (также зашифрованы и запакованы в zlib), редактирование и просмотр которых в блокноте уже становится невозможным. Также, версия БД теперь записана в самом конце этих сырых данных Root.
Обновления dbRoot.v5
В заключение, несколько слов об обновлении файла dbRoot. Так вот, хотя гугл и запрашивает каждый раз при старте этот файл, обновляется он гораздо реже, и по сути, в большинстве случаев происходит перезакачка уже имеющихся данных, с соответствующей потерей трафика. Этого можно избежать. Во-первых, обновление dbRoot можно контролировать вручную, а во-вторых, даже при обновлении dbRoot на сервере, можно вручную устанавливать версию имеющегося dbRoot-а на нужную. Таким образом можно всегда пользоваться единожды загруженным dbRoot (конечно, до тех пор, пока гугловцы не изменят что-либо кардинально в слоях - в этом случае слои со старого dbRoot перестанут отображаться, и придётся таки загрузить обновлённый dbRoot).
Ручное слежение за обновлением dbRoot заключается в периодическом чтении заголовков по url, с которого гугл загружает dbRoot. К примеру, на данный момент заголовок (head) по url http://kh.google.com/dbRoot.v5?hl=ru-RU&gl=ru такой:
HTTP/1.1 200 OK Last-Modified: Wed, 24 Jun 2009 19:08:07 GMT Date: Mon, 08 Jul 2009 16:41:34 GMT Pragma: no-cache Expires: Fri, 01 Jan 1990 00:00:00 GMT Cache-Control: no-cache, must-revalidate Content-Type: application/octet-stream Server: btfe Content-Length: 57090
Нас интересует строчка Last-Modified, в которой сервер нам любезно сообщает, что последнее изменения файла dbRoot.v5 было 24 июня 2009 в 19:08:07 GMT (по Гринвичу). К сожалению, заголовки с полями Last-Modified сервер возвращает не для всех режимов.
Чтобы как-то упростить и автоматизировать процесс чтения заголовков с сервера гугла, была написана утилита - GEUpdater, которая при запуске автоматически проверяет обновления на всех серверах, и выдаёт такое сообщение:
Прямые ссылки на dbRoot.v5 (доступны для загрузки из браузера):
Земля (rus): http://kh.google.com/dbRoot.v5?hl=ru-RU&gl=ru
Земля (eng): http://kh.google.com/dbRoot.v5?hl=ru-RU&gl=ru
Истрия (rus): http://khmdb.google.com/dbRoot.v5?db=tm&hl=ru-RU&gl=ru
Истрия (eng): http://khmdb.google.com/dbRoot.v5?db=tm&hl=en-GB&gl=US
Небо (rus): http://khmdb.google.com/dbRoot.v5?db=sky&hl=ru-RU&gl=ru
Небо (eng): http://khmdb.google.com/dbRoot.v5?db=sky&hl=en-GB&gl=US
Марс (rus): http://khmdb.google.com/dbRoot.v5?db=mars&hl=ru-RU&gl=ru
Марс (eng): http://khmdb.google.com/dbRoot.v5?db=mars&hl=en-GB&gl=US
Луна (rus): http://khmdb.google.com/dbRoot.v5?db=moon&hl=ru-RU&gl=ru
Луна (eng): http://khmdb.google.com/dbRoot.v5?db=moon&hl=en-GB&gl=US