Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F2577734
kazv-io-job.cpp
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Size
6 KB
Referenced Files
None
Subscribers
None
kazv-io-job.cpp
View Options
#include
"kazv-io-job.hpp"
#include
"matrix-room.hpp"
#include
<QObject>
#include
<QPointer>
#include
<QSharedPointer>
#include
<QSaveFile>
#include
<QFile>
#include
<QByteArray>
#include
<QIODevice>
#include
<QString>
#include
<KJob>
#include
<KIO/TransferJob>
#include
<nlohmann/json.hpp>
#include
<optional>
#include
<string>
using
json
=
nlohmann
::
json
;
struct
KazvIOBaseJobPrivate
{
QPointer
<
KIO
::
TransferJob
>
job
;
std
::
optional
<
KazvIOBaseJob
::
ErrorCode
>
result
=
std
::
nullopt
;
};
KazvIOBaseJob
::
KazvIOBaseJob
(
QObject
*
parent
)
:
QObject
(
parent
)
,
m_d
(
new
KazvIOBaseJobPrivate
)
{
connect
(
this
,
&
KazvIOBaseJob
::
jobChanged
,
this
,
&
KazvIOBaseJob
::
connectJob
);
}
KazvIOBaseJob
::~
KazvIOBaseJob
()
=
default
;
QPointer
<
KIO
::
TransferJob
>
KazvIOBaseJob
::
job
()
{
return
m_d
->
job
;
}
void
KazvIOBaseJob
::
setJob
(
QPointer
<
KIO
::
TransferJob
>
job
)
{
resetResult
();
if
(
!
m_d
->
job
.
isNull
())
{
m_d
->
job
->
disconnect
(
this
);
}
m_d
->
job
=
job
;
Q_EMIT
jobChanged
();
}
float
KazvIOBaseJob
::
progress
()
{
if
(
m_d
->
job
.
isNull
())
{
return
0
;
}
return
static_cast
<
float
>
(
m_d
->
job
->
percent
())
/
100
;
}
void
KazvIOBaseJob
::
suspend
()
{
if
(
m_d
->
job
.
isNull
())
{
emitResult
(
KazvError
);
return
;
}
m_d
->
job
->
suspend
();
}
void
KazvIOBaseJob
::
resume
()
{
if
(
m_d
->
job
.
isNull
())
{
emitResult
(
KazvError
);
return
;
}
m_d
->
job
->
resume
();
}
void
KazvIOBaseJob
::
cancel
()
{
if
(
m_d
->
job
.
isNull
())
{
emitResult
(
KazvError
);
return
;
}
emitResult
(
UserCancel
);
m_d
->
job
->
kill
();
}
bool
KazvIOBaseJob
::
isSuspended
()
{
if
(
m_d
->
job
.
isNull
())
{
return
false
;
}
return
m_d
->
job
->
isSuspended
();
}
bool
KazvIOBaseJob
::
isResulted
()
{
return
m_d
->
result
.
has_value
();
}
KazvIOBaseJob
::
ErrorCode
KazvIOBaseJob
::
error
()
{
if
(
m_d
->
result
.
has_value
())
{
return
m_d
->
result
.
value
();
}
// Shouldn't call this function before result are emited
return
NoError
;
}
void
KazvIOBaseJob
::
connectJob
()
{
connect
(
m_d
->
job
,
&
KJob
::
result
,
this
,
[
this
](
KJob
*
job
)
{
if
(
m_d
->
result
.
has_value
())
{
return
;
}
if
(
job
->
error
())
{
emitResult
(
KIOError
);
}
else
{
emitResult
(
NoError
);
}
});
connect
(
m_d
->
job
,
&
KJob
::
percentChanged
,
this
,
[
this
](
KJob
*
/* job */
,
unsigned
long
/* percent */
)
{
Q_EMIT
progressChanged
();
});
}
void
KazvIOBaseJob
::
emitResult
(
ErrorCode
ec
)
{
m_d
->
result
=
ec
;
Q_EMIT
result
(
m_d
->
result
.
value
());
}
void
KazvIOBaseJob
::
resetResult
()
{
m_d
->
result
=
std
::
nullopt
;
}
struct
KazvIODownloadJobPrivate
{
QSharedPointer
<
QSaveFile
>
file
;
};
KazvIODownloadJob
::
KazvIODownloadJob
(
QObject
*
parent
)
:
KazvIOBaseJob
(
parent
)
,
m_d
(
new
KazvIODownloadJobPrivate
)
{
}
KazvIODownloadJob
::~
KazvIODownloadJob
()
=
default
;
QPointer
<
QSaveFile
>
KazvIODownloadJob
::
file
()
{
return
m_d
->
file
.
data
();
}
void
KazvIODownloadJob
::
setFile
(
QPointer
<
QSaveFile
>
file
)
{
resetResult
();
if
(
!
file
->
isOpen
())
{
auto
succ
=
file
->
open
(
QIODevice
::
WriteOnly
);
if
(
!
succ
)
{
KazvIOBaseJob
::
emitResult
(
QtError
);
return
;
}
}
m_d
->
file
.
reset
(
file
.
data
());
Q_EMIT
fileChanged
();
}
QString
KazvIODownloadJob
::
fileName
()
{
if
(
m_d
->
file
.
isNull
())
{
return
QStringLiteral
(
""
);
}
return
m_d
->
file
->
fileName
();
}
void
KazvIODownloadJob
::
connectJob
()
{
KazvIOBaseJob
::
connectJob
();
connect
(
this
->
job
(),
&
KIO
::
TransferJob
::
data
,
this
,
[
this
](
KJob
*
job
,
const
QByteArray
&
data
)
{
if
(
!
m_d
->
file
.
isNull
())
{
auto
len
=
m_d
->
file
->
write
(
data
);
if
(
len
==
-1
)
{
job
->
kill
();
}
}
if
(
!
this
->
isResulted
())
{
KazvIOBaseJob
::
emitResult
(
KazvError
);
}
job
->
kill
();
});
connect
(
this
->
job
(),
&
KJob
::
result
,
this
,
[
this
](
KJob
*
job
)
{
if
(
m_d
->
file
.
isNull
())
{
return
;
}
if
(
job
->
error
())
{
m_d
->
file
->
cancelWriting
();
}
m_d
->
file
->
commit
();
});
}
struct
KazvIOUploadJobPrivate
{
QSharedPointer
<
QFile
>
file
;
QString
response
;
QPointer
<
MatrixRoom
>
room
;
QUrl
localFileUrl
;
// For send media file message
};
KazvIOUploadJob
::
KazvIOUploadJob
(
QObject
*
parent
)
:
KazvIOBaseJob
(
parent
)
,
m_d
(
new
KazvIOUploadJobPrivate
)
{
connect
(
this
,
&
KazvIOBaseJob
::
jobChanged
,
[
this
]()
{
m_d
->
response
.
clear
();
});
}
KazvIOUploadJob
::~
KazvIOUploadJob
()
=
default
;
QPointer
<
QFile
>
KazvIOUploadJob
::
file
()
{
return
m_d
->
file
.
data
();
}
void
KazvIOUploadJob
::
setFile
(
QPointer
<
QFile
>
file
)
{
resetResult
();
m_d
->
response
.
clear
();
if
(
!
file
->
isOpen
())
{
auto
succ
=
file
->
open
(
QIODevice
::
ReadOnly
);
if
(
!
succ
)
{
KazvIOBaseJob
::
emitResult
(
QtError
);
return
;
}
}
m_d
->
file
.
reset
(
file
.
data
());
Q_EMIT
fileChanged
();
}
QString
KazvIOUploadJob
::
response
()
{
return
m_d
->
response
;
}
QPointer
<
MatrixRoom
>
KazvIOUploadJob
::
room
()
{
return
m_d
->
room
;
}
void
KazvIOUploadJob
::
setRoom
(
QPointer
<
MatrixRoom
>
room
)
{
m_d
->
room
=
room
;
Q_EMIT
roomChanged
();
}
QUrl
KazvIOUploadJob
::
localFileUrl
()
{
return
m_d
->
localFileUrl
;
}
void
KazvIOUploadJob
::
setLocalFileUrl
(
QUrl
localFileUrl
)
{
m_d
->
localFileUrl
=
localFileUrl
;
Q_EMIT
localFileUrlChanged
();
}
QString
KazvIOUploadJob
::
fileName
()
{
if
(
m_d
->
file
.
isNull
())
{
return
QStringLiteral
(
""
);
}
return
m_d
->
file
->
fileName
();
}
void
KazvIOUploadJob
::
connectJob
()
{
KazvIOBaseJob
::
connectJob
();
connect
(
this
->
job
(),
&
KIO
::
TransferJob
::
data
,
this
,
[
this
](
KJob
*
job
,
const
QByteArray
&
data
)
{
if
(
!
m_d
->
file
.
isNull
())
{
m_d
->
response
.
append
(
data
);
Q_EMIT
responseChanged
();
}
if
(
this
->
isResulted
())
{
job
->
kill
();
}
KazvIOBaseJob
::
emitResult
(
KazvError
);
});
connect
(
this
->
job
(),
&
KJob
::
result
,
this
,
[
this
](
KJob
*
job
)
{
if
(
m_d
->
file
.
isNull
())
{
if
(
!
this
->
isResulted
())
{
KazvIOBaseJob
::
emitResult
(
KazvError
);
}
return
;
}
m_d
->
file
->
close
();
if
(
job
->
error
())
{
m_d
->
response
.
clear
();
if
(
!
this
->
isResulted
())
{
KazvIOBaseJob
::
emitResult
(
KIOError
);
}
return
;
}
json
j
=
json
::
parse
(
m_d
->
response
.
toStdString
());
auto
mxcUri
=
j
[
"content_uri"
].
get
<
std
::
string
>
();
m_d
->
room
->
sendMediaFileMessage
(
m_d
->
localFileUrl
,
QString
(
mxcUri
.
data
()));
m_d
->
room
->
deleteLater
();
});
}
File Metadata
Details
Attached
Mime Type
text/x-c
Expires
Tue, Jun 24, 1:08 PM (1 d, 15 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
234871
Default Alt Text
kazv-io-job.cpp (6 KB)
Attached To
Mode
rK kazv
Attached
Detach File
Event Timeline
Log In to Comment