2017-08-05 20:42:48 +02:00
|
|
|
#include <QtGui>
|
|
|
|
#include <QtCore>
|
|
|
|
#include <QClipboard>
|
|
|
|
|
|
|
|
|
|
|
|
extern "C" {
|
|
|
|
// DECLARATIONS SPLIT TO AVOID CONFLICT OF TYPES
|
|
|
|
|
|
|
|
uint32_t *getrplstackobject(int level,int *size);
|
|
|
|
char *getdecompiledrplobject(int level,int *strsize);
|
|
|
|
void pushobject(char *data,int sizebytes);
|
|
|
|
void pushtext(char *data,int sizebytes);
|
|
|
|
void removestackobject(int level,int nitems);
|
2019-03-07 19:14:55 +01:00
|
|
|
int compileobject();
|
2017-08-05 20:42:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// COPY OBJECT FROM THE STACK INTO THE HOST CLIPBOARD
|
|
|
|
void Stack2Clipboard(int level,int dropit)
|
|
|
|
{
|
|
|
|
|
|
|
|
uint32_t *obj;
|
|
|
|
int size;
|
|
|
|
|
|
|
|
obj=getrplstackobject(level,&size);
|
|
|
|
|
|
|
|
if(!obj) return;
|
|
|
|
|
|
|
|
|
|
|
|
QClipboard *clip = qApp->clipboard();
|
|
|
|
QMimeData *data=new QMimeData;
|
|
|
|
QByteArray buffer;
|
|
|
|
buffer.append((const char *)obj,size*sizeof(int32_t));
|
|
|
|
|
|
|
|
data->setData(QString("application/newrpl-object"),buffer);
|
|
|
|
|
|
|
|
char *text;
|
|
|
|
int strsize;
|
|
|
|
|
|
|
|
text=getdecompiledrplobject(level,&strsize);
|
|
|
|
|
|
|
|
if(!text) return;
|
|
|
|
|
|
|
|
QByteArray decomptext((const char *)text,strsize);
|
|
|
|
QString utf8string(decomptext);
|
|
|
|
data->setText(utf8string);
|
|
|
|
data->setHtml(utf8string);
|
|
|
|
clip->setMimeData(data,QClipboard::Clipboard);
|
|
|
|
|
|
|
|
if(dropit) removestackobject(level,1);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// PUSH THE CLIPBOARD IN THE STACK
|
|
|
|
void Clipboard2Stack()
|
|
|
|
{
|
|
|
|
QClipboard *clip = qApp->clipboard();
|
|
|
|
const QMimeData *data=clip->mimeData();
|
|
|
|
|
|
|
|
if(data->hasFormat(QString("application/newrpl-object"))) {
|
|
|
|
QByteArray mydata(data->data(QString("application/newrpl-object")));
|
|
|
|
|
|
|
|
pushobject(mydata.data(),mydata.size());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(data->hasText()) {
|
|
|
|
QByteArray mydata(data->text().toUtf8());
|
|
|
|
pushtext(mydata.data(),mydata.size());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-03-07 19:14:55 +01:00
|
|
|
|
|
|
|
void Clipboard2StackCompile()
|
|
|
|
{
|
|
|
|
QClipboard *clip = qApp->clipboard();
|
|
|
|
const QMimeData *data=clip->mimeData();
|
|
|
|
|
|
|
|
if(data->hasFormat(QString("application/newrpl-object"))) {
|
|
|
|
QByteArray mydata(data->data(QString("application/newrpl-object")));
|
|
|
|
|
|
|
|
pushobject(mydata.data(),mydata.size());
|
|
|
|
compileobject();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(data->hasText()) {
|
|
|
|
QByteArray mydata(data->text().toUtf8());
|
|
|
|
pushtext(mydata.data(),mydata.size());
|
|
|
|
compileobject();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-08-05 20:42:48 +02:00
|
|
|
int SaveRPLObject(QString& filename,int level)
|
|
|
|
{
|
|
|
|
uint32_t *obj;
|
|
|
|
int size;
|
|
|
|
|
|
|
|
obj=getrplstackobject(level,&size);
|
|
|
|
|
|
|
|
if(!obj) return 0;
|
|
|
|
|
|
|
|
|
|
|
|
QFile f(filename);
|
|
|
|
|
|
|
|
if(!f.open(QIODevice::WriteOnly|QIODevice::Truncate)) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
const char *fileprolog="NRPL";
|
|
|
|
f.write(fileprolog,4);
|
|
|
|
f.write((const char *)obj,size*4);
|
|
|
|
f.close();
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int LoadRPLObject(QString& filename)
|
|
|
|
{
|
|
|
|
uint32_t *obj;
|
|
|
|
int size;
|
|
|
|
|
|
|
|
QFile f(filename);
|
|
|
|
|
|
|
|
if(!f.open(QIODevice::ReadOnly)) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
size=f.size();
|
|
|
|
if(size&3) return 0;
|
|
|
|
QByteArray data=f.read(f.size());
|
|
|
|
|
|
|
|
if( (data.at(0)!='N')||(data.at(1)!='R')||(data.at(2)!='P')||(data.at(3)!='L'))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
pushobject(data.data()+4,data.size()-4);
|
|
|
|
|
|
|
|
f.close();
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
}
|