// written by Thomas Sax, Jan.2022
#include "datei.h"


// -------------------------------------------------------------------------------------------------
// ------------------------------------------------------ create csv file -------------------------------
// -------------------------------------------------------------------------------------------------

QByteArray datei_writeArray, datei_tempArray;

void csv_startCreatingFile(void)
{
    datei_writeArray.clear();
    datei_tempArray.clear();
}

void csv_addTextToFile(QString myText)
{
    datei_writeArray.append(myText.toLatin1());
    datei_writeArray.append(FILESEPERATOR);
}

void csv_addIntToFile(int myValue)
{
    //qulonglong ullt=12345678901234567890;   // max 1,844 x10^19
    datei_tempArray.setNum(myValue,10);  // accepted types: short, ushort, int, uint,
                            // qlonglong, qulonglong, float, double
                            // numerbase can be 2...36(!),10=dec

    datei_writeArray.append(datei_tempArray);
    datei_writeArray.append(FILESEPERATOR);
}

void csv_addUintToFile(uint myValue)
{
    datei_tempArray.setNum(myValue,10);
    datei_writeArray.append(datei_tempArray);
    datei_writeArray.append(FILESEPERATOR);
}


void csv_addLongvalToFile(qlonglong myValue)
{
    datei_tempArray.setNum(myValue,10);
    datei_writeArray.append(datei_tempArray);
    datei_writeArray.append(FILESEPERATOR);
}

void csv_addUlongvalToFile(qulonglong myValue)
{
    datei_tempArray.setNum(myValue,10);
    datei_writeArray.append(datei_tempArray);
    datei_writeArray.append(FILESEPERATOR);
}

/*
void csv_addCurrentTimeToFile(void)
{
    uint8_t hour, minute, sec, ui8buf[20];
    char buf[20];

    config_getSysTime(&hour, &minute, &sec);
    GetTimeString(hour, minute, sec, 0, 1, ui8buf);
    for (uint8_t nn=0; nn<20; nn++)
        buf[nn]=char(ui8buf[nn]);
    datei_writeArray.append(buf,8);             // time string
    datei_writeArray.append(FILESEPERATOR);

}

void csv_addCurrentDateToFile(void)
{
    uint16_t year;
    uint8_t month, day, ui8buf[20];
    char buf[20];

    config_getSystemDate(&year, &month, &day);
    //qDebug()<<"date year: "<<year;
    GetDateString(day, month, 0x20, uint8_t(year%100), 0, 0, ui8buf);
    for (uint8_t nn=0; nn<20; nn++)
        buf[nn]=char(ui8buf[nn]);
    datei_writeArray.append(buf, 10);            // date string
    datei_writeArray.append(NEWLINEINFILE);

}
*/

void csv_addNewlineToFile(void)
{
    datei_writeArray.chop(1);      // Komma weg
    datei_writeArray.append(NEWLINEINFILE);
}

QByteArray csv_readbackArray(void)
{
    return datei_writeArray;
}


