Pārlūkot izejas kodu

Update samples

- Fix animation issues in addressbook
- Update certificates
- Cleanup cmake files
- Replace context properties with singleton types
- Update tutorial
Alexey Edelev 4 gadi atpakaļ
vecāks
revīzija
da24d14085

+ 7 - 2
examples/addressbook/main.cpp

@@ -45,10 +45,15 @@ int main(int argc, char *argv[])
 
     qmlRegisterType<ContactsListModel>("examples.addressbook", 1, 0, "ContactsListModel");
     QGuiApplication app(argc, argv);
-    AddressBookEngine abEngine;
+
+    qmlRegisterSingletonType<AddressBookEngine>("examples.addressbook", 1, 0, "AddressBookEngine", [](QQmlEngine *engine, QJSEngine *) -> QObject *{
+        static AddressBookEngine abEngine;
+        engine->setObjectOwnership(&abEngine, QQmlEngine::CppOwnership);
+        return &abEngine;
+    });
+
     QQmlApplicationEngine engine;
 
-    engine.rootContext()->setContextProperty("abEngine", &abEngine);
     engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
     if (engine.rootObjects().isEmpty())
         return -1;

+ 2 - 1
examples/addressbook/qml/AddContactView.qml

@@ -27,6 +27,7 @@ import QtQuick 2.9
 import QtQuick.Controls 2.4
 
 import qtprotobuf.examples 1.0
+import examples.addressbook 1.0
 
 StackItem {
     id: root
@@ -187,7 +188,7 @@ StackItem {
             }
             newContact.phonesData = phones;
 
-            abEngine.addContact(newContact)
+            AddressBookEngine.addContact(newContact)
             stack.pop()
         }
     }

+ 44 - 56
examples/addressbook/qml/CallPopup.qml

@@ -27,6 +27,7 @@ import QtQuick 2.9
 import QtQuick.Controls 2.4
 
 import qtprotobuf.examples 1.0
