blob: 92c3054780eeb35a7134733d6e46c748f98f18a1 [file] [log] [blame]
Alexander Afanasyevd09871f2013-01-04 22:36:37 -08001/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
2/*
3 * Copyright (c) 2012-2013 University of California, Los Angeles
4 *
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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
19 * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
20 */
21
Zhenkai Zhuf47109b2013-01-02 19:41:34 -080022#ifndef CCNX_NAME_H
23#define CCNX_NAME_H
24#include <boost/shared_ptr.hpp>
25#include "ccnx-common.h"
26
27namespace Ccnx {
28
Zhenkai Zhucb2d0dd2013-01-03 14:10:48 -080029class CcnxCharbuf;
30typedef boost::shared_ptr<CcnxCharbuf> CcnxCharbufPtr;
31
Zhenkai Zhuf47109b2013-01-02 19:41:34 -080032// This class is mostly used in CcnxWrapper; users should not be directly using this class
33// The main purpose of this class to is avoid manually create and destroy charbuf everytime
34class CcnxCharbuf
35{
36public:
37 CcnxCharbuf();
38 CcnxCharbuf(ccn_charbuf *buf);
Zhenkai Zhub0adefe2013-01-04 21:56:38 -080039 CcnxCharbuf(const CcnxCharbuf &other);
Zhenkai Zhuf47109b2013-01-02 19:41:34 -080040 ~CcnxCharbuf();
41
42 // expose internal data structure, use with caution!!
43 ccn_charbuf *
44 getBuf() { return m_buf; }
Zhenkai Zhucb2d0dd2013-01-03 14:10:48 -080045 static CcnxCharbufPtr Null;
Zhenkai Zhuf47109b2013-01-02 19:41:34 -080046
Alexander Afanasyevd09871f2013-01-04 22:36:37 -080047 const unsigned char *
48 buf () const
49 { return m_buf->buf; }
50
51 size_t
52 length () const
53 { return m_buf->length; }
Alexander Afanasyev50547892013-01-19 22:03:45 -080054
Zhenkai Zhub0adefe2013-01-04 21:56:38 -080055private:
56 void init(ccn_charbuf *buf);
57
Zhenkai Zhuf47109b2013-01-02 19:41:34 -080058protected:
59 ccn_charbuf *m_buf;
60};
61
Zhenkai Zhuf47109b2013-01-02 19:41:34 -080062
63struct NameException:
64 virtual boost::exception, virtual exception {};
Zhenkai Zhucb2d0dd2013-01-03 14:10:48 -080065
Zhenkai Zhuf47109b2013-01-02 19:41:34 -080066class Name
67{
68public:
69 Name();
70 Name(const string &name);
71 Name(const vector<Bytes> &comps);
72 Name(const Name &other);
73 Name(const unsigned char *data, const ccn_indexbuf *comps);
Alexander Afanasyevd09871f2013-01-04 22:36:37 -080074 Name (const unsigned char *buf, const size_t length);
Zhenkai Zhuf47109b2013-01-02 19:41:34 -080075 virtual ~Name() {}
76
77 CcnxCharbufPtr
78 toCcnxCharbuf() const;
79
Alexander Afanasyevd09871f2013-01-04 22:36:37 -080080 operator CcnxCharbufPtr () const { return toCcnxCharbuf (); }
81
Zhenkai Zhuf47109b2013-01-02 19:41:34 -080082 Name &
Alexander Afanasyev66f4c492013-01-20 23:32:50 -080083 appendComp(const Name &comp);
84
85 Name &
Zhenkai Zhuf47109b2013-01-02 19:41:34 -080086 appendComp(const Bytes &comp);
87
88 Name &
89 appendComp(const string &compStr);
90
Alexander Afanasyevc9eb68f2013-01-07 13:40:00 -080091 Name &
Alexander Afanasyev50547892013-01-19 22:03:45 -080092 appendComp(const void *buf, size_t size);
Alexander Afanasyevc9eb68f2013-01-07 13:40:00 -080093
94 /**
95 * Append int component
96 *
97 * Difference between this and appendComp call is that data is appended in network order
98 *
99 * Also, this function honors naming convention (%00 prefix is added)
100 */
101 Name &
102 appendComp(uint64_t number);
Alexander Afanasyev50547892013-01-19 22:03:45 -0800103
104 template<class T>
105 Name &
106 operator ()(const T &comp) { return appendComp (comp); }
107
Alexander Afanasyev49a30d02013-01-21 21:38:48 -0800108 Name &
109 operator ()(const void *buf, size_t size) { return appendComp (buf, size); }
110
Zhenkai Zhuf47109b2013-01-02 19:41:34 -0800111 int
112 size() const {return m_comps.size();}
113
114 Bytes
115 getComp(int index) const;
116
117 // return string format of the comp
118 // if all characters are printable, simply returns the string
119 // if not, print the bytes in hex string format
120 string
121 getCompAsString(int index) const;
122
Alexander Afanasyevc9eb68f2013-01-07 13:40:00 -0800123 uint64_t
124 getCompAsInt (int index) const;
125
Zhenkai Zhuf47109b2013-01-02 19:41:34 -0800126 Name
Zhenkai Zhucb2d0dd2013-01-03 14:10:48 -0800127 getPartialName(int start, int n = -1) const;
Zhenkai Zhuf47109b2013-01-02 19:41:34 -0800128
Zhenkai Zhucb2d0dd2013-01-03 14:10:48 -0800129 string
130 toString() const;
131
132 Name &
133 operator=(const Name &other);
134
135 bool
Zhenkai Zhu3b82d432013-01-03 22:48:40 -0800136 operator==(const string &str) const;
Zhenkai Zhucb2d0dd2013-01-03 14:10:48 -0800137
138 bool
Zhenkai Zhu3b82d432013-01-03 22:48:40 -0800139 operator!=(const string &str) const;
Zhenkai Zhucb2d0dd2013-01-03 14:10:48 -0800140
141 friend Name
142 operator+(const Name &n1, const Name &n2);
Zhenkai Zhuf47109b2013-01-02 19:41:34 -0800143
144protected:
145 vector<Bytes> m_comps;
146};
147
148ostream&
149operator <<(ostream &os, const Name &name);
150
Zhenkai Zhucb2d0dd2013-01-03 14:10:48 -0800151bool
152operator ==(const Name &n1, const Name &n2);
153
154bool
155operator !=(const Name &n1, const Name &n2);
156
157bool
158operator <(const Name &n1, const Name &n2);
159
160
Zhenkai Zhuf47109b2013-01-02 19:41:34 -0800161
162} // Ccnx
163#endif