Files
MConnectSDK/TestClient/MainForm.cs
T
2019-03-07 14:24:19 +01:00

518 lines
16 KiB
C#

using MConnectSDK;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace TestClient
{
public partial class MainForm : Form
{
/// <summary>
/// Token x cancellazione thread
/// </summary>
private CancellationTokenSource _cts;
/// <summary>
/// Context x sync thread
/// </summary>
private readonly SynchronizationContext synchronizationContext;
/// <summary>
/// Timestamp precedente
/// </summary>
private DateTime previousTime = DateTime.Now;
/// <summary>
/// Istanze classe MaestroConnectClient
/// </summary>
protected MConnectClient MCC;
/// <summary>
/// Risposta BASE della classe di comunicazione
/// </summary>
protected Result reqStatus;
/// <summary>
/// Form principale
/// </summary>
public MainForm()
{
InitializeComponent();
myInit();
synchronizationContext = SynchronizationContext.Current;
}
#region metodi accessori
protected void myInit()
{
var clockTask = updateClockAsync();
_cts = new CancellationTokenSource();
fixDisplay();
lblConsole.Text = "";
}
private void fixDisplay()
{
// controllo se visualizzare parametri di testing...
bool showTP = chkTestMode.Checked;
lblTokRet.Visible = showTP;
txtTokenRet.Visible = showTP;
btnSetRetVal.Visible = showTP;
// salvo token resp...
saveTokenResp();
}
private async Task updateClockAsync()
{
await Task.Run(() =>
{
while (true)
{
Thread.Sleep(50);
UpdateUI();
}
});
}
public void UpdateUI()
{
var timeNow = DateTime.Now;
if ((DateTime.Now - previousTime).Milliseconds <= 250)
{
return;
}
synchronizationContext.Post(new SendOrPostCallback(o =>
{
lblClock.Text = timeNow.ToString("ddd dd.MM.yyyy HH:mm:ss");
}), "");
previousTime = timeNow;
}
private void resetAuthData()
{
Bitmap bitmap = new Bitmap(200, 200, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
using (Graphics graphics = Graphics.FromImage(bitmap))
{
using (System.Drawing.SolidBrush myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.LightGray))
{
graphics.FillRectangle(myBrush, new Rectangle(0, 0, 200, 200));
}
}
// graphics will be disposed at this line
pictBox.Image = bitmap;
StringBuilder sb = new StringBuilder();
sb.AppendLine("RESET DATA done!");
lblRetData.Text = sb.ToString();
}
public void refreshRequestStatus()
{
// mostro risultato
StringBuilder sb = new StringBuilder();
sb.AppendLine("-------------------------");
sb.AppendLine("- Request Status");
sb.AppendLine("-------------------------");
sb.AppendLine("isAuth: " + reqStatus.isAuth);
sb.AppendLine("isHmiEnrolled: " + reqStatus.isHmiEnrolled);
sb.AppendLine("cloudConnection: " + reqStatus.cloudStatus);
sb.AppendLine("localConnection: " + reqStatus.localStatus);
sb.AppendLine("callSuccess: " + reqStatus.callResult);
sb.AppendLine("-------------------------");
lblReqStatus.Text = sb.ToString();
sb.AppendLine("");
sb.AppendLine(string.Format("{0:HH.mm.ss.fff} | END", DateTime.Now));
sb.AppendLine("--------------------------------------------------");
lblConsole.Text += sb.ToString();
// se NON enrolled --> abilita tryAuth...
btnTryAuth.Enabled = !reqStatus.isHmiEnrolled;
}
/// <summary>
/// Mostra info x USER AUTH
/// </summary>
/// <param name="authData"></param>
private void updateAuthData(userAuthData authData)
{
// aggiorno console...
lblConsole.Text = authData.outMessage;
// verifico se sia AUTH (altrimenti NON mostro codice e QR...)
if (authData.hasAuth || reqStatus.isAuth)
{
var currColor = Color.Orange;
// se fosse ANCHE enrolled cambio colore...
if (authData.isEnrolled || reqStatus.isHmiEnrolled)
{
currColor = Color.Green;
}
Bitmap bitmap = new Bitmap(200, 200, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
using (Graphics graphics = Graphics.FromImage(bitmap))
{
using (SolidBrush myBrush = new SolidBrush(currColor))
{
graphics.FillRectangle(myBrush, new Rectangle(0, 0, 200, 200));
}
}
// graphics will be disposed at this line
pictBox.Image = bitmap;
StringBuilder sb = new StringBuilder();
sb.AppendLine("AUTH DONE!");
if (authData.isEnrolled || reqStatus.isHmiEnrolled)
{
sb.AppendLine("------");
sb.AppendLine("ENROLLED!");
}
lblRetData.Text = sb.ToString();
}
else
{
// mostro info SE disponibili...
if (authData.userCode != "")
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("device_code:");
sb.AppendLine(authData.deviceCode.ToString());
sb.AppendLine("");
sb.AppendLine("user_code:");
sb.AppendLine(authData.userCode.ToString());
sb.AppendLine("");
lblRetData.Text = sb.ToString();
Zen.Barcode.CodeQrBarcodeDraw qrcode = Zen.Barcode.BarcodeDrawFactory.CodeQr;
pictBox.Image = qrcode.Draw(authData.qrCode, 50);
}
}
}
private void saveTokenResp()
{
try
{
// verifico sia numero
int tokRet = 0;
int.TryParse(txtTokenRet.Text.Trim(), out tokRet);
if (MCC != null)
{
// salvo in redis...
MCC.tokenRetVal = tokRet;
}
}
catch
{ }
}
#endregion
#region metodi chiamate TASK / async
/// <summary>
/// task x INIT
/// </summary>
/// <param name="param"></param>
/// <returns></returns>
private async Task doInitAsync(confParam param)
{
await Task.Run(() =>
{
MCC = new MConnectClient(txtMConnectID.Text.Trim(), txtClientID.Text.Trim(), param);
reqStatus = MCC.initSDKAsync();
// sistemo retVal
saveTokenResp();
synchronizationContext.Post(new SendOrPostCallback(o =>
{
refreshRequestStatus();
}), "");
});
}
/// <summary>
/// Recupero OrgCode
/// </summary>
/// <returns></returns>
private async Task getOrgCode()
{
await Task.Run(() =>
{
string orgCode = MCC.organizationCode;
synchronizationContext.Post(new SendOrPostCallback(o =>
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("--------------------------------------------------");
sb.AppendLine("ORGANIZATION CODE: " + orgCode);
sb.AppendLine("--------------------------------------------------");
lblConsole.Text = sb.ToString();
refreshRequestStatus();
}), "");
});
}
/// <summary>
/// Recupero UserList
/// </summary>
/// <returns></returns>
private async Task getUserList()
{
await Task.Run(() =>
{
List<userData> userList = MCC.getUserList();
synchronizationContext.Post(new SendOrPostCallback(o =>
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("--------------------------------------------------");
sb.AppendLine("USERS FOUND: " + userList.Count.ToString());
sb.AppendLine("--------------------------------------------------");
sb.AppendLine("es:");
sb.AppendLine(string.Format("user_id: {0}", userList[0].user_id));
sb.AppendLine(string.Format("isActive: {0}", userList[0].isActive));
sb.AppendLine(string.Format("isAdmin: {0}", userList[0].isAdmin));
sb.AppendLine(string.Format("UserName: {0}", userList[0].UserName));
sb.AppendLine(string.Format("Email: {0}", userList[0].Email));
sb.AppendLine(string.Format("Cognome: {0}", userList[0].Cognome));
sb.AppendLine(string.Format("Nome: {0}", userList[0].Nome));
sb.AppendLine(string.Format("ImgUrl: {0}", userList[0].ImgUrl));
lblConsole.Text = sb.ToString();
refreshRequestStatus();
}), "");
});
}
/// <summary>
/// Tento login utente
/// </summary>
/// <returns></returns>
private async Task doUserLogin(string user, string pwd)
{
StringBuilder sb;
await Task.Run(() =>
{
var userData = MCC.doUserLogin(user, pwd);
if (userData.UserName != "")
{
sb = new StringBuilder();
sb.AppendLine("--------------------------------------------------");
sb.AppendLine("USER AUTH OK");
sb.AppendLine("--------------------------------------------------");
sb.AppendLine("");
sb.AppendLine(string.Format("user_id: {0}", userData.user_id));
sb.AppendLine(string.Format("isActive: {0}", userData.isActive));
sb.AppendLine(string.Format("isAdmin: {0}", userData.isAdmin));
sb.AppendLine(string.Format("UserName: {0}", userData.UserName));
sb.AppendLine(string.Format("Email: {0}", userData.Email));
sb.AppendLine(string.Format("Cognome: {0}", userData.Cognome));
sb.AppendLine(string.Format("Nome: {0}", userData.Nome));
sb.AppendLine(string.Format("ImgUrl: {0}", userData.ImgUrl));
}
else
{
sb = new StringBuilder();
sb.AppendLine("--------------------------------------------------");
sb.AppendLine("USER AUTH KO");
sb.AppendLine("--------------------------------------------------");
sb.AppendLine("");
sb.AppendLine("User/Pwd NOT found");
}
synchronizationContext.Post(new SendOrPostCallback(o =>
{
lblConsole.Text = sb.ToString();
refreshRequestStatus();
}), "");
});
}
#endregion
#region metodi chiamate interazione principali con controlli
/// <summary>
/// Reset parametri...
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnResetParam_Click(object sender, EventArgs e)
{
txtMConnectID.Text = "MCID-0000-1234-5678";
txtClientID.Text = "HMI_TEST_CLI";
chkTestMode.Checked = true;
txtConnParam.Text = "127.0.0.1,abortConnect=false,ssl=false";
txtTokenRet.Text = "403";
txtDb.Text = "1";
fixDisplay();
}
/// <summary>
/// Cambio valore checkbox del testing mode
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void chkTestMode_Click(object sender, EventArgs e)
{
fixDisplay();
}
/// <summary>
/// Imposta il valore di return x fare AUTH (in testing)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSetRetVal_Click(object sender, EventArgs e)
{
saveTokenResp();
}
/// <summary>
/// Simulazione INIT
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void btnInit_Click(object sender, EventArgs e)
{
int currDb = 0;
int.TryParse(txtDb.Text.Trim(), out currDb);
confParam param = new confParam
{
redisConn = txtConnParam.Text,
redisConnAdmin = txtConnParam.Text + ",allowAdmin=true",
testMode = chkTestMode.Checked,
defaultDb = currDb
};
// init in modalità Task based...
await Task.Run(() =>
{
var initObj = doInitAsync(param);
});
// aggiorno log console
StringBuilder sb = new StringBuilder();
sb.AppendLine("--------------------------------------------------");
sb.AppendLine(string.Format("{0:HH.mm.ss.fff} | START INIT", DateTime.Now));
sb.AppendLine("");
lblConsole.Text = sb.ToString();
// resetto aspetti grafici
resetAuthData();
if (_cts != null)
{
_cts.Cancel();
}
}
/// <summary>
/// Simulazione auth (SE non abilitato)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void btnTryAuth_Click(object sender, EventArgs e)
{
// init variabili accessorie x chiamata
StringBuilder sb = new StringBuilder();
// elimino eventuali cancel presenti...
if (_cts.IsCancellationRequested)
{
_cts = new CancellationTokenSource();
}
CancellationToken token = _cts.Token;
// gestione progress...
var progressHandler = new Progress<userAuthData>(value =>
{
// mostro i dati SPECIFICI x AUTH...
updateAuthData(value);
});
var progress = progressHandler as IProgress<userAuthData>;
try
{
// init in modalità Task based...
await Task.Run(() =>
{
var initObj = MCC.doOAuthCycleTask(token, progress);
});
}
catch (OperationCanceledException)
{
sb = new StringBuilder();
sb.AppendLine("--------------------------------------------------");
sb.AppendLine(string.Format("{0:HH.mm.ss.fff} | CANCELLED OAuth process", DateTime.Now));
sb.AppendLine("--------------------------------------------------");
lblConsole.Text = sb.ToString();
}
catch (Exception ex)
{
//label2.Text = ex.GetType().Name + ": " + ex.Message;
}
// aggiorno log console
sb.AppendLine("--------------------------------------------------");
sb.AppendLine(string.Format("{0:HH.mm.ss.fff} | STARTING OAuth process", DateTime.Now));
sb.AppendLine("--------------------------------------------------");
lblConsole.Text = sb.ToString();
}
/// <summary>
/// recupera codice organizzazione
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void btnGetOrgCode_Click(object sender, EventArgs e)
{
// init in modalità Task based...
await Task.Run(() =>
{
var retObj = getOrgCode();
});
// aggiorno log console
StringBuilder sb = new StringBuilder();
sb.AppendLine("--------------------------------------------------");
sb.AppendLine(string.Format("{0:HH.mm.ss.fff} | OrgCode requested", DateTime.Now));
sb.AppendLine("");
lblConsole.Text = sb.ToString();
}
/// <summary>
/// chiamata recupero elenco utenti
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void btnGetUserList_Click(object sender, EventArgs e)
{
// init in modalità Task based...
await Task.Run(() =>
{
var retObj = getUserList();
});
// aggiorno log console
StringBuilder sb = new StringBuilder();
sb.AppendLine("--------------------------------------------------");
sb.AppendLine(string.Format("{0:HH.mm.ss.fff} | UserList requested", DateTime.Now));
sb.AppendLine("");
lblConsole.Text = sb.ToString();
}
/// <summary>
/// chiamata x login utente
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void btnTryUserLogin_Click(object sender, EventArgs e)
{
// init in modalità Task based...
await Task.Run(() =>
{
var retObj = doUserLogin(txtUser.Text.Trim(), txtPwd.Text.Trim());
});
// aggiorno log console
StringBuilder sb = new StringBuilder();
sb.AppendLine("--------------------------------------------------");
sb.AppendLine(string.Format("{0:HH.mm.ss.fff} | UserLogin requested", DateTime.Now));
sb.AppendLine("");
lblConsole.Text = sb.ToString();
}
#endregion
}
}