Stasher.cpp
Go to the documentation of this file.
1 
2 #include "GeometryFile.h"
3 #include "Stasher.h"
4 #include "../../../edit/Enums.h"
5 #include "../../../edit/Utils.h"
6 #include "../../../maptools/AbstractLayer.h"
7 
8 // Qt
9 #include <QDir>
10 #if QT_VERSION >= 0x050000
11 #include <QStandardPaths>
12 #endif
13 #if QT_VERSION < 0x050000
14 #include <QDesktopServices>
15 #endif
16 
17 void StashGeometries(const te::map::AbstractLayer* layer, const std::map<std::string, te::gm::Geometry*>& geoms, const std::map<std::string, int>& ops)
18 {
19  QString userDataDir;
20  // find user data directory
21 #if QT_VERSION >= 0x050000
22  userDataDir = QStandardPaths::writableLocation(QStandardPaths::DataLocation);
23 #else
24  userDataDir = QDesktopServices::storageLocation(QDesktopServices::DataLocation);
25 #endif
26 
27  QDir dir(userDataDir + "/edition/" +layer->getTitle().c_str());
28 
29  if(!dir.exists())
30  dir.mkpath(dir.path());
31 
32  QString f = dir.path() + "/" + QString::fromUtf8(layer->getTitle().c_str());
33  QString f2 = f + "_r";
34 
35  std::vector<te::gm::Geometry*> gs;
36  std::vector<te::gm::Geometry*> gsR;
37 
38  std::string fName = (f + ".ids").toUtf8().data();
39 
40  std::ofstream idsFile(fName.c_str(), std::ios::out);
41  std::ofstream idsRFile((fName + "r").c_str(), std::ios::out);
42 
43  for(std::map<std::string, te::gm::Geometry*>::const_iterator it = geoms.begin(); it != geoms.end(); ++it)
44  {
45  std::string id = it->first;
46 
47  if(ops.at(id) == te::edit::DELETE)
48  {
49  gsR.push_back(it->second);
50  idsRFile << id << "\n";
51  }
52  else
53  {
54  gs.push_back(it->second);
55  idsFile << id << "\n";
56  }
57  }
58 
59  idsFile.close();
60  idsRFile.close();
61 
62  GeometryFile::writeGeometries(f.toUtf8().data(), gs);
63  GeometryFile::writeGeometries(f2.toUtf8().data(), gsR);
64 }
65 
66 
67 void GetStashedGeometries(const te::map::AbstractLayer* layer, std::map<std::string, te::gm::Geometry*>& geoms, std::map<std::string, int>& ops)
68 {
69  QString userDataDir;
70  // find user data directory
71 #if QT_VERSION >= 0x050000
72  userDataDir = QStandardPaths::writableLocation(QStandardPaths::DataLocation);
73 #else
74  userDataDir = QDesktopServices::storageLocation(QDesktopServices::DataLocation);
75 #endif
76 
77  QDir dir(userDataDir + "/edition/" + QString::fromUtf8(layer->getTitle().c_str()));
78 
79  if(dir.exists())
80  {
81  GeometryFile f;
82 
83  QString fName = dir.path() + "/" + QString::fromUtf8(layer->getTitle().c_str()) + ".geom";
84 
85  f.openFile(fName.toUtf8().data());
86 
87  QFile qf(dir.path() + "/" + QString::fromUtf8(layer->getTitle().c_str()) + ".ids");
88 
89  if(!qf.open(QIODevice::ReadOnly | QIODevice::Text))
90  return;
91 
92  while(te::gm::Geometry* gm = f.next())
93  {
94  QString id(qf.readLine().data());
95 
96  if(id.isEmpty())
97  continue;
98 
99  id.remove("\n");
100 
101  bool ok;
102 
103  id.toInt(&ok);
104 
105  ops[id.toUtf8().data()] = ((ok) ? te::edit::UPDATE : te::edit::INSERT);
106 
107  gm->setSRID(layer->getSRID());
108 
109  geoms[id.toUtf8().data()] = gm;
110  }
111 
112  fName = dir.path() + "/" + QString::fromUtf8(layer->getTitle().c_str()) + "_r.geom";
113 
114  GeometryFile f2;
115 
116  f2.openFile(fName.toUtf8().data());
117 
118  QFile qf2(dir.path() + "/" + QString::fromUtf8(layer->getTitle().c_str()) + ".idsr");
119 
120  if(!qf2.open(QIODevice::ReadOnly | QIODevice::Text))
121  return;
122 
123  while(te::gm::Geometry* gm = f2.next())
124  {
125  QString id(qf2.readLine().data());
126 
127  if(id.isEmpty())
128  continue;
129 
130  id.remove("\n");
131 
132  bool ok;
133 
134  id.toInt(&ok);
135 
136  ops[id.toUtf8().data()] = te::edit::DELETE;
137 
138  gm->setSRID(layer->getSRID());
139 
140  geoms[id.toUtf8().data()] = gm;
141  }
142  }
143 }
144 
145 std::set<std::string> GetStashedLayers()
146 {
147  std::set<std::string> res;
148 
149  QString userDataDir;
150  // find user data directory
151 #if QT_VERSION >= 0x050000
152  userDataDir = QStandardPaths::writableLocation(QStandardPaths::DataLocation);
153 #else
154  userDataDir = QDesktopServices::storageLocation(QDesktopServices::DataLocation);
155 #endif
156 
157  QDir dir(userDataDir + "/edition");
158 
159  QStringList lst = dir.entryList(QDir::Dirs);
160 
161  for(QStringList::iterator it = lst.begin(); it != lst.end(); ++it)
162  res.insert((*it).toUtf8().data());
163 
164  return res;
165 }
166 
168 {
169  QString userDataDir;
170  // find user data directory
171 #if QT_VERSION >= 0x050000
172  userDataDir = QStandardPaths::writableLocation(QStandardPaths::DataLocation);
173 #else
174  userDataDir = QDesktopServices::storageLocation(QDesktopServices::DataLocation);
175 #endif
176 
177  QDir dir(userDataDir + "/edition/" + QString::fromUtf8(layer->getTitle().c_str()));
178 
179  if (!RemoveDir(dir.absolutePath()))
180  throw;
181 }
182 
183 bool RemoveDir(const QString& dirName)
184 {
185  bool result = true;
186  QDir dir(dirName);
187 
188  if (dir.exists(dirName)) {
189  Q_FOREACH(QFileInfo info, dir.entryInfoList(QDir::NoDotAndDotDot | QDir::System | QDir::Hidden | QDir::AllDirs | QDir::Files, QDir::DirsFirst)) {
190  if (info.isDir()) {
191  result = RemoveDir(info.absoluteFilePath());
192  }
193  else {
194  result = QFile::remove(info.absoluteFilePath());
195  }
196 
197  if (!result) {
198  return result;
199  }
200 }
201  result = dir.rmdir(dirName);
202  }
203  return result;
204 }
205 
bool RemoveDir(const QString &dirName)
Definition: Stasher.cpp:183
This is the base class for layers.
Definition: AbstractLayer.h:77
void openFile(const char *fileName)
Opens the file fileName.
virtual const std::string & getTitle() const
It returns the layer title.
static void writeGeometries(const char *fileName, const std::map< int, te::gm::Geometry * > &geoms)
void RemoveStash(const te::map::AbstractLayer *layer)
Definition: Stasher.cpp:167
Geometry is the root class of the geometries hierarchy, it follows OGC and ISO standards.
void StashGeometries(const te::map::AbstractLayer *layer, const std::map< std::string, te::gm::Geometry * > &geoms, const std::map< std::string, int > &ops)
Definition: Stasher.cpp:17
te::gm::Geometry * next()
Returns the next geometry.
virtual int getSRID() const
It returns the Spatial Reference System ID associated to the Layer.
std::set< std::string > GetStashedLayers()
Definition: Stasher.cpp:145
A class that can parses a file with wkb encoded geometries.
Definition: GeometryFile.h:54
void GetStashedGeometries(const te::map::AbstractLayer *layer, std::map< std::string, te::gm::Geometry * > &geoms, std::map< std::string, int > &ops)
Definition: Stasher.cpp:67