Page MenuHomePhorge

No OneTemporary

Size
24 KB
Referenced Files
None
Subscribers
None
diff --git a/src/contents/ui/EventView.qml b/src/contents/ui/EventView.qml
index dc75d98..8a3d46c 100644
--- a/src/contents/ui/EventView.qml
+++ b/src/contents/ui/EventView.qml
@@ -1,186 +1,208 @@
/*
* Copyright (C) 2020-2021 Tusooa Zhu <tusooa@kazv.moe>
*
* This file is part of kazv.
*
* kazv is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* kazv is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with kazv. If not, see <https://www.gnu.org/licenses/>.
*/
import QtQuick 2.2
import QtQuick.Layouts 1.15
import QtQuick.Controls 2.15
import Qt.labs.qmlmodels 1.0
import org.kde.kirigami 2.13 as Kirigami
import 'event-types' as Types
Item {
id: eventView
property var event
property var sender
property var stateKeyUser
property var messageType: getMessageType(event)
property var iconSize: Kirigami.Units.iconSizes.large
property var senderNameSize: Kirigami.Units.gridUnit * 1.2
height: loader.item.implicitHeight
+ anchors.left: parent.left
+ anchors.right: parent.right
//padding: Kirigami.Units.largeSpacing
Component {
id: textEV
Types.Text {
event: eventView.event
sender: eventView.sender
}
}
Component {
id: emoteEV
Types.Emote {
event: eventView.event
sender: eventView.sender
}
}
Component {
id: noticeEV
Types.Notice {
event: eventView.event
sender: eventView.sender
}
}
Component {
id: stateEV
Types.State {
event: eventView.event
sender: eventView.sender
stateKeyUser: eventView.stateKeyUser
}
}
Component {
id: imageEV
Types.Image {
event: eventView.event
sender: eventView.sender
}
}
+ Component {
+ id: fileEV
+ Types.File {
+ event: eventView.event
+ sender: eventView.sender
+ }
+ }
+
+ Component {
+ id: videoEV
+ Types.Video {
+ event: eventView.event
+ sender: eventView.sender
+ }
+ }
+
+ Component {
+ id: audioEV
+ Types.Audio {
+ event: eventView.event
+ sender: eventView.sender
+ }
+ }
+
Component {
id: unknownEV
Label {
text: 'unknown event'
}
}
+ /* ColumnLayout { */
+ /* id: layout */
+ /* anchors.left: eventView.left */
+ /* anchors.right: eventView.right */
+ /* } */
+
Loader {
sourceComponent: getSource(messageType)
id: loader
+ /* onLoaded: { */
+ /* item.parent = layout; */
+ /* } */
+ anchors.left: eventView.left
+ anchors.right: eventView.right
}
+
function getSource(t) {
switch (t) {
case 'text':
return textEV;
case 'emote':
return emoteEV;
case 'notice':
return noticeEV;
case 'state':
return stateEV;
case 'image':
return imageEV;
+ case 'file':
+ return fileEV;
+
+ case 'video':
+ return videoEV;
+
+ case 'audio':
+ return audioEV;
+
default:
return unknownEV;
}
}
- /* DelegateChooser { */
- /* id: inner */
- /* role: 'messageType' */
- /* DelegateChoice { */
- /* roleValue: 'text' */
- /* Types.Simple { */
- /* event: eventView.event */
- /* sender: eventView.sender */
- /* } */
- /* } */
- /* DelegateChoice { */
- /* roleValue: 'unknown' */
- /* Label { */
- /* text: 'unknown event' */
- /* } */
- /* } */
- /* DelegateChoice { */
- /* roleValue: '' */
- /* Label { */
- /* text: '???' */
- /* } */
- /* } */
-
- /* } */
-
function getMessageType(e) {
if (e.isState) {
return 'state';
}
switch (e.type) {
case 'm.room.message':
switch (e.content.msgtype) {
case 'm.text':
console.log('msg type=text');
return 'text';
case 'm.emote':
return 'emote';
case 'm.notice':
return 'notice';
case 'm.image':
return 'image';
case 'm.file':
return 'file';
case 'm.audio':
return 'audio';
case 'm.video':
return 'video';
case 'm.location':
return 'location';
default:
console.log('msg type=unknown');
return 'unknown';
}
default:
console.log('msg type=unknown');
return 'unknown';
}
}
}
diff --git a/src/contents/ui/RoomTimelineView.qml b/src/contents/ui/RoomTimelineView.qml
index 2a68c03..f588473 100644
--- a/src/contents/ui/RoomTimelineView.qml
+++ b/src/contents/ui/RoomTimelineView.qml
@@ -1,74 +1,75 @@
/*
* Copyright (C) 2020 Tusooa Zhu <tusooa@vista.aero>
*
* This file is part of kazv.
*
* kazv is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* kazv is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with kazv. If not, see <https://www.gnu.org/licenses/>.
*/
import QtQuick 2.2
import QtQuick.Layouts 1.15
import QtQuick.Controls 2.15
import org.kde.kirigami 2.13 as Kirigami
ListView {
id: roomTimelineView
property var timeline
property var eventIds: timeline.eventIds
property string selectedEventId
spacing: Kirigami.Units.largeSpacing
- width: parent.width
- Layout.fillHeight: true
+ //width: parent.width
+ //Layout.fillHeight: true
+ anchors.fill: parent
model: timeline.count
- Layout.minimumHeight: childrenRect.height
+ //Layout.minimumHeight: childrenRect.height
currentIndex: -1
//currentIndex: eventIds.indexOf(selectedEventId)
//onModelChanged: currentIndex = Qt.binding(function() { return eventIds.indexOf(selectedEventId) })
delegate: EventView {
event: timeline.at(index)
sender: room.member(event.sender)
stateKeyUser: event.stateKey ? room.member(event.stateKey) : {}
}
/* Kirigami.BasicListItem { */
/* property var item: timeline.at(index) */
/* //onClicked: roomTimelineView.selectedEventId = item.eventId */
/* onClicked: {} */
/* checkable: false */
/* checked: false */
/* //onClicked: print("clicked room %1".arg(index)) */
/* //checkable: true */
/* //checked: roomTimelineView.selectedEventId == item.eventId */
/* //autoExclusive: true */
/* Label { */
/* text: i18n("Message from %1 of type %2: %3", item.sender, item.type, item.content) */
/* } */
/* /\* actions: [ */
/* Kirigami.Action { */
/* text: i18n("Set as favourite") */
/* iconName: "non-starred-symbolic" */
/* onTriggered: showPassiveNotification(i18n("Set %1 as favourite", item.name)) */
/* } */
/* ]*\/ */
/* } */
}
diff --git a/src/contents/ui/event-types/Image.qml b/src/contents/ui/event-types/Audio.qml
similarity index 70%
copy from src/contents/ui/event-types/Image.qml
copy to src/contents/ui/event-types/Audio.qml
index 5f922af..6ec18fa 100644
--- a/src/contents/ui/event-types/Image.qml
+++ b/src/contents/ui/event-types/Audio.qml
@@ -1,47 +1,60 @@
-
/*
* Copyright (C) 2020-2021 Tusooa Zhu <tusooa@kazv.moe>
*
* This file is part of kazv.
*
* kazv is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* kazv is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with kazv. If not, see <https://www.gnu.org/licenses/>.
*/
import QtQuick 2.2
import QtQuick.Layouts 1.15
import QtQuick.Controls 2.15
+import QtMultimedia 5.15
+
import org.kde.kirigami 2.13 as Kirigami
import '..' as Kazv
Simple {
id: upper
property var gender: 'neutral'
property var body: event.content.body
property var mxcUri: event.content.url
- property var imageUri: matrixSdk.mxcUriToHttp(mxcUri)
+ property var audioUri: matrixSdk.mxcUriToHttp(mxcUri)
Kazv.Bubble {
ColumnLayout {
Label {
- text: l10n.get('event-message-image-sent', { gender, body })
+ text: l10n.get('event-message-audio-sent', { gender, body })
}
- Image {
- source: imageUri
+ Audio {
+ id: audio
+ source: audioUri
+ autoLoad: false
+ autoPlay: false
+ }
+ Label {
+ text: l10n.get('event-message-audio-play-action')
+ MouseArea {
+ anchors.fill: parent
+ onClicked: {
+ audio.play()
+ }
+ }
}
}
}
}
diff --git a/src/contents/ui/event-types/Image.qml b/src/contents/ui/event-types/File.qml
similarity index 86%
copy from src/contents/ui/event-types/Image.qml
copy to src/contents/ui/event-types/File.qml
index 5f922af..99d444e 100644
--- a/src/contents/ui/event-types/Image.qml
+++ b/src/contents/ui/event-types/File.qml
@@ -1,47 +1,46 @@
-
/*
* Copyright (C) 2020-2021 Tusooa Zhu <tusooa@kazv.moe>
*
* This file is part of kazv.
*
* kazv is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* kazv is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with kazv. If not, see <https://www.gnu.org/licenses/>.
*/
import QtQuick 2.2
import QtQuick.Layouts 1.15
import QtQuick.Controls 2.15
import org.kde.kirigami 2.13 as Kirigami
import '..' as Kazv
Simple {
id: upper
property var gender: 'neutral'
property var body: event.content.body
property var mxcUri: event.content.url
- property var imageUri: matrixSdk.mxcUriToHttp(mxcUri)
+ property var fileUri: matrixSdk.mxcUriToHttp(mxcUri)
Kazv.Bubble {
ColumnLayout {
Label {
- text: l10n.get('event-message-image-sent', { gender, body })
+ text: l10n.get('event-message-file-sent', { gender, body })
}
- Image {
- source: imageUri
+ Label {
+ text: fileUri
}
}
}
}
diff --git a/src/contents/ui/event-types/Image.qml b/src/contents/ui/event-types/Image.qml
index 5f922af..0cc5935 100644
--- a/src/contents/ui/event-types/Image.qml
+++ b/src/contents/ui/event-types/Image.qml
@@ -1,47 +1,51 @@
-
/*
* Copyright (C) 2020-2021 Tusooa Zhu <tusooa@kazv.moe>
*
* This file is part of kazv.
*
* kazv is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* kazv is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with kazv. If not, see <https://www.gnu.org/licenses/>.
*/
import QtQuick 2.2
import QtQuick.Layouts 1.15
import QtQuick.Controls 2.15
import org.kde.kirigami 2.13 as Kirigami
import '..' as Kazv
Simple {
id: upper
property var gender: 'neutral'
property var body: event.content.body
property var mxcUri: event.content.url
property var imageUri: matrixSdk.mxcUriToHttp(mxcUri)
Kazv.Bubble {
ColumnLayout {
+ id: layout
Label {
text: l10n.get('event-message-image-sent', { gender, body })
}
Image {
+ id: image
source: imageUri
+ Layout.maximumWidth: layout.width
+ Layout.preferredHeight: implicitHeight / implicitWidth * width
+ fillMode: Image.PreserveAspectFit
}
}
}
}
diff --git a/src/contents/ui/event-types/Image.qml b/src/contents/ui/event-types/Video.qml
similarity index 74%
copy from src/contents/ui/event-types/Image.qml
copy to src/contents/ui/event-types/Video.qml
index 5f922af..0aa6e52 100644
--- a/src/contents/ui/event-types/Image.qml
+++ b/src/contents/ui/event-types/Video.qml
@@ -1,47 +1,58 @@
-
/*
* Copyright (C) 2020-2021 Tusooa Zhu <tusooa@kazv.moe>
*
* This file is part of kazv.
*
* kazv is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* kazv is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with kazv. If not, see <https://www.gnu.org/licenses/>.
*/
import QtQuick 2.2
import QtQuick.Layouts 1.15
import QtQuick.Controls 2.15
+import QtMultimedia 5.15
+
import org.kde.kirigami 2.13 as Kirigami
import '..' as Kazv
Simple {
id: upper
property var gender: 'neutral'
property var body: event.content.body
property var mxcUri: event.content.url
- property var imageUri: matrixSdk.mxcUriToHttp(mxcUri)
+ property var videoUri: matrixSdk.mxcUriToHttp(mxcUri)
Kazv.Bubble {
ColumnLayout {
Label {
- text: l10n.get('event-message-image-sent', { gender, body })
+ text: l10n.get('event-message-video-sent', { gender, body })
}
- Image {
- source: imageUri
+ Video {
+ id: video
+ source: videoUri
+ autoLoad: false
+ autoPlay: false
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: {
+ video.play()
+ }
+ }
}
}
}
}
diff --git a/src/l10n/cmn-Hans/100-ui.ftl b/src/l10n/cmn-Hans/100-ui.ftl
index a8c062a..5b9e2e3 100644
--- a/src/l10n/cmn-Hans/100-ui.ftl
+++ b/src/l10n/cmn-Hans/100-ui.ftl
@@ -1,73 +1,77 @@
### Copyright (C) 2020-2021 Tusooa Zhu <tusooa@kazv.moe>
###
### This file is part of kazv.
###
### kazv is free software: you can redistribute it and/or modify
### it under the terms of the GNU Affero General Public License as
### published by the Free Software Foundation, either version 3 of the
### License, or (at your option) any later version.
###
### kazv is distributed in the hope that it will be useful,
### but WITHOUT ANY WARRANTY; without even the implied warranty of
### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
### GNU Affero General Public License for more details.
###
### You should have received a copy of the GNU Affero General Public License
### along with kazv. If not, see <https://www.gnu.org/licenses/>.
app-title = { -kt-app-name }
global-drawer-title = { -kt-app-name }
global-drawer-action-switch-account = 切换账号
global-drawer-action-hard-logout = 登出
empty-room-page-title = 没有选中房间
empty-room-page-description = 当前没有选中的房间。
login-page-title = 登录
login-page-userid-prompt = 用户 id:
login-page-userid-input-placeholder = 例如: @foo:example.org
login-page-password-prompt = 密码:
login-page-login-button = 登录
login-page-close-button = 关闭
login-page-existing-sessions-prompt = 从已有会话中选一个:
login-page-alternative-password-login-prompt = 或者用用户 id 和密码启动新会话:
login-page-restore-session-button = 恢复会话
main-page-title = { -kt-app-name } - { $userId }
main-page-recent-tab-title = 最近
main-page-people-tab-title = 人们
main-page-rooms-tab-title = 房间
room-list-view-room-item-title = { $name } ({ $roomId })
room-list-view-room-item-fav-action = 设为最爱
room-list-view-room-item-fav-action-notification = 把 { $name } 设为了最爱
send-message-box-input-placeholder = 在此输入您的讯息...
## 状态事件
## 通用参数:
## gender = 发送者的性别(male/female/neutral)
## stateKeyUser = state key 用户的名字
## stateKeyUserGender = state key 用户的性别
member-state-joined-room = 加入了房间。
member-state-changed-name-and-avatar = 修改了名字和头像。
member-state-changed-name = 修改了名字。
member-state-changed-avatar = 修改了头像。
member-state-invited = 把 { $stateKeyUser } 邀请到了本房间。
member-state-left = 离开了房间。
member-state-kicked = 踢出了 { $stateKeyUser }。
member-state-banned = 封禁了 { $stateKeyUser }。
member-state-unbanned = 解封了 { $stateKeyUser }。
state-room-created = 创建了房间。
state-room-name-changed = 把房间名字改成了 { $newName }。
state-room-topic-changed = 把房间话题改成了 { $newTopic }。
state-room-avatar-changed = 修改了房间头像。
state-room-pinned-events-changed = 修改了房间的置顶讯息。
state-room-alias-changed = 修改了房间的别名。
state-room-join-rules-changed = 修改了房间的加入规则。
state-room-power-levels-changed = 修改了房间的权限。
state-room-encryption-activated = 对本房间启用了加密。
event-message-image-sent = 发送了图片「{ $body }」。
+event-message-file-sent = 发送了文件「{ $body }」。
+event-message-video-sent = 发送了视频「{ $body }」。
+event-message-audio-sent = 发送了音频「{ $body }」。
+event-message-audio-play-audio = 播放音频
diff --git a/src/l10n/en/100-ui.ftl b/src/l10n/en/100-ui.ftl
index 47528b3..faa4f47 100644
--- a/src/l10n/en/100-ui.ftl
+++ b/src/l10n/en/100-ui.ftl
@@ -1,85 +1,89 @@
### Copyright (C) 2020-2021 Tusooa Zhu <tusooa@kazv.moe>
###
### This file is part of kazv.
###
### kazv is free software: you can redistribute it and/or modify
### it under the terms of the GNU Affero General Public License as
### published by the Free Software Foundation, either version 3 of the
### License, or (at your option) any later version.
###
### kazv is distributed in the hope that it will be useful,
### but WITHOUT ANY WARRANTY; without even the implied warranty of
### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
### GNU Affero General Public License for more details.
###
### You should have received a copy of the GNU Affero General Public License
### along with kazv. If not, see <https://www.gnu.org/licenses/>.
app-title = { -kt-app-name }
global-drawer-title = { -kt-app-name }
global-drawer-action-switch-account = Switch account
global-drawer-action-hard-logout = Logout
empty-room-page-title = No rooms selected
empty-room-page-description = There is no room selected now.
login-page-title = Log in
login-page-userid-prompt = User id:
login-page-userid-input-placeholder = E.g.: @foo:example.org
login-page-password-prompt = Password:
login-page-login-button = Log in
login-page-close-button = Close
login-page-existing-sessions-prompt = Choose from one of the existing sessions:
login-page-alternative-password-login-prompt = Or start a new session with user id and password:
login-page-restore-session-button = Restore session
main-page-title = { -kt-app-name } - { $userId }
main-page-recent-tab-title = Recent
main-page-people-tab-title = People
main-page-rooms-tab-title = Rooms
room-list-view-room-item-title = { $name } ({ $roomId })
room-list-view-room-item-fav-action = Set as favourite
room-list-view-room-item-fav-action-notification = Set { $name } as favourite
send-message-box-input-placeholder = Type your message here...
## State events
## Common parameters:
## gender = gender of the sender (male/female/neutral)
## stateKeyUser = name of the state key user
## stateKeyUserGender = gender of the state key user
member-state-joined-room = joined the room.
member-state-changed-name-and-avatar = changed { $gender ->
[male] his
[female] her
*[neutral] their
} name and avatar.
member-state-changed-name = changed { $gender ->
[male] his
[female] her
*[neutral] their
} name.
member-state-changed-avatar = changed { $gender ->
[male] his
[female] her
*[neutral] their
} avatar.
member-state-invited = invited { $stateKeyUser } to the room.
member-state-left = left the room.
member-state-kicked = kicked { $stateKeyUser }.
member-state-banned = banned { $stateKeyUser }.
member-state-unbanned = unbanned { $stateKeyUser }.
state-room-created = created the room.
state-room-name-changed = changed the name of the room to { $newName }.
state-room-topic-changed = changed the topic of the room to { $newTopic }.
state-room-avatar-changed = changed the avatar of the room.
state-room-pinned-events-changed = changed the pinned events of the room.
state-room-alias-changed = changed the aliases of the room.
state-room-join-rules-changed = changed join rules of the room.
state-room-power-levels-changed = changed power levels of the room.
state-room-encryption-activated = enabled encryption for this room.
event-message-image-sent = sent an image "{ $body }".
+event-message-file-sent = sent a file "{ $body }".
+event-message-video-sent = sent a video "{ $body }".
+event-message-audio-sent = sent an audio "{ $body }".
+event-message-audio-play-audio = Play audio
diff --git a/src/resources.qrc b/src/resources.qrc
index 8cf13b5..19c8593 100644
--- a/src/resources.qrc
+++ b/src/resources.qrc
@@ -1,29 +1,32 @@
<RCC>
<qresource prefix="/">
<file alias="main.qml">contents/ui/main.qml</file>
<file alias="LoginPage.qml">contents/ui/LoginPage.qml</file>
<file alias="MainPage.qml">contents/ui/MainPage.qml</file>
<file alias="TabView.qml">contents/ui/TabView.qml</file>
<file alias="Tab.qml">contents/ui/Tab.qml</file>
<file alias="RoomListView.qml">contents/ui/RoomListView.qml</file>
<file alias="RoomPage.qml">contents/ui/RoomPage.qml</file>
<file alias="RoomTimelineView.qml">contents/ui/RoomTimelineView.qml</file>
<file alias="SendMessageBox.qml">contents/ui/SendMessageBox.qml</file>
<file alias="EventView.qml">contents/ui/EventView.qml</file>
<file alias="Bubble.qml">contents/ui/Bubble.qml</file>
<file alias="event-types/Simple.qml">contents/ui/event-types/Simple.qml</file>
<file alias="event-types/Text.qml">contents/ui/event-types/Text.qml</file>
<file alias="event-types/Emote.qml">contents/ui/event-types/Emote.qml</file>
<file alias="event-types/Notice.qml">contents/ui/event-types/Notice.qml</file>
<file alias="event-types/State.qml">contents/ui/event-types/State.qml</file>
<file alias="event-types/TextTemplate.qml">contents/ui/event-types/TextTemplate.qml</file>
<file alias="event-types/Image.qml">contents/ui/event-types/Image.qml</file>
+ <file alias="event-types/File.qml">contents/ui/event-types/File.qml</file>
+ <file alias="event-types/Video.qml">contents/ui/event-types/Video.qml</file>
+ <file alias="event-types/Audio.qml">contents/ui/event-types/Audio.qml</file>
<file alias="l10n.js">js/l10n.js</file>
<file alias="fluent-bundle.js">js/transformed-libs/fluent-bundle.js</file>
<file alias="fluent-sequence.js">js/transformed-libs/fluent-sequence.js</file>
<file alias="fluent-langneg.js">js/transformed-libs/fluent-langneg.js</file>
<file alias="bundled-deps.js">js/transformed-libs/bundled-deps.js</file>
<file alias="global-this.js">js/global-this.js</file>
</qresource>
</RCC>

File Metadata

Mime Type
text/x-diff
Expires
Sun, Jan 19, 4:42 PM (1 d, 4 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
55329
Default Alt Text
(24 KB)

Event Timeline