/*
QByteArray csv_writeContent_testValues(void)
{
    QByteArray myBA, tmpBA;
    uint8_t modCount=5, modAddr=23;
    uint8_t hour, minute, sec, month, day, ui8buf[20];
    uint16_t year, modType=45678;
    char buf[20];
    uint32_t modNrDIs=1234567890;
    uint8_t  modNrAIs=4, modNrCtr=2, modNrDOs=8;
    int       modNrAOs=-2;
       
    myBA.clear();
    tmpBA.clear();
    myBA.append("scan time");
    myBA.append(FILESEPERATOR);
    
    datei_getSysTime(&hour, &minute, &sec);
    GetTimeString(hour, minute, sec, 0, 1, ui8buf);        
    for (uint8_t nn=0; nn<20; nn++)
        buf[nn]=char(ui8buf[nn]);
    myBA.append(buf,8);             // time string
    myBA.append(FILESEPERATOR);
    
    datei_getSystemDate(&year, &month, &day);
    //qDebug()<<"date year: "<<year;
    GetDateString(day, month, 0x20, uint8_t(year%100), 0, 0, ui8buf);        
    for (uint8_t nn=0; nn<20; nn++)
        buf[nn]=char(ui8buf[nn]);          
    myBA.append(buf, 10);            // date string
    myBA.append(NEWLINEINFILE);
    
    myBA.append("number of modules");
    myBA.append(FILESEPERATOR);
    tmpBA.setNum(modCount,10);   //2nd para = number base 2, 8, 10 or 16 (bin, oct, dec, hex)
    myBA.append(tmpBA);
    myBA.append(NEWLINEINFILE);

    myBA.append("busaddr");
    myBA.append(FILESEPERATOR);
    myBA.append("type");
    myBA.append(FILESEPERATOR);
    myBA.append("NrOfDI");
    myBA.append(FILESEPERATOR);
    myBA.append("NrOfAI");
    myBA.append(FILESEPERATOR);
    myBA.append("NrOfCtrIn");
    myBA.append(FILESEPERATOR);
    myBA.append("NrOfDO");
    myBA.append(FILESEPERATOR);
    myBA.append("NrOfAO");
    myBA.append(NEWLINEINFILE);

    tmpBA.setNum(modAddr,10);
    myBA.append(tmpBA);
    myBA.append(FILESEPERATOR);
    tmpBA.setNum(modType,10);
    myBA.append(tmpBA);
    myBA.append(FILESEPERATOR);
    tmpBA.setNum(modNrDIs,10);
    myBA.append(tmpBA);
    myBA.append(FILESEPERATOR);
    tmpBA.setNum(modNrAIs,10);
    myBA.append(tmpBA);
    myBA.append(FILESEPERATOR);
    tmpBA.setNum(modNrCtr,10);
    myBA.append(tmpBA);
    myBA.append(FILESEPERATOR);
    tmpBA.setNum(modNrDOs,10);
    myBA.append(tmpBA);
    myBA.append(FILESEPERATOR);
    tmpBA.setNum(modNrAOs,10);
    myBA.append(tmpBA);
    myBA.append(NEWLINEINFILE);
    return myBA;
}
*/


// -------------------------------------------------------------------------------------------------
// ------------------------------------------------------ parse csv file -------------------------------
// -------------------------------------------------------------------------------------------------

// first: QByteArray datei_readFromFile(QString filename);


uint32_t csv_nrOfEntriesInFile(QByteArray readFromFile)
{
    // count sequences between FILESEPERATOR and NEWLINEINFILE    
    uint32_t   filSize=0, pp=0;
    char       oneByt=0;
    
    int  filLen=readFromFile.size();
    if(filLen>1)
        filSize=uint32_t(filLen);
    else
        return 0;
        
    // 1) find position of seperators
    for (uint32_t ii=0; ii<filSize; ii++)
    {
        oneByt=readFromFile[ii];
        if (oneByt==FILESEP1 || oneByt==FILESEP2 || oneByt==NEWLINEINFILE)
            pp++;
    }
    // now: pp = number of seperators
    // oneByt = last byte in file. If it's not a seperator then 
    // there's one more entry (last entry without termination)
    if (oneByt !=FILESEP1 && oneByt !=FILESEP2 && oneByt !=NEWLINEINFILE)
        pp++;
    //qDebug()<<"csv: nr of sequences="<< pp;
    return pp;
}

