Подробно о файле dbRoot.v5

Последнее изменение: 02/06/2020 13:36:32

Общие сведения

dbRoot.v5 - это главный конфигурационный файл-контейнер, в которм определены такие вещи как перечень слоёв, перечень провайдеров (поставщиков контента для слоев и снимков), стили отображения слоёв, список возможных серверов (sky, mars и т.д), номер текущей версии БД и текущий ключ для дешифровки всех передаваемых данных.

На данный момент этот файл может передаваться в двух форматах (условно: первой и второй редакции), отличающихся по своей бинарной структуре, но несущих в итоге одинаковые данные:

Причём, клиент 5.2.1.1329 (первый клиент из линейки 5.2) и более поздние поддерживают обе редакции файла (вторая редакция - дефолтная, а первая загружается только при недоступности файла второй редакции).

Данный файл запрашивается у сервера самым первым. При невозможности загрузить этот файл из интернета, клиент пытается загрузить его из кэша (файл первой редакции хранится в dbCache.dat, второй редакции - в dbroot_cache). В случае же, если клиенту не получится загрузить его и из кэша (к примеру, кэш пуст), то работа клиента будет прервана, и будет сообщено, что невозможно соединиться с сервером.

Загрузка данного файла производится каждый раз при запуске клиента (для серверов Небо, Марс и История - раз в сеанс, при переключении в данный режим).

Формат запроса

То, в каком виде клиентом будет сформирован запрос на этот файл зависит от языковых настроек Windows, собственных настроек GoogleEarth, а так же, для старших версий клиента и от версии и типа клиента. Пример типового запроса для режима просмотра Земля:

 Запрос файла первой редакции:
   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. Параметр hl Второй параметр gl, говорит серверу о месторасположении пользователя: gl=ru - Россия, gl=US - США и т.д. И в соответствии с этим параметром, глобус, при старте программы, поворачивается именно тем боком, где родина пользователя. Значение берётся из языковых настроек windows: Пуск -> Панель управления -> Язык и региональные стандарты Параметр gl Поврот глобуса происходит следующим образом: клиент GE определяет месторасположение пользователя, как это показано выше, а затем, загружает kml файл соответствующий этому расположению, который, собственно, и устанавливает камеру в соответствии с параметрами метки, пропасанной в kml. Соответствующие kml файлы находятся в папке res, которая расположена в папке с программой. Для gl=ru соответствует kml файл: \res\ru.country\startinglocation.kml. При желании, содержимое этого файла можно отредактировать, и заставить GE ворочать глобус нужным вам боком, и главное - с нужной высотой камеры.

Параметры cv и ct сообщают серверу о версии и типе клиента. На данный момент всегда отдаётся одинаковый dbRoot.v5, но в будущем, возможно, наполнение этого файла так же будет отличаться для различных версий клиента. Это связано с тем, что на данный момент в файле описаны слои для всех типов клиентов, а уже в описании каждого слоя сделана пометка для какого именно клиента предназначен данный слой. Т.о. с целью оптимизации, в будущем, в файл могут быть включены только те слои, что предназначены/поддерживаются данным клиентом. Всё что касается слоёв, так же справедливо и для всех остальных данных, что передаются в данном файле.

Параметр output - формат контейнера. Если этот параметр присутствует и указано значение proto, то возвращается контейнер второй редакции, иначе - первой. А теперь подробнее, о том, что же это за контейнеры.

Формат контейнера dbRoot.v5 первой редакции

Формат первой редакции представляет собой ни что иное, как Си-структуру, со следующими полями:

Delphi code
  1. type
  2.   TXmldbRoot = record
  3.     Magic    : LongWord;                  // Всегда равно: 0x9464874E
  4.     UnkField : Word;                      // Всегда равно: 0x66
  5.     Version  : Word;                      // Версия БД
  6.     Key      : array [0..1015] of Byte;   // Ключ для дешифровки данных (1016 байт)
  7.     Xml      : array of Byte;             // Зашифрованные xml-данные
  8.   end;

Версия БД

Версия текущей БД хранится в 7 и 8-м байтах dbRoot.v5. Версия лежит в скрытом виде, открывается она следующим образом:

Delphi code
  1. V = TXmldbRoot.Version xor $4200;

Ключ

Ключ для дешифровки данных начинается с 9-го байта и имеет длину 1016 байт. Для использования в алгоритме дешифровки он должен быть дополнен 8-мью нулями (спереди) до 1024 байт.

Xml-данные

Xml данные - всё остальное после 1024-го байта и до конца файла. Эти данные, как и всё в GoogleEarth, зашифрованы и упакованы в zlib архив.

Формат контейнера dbRoot.v5 второй редакции

Формат второй редакции это Google Protocol Buffer - специальный формат, оптимизированный для передачи бинарных данных по сети. Структуру данных в этом формате принято описывать в .proto файлах c Си-подобным синтаксисом:

C++ code
  1. package dbroot;
  2.  
  3. message MainContainer {
  4.     required int32 field_01 = 1;  // Всегда равно 0
  5.     required bytes key = 2;       // Ключ для дешифровки данных (1016 байт)
  6.     required bytes data = 3;      // Зашифрованные данные
  7. }

То, что в dbRoot.v5 первой редакции было xml данными, во второй редакции превратилось в ещё один proto-файл (он также зашифрован и запакован в zlib), редактирование и просмотр которого уже становится намного сложнее. По структуре формата контейнера видно, что здесь так же присутствует одно неизвестное поле (field_01 - версия контейнера?), а вот версия БД уже спрятана на уровень глубже.

Для того, чтобы добраться до основных данных, которые передаются клиенту, была написана специальная утилита - MasterRoot. Эта утилита может как разобрать dbRoot.v5 на составные части, так и собрать из этих частей новый dbRoot.v5 (с исправлениями и дополнениями), который можно смело подать на вход GoogleEarth.

К примеру, правкой dbRoot.v5 можно отключить копирайты, подписываемые гуглом внизу окна: Провайдеры Можно, так же, удалить избранные или даже все слои, а на их место включить свои и получить эксклюзивный dbRoot.v5. Так же возможно запретить какой-нибудь из режимов (Небо, Марс, История), и проч. В общем, для интересующихся - широкое поле для деятельности.

Обновления dbRoot.v5

В заключение, несколько слов об обновлении файла dbRoot.v5. Так вот, хотя гугл и запрашивает каждый раз при старте этот файл, обновляется он гораздо реже, и по сути, в большинстве случаев происходит перезакачка уже имеющихся данных, с соответствующей потерей трафика. Этого можно избежать. Во-первых, обновление dbRoot.v5 можно контролировать вручную, а во-вторых, даже при обновлении dbRoot.v5 на сервере, можно вручную устанавливать версию имеющегося dbRoot-а на нужную. Таким образом можно всегда пользоваться единожды загруженным dbRoot (конечно, до тех пор, пока гугловцы не изменят что-либо кардинально в слоях - в этом случае слои со старого dbRoot.v5 перестанут отображаться, и придётся таки загрузить обновлённый dbRoot.v5).

Ручное слежение за обновлением dbRoot.v5 заключается в периодическом чтении заголовков по url, с которого гугл загружает dbRoot.v5. К примеру, на данный момент заголовок (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, которая при запуске автоматически проверяет обновления на всех серверах, и выдаёт такое сообщение: GEUpdater Прямые ссылки на dbRoot.v5 первой редакции (доступны для загрузки из браузера):

Земля (rus): http://kh.google.com/dbRoot.v5?hl=ru-RU&gl=ru

Земля (eng): http://kh.google.com/dbRoot.v5?hl=en-GB&gl=US

История (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