1 /******************************************************************************
2  * $Id: ogr_xls.h bc3d9f5351962c422f3e57a9ab1a251d91659192 2020-05-09 21:07:14 +0200 Even Rouault $
3  *
4  * Project:  XLS Translator
5  * Purpose:  Definition of classes for OGR .xls driver.
6  * Author:   Even Rouault, even dot rouault at spatialys.com
7  *
8  ******************************************************************************
9  * Copyright (c) 2011-2012, Even Rouault <even dot rouault at spatialys.com>
10  *
11  * Permission is hereby granted, free of charge, to any person obtaining a
12  * copy of this software and associated documentation files (the "Software"),
13  * to deal in the Software without restriction, including without limitation
14  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
15  * and/or sell copies of the Software, and to permit persons to whom the
16  * Software is furnished to do so, subject to the following conditions:
17  *
18  * The above copyright notice and this permission notice shall be included
19  * in all copies or substantial portions of the Software.
20  *
21  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
24  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
27  * DEALINGS IN THE SOFTWARE.
28  ****************************************************************************/
29 
30 #ifndef OGR_XLS_H_INCLUDED
31 #define OGR_XLS_H_INCLUDED
32 
33 #include "ogrsf_frmts.h"
34 
35 /************************************************************************/
36 /*                             OGRXLSLayer                              */
37 /************************************************************************/
38 
39 class OGRXLSDataSource;
40 
41 class OGRXLSLayer final: public OGRLayer, public OGRGetNextFeatureThroughRaw<OGRXLSLayer>
42 {
43     OGRXLSDataSource*  poDS;
44     OGRFeatureDefn*    poFeatureDefn;
45 
46     char              *pszName;
47     int                iSheet;
48     bool               bFirstLineIsHeaders;
49     int                nRows;
50     unsigned short     nCols;
51 
52     int                nNextFID;
53 
54     OGRFeature *       GetNextRawFeature();
55 
56     void               DetectHeaderLine(const void* xlshandle);
57     void               DetectColumnTypes(const void* xlshandle,
58                                          int* paeFieldTypes);
59 
60   public:
61                         OGRXLSLayer(OGRXLSDataSource* poDSIn,
62                                     const char* pszSheetname,
63                                     int iSheetIn,
64                                     int nRowsIn,
65                                     unsigned short nColsIn);
66                         virtual ~OGRXLSLayer();
67 
68     virtual void                ResetReading() override;
69     DEFINE_GET_NEXT_FEATURE_THROUGH_RAW(OGRXLSLayer)
70 
71     virtual OGRFeatureDefn *    GetLayerDefn() override;
72     virtual GIntBig             GetFeatureCount( int bForce = TRUE ) override;
73 
GetName()74     virtual const char         *GetName() override { return pszName; }
GetGeomType()75     virtual OGRwkbGeometryType  GetGeomType() override { return wkbNone; }
76 
77     virtual int                 TestCapability( const char * ) override;
78 
GetSpatialRef()79     virtual OGRSpatialReference *GetSpatialRef() override { return nullptr; }
80 };
81 
82 /************************************************************************/
83 /*                           OGRXLSDataSource                           */
84 /************************************************************************/
85 
86 class OGRXLSDataSource final: public OGRDataSource
87 {
88     char*               pszName;
89 
90     OGRLayer**          papoLayers;
91     int                 nLayers;
92 
93     const void*         xlshandle;
94 
95     CPLString           m_osANSIFilename;
96 #ifdef WIN32
97     CPLString           m_osTempFilename;
98 #endif
99   public:
100                         OGRXLSDataSource();
101                         virtual ~OGRXLSDataSource();
102 
103     int                 Open( const char * pszFilename,
104                               int bUpdate );
105 
GetName()106     virtual const char*         GetName() override { return pszName; }
107 
GetLayerCount()108     virtual int                 GetLayerCount() override { return nLayers; }
109     virtual OGRLayer*           GetLayer( int ) override;
110 
111     virtual int                 TestCapability( const char * ) override;
112 
113     const void                 *GetXLSHandle();
114 };
115 
116 /************************************************************************/
117 /*                             OGRXLSDriver                             */
118 /************************************************************************/
119 
120 class OGRXLSDriver final: public OGRSFDriver
121 {
122   public:
123                 virtual ~OGRXLSDriver();
124 
125     virtual const char*         GetName() override;
126     virtual OGRDataSource*      Open( const char *, int ) override;
127     virtual int                 TestCapability( const char * ) override;
128 };
129 
130 #endif /* ndef OGR_XLS_H_INCLUDED */
131