Welcome to mirror list, hosted at ThFree Co, Russian Federation.

geourl_process.cpp « map - github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: f22f490a87bb6da0d1d7672b0a65bcc494492052 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include "geourl_process.hpp"

#include "../indexer/scales.hpp"
#include "../indexer/mercator.hpp"

#include "../base/string_utils.hpp"


namespace url_scheme
{
  void Info::Reset()
  {
    m_lat = m_lon = EmptyValue();
    m_zoom = scales::GetUpperScale();
  }

  m2::RectD Info::GetViewport() const
  {
    ASSERT ( IsValid(), () );

    return scales::GetRectForLevel(m_zoom,
                                   m2::PointD(MercatorBounds::LonToX(m_lon),
                                              MercatorBounds::LatToY(m_lat)),
                                   1.0);
  }


  class DoParse
  {
    Info & m_info;

    enum TMode { START, LAT, LON, ZOOM, FINISH };
    TMode m_mode;

    static void ToDouble(string const & token, double & d)
    {
      double temp;
      if (strings::to_double(token, temp))
        d = temp;
    }

    bool CheckKeyword(string const & token)
    {
      if (token == "lat" || token == "point")
        m_mode = LAT;
      else if (token == "lon")
        m_mode = LON;
      else if (token == "zoom")
        m_mode = ZOOM;
      else
        return false;

      return true;
    }

  public:
    DoParse(Info & info) : m_info(info), m_mode(START)
    {
    }

    void operator()(string const & token)
    {
      switch (m_mode)
      {
      case START:
        ASSERT(token == "geo" || token == "mapswithme", (token));
        m_mode = LAT;
        break;

      case LAT:
        if (!CheckKeyword(token))
        {
          ToDouble(token, m_info.m_lat);
          m_mode = LON;
        }
        break;

      case LON:
        if (!CheckKeyword(token))
        {
          ToDouble(token, m_info.m_lon);
          m_mode = ZOOM;
        }
        break;

      case ZOOM:
        if (!CheckKeyword(token))
        {
          ToDouble(token, m_info.m_zoom);
          m_mode = FINISH;
        }
        break;

      default:
        break;
      }
    }
  };

  void ParseURL(string const & s, Info & info)
  {
    strings::Tokenize(s, ":/?&=,", DoParse(info));
  }
}