QByteArray csv_getOneFileSequence(QByteArray sourceFile, uint32_t sequNr)
{
    // seperate file content in single sequences between FILESEPERATOR and NEWLINEINFILE
    // and return "entryNr" - entry 
    // for this first step leave data type QByteArray
    // 2nd step can change in numbers and strings
    QByteArray sequence;
    uint32_t   sepPos[MAXNUMBEROFSEQUENCES];
    uint32_t   filSize=0, pp=0, ii, start=0, ende=0;
    char       oneByt;
    int        filLen, mm; 
    
    filLen=sourceFile.size();
    //qDebug()<<"fillen="<< filLen;
    if(filLen<10)
        return "";
    filSize=uint32_t(filLen);

    if (sequNr>MAXNUMBEROFSEQUENCES)
        return "";    

    // 1) find position of seperators
    for (ii=0; ii<filSize; ii++)
    {
        oneByt=sourceFile[ii];
        if (oneByt==FILESEP1 || oneByt==FILESEP2 || oneByt==NEWLINEINFILE)
        {
            sepPos[pp++]=ii;
        }
    }
    // now: pp = number of entries
    //qDebug()<<"nr of seperators="<< pp;

    if (sequNr>=pp)
        return "";

    // 2) get sequence
    if (sequNr==0)
    {
        start=0;
        ende=sepPos[sequNr];        
    } else
    if (sequNr>0)
    {
        start=sepPos[sequNr-1]+1;
        ende=sepPos[sequNr];    
    }    

    //qDebug()<<"datei getOneFileSequence start/ende: "<<start << " " << ende;
    if (start>=ende)
        return "";
        //return "-err3-";
    sequence.clear();
    //batmp.clear();
    pp=0;
    for (ii=start; ii<ende; ii++)
    {
        mm=int(ii);
        if (mm>=int(filSize))
            mm=0;
        oneByt=sourceFile.at(mm);
        sequence.append(oneByt);
    }    
    return sequence;    
}

int csv_getEntryAsInt(QByteArray sourceFile, uint32_t sequNr)
{
    QByteArray myBA, myVA;
    int        entry=0;
    bool ok;

    myVA.clear();
    myBA = csv_getOneFileSequence(sourceFile, sequNr);
    //qDebug()<<"datei getEntryAsInt, sequence: " << myBA;

    entry=myBA.toInt(&ok,16);
    if (ok)
    {
        //qDebug()<<"datei getEntryAsInt, number: " << entry;
        return entry;
    }
    //qDebug()<<"datei getEntryAsInt, error " << myBA;
    return 0;
}

int32_t csv_getEntryAsLong(QByteArray sourceFile, uint32_t sequNr)
{
    QByteArray myBA = csv_getOneFileSequence(sourceFile, sequNr);
    long        entry=0;
    bool ok;
    
    entry=myBA.toLong(&ok,10);
    if (ok)
        return entry;
    return 0;
}

uint8_t csv_getEntryAsUshort(QByteArray sourceFile, uint32_t sequNr)
{
    QByteArray myBA = csv_getOneFileSequence(sourceFile, sequNr);
    uint8_t        entry=0;
    bool ok;
    
    entry=uint8_t(myBA.toUShort(&ok,10));
    if (ok)
        return entry;
    return 0;
}

uint16_t csv_getEntryAsUint(QByteArray sourceFile, uint32_t sequNr)
{
    QByteArray myBA = csv_getOneFileSequence(sourceFile, sequNr);
    uint16_t        entry=0;
    bool ok;
    
    entry=uint16_t(myBA.toUInt(&ok,10));
    if (ok)
        return entry;
    return 0;
}

uint32_t csv_getEntryAsUlong(QByteArray sourceFile, uint32_t sequNr)
{
    QByteArray myBA = csv_getOneFileSequence(sourceFile, sequNr);
    uint32_t        entry=0;
    bool ok;
    
    entry=myBA.toULong(&ok,10);
    if (ok)
        return entry;
    return 0;
}

uint64_t csv_getEntryAs2Ulong(QByteArray sourceFile, uint32_t sequNr)
{
    QByteArray myBA = csv_getOneFileSequence(sourceFile, sequNr);
    uint64_t        entry=0;
    bool ok;
    
    entry=myBA.toULongLong(&ok,10);
    if (ok)
        return entry;
    return 0;
}



QString csv_getEntryAsString(QByteArray sourceFile, uint32_t sequNr)
{
    QByteArray myBA = csv_getOneFileSequence(sourceFile, sequNr);
    QString     entry;

    //qDebug()<<"datei getEntryAsString, sequence: " << myBA;
    entry=myBA.toStdString().c_str();
    return entry;
}

