aboutsummaryrefslogtreecommitdiffstats
path: root/gobi-api/GobiAPI_2013-07-31-1347/GobiSampleCM/QTSampleCM.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gobi-api/GobiAPI_2013-07-31-1347/GobiSampleCM/QTSampleCM.cpp')
-rw-r--r--gobi-api/GobiAPI_2013-07-31-1347/GobiSampleCM/QTSampleCM.cpp315
1 files changed, 315 insertions, 0 deletions
diff --git a/gobi-api/GobiAPI_2013-07-31-1347/GobiSampleCM/QTSampleCM.cpp b/gobi-api/GobiAPI_2013-07-31-1347/GobiSampleCM/QTSampleCM.cpp
new file mode 100644
index 0000000..57cf1e9
--- /dev/null
+++ b/gobi-api/GobiAPI_2013-07-31-1347/GobiSampleCM/QTSampleCM.cpp
@@ -0,0 +1,315 @@
+/*===========================================================================
+FILE:
+ QTSampleCM.cpp
+
+DESCRIPTION:
+ QT implementation of the Sample CM
+
+PUBLIC CLASSES AND METHODS:
+ cQTSampleCM
+ QT implementation of the Sample CM
+
+Copyright (c) 2013, The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of The Linux Foundation nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+===========================================================================*/
+
+//---------------------------------------------------------------------------
+// Include Files
+//---------------------------------------------------------------------------
+#include "QTSampleCM.h"
+
+/*=========================================================================*/
+// Free Methods
+/*=========================================================================*/
+
+/*===========================================================================
+METHOD:
+ AsyncConnectThread (Free Method)
+
+DESCRIPTION:
+ Start a data session
+
+PARAMETERS:
+ pData [ I ] - cQTSampleCM object
+
+RETURN VALUE:
+ void * - always NULL
+===========================================================================*/
+void * AsyncConnectThread( void * pData )
+{
+ cQTSampleCM * pCM = (cQTSampleCM*)pData;
+ if (pCM == NULL)
+ {
+ return NULL;
+ }
+
+ // Open the dialog window, disable the info and connection stats buttons
+ pCM->mView.rootContext()->setContextProperty( "dialogText",
+ "Connecting, please wait..." );
+ pCM->mView.rootContext()->setContextProperty( "windowState",
+ "connectingDialog" );
+
+ ULONG failureCode = 0xFFFFFFFF;
+ ULONG rc = pCM->OnStartDataSession( &failureCode );
+ if (rc != eGOBI_ERR_NONE)
+ {
+ std::ostringstream error;
+ error << "Failed to connect, error " << rc;
+
+ TRACE( "rc %lu, failure code %lu", rc, failureCode );
+
+ // Show failure code, if present
+ if (rc == 1014 && failureCode != 0xFFFFFFFF)
+ {
+ error << "\nCall failure reason " << failureCode;
+ }
+
+ pCM->mView.rootContext()->setContextProperty( "dialogText",
+ error.str().c_str() );
+
+ pCM->SetConnectButtonText( "Connect" );
+ }
+ else
+ {
+ pCM->mView.rootContext()->setContextProperty( "dialogText", "Success!" );
+
+ // Connect button should be updated by state change indication
+ }
+
+ // Leave the dialog up for 2s
+ sleep( 2 );
+
+ pCM->mView.rootContext()->setContextProperty( "windowState", "" );
+
+ return NULL;
+}
+
+/*===========================================================================
+METHOD:
+ OnInfosButton (Free Method)
+
+DESCRIPTION:
+ Move to the info stats page
+
+PARAMETERS:
+ pCM [ I ] - cQTSampleCM object
+
+RETURN VALUE:
+ QVariant - always 0
+===========================================================================*/
+QVariant OnInfosButton( cQTSampleCM * pCM )
+{
+ pCM->mView.rootContext()->setContextProperty( "windowState", "infos" );
+
+ return 0;
+}
+
+/*===========================================================================
+METHOD:
+ OnConnectionsButton (Free Method)
+
+DESCRIPTION:
+ Move to the connection stats page
+
+PARAMETERS:
+ pCM [ I ] - cQTSampleCM object
+
+RETURN VALUE:
+ QVariant - always 0
+===========================================================================*/
+QVariant OnConnectionsButton( cQTSampleCM * pCM )
+{
+ // "" is the default state (connection stats page)
+ pCM->mView.rootContext()->setContextProperty( "windowState", "" );
+
+ return 0;
+}
+
+/*===========================================================================
+METHOD:
+ OnConnectButton (Free Method)
+
+DESCRIPTION:
+ Start, cancel, or disconnect from a data session
+
+ NOTE: The UI is not updated until this function returns, so the connection
+ will be established asynchronously
+
+PARAMETERS:
+ pCM [ I ] - cQTSampleCM object
+
+RETURN VALUE:
+ QVariant - always 0
+===========================================================================*/
+QVariant OnConnectButton( cQTSampleCM * pCM )
+{
+ // Double check if there a device connected
+ if (pCM->mDeviceID.size() == 0
+ || pCM->mConnectButtonText.compare( "No Device" ) == 0)
+ {
+ TRACE( "No Device" );
+ return 0;
+ }
+
+ // Start a connection
+ if (pCM->mConnectButtonText.compare( "Connect" ) == 0)
+ {
+ pCM->SetConnectButtonText( "Cancel" );
+
+ // Create a detached thread to start the connection asynchronously
+ pthread_attr_t attributes;
+ pthread_attr_init( &attributes );
+ pthread_attr_setdetachstate( &attributes, PTHREAD_CREATE_DETACHED );
+
+ pthread_create( &pCM->mAsyncConnectThreadID,
+ &attributes,
+ AsyncConnectThread,
+ pCM );
+ }
+ else if (pCM->mConnectButtonText.compare( "Cancel" ) == 0)
+ {
+ pCM->OnCancelDataSession();
+
+ pCM->SetConnectButtonText( "Connect" );
+ }
+ else if (pCM->mConnectButtonText.compare( "Disconnect" ) == 0)
+ {
+ pCM->OnStopDataSession();
+
+ pCM->SetConnectButtonText( "Connect" );
+ }
+ else
+ {
+ // Externally connected, etc
+ TRACE( "Unknown connect button state %s",
+ pCM->mConnectButtonText.c_str() );
+ }
+
+ return 0;
+}
+
+/*=========================================================================*/
+// cQTSampleCM Methods
+/*=========================================================================*/
+
+/*===========================================================================
+METHOD:
+ Init (Public Method)
+
+DESCRIPTION:
+ Initialize GUI
+
+RETURN VALUE:
+ bool
+===========================================================================*/
+bool cQTSampleCM::Init()
+{
+ // Use the current screen orientation
+ mView.setOrientation( QmlApplicationViewer::ScreenOrientationAuto );
+
+ // The buttons
+ mView.rootContext()->setContextProperty( "connectButton",
+ &mConnectButton );
+ mView.rootContext()->setContextProperty( "infosButton",
+ &mInfosButton );
+ mView.rootContext()->setContextProperty( "connectionsButton",
+ &mConnectionsButton );
+
+ // The input fields
+ mView.rootContext()->setContextProperty( "apnNameText", &mAPNText );
+ mView.rootContext()->setContextProperty( "usernameText", &mUsernameText );
+ mView.rootContext()->setContextProperty( "passwordText", &mPasswordText );
+
+ // Default button value
+ SetConnectButtonText( "No Device" );
+
+ // Default state
+ mView.rootContext()->setContextProperty( "windowState", "" );
+ mView.rootContext()->setContextProperty( "dialogText", "" );
+
+ bool bRC = cSampleCM::Init();
+
+ mView.setMainQmlFile( "qml/GobiSampleCM/main.qml" );
+ mView.show();
+
+ return bRC;
+}
+
+/*===========================================================================
+METHOD:
+ Run (Public Method)
+
+DESCRIPTION:
+ Run the GUI (blocks until exit)
+
+RETURN VALUE:
+ bool
+===========================================================================*/
+int cQTSampleCM::Run()
+{
+ return mApp.exec();
+}
+
+/*===========================================================================
+METHOD:
+ Disconnect (Public Method)
+
+DESCRIPTION:
+ Calls GobiDisconnect
+
+RETURN VALUE:
+ ULONG
+===========================================================================*/
+ULONG cQTSampleCM::Disconnect()
+{
+ SetConnectButtonText( "No device" );
+
+ return cSampleCM::Disconnect();
+}
+
+/*===========================================================================
+ETHOD:
+ OnStartDataSession (Public Method)
+
+DESCRIPTION:
+ Updates apn, username, and password input field values before starting
+ a data session
+
+PARAMETERS:
+ pFailureCode [ O ] - Call failure code, if provided
+
+RETURN VALUE:
+ ULONG
+===========================================================================*/
+ULONG cQTSampleCM::OnStartDataSession( ULONG * pFailureCode )
+{
+ // Grab the APN, username, and password
+ mAPN = mAPNText.getText().toUtf8().constData();
+ mUsername = mUsernameText.getText().toUtf8().constData();
+ mPassword = mPasswordText.getText().toUtf8().constData();
+
+ return cSampleCM::OnStartDataSession( pFailureCode );
+}