summaryrefslogtreecommitdiffstats
path: root/filters/kspread/qpro/libqpro/src/record_factory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'filters/kspread/qpro/libqpro/src/record_factory.cpp')
-rw-r--r--filters/kspread/qpro/libqpro/src/record_factory.cpp83
1 files changed, 83 insertions, 0 deletions
diff --git a/filters/kspread/qpro/libqpro/src/record_factory.cpp b/filters/kspread/qpro/libqpro/src/record_factory.cpp
new file mode 100644
index 000000000..ed6e86174
--- /dev/null
+++ b/filters/kspread/qpro/libqpro/src/record_factory.cpp
@@ -0,0 +1,83 @@
+#include <qpro/common.h>
+
+#include <iostream>
+
+#include <qpro/record_factory.h>
+
+#define NEWFUNC(x) static QpRec* NEW_##x (TQP_INT16 pLen, QpIStream& pIn) { return new x (pLen, pIn); }
+
+NEWFUNC(QpRecBof)
+NEWFUNC(QpRecBop)
+NEWFUNC(QpRecEof)
+NEWFUNC(QpRecEmptyCell)
+NEWFUNC(QpRecFloatingPointCell)
+NEWFUNC(QpRecFormulaCell)
+NEWFUNC(QpRecIntegerCell)
+NEWFUNC(QpRecLabelCell)
+NEWFUNC(QpRecPageName)
+NEWFUNC(QpRecPassword)
+NEWFUNC(QpRecRecalcMode)
+NEWFUNC(QpRecRecalcOrder)
+
+struct Record
+{
+ TQP_INT16 Type;
+ TQP_INT16 Len;
+ QpRec* (*Func)(TQP_INT16, QpIStream&);
+};
+
+
+// The functions in the Record table below (NEW_QpRecBof etc.)
+// come from the NEWFUNC #define above
+
+static Record gRecord[] =
+{
+ {QpBof, 2, NEW_QpRecBof},
+ {QpEof, 0, NEW_QpRecEof},
+ {QpRecalcMode, 1, NEW_QpRecRecalcMode},
+ {QpRecalcOrder, 1, NEW_QpRecRecalcOrder},
+ {QpEmptyCell, 6, NEW_QpRecEmptyCell},
+ {QpIntegerCell, 8, NEW_QpRecIntegerCell},
+ {QpFloatingPointCell, 14, NEW_QpRecFloatingPointCell},
+ {QpLabelCell, 0, NEW_QpRecLabelCell},
+ {QpFormulaCell, 0, NEW_QpRecFormulaCell},
+ {QpBop, 0, NEW_QpRecBop},
+ {QpPageName, 0, NEW_QpRecPageName},
+ {QpPassword, 0, NEW_QpRecPassword},
+ {0, 0, 0}
+};
+
+QpRecFactory::QpRecFactory(QpIStream& pIn)
+ : cIn(pIn)
+{
+}
+
+QpRecFactory::~QpRecFactory()
+{
+}
+
+QpRec*
+QpRecFactory::nextRecord()
+{
+ TQP_INT16 lType;
+ TQP_INT16 lLen;
+ QpRec* lResult=0;
+
+ cIn >> lType >> lLen;
+
+ for( Record* lRecord=gRecord; lResult == 0 ; ++lRecord )
+ {
+ if( lRecord->Func == 0 )
+ {
+ lResult = new QpRecUnknown( lType, lLen, cIn );
+ }
+ else
+ if( lRecord->Type == lType )
+ {
+ // ??? check length
+ lResult = lRecord->Func(lLen, cIn);
+ }
+ }
+
+ return lResult;
+}