+import examples.addressbook 1.0
 
 Rectangle {
     id: root
@@ -45,6 +46,13 @@ Rectangle {
     }
     radius: 10
 
+    Connections {
+        target: root.callStatus
+        onStatusChanged: {
+            console.log("root.callStatus call status: " + root.callStatus.status);
+        }
+    }
+
     transform: Rotation {
         id: _rotation
         axis {
@@ -63,70 +71,50 @@ Rectangle {
     states: [
         State {
             name: "opened"
-            when: callStatus.status === CallStatus.Active || callStatus.status === CallStatus.Ended
-        },
-        State {
-            name: "closed"
-            when: callStatus.status !== CallStatus.Active && callStatus.status !== CallStatus.Ended
-        }
-    ]
-
-    transitions: [
-        Transition {
-            from: "opened"
-            to: "closed"
-
-            NumberAnimation {
+            when: root.callStatus.status === CallStatus.Active || root.callStatus.status === CallStatus.Ended
+            PropertyChanges {
                 target: root
-                property: "opacity"
-                duration: 300
-                from: 1.0
-                to: 0.0
+                opacity: 1.0
+                anchors.verticalCenterOffset: 0
             }
-
-
-            NumberAnimation {
-                target: root
-                property: "anchors.verticalCenterOffset"
-                duration: 300
-                from: 0
-                to: 50
-            }
-
-            NumberAnimation {
+            PropertyChanges {
                 target: _rotation
-                property: "angle"
-                duration: 300
-                from: 0
-                to: -45
+                angle: 0
             }
         },
-        Transition {
-            from: "closed"
-            to: "opened"
-
-            NumberAnimation {
+        State {
+            name: "closed"
+            when: root.callStatus.status !== CallStatus.Active && root.callStatus.status !== CallStatus.Ended
+            PropertyChanges {
                 target: root
-                property: "anchors.verticalCenterOffset"
-                duration: 300
-                from: 50
-                to: 0
+                opacity: 0.0
+                anchors.verticalCenterOffset: 50
             }
-
-            NumberAnimation {
-                target: root
-                property: "opacity"
-                duration: 300
-                from: 0.0
-                to: 1.0
+            PropertyChanges {
+                target: _rotation
+                angle: -45
             }
+        }
+    ]
 
-            NumberAnimation {
-                target: _rotation
-                property: "angle"
-                duration: 300
-                from: -45
-                to: 0
+    transitions: [
+        Transition {
+            from: "*"
+            to: "*"
+
+            ParallelAnimation {
+                alwaysRunToEnd: true
+                NumberAnimation {
+                    target: root
+                    properties: "opacity,anchors.verticalCenterOffset"
+                    duration: 300
+                }
+
+                NumberAnimation {
+                    target: _rotation
+                    properties: "angle"
+                    duration: 300
+                }
             }
         }
     ]
@@ -144,7 +132,7 @@ Rectangle {
         anchors.bottomMargin: 10
         icon: "qrc:/images/drop.png"
         onClicked: {
-            abEngine.endCall()
+            AddressBookEngine.endCall()
         }
     }
 

+ 3 - 2
examples/addressbook/qml/ContactDetails.qml

@@ -27,6 +27,7 @@ import QtQuick 2.9
 import QtQuick.Controls 2.4
 
 import qtprotobuf.examples 1.0
+import examples.addressbook 1.0
 
 StackItem {
     id: root
@@ -147,7 +148,7 @@ StackItem {
     FloatingRoundButton {
         id: call
         enabled: _homePhoneField.text.length > 0
-                 && abEngine.callStatus.status !== CallStatus.Active && abEngine.callStatus.status !== CallStatus.Ended
+                 && AddressBookEngine.callStatus.status !== CallStatus.Active && AddressBookEngine.callStatus.status !== CallStatus.Ended
         anchors.right: parent.right
         anchors.bottom: parent.bottom
         anchors.margins: 10
@@ -155,7 +156,7 @@ StackItem {
         primaryColor: "#4CAF50"
         secondaryColor: "#58cb5c"
         onClicked: {
-            abEngine.makeCall(contact.phonesData[0])
+            AddressBookEngine.makeCall(contact.phonesData[0])
             stack.pop();
         }
     }

+ 6 - 10
examples/addressbook/qml/main.qml

@@ -50,9 +50,9 @@ ApplicationWindow {
         id: contactList
         ContactList {
             anchors.fill: background
-            model: abEngine.contacts
+            model: AddressBookEngine.contacts
             Component.onCompleted: {
-                console.log("abEngine.contacts.list.length " + abEngine.contacts.count)
+                console.log("AddressBookEngine.contacts.list.length " + AddressBookEngine.contacts.count)
             }
             onRequestAddContact: {
                 mainStack.push(addContactView, {"stack": mainStack})
@@ -76,19 +76,15 @@ ApplicationWindow {
         }
     }
 
-    Connections {
-        target: abEngine.callStatus
-        onStatusChanged: {
-            console.log("Call status: " + abEngine.callStatus.status);
-        }
-    }
-
     CallPopup {
         id: activeCallPopup
         width: 300
         height: 170
         anchors.centerIn: parent
-        callStatus: abEngine.callStatus
+        callStatus: AddressBookEngine.callStatus
+        onCallStatusChanged: {
+            console.log("activeCallPopup: " + activeCallPopup.callStatus.status)
+        }
     }
 
     Component.onCompleted: {

+ 21 - 32
examples/addressbookserver/cert.pem

@@ -1,34 +1,23 @@
 -----BEGIN CERTIFICATE-----
-MIIF6zCCA9OgAwIBAgIJAMPfLBc9ERZGMA0GCSqGSIb3DQEBCwUAMIGLMQswCQYD
-VQQGEwJERTEPMA0GA1UECAwGQmVybGluMQ8wDQYDVQQHDAZCZXJsaW4xEzARBgNV
-BAoMClF0UHJvdG9idWYxDDAKBgNVBAsMA1JuRDESMBAGA1UEAwwJbG9jYWxob3N0
-MSMwIQYJKoZIhvcNAQkBFhRxdHByb3RvYnVmQGdtYWlsLmNvbTAeFw0xOTA0MjMx
-NTI5MzNaFw0yMDA0MjIxNTI5MzNaMIGLMQswCQYDVQQGEwJERTEPMA0GA1UECAwG
-QmVybGluMQ8wDQYDVQQHDAZCZXJsaW4xEzARBgNVBAoMClF0UHJvdG9idWYxDDAK
-BgNVBAsMA1JuRDESMBAGA1UEAwwJbG9jYWxob3N0MSMwIQYJKoZIhvcNAQkBFhRx
-dHByb3RvYnVmQGdtYWlsLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
-ggIBANCB7zdc6v+gsYCsGIYsT3iyGPgvFG7cJJWnQO9iW6Tn/kBcreYuCdVSSODK
-/NtPaA1r8j9FCDvLkzewNQ2Idv08/oKBYfOaVtQvh1cn7ktr1usiXtYv16cimeKk
-8iYbiczkZOah2xq+ivm9+05WkYTzcSjBpXg19894024GHd7oRV9G5MCr760k8YLM
-ALnoPpTl0yfs5cEcTybqvZFZNqkHDX2ziEbcF/mVcxcyEsmenbX6MI0easg2qZeq
-Sb7AW7tIMVoWUxDkUIor4vogbgU2IljAjzn0i+fPncB41TU5IiIU35vO67kFBXyI
-Ms3LpN1+Siz5HYHjwaWl0ecebuT83kP33VNc1ULkKJG5UbZUYfgZjUwZPgFFzVzQ
-cif0mhYj9s5Nmn6Q/twxeIXOIZAQdLOq625Wwx8bh+mGaV5mtw3wtXJjbceGa1z/
-Pnni4x2B7IfSiOzGLZZNRRHIjUskeONHUHn8YBrLLg5RT+tvPnGDVPh0cKEH2P4F
-cNRPmaqg75siFoJ+m3DlFM952tRcfzJumgbUfEnrL8bxTZPYVoq22qCDm3UGNW8n
-pthv8Y2hemv6V9lF050z2vpL2DtU9RmtkBWx7ipPUdsEOm4e0rdOCk7zo8IAiWMQ
-6o1L23IPTsqaEpqk3b7tT+5dtLkpeomAT8Hz91ChWUb6jrTVAgMBAAGjUDBOMB0G
-A1UdDgQWBBQIb2RjqkeMsUjH9QJ5BYnAtJ/vojAfBgNVHSMEGDAWgBQIb2RjqkeM
-sUjH9QJ5BYnAtJ/vojAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4ICAQDG
-2x+I9C+4XFCpg9KVA+BBi6+7yi4ulH0yv7W3hNWBV2MxTpvVN6RIt8xI1sPFXc2T
-g2wCIAIPGIPNDe8hO3gcfIIe059P+J3ZNjybUg5p6CR9O7kqgqV/nL4gVRuBJeYq
-6YLr1lKL9r3Zdbkq1tcaCaj816zdXVky0us72XP28/xJc96crgKzDI69vESy5jq6
-QT/HoBwYiSaWXNgb0zJzc//e0upXSLeTkYizAJ5OGkQ/MQYE7gDvtPlGVhQ0rnl/
-FLsiZJokuxtLOTvYJ8Gynjz3QwbClN/bmUbOgD0fqW6BEZyZSJ4zCz0BJnwg46gc
-IN+p6vi50MG4ZcJcnMl/3tAxt2RxHNLi0j21NSLyFj60gK+vL3/zzkdYF9ZxX1L+
-dqhTqioCVrV96rJIQbz6JrbFhUCdyEHYG7yi6LxHTUex33XouhGAfZ0lri5wWZq8
-0Rx8PEZ7SbjARtnvA7uXIAfgD+n3oqnkg9IDPH8PbdRcJrAdje3O2c1+OzTAC8ni
-czaCWG748gfZPe0JpENP7P56RTh9avj4sHISCx4r+sh0lruLp2JZPr9qtw09uWlq
-Mn58bcnDu9RjVfPXk43s9WfJC9XII+JoNcW3iJDSHxQb9XLvwR9ntWhkVvOKenPP
-b00kWr6FfId6fiOmUww5WkW+Wtt4XOYsypaN+DskeA==
+MIID1zCCAr+gAwIBAgIUW685KAdBXhPGRm3tHMoGgnRHxTMwDQYJKoZIhvcNAQEL
+BQAwezELMAkGA1UEBhMCREUxDzANBgNVBAgMBkJlcmxpbjEPMA0GA1UEBwwGQmVy
+bGluMRMwEQYDVQQKDApRdFByb3RvYnVmMRIwEAYDVQQDDAlsb2NhbGhvc3QxITAf
+BgkqhkiG9w0BCQEWEnNlbWxhbmlrQGdtYWlsLmNvbTAeFw0yMDA2MjgxNzUxNDha
+Fw0zMDA2MjYxNzUxNDhaMHsxCzAJBgNVBAYTAkRFMQ8wDQYDVQQIDAZCZXJsaW4x
+DzANBgNVBAcMBkJlcmxpbjETMBEGA1UECgwKUXRQcm90b2J1ZjESMBAGA1UEAwwJ
+bG9jYWxob3N0MSEwHwYJKoZIhvcNAQkBFhJzZW1sYW5pa0BnbWFpbC5jb20wggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqBiZjOX/AhOvQzc0pK+jvgOnZ
+GdhrdS7/FaSUizF9JmwrixyOQqUaRb/uhbPvZ9SYHUsbm6yQ343kWB+ID+FUwZyj
+JneAaz+gfColC9hligEyTRMGBnEVI0d2vfJGFJJ8ewW4L4CJPN33icYn32YB6tij
+T5cesOrghlJjzgZcFj/eHdbuGHnjDegtYcjuooomahBfPVj5XhxykeAsyETpN9QC
+RkfqQ1cW8EUxcP697eELoFVi4VmAOTOS4rtk9IbgaOQ31Tp2jdvJkvrbp3elpmhG
+obpgkjtWpXWJj+CT2vLEoyXr/56CfLxnJZX2geeG538TWck72OoehzllmP11AgMB
+AAGjUzBRMB0GA1UdDgQWBBTzodlJrNWT66criqfGb9YV5l0YNDAfBgNVHSMEGDAW
+gBTzodlJrNWT66criqfGb9YV5l0YNDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
+DQEBCwUAA4IBAQBdOlaWDmJsQX22ZYI5LbkyRtDNBLI28i6jPODfB0aZW8E0MlYs
+7AiGIOKCCe8wV/OsE822DwECSAdPUzuXjkDgxTegZ5JsJq2RpYn+BnkEV01GYcrA
+2funOMTtf1jFrKbWq9ERhBjtqPBaovG9FpPYxD40Zq4PmAraA+fMNUnd2/C1lAPB
+Nnb5160p69YtihseVEDUPaHlmnmImO4n9UBrhzuupMglJZZctask+8Zgwt8LbFWd
+2uJdn6uK0JgS2N4ndAvIxnYuieV9V/jcUsYY+MABBvIbT7Etl+h8XVLru1IluXHf
+qAfO52sje4L8lYruakWTCx9AoqN6s+dHv621
 -----END CERTIFICATE-----

+ 26 - 50
examples/addressbookserver/key.pem

@@ -1,52 +1,28 @@
 -----BEGIN PRIVATE KEY-----
-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
-0mVZG9D69wbsZefVDJii9NLvWThGog==
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCqBiZjOX/AhOvQ
+zc0pK+jvgOnZGdhrdS7/FaSUizF9JmwrixyOQqUaRb/uhbPvZ9SYHUsbm6yQ343k
+WB+ID+FUwZyjJneAaz+gfColC9hligEyTRMGBnEVI0d2vfJGFJJ8ewW4L4CJPN33
+icYn32YB6tijT5cesOrghlJjzgZcFj/eHdbuGHnjDegtYcjuooomahBfPVj5Xhxy
+keAsyETpN9QCRkfqQ1cW8EUxcP697eELoFVi4VmAOTOS4rtk9IbgaOQ31Tp2jdvJ
+kvrbp3elpmhGobpgkjtWpXWJj+CT2vLEoyXr/56CfLxnJZX2geeG538TWck72Ooe
+hzllmP11AgMBAAECggEAQkrtksirkBQDokFsGf5970xzYWvbX2KsdVcp+aUgIazm
+hj/SXYGMwGarxEOredAhK0JYs6YKLd6Mg5j8il+uuw5WlaJ8+7xVbayb/h/VOxoJ
+B2TX4wSF+Pjtd1Xubfa9ev24qC0VT+1EmqzEb22CZ4L6/wocYSIYIn0dCL8e6a48
+etN5MYlt5RNISeNYNn4Xjz4eZXdcKHlP+25F94AgJyZAbDLd10krT/kY4+ybzGVD
+F4Gysfk+OYuE/Bd3vugxaxQF+IN/VIyIP4NaX3aHe2LsLZp8Xvdd8wi12pUoPHEb
+c4FAPjfgFZlwScPmjX7pkV1Ta0dBg6iTXkf8CGuhYQKBgQDTCSCFiQMb+wF5Argg
+ta5sUkWJOnA83KADhOXULQZkw/NVkxZ0qdSPRS7EPWYQ7/XyCVtG2kayOdiwAu5H
+SvQ8A+XZMXmYa00Awc7cVVKQ+wuTdnwoQax2nPuuPBxUM+I1TvtV9+afQgZsR9zM
+i0MvxYwsMjr1n1L79FDAxjbAyQKBgQDOQA56sMlF1lMCmwrvSNmG9VY7ltU/nn7/
+OUnQAtyywm6bAJSzM4n5eBZPj/lW4y/U1Ud9PXoPxNTsHkBqI7g3g10iCq5i8Ajl
+Fp4KXAuEUROOq0W9dzt6BirENsUFDOpsw+wUhlMuTa5jFcFDyiUCjMLgQ03OD+Ti
+Z5yqaPJ5TQKBgG3A/Wz1iOxwap+ozmIUmxYy438vKVg91ep+n5jtobmeP1tuF+us
+t6Obc2sUE5UTd3Hdc98xfjsK4qsHmyzwyny7+jovBPJEO9P897yXk01bgvW6VXAK
+V8uIcUx4brNMGIVpAkX/m62QBQ8jgK3Qb6zUrMX/ibJcnifzNFxNugQhAoGAGm97
+a55dLeZanWrh6+maeAHaG6kpjA30mSHupAq53u+s3ZElfhKNDLynn2sEum5EIzNz
+Bkpq6rp/0APQncoWQodD2Kkl0OiTO0m61/kUQNFjgFXTioVNykYgFSYv+oW9RlOW
+XssYvkaWo3yWWOn/9GO2VqhJwK+o1pwRKIZrDcECgYEAhC2zYomTV7CLtTc3d7BY
+tjoZSL0dnENDi3Q60/T9D8MRBGcPfQLtHxwyPSHos/lwFsX1gX9Pdz/AhM4MPP6O
+AGG2E2PGS4/8jy2fB2f30bAMM8etFRD2e4fvMlR2SwpsbqYimpm56bh5EBS4zHGI
+WtC+GbqJf43y3ozmNggxddE=
 -----END PRIVATE KEY-----

+ 1 - 1
examples/clienttutorial/echoclientengine.h

@@ -35,7 +35,7 @@
 class EchoClientEngine : public QObject
 {
     Q_OBJECT
-    Q_PROPERTY(qtprotobuf::tutorial::EchoResponse *response READ response)
+    Q_PROPERTY(qtprotobuf::tutorial::EchoResponse *response READ response CONSTANT)
 public:
     explicit EchoClientEngine(QObject *parent = nullptr);
 

+ 10 - 4
examples/clienttutorial/main.cpp

@@ -168,8 +168,11 @@
  * {
  * ... //Before load QML
  *     QtProtobuf::qRegisterProtobufTypes();
- *     EchoClientEngine echoEngine;
- *     engine.rootContext()->setContextProperty("echoEngine", &echoEngine);
+ *     qmlRegisterSingletonType<EchoClientEngine>("qtprotobuf.tutorial", 1, 0, "EchoClientEngine", [](QQmlEngine *engine, QJSEngine *){
+ *         static EchoClientEngine echoEngine;
+ *         engine->setObjectOwnership(&echoEngine, QQmlEngine::CppOwnership);
+ *         return &echoEngine;
+ *     });
  * ...
  * }
  * \endcode
@@ -252,8 +255,11 @@ int main(int argc, char *argv[])
     }, Qt::QueuedConnection);
 
     QtProtobuf::qRegisterProtobufTypes();
-    EchoClientEngine echoEngine;
-    engine.rootContext()->setContextProperty("echoEngine", &echoEngine);
+    qmlRegisterSingletonType<EchoClientEngine>("qtprotobuf.tutorial", 1, 0, "EchoClientEngine", [](QQmlEngine *engine, QJSEngine *) -> QObject *{
+        static EchoClientEngine echoEngine;
+        engine->setObjectOwnership(&echoEngine, QQmlEngine::CppOwnership);
+        return &echoEngine;
+    });
 
     engine.load(url);
 

+ 2 - 2
examples/clienttutorial/main.qml

@@ -30,7 +30,7 @@ Window {
                 anchors.verticalCenter: parent.verticalCenter
                 width: 400
                 onAccepted: {
-                    echoEngine.request(request);
+                    EchoClientEngine.request(request);
                     text = ""
                 }
             }
@@ -44,7 +44,7 @@ Window {
 
             Text {
                 anchors.verticalCenter: parent.verticalCenter
-                text: echoEngine.response.message
+                text: EchoClientEngine.response.message
             }
         }
     }

+ 7 - 7
examples/simplechat/ChatView.qml

@@ -20,7 +20,7 @@ Rectangle {
         anchors.bottom: _inputField.top
         anchors.left: parent.left
         anchors.right: parent.right
-        model: scEngine.messages
+        model: SimpleChatEngine.messages
         delegate: Item {
             height: _imageWrapper.height + 10
             width: root.width
@@ -28,7 +28,7 @@ Rectangle {
                 id: _imageWrapper
                 height: _messageColumn.height + 20
                 width: parent.width/2 - 20
-                property bool ownMessage: scEngine.userName === model.modelData.from
+                property bool ownMessage: SimpleChatEngine.userName === model.modelData.from
                 anchors{
                     right: _imageWrapper.ownMessage ? parent.right : undefined
                     left: _imageWrapper.ownMessage ? undefined : parent.left
@@ -97,7 +97,7 @@ Rectangle {
                 font.pointSize: 12
                 color: "#ffffff"
                 wrapMode: Text.Wrap
-                text: scEngine.getText(modelData.content)
+                text: SimpleChatEngine.getText(modelData.content)
             }
         }
     }
@@ -109,7 +109,7 @@ Rectangle {
             Image {
                 width: implicitWidth
                 height: implicitHeight
-                source: scEngine.getImageThumbnail(modelData.content)
+                source: SimpleChatEngine.getImageThumbnail(modelData.content)
             }
         }
     }
@@ -126,19 +126,19 @@ Rectangle {
 
         placeholderText: qsTr("Start type here or paste image")
         onAccepted: {
-            scEngine.sendMessage(_inputField.text)
+            SimpleChatEngine.sendMessage(_inputField.text)
             _inputField.text = ""
         }
 
         Keys.onPressed: {
             if (event.key === Qt.Key_V && event.modifiers & Qt.ControlModifier) {
                 console.log("Ctrl + V")
-                switch (scEngine.clipBoardContentType) {
+                switch (SimpleChatEngine.clipBoardContentType) {
                 case ChatMessage.Text:
                     paste()
                     break
                 case ChatMessage.Image:
-                    scEngine.sendImageFromClipboard()
+                    SimpleChatEngine.sendImageFromClipboard()
                     break
                 }
 

+ 5 - 3
examples/simplechat/main.cpp

@@ -48,11 +48,13 @@ int main(int argc, char *argv[])
     QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
 
     qmlRegisterUncreatableType<ChatMessageModel>("examples.simplechat",  1, 0, "ChatMessageModel", "");
+    qmlRegisterSingletonType<SimpleChatEngine>("examples.simplechat", 1, 0, "SimpleChatEngine", [](QQmlEngine *engine, QJSEngine *) -> QObject *{
+        static SimpleChatEngine scEngine;
+        engine->setObjectOwnership(&scEngine, QQmlEngine::CppOwnership);
+        return &scEngine;
+    });
 
     QQmlApplicationEngine engine;
-
-    SimpleChatEngine scEngine;
-    engine.rootContext()->setContextProperty("scEngine", &scEngine);
     engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
     if (engine.rootObjects().isEmpty())
         return -1;

+ 4 - 4
examples/simplechat/main.qml

@@ -51,7 +51,7 @@ ApplicationWindow {
             width: 200
             placeholderText: qsTr("Login")
             onAccepted:             {
-                scEngine.login(_loginField.text, _passwordField.text)
+                SimpleChatEngine.login(_loginField.text, _passwordField.text)
             }
             onVisibleChanged: {
                 if (visible) {
@@ -69,7 +69,7 @@ ApplicationWindow {
             echoMode: TextInput.Password
             placeholderText: qsTr("Password")
             onAccepted:             {
-                scEngine.login(_loginField.text, _passwordField.text)
+                SimpleChatEngine.login(_loginField.text, _passwordField.text)
             }
         }
         Button {
@@ -102,7 +102,7 @@ ApplicationWindow {
             }
 
             onClicked: {
-                scEngine.login(_loginField.text, _passwordField.text)
+                SimpleChatEngine.login(_loginField.text, _passwordField.text)
             }
         }
     }
@@ -111,7 +111,7 @@ ApplicationWindow {
         id: _chatView
         visible: false
         Connections {
-            target: scEngine
+            target: SimpleChatEngine
             onLoggedIn: {
                 _chatView.visible = true
                 _loginControl.visible = false

+ 21 - 32
examples/simplechatserver/cert.pem

@@ -1,34 +1,23 @@
 -----BEGIN CERTIFICATE-----
-MIIF6zCCA9OgAwIBAgIJAMPfLBc9ERZGMA0GCSqGSIb3DQEBCwUAMIGLMQswCQYD
-VQQGEwJERTEPMA0GA1UECAwGQmVybGluMQ8wDQYDVQQHDAZCZXJsaW4xEzARBgNV
-BAoMClF0UHJvdG9idWYxDDAKBgNVBAsMA1JuRDESMBAGA1UEAwwJbG9jYWxob3N0
-MSMwIQYJKoZIhvcNAQkBFhRxdHByb3RvYnVmQGdtYWlsLmNvbTAeFw0xOTA0MjMx
-NTI5MzNaFw0yMDA0MjIxNTI5MzNaMIGLMQswCQYDVQQGEwJERTEPMA0GA1UECAwG
-QmVybGluMQ8wDQYDVQQHDAZCZXJsaW4xEzARBgNVBAoMClF0UHJvdG9idWYxDDAK
-BgNVBAsMA1JuRDESMBAGA1UEAwwJbG9jYWxob3N0MSMwIQYJKoZIhvcNAQkBFhRx
-dHByb3RvYnVmQGdtYWlsLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
-ggIBANCB7zdc6v+gsYCsGIYsT3iyGPgvFG7cJJWnQO9iW6Tn/kBcreYuCdVSSODK
-/NtPaA1r8j9FCDvLkzewNQ2Idv08/oKBYfOaVtQvh1cn7ktr1usiXtYv16cimeKk
-8iYbiczkZOah2xq+ivm9+05WkYTzcSjBpXg19894024GHd7oRV9G5MCr760k8YLM
-ALnoPpTl0yfs5cEcTybqvZFZNqkHDX2ziEbcF/mVcxcyEsmenbX6MI0easg2qZeq
-Sb7AW7tIMVoWUxDkUIor4vogbgU2IljAjzn0i+fPncB41TU5IiIU35vO67kFBXyI
-Ms3LpN1+Siz5HYHjwaWl0ecebuT83kP33VNc1ULkKJG5UbZUYfgZjUwZPgFFzVzQ
-cif0mhYj9s5Nmn6Q/twxeIXOIZAQdLOq625Wwx8bh+mGaV5mtw3wtXJjbceGa1z/
-Pnni4x2B7IfSiOzGLZZNRRHIjUskeONHUHn8YBrLLg5RT+tvPnGDVPh0cKEH2P4F
-cNRPmaqg75siFoJ+m3DlFM952tRcfzJumgbUfEnrL8bxTZPYVoq22qCDm3UGNW8n
-pthv8Y2hemv6V9lF050z2vpL2DtU9RmtkBWx7ipPUdsEOm4e0rdOCk7zo8IAiWMQ
-6o1L23IPTsqaEpqk3b7tT+5dtLkpeomAT8Hz91ChWUb6jrTVAgMBAAGjUDBOMB0G
-A1UdDgQWBBQIb2RjqkeMsUjH9QJ5BYnAtJ/vojAfBgNVHSMEGDAWgBQIb2RjqkeM
-sUjH9QJ5BYnAtJ/vojAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4ICAQDG
-2x+I9C+4XFCpg9KVA+BBi6+7yi4ulH0yv7W3hNWBV2MxTpvVN6RIt8xI1sPFXc2T
-g2wCIAIPGIPNDe8hO3gcfIIe059P+J3ZNjybUg5p6CR9O7kqgqV/nL4gVRuBJeYq
-6YLr1lKL9r3Zdbkq1tcaCaj816zdXVky0us72XP28/xJc96crgKzDI69vESy5jq6
-QT/HoBwYiSaWXNgb0zJzc//e0upXSLeTkYizAJ5OGkQ/MQYE7gDvtPlGVhQ0rnl/
-FLsiZJokuxtLOTvYJ8Gynjz3QwbClN/bmUbOgD0fqW6BEZyZSJ4zCz0BJnwg46gc
-IN+p6vi50MG4ZcJcnMl/3tAxt2RxHNLi0j21NSLyFj60gK+vL3/zzkdYF9ZxX1L+
-dqhTqioCVrV96rJIQbz6JrbFhUCdyEHYG7yi6LxHTUex33XouhGAfZ0lri5wWZq8
-0Rx8PEZ7SbjARtnvA7uXIAfgD+n3oqnkg9IDPH8PbdRcJrAdje3O2c1+OzTAC8ni
-czaCWG748gfZPe0JpENP7P56RTh9avj4sHISCx4r+sh0lruLp2JZPr9qtw09uWlq
-Mn58bcnDu9RjVfPXk43s9WfJC9XII+JoNcW3iJDSHxQb9XLvwR9ntWhkVvOKenPP
-b00kWr6FfId6fiOmUww5WkW+Wtt4XOYsypaN+DskeA==
+MIID1zCCAr+gAwIBAgIUW685KAdBXhPGRm3tHMoGgnRHxTMwDQYJKoZIhvcNAQEL
+BQAwezELMAkGA1UEBhMCREUxDzANBgNVBAgMBkJlcmxpbjEPMA0GA1UEBwwGQmVy
+bGluMRMwEQYDVQQKDApRdFByb3RvYnVmMRIwEAYDVQQDDAlsb2NhbGhvc3QxITAf
+BgkqhkiG9w0BCQEWEnNlbWxhbmlrQGdtYWlsLmNvbTAeFw0yMDA2MjgxNzUxNDha
+Fw0zMDA2MjYxNzUxNDhaMHsxCzAJBgNVBAYTAkRFMQ8wDQYDVQQIDAZCZXJsaW4x
+DzANBgNVBAcMBkJlcmxpbjETMBEGA1UECgwKUXRQcm90b2J1ZjESMBAGA1UEAwwJ
+bG9jYWxob3N0MSEwHwYJKoZIhvcNAQkBFhJzZW1sYW5pa0BnbWFpbC5jb20wggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqBiZjOX/AhOvQzc0pK+jvgOnZ
+GdhrdS7/FaSUizF9JmwrixyOQqUaRb/uhbPvZ9SYHUsbm6yQ343kWB+ID+FUwZyj
+JneAaz+gfColC9hligEyTRMGBnEVI0d2vfJGFJJ8ewW4L4CJPN33icYn32YB6tij
+T5cesOrghlJjzgZcFj/eHdbuGHnjDegtYcjuooomahBfPVj5XhxykeAsyETpN9QC
+RkfqQ1cW8EUxcP697eELoFVi4VmAOTOS4rtk9IbgaOQ31Tp2jdvJkvrbp3elpmhG
+obpgkjtWpXWJj+CT2vLEoyXr/56CfLxnJZX2geeG538TWck72OoehzllmP11AgMB
+AAGjUzBRMB0GA1UdDgQWBBTzodlJrNWT66criqfGb9YV5l0YNDAfBgNVHSMEGDAW
+gBTzodlJrNWT66criqfGb9YV5l0YNDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
+DQEBCwUAA4IBAQBdOlaWDmJsQX22ZYI5LbkyRtDNBLI28i6jPODfB0aZW8E0MlYs
+7AiGIOKCCe8wV/OsE822DwECSAdPUzuXjkDgxTegZ5JsJq2RpYn+BnkEV01GYcrA
+2funOMTtf1jFrKbWq9ERhBjtqPBaovG9FpPYxD40Zq4PmAraA+fMNUnd2/C1lAPB
+Nnb5160p69YtihseVEDUPaHlmnmImO4n9UBrhzuupMglJZZctask+8Zgwt8LbFWd
+2uJdn6uK0JgS2N4ndAvIxnYuieV9V/jcUsYY+MABBvIbT7Etl+h8XVLru1IluXHf
+qAfO52sje4L8lYruakWTCx9AoqN6s+dHv621
 -----END CERTIFICATE-----

+ 26 - 50
examples/simplechatserver/key.pem

@@ -1,52 +1,28 @@
 -----BEGIN PRIVATE KEY-----
-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
-0mVZG9D69wbsZefVDJii9NLvWThGog==
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCqBiZjOX/AhOvQ
+zc0pK+jvgOnZGdhrdS7/FaSUizF9JmwrixyOQqUaRb/uhbPvZ9SYHUsbm6yQ343k
+WB+ID+FUwZyjJneAaz+gfColC9hligEyTRMGBnEVI0d2vfJGFJJ8ewW4L4CJPN33
+icYn32YB6tijT5cesOrghlJjzgZcFj/eHdbuGHnjDegtYcjuooomahBfPVj5Xhxy
+keAsyETpN9QCRkfqQ1cW8EUxcP697eELoFVi4VmAOTOS4rtk9IbgaOQ31Tp2jdvJ
+kvrbp3elpmhGobpgkjtWpXWJj+CT2vLEoyXr/56CfLxnJZX2geeG538TWck72Ooe
+hzllmP11AgMBAAECggEAQkrtksirkBQDokFsGf5970xzYWvbX2KsdVcp+aUgIazm
+hj/SXYGMwGarxEOredAhK0JYs6YKLd6Mg5j8il+uuw5WlaJ8+7xVbayb/h/VOxoJ
+B2TX4wSF+Pjtd1Xubfa9ev24qC0VT+1EmqzEb22CZ4L6/wocYSIYIn0dCL8e6a48
+etN5MYlt5RNISeNYNn4Xjz4eZXdcKHlP+25F94AgJyZAbDLd10krT/kY4+ybzGVD
+F4Gysfk+OYuE/Bd3vugxaxQF+IN/VIyIP4NaX3aHe2LsLZp8Xvdd8wi12pUoPHEb
+c4FAPjfgFZlwScPmjX7pkV1Ta0dBg6iTXkf8CGuhYQKBgQDTCSCFiQMb+wF5Argg
+ta5sUkWJOnA83KADhOXULQZkw/NVkxZ0qdSPRS7EPWYQ7/XyCVtG2kayOdiwAu5H
+SvQ8A+XZMXmYa00Awc7cVVKQ+wuTdnwoQax2nPuuPBxUM+I1TvtV9+afQgZsR9zM
+i0MvxYwsMjr1n1L79FDAxjbAyQKBgQDOQA56sMlF1lMCmwrvSNmG9VY7ltU/nn7/
+OUnQAtyywm6bAJSzM4n5eBZPj/lW4y/U1Ud9PXoPxNTsHkBqI7g3g10iCq5i8Ajl
+Fp4KXAuEUROOq0W9dzt6BirENsUFDOpsw+wUhlMuTa5jFcFDyiUCjMLgQ03OD+Ti
+Z5yqaPJ5TQKBgG3A/Wz1iOxwap+ozmIUmxYy438vKVg91ep+n5jtobmeP1tuF+us
+t6Obc2sUE5UTd3Hdc98xfjsK4qsHmyzwyny7+jovBPJEO9P897yXk01bgvW6VXAK
+V8uIcUx4brNMGIVpAkX/m62QBQ8jgK3Qb6zUrMX/ibJcnifzNFxNugQhAoGAGm97
+a55dLeZanWrh6+maeAHaG6kpjA30mSHupAq53u+s3ZElfhKNDLynn2sEum5EIzNz
+Bkpq6rp/0APQncoWQodD2Kkl0OiTO0m61/kUQNFjgFXTioVNykYgFSYv+oW9RlOW
+XssYvkaWo3yWWOn/9GO2VqhJwK+o1pwRKIZrDcECgYEAhC2zYomTV7CLtTc3d7BY
+tjoZSL0dnENDi3Q60/T9D8MRBGcPfQLtHxwyPSHos/lwFsX1gX9Pdz/AhM4MPP6O
+AGG2E2PGS4/8jy2fB2f30bAMM8etFRD2e4fvMlR2SwpsbqYimpm56bh5EBS4zHGI
+WtC+GbqJf43y3ozmNggxddE=
 -----END PRIVATE KEY-----

+ 0 - 2
tests/test_grpc/CMakeLists.txt

@@ -6,12 +6,10 @@ add_test_target(TARGET qtgrpc_test
 add_target_windeployqt(TARGET qtgrpc_test
     QML_DIR ${CMAKE_CURRENT_SOURCE_DIR})
 
-target_link_libraries(qtgrpc_test)
 add_test_target(TARGET qtgrpc_secure_test
     SOURCES sslclienttest.cpp)
 add_target_windeployqt(TARGET qtgrpc_secure_test
     QML_DIR ${CMAKE_CURRENT_SOURCE_DIR})
-target_link_libraries(qtgrpc_secure_test)
 
 # servers
 add_subdirectory(echoserver)