Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
mobile Datovka
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
14
Issues
14
List
Boards
Labels
Service Desk
Milestones
Merge Requests
4
Merge Requests
4
Operations
Operations
Incidents
Packages & Registries
Packages & Registries
Container Registry
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Datovka projects
mobile Datovka
Commits
9d547b65
Commit
9d547b65
authored
Mar 16, 2017
by
Martin Straka
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
iOS: Updated objective-c codes, refactoring, used qml-interaction-zfo
parent
96db84a2
Changes
15
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
221 additions
and
87 deletions
+221
-87
ios/Info.tmp
ios/Info.tmp
+22
-22
ios/src/app_delegate.mm
ios/src/app_delegate.mm
+10
-9
ios/src/doc_view_controller.h
ios/src/doc_view_controller.h
+23
-0
ios/src/doc_view_controller.mm
ios/src/doc_view_controller.mm
+31
-2
ios/src/ios_file_opener.h
ios/src/ios_file_opener.h
+4
-5
ios/src/ios_file_opener.mm
ios/src/ios_file_opener.mm
+21
-27
ios/src/qt_app_delegate.h
ios/src/qt_app_delegate.h
+3
-3
ios/src/send_email_controller.h
ios/src/send_email_controller.h
+25
-2
ios/src/send_email_controller.mm
ios/src/send_email_controller.mm
+33
-8
ios/src/url_opener.h
ios/src/url_opener.h
+14
-2
ios/src/url_opener.mm
ios/src/url_opener.mm
+0
-1
qml/main.qml
qml/main.qml
+5
-0
src/files.cpp
src/files.cpp
+12
-0
src/files.h
src/files.h
+12
-0
src/main.cpp
src/main.cpp
+6
-6
No files found.
ios/Info.tmp
View file @
9d547b65
...
...
@@ -13,41 +13,41 @@
<string>
ZFO file
</string>
<key>
LSHandlerRank
</key>
<string>
Owner
</string>
<key>
CFBundleTypeRole
</key>
<string>
Editor
</string>
<key>
CFBundleTypeRole
</key>
<string>
Editor
</string>
<key>
LSItemContentTypes
</key>
<array>
<string>
cz.nic.mobile-datovka.zfo
</string>
</array>
<key>
CFBundleTypeIconFiles
</key>
<array>
<string>
AppIcon_
4
0px.png
</string>
<string>
AppIcon_
8
0px.png
</string>
</array>
</dict>
</array>
<key>
UTExportedTypeDeclarations
</key>
<array>
<dict>
<key>
UTTypeDescription
</key>
<string>
ZFO - 602XML Form Or Data Message Format
</string>
<key>
UTTypeConformsTo
</key>
<array>
<string>
public.data
</string>
</array>
<key>
UTTypeIdentifier
</key>
<string>
cz.nic.mobile-datovka.zfo
</string>
<key>
UTTypeSize320IconFile
</key>
<string>
4S@2x
</string>
<key>
UTTypeSize64IconFile
</key>
<string>
4
</string>
<key>
UTTypeTagSpecification
</key>
<dict>
<key>
public.filename-extension
</key>
<string>
zfo
</string>
<key>
public.mime-type
</key>
<string>
application/vnd.software602.filler.form-xml-zip
</string>
<key>
UTTypeDescription
</key>
<string>
ZFO - 602XML Form Or Data Message Format
</string>
<key>
UTTypeConformsTo
</key>
<array>
<string>
public.data
</string>
</array>
<key>
UTTypeIdentifier
</key>
<string>
cz.nic.mobile-datovka.zfo
</string>
<key>
UTTypeSize320IconFile
</key>
<string>
4S@2x
</string>
<key>
UTTypeSize64IconFile
</key>
<string>
4
</string>
<key>
UTTypeTagSpecification
</key>
<dict>
<key>
public.filename-extension
</key>
<string>
zfo
</string>
<key>
public.mime-type
</key>
<string>
application/vnd.software602.filler.form-xml-zip
</string>
</dict>
</dict>
</dict>
</array>
<key>
CFBundleExecutable
</key>
<string>
mobile-datovka
</string>
...
...
ios/src/app_delegate.mm
View file @
9d547b65
...
...
@@ -22,14 +22,14 @@
*/
#include <QtCore>
#include "src/
files
.h"
#include "src/
qml_interaction/interaction_zfo_file
.h"
#import "app_delegate.h"
@implementation
QtAppDelegate
/* Pointer to
Files object - use openZfoFileFromStorage for zfo showing
*/
Files
*
files
Ptr
;
/* Pointer to
InteractionZfoFile object
*/
InteractionZfoFile
*
interactionZfoFile
Ptr
;
+
(
QtAppDelegate
*
)
sharedQtAppDelegate
{
...
...
@@ -39,7 +39,8 @@ Files *filesPtr;
return
shared
;
}
-
(
BOOL
)
application
:(
UIApplication
*
)
application
openURL
:(
NSURL
*
)
url
sourceApplication
:(
NSString
*
)
sourceApplication
annotation
:(
id
)
annotation
-
(
BOOL
)
application
:(
UIApplication
*
)
application
openURL
:(
NSURL
*
)
url
sourceApplication
:(
NSString
*
)
sourceApplication
annotation
:(
id
)
annotation
{
Q_UNUSED
(
application
);
Q_UNUSED
(
sourceApplication
);
...
...
@@ -48,18 +49,18 @@ Files *filesPtr;
if
(
url
!=
nil
&&
[
url
isFileURL
])
{
if
([[
url
pathExtension
]
isEqualToString
:
@"zfo"
])
{
//NSLog(@"URL:%@", [url absoluteString]);
if
(
Q_NULLPTR
!=
files
Ptr
)
{
filesPtr
->
openZfoFileFromStorag
e
(
QString
::
fromNSString
(
url
.
path
));
if
(
Q_NULLPTR
!=
interactionZfoFile
Ptr
)
{
interactionZfoFilePtr
->
openZfoFil
e
(
QString
::
fromNSString
(
url
.
path
));
}
}
}
return
YES
;
}
void
QtAppDelegateInitialize
(
Files
*
files
)
void
QtAppDelegateInitialize
(
InteractionZfoFile
*
interactionZfoFile
)
{
/* Pointer to
Files
object */
filesPtr
=
files
;
/* Pointer to
InteractionZfoFile
object */
interactionZfoFilePtr
=
interactionZfoFile
;
/* Init share app delegate with iOS */
[[
UIApplication
sharedApplication
]
setDelegate
:[
QtAppDelegate
sharedQtAppDelegate
]];
//NSLog(@"Created a new appdelegate");
...
...
ios/src/doc_view_controller.h
View file @
9d547b65
/*
* Copyright (C) 2014-2017 CZ.NIC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations including
* the two.
*/
#import <UIKit/UIKit.h>
@interface
DocViewController
:
UIViewController
<
UIDocumentInteractionControllerDelegate
>
...
...
ios/src/doc_view_controller.mm
View file @
9d547b65
/*
* Copyright (C) 2014-2017 CZ.NIC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations including
* the two.
*/
#import "doc_view_controller.h"
#include <QtCore>
@interface
DocViewController
()
@end
...
...
@@ -8,19 +33,23 @@
#pragma mark -
#pragma mark View Life Cycle
-
(
void
)
viewDidLoad
{
-
(
void
)
viewDidLoad
{
[
super
viewDidLoad
];
}
#pragma mark -
#pragma mark Document Interaction Controller Delegate Methods
-
(
UIViewController
*
)
documentInteractionControllerViewControllerForPreview
:
(
UIDocumentInteractionController
*
)
controller
{
-
(
UIViewController
*
)
documentInteractionControllerViewControllerForPreview
:
(
UIDocumentInteractionController
*
)
controller
{
Q_UNUSED
(
controller
);
//return [[[[UIApplication sharedApplication]windows] firstObject]rootViewController];
return
self
;
}
-
(
void
)
documentInteractionControllerDidEndPreview
:(
UIDocumentInteractionController
*
)
controller
{
Q_UNUSED
(
controller
);
[
self
removeFromParentViewController
];
}
...
...
ios/src/ios_file_opener.h
View file @
9d547b65
/*
* Copyright (C) 2014-201
6
CZ.NIC
* Copyright (C) 2014-201
7
CZ.NIC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
...
...
@@ -27,14 +27,13 @@
#include <QtCore/QtGlobal>
#ifdef Q_OS_IOS
//#import <Foundation/Foundation.h>
//#import <Foundation/NSString.h>
#import <UIKit/UIKit.h>
@interface
iOSFileOpener
:
NSObject
<
UIDocumentInteractionControllerDelegate
>
+
(
iOSFileOpener
*
)
getInstance
;
-
(
void
)
openFile
:(
NSString
*
)
path
fromViewController
:(
UIViewController
*
)
viewController
;
+
(
iOSFileOpener
*
)
getInstance
;
-
(
void
)
openFile
:(
NSString
*
)
path
fromViewController
:(
UIViewController
*
)
viewController
;
@end
...
...
ios/src/ios_file_opener.mm
View file @
9d547b65
/*
* Copyright (C) 2014-201
6
CZ.NIC
* Copyright (C) 2014-201
7
CZ.NIC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
...
...
@@ -25,7 +25,6 @@
#include <QtCore>
@interface
iOSFileOpener
()
@property
(
nonatomic
)
bool
visible
;
@property
(
nonatomic
,
strong
)
UIViewController
*
viewController
;
...
...
@@ -36,51 +35,46 @@
+
(
iOSFileOpener
*
)
getInstance
{
static
dispatch_once_t
pred
;
static
iOSFileOpener
*
instance
=
nil
;
static
dispatch_once_t
pred
;
static
iOSFileOpener
*
instance
=
nil
;
dispatch_once
(
&
pred
,
^
{
instance
=
[[
iOSFileOpener
alloc
]
init
];
});
return
instance
;
dispatch_once
(
&
pred
,
^
{
instance
=
[[
iOSFileOpener
alloc
]
init
];});
return
instance
;
}
-
(
id
)
init
{
self
=
[
super
init
];
if
(
!
self
)
return
nil
;
self
=
[
super
init
];
if
(
!
self
)
return
nil
;
self
.
visible
=
false
;
self
.
documentInteractionController
=
[[
UIDocumentInteractionController
alloc
]
init
];
[
self
.
documentInteractionController
setDelegate
:
self
];
self
.
visible
=
false
;
self
.
documentInteractionController
=
[[
UIDocumentInteractionController
alloc
]
init
];
[
self
.
documentInteractionController
setDelegate
:
self
];
return
self
;
return
self
;
}
-
(
void
)
openFile
:(
NSString
*
)
path
fromViewController
:(
UIViewController
*
)
viewController
{
if
(
self
.
visible
)
return
;
if
(
self
.
visible
)
return
;
self
.
visible
=
true
;
self
.
viewController
=
viewController
;
NSURL
*
urlPath
=
[
NSURL
URLWithString
:[
path
stringByAddingPercentEscapesUsingEncoding
:
NSUTF8StringEncoding
]];
self
.
documentInteractionController
.
URL
=
urlPath
;
[
self
.
documentInteractionController
presentPreviewAnimated
:
YES
];
self
.
visible
=
true
;
self
.
viewController
=
viewController
;
NSURL
*
urlPath
=
[
NSURL
URLWithString
:[
path
stringByAddingPercentEscapesUsingEncoding
:
NSUTF8StringEncoding
]];
self
.
documentInteractionController
.
URL
=
urlPath
;
[
self
.
documentInteractionController
presentPreviewAnimated
:
YES
];
}
-
(
UIViewController
*
)
documentInteractionControllerViewControllerForPreview
:(
UIDocumentInteractionController
*
)
controller
{
Q_UNUSED
(
controller
);
return
self
.
viewController
;
Q_UNUSED
(
controller
);
return
self
.
viewController
;
}
-
(
void
)
documentInteractionControllerDidEndPreview
:(
UIDocumentInteractionController
*
)
controller
{
Q_UNUSED
(
controller
);
self
.
visible
=
false
;
Q_UNUSED
(
controller
);
self
.
visible
=
false
;
}
@end
ios/src/qt_app_delegate.h
View file @
9d547b65
...
...
@@ -24,14 +24,14 @@
#ifndef QTAPPDELEGATECINTERFACE_H
#define QTAPPDELEGATECINTERFACE_H
#include "src/
files
.h"
#include "src/
qml_interaction/interaction_zfo_file
.h"
/*!
* @brief Inicialization of App Delegate for interaction with iOS service
* "Open in" in Qt.
*
* @param[in]
files Pointer to Files
object.
* @param[in]
interactionZfoFile Pointer to InteractionZfoFile
object.
*/
void
QtAppDelegateInitialize
(
Files
*
files
);
void
QtAppDelegateInitialize
(
InteractionZfoFile
*
interactionZfoFile
);
#endif // QTAPPDELEGATECINTERFACE_H
ios/src/send_email_controller.h
View file @
9d547b65
/*
* Copyright (C) 2014-2017 CZ.NIC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations including
* the two.
*/
#import <UIKit/UIKit.h>
#import <MessageUI/MessageUI.h>
#import <MessageUI/MFMailComposeViewController.h>
...
...
@@ -6,7 +29,7 @@
@interface
SimpleEmailSendController
:
UIViewController
<
MFMailComposeViewControllerDelegate
>
{
}
-
(
void
)
createEmail
:(
NSString
*
)
body
sub
:(
NSString
*
)
subject
files
:(
NSArray
*
)
filePaths
;
-
(
void
)
createEmail
:(
NSString
*
)
body
sub
:(
NSString
*
)
subject
files
:(
NSArray
*
)
filePaths
;
@end
ios/src/send_email_controller.mm
View file @
9d547b65
/*
* Copyright (C) 2014-2017 CZ.NIC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations including
* the two.
*/
#import "send_email_controller.h"
#include <QtCore>
@implementation
SimpleEmailSendController
-
(
void
)
showCantSendMailAlert
{
-
(
void
)
showCantSendMailAlert
{
UIAlertView
*
alert
=
[[
UIAlertView
alloc
]
initWithTitle
:
NSLocalizedString
(
@"Can't send email"
,
@"Can't send email"
)
message:
NSLocalizedString
(
@"The device is not configured for sending email"
,
@"The device is not configured for sending email"
)
delegate:
self
...
...
@@ -12,8 +38,8 @@
[
alert
release
];
}
-
(
NSString
*
)
guessMIMETypeFromFileName
:(
NSString
*
)
fileName
{
-
(
NSString
*
)
guessMIMETypeFromFileName
:(
NSString
*
)
fileName
{
CFStringRef
UTI
=
UTTypeCreatePreferredIdentifierForTag
(
kUTTagClassFilenameExtension
,
(
__bridge
CFStringRef
)[
fileName
pathExtension
],
NULL
);
CFStringRef
MIMEType
=
UTTypeCopyPreferredTagWithClass
(
UTI
,
kUTTagClassMIMEType
);
CFRelease
(
UTI
);
...
...
@@ -23,8 +49,8 @@
return
(
__bridge
NSString
*
)(
MIMEType
);
}
-
(
void
)
createEmail
:(
NSString
*
)
body
sub
:(
NSString
*
)
subject
files
:(
NSArray
*
)
filePaths
-
(
void
)
createEmail
:(
NSString
*
)
body
sub
:(
NSString
*
)
subject
files
:(
NSArray
*
)
filePaths
{
if
(
!
[
MFMailComposeViewController
canSendMail
])
{
[
self
showCantSendMailAlert
];
...
...
@@ -41,9 +67,7 @@
for
(
NSUInteger
i
=
0
;
i
<
[
filePaths
count
];
i
++
)
{
NSData
*
filedata
=
[
NSData
dataWithContentsOfFile
:
filePaths
[
i
]];
NSString
*
filename
=
[
filePaths
[
i
]
lastPathComponent
];
//NSLog(filename);
NSString
*
mimetype
=
[
self
guessMIMETypeFromFileName
:
filename
];
//NSLog(mimetype);
[
controller
addAttachmentData
:
filedata
mimeType
:
mimetype
fileName
:
filename
];
}
...
...
@@ -51,10 +75,11 @@
[
controller
release
];
}
-
(
void
)
mailComposeController
:(
MFMailComposeViewController
*
)
controller
didFinishWithResult
:(
MFMailComposeResult
)
result
error
:(
NSError
*
)
error
{
Q_UNUSED
(
controller
);
if
(
error
)
{
NSLog
(
@"Error : %@"
,
error
);
}
...
...
ios/src/url_opener.h
View file @
9d547b65
/*
* Copyright (C) 2014-201
6
CZ.NIC
* Copyright (C) 2014-201
7
CZ.NIC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
...
...
@@ -33,7 +33,7 @@
*/
/*!
* @brief Used for opening URLs on iOS.
* @brief Used for opening URLs
and create email with attachments
on iOS.
*/
class
UrlOpener
:
public
QObject
{
Q_OBJECT
...
...
@@ -46,8 +46,20 @@ public:
*/
UrlOpener
(
QObject
*
parent
=
0
);
/*!
* @brief Open file on iOS.
*
* @param[in] filePath Path to file.
*/
void
openFile
(
const
QString
&
filePath
);
/*!
* @brief Create email on iOS.
*
* @param[in] bodyText Email text.
* @param[in] subject Email subject.
* @param[in] filePaths Paths to attachment files.
*/
void
createEmail
(
const
QString
&
bodyText
,
const
QString
&
subject
,
const
QStringList
&
filePaths
);
};
...
...
ios/src/url_opener.mm
View file @
9d547b65
...
...
@@ -72,7 +72,6 @@ void UrlOpener::openFile(const QString &filePath)
#endif
/* !Q_OS_IOS */
}
void
UrlOpener
::
createEmail
(
const
QString
&
bodyText
,
const
QString
&
subject
,
const
QStringList
&
filePaths
)
{
...
...
qml/main.qml
View file @
9d547b65
...
...
@@ -294,6 +294,11 @@ ApplicationWindow {
"
fromLocalDb
"
:
false
,
"
rawZfoContent
"
:
fileContent
},
StackView
.
Immediate
)
/*
* Next function has effect only for iOS.
* Detail info is in the header file.
*/
files
.
deleteTmpFileFromStorage
(
filePath
)
}
}
...
...
src/files.cpp
View file @
9d547b65
...
...
@@ -575,6 +575,8 @@ void Files::sendEmail(const QString &emailMessage, const QStringList &fileList,
{
Q_UNUSED
(
subject
);
Q_UNUSED
(
body
);
Q_UNUSED
(
emailMessage
);
Q_UNUSED
(
msgId
);
if
(
!
fileList
.
isEmpty
())
{
...
...
@@ -901,3 +903,13 @@ bool Files::setAttachmentModel(FileListModel &attachModel,
return
parseXmlData
(
Q_NULLPTR
,
Q_NULLPTR
,
Q_NULLPTR
,
&
attachModel
,
Q_NULLPTR
,
getXmlFromCms
(
rawZfoData
));
}
void
Files
::
deleteTmpFileFromStorage
(
const
QString
&
filePath
)
{
#if defined Q_OS_IOS
QFile
file
(
filePath
);
file
.
remove
();
#else
Q_UNUSED
(
filePath
);
#endif
/* defined Q_OS_IOS */
}
src/files.h
View file @
9d547b65
...
...
@@ -202,6 +202,18 @@ public:
bool
setAttachmentModel
(
FileListModel
&
attachModel
,
const
QByteArray
&
rawZfoData
);
/*!
* @brief Delete temporary file from storage.
*
* @note This function is used on iOS when external ZFO file is opened.
* iOS moves target file to Datovka private folder. Here, after
* reading of file content, Datovka must this file removed itself.
*
* @param[filePath] Path to file.
*/
Q_INVOKABLE
void
deleteTmpFileFromStorage
(
const
QString
&
filePath
);
class
File
{
public:
File
(
void
)
...
...
src/main.cpp
View file @
9d547b65
...
...
@@ -218,12 +218,6 @@ int main(int argc, char *argv[])
IsdsWrapper
isds
;
GlobalSettingsQmlWrapper
settings
;
/* Inicialize app delegate component for interaction with iOS
* Reaction on the iOS action "Open in..." */
#if defined Q_OS_IOS
QtAppDelegateInitialize
(
&
files
);
#endif
/* Connect slot for update message detail after downloading */
QObject
::
connect
(
&
isds
,
SIGNAL
(
messageDownloadFinish
(
QString
,
qint64
)),
&
messages
,
SLOT
(
fillMessageDetail
(
QString
,
qint64
)));
...
...
@@ -259,6 +253,12 @@ int main(int argc, char *argv[])
InteractionZfoFile
interactionZfoFile
;
/* Inicialize app delegate component for interaction with iOS
* Reaction on the iOS action "Open in..." */
#if defined Q_OS_IOS
QtAppDelegateInitialize
(
&
interactionZfoFile
);
#endif
/* register classes in QML */
ctx
->
setContextProperty
(
"isds"
,
&
isds
);
ctx
->
setContextProperty
(
"messages"
,
&
messages
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment