-
-
Notifications
You must be signed in to change notification settings - Fork 53
/
Copy path_dirent.h
128 lines (106 loc) · 3.95 KB
/
_dirent.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*
* Copyright (C) 2018-2021 Matthieu Gautier <mgautier@kymeria.fr>
* Copyright (C) 2020 Veloman Yankan
* Copyright (C) 2006 Tommi Maekitalo
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
* NON-INFRINGEMENT. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#ifndef ZIM_DIRENT_H
#define ZIM_DIRENT_H
#include <string>
#include <zim/zim.h>
#include <exception>
#include <memory>
#include "zim_types.h"
#include "debug.h"
namespace zim
{
class Buffer;
class InvalidSize : public std::exception {};
class Dirent
{
protected:
uint16_t mimeType;
uint32_t version;
cluster_index_t clusterNumber; // only used when redirect is false
blob_index_t blobNumber; // only used when redirect is false
entry_index_t redirectIndex; // only used when redirect is true
char ns;
std::string title;
std::string url;
std::string parameter;
public:
// these constants are put into mimeType field
static const uint16_t redirectMimeType = 0xffff;
static const uint16_t linktargetMimeType = 0xfffe;
static const uint16_t deletedMimeType = 0xfffd;
Dirent()
: mimeType(0),
version(0),
clusterNumber(0),
blobNumber(0),
redirectIndex(0),
ns('\0')
{}
bool isRedirect() const { return mimeType == redirectMimeType; }
bool isLinktarget() const { return mimeType == linktargetMimeType; }
bool isDeleted() const { return mimeType == deletedMimeType; }
bool isArticle() const { return !isRedirect() && !isLinktarget() && !isDeleted(); }
uint16_t getMimeType() const { return mimeType; }
uint32_t getVersion() const { return version; }
void setVersion(uint32_t v) { version = v; }
cluster_index_t getClusterNumber() const { return isRedirect() ? cluster_index_t(0) : clusterNumber; }
blob_index_t getBlobNumber() const { return isRedirect() ? blob_index_t(0) : blobNumber; }
entry_index_t getRedirectIndex() const { return isRedirect() ? redirectIndex : entry_index_t(0); }
char getNamespace() const { return ns; }
const std::string& getTitle() const { return title.empty() ? url : title; }
const std::string& getUrl() const { return url; }
std::string getLongUrl() const;
const std::string& getParameter() const { return parameter; }
size_t getDirentSize() const
{
size_t ret = (isRedirect() ? 12 : 16) + url.size() + parameter.size() + 2;
if (title != url)
ret += title.size();
return ret;
}
void setTitle(const std::string& title_)
{
title = title_;
}
void setUrl(char ns_, const std::string& url_)
{
ns = ns_;
url = url_;
}
void setParameter(const std::string& parameter_)
{
parameter = parameter_;
}
void setRedirect(entry_index_t idx)
{
redirectIndex = idx;
mimeType = redirectMimeType;
}
void setItem(uint16_t mimeType_, cluster_index_t clusterNumber_, blob_index_t blobNumber_)
{
mimeType = mimeType_;
clusterNumber = clusterNumber_;
blobNumber = blobNumber_;
}
};
}
#endif // ZIM_DIRENT_H