internal void Analyse(DVBuffer buffer) { try { GetProperties(buffer); } catch (XHtmlException e) { SendError(e.ErrorCode, e.ErrorLocation, e.ErrorParameter); } //!!!!!!!!!!!!!!!!!!!! revoir tous ce cas if (AttenteInput) return ; // input : attente opérateur (sauf notif immédiate) if (AttenteConsult) return ; // consult : attente opérateur if (AttentePopupMenu) return; // popup menu : attente opérateur if (AttenteGetb) return; // get bloquant : attente opérateur if (responseAlreadySent) return; // double clic / nb lignes tableau / index colonne / bulle scrollbar tableau envoyé //autres cas (display, ...) var response = new DVBuffer(); response.Put(ProprietesWpf.CLIENTLEGER_DEBUT); Send(response); // acquittement (réponse "vide") return; }
// bh1 /// <summary> /// Ajout dans les données de retour des fichiers joints /// </summary> bhficjoint /// <param name="reponse">dvbuffer à completer</param> /// <param name="fichiers">fichiers</param> void AjouterFichiersJoints(DVBuffer reponse, HttpFileCollection fichiers) { string nomreel, nomtemp; HttpPostedFile fichierposté; string id; for (int i = 0; i < fichiers.Count; i++) { id = fichiers.AllKeys[i]; fichierposté = fichiers[i]; nomreel = fichierposté.FileName; if (nomreel != "") { nomtemp = Path.GetTempFileName(); fichierposté.SaveAs(nomtemp); reponse.Put(Proprietes.VALEUR_SAISIE); reponse.Put(id); string val = "__YWEBFICJOINT1__" + nomtemp + "__YWEBFICJOINT2__" + nomreel; reponse.Put(val); } } }
public void GetProperties(DVBuffer buffer) { string idPage; //stockage temporaire des id page, menuItem et toolbarItem ProprietesWpf property; XHtmlWindow window; XHtmlPage page = null; XHtmlDataGrid dataGrid; ushort? index = null; //pour renvoi d'un index colonne dans un tableau ushort? nbRows = null; //pour renvoi du nombre de lignes affichées dans un tableau string horizontalScrollbarTooltip = null; //pour renvoi de la bulle de l'ascenseur horizontal dans un tableau string verticalScrollbarTooltip = null; //pour renvoi de la bulle de l'ascenseur vertical dans un tableau int codepageBulleAscHor = 0, codepageBulleAscVer = 0; buffer.Get(out property); while (property != ProprietesWpf.CLIENTLEGER_FIN) { switch (property) { case ProprietesWpf.CLIENTLEGER_DEBUT: break; case ProprietesWpf.MENU_SYSTEME_APERCU_ETAT: byte printPreview; buffer.Get(out printPreview); IsPrintPreviewEnabled = (printPreview == 1); // if (StackOfWindows.Any()) StackOfWindows.ToList()[0].UpdatePrintPreviewItem(IsPrintPreviewEnabled); break; case ProprietesWpf.MENU_SYSTEME_TRADUCTIONS: buffer.GetString(out PrintPreviewText); buffer.GetString(out CloseAllText); buffer.GetString(out PrintCloseAllText); buffer.GetString(out SavePrintPreviewText); break; case ProprietesWpf.COULEUR_CREATION_DEBUT: XHtmlColor.Create(buffer,this.Html); break; case ProprietesWpf.POLICE_CREATION_DEBUT: XHtmlFont.Create(buffer,this.Html); break; case ProprietesWpf.BORDURE_CREATION_DEBUT: XHtmlBorder.Create(buffer,this.Html); break; case ProprietesWpf.PADDING_CREATION_DEBUT: XHtmlPadding.Create(buffer,this.Html); break; #region Fenêtre case ProprietesWpf.FENETRE_DEBUT: // Id Masque (ushort) et Id Page (byte) // ne concerne que les "vraies" fenêtres (i.e. : les fenêtres autres que la toute première, ouverte dans app.xaml.cs) //Window lastWindow = StackOfWindows.Peek(); //if (!lastWindow.IsVisible) lastWindow.Show(); //lastWindow.IsEnabled = false; window = new XHtmlWindow(); // { Owner = lastWindow, ShowInTaskbar = false }; buffer.GetString(out window.MaskName); buffer.Get(out window.PageNum); window.ReadProperties(buffer); window.Id = window.MaskName.Replace('.', '_') + "_" + window.PageNum.ToString() + "_" + (StackOfWindows.Count + 1).ToString(); StackOfWindows.Push(window); ListeParametresComplementaires lc = new ListeParametresComplementaires(); lc.Ajouter("ty", window.minContentHeight.ToString()); lc.Ajouter("tx", window.minContentWidth.ToString()); lc.Ajouter("idFen", window.Id); lc.Ajouter("libelle", window.MaskName); lc.Ajouter("numpage", window.PageNum.ToString()); lc.Ajouter("tailleFixe", (window.ModeResize == System.Windows.ResizeMode.NoResize) ? "true" : "false"); lc.Ajouter("couleurFond", XHtmlColor.PrefixeCssFond + window.CouleurFond.ToString()); lc.Ajouter("titre", window.Title); if (window.icon != null) lc.Ajouter("icone", window.icon.Css); string chaineFenetre = HtmlGlobal.ToJsonString(lc, this.Html.JsonParamCompl, false); { UnParametreEnvoye p = new UnParametreEnvoye(); p.commande = "ouvrirFenetre"; this.Html.Envois.commandes.Add(p); p.valeur = chaineFenetre; } break; case ProprietesWpf.FENETRE_TITRE: // Titre de la fenêtre (string) { string title; int codePage; buffer.Get(out codePage); buffer.GetStringCP(out title, codePage); StackOfWindows.Peek().Title = title; UnParametreEnvoye p = new UnParametreEnvoye(); p.commande = "xmeTitle"; this.Html.Envois.commandes.Add(p); p.valeur = title; } break; case ProprietesWpf.FENETRE_ICONE: // Titre de la fenêtre (string) var icon = new XHtmlImageFile(); icon.ReadProperties(buffer); // StackOfWindows.Peek().SetIcon(icon); break; case ProprietesWpf.FENETRE_TAILLE_INITIALE: // Taille de référence pour les calculs d'attachement - Hauteur (ushort) x Largeur (ushort) window = StackOfWindows.Peek(); buffer.GetString(out window.MaskName); buffer.Get(out window.PageNum); window.SetMinContentSize(buffer); this.Html.Envois.Ajouter("fenetreTailleInitiale", window.MaskName + "," + window.PageNum.ToString() + "," + window.minContentWidth.ToString() + "," + window.minContentHeight.ToString() ); break; case ProprietesWpf.FENETRE_FERMETURE: // Pour fermer la fenêtre en cours window = StackOfWindows.Pop(); this.Html.Envois.Ajouter("fermerFenetre", window.Id); //FenetresADepiler.Push(window); //window.Closing -= window.ClosingHandler; //StackOfWindows.Peek().IsEnabled = true; // ne pas remplacer par "window": le StackOfWindow.Peek a changé de valeur à cause du pop() ! // window.Close(); break; #endregion Fenêtre case ProprietesWpf.PAGE_DEBUT: buffer.GetString(out idPage); // Id Page (string) window = StackOfWindows.Peek(); page = window.GetPage(idPage); if (page == null) { window.ListOfPages.Add(page = new XHtmlPage(window,this.Html) { Id = idPage }); this.Html.Envois.Ajouter("nouvellePage", this.Html.CalculerIdPage(page.Id)); page.JeSuisAffichee = true; } // une page peut être supprimée (dans la gestion de l'effacement d'une autre page), il faut donc la remettre dans la fenêtre le cas échéant //if (!window.MainCanvas.Children.Contains(page)) window.MainCanvas.Children.Add(page); if (page.JeSuisAffichee == false) { this.Html.Envois.Ajouter("remettrePage", this.Html.CalculerIdPage(page.Id)); } // cette ligne était plus bas, mais trop tard this.Html.Envois.Ajouter("pageCourante", Html.CalculerIdPage(page.Id), page.StopPoint.ToString(), page.NumPage.ToString()); page.JeSuisAffichee = true; // - lecture de la page et des objets page.ReadProperties(buffer); // je la remet aussi ici car avec les panels ca bouge ! this.Html.Envois.Ajouter("pageCourante", Html.CalculerIdPage(page.Id), page.StopPoint.ToString(), page.NumPage.ToString()); page.EnvoyerCouleurPositionAttachement(false); // on affiche la fenêtre si c'est la toute première page et si la fenêtre n'est pas masquée (application sans fenêtre) // !!!!!!!!!!if (!page.Window.IsVisible && application.Client.FenetreMereHide == 0) // !!!!!!!!!! page.Window.Show(); break; case ProprietesWpf.TABLEAU_DEBUT: // Mise à jour d'une propriété du tableau dataGrid = GetDataGrid(buffer,out page); dataGrid.ReadProperties(buffer); dataGrid.AjouterEnvoisUnObjet(Html.Envois, page, Html.App.StackOfWindows.Count()); break; case ProprietesWpf.TABLEAU_ASCHOR_A_GAUCHE: // retour au début de la ligne d'un tableau dataGrid = GetDataGrid(buffer,out page); // ScrollIntoView sur la colonne dont le DisplayIndex est = FrozenColumnCount pour mettre l'ascenseur à gauche. // (en tenant compte des colonnes figées) // attention : le tableau peut être vide, d'où le "if Rows.Count > 0" var column = dataGrid.Columns.FirstOrDefault(col => col.DisplayIndex == dataGrid.FrozenColumnCount); //!!!!!!!!!!if (dataGrid.Rows.Count > 0 && column != null) //!!!!!!!!!! dataGrid.ScrollIntoView(dataGrid.Rows[0], column); break; case ProprietesWpf.TABLEAU_REMPLISSAGE_DEBUT: // Remplissage du tableau dataGrid = GetDataGrid(buffer,out page); dataGrid.Fill(buffer); dataGrid.AjouterEnvoisUnObjetRemplissageTableau(Html.Envois, page, Html.App.StackOfWindows.Count()); break; #region Fonctions Get du tableau case ProprietesWpf.TABLEAU_ASCHOR_GET_BULLE: // Demande le texte de la bulle de l'ascenseur horizontal dataGrid = GetDataGrid(buffer,out page); horizontalScrollbarTooltip = dataGrid.HorizontalScrollBarToolTip; codepageBulleAscHor = dataGrid.CodepageBulleAscHor; break; case ProprietesWpf.TABLEAU_ASCVER_GET_BULLE: // Demande le texte de la bulle de l'ascenseur vertical dataGrid = GetDataGrid(buffer,out page); verticalScrollbarTooltip = dataGrid.VerticalScrollBarToolTip; codepageBulleAscVer = dataGrid.CodepageBulleAscVer; break; case ProprietesWpf.TABLEAU_GET_NOMBRE_LIGNES: // Demande du nombre de lignes affichables dans le tableau { string id = GetIdentDataGrid(buffer); // dataGrid = GetDataGrid(buffer); //!!!!!!!!!! dataGrid.UpdateLayout(); // indispensable, sinon le nombre de lignes envoyé au premier affichage du tableau est potentiellement faux (peut poser pb par la suite) nbRows = 32; // dataGrid.GetRowCount(); Html.Envois.Ajouter("tabGetNbLig", id); } break; case ProprietesWpf.TABLEAU_GET_COL_SAISIE_PREMIERE: // Demande le numéro de la première colonne en saisie dans la ligne donnée dataGrid = GetDataGrid(buffer,out page); index = dataGrid.GetFirstColumnIndex(buffer); break; case ProprietesWpf.TABLEAU_GET_COL_SAISIE_DERNIERE: // Demande le numéro de la dernière colonne en saisie dans la ligne donnée dataGrid = GetDataGrid(buffer,out page); index = dataGrid.GetLastColumnIndex(buffer); break; case ProprietesWpf.TABLEAU_GET_COL_SAISIE_PRECEDENTE: // Demande le numéro de la colonne précédente en saisie dans la ligne donnée dataGrid = GetDataGrid(buffer,out page); index = dataGrid.GetPreviousColumnIndex(buffer); break; case ProprietesWpf.TABLEAU_GET_COL_SAISIE_SUIVANTE: // Demande le numéro de la colonne suivante en saisie dans la ligne donnée dataGrid = GetDataGrid(buffer,out page); index = dataGrid.GetNextColumnIndex(buffer); break; #endregion Fonctions Get du tableau #region Input case ProprietesWpf.XMEINPUT: AsynchronousResponse = null; // garde-fou buffer.GetString(out idPage); window = StackOfWindows.Peek(); window.CurrentPage = window.GetPage(idPage); //!!!!!!!!!!!!!!!!!!!!!!! idem pour consult etc.... // this.Html.Envois.Ajouter("pageCourante", Html.CalculerIdPage(window.CurrentPage.Id), window.CurrentPage.StopPoint.ToString(), page.NumPage.ToString()); this.Html.Envois.Ajouter("pageCourante", Html.CalculerIdPage(window.CurrentPage.Id), window.CurrentPage.StopPoint.ToString(), window.CurrentPage.NumPage.ToString()); ReadInput(buffer, window.CurrentPage); // busyTimer.Stop(); // window.Cursor = null; AttenteInput = true; // nécessairement à la fin pour que le HeightChanging potentiellement // envoyé lors du UpdateLayout() contenu dans le readInput soit pris en compte et envoyé en différé break; #endregion Input case ProprietesWpf.XMECONSULT: buffer.GetString(out idPage); Consult(idPage, null); Html.Envois.Ajouter("xmeConsult", idPage); break; #region List Consult case ProprietesWpf.XMELISTCONSULT: { uint idDataGrid; buffer.GetString(out idPage); buffer.Get(out idDataGrid); Consult(idPage, null); Html.Envois.Ajouter("xmeConsult", idPage); string id = Html.CalculerIdDataGrid(idDataGrid, idPage); //dataGrid = Consult(idPage, idDataGrid) as XHtmlDataGrid; //dataGrid.SetIsActive(true); // nécessairement APRES le ManageValidDataGrids() dans le consult car ce dernier RAZ toutes les DataGrids affichées // traitement des ronds dans l'entête de la colonne arbre le cas échéant byte treeCount; buffer.Get(out treeCount); if (treeCount > 0) { byte treeCurrent; buffer.Get(out treeCurrent); // XHtmlTreeColumn treeColumn = dataGrid.Columns.FirstOrDefault(col => ((IXHtmlDataGridColumn)col).ColumnType == ColumnType.Arbre) as XHtmlTreeColumn; // if (treeColumn != null) treeColumn.SetCircles(treeCount, treeCurrent); } } break; #endregion List Consult case (ProprietesWpf)161 : // ClientLegerProprietes.PROPCLIENTLEGER_AFFICHEERREUR: AfficherErreurTransmise(buffer); break; case ProprietesWpf.FENETRE_ATTACHER_TOOLBARS_DEBUT: // Bordel des toolbars buffer.Get(out property); while (property != ProprietesWpf.FENETRE_ATTACHER_TOOLBARS_FIN) { //switch (property) { //case ProprietesWpf.TOOLBAR_DEBUT: // Création de toolbar // buffer.Get(out idToolBar); // toolBar = GetXwpfToolBar(idToolBar); // if (toolBar == null) listOfToolBars.Add(toolBar = new XwpfToolBar { Id = idToolBar }); // toolBar.ReadProperties(buffer); // break; //case ProprietesWpf.TOOLBAR_RECONSTRUCTION_DEBUT: // Reconstruction de toolbar // buffer.Get(out idToolBar); // toolBar = GetXwpfToolBar(idToolBar); // if (toolBar == null) listOfToolBars.Add(toolBar = new XwpfToolBar { Id = idToolBar }); // toolBar.ItemsList.Clear(); // toolBar.ReadProperties(buffer); // foreach (XwpfWindow windowFromStack in StackOfWindows) // { // ToolBarTray toolBarTray = (toolBar.Primary) ? windowFromStack.PrimaryToolBarTray : windowFromStack.SecondaryToolBarTray; // ToolBar toolBarInList = toolBarTray.ToolBars.FirstOrDefault(tb => tb.DataContext == toolBar); // if (toolBarInList != null) toolBar.Display(windowFromStack, toolBarInList); // } // break; //case ProprietesWpf.FENETRE_ATTACHER_TOOLBAR: // Pour attacher une toolbar (identifiant menu: ushort) // buffer.Get(out idToolBar); // GetXwpfToolBar(idToolBar).Display(StackOfWindows.Peek()); // break; //case ProprietesWpf.FENETRE_DETTACHER_TOOLBAR: // Pour supprimer une toolbar (identifiant menu: ushort) // buffer.Get(out idToolBar); // XwpfToolBar.Remove(idToolBar); // break; //default: // throw new XwpfException(XwpfErrorCodes.UnknownProperty, XwpfErrorLocations.Application, property.ToString()); } buffer.Get(out property); } break; default: throw new XHtmlException(XHtmlErrorCodes.UnknownProperty, XHtmlErrorLocations.Application, property.ToString()); } buffer.Get(out property); } var response = new DVBuffer(); #region Réponse asynchrone //if (AsynchronousResponse != null && AttenteInput) // impossible d'avoir un double-clic en input // AsynchronousResponse = null; //if (AsynchronousResponse != null && AttenteConsult) //{ // SetInputBuffer(AsynchronousResponse); // Send(AsynchronousResponse); // response déjà replie dans le Handler mais pas encore envoyée pour synchronisation // AsynchronousResponse = null; // responseAlreadySent = true; // Pour bloquer le Send(response) vide dans Analyse() // return; //} #endregion Réponse asynchrone #region Réponse asynchrone intertâche //if (interTaskResponses.Count > 0) // si réveil intertâche en attente //{ // if (AttenteInput) interTaskResponses.Clear(); // en input : r.à.z. de la liste des dialogues intertâches en attente // else if (AttenteConsult || AttenteGetb) // { // SendInterTaskResponse(); // responseAlreadySent = true; // Pour bloquer le Send(response) vide dans Analyse() // return; // } //} #endregion Réponse asynchrone intertâche #region nb lignes tableau // positionne responseAlreadySend et c'est tout if (nbRows.HasValue) { //response.Put(ProprietesWpf.CLIENTLEGER_DEBUT); //response.Put(ProprietesWpf.TABLEAU_NOMBRE_LIGNES); //response.Put(nbRows.Value); //Send(response); responseAlreadySent = true; // Pour bloquer le Emettre(response) vide dans Analyser() return; } #endregion nb lignes tableau #region index colonne tableau if (index.HasValue) { response.Put(ProprietesWpf.CLIENTLEGER_DEBUT); response.Put(ProprietesWpf.TABLEAU_COLONNE_SAISIE); response.Put(index.Value); Send(response); responseAlreadySent = true; // Pour bloquer le Emettre(response) vide dans Analyser() return; } #endregion index colonne tableau #region bulle scrollbar horizontale tableau if (horizontalScrollbarTooltip != null) { response.Put(ProprietesWpf.CLIENTLEGER_DEBUT); response.Put(ProprietesWpf.TABLEAU_ASCHOR_BULLE); response.PutStringCP(horizontalScrollbarTooltip, codepageBulleAscHor); Send(response); responseAlreadySent = true; // Pour bloquer le Emettre(response) vide dans Analyser() return; } #endregion bulle scrollbar horizontale tableau #region bulle scrollbar verticale tableau if (verticalScrollbarTooltip != null) { response.Put(ProprietesWpf.CLIENTLEGER_DEBUT); response.Put(ProprietesWpf.TABLEAU_ASCVER_BULLE); response.PutStringCP(verticalScrollbarTooltip, codepageBulleAscVer); Send(response); responseAlreadySent = true; // Pour bloquer le Emettre(response) vide dans Analyser() return; } #endregion bulle scrollbar verticale tableau #region Retour Fonction YGraph (FA) //retour normal (ident ou retour par defaut) //if (yDrawingOperationRet.HasValue) //{ // response.Put(ProprietesWpf.CLIENTLEGER_DEBUT); // response.Put(yDrawingIsCreation ? yDrawingOperationRet.Value : (int)yDrawingOperationRet.Value); // pas de propriétéWPF identifiant la valeur de retour (14/09/2011) // Send(response); // responseAlreadySent = true; // Pour bloquer le Emettre(response) vide dans Analyser() // return; //} ////retour de la taille ecran //if (yScreenSize.HasValue) //{ // response.Put(ProprietesWpf.CLIENTLEGER_DEBUT); // response.Put((int)yScreenSize.Value.Width); // pas de propriétéWPF identifiant la valeur de retour (21/09/2011) // response.Put((int)yScreenSize.Value.Height); // Send(response); // responseAlreadySent = true; // Pour bloquer le Emettre(response) vide dans Analyser() // return; //} #endregion //Retour Fonction YGraph (FA) #region Paramètres Initiaux Agenda //if (responseCalendarInit != null) //{ // Send(responseCalendarInit); // responseAlreadySent = true; // Pour bloquer le Emettre(response) vide dans Analyser() //} #endregion Paramètres Initiaux Agenda }
/// <summary> /// Fills the DVBuffer with the value of the given control /// </summary> /// <param name="response">Buffer containing the prepared response to the Diva program</param> /// <param name="typeNode"> DANS default.aspx, voir la fonction envoyerClic</param> internal void SetInputBuffer(DVBuffer response,string typeNode,string typeObjet,string valeurObjet,int cp) { FrameworkElement activeControl = StackOfWindows.Peek().ActiveControl; // int codePage = 0; if (response == null) throw new ArgumentNullException("response"); //if (activeControl == null) return; // on ne fait rien si pas de controle actif ProprietesWpf property = new ProprietesWpf(); string valueString = null; ushort? valueUshort = null; //if (!AttenteInput) return; // garde-fou : on ne fait rien si l'on n'est pas en attenteInput (ne devrait pas arriver) if (typeNode == "BUTTON") //!!!!!!!!!!!!!!!!tester!!!!!!!!! return; // on n'envoie rien pour le bouton //// type d'objet + codepage + valeur //if (activeControl is TextBox) !!!!!!!!!!!!!!!!!!!! //{ // property = ProprietesWpf.CHAMP_VALEUR; // valueString = ((XHtmlTextBox)activeControl).Text; // codePage = ((XHtmlTextBox)activeControl).CodePage; // !!!!!!!!!!!!!! stocker le codePage dans l'html //} if (typeNode == "INPUT" && typeObjet == "TEXT") { property = ProprietesWpf.CHAMP_VALEUR; valueString = valeurObjet; codePage = cp; } else if (typeNode == "INPUT" && typeObjet == "SELECT") // (activeControl is ComboBox) { property = ProprietesWpf.MULTICHOIX_VALEUR; valueUshort = (ushort)Convert.ToInt16(valeurObjet); } else if (typeNode == "DIV" && typeObjet == "CHECKBOX") { property = ProprietesWpf.CASE_A_COCHER_ETAT; valueUshort = (ushort)Convert.ToInt16(valeurObjet); //(((XHtmlCheckBox)activeControl).IsChecked == true) ? (ushort)1 : (ushort)0; } // DANS default.aspx, voir la fonction envoyerClic //else if (activeControl is PasswordBox) //{ // property = ProprietesWpf.CHAMP_VALEUR; // valueString = ((PasswordBox)activeControl).Password; // codePage = ((XHtmlPasswordBox)(activeControl.DataContext)).CodePage; //} //else if (activeControl is DatePicker) //{ // property = ProprietesWpf.CHAMP_VALEUR; // valueString = ((XHtmlDatePicker)activeControl).DisplayText; // codePage = ((XHtmlDatePicker)activeControl).CodePage; //} //else if (activeControl is ListBox) //{ // property = ProprietesWpf.MULTICHOIX_VALEUR; // valueUshort = (ushort)(((XHtmlListBox)activeControl).SelectedIndex + 1); //} //else if (activeControl is GroupBox) //{ // property = ProprietesWpf.GROUPE_RADIO_BOUTON_ACTIF; // valueUshort = (ushort)(((XHtmlRadioGroup)activeControl).CurrentIndex + 1); //} //else if (activeControl is RichTextBox) //{ // property = ProprietesWpf.RICHTEXT_TEXTE; // valueString = ((XHtmlRichTextBox)activeControl).GetValue(); //} //else if (activeControl is DataGrid) //{ // XHtmlDataGrid dataGrid = (XHtmlDataGrid)activeControl; // int currentRowIndex = dataGrid.Rows.IndexOf((XHtmlRow)dataGrid.CurrentItem); // int currentColIndex = dataGrid.Columns.IndexOf(dataGrid.CurrentCellInfo.Column); // dataGrid.PrepareInputCallBack(dataGrid.GetDataGridCell(currentRowIndex, currentColIndex), out property, out valueString, out valueUshort); //} response.Put(property); if (valueString != null) response.PutStringCP(valueString, codePage); else response.Put(valueUshort.Value); }
internal void SendError(XHtmlErrorCodes errorCode, XHtmlErrorLocations errorLocation, string errorParameter) { var errorBuffer = new DVBuffer(); errorBuffer.Put(ProprietesWpf.CLIENTLEGER_DEBUT); errorBuffer.Put(ProprietesWpf.ERREUR_XWPF); errorBuffer.Put((ushort)errorCode); errorBuffer.Put((ushort)errorLocation); errorBuffer.PutString(errorParameter); errorBuffer.PutString("ApplicationVersion"); //!!!!!!!!!!!!!!!!!!!!!!!!! // Send(errorBuffer); Il faut d'abord rendre la main au navigateur qui va immédiatement revenir pour emettre ce dvbuffer responseAlreadySent = true; // je garde le DVBuffer, j'en fait une copie en profondeur DVBufferATransmettreImmediatement = new DVBuffer(errorBuffer.LeBuffer, 0, errorBuffer.GetTaille()); }
// private readonly FlashModeHelper flashModeHelper = FlashModeHelper.GetInstance(); internal void Send(DVBuffer response) { return; //!!!!!!!!!!!!!!! /* App appp = (App)Application.Current; var app = (App)Application.Current; // TODO mettre dans les logs harmony ? Ce message est intéressant car il signale une anomalie qui va mettre le bazar if (app.AttenteReponseEnCours) { // !!!!!!!!!! MessageBox.Show("Attention : Désynchronisation entre Xwpf et Xrtdiva"); return; } app.AttenteReponseEnCours = true; AttenteConsult = false; AttenteInput = false; AttentePopupMenu = false; AttenteGetb = false; */ //!!!!!!!!!!! if (consultTimer != null) consultTimer.Stop(); // arrêt du timer le cas échéant //!!!!!!!!!!! if (!busyTimer.IsEnabled) busyTimer.Start(); // lancement du timer pour le curseur d'attente le cas échéant. //!!!!!!!!!!! XwpfWindow window = StackOfWindows.Peek(); //abandonner le focus si input en cours //!!!!!!!!!!! Keyboard.Focus(window.MainCanvas); //!!!!!!!!!! window.ActiveControl = null; // garde-fou: on r.à.z le contrôle actif lorsque l'appli à la main (et donc hors input). /* !!!!!!!!!!!!!!!! if (SendWindowhandler) { IntPtr hwnd = app.GetTopWindow(); if (hwnd != (IntPtr)0) { SendWindowhandler = false; response.Put((ushort)ClientLegerProprietes.PROPCLIENTLEGER_HFENETRE); response.Put((int)hwnd); app.Client.FenetreMere = hwnd; app.Client.Tunnel.EcrireHandlerFenetreClient(app.Client.SessionProgrammeCourant, hwnd, app.Client.IdentifiantServeur); } } */ //si le menu pour l'impression d'écran a été (dé)coché, on envoie la nouvelle valeur: if (IsPrintPreviewUpdated) { IsPrintPreviewUpdated = false; response.Put(ProprietesWpf.MENU_SYSTEME_APERCU_ETAT); response.Put((byte)(IsPrintPreviewEnabled ? 1 : 0)); // Flag "aperçu avant impression actif ?" (byte) response.Put((byte)(IsPrintPreviewSaved ? 2 : 0)); // Flag "sauver aperçu avant impression ?" (byte) } response.Put(ProprietesWpf.CLIENTLEGER_FIN); //!!!!!!!!!!!!!! app.Client.Transport.BufferEmission = response; //!!!!!!!!!!!!!! app.Client.Transport.EnvoyerEtDemanderReveil(); }
//*********************************************************************************************** //*********************************************************************************************** // C'EST ICI QUE CA SE PASSE //*********************************************************************************************** //*********************************************************************************************** protected unsafe void Page_Load(object sender, EventArgs e) { string chaineJson = ""; // récupération des parametres envoyés en ajax //----------------------------------------------------------------- foreach (string id in Request.Form) { string[] valeurs = Request.Form.GetValues(id); if (valeurs.Length == 1) { string val = Request.Form[id]; if (id == "divaltoParametresAjax") chaineJson = val; } else { //§!!!!!!!!!!!!!!!!!!!!!!!! for (int cpt = 0; cpt < valeurs.Length; cpt++) { string val = valeurs[cpt]; } } } // je n'ai aucune variable statique CAR (OH SURPRISE) elle serait globale a toutes les sessions //---------------------------------------------------------------------------------------------- XHtmlApplication app = new XHtmlApplication(); app.Html = new HtmlGlobal(); app.Html.App = app; // je recupere ce que j'ai stocké dans les variables de session // Les polices,bordures,couleurs,paddings,pile des fenetres //---------------------------------------------------------------------------------------------- byte[] toutEnJson = (byte[])this.Session["application"]; if (toutEnJson != null) { // je passe par une donnée de travail CAR LES CONSTRUCTEURS NE SONT PAS APPELES par les fonctions JSON XHtmlApplication wapp = (XHtmlApplication)app.Html.JsonApplication.ReadObject(new MemoryStream(toutEnJson)); app.BorduresCss = wapp.BorduresCss; app.PaddingCss = wapp.PaddingCss; app.PolicesCss = wapp.PolicesCss; app.CouleursCss = wapp.CouleursCss; app.StackOfWindows = wapp.StackOfWindows; // pour chaque page, remet le pointeur vers la fenetre parent foreach (XHtmlWindow w in app.StackOfWindows) { foreach (XHtmlPage p in w.ListOfPages) { p.Html = app.Html; p.Window = w; } } } // - au moins une fenetre sur le stack if (app.StackOfWindows.Count == 0) app.StackOfWindows.Push(new XHtmlWindow()); // - création d'une liste de commandes a partir des données recues byte[] tablo = app.Html.UniEncoding.GetBytes(chaineJson); ListeParametresRecus recus = (ListeParametresRecus)app.Html.JsonParamsRecus.ReadObject(new MemoryStream(tablo)); // - Balayage des données transmises par le client //--------------------------------------------------------------------------------- foreach (UnParametreRecu recu in recus.commandes) { switch (recu.commande) { case "premierappel": { byte[] tablop = app.Html.UniEncoding.GetBytes(recu.compl); XHtmlParametresLancement lancement = (XHtmlParametresLancement)app.Html.JsonParametresLancement.ReadObject(new MemoryStream(tablop)); app.LancementDuProgramme(true, lancement, this, sender, e); } break; case "cmdSuite": // il n'y avait rien a faire coté client, juste a réveiller le serveur { var response = new DVBuffer(); response.Put(ProprietesWpf.CLIENTLEGER_DEBUT); //début de l'acquittement ou de la réponse EnvoyerEtAttendre(response,app); } break; case "transmettreBufferGarde": // transmission du buffer précédemment gardé { DVBuffer b; byte[] t = (byte[])this.Session["DVBufferATransmettreImmediatement"]; b = new DVBuffer(t); EnvoyerEtAttendre(b, app); } break; case "tabGetNbLig": // transmettre le nombre de lignes d'un tableau { ushort us; DVBuffer b = new DVBuffer(); b.Put(ProprietesWpf.CLIENTLEGER_DEBUT); b.Put(ProprietesWpf.TABLEAU_NOMBRE_LIGNES); us = Convert.ToUInt16(recu.valeur); b.Put(us); EnvoyerEtAttendre(b, app); } break; case "identsTables": // reception de la liste des idents des objets tableaux, // comme ca je peux tester si un tableau existe ou non { string[] idents = recu.valeur.Split(','); app.Html.ListeIdentsTablesExistantesCoteClient = idents; } break; case "toucheFonction": { // - création d'une liste de commandes a partir des données recues string [] p; string key = ""; string shift = "false"; string ctrl = "false"; string alt = "false"; string typeNode = ""; string typeInput = ""; string valeurObjet = ""; int codePage=0; byte[] stablo = app.Html.UniEncoding.GetBytes(recu.compl); ListeParametresRecus srecus = (ListeParametresRecus)app.Html.JsonParamsRecus.ReadObject(new MemoryStream(stablo)); foreach (UnParametreRecu sp in srecus.commandes) { switch (sp.commande) { case "typeTouche" : p = sp.valeur.Split(','); key = p[0]; shift = p[1]; ctrl = p[2]; alt = p[3]; break; case "typeObjet" : typeNode = sp.valeur; typeInput = sp.compl.ToUpper(); break; case "valeurObjet" : valeurObjet = sp.valeur; codePage = Convert.ToInt32(sp.compl); break; } } var response = new DVBuffer(); response.Put(ProprietesWpf.CLIENTLEGER_DEBUT); //début de l'acquittement ou de la réponse app.SetInputBuffer(response,typeNode,typeInput,valeurObjet,codePage); if (ctrl == "true") response.Put(ProprietesWpf.TOUCHE_CTRL); if (shift == "true") response.Put(ProprietesWpf.TOUCHE_SHIFT); if (alt == "true") response.Put(ProprietesWpf.TOUCHE_ALT); response.Put(ProprietesWpf.TOUCHE_CLAVIER); // touche tapée (APRES les modificateurs) response.PutString(key); EnvoyerEtAttendre(response, app); } break; case "clicSouris": { string[] p; int nombreClic = 1; int boutonSouris = 1; ushort arretDemandeSaisie = 0; ushort numeroPage = 0; string shift = "false"; string ctrl = "false"; string alt = "false"; string typeNode = ""; string typeInput = ""; string valeurObjet = ""; int sequence = 0; int codePage = 0; ClicOnglet onglet=null; byte[] stablo = app.Html.UniEncoding.GetBytes(recu.compl); ListeParametresRecus srecus = (ListeParametresRecus)app.Html.JsonParamsRecus.ReadObject(new MemoryStream(stablo)); foreach (UnParametreRecu sp in srecus.commandes) { switch (sp.commande) { case "typeClic" : p = sp.valeur.Split(','); nombreClic = Convert.ToInt32(p[0]); boutonSouris = Convert.ToInt32(p[1]); shift = p[2]; ctrl = p[3]; alt = p[4]; break; case "typeObjet" : typeNode = sp.valeur; typeInput = sp.compl.ToUpper(); break; case "infosPage" : p = sp.valeur.Split(','); sequence = Convert.ToInt32(p[0]); numeroPage = (ushort)Convert.ToInt16(p[1]); arretDemandeSaisie = (ushort)Convert.ToInt16(p[2]); break; case "valeurObjet" : valeurObjet = sp.valeur; codePage = Convert.ToInt32(sp.compl); break; case "clicOnglet": { byte[] stablong = app.Html.UniEncoding.GetBytes(sp.valeur); onglet = (ClicOnglet)app.Html.JsonClicOnglet.ReadObject(new MemoryStream(stablong)); } break; } } var response = new DVBuffer(); response.Put(ProprietesWpf.CLIENTLEGER_DEBUT); //début de l'acquittement ou de la réponse app.SetInputBuffer(response, typeNode, typeInput, valeurObjet, codePage); response.Put(ProprietesWpf.EVENEMENT_SOURIS_DEBUT); // Début de l'envoi des évenements souris if (onglet == null) { response.Put(ProprietesWpf.SOURIS_TYPE_EVENEMENT); // Type d'évènement souris (byte) response.Put((byte)MouseEvent.ClickControl); response.Put(ProprietesWpf.PAGE_NUMERO); // Numéro de la page contenant la donnée cliquée response.Put((byte)numeroPage); response.Put(ProprietesWpf.PAGE_ARRET_SAISIE); // Numéro du point d'arrêt "Demande de saisie" de la page contenant la donnée cliquée response.Put(arretDemandeSaisie); p = recu.valeur.Split('_'); response.Put(ProprietesWpf.IDENT_UNIQUE); // Id de la donnée cliquée (uint) response.Put(Convert.ToInt32(p[0])); response.Put(ProprietesWpf.PARAM_SAISIE_SEQUENCE); // Numéro du point de séquence de la donnée cliquée response.Put((ushort)sequence); // Informations sur le clic lui-même, à savoir (pour le moment) : response.Put(ProprietesWpf.SOURIS_CLIC); // 1 = simple clic; 2 = double clic (byte) response.Put((byte)nombreClic); response.Put(ProprietesWpf.SOURIS_BOUTON); // 1 = gauche; 2 = milieu; 3 = droite (byte) response.Put((byte)boutonSouris); response.Put(ProprietesWpf.SOURIS_TOUCHE); // touche(s) du clavier enfoncée(s) simultanément (byte) response.Put(XHtmlApplication.GetPressedKey(shift, ctrl, alt)); // if (e.ClickCount < 2) Send(response); // envoi de la réponse et attente de la suite // else if (!AttenteInput) AsynchronousResponse = response; } else { response.Put(ProprietesWpf.SOURIS_TYPE_EVENEMENT); // Type d'évènement souris (byte) response.Put((byte)MouseEvent.ClickTab); response.Put(ProprietesWpf.SOURIS_CLIC); // 1 = simple clic; 2 = double clic (byte) response.Put((byte)1); response.Put(ProprietesWpf.SOURIS_BOUTON); // 1 = gauche; 2 = milieu; 3 = droite (byte) response.Put((byte)1); response.Put(ProprietesWpf.SOURIS_TOUCHE); // touche(s) du clavier enfoncée(s) simultanément (byte) response.Put((byte)0); // Informations sur le changement d'onglet : response.Put(ProprietesWpf.ONGLET_ARRET); // Numéro du point d'arrêt (ushort) response.Put(onglet.arretOnglet); response.Put(ProprietesWpf.ONGLET_NOUVELLE_PAGE); // numéro de page de l'onglet à afficher (byte) response.Put((byte)onglet.pageOngletClick); response.Put(ProprietesWpf.ONGLET_ANCIENNE_PAGE); // numéro de page de l'onglet précédemment affiché (byte) response.Put((byte)onglet.anciennePage); } response.Put(ProprietesWpf.EVENEMENT_SOURIS_FIN); // Fin de l'envoi des évenements souris EnvoyerEtAttendre(response, app); } break; case "notificationCaseACocher": { string[] p; ushort arretDemandeSaisie = 0; ushort numeroPage = 0; string valeurObjet = ""; int sequence = 0; byte[] stablo = app.Html.UniEncoding.GetBytes(recu.compl); ListeParametresRecus srecus = (ListeParametresRecus)app.Html.JsonParamsRecus.ReadObject(new MemoryStream(stablo)); foreach (UnParametreRecu sp in srecus.commandes) { switch (sp.commande) { case "infosPage": p = sp.valeur.Split(','); sequence = Convert.ToInt32(p[0]); numeroPage = (ushort)Convert.ToInt16(p[1]); arretDemandeSaisie = (ushort)Convert.ToInt16(p[2]); break; case "valeurCase": valeurObjet = sp.valeur; break; } } var response = new DVBuffer(); response.Put(ProprietesWpf.CLIENTLEGER_DEBUT); //début de l'acquittement ou de la réponse response.Put(ProprietesWpf.EVENEMENT_SOURIS_DEBUT); // Début de l'envoi des évenements souris response.Put(ProprietesWpf.SOURIS_TYPE_EVENEMENT); // Type d'évènement souris (byte) response.Put((byte)MouseEvent.Notification); response.Put(ProprietesWpf.PAGE_NUMERO); // Numéro de la page contenant la donnée cliquée response.Put((byte)numeroPage); p = recu.valeur.Split('_'); response.Put(ProprietesWpf.IDENT_UNIQUE); // Id de la donnée cliquée (uint) response.Put(Convert.ToInt32(p[0])); response.Put(ProprietesWpf.PARAM_SAISIE_SEQUENCE); // Numéro du point de séquence de la donnée cliquée response.Put((ushort)sequence); response.Put(ProprietesWpf.EVENEMENT_SOURIS_FIN); // Fin de l'envoi des évenements souris response.Put(ProprietesWpf.CASE_A_COCHER_ETAT); response.Put((ushort)Convert.ToInt16(valeurObjet)); EnvoyerEtAttendre(response, app); } break; case "clicbouton": // transfert des infos du clic a JS { byte[] tablop = app.Html.UniEncoding.GetBytes(recu.compl); ListeParametresComplementaires recusp = (ListeParametresComplementaires)app.Html.JsonParamCompl.ReadObject(new MemoryStream(tablop)); UnParametreComplementaire p1, p2; string idBouton = recu.valeur; p1 = recusp.p.First(); byte action = Convert.ToByte(p1.v); p2 = recusp.p[1]; var response = new DVBuffer(); response.Put(ProprietesWpf.CLIENTLEGER_DEBUT); //début de l'acquittement ou de la réponse response.Put(ProprietesWpf.EVENEMENT_SOURIS_DEBUT); // Début de l'envoi des évenements souris response.Put(ProprietesWpf.SOURIS_TYPE_EVENEMENT); // Type d'évènement souris (byte) response.Put((byte)MouseEvent.ClickButton); response.Put(ProprietesWpf.BOUTON_ACTION); // Type d'action (byte = 1, 2 ou 3) response.Put(action); switch (action) { case 1: response.Put(Convert.ToInt16(p2.v)); break; // Type = 1 : point de traitement case 2: response.Put(Convert.ToInt16(p2.v)); break; // Type = 2 : point d'arrêt case 3: response.PutString(p2.v); break; // Type = 3 : chaîne à générer } response.Put(ProprietesWpf.EVENEMENT_SOURIS_FIN); // Fin de l'envoi des évenements souris EnvoyerEtAttendre(response,app); } break; case "clicmultichoix": //envoi = new UnParametreEnvoye(); //envoi.commande = "status"; //envoi.valeur = "true"; //envois.commandes.Add(envoi); //envoi = new UnParametreEnvoye(); //envoi.commande = "script"; //envoi.valeur = "laisserPasserClickMultiChoix=true;"; //envoi.valeur += "$(\"#dropdownlist\").data(\"kendoDropDownList\").open();"; //envois.commandes.Add(envoi); break; } } //***************************************************************************************** // Analyse des données provenant de JS //***************************************************************************************** app.CodeEcran = new DVBuffer(app.DonneesRecuesDeYwpf, Marshal.SizeOf(typeof(EnteteTrame)), app.DonneesRecuesDeYwpf.Length); app.Analyse(app.CodeEcran); //***************************************************************************************** // Préparation des envois vers le client //***************************************************************************************** app.FaireLaListeDesEnvoisPourStyles(); // - utilisé pour les erreurs détectées dans la couche IIS if (app.DVBufferATransmettreImmediatement != null) { DVBuffer b = app.DVBufferATransmettreImmediatement; byte[] t = new byte[b.GetTaille()]; Array.Copy(b.LeBuffer, t, b.GetTaille()); this.Session["DVBufferATransmettreImmediatement"] = t; app.Html.Envois.Ajouter("transmettreBufferGarde", "session"); } else this.Session["DVBufferATransmettreImmediatement"] = null; chaineAEnvoyer = HtmlGlobal.ToJsonString(app.Html.Envois, app.Html.JsonParamsEnvoyes, false); // - je garde tout ce qui m'intéresse dans une donnée de session //-------------------------------------------------------------------------------- this.Session["application"] = HtmlGlobal.ToJson(app, app.Html.JsonApplication); byte[] wtout = (byte [])this.Session["application"]; }
//************************************************************************************* // Envoyer les données vers JS et attendre sa réponse //************************************************************************************* private void EnvoyerEtAttendre(DVBuffer response, XHtmlApplication app) { int sessionWeb = (int)this.Session["SessionDivaltoWeb"]; response.Put(ProprietesWpf.CLIENTLEGER_FIN); // emballe le DVBuffer comme si c'était une trame client léger byte[] tout = XHtmlOutils.AjouterEnteteAuDVBuffer(response); // envoi + attente DialogueX2Y.WebSendDataAndWaitResponse(sessionWeb, tout, out app.DonneesRecuesDeYwpf); // dans tous les cas on crée un DVBuffer avec le code de la page if (app.DonneesRecuesDeYwpf == null) { string message = "codeecran null dans XWebPageLoad"; throw new NullReferenceException(message); } }