WebGadget : petite question

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Pascal
Messages : 5
Inscription : mer. 12/juil./2006 22:34

WebGadget : petite question

Message par Pascal »

Est il possible (sans passer par un fichier intermediaire) de charger dynamiquement du HTML dans un controle Webgadget ? (Le contenu d'une variable par exemple)

Une idée ?

Merci d'avance pour votre aide
Anonyme

Message par Anonyme »

Salut & bienvenu

Si j'ai bien compris ,tu veut stocké une page web dans une variable ?

si oui ce code peut t'aider, il n'est pas de moi, je sais plus ou je l'ai chopé :D

Code : Tout sélectionner

Procedure.s OpenURL(Url.s,BufferSize.l) 
  isLoop.b=1 
  INET_RELOAD.l=$80000000 
  hInet.l=0: hURL.l=0: Bytes.l=0 
  Buffer.s=Space(BufferSize) 
 
  hInet = InternetOpen_("PB@INET", 1, #Null, #Null, 0) 
  hURL = InternetOpenUrl_(hInet, Url, #Null, 0, INET_RELOAD, 0) 
  
  Repeat 
    
    Delay(1) 
    InternetReadFile_(hURL, @Buffer, Len(Buffer), @Bytes) 
    If Bytes = 0 
      isLoop=0 
    Else 
      res.s = res + Left(Buffer, Bytes) 
    EndIf 
  Until isLoop=0 
  InternetCloseHandle_(hURL) 
  InternetCloseHandle_(hInet) 
  
  If *Retour.l : FreeMemory(*Retour) : EndIf
  *Retour = AllocateMemory(Len(res)*4)
  PokeS(*Retour,res)
  
  ProcedureReturn PeekS(*Retour) 
EndProcedure 
@++
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Message par erix14 »

Bienvenu,
Sur le forum anglais quelqu'un a écrit une fonction WebGadget_Write http://www.purebasic.fr/english/viewtop ... 7&start=60
Je pense que c'est ce que tu cherches.
Pascal
Messages : 5
Inscription : mer. 12/juil./2006 22:34

Message par Pascal »

En effet, c'est une solution, mais vu la taille ça me donne l'impression de chasser un moucheron avec un bazooka. :wink:

Donc, j'ai pensé à une autre façon de voir les choses.

Quand on veut charger dans une controle webgadget une page web, il suffit d'en donner l'adresse. Et si cette adresse est du type http://127.0.0.1 on se retrouve avec une requete locale.

D'où l'idée de monter un petit serveur. Je suis donc en train d'entreprendre la modification de l'Atomic Web Server donc le code est donné avec PB.

Et au lieu d'utiliser la fonction SendNetworkData(ConnectionID, *BufferMemoire, Longueur), pourquoi ne pas utiliser SendNetworkString(ConnectionID, String$) ?

En plus le code pourrait être encore plus épuré, vu qu'il est possible de controler le type de demande.

En revanche, petite question : Dans le header du fichier envoyé, la taille donnée c'est la taille sans le header ou c'est la taille totale du fichier envoyé ?

Bon... je retourne derrière mon clavier. Si vous avez des idées à me soumettre, des remarques, je suis preneur.

A bientôt
Pascal
Messages : 5
Inscription : mer. 12/juil./2006 22:34

Message par Pascal »

Voilà, donc après un petit brainstorming une solution (parmis tant d'autres)

Le code, comme indiqué s'inspire du serveur Web fourni avec PB.

Code : Tout sélectionner

;
; ------------------------------------------------------------
;
;       Pico Web Server 
;
;       Basé sur l'Atomic web server - (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #String_0
  #Button_0
  #Web_0
EndEnumeration


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 253, 11, 443, 412, "Pico Web",  #PB_Window_SystemMenu | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      StringGadget(#String_0, 0, 0, 440, 130, "<HTML><BODY SCROLL=NO>Test envoie direct</BODY></HTML>")
      ButtonGadget(#Button_0, 0, 130, 440, 20, "Transmettre données")
      WebGadget(#Web_0, 0, 150, 440, 260, "")
      
    EndIf
  EndIf
EndProcedure

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

Port = 8070
*Buffer = AllocateMemory(10000)

Global EOL$
Global page$

EOL$ = Chr(13)+Chr(10)

If CreateNetworkServer(0, Port)

  Open_Window_0()
  SetGadgetText(#Web_0,"http://127.0.0.1:8070")
  Repeat
    
    Repeat
      WEvent = WindowEvent()

      If WEvent = #PB_Event_CloseWindow : Quit = 1 : EndIf
      
      If WEvent = #PB_Event_Gadget
        If EventGadget()=#Button_0
          page$=GetGadgetText(#String_0)

          SetGadgetState(#Web_0,#PB_Web_Refresh)
        EndIf
      EndIf
    Until WEvent = 0
    
    SEvent = NetworkServerEvent()
  
    If SEvent
      ClientID.l = EventClient()
  
      Select SEvent
      
        Case 1  ; When a new client has been connected...
          
        Case 4  ; When a client has closed the connection...
  
        Default
          RequestLength.l = ReceiveNetworkData(ClientID, *Buffer, 2000)
          Gosub ProcessRequest
          
      EndSelect

    Else
      Delay(20)  ; Don't stole the whole CPU !
    EndIf
    
  Until Quit = 1 
    
  CloseNetworkServer(0)
Else
  MessageRequester("Pico Web", "Error: can't create the server (port in use ?).", 0)
EndIf
  
End 



ProcessRequest:

  ;a$ = PeekS(*Buffer) : Pour récuperer la requete.

  ContentType$ = "text/html"
  ;page$="<HTML><BODY>Test</BODY></HTML>"
  
  head$="HTTP/1.1 200 OK"+EOL$
  head$=head$+"Date: Wed, 07 Aug 1996 11:15:43 GMT"+EOL$
  head$=head$+"Server: Pico Web Server 0.1"+EOL$
  head$=head$+"Content-Length: "+Str(Len(page$))+EOL$
  head$=head$+"Content-Type: "+ContentType$+EOL$
  head$=head$+EOL$
  
  page$=head$+page$
  SendNetworkString(ClientID,page$)

Return
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Pas mal, bien pensé!
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Message par erix14 »

Excellent :D
Anonyme

Message par Anonyme »

C'est simple en fait, et je n'avais pas compris ta requete, pourtant tu était clair :oops:

pour me faire pardonner voici le meme code, sauf que tu peut y stocker une page entière puis redimensionner la fenetre. :wink:

Code : Tout sélectionner

; 
; ------------------------------------------------------------ 
; 
;       Pico Web Server 
; 
;       Basé sur l'Atomic web server - (c) 2001 - Fantaisie Software 
; 
; ------------------------------------------------------------ 
;- Window Constants 
; 
Enumeration 
  #Window_0 
EndEnumeration 

;- Gadget Constants 
; 
Enumeration 
  #String_0 
  #Button_0 
  #Web_0 
EndEnumeration 


Procedure Open_Window_0() 
  If OpenWindow(#Window_0, 253, 11, 443, 412, "Pico Web",  #PB_Window_MaximizeGadget | #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_SizeGadget) 
    If CreateGadgetList(WindowID(#Window_0)) 
      EditorGadget(#String_0,0,0,440,130)
      ButtonGadget(#Button_0, 0, 130, 440, 20, "Transmettre données") 
      WebGadget(#Web_0, 0, 150, 440, 260, "") 
      SetGadgetText(#String_0 ,"<HTML><BODY SCROLL=NO>Test envoie direct</BODY></HTML>")
    EndIf 
  EndIf 
EndProcedure 

If InitNetwork() = 0 
  MessageRequester("Error", "Can't initialize the network !", 0) 
  End 
EndIf 

Port = 8070 
*Buffer = AllocateMemory(10000) 

Global EOL$ 
Global page$ 

EOL$ = Chr(13)+Chr(10) 

If CreateNetworkServer(0, Port) 

  Open_Window_0() 
  SetGadgetText(#Web_0,"http://127.0.0.1:8070") 
  Repeat 
   
    Repeat 
      WEvent = WindowEvent() 

       If WEvent = #PB_Event_SizeWindow 
         ResizeGadget(#String_0,0,0,WindowWidth(#Window_0),WindowHeight(#Window_0)/2)
           ResizeGadget(#Web_0,0,(WindowHeight(#Window_0)/2)+20,WindowWidth(#Window_0),WindowHeight(#Window_0)/2)
            ResizeGadget(#Button_0, 0, (WindowHeight(#Window_0)/2), WindowWidth(#Window_0),20)
             EndIf


      If WEvent = #PB_Event_CloseWindow : Quit = 1 : EndIf 
      
      If WEvent = #PB_Event_Gadget 
        If EventGadget()=#Button_0 
          page$=GetGadgetText(#String_0) 

          SetGadgetState(#Web_0,#PB_Web_Refresh) 
        EndIf 
      EndIf 
    Until WEvent = 0 
    
    SEvent = NetworkServerEvent() 
  
    If SEvent 
      ClientID.l = EventClient() 
  
      Select SEvent 
      
        Case 1  ; When a new client has been connected... 
          
        Case 4  ; When a client has closed the connection... 
  
        Default 
          RequestLength.l = ReceiveNetworkData(ClientID, *Buffer, 2000) 
          Gosub ProcessRequest 
          
      EndSelect 

    Else 
      Delay(20)  ; Don't stole the whole CPU ! 
    EndIf 
    
  Until Quit = 1 
    
  CloseNetworkServer(0) 
Else 
  MessageRequester("Pico Web", "Error: can't create the server (port in use ?).", 0) 
EndIf 
  
End 



ProcessRequest: 

  ;a$ = PeekS(*Buffer) : Pour récuperer la requete. 

  ContentType$ = "text/html" 
  ;page$="<HTML><BODY>Test</BODY></HTML>" 
  
  head$="HTTP/1.1 200 OK"+EOL$ 
  head$=head$+"Date: Wed, 07 Aug 1996 11:15:43 GMT"+EOL$ 
  head$=head$+"Server: Pico Web Server 0.1"+EOL$ 
  head$=head$+"Content-Length: "+Str(Len(page$))+EOL$ 
  head$=head$+"Content-Type: "+ContentType$+EOL$ 
  head$=head$+EOL$ 
  
  page$=head$+page$ 
  SendNetworkString(ClientID,page$) 

Return
Pascal
Messages : 5
Inscription : mer. 12/juil./2006 22:34

Message par Pascal »

Merci pour vos commentaires et pour la modification (complément) de code. Mais j'avais juste mis ça en place pour valider la procédure.

Ce petit module va s'insérer dans un projet plus complexe.

J'ai besoin de réaliser un applicatif qui va s'appuyer sur une base SQL déposée sur un serveur mutualisé. Qui dit mutualisé petit prix, dit bande passante, flux mensuel limités. Ca c'est pour l'aspect "serveur". Coté client l'affichage sera géré par un simple browser. La solution donc simpliste est d'utiliser le duo PHP/SQL pour faire tourner tout ça.

Mais dans la majorité des cas, le fonctionnement revient à envoyer une requete, executer un script PHP, charger du code / des graphismes. Et c'est là qu'intervient mon petit module. Au lieu de demander l'integralité de la page et des graphiques au serveur, pourquoi ne pas demander juste les données et faire la mise en forme finale coté client. Il est même envisageable (et envisagé) de charger une partie des graphismes d'avance sous la forme de fichier "packed". Car finalement, la majeure partie du temps, les scripts PHP ne servent qu'a faire de la mise en forme de données. Et là, si par exemple, au lieu de charger une page de (par exemple) 60 Ko il suffit de charger 1 ou 2 ko de données brutes, voilà qui va devenir ridicule au niveau charge serveur/flux de données. De là à créer un micro-langage de script en PB, il n'y a qu'un pas.

Donc, et je vous ferais parvenir le résultat de mes essais, plusieurs modules seront à créer :
- Vérification de version et mise à jour automatique de programmes / données
- Lecture de données sur une base SQL délocalisée et récupération sous forme de variable
- Mini langage de script (pourquoi pas :wink: )
- Et autres choses à venir surement ...

A bientôt
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Message par erix14 »

@Pascal, moi je fais à peu près ça en XUL / AJAX côté client et PHP / mySQL côté serveur, mais je suis très intéressé pour le faire en PureBasic. J'attends tes codes avec impatience. D'avance merci. :D
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Salut Pascal, vraiment super! :D
Tu peux faire un éditeur de pages et site web rapido, en visionnant illico ce que tu codes en html. Ca peut devenir un wysywig sympa!
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
bernard13
Messages : 1221
Inscription : mer. 05/janv./2005 21:30

Message par bernard13 »

c'est un projet aussi que je suis entrain de faire
un editeur Html ...
Répondre