Skip to content
GitLab
Explore
Projects
Groups
Topics
Snippets
Projects
Groups
Topics
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
BC
public
external
Qt
QtMultimedia
Commits
4b8bb5ce
Commit
4b8bb5ce
authored
11 years ago
by
Frederik Gladhorn
Committed by
The Qt Project
11 years ago
Browse files
Options
Download
Plain Diff
Merge "Merge remote-tracking branch 'origin/stable' into dev" into refs/staging/dev
parents
206cf434
74e4b59e
dev
5.10
5.11
5.12
5.12.1
5.12.10
5.12.11
5.12.12
5.12.2
5.12.3
5.12.4
5.12.5
5.12.6
5.12.7
5.12.8
5.12.9
5.13
5.13.0
5.13.1
5.13.2
5.14
5.14.0
5.14.1
5.14.2
5.15
5.15.0
5.15.1
5.15.2
5.3
5.4
5.5
5.6
5.7
5.8
5.9
5.9.8
6.2
6.2.0
6.2.1
6.2.2
old/5.2
wip/cmake
wip/qt6
v5.15.0-alpha1
v5.14.1
v5.14.0
v5.14.0-rc2
v5.14.0-rc1
v5.14.0-beta3
v5.14.0-beta2
v5.14.0-beta1
v5.14.0-alpha1
v5.13.2
v5.13.1
v5.13.0
v5.13.0-rc3
v5.13.0-rc2
v5.13.0-rc1
v5.13.0-beta4
v5.13.0-beta3
v5.13.0-beta2
v5.13.0-beta1
v5.13.0-alpha1
v5.12.7
v5.12.6
v5.12.5
v5.12.4
v5.12.3
v5.12.2
v5.12.1
v5.12.0
v5.12.0-rc2
v5.12.0-rc1
v5.12.0-beta4
v5.12.0-beta3
v5.12.0-beta2
v5.12.0-beta1
v5.12.0-alpha1
v5.11.3
v5.11.2
v5.11.1
v5.11.0
v5.11.0-rc2
v5.11.0-rc1
v5.11.0-beta4
v5.11.0-beta3
v5.11.0-beta2
v5.11.0-beta1
v5.11.0-alpha1
v5.10.1
v5.10.0
v5.10.0-rc3
v5.10.0-rc2
v5.10.0-rc1
v5.10.0-beta4
v5.10.0-beta3
v5.10.0-beta2
v5.10.0-beta1
v5.10.0-alpha1
v5.9.9
v5.9.8
v5.9.7
v5.9.6
v5.9.5
v5.9.4
v5.9.3
v5.9.2
v5.9.1
v5.9.0
v5.9.0-rc2
v5.9.0-rc1
v5.9.0-beta4
v5.9.0-beta3
v5.9.0-beta2
v5.9.0-beta1
v5.9.0-alpha1
v5.8.0
v5.8.0-rc1
v5.8.0-beta1
v5.8.0-alpha1
v5.7.1
v5.7.0
v5.7.0-rc1
v5.7.0-beta1
v5.7.0-alpha1
v5.6.3
v5.6.2
v5.6.1
v5.6.1-1
v5.6.0
v5.6.0-rc1
v5.6.0-beta1
v5.6.0-alpha1
v5.5.1
v5.5.0
v5.5.0-rc1
v5.5.0-beta1
v5.5.0-alpha1
v5.4.2
v5.4.1
v5.4.0
v5.4.0-rc1
v5.4.0-beta1
v5.4.0-alpha1
v5.3.2
v5.3.1
v5.3.0
v5.3.0-rc1
v5.3.0-beta1
v5.3.0-alpha1
v5.2.1
v5.2.0
v5.2.0-rc1
v5.2.0-beta1
v5.2.0-alpha1
No related merge requests found
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
config.tests/resourcepolicy/resourcepolicy.pro
+1
-1
config.tests/resourcepolicy/resourcepolicy.pro
src/gsttools/gsttools.pro
+1
-1
src/gsttools/gsttools.pro
src/multimedia/audio/qwavedecoder_p.cpp
+11
-14
src/multimedia/audio/qwavedecoder_p.cpp
src/plugins/gstreamer/common.pri
+1
-1
src/plugins/gstreamer/common.pri
src/plugins/plugins.pro
+5
-0
src/plugins/plugins.pro
src/plugins/resourcepolicy/resourcepolicy.json
+4
-0
src/plugins/resourcepolicy/resourcepolicy.json
src/plugins/resourcepolicy/resourcepolicy.pro
+21
-0
src/plugins/resourcepolicy/resourcepolicy.pro
src/plugins/resourcepolicy/resourcepolicyimpl.cpp
+137
-0
src/plugins/resourcepolicy/resourcepolicyimpl.cpp
src/plugins/resourcepolicy/resourcepolicyimpl.h
+84
-0
src/plugins/resourcepolicy/resourcepolicyimpl.h
src/plugins/resourcepolicy/resourcepolicyplugin.cpp
+64
-0
src/plugins/resourcepolicy/resourcepolicyplugin.cpp
src/plugins/resourcepolicy/resourcepolicyplugin.h
+61
-0
src/plugins/resourcepolicy/resourcepolicyplugin.h
with
390 additions
and
17 deletions
config.tests/resourcepolicy/resourcepolicy.pro
+
1
−
1
View file @
4b8bb5ce
...
@@ -3,5 +3,5 @@ SOURCES += main.cpp
...
@@ -3,5 +3,5 @@ SOURCES += main.cpp
CONFIG
+=
link_pkgconfig
CONFIG
+=
link_pkgconfig
PKGCONFIG
+=
\
PKGCONFIG
+=
\
libresourceqt
1
libresourceqt
5
This diff is collapsed.
Click to expand it.
src/gsttools/gsttools.pro
+
1
−
1
View file @
4b8bb5ce
...
@@ -26,7 +26,7 @@ maemo*:PKGCONFIG +=gstreamer-plugins-bad-0.10
...
@@ -26,7 +26,7 @@ maemo*:PKGCONFIG +=gstreamer-plugins-bad-0.10
config_resourcepolicy
{
config_resourcepolicy
{
DEFINES
+=
HAVE_RESOURCE_POLICY
DEFINES
+=
HAVE_RESOURCE_POLICY
PKGCONFIG
+=
libresourceqt
1
PKGCONFIG
+=
libresourceqt
5
}
}
#
Header
files
must
go
inside
source
directory
of
a
module
#
Header
files
must
go
inside
source
directory
of
a
module
...
...
This diff is collapsed.
Click to expand it.
src/multimedia/audio/qwavedecoder_p.cpp
+
11
−
14
View file @
4b8bb5ce
...
@@ -244,16 +244,18 @@ bool QWaveDecoder::enoughDataAvailable()
...
@@ -244,16 +244,18 @@ bool QWaveDecoder::enoughDataAvailable()
bool
QWaveDecoder
::
findChunk
(
const
char
*
chunkId
)
bool
QWaveDecoder
::
findChunk
(
const
char
*
chunkId
)
{
{
chunk
descriptor
;
chunk
descriptor
;
if
(
!
peekChunk
(
&
descriptor
))
return
false
;
if
(
qstrncmp
(
descriptor
.
id
,
chunkId
,
4
)
==
0
)
do
{
return
true
;
if
(
!
peekChunk
(
&
descriptor
))
return
false
;
if
(
qstrncmp
(
descriptor
.
id
,
chunkId
,
4
)
==
0
)
return
true
;
// It's possible that bytes->available() is less than the chunk size
// if it's corrupt.
junkToSkip
=
qint64
(
sizeof
(
chunk
)
+
descriptor
.
size
);
// It's possible that bytes->available() is less than the chunk size
// if it's corrupt.
junkToSkip
=
qint64
(
sizeof
(
chunk
)
+
descriptor
.
size
);
while
(
source
->
bytesAvailable
()
>
0
)
{
// Skip the current amount
// Skip the current amount
if
(
junkToSkip
>
0
)
if
(
junkToSkip
>
0
)
discardBytes
(
junkToSkip
);
discardBytes
(
junkToSkip
);
...
@@ -263,12 +265,7 @@ bool QWaveDecoder::findChunk(const char *chunkId)
...
@@ -263,12 +265,7 @@ bool QWaveDecoder::findChunk(const char *chunkId)
if
(
junkToSkip
>
0
)
if
(
junkToSkip
>
0
)
return
false
;
return
false
;
if
(
!
peekChunk
(
&
descriptor
))
}
while
(
source
->
bytesAvailable
()
>
0
);
return
false
;
if
(
qstrncmp
(
descriptor
.
id
,
chunkId
,
4
)
==
0
)
return
true
;
}
return
false
;
return
false
;
}
}
...
...
This diff is collapsed.
Click to expand it.
src/plugins/gstreamer/common.pri
+
1
−
1
View file @
4b8bb5ce
...
@@ -23,7 +23,7 @@ maemo*:PKGCONFIG +=gstreamer-plugins-bad-0.10
...
@@ -23,7 +23,7 @@ maemo*:PKGCONFIG +=gstreamer-plugins-bad-0.10
config_resourcepolicy {
config_resourcepolicy {
DEFINES += HAVE_RESOURCE_POLICY
DEFINES += HAVE_RESOURCE_POLICY
PKGCONFIG += libresourceqt
1
PKGCONFIG += libresourceqt
5
}
}
config_xvideo:qtHaveModule(widgets) {
config_xvideo:qtHaveModule(widgets) {
...
...
This diff is collapsed.
Click to expand it.
src/plugins/plugins.pro
+
5
−
0
View file @
4b8bb5ce
...
@@ -56,3 +56,8 @@ mac:!simulator {
...
@@ -56,3 +56,8 @@ mac:!simulator {
config_opensles
{
config_opensles
{
SUBDIRS
+=
opensles
SUBDIRS
+=
opensles
}
}
config_resourcepolicy
{
SUBDIRS
+=
resourcepolicy
}
This diff is collapsed.
Click to expand it.
src/plugins/resourcepolicy/resourcepolicy.json
0 → 100644
+
4
−
0
View file @
4b8bb5ce
{
"Keys"
:
[
"resourcepolicy"
],
"Services"
:
[
"org.qt-project.qt.mediaplayerresourcesetfactory"
,
"default"
]
}
This diff is collapsed.
Click to expand it.
src/plugins/resourcepolicy/resourcepolicy.pro
0 → 100644
+
21
−
0
View file @
4b8bb5ce
TARGET
=
resourceqt
QT
+=
multimedia
-
private
CONFIG
+=
no_private_qt_headers_warning
link_pkgconfig
PKGCONFIG
+=
libresourceqt5
PLUGIN_TYPE
=
resourcepolicy
PLUGIN_CLASS_NAME
=
ResourceQtPolicyPlugin
load
(
qt_plugin
)
INCLUDEPATH
+=
$$
PWD
\
$$
{
SOURCE_DIR
}
/
src
/
multimedia
HEADERS
+=
\
$$
PWD
/
resourcepolicyplugin
.
h
\
$$
PWD
/
resourcepolicyimpl
.
h
SOURCES
+=
\
$$
PWD
/
resourcepolicyplugin
.
cpp
\
$$
PWD
/
resourcepolicyimpl
.
cpp
This diff is collapsed.
Click to expand it.
src/plugins/resourcepolicy/resourcepolicyimpl.cpp
0 → 100644
+
137
−
0
View file @
4b8bb5ce
/****************************************************************************
**
** Copyright (C) 2013 Jolla Ltd, author: <robin.burchell@jollamobile.com>
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU General Public License version 3.0 requirements will be
** met: http://www.gnu.org/copyleft/gpl.html.
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include
<policy/resource.h>
#include
<policy/resources.h>
#include
<policy/resource-set.h>
#include
"resourcepolicyimpl.h"
ResourcePolicyImpl
::
ResourcePolicyImpl
(
QObject
*
parent
)
:
QMediaPlayerResourceSetInterface
(
parent
)
{
m_resourceSet
=
new
ResourcePolicy
::
ResourceSet
(
"player"
,
this
);
m_resourceSet
->
setAlwaysReply
();
ResourcePolicy
::
AudioResource
*
audioResource
=
new
ResourcePolicy
::
AudioResource
(
"player"
);
audioResource
->
setProcessID
(
QCoreApplication
::
applicationPid
());
audioResource
->
setStreamTag
(
"media.name"
,
"*"
);
m_resourceSet
->
addResourceObject
(
audioResource
);
m_resourceSet
->
addResource
(
ResourcePolicy
::
VideoPlaybackType
);
m_resourceSet
->
update
();
connect
(
m_resourceSet
,
SIGNAL
(
resourcesGranted
(
const
QList
<
ResourcePolicy
::
ResourceType
>
)),
this
,
SLOT
(
handleResourcesGranted
()));
connect
(
m_resourceSet
,
SIGNAL
(
resourcesDenied
()),
this
,
SLOT
(
handleResourcesDenied
()));
connect
(
m_resourceSet
,
SIGNAL
(
lostResources
()),
this
,
SLOT
(
handleResourcesLost
()));
connect
(
m_resourceSet
,
SIGNAL
(
resourcesReleasedByManager
()),
this
,
SLOT
(
handleResourcesLost
()));
}
bool
ResourcePolicyImpl
::
isVideoEnabled
()
const
{
return
m_videoEnabled
;
}
void
ResourcePolicyImpl
::
setVideoEnabled
(
bool
videoEnabled
)
{
if
(
m_videoEnabled
!=
videoEnabled
)
{
m_videoEnabled
=
videoEnabled
;
if
(
videoEnabled
)
m_resourceSet
->
addResource
(
ResourcePolicy
::
VideoPlaybackType
);
else
m_resourceSet
->
deleteResource
(
ResourcePolicy
::
VideoPlaybackType
);
m_resourceSet
->
update
();
}
}
void
ResourcePolicyImpl
::
acquire
()
{
m_status
=
RequestedResource
;
m_resourceSet
->
acquire
();
}
void
ResourcePolicyImpl
::
release
()
{
m_resourceSet
->
release
();
m_status
=
Initial
;
}
bool
ResourcePolicyImpl
::
isGranted
()
const
{
return
m_status
==
GrantedResource
;
}
bool
ResourcePolicyImpl
::
isAvailable
()
const
{
// TODO: is this used? what is it for?
qWarning
()
<<
Q_FUNC_INFO
<<
"Stub"
;
return
true
;
}
void
ResourcePolicyImpl
::
handleResourcesGranted
()
{
m_status
=
GrantedResource
;
emit
resourcesGranted
();
}
void
ResourcePolicyImpl
::
handleResourcesDenied
()
{
m_status
=
Initial
;
emit
resourcesDenied
();
}
void
ResourcePolicyImpl
::
handleResourcesLost
()
{
if
(
m_status
!=
Initial
)
{
m_status
=
Initial
;
emit
resourcesLost
();
}
m_resourceSet
->
release
();
}
This diff is collapsed.
Click to expand it.
src/plugins/resourcepolicy/resourcepolicyimpl.h
0 → 100644
+
84
−
0
View file @
4b8bb5ce
/****************************************************************************
**
** Copyright (C) 2013 Jolla Ltd, author: <robin.burchell@jollamobile.com>
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU General Public License version 3.0 requirements will be
** met: http://www.gnu.org/copyleft/gpl.html.
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef RESOURCEPOLICYIMPL_H
#define RESOURCEPOLICYIMPL_H
#include
<QObject>
#include
<private/qmediaresourceset_p.h>
namespace
ResourcePolicy
{
class
ResourceSet
;
};
class
ResourcePolicyImpl
:
public
QMediaPlayerResourceSetInterface
{
Q_OBJECT
public:
ResourcePolicyImpl
(
QObject
*
parent
=
0
);
bool
isVideoEnabled
()
const
;
void
setVideoEnabled
(
bool
videoEnabled
);
void
acquire
();
void
release
();
bool
isGranted
()
const
;
bool
isAvailable
()
const
;
private
slots
:
void
handleResourcesGranted
();
void
handleResourcesDenied
();
void
handleResourcesLost
();
private:
enum
ResourceStatus
{
Initial
=
0
,
RequestedResource
,
GrantedResource
};
bool
m_videoEnabled
;
ResourcePolicy
::
ResourceSet
*
m_resourceSet
;
ResourceStatus
m_status
;
};
#endif // RESOURCEPOLICYIMPL_H
This diff is collapsed.
Click to expand it.
src/plugins/resourcepolicy/resourcepolicyplugin.cpp
0 → 100644
+
64
−
0
View file @
4b8bb5ce
/****************************************************************************
**
** Copyright (C) 2013 Jolla Ltd, author: <robin.burchell@jollamobile.com>
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU General Public License version 3.0 requirements will be
** met: http://www.gnu.org/copyleft/gpl.html.
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include
<QDebug>
#include
"resourcepolicyplugin.h"
#include
"resourcepolicyimpl.h"
ResourcePolicyPlugin
::
ResourcePolicyPlugin
(
QObject
*
parent
)
:
QMediaResourcePolicyPlugin
(
parent
)
{
}
QObject
*
ResourcePolicyPlugin
::
create
(
const
QString
&
interfaceId
)
{
// TODO: what is interfaceId for?
return
new
ResourcePolicyImpl
(
this
);
}
void
ResourcePolicyPlugin
::
destroy
(
QObject
*
resourceSet
)
{
// TODO: do we need to do anything more elaborate here?
delete
resourceSet
;
}
This diff is collapsed.
Click to expand it.
src/plugins/resourcepolicy/resourcepolicyplugin.h
0 → 100644
+
61
−
0
View file @
4b8bb5ce
/****************************************************************************
**
** Copyright (C) 2013 Jolla Ltd, author: <robin.burchell@jollamobile.com>
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU General Public License version 3.0 requirements will be
** met: http://www.gnu.org/copyleft/gpl.html.
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef RESOURCEPOLICYPLUGIN_H
#define RESOURCEPOLICYPLUGIN_H
#include
<private/qmediaresourcepolicyplugin_p.h>
#include
<QObject>
class
ResourcePolicyPlugin
:
public
QMediaResourcePolicyPlugin
{
Q_OBJECT
Q_PLUGIN_METADATA
(
IID
"org.qt-project.qt.mediaresourcesetfactory/5.0"
FILE
"resourcepolicy.json"
)
Q_INTERFACES
(
QMediaResourceSetFactoryInterface
)
public:
ResourcePolicyPlugin
(
QObject
*
parent
=
0
);
QObject
*
create
(
const
QString
&
interfaceId
);
void
destroy
(
QObject
*
resourceSet
);
};
#endif // RESOURCEPOLICYPLUGIN_H
This diff is collapsed.
Click to expand it.
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment
Menu
Explore
Projects
Groups
Topics
Snippets