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

Последнее изменение: 23/11/2010 13:45:12

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

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

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

Общая структура контейнера:

Delphi code
  1. type
  2.   TDBRoot = record
  3.     Unk1 : LongWord;                  // Всегда равно: 94 64 87 4E
  4.     Unk2 : Word;                      // Всегда равно: 66 00
  5.     Ver  : Word;                      // Версия БД
  6.     Key  : array [0..1015] of byte;   // Ключ
  7.     Xml  : array of byte;             // xml-данные - собственно, dbroot
  8.   end;

Версия БД

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

Delphi code
  1. V = Ver xor $4200; // Ver: word - 7 и 8-й байты из dbroot

Ключ

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

Xml-данные

Xml данные - всё остальное после 1024-го байта и до конца файла. Эти данные, как и всё в GE, зашифрованы и упакованы в zlib архив. Для того, чтобы добраться до собственно xml была написана специальная утилитка: MasterRoot - котрая умеет как разобрать dbRoot.v5 на составные части (ключ + xml), так и собрать из этих частей новый dbRoot. Image:masterroot.png Таким образом появляется возможность ручного редактирования xml данных, да и просто, может быть кому-то интересно посмотреть, чего же там понаписано:) К примеру, правкой dbRoot можно отключить копирайты, подписываемые гуглом внизу окна: Провайдеры Для этого необходимо удалить все секции " [export.provider.info]", на данный момент их там 3, в самом конце файла. Можно, так же, удалить избранные или даже все слои, а на их место включить свои и получить эксклюзивный dbRoot. Так же возможно запретить какой-нибудь из режимов (Небо, Марс, История), и проч. В общем, для интересующихся - широкое поле для деятельности.

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

Общая структура контейнера:

Delphi code
  1. type
  2.    TDBRoot2 = record
  3.     RX08    : Byte;                        // Флаг = 0x08
  4.     Unk     : array of byte;               // Всегда = 0x00
  5.     RX12    : Byte;                        // Флаг = 0x12
  6.     KeyLen  : array of byte;               // Размер ключа
  7.     Key     : array [0..KeyLen-1] of byte; // Ключ
  8.     RX1A    : Byte;                        // Флаг = 0x1A
  9.     RootLen : array of byte;               // Размер данных dbroot
  10.     Root    : array [0..RootLen-1] of byte;// Данные dbroot (соответствует xml)
  11.    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, которая при запуске автоматически проверяет обновления на всех серверах, и выдаёт такое сообщение: 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