// -------------------------------------------------------------------------------------------------
// ------------------------------------------------------ create Json file -------------------------------
// -------------------------------------------------------------------------------------------------

/*
 example
QString str = "{"
                  "  \"Herausgeber\": \"Xema\","
                  "  \"Nummer\": \"1234-5678-9012-3456\","
                  "  \"Deckung\": 2e+6,"
                  "  \"Währung\": \"EURO\","
                  "  \"Inhaber\": {"
                  "    \"Name\": \"Mustermann\","
                  "    \"Vorname\": \"Max\","
                  "    \"männlich\": true,"
                  "    \"Hobbys\": [ \"Reiten\", \"Golfen\", \"Lesen\" ],"
                  "    \"Alter\": 42,"
                  "    \"Kinder\": [],"
                  "    \"Partner\": null"
                  "  }"
                  "}";

*/

QString myJsonCon;
QString tmpStr;

void json_startRecord(void)
{
    myJsonCon.clear();
    tmpStr.clear();
    myJsonCon.append('{');
}

void json_enterIntToRecord(QString attribute, ulong i_value)
{
    tmpStr.clear();
    myJsonCon.append('"');
    myJsonCon.append(attribute);
    myJsonCon.append('"');
    myJsonCon.append(':');
    tmpStr.setNum(i_value);
    myJsonCon.append(tmpStr);
    myJsonCon.append(',');
    myJsonCon.append(NEWLINEINFILE);
}

void json_enterTextToRecord(QString attribute, QString txt_value)
{
    myJsonCon.append('"');
    myJsonCon.append(attribute);
    myJsonCon.append('"');
    myJsonCon.append(':');
    myJsonCon.append('"');
    myJsonCon.append(txt_value);
    myJsonCon.append('"');
    myJsonCon.append(',');
    myJsonCon.append(NEWLINEINFILE);
}
/*
void json_addCurrentTimeToRecord(QString attribute)
{
    uint8_t hour, minute, sec, ui8buf[20];
    //char buf[20];

    myJsonCon.append('"');
    myJsonCon.append(attribute);
    myJsonCon.append('"');
    myJsonCon.append(':');
    myJsonCon.append('"');

    datei_getSysTime(&hour, &minute, &sec);
    GetTimeString(hour, minute, sec, 0, 1, ui8buf);
    for (uint8_t nn=0; nn<8; nn++)
        myJsonCon.append(ui8buf[nn]);

    myJsonCon.append('"');
    myJsonCon.append(',');
    myJsonCon.append(NEWLINEINFILE);

}

void json_addCurrentDateToRecord(QString attribute)
{
    uint16_t year;
    uint8_t month, day, ui8buf[20];
    //char buf[20];

    myJsonCon.append('"');
    myJsonCon.append(attribute);
    myJsonCon.append('"');
    myJsonCon.append(':');
    myJsonCon.append('"');

    datei_getSystemDate(&year, &month, &day);
    GetDateString(day, month, 0x20, uint8_t(year%100), 0, 0, ui8buf);
    for (uint8_t nn=0; nn<10; nn++)
        myJsonCon.append(ui8buf[nn]);

    myJsonCon.append('"');
    myJsonCon.append(',');
    myJsonCon.append(NEWLINEINFILE);

}
*/

void json_enterArrayToRecord(QString attribute, uint8_t *buf, ulong nrofVals)
{
    // add array of numbers with "nrofVals" elements

    myJsonCon.append('"');
    myJsonCon.append(attribute);
    myJsonCon.append('"');
    myJsonCon.append(':');
    myJsonCon.append('[');  // eckig!!!
    for (ulong ul=0; ul<nrofVals; ul++)
    {
        tmpStr.setNum(buf[ul]);
        myJsonCon.append(tmpStr);
        myJsonCon.append(',');
    }
    myJsonCon.chop(1);      // Komma weg
    myJsonCon.append(']');  // eckig!!!
    myJsonCon.append(',');
    myJsonCon.append(NEWLINEINFILE);
}

