579 lines
18 KiB
C#
579 lines
18 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 requestStatus 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.cloudConnection);
|
|
sb.AppendLine("localConnection: " + reqStatus.localConnection);
|
|
sb.AppendLine("callSuccess: " + reqStatus.callSuccess);
|
|
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("--------------------------------------------------");
|
|
sb.AppendLine("AUTH DONE!");
|
|
if (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("--------------------------------------------------");
|
|
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.init();
|
|
|
|
// sistemo retVal
|
|
saveTokenResp();
|
|
|
|
synchronizationContext.Post(new SendOrPostCallback(o =>
|
|
{
|
|
refreshRequestStatus();
|
|
}), "");
|
|
});
|
|
}
|
|
#if false
|
|
/// <summary>
|
|
/// Task x AUTH
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
private async Task doOAuthCycle()
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
// fino a quanod NON è auth --> cicla...
|
|
while (!reqStatus.isHmiEnrolled && doAuthSemap)
|
|
{
|
|
await Task.Run(() =>
|
|
{
|
|
synchronizationContext.Post(new SendOrPostCallback(o =>
|
|
{
|
|
sb = new StringBuilder();
|
|
sb.AppendLine("--------------------------------------------------");
|
|
sb.AppendLine(string.Format("{0:HH.mm.ss.fff} | Try OAuth process", DateTime.Now));
|
|
lblConsole.Text = sb.ToString();
|
|
}), "");
|
|
|
|
userAuthData authData = MCC.tryAuthorize();
|
|
// recupero nuova reqStatus...
|
|
reqStatus = MCC.reqStatusUpd;
|
|
|
|
synchronizationContext.Post(new SendOrPostCallback(o =>
|
|
{
|
|
// mostro i dati SPECIFICI x AUTH...
|
|
updateAuthData(authData);
|
|
// refresh...
|
|
sb = new StringBuilder();
|
|
sb.AppendLine(">>>");
|
|
sb.AppendLine(string.Format("{0:HH.mm.ss.fff} | END", DateTime.Now));
|
|
sb.AppendLine("--------------------------------------------------");
|
|
lblConsole.Text += sb.ToString();
|
|
}), "");
|
|
|
|
// mi fermo...
|
|
Thread.Sleep(500);
|
|
});
|
|
}
|
|
if (reqStatus.isHmiEnrolled)
|
|
{
|
|
// indico che ho concluso
|
|
sb = new StringBuilder();
|
|
sb.AppendLine("--------------------------------------------------");
|
|
sb.AppendLine(string.Format("{0:HH.mm.ss.fff} | Auth + enroll DONE", DateTime.Now));
|
|
sb.AppendLine("--------------------------------------------------");
|
|
|
|
synchronizationContext.Post(new SendOrPostCallback(o =>
|
|
{
|
|
lblConsole.Text = sb.ToString();
|
|
refreshRequestStatus();
|
|
}), "");
|
|
}
|
|
else
|
|
{
|
|
// indico che ho concluso
|
|
sb = new StringBuilder();
|
|
sb.AppendLine("--------------------------------------------------");
|
|
sb.AppendLine(string.Format("{0:HH.mm.ss.fff} | FORCE RESET", DateTime.Now));
|
|
sb.AppendLine("--------------------------------------------------");
|
|
synchronizationContext.Post(new SendOrPostCallback(o =>
|
|
{
|
|
lblConsole.Text = sb.ToString();
|
|
}), "");
|
|
resetAuthData();
|
|
}
|
|
doAuthSemap = false;
|
|
}
|
|
#endif
|
|
/// <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)
|
|
{
|
|
await Task.Run(() =>
|
|
{
|
|
var userData = MCC.doUserLogin(user, pwd);
|
|
|
|
synchronizationContext.Post(new SendOrPostCallback(o =>
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
sb.AppendLine("--------------------------------------------------");
|
|
sb.AppendLine("USERS 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));
|
|
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
|
|
|
|
}
|
|
}
|