TFCweb  1.0.4 $Rev: 483 $
TFC Primavera 2012: Nucli d'un servidor web
utils.cc
Veure la documentació d'aquest fitxer.
1 
8 /*
9  * Copyright (c) 2012 Toni Corvera
10  *
11  * This file is part of TFCWeb.
12  *
13  * TFCWeb is free software: you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License as published by
15  * the Free Software Foundation, either version 3 of the License, or
16  * (at your option) any later version.
17  *
18  * TFCWeb is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with TFCWeb. If not, see <http://www.gnu.org/licenses/>.
25  */
26 
27 #include "Excepcions.h"
28 #include "utils.h"
29 
30 #include <fstream>
31 // FIXME: No utilitzats?
32 #include <boost/date_time/c_local_time_adjustor.hpp>
33 #include <boost/date_time/local_time_adjustor.hpp>
34 
35 using namespace std;
36 namespace fs = boost::filesystem;
37 
38 std::ostream& operator<<(std::ostream & os, tfc::utils::manipulador_ostream_t fn) {
39  fn(os);
40  return os;
41 }
42 
43 namespace tfc {
44 
45 namespace utils {
46 
47 bool es_llegible(const fs::path & p) throw () {
48  // assert( fs::exists(p) ); // PRECONDICIÓ
49  if (!fs::exists(p)) { // relaxada
50  return false;
51  }
52  if (fs::is_directory(p)) {
53  boost::system::error_code ec;
54  fs::directory_iterator(p, ec);
55  return !ec;
56  }
57  else if(fs::is_regular_file(p)) {
58  ifstream ifs(p.string().c_str(), ifstream::in);
59  return ifs.good();
60  }
61  else {
62  // relaxada: assert( !"precondició no respectada, p no és un fitxer o directori" );
63  return false;
64  }
65  return false;
66 }
67 
68 bool es_canonic(const fs::path & p) throw () {
69  boost::system::error_code ec;
70  const bool eq = p == fs::canonical(p, ec);
71  return (!ec) && eq;
72 }
73 
74 
75 string lpad(const string & s, size_t mida, char f) {
76  const size_t L = s.length();
77  const size_t c = (L < mida) ? (mida-L) : 0;
78  return string(c, f) + s;
79 }
80 
81 string rpad(const string & s, size_t mida, char f) {
82  const size_t L = s.length();
83  const size_t c = (L < mida) ? (mida-L) : 0;
84  return s + string(c, f);
85 }
86 
87 string formata_data(const boost::posix_time::ptime & pt, const string & fmt) {
88  using namespace boost::gregorian;
89  using namespace boost::posix_time;
90  ostringstream ss;
91  time_facet * df = new time_facet(); // No destruir, la locale se n'apropia
92  ss.imbue(std::locale(std::locale::classic(), df)); // classic() => locale "C"
93  df->format(fmt.c_str());
94  ss << pt;
95  return ss.str();
96 }
97 
98 string formata_data(const std::time_t pt, const string & fmt) {
99  return formata_data(boost::posix_time::from_time_t(pt), fmt);
100 }
101 
102 boost::posix_time::ptime llegeix_data(const string & s, const string & fmt) {
103  throw ErrorNoImplementat(FITXER_I_LINIA_); // FIXME
104  using namespace boost::posix_time;
105  istringstream iss(s);
106  time_input_facet * tif = new time_input_facet(fmt.c_str());
107  iss.imbue(std::locale(std::locale::classic(), tif));
108  boost::posix_time::ptime pt;
109  iss >> pt;
110  return pt;
111 }
112 
113 } // ns utils
114 
115 } // ns tfc
116 
117 // vim:set ts=4 et ai: //