blob: 6fa60dd7b832ea4675d534774438b8565ac736cf [file] [log] [blame]
Alexander Afanasyevc74a6022011-08-15 20:01:35 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -07002/*
Alexander Afanasyevcfdc14f2013-03-15 14:38:44 -07003 * Copyright (c) 2011-2013 University of California, Los Angeles
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -07004 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
19 * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
20 */
21
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070022#ifndef _NDN_CONTENT_OBJECT_HEADER_H_
23#define _NDN_CONTENT_OBJECT_HEADER_H_
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070024
Alexander Afanasyeve275cf82012-04-18 14:25:02 -070025#include "ns3/simple-ref-count.h"
Alexander Afanasyev9568f952012-04-05 16:09:14 -070026#include "ns3/nstime.h"
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -070027#include "ns3/packet.h"
Alexander Afanasyeve4795ae2013-07-11 20:01:31 -070028#include "ns3/ptr.h"
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070029
Alexander Afanasyeve4795ae2013-07-11 20:01:31 -070030#include <ns3/ndn-name.h>
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070031
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070032namespace ns3 {
33namespace ndn {
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070034
35/**
Alexander Afanasyeve4795ae2013-07-11 20:01:31 -070036 * @ingroup Ndn
37 * @brief ContentObject header
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070038 */
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -070039class ContentObject : public SimpleRefCount<ContentObject>
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070040{
41public:
42 /**
Alexander Afanasyevb989b122013-07-10 17:15:46 -070043 * @brief Constructor
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070044 *
45 * Creates a null header
46 **/
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -070047 ContentObject (Ptr<Packet> payload = Create<Packet> ());
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070048
49 /**
Alexander Afanasyevb989b122013-07-10 17:15:46 -070050 * @brief Copy constructor
51 */
52 ContentObject (const ContentObject &other);
53
54 /**
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -070055 * \brief Set content object name
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070056 *
Alexander Afanasyevcc50d982013-03-30 19:09:10 -070057 * Sets name of the content object
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070058 **/
59 void
Alexander Afanasyevcc50d982013-03-30 19:09:10 -070060 SetName (Ptr<Name> name);
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070061
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -070062 /**
Alexander Afanasyevcc50d982013-03-30 19:09:10 -070063 * @brief Another, less efficient, variant of setting content object name
64 *
65 * Sets name of the content object
66 */
67 void
68 SetName (const Name &name);
69
70 /**
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -070071 * @brief Get name of the content object
72 */
Alexander Afanasyevcfdc14f2013-03-15 14:38:44 -070073 const Name&
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070074 GetName () const;
75
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -070076 /**
Alexander Afanasyev30f60e32012-07-10 14:21:16 -070077 * @brief Get smart pointer to the interest name (to avoid extra memory usage)
78 */
Alexander Afanasyevcfdc14f2013-03-15 14:38:44 -070079 Ptr<const Name>
Alexander Afanasyev30f60e32012-07-10 14:21:16 -070080 GetNamePtr () const;
81
82 /**
Alexander Afanasyev5d79e682012-11-19 14:12:23 -080083 * @brief Set content object timestamp
84 * @param timestamp timestamp
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -070085 */
Alexander Afanasyev5d79e682012-11-19 14:12:23 -080086 void
87 SetTimestamp (const Time &timestamp);
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070088
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -070089 /**
Alexander Afanasyev5d79e682012-11-19 14:12:23 -080090 * @brief Get timestamp of the content object
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -070091 */
Alexander Afanasyev5d79e682012-11-19 14:12:23 -080092 Time
93 GetTimestamp () const;
Alexander Afanasyev73f06f62013-03-15 15:41:38 -070094
Alexander Afanasyev5d79e682012-11-19 14:12:23 -080095 /**
96 * @brief Set freshness of the content object
97 * @param freshness Freshness, 0s means infinity
98 */
99 void
100 SetFreshness (const Time &freshness);
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -0700101
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -0700102 /**
Alexander Afanasyev5d79e682012-11-19 14:12:23 -0800103 * @brief Get freshness of the content object
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -0700104 */
Alexander Afanasyev5d79e682012-11-19 14:12:23 -0800105 Time
106 GetFreshness () const;
Alexander Afanasyev73f06f62013-03-15 15:41:38 -0700107
Alexander Afanasyevd6e5c5f2013-03-30 19:09:56 -0700108 /**
109 * @brief Set "fake" signature on the content object
110 * @param signature uint32_t number, simulating content object signature
111 *
112 * Values for the signature totally depend on the application
113 */
114 void
115 SetSignature (uint32_t signature);
116
117 /**
118 * @brief Get "fake" signature of the content object
119 *
120 * Values for the signature totally depend on the application
121 */
122 uint32_t
123 GetSignature () const;
124
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -0700125 //////////////////////////////////////////////////////////////////
Alexander Afanasyevb989b122013-07-10 17:15:46 -0700126 /**
127 * @brief Get payload of data packet
128 *
129 * This payload can also carry packet tags
130 */
131 void
132 SetPayload (Ptr<Packet> payload);
Alexander Afanasyev73f06f62013-03-15 15:41:38 -0700133
Alexander Afanasyevb989b122013-07-10 17:15:46 -0700134 /**
135 * @brief Set payload of data packet
136 *
137 * This payload can also carry packet tags
138 */
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700139 Ptr<const Packet>
Alexander Afanasyevb989b122013-07-10 17:15:46 -0700140 GetPayload () const;
141
142 /**
143 * @brief Get wire formatted packet
144 *
145 * If wire formatted packet has not been set before, 0 will be returned
146 */
147 inline Ptr<const Packet>
148 GetWire () const;
Alexander Afanasyev73f06f62013-03-15 15:41:38 -0700149
Alexander Afanasyevb989b122013-07-10 17:15:46 -0700150 /**
151 * @brief Set (cache) wire formatted packet
152 */
153 inline void
154 SetWire (Ptr<const Packet> packet) const;
155
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700156 /**
157 * @brief Print Interest in plain-text to the specified output stream
158 */
159 void
160 Print (std::ostream &os) const;
161
Alexander Afanasyevb989b122013-07-10 17:15:46 -0700162private:
163 // NO_ASSIGN
164 ContentObject &
165 operator = (const ContentObject &other) { return *this; }
166
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -0700167private:
Alexander Afanasyevcfdc14f2013-03-15 14:38:44 -0700168 Ptr<Name> m_name;
Alexander Afanasyev5d79e682012-11-19 14:12:23 -0800169 Time m_freshness;
170 Time m_timestamp;
Alexander Afanasyevd6e5c5f2013-03-30 19:09:56 -0700171 uint32_t m_signature; // 0, means no signature, any other value application dependent (not a real signature)
Alexander Afanasyevb989b122013-07-10 17:15:46 -0700172 Ptr<Packet> m_payload;
173
174 mutable Ptr<const Packet> m_wire;
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -0700175};
176
Alexander Afanasyevb4fee8b2012-06-06 12:54:26 -0700177/**
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700178 * @ingroup ndn-exceptions
Alexander Afanasyev73f06f62013-03-15 15:41:38 -0700179 * @brief Class for ContentObject parsing exception
Alexander Afanasyevb4fee8b2012-06-06 12:54:26 -0700180 */
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700181class ContentObjectException {};
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -0700182
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700183inline Ptr<const Packet>
184ContentObject::GetWire () const
185{
186 return m_wire;
187}
188
189inline void
190ContentObject::SetWire (Ptr<const Packet> packet) const
191{
192 m_wire = packet;
193}
194
195
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700196} // namespace ndn
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -0700197} // namespace ns3
198
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700199#endif // _NDN_CONTENT_OBJECT_HEADER_H_