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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
|
/*
This file is part of libkabc.
Copyright (c) 2004 Szombathelyi Gyorgy <gyurco@freemail.hu>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#ifndef _K_LDIF_H_
#define _K_LDIF_H_
#include <qstring.h>
#include <qcstring.h>
#include <qmemarray.h>
#include <kdelibs_export.h>
namespace KABC {
/**
* LDIF
* LDIF implements an RFC 2849 compliant LDIF parser. LDIF files are used to
* represent directory information on LDAP-based servers, or to describe a set
* of changes which are to be applied to a directory.
*/
class KABC_EXPORT LDIF
{
public:
enum ParseVal{ None, NewEntry, EndEntry, Item, Control, Err, MoreData };
enum EntryType{ Entry_None, Entry_Add, Entry_Del, Entry_Mod, Entry_Modrdn };
enum ModType{ Mod_None, Mod_Add, Mod_Replace, Mod_Del };
LDIF();
virtual ~LDIF();
/**
* Assembles fieldname and value into a valid LDIF line, BASE64 encodes the
* value if neccessary and optionally splits into more lines.
* @param fieldname The name of the entry.
* @param value The value of the entry.
* @param linelen Maximum length of the lines in the result.
* @param url If true, encode value as url ( use :< ).
*/
static QCString assembleLine( const QString &fieldname,
const QByteArray &value, uint linelen=0, bool url=false );
/**
* This is the same as the above function, the only difference that
* this accepts QCString as the value.
*/
static QCString assembleLine( const QString &fieldname,
const QCString &value, uint linelen=0, bool url=false );
/**
* This is the same as the above function, the only difference that
* this accepts QString as the value.
*/
static QCString assembleLine( const QString &fieldname,
const QString &value, uint linelen=0, bool url=false );
/**
* Splits one line from an LDIF file to attribute and value components.
* @returns true if value is an URL, false otherwise
*/
static bool splitLine( const QCString &line, QString &fieldname, QByteArray &value );
/**
* Splits a control specification (without the "control:" directive)
* @param line is the control directive
* @param oid will contain the OID
* @param critical will contain the criticality of control
* @param value is the control value
*/
static bool splitControl( const QCString &line, QString &oid, bool &critical,
QByteArray &value );
/**
* Starts the parsing of a new LDIF
*/
void startParsing();
/**
* Process one LDIF line
*/
ParseVal processLine();
/**
* Process the LDIF until a complete item can be returned
* @returns NewEntry if a new DN encountered,
* Item if a new item returned,
* Err if the LDIF contains error,
* EndEntry if the parser reached the end of the current entry
* and MoreData if the parser encountered the end of the current chunk of
* the LDIF. If you want to finish the parsing after receiving
* MoreData, then call endLDIF(), so the parser can safely flush
* the current entry.
*/
ParseVal nextItem();
/**
* Sets a chunk of LDIF. Call before startParsing(), or if nextItem() returned
* MoreData.
*/
void setLDIF( const QByteArray &ldif ) { mLdif = ldif; mPos = 0; }
/**
* Indicates the end of the LDIF file/stream. Call if nextItem() returned
* MoreData, but actually you don't have more data.
*/
void endLDIF();
/**
* Returns the requested LDAP operation extracted from the current entry.
*/
EntryType entryType() const { return mEntryType; }
/**
* Returns the LDAP modify request type if entryType() returned Entry_Mod.
*/
int modType() const { return mModType; }
/**
* Returns the Distinguished Name of the current entry.
*/
const QString& dn() const { return mDn; }
/**
* Returns the new Relative Distinguished Name if modType() returned Entry_Modrdn.
*/
const QString& newRdn() const { return mNewRdn; }
/**
* Returns the new parent of the entry if modType() returned Entry_Modrdn.
*/
const QString& newSuperior() const { return mNewSuperior; }
/**
* Returns if the delete of the old RDN is required.
*/
bool delOldRdn() const { return mDelOldRdn; }
/**
* Returns the attribute name.
*/
const QString& attr() const { return mAttr; }
/**
* Returns the attribute value.
*/
const QByteArray& val() const { return mVal; }
/**
* Returns if val() is an url
*/
bool isUrl() const { return mUrl; }
/**
* Returns the criticality level when modType() returned Control.
*/
bool critical() const { return mCritical; }
/**
* Returns the OID when modType() returned Control.
*/
const QString& oid() const { return mOid; }
/**
* Returns the line number which the parser processes.
*/
uint lineNo() const { return mLineNo; }
private:
int mModType;
bool mDelOldRdn, mUrl;
QString mDn,mAttr,mNewRdn,mNewSuperior, mOid;
QByteArray mLdif, mVal;
EntryType mEntryType;
bool mIsNewLine, mIsComment,mCritical;
ParseVal mLastParseVal;
uint mPos,mLineNo;
QCString line;
class LDIFPrivate;
LDIFPrivate *d;
};
}
#endif
|