void json_enterStructToRecord(QString attribute)
{
    // every call must be concluded with "json_finishFile()"
    myJsonCon.append('"');
    myJsonCon.append(attribute);
    myJsonCon.append('"');
    myJsonCon.append(':');
    myJsonCon.append('{');  // geschweift!!
    myJsonCon.append(NEWLINEINFILE);
}

void json_finishStruct(void)
{
    myJsonCon.chop(2);  // remove , and \r from the end
    myJsonCon.append('}');
    myJsonCon.append(',');
    myJsonCon.append(NEWLINEINFILE);

}

void json_finishRecord(void)
{
    myJsonCon.chop(2);  // remove , and \r from the end
    myJsonCon.append(NEWLINEINFILE);
    myJsonCon.append('}');
    myJsonCon.append(NEWLINEINFILE);

}


QString json_readbackRecordStr(void)
{
    return myJsonCon;
}

QByteArray json_readbackRecordBa(void)
{            
    return myJsonCon.toLatin1();
}

// -------------------------------------------------------------------------------------------------
// ------------------------------------------------------ parse Json file -------------------------------
// -------------------------------------------------------------------------------------------------

/*
example Json File:
{"temperature":28,
"snow":"no",
"Zeit":"16_21_45",
"sunny":"12h",
"humidity":75,
"wann ":"24.01.2022",
"unterstruktur":{
"day of week":"tuesday",
"year":22,
"month":1,
"day":24},
"fast am":"Ende",
"Puffer":[8,3,9,2,10]
}
 */
// first: QByteArray datei_readFromFile(QString filename);


int json_nrOfPairsInFile(QByteArray filename)
{
    QJsonDocument jdoc = QJsonDocument::fromJson(filename);
    QJsonObject jobj = jdoc.object();

    // key value pair consisting of key (unique string) and value (QJsonValue)
    int nrOfPairs=jobj.size();

    qDebug() << "my Json file has got: " << nrOfPairs<< "pairs";
    return nrOfPairs;
}

bool json_exists(QByteArray filename, QString searchForKey)
{
    // look for "searchForKey" =name of the pair (left of : )
    QJsonDocument jdoc = QJsonDocument::fromJson(filename);
    QJsonObject jobj = jdoc.object();

    if (jobj.contains(searchForKey))
        return true;
    return false;
}

bool json_remove(QByteArray filename, QString searchFor)
{
    // look for "searchFor" =name of the pair (left of : ) and remove the record from file
    QJsonDocument jdoc = QJsonDocument::fromJson(filename);
    QJsonObject jobj = jdoc.object();

    if (jobj.contains(searchFor))
    {
        jobj.remove(searchFor);
        return true;
    }
    return false;
}

QString json_searchForStringInFile(QByteArray filename, QString searchFor)
{
    // look for "searchFor" =name of the pair (left of : ) and return value of this pair (right of : ) as String
    QJsonDocument jdoc = QJsonDocument::fromJson(filename);
    QJsonObject jobj = jdoc.object();

    if (jobj.contains(searchFor))
    {
        return jobj[searchFor].toString();    // toObject(); toArray();
    } else
    {
        //qDebug() << "pairname not found in Json file";
        return "";
    }
}

int json_searchForIntInFile(QByteArray filename, QString searchFor)
{
    // look for "searchFor" =name of the pair (left of : ) and return value of this pair (right of : ) as String
    QJsonDocument jdoc = QJsonDocument::fromJson(filename);
    QJsonObject jobj = jdoc.object();

    if (jobj.contains(searchFor))
    {
        return jobj[searchFor].toInt();    // toObject(); toArray();
    } else
    {
        //qDebug() << "number not found in Json file";
        return 0;
    }
}

