TFCweb  1.0.4 $Rev: 483 $
TFC Primavera 2012: Nucli d'un servidor web
Recurs.h
Veure la documentació d'aquest fitxer.
1 #if !defined(_RECURS_H_)
2 #define _RECURS_H_
3 
10 /*
11  * Copyright (c) 2012 Toni Corvera
12  *
13  * This file is part of TFCWeb.
14  *
15  * TFCWeb is free software: you can redistribute it and/or modify
16  * it under the terms of the GNU General Public License as published by
17  * the Free Software Foundation, either version 3 of the License, or
18  * (at your option) any later version.
19  *
20  * TFCWeb is distributed in the hope that it will be useful,
21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23  * GNU General Public License for more details.
24  *
25  * You should have received a copy of the GNU General Public License
26  * along with TFCWeb. If not, see <http://www.gnu.org/licenses/>.
27  */
28 
29 #include "CosResposta.h"
30 #include "Excepcions.h"
31 #include "portabilitat.h"
32 #include "Transformacions.h"
33 #include "Uri.h"
34 
35 #include <ostream>
36 #include <stdexcept>
37 #include <string>
38 #include <boost/filesystem.hpp>
39 
40 namespace tfc {
41 
46 class ErrorLlegintFitxer : public ErrorTFC {
47 public:
48  ErrorLlegintFitxer(const std::string & w = "Error llegint fitxer")
49  : ErrorTFC(w)
50  {
51  // buit
52  }
53 };
54 
59 class Recurs : public CosResposta {
60 public:
70  explicit Recurs(const PeticioHTTP & peticio,
71  const boost::filesystem::path & arrel_servidor) throw (ErrorRutaInexistent);
73  Recurs(const Recurs & r) throw ()
74  : CosResposta(r),
75  arrel_servidor_(r.arrel_servidor_),
76  fisica_(r.fisica_)
77  {
78  using namespace boost::filesystem;
79  // INICIALITZACIÓ CORRECTA
80  assert( path() != arrel_servidor_ );
81  // INVARIANT
82  assert( canonical(r.fisica_) == r.fisica_ );
83  }
85  Recurs& operator=(const Recurs & r) throw () {
87  using namespace boost::filesystem;
88  // INICIALITZACIÓ CORRECTA
89  assert( path() != arrel_servidor_ );
90  // INVARIANT
91  assert( canonical(r.fisica_) == r.fisica_ );
92 
93  arrel_servidor_ = r.arrel_servidor_;
94  fisica_ = r.fisica_;
95  return *this;
96  }
97 
99  const boost::filesystem::path& fisica() const { return fisica_; }
101  const Uri publica() const { throw ErrorNoImplementat(); return Uri(""); }
102 
107  virtual void envia(boost::asio::ip::tcp::socket & socket)
108  const throw (std::runtime_error);
109 
110  virtual tipus_capsaleres capsaleres() const;
111 
112 protected:
113  using CosResposta::envia;
114 private:
118  std::string entity_tag() const;
119 
124  friend std::ostream& operator<<(std::ostream& os, const Recurs & r) {
125  return os << "Recurs ( Petició: " << r.peticio()
126  << ", Disc: " << r.fisica()
127  //<< ", En servidor: " << std::string(r.publica())
128  << " )";
129  }
130 
133 };
134 
135 } // ns tfc
136 
137 #endif // _RECURS_H_
138 
139 // vim:set ts=4 et ai: //