OpenStreetMap embarqué dans votre application

Partagez votre expérience de PureBasic avec les autres utilisateurs.
GG
Messages : 239
Inscription : jeu. 09/déc./2004 12:23

Re: OpenStreetMap embarqué dans votre application

Message par GG »

Elle est déjà comme cela dans le package téléchargé. :(
PureBasic 6.03 - Windows 11 22H2 (64 bits)
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: OpenStreetMap embarqué dans votre application

Message par Ar-S »

En 4.41 même erreur que GG

J'ai modifié la libcurl comme tu l'as dit.

J'obtiens 2 erreurs

Code : Tout sélectionner

Ligne 151  *LibCurl_NewMemory = AllocateMemory(MemorySize(*LibCurl_SharedMem))
Ligne 152  CopyMemory(*LibCurl_SharedMem, *LibCurl_NewMemory, MemorySize(*LibCurl_SharedMem))
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
GG
Messages : 239
Inscription : jeu. 09/déc./2004 12:23

Re: OpenStreetMap embarqué dans votre application

Message par GG »

Hello,

Des news ?
PureBasic 6.03 - Windows 11 22H2 (64 bits)
GG
Messages : 239
Inscription : jeu. 09/déc./2004 12:23

Re: OpenStreetMap embarqué dans votre application

Message par GG »

Help !
PureBasic 6.03 - Windows 11 22H2 (64 bits)
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: OpenStreetMap embarqué dans votre application

Message par MetalOS »

Salut les amis, existe t'il une mise à jour pour purebasic 4.51 ?
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: OpenStreetMap embarqué dans votre application

Message par Ar-S »

L'archive date du 31-Aut-2009, du coup je ne pense pas.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: OpenStreetMap embarqué dans votre application

Message par djes »

Pour moi ça fonctionne parfaitement avec pb 4.51. N'oubliez pas d'adapter le code selon votre proxy, et d'enlever la fonction sinh()
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: OpenStreetMap embarqué dans votre application

Message par MetalOS »

J'ai enlevé la fonction sinh(), mais sous linux la carte OpenStreetMap n'apparait pas.
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: OpenStreetMap embarqué dans votre application

Message par MetalOS »

Pas d'idée ?
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: OpenStreetMap embarqué dans votre application

Message par djes »

Ca vient sûrement d'un problème réseau, faudrait tester quelques fonctions simples de la Curl pour voir d'où ça vient...
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: OpenStreetMap embarqué dans votre application

Message par MetalOS »

Progi1984 si tu passe par là... peut tu mêttre ton code à jour et le rendre compatible Linux et Mac :wink:

Autrement pourquoi ne pas utiliser l'api java openlayers et lui envoyer des requêtes. Voici un exemple pour charger OpenStreetMap

Code : Tout sélectionner

;By MetalOS

;- Global Variables and Constants
Global BubbleTipStyle.l:BubbleTipStyle=0

;- Window Constants
Enumeration 1
  #Window_Form1
EndEnumeration
#WindowIndex=#PB_Compiler_EnumerationValue


;- Gadget Constants
Enumeration 1
  ;Window_Form1
  #MenuBar_Form1_Fichier
  #MenuBar_Form1_Quitter

  #Gadget_Form1_Web1
  #Gadget_Form1_Button1
  #Gadget_Form1_Button2
  #Gadget_Form1_String1
  #Gadget_Form1_Button3


EndEnumeration
#GadgetIndex=#PB_Compiler_EnumerationValue


;- MenuBar Constants
Enumeration 1
  #MenuBar_Form1
EndEnumeration
#MenuBarIndex=#PB_Compiler_EnumerationValue


;- StatusBar Constants
Enumeration 1
  #StatusBar_Form1
EndEnumeration
#StatusBarIndex=#PB_Compiler_EnumerationValue
#StatusBar_Form1_Field1 =0
#StatusBar_Form1_Field2 =1
#StatusBar_Form1_Field3 =2
#StatusBar_Form1_Field4 =3

Procedure.s MakeHtmlCode(adresse.s = "")
   Protected html.s
   Protected *c.character
      
   ;nur für DataZeilen
   For *c = ?MapLabel To ?MapLabelEnd
      If *c\c = 0           
         *c\c = 13       
      EndIf   
   Next
   
   ;Script laden
   html = PeekS(?MapLabel, ?MapLabelEnd - ?MapLabel)
   
   If adresse
      html = ReplaceString(html, "List Deutschland", adresse)  
   EndIf
      
   ProcedureReturn html  
   
DataSection
   MapLabel:
   
   Data.S "<!DOCTYPE HTML>"
   Data.s "<html>"
   Data.s "<head>"
   Data.s "<title>OpenLayers Demo</title>"
   Data.s "<style type='text/css'>"
   Data.s "  html, body, #basicMap {"
   Data.s "      width: 100%;"
   Data.s "      height: 100%;"
   Data.s "      margin: 0;"
   Data.s "  }"
   Data.s "</style>"
   Data.s "<script src='http://www.openlayers.org/api/OpenLayers.js'></script>"
   Data.s "<script>"
   Data.s "  function init() {"
   Data.s "    Map = new OpenLayers.Map('basicMap');"
   Data.s "    var mapnik = new OpenLayers.Layer.OSM();"
   Data.s "    Map.addLayer(mapnik);"
   Data.s "    Map.setCenter(new OpenLayers.LonLat(4.0,48.0) // Centre de la carte"
   Data.s "      .transform("
   Data.s "        new OpenLayers.Projection('EPSG:4326'), // transformation de WGS 1984"
   Data.s "        new OpenLayers.Projection('EPSG:900913') // en projection Mercator sphérique"
   Data.s "      ), 5 // Zoom level"
   Data.s "    );"
   Data.s "  }"
   Data.s "</script>"
   Data.s "</head>"
   Data.s "<body onload='init();'>"
   Data.s "<div id='basicMap'></div>"
   Data.s "</body>"
   Data.s "</html>"   
   MapLabelEnd:
EndDataSection 

EndProcedure

Procedure.l Window_Form1()
  If OpenWindow(#Window_Form1,378,165,725,585,"Open Street Map.",#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered|#PB_Window_WindowCentered|#PB_Window_Invisible)
      CreateMenu(#MenuBar_Form1,WindowID(#Window_Form1))
      MenuTitle("Fichier")
      MenuItem(#MenuBar_Form1_Quitter,"Quitter")
      WebGadget(#Gadget_Form1_Web1,0,0,725,495,"")
      SetGadgetItemText(#Gadget_Form1_Web1, #PB_Web_HtmlCode, MakeHtmlCode(adresse.s))
      ButtonGadget(#Gadget_Form1_Button1,5,510,60,20,"Lieu 1")
      ButtonGadget(#Gadget_Form1_Button2,75,510,60,20,"Lieu 2")
      StringGadget(#Gadget_Form1_String1,140,510,515,20,"")
      ButtonGadget(#Gadget_Form1_Button3,660,510,60,20,"Valider")
      CreateStatusBar(#StatusBar_Form1,WindowID(#Window_Form1))
        AddStatusBarField(100)
        AddStatusBarField(100)
        AddStatusBarField(100)
        AddStatusBarField(100)
      HideWindow(#Window_Form1,0)
      ProcedureReturn WindowID(#Window_Form1)
  EndIf
EndProcedure



;- Main Loop
If Window_Form1()

  quitForm1=0
  Repeat
    EventID  =WaitWindowEvent()
    MenuID   =EventMenu()
    GadgetID =EventGadget()
    WindowID =EventWindow()

    Select EventID
      Case #PB_Event_CloseWindow
        If WindowID=#Window_Form1
          quitForm1=1
        EndIf

      Case #PB_Event_Menu
        Select MenuID
          Case #MenuBar_Form1_Quitter
        EndSelect

      Case #PB_Event_Gadget
        Select GadgetID
          Case #Gadget_Form1_Button1
            
          Case #Gadget_Form1_Button2
          Case #Gadget_Form1_String1
          Case #Gadget_Form1_Button3
        EndSelect

    EndSelect
  Until quitForm1
  CloseWindow(#Window_Form1)
EndIf
End


Ceci dit ce n'est peut être pas possible à faire.
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: OpenStreetMap embarqué dans votre application

Message par MetalOS »

Moi je ne suis pas assez bon pour le faire mais si Progi1984 ou quelqu'un d'autre peut mettre à jour cette source pour les dernières version de PB sa serais super. Merci d'avance si quelqu'un fait ce travail.

PS: Sans vouloir abuser si sa pouvait être compatible Linux et Mac en même temps :wink:
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: OpenStreetMap embarqué dans votre application

Message par MetalOS »

Quelqu'un à réussi à utiliser OpenStreetMap et l'exemple de Progi ?
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: OpenStreetMap embarqué dans votre application

Message par djes »

Oui, ça fonctionne toujours, il faut juste modifier quelques bricoles, comme enlever tous les ".s" aux pointeurs des structures du fichier RW_LibCurl_Res.pb

Code : Tout sélectionner

;{ Enumerations
Enumeration 0
  #CURLE_OK
  #CURLE_UNSUPPORTED_PROTOCOL    ; 1 
  #CURLE_FAILED_INIT             ; 2 
  #CURLE_URL_MALFORMAT           ; 3 
  #CURLE_URL_MALFORMAT_USER      ; 4 (Not USED) 
  #CURLE_COULDNT_RESOLVE_PROXY   ; 5 
  #CURLE_COULDNT_RESOLVE_HOST    ; 6 
  #CURLE_COULDNT_CONNECT         ; 7 
  #CURLE_FTP_WEIRD_SERVER_REPLY  ; 8 
  #CURLE_FTP_ACCESS_DENIED       ; 9 a service was denied by the FTP server due To lack of access - when login fails this is Not returned. 
  #CURLE_FTP_USER_PASSWORD_INCORRECT ; 10 
  #CURLE_FTP_WEIRD_PASS_REPLY    ; 11 
  #CURLE_FTP_WEIRD_USER_REPLY    ; 12 
  #CURLE_FTP_WEIRD_PASV_REPLY    ; 13 
  #CURLE_FTP_WEIRD_227_FORMAT    ; 14 
  #CURLE_FTP_CANT_GET_HOST       ; 15 
  #CURLE_FTP_CANT_RECONNECT      ; 16 
  #CURLE_FTP_COULDNT_SET_BINARY  ; 17 
  #CURLE_PARTIAL_FILE            ; 18 
  #CURLE_FTP_COULDNT_RETR_FILE   ; 19 
  #CURLE_FTP_WRITE_ERROR         ; 20 
  #CURLE_FTP_QUOTE_ERROR         ; 21 
  #CURLE_HTTP_RETURNED_ERROR     ; 22 
  #CURLE_WRITE_ERROR             ; 23 
  #CURLE_MALFORMAT_USER          ; 24 - Not USED 
  #CURLE_FTP_COULDNT_STOR_FILE   ; 25 - failed FTP upload 
  #CURLE_READ_ERROR              ; 26 - could open/Read from file 
  #CURLE_OUT_OF_MEMORY           ; 27 
  #CURLE_OPERATION_TIMEOUTED     ; 28 - the timeout time was reached 
  #CURLE_FTP_COULDNT_SET_ASCII   ; 29 - TYPE A failed 
  #CURLE_FTP_PORT_FAILED         ; 30 - FTP PORT operation failed 
  #CURLE_FTP_COULDNT_USE_REST    ; 31 - the REST command failed 
  #CURLE_FTP_COULDNT_GET_SIZE    ; 32 - the SIZE command failed 
  #CURLE_HTTP_RANGE_ERROR        ; 33 - RANGE "command" didn't work 
  #CURLE_HTTP_POST_ERROR         ; 34 
  #CURLE_SSL_CONNECT_ERROR       ; 35 - wrong when connecting With SSL 
  #CURLE_BAD_DOWNLOAD_RESUME     ; 36 - couldn't resume download 
  #CURLE_FILE_COULDNT_READ_FILE  ; 37 
  #CURLE_LDAP_CANNOT_BIND        ; 38 
  #CURLE_LDAP_SEARCH_FAILED      ; 39 
  #CURLE_LIBRARY_NOT_FOUND       ; 40 
  #CURLE_FUNCTION_NOT_FOUND      ; 41 
  #CURLE_ABORTED_BY_CALLBACK     ; 42 
  #CURLE_BAD_FUNCTION_ARGUMENT   ; 43 
  #CURLE_BAD_CALLING_ORDER       ; 44 - Not USED 
  #CURLE_INTERFACE_FAILED        ; 45 - CURLOPT_INTERFACE failed 
  #CURLE_BAD_PASSWORD_ENTERED    ; 46 - Not USED 
  #CURLE_TOO_MANY_REDIRECTS      ; 47 - catch endless re-direct loops 
  #CURLE_UNKNOWN_TELNET_OPTION   ; 48 - User specified an unknown option 
  #CURLE_TELNET_OPTION_SYNTAX    ; 49 - Malformed telnet option 
  #CURLE_OBSOLETE                ; 50 - Not USED 
  #CURLE_PEER_FAILED_VERIFICATION; 51 - peer's certificate wasn't ok 
  #CURLE_GOT_NOTHING             ; 52 - when this is a specific error 
  #CURLE_SSL_ENGINE_NOTFOUND     ; 53 - SSL crypto engine Not found 
  #CURLE_SSL_ENGINE_SETFAILED    ; 54 - can Not set SSL crypto engine As Default 
  #CURLE_SEND_ERROR              ; 55 - failed sending network Data 
  #CURLE_RECV_ERROR              ; 56 - failure in receiving network Data 
  #CURLE_SHARE_IN_USE            ; 57 - share is in use 
  #CURLE_SSL_CERTPROBLEM         ; 58 - problem With the local certificate 
  #CURLE_SSL_CIPHER              ; 59 - couldn't use specified cipher 
  #CURLE_SSL_CACERT              ; 60 - problem With the CA cert (path?) 
  #CURLE_BAD_CONTENT_ENCODING    ; 61 - Unrecognized transfer encoding 
  #CURLE_LDAP_INVALID_URL        ; 62 - Invalid LDAP URL 
  #CURLE_FILESIZE_EXCEEDED       ; 63 - Maximum file size exceeded 
  #CURLE_FTP_SSL_FAILED          ; 64 - Requested FTP SSL level failed 
  #CURLE_SEND_FAIL_REWIND        ; 65 - Sending the Data requires a rewind that failed 
  #CURLE_SSL_ENGINE_INITFAILED   ; 66 - failed To initialise ENGINE 
  #CURLE_LOGIN_DENIED            ; 67 - user password Or similar was Not accepted And we failed To login 
  #CURLE_TFTP_NOTFOUND           ; 68 - file Not found on server 
  #CURLE_TFTP_PERM               ; 69 - permission problem on server 
  #CURLE_TFTP_DISKFULL           ; 70 - out of disk space on server 
  #CURLE_TFTP_ILLEGAL            ; 71 - Illegal TFTP operation 
  #CURLE_TFTP_UNKNOWNID          ; 72 - Unknown transfer ID 
  #CURLE_TFTP_EXISTS             ; 73 - File already exists 
  #CURLE_TFTP_NOSUCHUSER         ; 74 - No such user 
  #CURLE_CONV_FAILED             ; 75 - conversion failed
  #CURLE_CONV_REQD               ; 76 - caller must register conversion callbacks using curl_easy_setopt options CURLOPT_CONV_FROM_NETWORK_FUNCTION, CURLOPT_CONV_TO_NETWORK_FUNCTION, And CURLOPT_CONV_FROM_UTF8_FUNCTION
  #CURLE_SSL_CACERT_BADFILE      ; 77 - could Not load CACERT file, missing Or wrong format
  #CURLE_REMOTE_FILE_NOT_FOUND   ; 78 - remote file Not found
  #CURLE_SSH                     ; 79 - error from the SSH layer, somewhat generic so the error message will be of interest when this has happened 
  #CURLE_SSL_SHUTDOWN_FAILED     ; 80 - Failed To shut down the SSL connection
  #CURLE_AGAIN                   ; 81 - socket is Not ready For send/recv, wait till it's ready and try again (Added in 7.18.2)
  #CURLE_SSL_CRL_BADFILE         ; 82 - could Not load CRL file, missing Or wrong format (Added in 7.19.0)
  #CURLE_SSL_ISSUER_ERROR        ; 83 - Issuer check failed.  (Added in 7.19.0) 
  #CURL_LAST                     ;  never use!
EndEnumeration
Enumeration 0 ; curlsocktype
  #CURLSOCKTYPE_IPCXN  ; socket created For a specific IP connection 
  #CURLSOCKTYPE_LAST   ; never use
EndEnumeration
Enumeration   ; curlioerr
  #CURLIOE_OK             ; I/O operation successful 
  #CURLIOE_UNKNOWNCMD     ; command was unknown To callback 
  #CURLIOE_FAILRESTART    ; failed To restart the Read 
  #CURLIOE_LAST           ; never use 
EndEnumeration
Enumeration   ; curliocmd
  #CURLIOCMD_NOP          ; no operation 
  #CURLIOCMD_RESTARTREAD  ; restart the Read stream from start 
  #CURLIOCMD_LAST         ; never use 
EndEnumeration
Enumeration 0 ; curl_infotype
; the kind of Data that is passed To information_callback
  #CURLINFO_TEXT
  #CURLINFO_HEADER_IN    ; 1 
  #CURLINFO_HEADER_OUT   ; 2 
  #CURLINFO_DATA_IN      ; 3 
  #CURLINFO_DATA_OUT     ; 4 
  #CURLINFO_SSL_DATA_IN  ; 5 
  #CURLINFO_SSL_DATA_OUT ; 6 
  #CURLINFO_END
EndEnumeration
Enumeration   ; curl_proxytype
  #CURLPROXY_HTTP   = 0
  #CURLPROXY_SOCKS4 = 4
  #CURLPROXY_SOCKS5 = 5
EndEnumeration
Enumeration ; curl_usessl
  ; parameter For the CURLOPT_USE_SSL option 
  #CURLUSESSL_NONE      ;  do Not attempt To use SSL 
  #CURLUSESSL_TRY       ;  try using SSL proceed anyway otherwise 
  #CURLUSESSL_CONTROL   ;  SSL For the control connection Or fail 
  #CURLUSESSL_ALL       ;  SSL For all communication Or fail 
  #CURLUSESSL_LAST      ;  Not an option never use 
EndEnumeration;
Enumeration ; curl_ftpccc
  ; parameter For the CURLOPT_FTP_SSL_CCC option 
  #CURLFTPSSL_CCC_NONE      ;  do Not send CCC 
  #CURLFTPSSL_CCC_PASSIVE   ;  Let the server initiate the shutdown 
  #CURLFTPSSL_CCC_ACTIVE    ;  Initiate the shutdown 
  #CURLFTPSSL_CCC_LAST      ;  Not an option never use 
EndEnumeration
Enumeration ; curl_ftpauth
  ; parameter For the CURLOPT_FTPSSLAUTH option 
  #CURLFTPAUTH_DEFAULT  ;  let libcurl decide 
  #CURLFTPAUTH_SSL      ;  use "AUTH SSL" 
  #CURLFTPAUTH_TLS      ;  use "AUTH TLS" 
  #CURLFTPAUTH_LAST     ;  Not an option never use 
EndEnumeration
Enumeration ; curl_ftpmethod
  ; parameter For the CURLOPT_FTP_FILEMETHOD option 
  #CURLFTPMETHOD_DEFAULT   ;  let libcurl pick 
  #CURLFTPMETHOD_MULTICWD  ;  single CWD operation For each path part 
  #CURLFTPMETHOD_NOCWD     ;  no CWD at all 
  #CURLFTPMETHOD_SINGLECWD ;  one CWD To full dir then work on file 
  #CURLFTPMETHOD_LAST       ;  Not an option never use 
EndEnumeration
Enumeration ; curl_http
  ; These enums are For use With the CURLOPT_HTTP_VERSION option. 
  #CURL_HTTP_VERSION_NONE ; setting this means we don't care and that we'd
                          ; like the library To choose the best possible
                          ; For us! 
  #CURL_HTTP_VERSION_1_0  ; please use HTTP 1.0 in the request 
  #CURL_HTTP_VERSION_1_1  ; please use HTTP 1.1 in the request 
  #CURL_HTTP_VERSION_LAST ;  *ILLEGAL* http version 
EndEnumeration
Enumeration ; curl_NETRC_OPTION
  ; These enums are For use With the CURLOPT_NETRC option. 
  #CURL_NETRC_IGNORED     ; The .netrc will never be Read.
                          ;   This is the Default. 
  #CURL_NETRC_OPTIONAL    ; A user:password in the URL will be preferred
                          ;   To one in the .netrc. 
  #CURL_NETRC_REQUIRED    ; A user:password in the URL will be ignored.
                          ;   Unless one is set programmatically the .netrc
                          ;   will be queried. 
  #CURL_NETRC_LAST
EndEnumeration
Enumeration ; curl_sslversion
  #CURL_SSLVERSION_DEFAULT
  #CURL_SSLVERSION_TLSv1
  #CURL_SSLVERSION_SSLv2
  #CURL_SSLVERSION_SSLv3
  #CURL_SSLVERSION_LAST ;  never use keep last 
EndEnumeration
Enumeration ; curl_TimeCond
  #CURL_TIMECOND_NONE
  #CURL_TIMECOND_IFMODSINCE
  #CURL_TIMECOND_IFUNMODSINCE
  #CURL_TIMECOND_LASTMOD
  #CURL_TIMECOND_LAST
EndEnumeration ;
Enumeration ; curlformoption
  #CURLFORM_NOTHING        ; the first one is unused
  #CURLFORM_COPYNAME
  #CURLFORM_PTRNAME
  #CURLFORM_NAMELENGTH
  #CURLFORM_COPYCONTENTS
  #CURLFORM_PTRCONTENTS
  #CURLFORM_CONTENTSLENGTH
  #CURLFORM_FILECONTENT
  #CURLFORM_ARRAY
  #CURLFORM_OBSOLETE
  #CURLFORM_FILE
  #CURLFORM_BUFFER
  #CURLFORM_BUFFERPTR
  #CURLFORM_BUFFERLENGTH
  #CURLFORM_CONTENTTYPE
  #CURLFORM_CONTENTHEADER
  #CURLFORM_FILENAME
  #CURLFORM_End
  #CURLFORM_OBSOLETE2
  #CURLFORM_LASTENTRY ;  the last unusued 
EndEnumeration
  ; use this For multipart formpost building 
  ; Returns code For #CURL_formadd()
 ; Returns:
 ; #CURL_FORMADD_OK             on success
 ; #CURL_FORMADD_MEMORY         If the FormInfo allocation fails
 ; #CURL_FORMADD_OPTION_TWICE   If one option is given twice For one Form
 ; #CURL_FORMADD_NULL           If a null pointer was given For a char
 ; #CURL_FORMADD_MEMORY         If the allocation of a FormInfo struct failed
 ; #CURL_FORMADD_UNKNOWN_OPTION If an unknown option was used
 ; #CURL_FORMADD_INCOMPLETE     If the some FormInfo is Not complete (Or error)
 ; #CURL_FORMADD_MEMORY         If a HttpPost struct cannot be allocated
 ; #CURL_FORMADD_MEMORY         If some allocation For string copying failed.
 ; #CURL_FORMADD_ILLEGAL_ARRAY  If an illegal option is used in an array
Enumeration ; CURLFORMcode
  #CURL_FORMADD_OK ; first no error 
  #CURL_FORMADD_MEMORY
  #CURL_FORMADD_OPTION_TWICE
  #CURL_FORMADD_NULL
  #CURL_FORMADD_UNKNOWN_OPTION
  #CURL_FORMADD_INCOMPLETE
  #CURL_FORMADD_ILLEGAL_ARRAY
  #CURL_FORMADD_DISABLED ; libcurl was built With this disabled 
  #CURL_FORMADD_LAST ; last 
EndEnumeration
Enumeration ; CURL_closepolicy
  #CURLCLOSEPOLICY_NONE ; first never use this 
  #CURLCLOSEPOLICY_OLDEST
  #CURLCLOSEPOLICY_LEAST_RECENTLY_USED
  #CURLCLOSEPOLICY_LEAST_TRAFFIC
  #CURLCLOSEPOLICY_SLOWEST
  #CURLCLOSEPOLICY_CALLBACK
  #CURLCLOSEPOLICY_LAST ; last never use this 
EndEnumeration
; Different Data locks For a single share 
Enumeration 0 ; CURL_lock_data
  #CURL_LOCK_DATA_NONE
  ; #CURL_LOCK_DATA_SHARE is used internaly To say that
  ;   the locking is just made To change the internal state of the share
  ;   itself.
  #CURL_LOCK_DATA_SHARE
  #CURL_LOCK_DATA_COOKIE
  #CURL_LOCK_DATA_DNS
  #CURL_LOCK_DATA_SSL_SESSION
  #CURL_LOCK_DATA_CONNECT
  #CURL_LOCK_DATA_LAST
EndEnumeration ;
; Different lock access types 
Enumeration ; CURL_lock_access
  #CURL_LOCK_ACCESS_NONE  = 0   ; unspecified action 
  #CURL_LOCK_ACCESS_SHARED = 1  ; For Read perhaps 
  #CURL_LOCK_ACCESS_SINGLE = 2  ; For write perhaps 
  #CURL_LOCK_ACCESS_LAST        ; never use 
EndEnumeration ;
Enumeration ; CURLSHcode
  #CURLSHE_OK         ; all is fine 
  #CURLSHE_BAD_OPTION ; 1 
  #CURLSHE_IN_USE     ; 2 
  #CURLSHE_INVALID    ; 3 
  #CURLSHE_NOMEM      ; out of memory 
  #CURLSHE_LAST       ; never use 
EndEnumeration
Enumeration ; CURLSHoption
  #CURLSHOPT_NONE       ; don't use 
  #CURLSHOPT_SHARE      ; specify a Data type To share 
  #CURLSHOPT_UNSHARE    ; specify shich Data type To stop sharing 
  #CURLSHOPT_LOCKFUNC   ; pass in a '#CURL_lock_function' pointer 
  #CURLSHOPT_UNLOCKFUNC ; pass in a '#CURL_unlock_function' pointer 
  #CURLSHOPT_USERDATA   ; pass in a user Data pointer used in the lock/unlock
                        ;   callback functions 
  #CURLSHOPT_LAST       ; never use 
EndEnumeration
Enumeration ; CURLversion
  #CURLVERSION_FIRST
  #CURLVERSION_SECOND
  #CURLVERSION_THIRD
  #CURLVERSION_FOURTH
  #CURLVERSION_LAST     ; never actually use this 
EndEnumeration
;}

;{ Constantes 
  #CURL_IPRESOLVE_WHATEVER  = 0 ; Default resolves addresses To all IP versions that your system allows 
  #CURL_IPRESOLVE_V4        = 1 ; resolve To ipv4 addresses 
  #CURL_IPRESOLVE_V6        = 2 ; resolve To ipv6 addresses 
  
  #CURLOPT_HTTPREQUEST      = -1
  ; #CURLOPT_FTPASCII         = #CURLOPT_TRANSFERTEXT
  #CURLOPT_MUTE             = -2
  #CURLOPT_PASSWDFUNCTION   = -3
  #CURLOPT_PASSWDDATA       = -4
  #CURLOPT_CLOSEFUNCTION    = -5
  #CURLOPT_SOURCE_HOST      = -6
  #CURLOPT_SOURCE_PATH      = -7
  #CURLOPT_SOURCE_PORT      = -8
  #CURLOPT_PASV_HOST        = -9
  
  #CURLOPT_INFILESIZE           = 00014
  #CURLOPT_VERBOSE              = 00041
  #CURLOPT_HEADER               = 00042
  #CURLOPT_UPLOAD               = 00046
  #CURLOPT_FOLLOWLOCATION       = 00052
  #CURLOPT_SSL_VERIFYPEER       = 00064
  #CURLOPT_SSL_VERIFYHOST       = 00081
  #CURLOPT_IGNORE_CONTENT_LENGTH= 00136
  #CURLOPT_FILE                 = 10001
  #CURLOPT_URL                  = 10002
  #CURLOPT_USERPWD              = 10005
  #CURLOPT_INFILE               = 10009
  #CURLOPT_WRITEHEADER          = 10029
  #CURLOPT_POSTQUOTE            = 10039
  
  #CURLOPT_INFILESIZE_LARGE     = 30115
  
  #CURLOPTTYPE_OBJECTPOINT      = 10000
  #CURLOPT_POSTFIELDS           = #CURLOPTTYPE_OBJECTPOINT + 15
  
  #CURLOPTTYPE_FUNCTIONPOINT    = 20000
  #CURLOPT_WRITEFUNCTION        = #CURLOPTTYPE_FUNCTIONPOINT + 11
  #CURLOPT_HEADERFUNCTION       = #CURLOPTTYPE_FUNCTIONPOINT + 79
  
  ; Three convenient "aliases" that follow the name scheme better 
  #CURLOPT_WRITEDATA        = #CURLOPT_FILE
  #CURLOPT_READDATA         = #CURLOPT_INFILE
  #CURLOPT_HEADERDATA       = #CURLOPT_WRITEHEADER
  
  #CURL_GLOBAL_ALL          = $00000003
  #CURL_GLOBAL_DEFAULT      = $00000003
  
  #CURL_MAX_WRITE_SIZE      = 16384
  #CURL_READFUNC_ABORT      = $10000000
;{ #CURLINFO
  #CURLINFO_STRING   = $100000
  #CURLINFO_LONG     = $200000
  #CURLINFO_DOUBLE   = $300000
  #CURLINFO_SLIST    = $400000
  #CURLINFO_MASK     = $0fffff
  #CURLINFO_TYPEMASK = $f00000
  
  #CURLINFO_EFFECTIVE_URL             = #CURLINFO_STRING + 1
  #CURLINFO_RESPONSE_CODE             = #CURLINFO_LONG   + 2
  #CURLINFO_TOTAL_TIME                = #CURLINFO_DOUBLE + 3
  #CURLINFO_NAMELOOKUP_TIME           = #CURLINFO_DOUBLE + 4
  #CURLINFO_CONNECT_TIME              = #CURLINFO_DOUBLE + 5
  #CURLINFO_PRETRANSFER_TIME          = #CURLINFO_DOUBLE + 6
  #CURLINFO_SIZE_UPLOAD               = #CURLINFO_DOUBLE + 7
  #CURLINFO_SIZE_DOWNLOAD             = #CURLINFO_DOUBLE + 8
  #CURLINFO_SPEED_DOWNLOAD            = #CURLINFO_DOUBLE + 9
  #CURLINFO_SPEED_UPLOAD              = #CURLINFO_DOUBLE + 10
  #CURLINFO_HEADER_SIZE               = #CURLINFO_LONG   + 11
  #CURLINFO_REQUEST_SIZE              = #CURLINFO_LONG   + 12
  #CURLINFO_SSL_VERIFYRESULT          = #CURLINFO_LONG   + 13
  #CURLINFO_FILETIME                  = #CURLINFO_LONG   + 14
  #CURLINFO_CONTENT_LENGTH_DOWNLOAD   = #CURLINFO_DOUBLE + 15
  #CURLINFO_CONTENT_LENGTH_UPLOAD     = #CURLINFO_DOUBLE + 16
  #CURLINFO_STARTTRANSFER_TIME        = #CURLINFO_DOUBLE + 17
  #CURLINFO_CONTENT_TYPE              = #CURLINFO_STRING + 18
  #CURLINFO_REDIRECT_TIME             = #CURLINFO_DOUBLE + 19
  #CURLINFO_REDIRECT_COUNT            = #CURLINFO_LONG   + 20
  #CURLINFO_PRIVATE                   = #CURLINFO_STRING + 21
  #CURLINFO_HTTP_CONNECTCODE          = #CURLINFO_LONG   + 22
  #CURLINFO_HTTPAUTH_AVAIL            = #CURLINFO_LONG   + 23
  #CURLINFO_PROXYAUTH_AVAIL           = #CURLINFO_LONG   + 24
  #CURLINFO_OS_ERRNO                  = #CURLINFO_LONG   + 25
  #CURLINFO_NUM_CONNECTS              = #CURLINFO_LONG   + 26
  #CURLINFO_SSL_ENGINES               = #CURLINFO_SLIST  + 27
  #CURLINFO_COOKIELIST                = #CURLINFO_SLIST  + 28
  #CURLINFO_LASTSOCKET                = #CURLINFO_LONG   + 29
  #CURLINFO_FTP_ENTRY_PATH            = #CURLINFO_STRING + 30
  #CURLINFO_REDIRECT_URL              = #CURLINFO_STRING + 31
  #CURLINFO_PRIMARY_IP                = #CURLINFO_STRING + 32
  #CURLINFO_APPCONNECT_TIME           = #CURLINFO_DOUBLE + 33
  #CURLINFO_CERTINFO                  = #CURLINFO_SLIST  + 34
  #CURLINFO_LASTONE                   = 34
  #CURLINFO_HTTP_CODE                 = #CURLINFO_RESPONSE_CODE
;}
;{ #CURLOPT
  #CURLOPTTYPE_LONG          = 0
  #CURLOPTTYPE_OBJECTPOINT   = 10000
  #CURLOPTTYPE_FUNCTIONPOINT = 20000
  #CURLOPTTYPE_OFF_T         = 30000
  
  ;This Macro-mania below setups the CURLOPT_[what] enum + To be used With
  ;curl_easy_setopt(). The first argument in the CURLOPT_) Macro is the [what] word.
 
  ; This is the FILE;Or void;the regular output should be written To. 
  #CURLOPT_FILE = #CURLOPTTYPE_OBJECTPOINT + 1
  ; The full URL To get/put 
  #CURLOPT_URL= #CURLOPTTYPE_OBJECTPOINT + 2
  ; Port number To connect To + If other than Default. 
  #CURLOPT_PORT= #CURLOPTTYPE_LONG + 3
  ; Name of proxy To use. 
  #CURLOPT_PROXY= #CURLOPTTYPE_OBJECTPOINT + 4
  ; "name:password" To use when fetching. 
  #CURLOPT_USERPWD= #CURLOPTTYPE_OBJECTPOINT + 5
  ; "name:password" To use With proxy. 
  #CURLOPT_PROXYUSERPWD= #CURLOPTTYPE_OBJECTPOINT + 6
  ; Range To get + specified As an ASCII string. 
  #CURLOPT_RANGE= #CURLOPTTYPE_OBJECTPOINT + 7
  ; Specified file stream To upload from (use As input): 
  #CURLOPT_INFILE= #CURLOPTTYPE_OBJECTPOINT + 9
  ; Buffer To receive error messages in + must be at least CURL_ERROR_SIZE
  ;   bytes big. If this is Not used + error messages go To stderr instead: 
  #CURLOPT_ERRORBUFFER= #CURLOPTTYPE_OBJECTPOINT + 10
  ; Function that will be called To store the output (instead of fwrite). The
  ;   parameters will use fwrite() syntax + make sure To follow them. 
  #CURLOPT_WRITEFUNCTION= #CURLOPTTYPE_FUNCTIONPOINT + 11
  ; Function that will be called To Read the Input (instead of fread). The
  ;   parameters will use fread() syntax + make sure To follow them. 
  #CURLOPT_READFUNCTION= #CURLOPTTYPE_FUNCTIONPOINT + 12
  ; Time-out the Read operation after this amount of seconds 
  #CURLOPT_TIMEOUT= #CURLOPTTYPE_LONG + 13
  ; If the CURLOPT_INFILE is used + this can be used To inform libcurl about
  ;   how large the file being sent really is. That allows better error
  ;   checking And better verifies that the upload was succcessful. -1 means
  ;   unknown size.
  ;   For large file support + there is also a _LARGE version of the key
  ;   which takes an off_t type + allowing platforms With larger off_t
  ;   sizes To handle larger files.  See below For INFILESIZE_LARGE.
  #CURLOPT_INFILESIZE= #CURLOPTTYPE_LONG + 14
  ; POST input fields. 
  #CURLOPT_POSTFIELDS= #CURLOPTTYPE_OBJECTPOINT + 15
  ; Set the referer page (needed by some CGIs) 
  #CURLOPT_REFERER= #CURLOPTTYPE_OBJECTPOINT + 16
  ; Set the FTP PORT string (Interface name + named Or numerical IP address)
  ;   Use i.e '-' To use Default address. 
  #CURLOPT_FTPPORT= #CURLOPTTYPE_OBJECTPOINT + 17
  ; Set the User-Agent string (examined by some CGIs) 
  #CURLOPT_USERAGENT= #CURLOPTTYPE_OBJECTPOINT + 18
  ; If the download receives less than "low speed limit" bytes/second
  ;   during "low speed time" seconds + the operations is aborted.
  ;   You could i.e If you have a pretty high speed connection + abort If
  ;   it is less than 2000 bytes/sec during 20 seconds.
  ;   Set the "low speed limit" 
  #CURLOPT_LOW_SPEED_LIMIT= #CURLOPTTYPE_LONG + 19
  ; Set the "low speed time" 
  #CURLOPT_LOW_SPEED_TIME= #CURLOPTTYPE_LONG + 20
  ; Set the continuation offset.
  ;   Note there is also a _LARGE version of this key which uses
  ;   off_t types + allowing For large file offsets on platforms which
  ;   use larger-than-32-bit off_t's.  Look below for RESUME_FROM_LARGE.
  #CURLOPT_RESUME_FROM= #CURLOPTTYPE_LONG + 21
  ; Set cookie in request: 
  #CURLOPT_COOKIE= #CURLOPTTYPE_OBJECTPOINT + 22
  ; This points To a linked list of headers + struct curl_slist kind 
  #CURLOPT_HTTPHEADER= #CURLOPTTYPE_OBJECTPOINT + 23
  ; This points To a linked list of post entries + struct HttpPost 
  #CURLOPT_HTTPPOST= #CURLOPTTYPE_OBJECTPOINT + 24
  ; name of the file keeping your private SSL-certificate 
  #CURLOPT_SSLCERT= #CURLOPTTYPE_OBJECTPOINT + 25
  ; password For the SSL Or SSH private key 
  #CURLOPT_KEYPASSWD= #CURLOPTTYPE_OBJECTPOINT + 26
  ; send TYPE parameter? 
  #CURLOPT_CRLF= #CURLOPTTYPE_LONG + 27
  ; send linked-list of QUOTE commands 
  #CURLOPT_QUOTE= #CURLOPTTYPE_OBJECTPOINT + 28
  ; send FILE;Or void;To store headers To + If you use a callback it
  ;   is simply passed To the callback unmodified 
  #CURLOPT_WRITEHEADER= #CURLOPTTYPE_OBJECTPOINT + 29
  ; point To a file To Read the initial cookies from + also enables
  ;   "cookie awareness" 
  #CURLOPT_COOKIEFILE= #CURLOPTTYPE_OBJECTPOINT + 31
  ; What version To specifly try To use.
  ;   See CURL_SSLVERSION defines below. 
  #CURLOPT_SSLVERSION= #CURLOPTTYPE_LONG + 32
  ; What kind of HTTP time condition To use + see defines 
  #CURLOPT_TIMECONDITION= #CURLOPTTYPE_LONG + 33
  ; Time To use With the above condition. Specified in number of seconds
  ;   since 1 Jan 1970 
  #CURLOPT_TIMEVALUE= #CURLOPTTYPE_LONG + 34
  ; Custom request= #CURLOPTTYPE_For customizing the get command like
  ;   HTTP: DELETE + TRACE And others
  ;   FTP: To use a different list command
  #CURLOPT_CUSTOMREQUEST= #CURLOPTTYPE_OBJECTPOINT + 36
  ; HTTP request= #CURLOPTTYPE_For odd commands like DELETE + TRACE And others 
  #CURLOPT_STDERR= #CURLOPTTYPE_OBJECTPOINT + 37
  ; send linked-list of post-transfer QUOTE commands 
  #CURLOPT_POSTQUOTE= #CURLOPTTYPE_OBJECTPOINT + 39
  ; Pass a pointer To string of the output using full variable-replacement
  ;   As described elsewhere. 
  #CURLOPT_WRITEINFO= #CURLOPTTYPE_OBJECTPOINT + 40
  #CURLOPT_VERBOSE= #CURLOPTTYPE_LONG + 41      ; talk a lot 
  #CURLOPT_HEADER= #CURLOPTTYPE_LONG + 42       ; throw the header out too 
  #CURLOPT_NOPROGRESS= #CURLOPTTYPE_LONG + 43   ; shut off the progress meter 
  #CURLOPT_NOBODY= #CURLOPTTYPE_LONG + 44       ; use HEAD To get http document 
  #CURLOPT_FAILONERROR= #CURLOPTTYPE_LONG + 45  ; no output on http error codes >= 300 
  #CURLOPT_UPLOAD= #CURLOPTTYPE_LONG + 46       ; this is an upload 
  #CURLOPT_POST= #CURLOPTTYPE_LONG + 47         ; HTTP POST method 
  #CURLOPT_DIRLISTONLY= #CURLOPTTYPE_LONG + 48  ; Return bare names when listing directories 
  #CURLOPT_APPEND= #CURLOPTTYPE_LONG + 50       ; Append instead of overwrite on upload! 
  ; Specify whether To Read the user+password from the .netrc Or the URL.
  ;   This must be one of the CURL_NETRC_* enums below. 
  #CURLOPT_NETRC= #CURLOPTTYPE_LONG + 51
  #CURLOPT_FOLLOWLOCATION= #CURLOPTTYPE_LONG + 52  ; use Location: Luke! 
  #CURLOPT_TRANSFERTEXT= #CURLOPTTYPE_LONG + 53 ; transfer Data in text/ASCII format 
  #CURLOPT_PUT= #CURLOPTTYPE_LONG + 54          ; HTTP PUT 
  ; Function that will be called instead of the internal progress display
  ;   function. This function should be defined As the curl_progress_callback
  ;   Prototype defines. 
  #CURLOPT_PROGRESSFUNCTION= #CURLOPTTYPE_FUNCTIONPOINT + 56
  ; Data passed To the progress callback 
  #CURLOPT_PROGRESSDATA= #CURLOPTTYPE_OBJECTPOINT + 57
  ; We want the referer field set automatically when following locations 
  #CURLOPT_AUTOREFERER= #CURLOPTTYPE_LONG + 58
  ; Port of the proxy + can be set in the proxy string As well With:
  ;   "[host]:[port]" 
  #CURLOPT_PROXYPORT= #CURLOPTTYPE_LONG + 59
  ; size of the POST input Data + If strlen() is Not good To use 
  #CURLOPT_POSTFIELDSIZE= #CURLOPTTYPE_LONG + 60
  ; tunnel non-http operations through a HTTP proxy 
  #CURLOPT_HTTPPROXYTUNNEL= #CURLOPTTYPE_LONG + 61
  ; Set the Interface string To use As outgoing network Interface 
  #CURLOPT_INTERFACE= #CURLOPTTYPE_OBJECTPOINT + 62
  ; Set the krb4/5 security level + this also enables krb4/5 awareness.  This
  ;   is a string + 'clear' + 'safe' + 'confidential' Or 'private'.  If the string
  ;   is set but doesn't match one of these + 'private' will be used.  
  #CURLOPT_KRBLEVEL= #CURLOPTTYPE_OBJECTPOINT + 63
  ; Set If we should verify the peer in ssl handshake + set 1 To verify. 
  #CURLOPT_SSL_VERIFYPEER= #CURLOPTTYPE_LONG + 64
  ; The CApath Or CAfile used To validate the peer certificate
  ;   this option is used only If SSL_VERIFYPEER is true 
  #CURLOPT_CAINFO= #CURLOPTTYPE_OBJECTPOINT + 65
  ; Maximum number of http redirects To follow 
  #CURLOPT_MAXREDIRS= #CURLOPTTYPE_LONG + 68
  ; Pass a long set To 1 To get the date of the requested document (If
  ;   possible)! Pass a zero To shut it off. 
  #CURLOPT_FILETIME= #CURLOPTTYPE_LONG + 69
  ; This points To a linked list of telnet options 
  #CURLOPT_TELNETOPTIONS= #CURLOPTTYPE_OBJECTPOINT + 70
  ; Max amount of cached alive connections 
  #CURLOPT_MAXCONNECTS= #CURLOPTTYPE_LONG + 71
  ; What policy To use when closing connections when the cache is filled up 
  #CURLOPT_CLOSEPOLICY= #CURLOPTTYPE_LONG + 72
  ; Set To explicitly use a new connection For the upcoming transfer.
  ;   Do Not use this unless you're absolutely sure of this + as it makes the
  ;   operation slower And is less friendly For the network. 
  #CURLOPT_FRESH_CONNECT= #CURLOPTTYPE_LONG + 74
  ; Set To explicitly forbid the upcoming transfer's connection to be re-used
  ;   when done. Do Not use this unless you're absolutely sure of this + as it
  ;   makes the operation slower And is less friendly For the network. 
  #CURLOPT_FORBID_REUSE= #CURLOPTTYPE_LONG + 75
  ; Set To a file name that contains random Data For libcurl To use To
  ;   seed the random engine when doing SSL connects. 
  #CURLOPT_RANDOM_FILE= #CURLOPTTYPE_OBJECTPOINT + 76
  ; Set To the Entropy Gathering Daemon socket pathname 
  #CURLOPT_EGDSOCKET= #CURLOPTTYPE_OBJECTPOINT + 77
  ; Time-out connect operations after this amount of seconds + If connects
  ;   are OK within this time + then fine... This only aborts the connect
  ;   phase. [Only works on unix-style/SIGALRM operating systems] 
  #CURLOPT_CONNECTTIMEOUT= #CURLOPTTYPE_LONG + 78
  ; Function that will be called To store headers (instead of fwrite). The
  ;   parameters will use fwrite() syntax + make sure To follow them. 
  #CURLOPT_HEADERFUNCTION= #CURLOPTTYPE_FUNCTIONPOINT + 79
  ; Set this To force the HTTP request To get back To GET. Only really usable
  ;   If POST + PUT Or a custom request have been used first.
  #CURLOPT_HTTPGET= #CURLOPTTYPE_LONG + 80
  ; Set If we should verify the Common name from the peer certificate in ssl
  ;   handshake + set 1 To check existence + 2 To ensure that it matches the
  ;   provided hostname. 
  #CURLOPT_SSL_VERIFYHOST= #CURLOPTTYPE_LONG + 81
  ; Specify which file name To write all known cookies in after completed
  ;   operation. Set file name To "-" (dash) To make it go To stdout. 
  #CURLOPT_COOKIEJAR= #CURLOPTTYPE_OBJECTPOINT + 82
  ; Specify which SSL ciphers To use 
  #CURLOPT_SSL_CIPHER_LIST= #CURLOPTTYPE_OBJECTPOINT + 83
  ; Specify which HTTP version To use! This must be set To one of the
  ;   CURL_HTTP_VERSION* enums set below. 
  #CURLOPT_HTTP_VERSION= #CURLOPTTYPE_LONG + 84
  ; Specificly switch on Or off the FTP engine's use of the EPSV command. By
  ;   Default + that one will always be attempted before the more traditional
  ;   PASV command. 
  #CURLOPT_FTP_USE_EPSV= #CURLOPTTYPE_LONG + 85
  ; type of the file keeping your SSL-certificate ("DER" + "PEM" + "ENG") 
  #CURLOPT_SSLCERTTYPE= #CURLOPTTYPE_OBJECTPOINT + 86
  ; name of the file keeping your private SSL-key 
  #CURLOPT_SSLKEY= #CURLOPTTYPE_OBJECTPOINT + 87
  ; type of the file keeping your private SSL-key ("DER" + "PEM" + "ENG") 
  #CURLOPT_SSLKEYTYPE= #CURLOPTTYPE_OBJECTPOINT + 88
  ; crypto engine For the SSL-sub system 
  #CURLOPT_SSLENGINE= #CURLOPTTYPE_OBJECTPOINT + 89
  ; set the crypto engine For the SSL-sub system As Default
  ;   the param has no meaning...
  #CURLOPT_SSLENGINE_DEFAULT= #CURLOPTTYPE_LONG + 90
  ; Non-zero value means To use the Global dns cache 
  #CURLOPT_DNS_USE_GLOBAL_CACHE= #CURLOPTTYPE_LONG + 91 ; To become OBSOLETE soon 
  ; DNS cache timeout 
  #CURLOPT_DNS_CACHE_TIMEOUT= #CURLOPTTYPE_LONG + 92
  ; send linked-list of pre-transfer QUOTE commands (Wesley Laxton)
  #CURLOPT_PREQUOTE= #CURLOPTTYPE_OBJECTPOINT + 93
  ; set the Debug function 
  #CURLOPT_DEBUGFUNCTION= #CURLOPTTYPE_FUNCTIONPOINT + 94
  ; set the Data For the Debug function 
  #CURLOPT_DEBUGDATA= #CURLOPTTYPE_OBJECTPOINT + 95
  ; mark this As start of a cookie session 
  #CURLOPT_COOKIESESSION= #CURLOPTTYPE_LONG + 96
  ; The CApath directory used To validate the peer certificate
  ;   this option is used only If SSL_VERIFYPEER is true 
  #CURLOPT_CAPATH= #CURLOPTTYPE_OBJECTPOINT + 97
  ; Instruct libcurl To use a smaller receive buffer 
  #CURLOPT_BUFFERSIZE= #CURLOPTTYPE_LONG + 98
  ; Instruct libcurl To Not use any signal/alarm handlers + even when using
  ;   timeouts. This option is useful For multi-threaded applications.
  ;   See libcurl-the-guide For more background information. 
  #CURLOPT_NOSIGNAL= #CURLOPTTYPE_LONG + 99
  ; Provide a CURLShare For mutexing non-ts Data 
  #CURLOPT_SHARE= #CURLOPTTYPE_OBJECTPOINT + 100
  ; indicates type of proxy. accepted values are CURLPROXY_HTTP (Default
  ;   CURLPROXY_SOCKS4 And CURLPROXY_SOCKS5. 
  #CURLOPT_PROXYTYPE= #CURLOPTTYPE_LONG + 101
  ; Set the Accept-Encoding string. Use this To tell a server you would like
  ;   the response To be compressed. 
  #CURLOPT_ENCODING= #CURLOPTTYPE_OBJECTPOINT + 102
  ; Set pointer To private Data 
  #CURLOPT_PRIVATE= #CURLOPTTYPE_OBJECTPOINT + 103
  ; Set aliases For HTTP 200 in the HTTP Response header 
  #CURLOPT_HTTP200ALIASES= #CURLOPTTYPE_OBJECTPOINT + 104
  ; Continue To send authentication (user+password) when following locations,
  ;   even when hostname changed. This can potentionally send off the name
  ;   And password To whatever host the server decides. 
  #CURLOPT_UNRESTRICTED_AUTH= #CURLOPTTYPE_LONG + 105
  ; Specificly switch on Or off the FTP engine's use of the EPRT command ( it
  ;   also disables the LPRT attempt). By Default + those ones will always be
  ;   attempted before the good old traditional PORT command. 
  #CURLOPT_FTP_USE_EPRT= #CURLOPTTYPE_LONG + 106
  ; Set this To a bitmask value To enable the particular authentications
  ;   methods you like. Use this in combination With CURLOPT_USERPWD.
  ;   Note that setting multiple bits may cause extra network round-trips. 
  #CURLOPT_HTTPAUTH= #CURLOPTTYPE_LONG + 107
  ; Set the ssl context callback function + currently only For OpenSSL ssl_ctx
  ;   in second argument. The function must be matching the
  ;   curl_ssl_ctx_callback proto. 
  #CURLOPT_SSL_CTX_FUNCTION= #CURLOPTTYPE_FUNCTIONPOINT + 108
  ; Set the userdata For the ssl context callback function's third
  ;   argument 
  #CURLOPT_SSL_CTX_DATA= #CURLOPTTYPE_OBJECTPOINT + 109
  ; FTP Option that causes missing dirs To be created on the remote server 
  #CURLOPT_FTP_CREATE_MISSING_DIRS= #CURLOPTTYPE_LONG + 110
  ; Set this To a bitmask value To enable the particular authentications
  ;   methods you like. Use this in combination With CURLOPT_PROXYUSERPWD.
  ;   Note that setting multiple bits may cause extra network round-trips. 
  #CURLOPT_PROXYAUTH= #CURLOPTTYPE_LONG + 111
  ; FTP option that changes the timeout + in seconds + associated With
  ;   getting a response.  This is different from transfer timeout time And
  ;   essentially places a demand on the FTP server To acknowledge commands
  ;   in a timely manner. 
  #CURLOPT_FTP_RESPONSE_TIMEOUT= #CURLOPTTYPE_LONG + 112
  ; Set this option To one of the CURL_IPRESOLVE_* defines (see below) To
  ;   tell libcurl To resolve names To those IP versions only. This only has
  ;   affect on systems With support For more than one + i.e IPv4 _and_ IPv6. 
  #CURLOPT_IPRESOLVE= #CURLOPTTYPE_LONG + 113
  ; Set this option To limit the size of a file that will be downloaded from
  ;   an HTTP Or FTP server.
  ;   Note there is also _LARGE version which adds large file support For
  ;   platforms which have larger off_t sizes.  See MAXFILESIZE_LARGE below. 
  #CURLOPT_MAXFILESIZE= #CURLOPTTYPE_LONG + 114
  ; See the comment For INFILESIZE above + but in short + specifies
  ;   the size of the file being uploaded.  -1 means unknown.
  #CURLOPT_INFILESIZE_LARGE= #CURLOPTTYPE_OFF_T + 115
  ; Sets the continuation offset.  There is also a LONG version of this;
  ;   look above For RESUME_FROM.
  #CURLOPT_RESUME_FROM_LARGE= #CURLOPTTYPE_OFF_T + 116
  ; Sets the maximum size of Data that will be downloaded from
  ;   an HTTP Or FTP server.  See MAXFILESIZE above For the LONG version.
  #CURLOPT_MAXFILESIZE_LARGE= #CURLOPTTYPE_OFF_T + 117
  ; Set this option To the file name of your .netrc file you want libcurl
  ;   To parse (using the CURLOPT_NETRC option). If Not set= #CURLOPTTYPE_Libcurl will do
  ;   a poor attempt To find the user's home directory and check for a .netrc
  ;   file in there. 
  #CURLOPT_NETRC_FILE= #CURLOPTTYPE_OBJECTPOINT + 118
  ; Enable SSL/TLS For FTP + pick one of:
  ;   CURLFTPSSL_TRY     - try using SSL + proceed anyway otherwise
  ;   CURLFTPSSL_CONTROL - SSL For the control connection Or fail
  ;   CURLFTPSSL_ALL     - SSL For all communication Or fail
  #CURLOPT_USE_SSL= #CURLOPTTYPE_LONG + 119
  ; The _LARGE version of the standard POSTFIELDSIZE option 
  #CURLOPT_POSTFIELDSIZE_LARGE= #CURLOPTTYPE_OFF_T + 120
  ; Enable/disable the TCP Nagle algorithm 
  #CURLOPT_TCP_NODELAY= #CURLOPTTYPE_LONG + 121
  ; 122 OBSOLETE + used in 7.12.3. Gone in 7.13.0 
  ; 123 OBSOLETE. Gone in 7.16.0 
  ; 124 OBSOLETE + used in 7.12.3. Gone in 7.13.0 
  ; 125 OBSOLETE + used in 7.12.3. Gone in 7.13.0 
  ; 126 OBSOLETE + used in 7.12.3. Gone in 7.13.0 
  ; 127 OBSOLETE. Gone in 7.16.0 
  ; 128 OBSOLETE. Gone in 7.16.0 
  ; When FTP over SSL/TLS is selected (With CURLOPT_USE_SSL this option
  ;   can be used To change libcurl's default action which is to first try
  ;   "AUTH SSL" And then "AUTH TLS" in this order + And proceed when a OK
  ;   response has been received.
  ;   Available parameters are:
  ;   CURLFTPAUTH_DEFAULT - let libcurl decide
  ;   CURLFTPAUTH_SSL     - try "AUTH SSL" first + then TLS
  ;   CURLFTPAUTH_TLS     - try "AUTH TLS" first + then SSL
  #CURLOPT_FTPSSLAUTH= #CURLOPTTYPE_LONG + 129
  #CURLOPT_IOCTLFUNCTION= #CURLOPTTYPE_FUNCTIONPOINT + 130
  #CURLOPT_IOCTLDATA= #CURLOPTTYPE_OBJECTPOINT + 131
  ; 132 OBSOLETE. Gone in 7.16.0 
  ; 133 OBSOLETE. Gone in 7.16.0 
  ; zero terminated string For pass on To the FTP server when asked For
  ;   "account" info 
  #CURLOPT_FTP_ACCOUNT= #CURLOPTTYPE_OBJECTPOINT + 134
  ; feed cookies into cookie engine 
  #CURLOPT_COOKIELIST= #CURLOPTTYPE_OBJECTPOINT + 135
  ; ignore Content-Length 
  #CURLOPT_IGNORE_CONTENT_LENGTH= #CURLOPTTYPE_LONG + 136
  ; Set To non-zero To skip the IP address received in a 227 PASV FTP server
  ;   response. Typically used For FTP-SSL purposes but is Not restricted To
  ;   that. libcurl will then instead use the same IP address it used For the
  ;   control connection. 
  #CURLOPT_FTP_SKIP_PASV_IP= #CURLOPTTYPE_LONG + 137
  ; Select "file method" To use when doing FTP + see the curl_ftpmethod
  ;   above. 
  #CURLOPT_FTP_FILEMETHOD= #CURLOPTTYPE_LONG + 138
  ; Local port number To bind the socket To 
  #CURLOPT_LOCALPORT= #CURLOPTTYPE_LONG + 139
  ; Number of ports To try + including the first one set With LOCALPORT.
  ;   Thus + setting it To 1 will make no additional attempts but the first.
  #CURLOPT_LOCALPORTRANGE= #CURLOPTTYPE_LONG + 140
  ; no transfer + set up connection And let application use the socket by
  ;   extracting it With CURLINFO_LASTSOCKET 
  #CURLOPT_CONNECT_ONLY= #CURLOPTTYPE_LONG + 141
  ; Function that will be called To convert from the
  ;   network encoding (instead of using the iconv calls in libcurl) 
  #CURLOPT_CONV_FROM_NETWORK_FUNCTION= #CURLOPTTYPE_FUNCTIONPOINT + 142
  ; Function that will be called To convert To the
  ;   network encoding (instead of using the iconv calls in libcurl) 
  #CURLOPT_CONV_TO_NETWORK_FUNCTION= #CURLOPTTYPE_FUNCTIONPOINT + 143
  ; Function that will be called To convert from UTF8
  ;   (instead of using the iconv calls in libcurl)
  ;   Note that this is used only For SSL certificate processing 
  #CURLOPT_CONV_FROM_UTF8_FUNCTION= #CURLOPTTYPE_FUNCTIONPOINT + 144
  ; If the connection proceeds too quickly then need To slow it down 
  ;   limit-rate: maximum number of bytes per second To send Or receive 
  #CURLOPT_MAX_SEND_SPEED_LARGE= #CURLOPTTYPE_OFF_T + 145
  #CURLOPT_MAX_RECV_SPEED_LARGE= #CURLOPTTYPE_OFF_T + 146
  ; Pointer To command string To send If USER/PASS fails. 
  #CURLOPT_FTP_ALTERNATIVE_TO_USER= #CURLOPTTYPE_OBJECTPOINT + 147
  ; callback function For setting socket options 
  #CURLOPT_SOCKOPTFUNCTION= #CURLOPTTYPE_FUNCTIONPOINT + 148
  #CURLOPT_SOCKOPTDATA= #CURLOPTTYPE_OBJECTPOINT + 149
  ; set To 0 To disable session ID re-use For this transfer + Default is
  ;   enabled (== 1) 
  #CURLOPT_SSL_SESSIONID_CACHE= #CURLOPTTYPE_LONG + 150
  ; allowed SSH authentication methods 
  #CURLOPT_SSH_AUTH_TYPES= #CURLOPTTYPE_LONG + 151
  ; Used by scp/sftp To do public/private key authentication 
  #CURLOPT_SSH_PUBLIC_KEYFILE= #CURLOPTTYPE_OBJECTPOINT + 152
  #CURLOPT_SSH_PRIVATE_KEYFILE= #CURLOPTTYPE_OBJECTPOINT + 153
  ; Send CCC (Clear Command Channel) after authentication 
  #CURLOPT_FTP_SSL_CCC= #CURLOPTTYPE_LONG + 154
  ; Same As TIMEOUT And CONNECTTIMEOUT + but With ms resolution 
  #CURLOPT_TIMEOUT_MS= #CURLOPTTYPE_LONG + 155
  #CURLOPT_CONNECTTIMEOUT_MS= #CURLOPTTYPE_LONG + 156
  ; set To zero To disable the libcurl's decoding and thus pass the raw body
  ;   Data To the appliction even when it is encoded/compressed 
  #CURLOPT_HTTP_TRANSFER_DECODING= #CURLOPTTYPE_LONG + 157
  #CURLOPT_HTTP_CONTENT_DECODING= #CURLOPTTYPE_LONG + 158
  ; Permission used when creating new files And directories on the remote
  ;   server For protocols that support it + SFTP/SCP/FILE 
  #CURLOPT_NEW_FILE_PERMS= #CURLOPTTYPE_LONG + 159
  #CURLOPT_NEW_DIRECTORY_PERMS= #CURLOPTTYPE_LONG + 160
  ; CURLOPT_LASTENTRY ; the last unused 
  #CURLOPT_FTPLISTONLY =  #CURLOPT_DIRLISTONLY
;}
;{ #HTTPPOST
#HTTPPOST_FILENAME    = 1<<0 ; specified content is a file name 
#HTTPPOST_READFILE    = 1<<1 ; specified content is a file name 
#HTTPPOST_PTRNAME     = 1<<2 ; name is only stored pointer
                             ; do Not free in formfree 
#HTTPPOST_PTRCONTENTS = 1<<3 ; contents is only stored pointer
                             ; do Not free in formfree 
#HTTPPOST_BUFFER      = 1<<4 ; upload file from buffer 
#HTTPPOST_PTRBUFFER   = 1<<5 ; upload file from pointer contents 
#HTTPPOST_CALLBACK    = 1<<6 ; upload file contents by using the
                             ; regular Read callback To get the Data
                             ; And pass the given pointer As custom
                             ; pointer
;}

; #CURLE_OBSOLETE                     = #CURLE_OBSOLETE50	; noone should be using this! 
; #CURLE_BAD_PASSWORD_ENTERED         = #CURLE_OBSOLETE46
; #CURLE_BAD_CALLING_ORDER            = #CURLE_OBSOLETE44
; #CURLE_FTP_USER_PASSWORD_INCORRECT  = #CURLE_OBSOLETE10
; #CURLE_FTP_CANT_RECONNECT           = #CURLE_OBSOLETE16
; #CURLE_FTP_COULDNT_GET_SIZE         = #CURLE_OBSOLETE32
; #CURLE_FTP_COULDNT_SET_ASCII        = #CURLE_OBSOLETE29
; #CURLE_FTP_WEIRD_USER_REPLY         = #CURLE_OBSOLETE12
; #CURLE_FTP_WRITE_ERROR              = #CURLE_OBSOLETE20
; #CURLE_LIBRARY_NOT_FOUND            = #CURLE_OBSOLETE40
; #CURLE_MALFORMAT_USER               = #CURLE_OBSOLETE24
; #CURLE_SHARE_IN_USE                 = #CURLE_OBSOLETE57
; #CURLE_URL_MALFORMAT_USER           = #CURLE_OBSOLETE4

; #CURLE_FTP_ACCESS_DENIED            = #CURLE_REMOTE_ACCESS_DENIED
; #CURLE_FTP_COULDNT_SET_BINARY       = #CURLE_FTP_COULDNT_SET_TYPE
; #CURLE_FTP_QUOTE_ERROR              = #CURLE_QUOTE_ERROR
; #CURLE_TFTP_DISKFULL                = #CURLE_REMOTE_DISK_FULL
; #CURLE_TFTP_EXISTS                  = #CURLE_REMOTE_FILE_EXISTS
; #CURLE_HTTP_RANGE_ERROR             = #CURLE_RANGE_ERROR 
; #CURLE_FTP_SSL_FAILED               = #CURLE_USE_SSL_FAILED

; #CURLE_OPERATION_TIMEOUTED          = #CURLE_OPERATION_TIMEDOUT

#CURLE_HTTP_NOT_FOUND               = #CURLE_HTTP_RETURNED_ERROR
#CURLE_HTTP_PORT_FAILED             = #CURLE_INTERFACE_FAILED
; #CURLE_FTP_COULDNT_STOR_FILE        = #CURLE_UPLOAD_FAILED

#CURLE_FTP_PARTIAL_FILE             = #CURLE_PARTIAL_FILE
#CURLE_FTP_BAD_DOWNLOAD_RESUME      = #CURLE_BAD_DOWNLOAD_RESUME

#CURLE_ALREADY_COMPLETE = 99999

#CURLAUTH_NONE          = 0       ; nothing 
#CURLAUTH_BASIC         = 1<<0    ; Basic (Default) 
#CURLAUTH_DIGEST        = 1<<1    ; Digest 
#CURLAUTH_GSSNEGOTIATE  = 1<<2    ; GSS-Negotiate 
#CURLAUTH_NTLM          = 1<<3    ; NTLM 
#CURLAUTH_ANY           = ~0      ; all types set 
#CURLAUTH_ANYSAFE       = ~#CURLAUTH_BASIC

#CURLSSH_AUTH_ANY       = ~0      ; all types supported by the server 
#CURLSSH_AUTH_NONE      = 0       ; none allowed, silly but complete 
#CURLSSH_AUTH_PUBLICKEY = 1<<0    ; public/private key files 
#CURLSSH_AUTH_PASSWORD  = 1<<1    ; password 
#CURLSSH_AUTH_HOST      = 1<<2    ; host key files 
#CURLSSH_AUTH_KEYBOARD  = 1<<3    ; keyboard interactive 
#CURLSSH_AUTH_DEFAULT   = #CURLSSH_AUTH_ANY

#CURL_ERROR_SIZE        = 256


#CURLFTPSSL_NONE    = #CURLUSESSL_NONE
#CURLFTPSSL_TRY     = #CURLUSESSL_TRY
#CURLFTPSSL_CONTROL = #CURLUSESSL_CONTROL
#CURLFTPSSL_ALL     = #CURLUSESSL_ALL
#CURLFTPSSL_LAST    = #CURLUSESSL_LAST

#CURLOPT_SSLKEYPASSWD = #CURLOPT_KEYPASSWD 
#CURLOPT_FTPAPPEND    = #CURLOPT_APPEND
#CURLOPT_FTPLISTONLY  = #CURLOPT_DIRLISTONLY
#CURLOPT_FTP_SSL      = #CURLOPT_USE_SSL

#CURLOPT_SSLCERTPASSWD = #CURLOPT_KEYPASSWD
#CURLOPT_KRB4LEVEL     = #CURLOPT_KRBLEVEL
; Below here follows defines for the CURLOPT_IPRESOLVE option. If a host
; name resolves addresses using more than one IP protocol version, this
; option might be handy to force libcurl to use a specific IP version. 
#CURL_IPRESOLVE_WHATEVER = 0 ; Default, resolves addresses To all IP   versions that your system allows 
#CURL_IPRESOLVE_V4       = 1 ; resolve To ipv4 addresses 
#CURL_IPRESOLVE_V6       = 2 ; resolve To ipv6 addresses 

; three convenient "aliases" that follow the name scheme better 
#CURLOPT_WRITEDATA  = #CURLOPT_FILE
#CURLOPT_READDATA   = #CURLOPT_INFILE
#CURLOPT_HEADERDATA = #CURLOPT_WRITEHEADER
; CURLINFO_RESPONSE_CODE is the new name For the option previously known As
;   CURLINFO_HTTP_CODE 
#CURLINFO_HTTP_CODE = #CURLINFO_RESPONSE_CODE

#CURL_GLOBAL_SSL    = 1<<0
#CURL_GLOBAL_WIN32  = 1<<1
#CURL_GLOBAL_ALL    = #CURL_GLOBAL_SSL|#CURL_GLOBAL_WIN32
#CURL_GLOBAL_NOTHING= 0
#CURL_GLOBAL_DEFAULT= #CURL_GLOBAL_ALL
;The 'CURLVERSION_NOW' is the symbolic name meant To be used by
;  basicly all programs ever, that want To get version information. It is
;  meant To be a built-in version number For what kind of struct the caller
;  expects. If the struct ever changes, we rethe NOW To another enum
;  from above. 
#CURLVERSION_NOW    = #CURLVERSION_FOURTH

#CURL_VERSION_IPV6      = 1<<0   ;IPv6-enabled 
#CURL_VERSION_KERBEROS4 = 1<<1   ;kerberos auth is supported 
#CURL_VERSION_SSL       = 1<<2   ;SSL options are present 
#CURL_VERSION_LIBZ      = 1<<3   ;libz features are present 
#CURL_VERSION_NTLM      = 1<<4   ;NTLM auth is supported 
#CURL_VERSION_GSSNEGOTIATE = 1<<5;  Negotiate auth support 
#CURL_VERSION_DEBUG     = 1<<6   ;built With Debug capabilities 
#CURL_VERSION_ASYNCHDNS = 1<<7   ;asynchronous dns resolves 
#CURL_VERSION_SPNEGO    = 1<<8   ;SPNEGO auth 
#CURL_VERSION_LARGEFILE = 1<<9   ;supports files bigger than 2GB 
#CURL_VERSION_IDN       = 1<<10  ;International Domain Names support 
#CURL_VERSION_SSPI      = 1<<11  ;SSPI is supported 
#CURL_VERSION_CONV      = 1<<12  ;character conversions are supported 
;}

;{ Structures }
  Structure Curl_HTTPPost
    *Next_.Curl_HTTPPost ; Next entry in the list 
    *name             ; Ptr to allocated name 
    namelength.l        ; Length of name length 
    *contents         ; Ptr to allocated data contents 
    contentslength.l    ; Length of contents field 
    *buffer           ; Ptr to allocated buffer contents 
    bufferlength.l      ; Length of buffer field 
    *contenttype      ; Content-Type 
    *contentheader      ; List of extra headers for this form 
    *more.Curl_HTTPPost ; If one field name has more than one
                        ;   file, this link should link To following files 
    flags.l             ; constante #HTTPPOST 
    *showfilename       ; The file name to show. If not set, the
                        ;   actual file name will be used (If this
                        ;   is a file part) 
    *userp              ; custom pointer used for HTTPPOST_CALLBACK posts
  EndStructure
  ; Structure To be used As parameter For CURLFORM_ARRAY 
  Structure Curl_Forms
    option.l
    *value
  EndStructure
  ; linked-list Structure For the CURLOPT_QUOTE option (And other) 
  Structure Curl_Slist
    *Data
    *Next_.curl_slist
  EndStructure
  Structure curl_version_info_data
    age.l               ; age of the returned struct 
    *version          ; LIBCURL_VERSION 
    version_num.l       ; LIBCURL_VERSION_NUM 
    *host             ; OS/host/cpu/machine when configured 
    features.l          ; bitmask, see defines below 
    *ssl_version      ; human readable string 
    ssl_version_num.l   ; not used anymore, always 0 
    *libz_version     ; human readable string 
                        ; protocols is terminated by an entry With a NULL protoname 
    *protocols
    ; The fields below this were added in CURLVERSION_SECOND 
    *ares
    ares_num.l
    ; This field was added in CURLVERSION_THIRD 
    *libidn;
    ; These field were added in CURLVERSION_FOURTH 
    ; Same As '_libiconv_version' If built With HAVE_ICONV 
    iconv_ver_num.l
    *libssh_version   ; human readable string 
  EndStructure
;}

... suite dans le post suivant (plus assez de place)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: OpenStreetMap embarqué dans votre application

Message par djes »

(suite du post précédent)
... et supprimer la fonction SinH du programme principal OpenStreetMap.pb

Code : Tout sélectionner

;@author Progi1984
;@changelog 1.0 24/08/09 Initial release (cache, zoom, moving, layers)
;@changelog 1.1 31/08/09 ADDED : Mimize Window
;@+						 ADDED : Zoom with click on the ImageGadget
;@thanks akj (http://www.purebasic.fr/english/profile.php?mode=viewprofile&u=292) for ideas and bug reporting
;@thanks netmaestro (http://www.purebasic.fr/english/profile.php?mode=viewprofile&u=1912) for tests (Vista) and bug reporting
;@misc : Prerequisites : For Windows, http://www.microsoft.com/downloads/details.aspx?FamilyID=a5c84275-3b97-4ab7-a40d-3802b2af5fc2&displaylang=en

IncludePath ""
XIncludeFile "RW_LibCurl_Inc.pb"
UsePNGImageDecoder()
UseSQLiteDatabase()
EnableExplicit
Enumeration
  #Window_0
  #Image_0
  #Image_1
  #Image_2
  #Image_3
  #Button_0
  #Button_1
  #Button_2
  #Button_3
  #Button_4
  #Button_5
  #Combo_0
  #Text_0
  #Text_1
  #Text_2
  #Text_3
  #Text_4
  #String_0
  #String_1
EndEnumeration
#_DQ_ = Chr(34)
Global gfLatitude.f   = 46.97
Global gfLongitude.f  = 2.75
Global gfxTile.f
Global gfyTile.f
Global glZoom.l       = 6
Global glLayerCur.l   = 0
Global glSQLiteDB.l
Global gsSQLiteDBPath.s = ""
Global glGadget.l
Global glEvent.l
Global glQuit.l

Global gRWCurl_Proxy.l = #True
; #True if you use a proxy else #false
Global gRWCurl_ProxyIP.s = ""
Global gRWCurl_ProxyPort.s = ""
Global gRWCurl_ProxyAuthLogin.s = ""
Global gRWCurl_ProxyAuthPwd.s = ""

Structure S_OSM_Layers
  sName.s
  sURL.s
  lZoomMin.l
  lZoomMax.l
EndStructure
#OSM_Layers_Num = 5
Global Dim OSM_Layers_Dim.S_OSM_Layers(#OSM_Layers_Num)
OSM_Layers_Dim(0)\sName     = "OSM Mapnik"
OSM_Layers_Dim(0)\sURL      = "http://tile.openstreetmap.org/"
OSM_Layers_Dim(0)\lZoomMin  = 0
OSM_Layers_Dim(0)\lZoomMax  = 18
OSM_Layers_Dim(1)\sName     = "OSM Osmarender/Tiles@Home"
OSM_Layers_Dim(1)\sURL      = "http://tah.openstreetmap.org/Tiles/tile/"
OSM_Layers_Dim(1)\lZoomMin  = 0
OSM_Layers_Dim(1)\lZoomMax  = 17
OSM_Layers_Dim(2)\sName     = "OSM Cycle Map"
OSM_Layers_Dim(2)\sURL      = "http://andy.sandbox.cloudmade.acom/tiles/cycle/"
OSM_Layers_Dim(2)\lZoomMin  = 0
OSM_Layers_Dim(2)\lZoomMax  = 18
OSM_Layers_Dim(3)\sName     = "OSM Maplint"
OSM_Layers_Dim(3)\sURL      = "http://tah.openstreetmap.org/Tiles/maplint/"
OSM_Layers_Dim(3)\lZoomMin  = 12
OSM_Layers_Dim(3)\lZoomMax  = 16
OSM_Layers_Dim(4)\sName     = "NPE out-of-copyright map "
OSM_Layers_Dim(4)\sURL      = "http://richard.dev.openstreetmap.org/npe/"
OSM_Layers_Dim(4)\lZoomMin  = 13
OSM_Layers_Dim(4)\lZoomMax  = 15


Define.f pfValue

;@author Progi1984
Procedure WindowMain_Open()
  If OpenWindow(#Window_0, 260, 225, 700, 571, "OpenStreetMap",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
    LoadFont(0,"Wingdings",12)
    LoadFont(1,"Arial",12,#PB_Font_Bold)
  
    ImageGadget(#Image_0, 10, 10, 256, 256, 0)
    ImageGadget(#Image_1, 266, 10, 256, 256, 0)
    ImageGadget(#Image_2, 10, 266, 256, 256, 0)
    ImageGadget(#Image_3, 266, 266, 256, 256, 0)
    
    TextGadget(#Text_0, 530, 10, 60, 15, "Layers :")
    ComboBoxGadget(#Combo_0, 550, 30, 130, 20)
      AddGadgetItem(#Combo_0, 0, OSM_Layers_Dim(0)\sName)
      AddGadgetItem(#Combo_0, 1, OSM_Layers_Dim(1)\sName)
      AddGadgetItem(#Combo_0, 2, OSM_Layers_Dim(2)\sName)
      AddGadgetItem(#Combo_0, 3, OSM_Layers_Dim(3)\sName)
      AddGadgetItem(#Combo_0, 4, OSM_Layers_Dim(4)\sName)
      SetGadgetState(#Combo_0, 0)
    TextGadget(#Text_1, 530, 50, 60, 15, "Movements :")
    ButtonGadget(#Button_0, 550, 100, 30, 30, Chr($E7))  : SetGadgetFont(#Button_0, FontID(0)) 
    ButtonGadget(#Button_1, 610, 100, 30, 30, Chr($E8))  : SetGadgetFont(#Button_1, FontID(0)) 
    ButtonGadget(#Button_2, 580, 070, 30, 30, Chr($E9))  : SetGadgetFont(#Button_2, FontID(0)) 
    ButtonGadget(#Button_3, 580, 130, 30, 30, Chr($EA))  : SetGadgetFont(#Button_3, FontID(0)) 
    TextGadget(#Text_2, 530, 160, 60, 15, "Zoom :")
    ButtonGadget(#Button_4, 550, 180, 50, 30, "+")      : SetGadgetFont(#Button_4, FontID(1)) 
    ButtonGadget(#Button_5, 600, 180, 50, 30, "-")      : SetGadgetFont(#Button_5, FontID(1)) 
    TextGadget(#Text_3, 530, 230, 60, 15, "Latitude :")
    StringGadget(#String_0, 600, 230, 50, 20, "46.97",#PB_String_ReadOnly|#PB_String_BorderLess)
    TextGadget(#Text_4, 530, 250, 60, 15, "Longitude :")
    StringGadget(#String_1, 600, 250, 50, 20, "2.75",#PB_String_ReadOnly|#PB_String_BorderLess)
  EndIf
EndProcedure
;@desc Permits to translate XY Coordinates to Lon/Lat Coordinates
;@author Progi1984
Procedure OSM_LatLon2XY()
  Protected n.l = Pow(2, glZoom)
  gfxTile = Int(((gfLongitude + 180) / 360) * n)
  gfyTile = Int((1-(Log(Tan(gfLatitude * #PI / 180)+(1/Cos(gfLatitude*#PI/180)))/#PI))/2*n)
EndProcedure
;@desc Permits to translate Lon/Lat Coordinates to XY Coordinates
;@author Progi1984
Procedure OSM_XY2LatLon()
  Protected n.l = Pow(2, glZoom)
  Protected pfLatitudeRad.f
  gfLongitude   = gfxTile / n * 360.0 - 180.0
  pfLatitudeRad = ATan(SinH(#PI * (1 - 2 * gfyTile / n)))
  gfLatitude    = pfLatitudeRad * 180.0 / #PI
EndProcedure
;@desc Draws 4 subtiles for the XY Coordinates
;@author Progi1984
Macro OSM_GetSquareTile()
  Debug "======"
  OSM_GetImage(0, glZoom+1,2*gfxTile  ,2*gfyTile)
  OSM_GetImage(1, glZoom+1,2*gfxTile+1,2*gfyTile)
  OSM_GetImage(2, glZoom+1,2*gfxTile  ,2*gfyTile+1)
  OSM_GetImage(3, glZoom+1,2*gfxTile+1,2*gfyTile+1)
  Debug "======"
EndMacro
Macro OSM_TestXYCoordinates(_CoordTile_, _Inc_, _Test_)
  pfValue = _CoordTile_ _Inc_ 0.5
  If pfValue _Test_ 
    _CoordTile_ = Pow(2, glZoom) - 2
  Else
    _CoordTile_ = pfValue
  EndIf
EndMacro
Procedure OSM_GetImage(Image.l, Zoom.l, XTile.l, YTile.l)
  Protected psProxyURL.s    = gRWCurl_ProxyIP+":"+gRWCurl_ProxyPort
  Protected psProxyAuth.s   = gRWCurl_ProxyAuthLogin+":"+gRWCurl_ProxyAuthPwd
  Protected plMemory.l
  Protected psURL.s = OSM_Layers_Dim(glLayerCur)\sURL+Str(Zoom)+"/"+Str(XTile)+"/"+Str(YTile)+".png"
  Protected gPWRCurl = curl_easy_init()
  Protected plImageSize.l
  Protected plImageMem.l
  Protected psSQLRequest.s
  Protected pbImageOK.b
  Protected plRes.l
  ; Test if in cache else download it
  DatabaseQuery(glSQLiteDB, "SELECT * FROM cache WHERE cache_layer="+#_DQ_+Str(glLayerCur)+#_DQ_+" AND cache_zoom="+#_DQ_+Str(Zoom)+#_DQ_+" AND cache_x="+#_DQ_+Str(XTile)+#_DQ_+" AND cache_y="+#_DQ_+Str(YTile)+#_DQ_+"")
  If FirstDatabaseRow(glSQLiteDB)
    Debug "CACHE : "+Str(glLayerCur)+"\"+Str(Zoom)+"\"+Str(XTile)+"\"+Str(Ytile)
    plImageSize = GetDatabaseLong(glSQLiteDB,6)
    If plImageSize
      plImageMem = AllocateMemory(plImageSize)
      GetDatabaseBlob(glSQLiteDB, 5, plImageMem, plImageSize)
      FinishDatabaseQuery(glSQLiteDB)
      If IsImage(Image)
        FreeImage(Image)
      EndIf
      If CatchImage(Image, plImageMem)
        SetGadgetState(#Image_0+Image, ImageID(Image))
        FreeMemory(plImageMem)
      EndIf
      pbImageOK = #True
    EndIf
  Else
    Debug DatabaseError()
  EndIf
  If pbImageOK = #False
    Debug "DOWNLOAD : "+Str(glLayerCur)+"\"+Str(Zoom)+"\"+Str(XTile)+"\"+Str(Ytile)
    RW_LibCurl_InitData()
    If gRWCurl_Proxy = #True
      curl_easy_setopt(gPWRCurl, #CURLOPT_HTTPPROXYTUNNEL, #True)
      curl_easy_setopt(gPWRCurl, #CURLOPT_PROXY, @psProxyURL)
      If psProxyAuth <> ""
        curl_easy_setopt(gPWRCurl, #CURLOPT_PROXYUSERPWD, @psProxyAuth)
      EndIf
    EndIf
    curl_easy_setopt(gPWRCurl, #CURLOPT_URL, @psURL)
    curl_easy_setopt(gPWRCurl, #CURLOPT_WRITEFUNCTION, @RW_LibCurl_WriteDataFunction())
    curl_easy_perform(gPWRCurl)
    curl_easy_cleanup(gPWRCurl)
    plMemory = RW_LibCurl_GetData()
    If plMemory
      psSQLRequest = "INSERT INTO cache(cache_layer, cache_zoom, cache_x, cache_y, cache_image, cache_imagesize) VALUES ("
      psSQLRequest + Str(glLayerCur)+","
      psSQLRequest + Str(Zoom)+","
      psSQLRequest + Str(XTile)+","
      psSQLRequest + Str(YTile)+","
      psSQLRequest + "?,"
      psSQLRequest + Str(MemorySize(plMemory))+")"
      SetDatabaseBlob(glSQLiteDB, 0, plMemory, MemorySize(plMemory))
      plRes = DatabaseUpdate(glSQLiteDB, psSQLRequest)
      If plRes = 0
        Debug psSQLRequest
        Debug DatabaseError()
      EndIf
      If IsImage(Image)
        FreeImage(Image)
      EndIf
      If CatchImage(Image, plMemory, MemorySize(plMemory))
        SetGadgetState(#Image_0+Image, ImageID(Image))
        FreeMemory(plMemory)
      EndIf
    EndIf
  EndIf
EndProcedure
Procedure OSM_CacheInit()
  Protected psSQLRequest.s
  If gsSQLiteDBPath = ""
    gsSQLiteDBPath = GetCurrentDirectory()+"OSMCache.sqlite"
  EndIf
  If FileSize(gsSQLiteDBPath) <= 0
    If CreateFile(0, gsSQLiteDBPath)
      CloseFile(0)
    EndIf
    glSQLiteDB = OpenDatabase(#PB_Any, gsSQLiteDBPath, "", "")
    If glSQLiteDB
      psSQLRequest = "CREATE  TABLE "+#_DQ_+"main"+#_DQ_+"."+#_DQ_+"cache"+#_DQ_+" ("
      psSQLRequest + #_DQ_+"id_cache"+#_DQ_+" INTEGER PRIMARY KEY  AUTOINCREMENT  Not NULL , "
      psSQLRequest + #_DQ_+"cache_layer"+#_DQ_+" INTEGER Not NULL  Default 0, "
      psSQLRequest + #_DQ_+"cache_zoom"+#_DQ_+" INTEGER Not NULL , "
      psSQLRequest + #_DQ_+"cache_x"+#_DQ_+" INTEGER Not NULL , "
      psSQLRequest + #_DQ_+"cache_y"+#_DQ_+"  INTEGER Not NULL , "
      psSQLRequest + #_DQ_+"cache_image"+#_DQ_+" BLOB, "
      psSQLRequest + #_DQ_+"cache_imagesize"+#_DQ_+"  INTEGER Not NULL"
      psSQLRequest + ")"
      DatabaseUpdate(glSQLiteDB, psSQLRequest)
    EndIf
  Else
    glSQLiteDB = OpenDatabase(#PB_Any, gsSQLiteDBPath, "", "")
  EndIf  
EndProcedure

  WindowMain_Open()
  ; Init DB
  OSM_CacheInit()
  ; Init Map
  OSM_LatLon2XY()
  OSM_GetSquareTile()
  
  
  Repeat
    glEvent = WaitWindowEvent()
    Select glEvent
      Case #PB_Event_CloseWindow : glQuit = 1
      Case #PB_Event_Gadget ;{
        glGadget = EventGadget()
        Select glGadget
          Case #Button_0 ;{ To left
            OSM_TestXYCoordinates(gfxTile, -, < 0)
            OSM_GetSquareTile()
            OSM_XY2LatLon()
            SetGadgetText(#String_1, StrF(gfLongitude))
          ;}
          Case #Button_1 ;{ To Right
            OSM_TestXYCoordinates(gfxTile, +,> Pow(2, glZoom) - 1)
            OSM_GetSquareTile()
            OSM_XY2LatLon()
            SetGadgetText(#String_1, StrF(gfLongitude))
          ;}
          Case #Button_2 ;{ To Top
            OSM_TestXYCoordinates(gfyTile, -, < 0)
            OSM_GetSquareTile()
            OSM_XY2LatLon()
            SetGadgetText(#String_0, StrF(gfLatitude))
          ;}
          Case #Button_3 ;{ To Bottom
            OSM_TestXYCoordinates(gfyTile, +, > Pow(2, glZoom) - 1)
            OSM_GetSquareTile()
            OSM_XY2LatLon()
            SetGadgetText(#String_0, StrF(gfLatitude))
          ;}
          Case #Button_4 ;{ Zoom +
            If glZoom < OSM_Layers_Dim(glLayerCur)\lZoomMax
              glZoom + 1
              OSM_LatLon2XY()
              OSM_GetSquareTile()
            EndIf
          ;}
          Case #Button_5 ;{ Zoom -
            If glZoom > OSM_Layers_Dim(glLayerCur)\lZoomMin
              glZoom - 1
              OSM_LatLon2XY()
              OSM_GetSquareTile()
            EndIf
          ;}
          Case #Combo_0  ;{ Layers
            pfValue = GetGadgetState(#Combo_0)
            If pfValue >= 0 And pfValue < #OSM_Layers_Num And pfValue <> glLayerCur
              ; Current Layer
              glLayerCur = pfValue
              ; Zoom
              If glZoom < OSM_Layers_Dim(glLayerCur)\lZoomMin
                glZoom = OSM_Layers_Dim(glLayerCur)\lZoomMin +1
              EndIf
              If glZoom > OSM_Layers_Dim(glLayerCur)\lZoomMax
                glZoom = OSM_Layers_Dim(glLayerCur)\lZoomMax
              EndIf
              OSM_LatLon2XY()
              OSM_GetSquareTile()
            EndIf
          ;}
          Case #Image_0 ;{
            gfxTile = 2*gfxTile  
            gfyTile = 2*gfyTile
            glZoom + 1
            OSM_XY2LatLon()
            OSM_GetSquareTile()
          ;}
          Case #Image_1 ;{
            gfxTile = 2*gfxTile  +1
            gfyTile = 2*gfyTile
            glZoom + 1
            OSM_XY2LatLon()
            OSM_GetSquareTile()
          ;}
          Case #Image_2 ;{
            gfxTile = 2*gfxTile  
            gfyTile = 2*gfyTile+1
            glZoom + 1
            OSM_XY2LatLon()
            OSM_GetSquareTile()
          ;}
          Case #Image_3 ;{
            gfxTile = 2*gfxTile  +1
            gfyTile = 2*gfyTile+1
            glZoom + 1
            OSM_XY2LatLon()
            OSM_GetSquareTile()
          ;}
        EndSelect
      ;}
    EndSelect
  Until glQuit = 1
Enfin, si tu passes derrière un proxy, renseigner les infos dans le fichier principal à la ligne 49.
Répondre