bool json_searchForObjectInFile(QByteArray filename, QString searchFor, QJsonObject *oneObject)
{
    // return an object from the json file
    QJsonDocument jdoc = QJsonDocument::fromJson(filename);
    QJsonObject jobj = jdoc.object();

    if (jobj.contains(searchFor))
    {
        *oneObject = jobj[searchFor].toObject();
        return true;
    } else
    {
        //qDebug() << "Object not found in Json file";
        return false;
    }
}

int json_nrOfPairsInObject(QJsonObject objname)
{
    int nrOfPairs=objname.size();
    qDebug() << "my Json Object has got: " << nrOfPairs<< "pairs";
    return nrOfPairs;
}

QString json_searchForStringInObject(QJsonObject objname, QString searchFor)
{
    // look for "searchFor" =name of the pair (left of : ) and return value of this pair (right of : ) as String

    if (objname.contains(searchFor))
    {
        return objname[searchFor].toString();
    } else
    {
        //qDebug() << "string not found in Json object";
        return "";
    }
}

int json_searchForIntInObject(QJsonObject objname, QString searchFor)
{
    // look for "searchFor" =name of the pair (left of : ) and return value of this pair (right of : ) as String

    if (objname.contains(searchFor))
    {
        return objname[searchFor].toInt();
    } else
    {
        //qDebug() << "number not found in Json file";
        return 0;
    }
}

bool json_searchForArrayInFile(QByteArray filename, QString searchFor, QJsonArray *oneArray)
{
    // look for "searchFor" =name of the pair (left of : ) and return value of this pair (right of : ) as String
    QJsonDocument jdoc = QJsonDocument::fromJson(filename);
    QJsonObject jobj = jdoc.object();

    if (jobj.contains(searchFor))
    {
        *oneArray = jobj[searchFor].toArray();
        return true;
    } else
    {
        //qDebug() << "Array not found in Json file";
        return false;
    }
}

int json_nrOfValuesInArray(QJsonArray arrayname)
{
    int nrOfPairs=arrayname.size();
    qDebug() << "my Json Array has got: " << nrOfPairs<< "values";
    return nrOfPairs;
}



bool json_getValuesOfArray(QJsonArray arrayname, int *buf, int MaxBufferSize)
{
    // assuming that the array consists of integers

    /* copy to local buffer:
    #define MAXNROFARRAYVALUES      100
    int buf[MAXNROFARRAYVALUES], ii;
    int nrOfPairs=arrayname.size();

    if (nrOfPairs>MAXNROFARRAYVALUES)
        nrOfPairs=MAXNROFARRAYVALUES;

    for (ii=0; ii<nrOfPairs; ii++)
        buf[ii]=arrayname[ii].toInt();
    */
    // copy to host buffer:
    bool ok=true;
    int nrOfPairs=arrayname.size();

    if (nrOfPairs>MaxBufferSize)
    {
        ok=false;       // got not all
        nrOfPairs=MaxBufferSize;
    }
    for (int ii=0; ii<nrOfPairs; ii++)
        buf[ii]=arrayname[ii].toInt();

    return ok;
}

