summaryrefslogtreecommitdiff
path: root/connectivity/source/drivers/mork/MorkParser.hxx
blob: d16fc417dacd2c68cb2316751f752ff2ff6b0150 (plain)
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
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * Software License Agreement (BSD License)
 *
 * Copyright (c) 2006, ScalingWeb.com
 * All rights reserved.
 *
 * Redistribution and use of this software in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * * Redistributions of source code must retain the above
 *   copyright notice, this list of conditions and the
 *   following disclaimer.
 *
 * * Redistributions in binary form must reproduce the above
 *   copyright notice, this list of conditions and the
 *   following disclaimer in the documentation and/or other
 *   materials provided with the distribution.
 *
 * * Neither the name of ScalingWeb.com nor the names of its
 *   contributors may be used to endorse or promote products
 *   derived from this software without specific prior
 *   written permission of ScalingWeb.com.

 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef INCLUDED_CONNECTIVITY_SOURCE_DRIVERS_MORK_MORKPARSER_HXX
#define INCLUDED_CONNECTIVITY_SOURCE_DRIVERS_MORK_MORKPARSER_HXX

#include <rtl/ustring.hxx>

#include <string>
#include <map>
#include <set>
#include <vector>

#include "dllapi.h"

// Types

typedef std::map< int, std::string > MorkDict;
typedef std::map< int, int > MorkCells;               // ColumnId : ValueId
struct MorkRowMap { typedef std::map< int, MorkCells > Map; Map map; }; // Row id
struct RowScopeMap { typedef std::map< int, MorkRowMap > Map; Map map; }; // Row scope
struct MorkTableMap { typedef std::map< int, RowScopeMap > Map; Map map; }; // Table id
struct TableScopeMap { typedef std::map< int, MorkTableMap > Map; Map map; }; // Table Scope

// Error codes
enum MorkErrors
{
    NoError = 0,
    FailedToOpen,
    DefectedFormat
};


/// Class MorkParser

class LO_DLLPUBLIC_MORK MorkParser final
{
public:

    explicit MorkParser();

    /// Open and parse mork file

    bool open( const std::string &path );

    /// Returns all tables of specified scope

    MorkTableMap *getTables( int tableScope );

    /// Returns all rows under specified scope

    static MorkRowMap *getRows( int rowScope, RowScopeMap *table );

    /// Return value of specified value oid

    std::string const &getValue( int oid );

    /// Return value of specified column oid

    std::string const &getColumn( int oid );

    void retrieveLists(std::set<std::string>& lists);
    void getRecordKeysForListTable(std::string const & listName, std::set<int>& records);

    void dump();

    // All lists
    std::vector<OUString> lists_;

private: // Members

    void initVars();

    static bool isWhiteSpace( char c );
    char nextChar();

    static void parseScopeId( const std::string &TextId, int *Id, int *Scope );
    void setCurrentRow( int TableScope, int TableId, int RowScope, int RowId );

    // Parse methods
    bool parse();
    bool parseDict();
    bool parseComment();
    bool parseCell();
    bool parseTable();
    void parseMeta( char c );
    bool parseRow( int TableId, int TableScope );
    void parseGroup();

private: // Data

    // Columns in mork means value names
    MorkDict columns_;
    MorkDict values_;

    // All mork file data
    TableScopeMap mork_;
    MorkCells *currentCells_;

    // Error status of last operation
    MorkErrors error_;

    // All Mork data
    std::string morkData_;


    unsigned morkPos_;
    int nextAddValueId_;
    int defaultTableId_;

    // Indicates entity is being parsed
    enum class NP { Columns, Values, Rows } nowParsing_;

    MorkParser(const MorkParser &) = delete;
    MorkParser &operator=(const MorkParser &) = delete;

};

#endif // __MorkParser_h__

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */