#include <QDateTime>
#include <QFileDevice>
#include <QMetaObject>
#include <QString>
#include <QByteArray>
#include <cstring>
#include "qfiledevice.h"

#include "gen_qfiledevice.h"

extern "C" {
    extern void miqt_exec_callback(void* cb, int argc, void* argv);
}

QMetaObject* QFileDevice_MetaObject(QFileDevice* self) {
	return (QMetaObject*) const_cast<const QFileDevice*>(self)->metaObject();
}

void QFileDevice_Tr(const char* s, char** _out, int* _out_Strlen) {
	QString ret = QFileDevice::tr(s);
	// Convert QString from UTF-16 in C++ RAII memory to UTF-8 in manually-managed C memory
	QByteArray b = ret.toUtf8();
	*_out = static_cast<char*>(malloc(b.length()));
	memcpy(*_out, b.data(), b.length());
	*_out_Strlen = b.length();
}

void QFileDevice_TrUtf8(const char* s, char** _out, int* _out_Strlen) {
	QString ret = QFileDevice::trUtf8(s);
	// Convert QString from UTF-16 in C++ RAII memory to UTF-8 in manually-managed C memory
	QByteArray b = ret.toUtf8();
	*_out = static_cast<char*>(malloc(b.length()));
	memcpy(*_out, b.data(), b.length());
	*_out_Strlen = b.length();
}

uintptr_t QFileDevice_Error(QFileDevice* self) {
	QFileDevice::FileError ret = const_cast<const QFileDevice*>(self)->error();
	return static_cast<uintptr_t>(ret);
}

void QFileDevice_UnsetError(QFileDevice* self) {
	self->unsetError();
}

void QFileDevice_Close(QFileDevice* self) {
	self->close();
}

bool QFileDevice_IsSequential(QFileDevice* self) {
	return const_cast<const QFileDevice*>(self)->isSequential();
}

int QFileDevice_Handle(QFileDevice* self) {
	return const_cast<const QFileDevice*>(self)->handle();
}

void QFileDevice_FileName(QFileDevice* self, char** _out, int* _out_Strlen) {
	QString ret = const_cast<const QFileDevice*>(self)->fileName();
	// Convert QString from UTF-16 in C++ RAII memory to UTF-8 in manually-managed C memory
	QByteArray b = ret.toUtf8();
	*_out = static_cast<char*>(malloc(b.length()));
	memcpy(*_out, b.data(), b.length());
	*_out_Strlen = b.length();
}

long long QFileDevice_Pos(QFileDevice* self) {
	return const_cast<const QFileDevice*>(self)->pos();
}

bool QFileDevice_Seek(QFileDevice* self, long long offset) {
	return self->seek(static_cast<qint64>(offset));
}

bool QFileDevice_AtEnd(QFileDevice* self) {
	return const_cast<const QFileDevice*>(self)->atEnd();
}

bool QFileDevice_Flush(QFileDevice* self) {
	return self->flush();
}

long long QFileDevice_Size(QFileDevice* self) {
	return const_cast<const QFileDevice*>(self)->size();
}

bool QFileDevice_Resize(QFileDevice* self, long long sz) {
	return self->resize(static_cast<qint64>(sz));
}

int QFileDevice_Permissions(QFileDevice* self) {
	QFileDevice::Permissions ret = const_cast<const QFileDevice*>(self)->permissions();
	return static_cast<int>(ret);
}

bool QFileDevice_SetPermissions(QFileDevice* self, int permissionSpec) {
	return self->setPermissions(static_cast<QFileDevice::Permissions>(permissionSpec));
}

unsigned char* QFileDevice_Map(QFileDevice* self, long long offset, long long size) {
	return self->map(static_cast<qint64>(offset), static_cast<qint64>(size));
}

bool QFileDevice_Unmap(QFileDevice* self, unsigned char* address) {
	return self->unmap(static_cast<uchar*>(address));
}

QDateTime* QFileDevice_FileTime(QFileDevice* self, uintptr_t time) {
	QDateTime ret = const_cast<const QFileDevice*>(self)->fileTime(static_cast<QFileDevice::FileTime>(time));
	// Copy-construct value returned type into heap-allocated copy
	return static_cast<QDateTime*>(new QDateTime(ret));
}

bool QFileDevice_SetFileTime(QFileDevice* self, QDateTime* newDate, uintptr_t fileTime) {
	return self->setFileTime(*newDate, static_cast<QFileDevice::FileTime>(fileTime));
}

void QFileDevice_Tr2(const char* s, const char* c, char** _out, int* _out_Strlen) {
	QString ret = QFileDevice::tr(s, c);
	// Convert QString from UTF-16 in C++ RAII memory to UTF-8 in manually-managed C memory
	QByteArray b = ret.toUtf8();
	*_out = static_cast<char*>(malloc(b.length()));
	memcpy(*_out, b.data(), b.length());
	*_out_Strlen = b.length();
}

void QFileDevice_Tr3(const char* s, const char* c, int n, char** _out, int* _out_Strlen) {
	QString ret = QFileDevice::tr(s, c, static_cast<int>(n));
	// Convert QString from UTF-16 in C++ RAII memory to UTF-8 in manually-managed C memory
	QByteArray b = ret.toUtf8();
	*_out = static_cast<char*>(malloc(b.length()));
	memcpy(*_out, b.data(), b.length());
	*_out_Strlen = b.length();
}

void QFileDevice_TrUtf82(const char* s, const char* c, char** _out, int* _out_Strlen) {
	QString ret = QFileDevice::trUtf8(s, c);
	// Convert QString from UTF-16 in C++ RAII memory to UTF-8 in manually-managed C memory
	QByteArray b = ret.toUtf8();
	*_out = static_cast<char*>(malloc(b.length()));
	memcpy(*_out, b.data(), b.length());
	*_out_Strlen = b.length();
}

void QFileDevice_TrUtf83(const char* s, const char* c, int n, char** _out, int* _out_Strlen) {
	QString ret = QFileDevice::trUtf8(s, c, static_cast<int>(n));
	// Convert QString from UTF-16 in C++ RAII memory to UTF-8 in manually-managed C memory
	QByteArray b = ret.toUtf8();
	*_out = static_cast<char*>(malloc(b.length()));
	memcpy(*_out, b.data(), b.length());
	*_out_Strlen = b.length();
}

unsigned char* QFileDevice_Map3(QFileDevice* self, long long offset, long long size, uintptr_t flags) {
	return self->map(static_cast<qint64>(offset), static_cast<qint64>(size), static_cast<QFileDevice::MemoryMapFlags>(flags));
}

void QFileDevice_Delete(QFileDevice* self) {
	delete self;
}