/*
void datei_json_readTestFile(QString filename)
{
    QByteArray my2Ba;
    QString    my2Str;

    my2Str.clear();
    my2Ba=datei_readFromFile(filename);

    QJsonDocument jdoc = QJsonDocument::fromJson(my2Ba);
    QJsonObject jobj = jdoc.object();
    //QJsonParseError jerror;
    QJsonObject myObj;
    QJsonArray myArray;

        // key value pair consisting of key (unique string) and value (QJsonValue)
    int nrOfPairs=jobj.size();
    qDebug() << "my Json file has got: " << nrOfPairs<< "pairs";

    if (jobj.contains("Zeit"))
        qDebug() << "my Json file: " << jobj["Zeit"].toString();    // toObject(); toArray();
    else
        qDebug() << "my Json file contains no Zeit";

    if (jobj.contains("Humidity"))
        qDebug() << "my Json file: " << jobj["humidity"].toInt();
    else
        qDebug() << "my Json file contains no Humidity";

    if (jobj.contains("month"))
        qDebug() << "my Json file: " << jobj["month"].toObject();   // anzeige QJsonObject()
    else
        qDebug() << "my Json file contains no month";


    myObj=jobj["unterstruktur"].toObject();
    qDebug() << "my unterstruktur: " << myObj["month"].toInt();
    qDebug() << "my unterstruktur: " << myObj["day of week"].toString();
    //if (jerror.error == QJsonParseError::NoError)
    //    qDebug() << "no error";

    qDebug() << "my Month: " << myObj["Month"].toInt();
    //if (myObj["Month"] == QJsonValue::Undefined)
    //    qDebug() << "no found";     geht nicht

    //if (jerror.error != QJsonParseError::NoError)
      //  qDebug() << "no found";

    myArray=jobj["Puffer"].toArray();
    qDebug() << "my array " <<myArray[2].toInt();
    //if (jerror.error != QJsonParseError::NoError)
     //   qDebug() << "no found";

    if ( !jobj.contains("Puffer"))
        qDebug() << "no Puffer found";

    if ( !myArray.contains(20))
        qDebug() << "no entry found";
} */



// -------------------------------------------------------------------------------------------------
// ------------------------------------------------------ read, write, copy files -------------------
// -------------------------------------------------------------------------------------------------

void datei_closeFile(QString filename)
{
    QFile file(filename);
    file.close();
}

QByteArray datei_readFromFile(QString filename)
{
    //QFile file("/own/H2B/dc2.hex");
    //QFile file(FILENAME_STRUCTURE);
    QFile file;

    file.setFileName(filename);
    QByteArray myBA;

    myBA.clear();
    if (!file.exists())
    {
        qDebug()<<"file not exists";
        return myBA;
    } else
    {
        if (!file.open(QIODevice::ReadOnly)  )
        {
            qDebug()<<"cannot open";

        } else
        {
            //qDebug()<<"loading file with " << file.size() <<"byte";
            myBA = file.readAll();
            //qDebug()<<"datei read: " << myBA;
            file.close();
        }
    }
    return myBA;
}

bool datei_ifFileExists(QString filename)
{

    QFile file;
    file.setFileName(filename);

    if (file.exists())
        return true;
    return false;
}

char datei_writeToFile(QString filename, QByteArray content)
{
    // retval=0 if successful  1: no write access allowed 2:cannot open to append 3:cannot create new file
    QFile file(filename);
    QFileInfo myFI(filename);

    //if (!myFI.isWritable())   //geht nur bei NTFS, weg.
    //{
        //file.setPermissions(filename, QFile::WriteOther); geht nicht :(
    //    qDebug()<<"datei_writeToFile: writing not allowed. set attributes first!";
    //    return 1;
    //}

    if (file.exists())
    {
        if (!file.open(QIODevice::Append))
        {
            qDebug()<<"datei_writeToFile cannot open to append";
            return 2;
        } else
        {
            // add new object to the end of the file
            file.write(content);
            file.close();
            return 0;   // OK
        }
    } else
    {
        if (!file.open(QIODevice::WriteOnly))
        {
            qDebug()<<"datei_writeToFile cannot open new";
            return 3;
        } else
        {
            qDebug()<<"create new file";
            // write first lines into file
            file.write(content);
            file.close();
            return 0;   // OK
        }
    }
    return 0;
}

bool datei_copyFile(QString currentFileName, QString newFileName)
{
    // retval=true if successful
    QFile file;
    file.setFileName(currentFileName);
    return file.copy(newFileName);
}

bool datei_clearFile(QString filename)
{
    // retval=true if successful
    QFile file;
    file.setFileName(filename);

    file.remove();  // 3.2.22 erst ganz löschen wegen Schreibrechten
    if (!file.open(QIODevice::WriteOnly))
    {
        qDebug()<<"datei_clearFile  cannot open file to delete";
        return false;
    } else
    {
        file.write(0);
        file.close();
        return true;
    }
}