Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: Diese Funktion ist in einigen Browsern möglicherweise nicht verfügbar.
#ifndef __XBASE_H__
#define __XBASE_H__
#include <QObject>
#include <QString>
#include <QStringList>
#include <QMessageBox>
#include <QVector>
#include <QMap>
#include "MyQVariant.h"
#include "dbf.h"
extern void xbase_add_path(QString);
extern void xbase_open_dbf(QString);
extern void xbase_select(int);
extern void xbase_print_field(QString);
class MyQMemoryTable
{
public:
MyQMemoryTable() { }
QString value_text;
};
class MyQWorkArea
{
public:
MyQWorkArea(QString);
void dbf_read_header(void);
void dbf_read_fields(void);
QString dbFile;
int dbHandle;
int dbVersion;
class QMap<QString , QVector<MyQMemoryTable> > content;
struct DB_HEADER db_buf, *db;
struct DB_FIELD *header;
int header_length;
int record_length;
};
namespace mydata
{
#ifdef __MAIN_RUN__
class QStringList data_paths;
class QVector<MyQWorkArea*> wa;
#else
extern class QStringList data_paths;
extern class QVector<MyQWorkArea*> wa;
#endif
}
#endif
#include <QObject>
#include <QString>
#include <QStringList>
#include <QMessageBox>
#include <QVector>
#include "MyQVariant.h"
#include "xbase.h"
extern "C" void DisplayErrorMessage(int line,char *msg)
{
QMessageBox* msgBox = new QMessageBox();
msgBox->setWindowTitle("Programmfehler!");
msgBox->setText(QString("Error: %1: %2").arg(line).arg(msg));
msgBox->exec();
}
void xbase_add_path(QString str)
{
mydata::data_paths << str;
}
void xbase_select(int w)
{
}
void xbase_open_dbf(QString str)
{
QString dbf;
if (!str.contains(".dbf"))
str = str + QString(".dbf");
int i;
FILE *data = NULL;
bool found = false;
for (i = 0; i < mydata::data_paths.count(); i++)
{
dbf = QString(mydata::data_paths.at(i) + "\\" + str);
if ((data = fopen(QString(dbf).toStdString().c_str(),"rb")) != NULL)
{
fclose(data);
found = true;
break;
}
}
if (found == false)
str = str + QString(" not found"); else
str = str + QString(" was found");
print_console(str);
MyQWorkArea *WA = new MyQWorkArea(dbf);
mydata::wa.append(WA);
}
MyQWorkArea::MyQWorkArea(QString dbf)
{
this->dbFile = dbf;
if ((dbHandle = open(dbf.toStdString().c_str(), O_RDONLY|O_BINARY)) == -1) {
msgbox("Fehler",QString("Kann Datei: %1\nnicht öffnen").arg(dbf));
return;
}
db = &db_buf;
dbf_read_header();
dbf_read_fields();
}
void MyQWorkArea::dbf_read_header(void)
{
if ((read(dbHandle, (char *)db, sizeof(struct DB_HEADER))) == -1 ) {
msgbox("Fehler!","kann dbf Header nicht lesen.");
return;
}
this->dbVersion = db->version;
this->header_length = rotate2b(db->header_length) / 32;
this->record_length = rotate2b(db->record_length);
}
void MyQWorkArea::dbf_read_fields(void)
{
struct DB_FIELD *hdr;
unsigned char *record;
class QMap<QString, int> field;
header = (struct DB_FIELD*) malloc(sizeof(struct DB_FIELD) * header_length);
if (header == NULL) {
msgbox("Fehler","kann keimn Speicher anfordern.");
return;
}
lseek(dbHandle, header_length, SEEK_SET);
char c[1];
int pos = 0;
int h;
while (1)
{
read(dbHandle,c,1);
if (c[0] == 0x0d) break;
pos++;
}
int psize = pos / sizeof(struct DB_FIELD);
psize--;
lseek(dbHandle, 0, SEEK_SET);
dbf_read_header();
print_console(QString("\n::> %1, %2").arg(pos).arg(psize));
for (hdr = header + 1; --header_length; hdr++)
{
if (psize-- < 1) break;
if((read(dbHandle, header, sizeof(struct DB_FIELD))) == -1) {
msgbox("Fehler","kann Feld nicht einlesen.");
return;
}
field.insert(QString((char*)header->field_name,header->length_binary);
//print_console(QString("---> %1 , %2").arg((char*)header->field_name).arg(header->length_binary));
}
if ((record = (unsigned char*) malloc(record_length + 1)) == NULL) {
perror("malloc");
exit(1);
}
record[record_length] = '\0';
char *flag_byte;
lseek(dbHandle, rotate2b(db->header_length), SEEK_SET);
if ( (flag_byte = (char*)malloc(1)) == NULL ) {
msgbox("Fehler!","kann kein Speicher zuweisen.");
exit(1);
}
if (read(dbHandle, flag_byte, 1) == -1) {
msgbox("Fehler","reading Flag Byte");
exit(1);
}
*flag_byte = *(record + record_length - 1);
MyQMemoryTable mt;
QVector<class MyQMemoryTable> memtab;
for (int i = 0; i < db->records; i++)
{
read(dbHandle, record, record_length);
record[record_length-1] = '\0';
print_console(QString(":::>> %1").arg((char*)record));
for (int f = 0; f < field.count(); f++)
{
}
mt.value_text = QString((char*)record);
memtab.push_back(mt);
}
//mt.value_text = "Fritz"; memtab.push_back(mt);
//mt.value_text = "Alfonso"; memtab.push_back(mt);
//print_console("append");
content.insert(QString((char*)header->field_name),memtab);
free(record);
//print_console(content["vorname"].at(0).value_text);
//print_console(content["vorname"].at(1).value_text);
}
void xbase_print_field(QString field)
{
MyQWorkArea *wa = mydata::wa.at(0);
print_console(wa->dbFile);
print_console(wa->record_length);
print_console(wa->content[field].at(1).value_text);
}