Page 4 sur 6

Re: OpenStreetMap embarqué dans votre application

Publié : lun. 19/mai/2014 10:48
par djes
Tiens, modifie le OpenStreetMap avec le code ci-après, tu sauras (en regardant dans le débogueur) pourquoi tu ne vois rien :

Code : Tout sélectionner

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
  Protected error.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())
    error = curl_easy_perform(gPWRCurl)
    curl_easy_cleanup(gPWRCurl)
   	plMemory = 0  
    If error <> 0
    	Debug PeekS(curl_easy_strerror(error))
    Else
    	plMemory = RW_LibCurl_GetData()
    EndIf
    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

Re: OpenStreetMap embarqué dans votre application

Publié : mar. 10/juin/2014 19:56
par MetalOS
Je vient de refaire un essais sous Mac et voici ce que j'obtient maintenant comme erreur:

Code : Tout sélectionner

Undefined symbols for architecture x86_64:
  "curl_easy_cleanup", referenced from:
      _EndIf22 in purebasic.o
      PStubcurl_easy_cleanup in purebasic.o
  "curl_easy_init", referenced from:
      _Procedure124.ClearLoop in purebasic.o
      PStubcurl_easy_init in purebasic.o
  "curl_easy_perform", referenced from:
      _EndIf22 in purebasic.o
      PStubcurl_easy_perform in purebasic.o
  "curl_easy_setopt", referenced from:
      _EndIf10 in purebasic.o
      _EndIf22 in purebasic.o
      PStubcurl_easy_setopt in purebasic.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
J'utilise PB 64bits mais j'ai aussi essayé avec PB 32bits et j'ai la même erreur.

Re: OpenStreetMap embarqué dans votre application

Publié : mar. 10/juin/2014 20:22
par MetalOS
J'ai réussis à avancer un peut et à supprimer les erreur en modifiant le fichier RW_LibCurl.Inc.pb.

J'ai déjà modifié le CompilerCase pour le mettre à MacOS et devant chaque "SymbolName' j'ai rajouté un "_".

Voici le code modifié:

Code : Tout sélectionner

XIncludeFile "RW_LibCurl_Res.pb"

Macro DQuote
  "
EndMacro
CompilerSelect #PB_Compiler_OS
  CompilerCase #PB_OS_MacOS
    Macro SymbolName(Val)
      DQuote#Val#DQuote
    EndMacro
    #LibCurl_ImportLib = "/usr/lib/libcurl.3.dylib"
    #LibCurl_SeparatorDir = "/"
  CompilerCase #PB_OS_Windows
    Macro SymbolName(Val)
      DQuote _#Val#DQuote
    EndMacro
    #LibCurl_ImportLib = "LibCurl.lib"
    #LibCurl_SeparatorDir = "\"
CompilerEndSelect

;- Imports
ImportC #LibCurl_ImportLib
  curl_easy_cleanup(handle.l) As SymbolName(_curl_easy_cleanup)
  curl_easy_duphandle(handle.l) As SymbolName(_curl_easy_duphandle)
  curl_easy_getinfo(curl.l, info_type.l, info.l) As SymbolName(_curl_easy_getinfo)
  curl_easy_init() As SymbolName(_curl_easy_init)
  curl_easy_perform(handle.l) As SymbolName(_curl_easy_perform)
  curl_easy_recv(*curl, *buffer, buflen.l,*n) As SymbolName(_curl_easy_recv)
  curl_easy_reset(handle.l) As SymbolName(_curl_easy_reset)
  curl_easy_send(*curl, *buffer, buflen.l, *n) As SymbolName(_curl_easy_send)
  curl_easy_setopt(handle.l, option.l, parameter.l) As SymbolName(_curl_easy_setopt)
  curl_easy_strerror(errornum.l) As SymbolName(_curl_easy_strerror)
  curl_escape(url.l, length.l) As SymbolName(_curl_escape)
  curl_formadd(firstitem.l, lastitem.l) As SymbolName(_curl_formadd)
  curl_formfree(form.l) As SymbolName(_curl_formfree)
  curl_formget(*form.curl_httppost, *arg, append) As SymbolName(_curl_formget)
  curl_free(ptr.l) As SymbolName(_curl_free)
  curl_getdate(datestring.l, now.l) As SymbolName(_curl_getdate)
  curl_getenv(name.l) As SymbolName(_curl_getenv)
  curl_global_cleanup() As SymbolName(_curl_global_cleanup)
  curl_global_init(flags.l) As SymbolName(_curl_global_init)
  curl_global_init_mem(flags.l, m.l, f.l, r.l, s.l, c.l) As SymbolName(_curl_global_init_mem)
  curl_mprintf(format.l) As SymbolName(_curl_mprintf)
  curl_mfprintf(fd.l, format.l) As SymbolName(_curl_mfprintf)
  curl_msprintf(buffer.l, format.l) As SymbolName(_curl_msprintf)
  curl_msnprintf(buffer.l, maxlength.l, format.l) As SymbolName(_curl_msnprintf)
  curl_mvprintf(format.l, args.l) As SymbolName(_curl_mvprintf)
  curl_mvfprintf(fd.l, format.l, args.l) As SymbolName(_curl_mvfprintf)
  curl_mvsprintf(buffer.l, format.l, args.l) As SymbolName(_curl_mvsprintf)
  curl_mvsnprintf(buffer.l, maxlength.l, format.l, args.l) As SymbolName(_curl_mvsnprintf)
  curl_maprintf(format.l) As SymbolName(_curl_maprintf)
  curl_mvaprintf(format.l, args.l) As SymbolName(_curl_mvaprintf)
  curl_multi_add_handle(multi_handle.l, easy_handle.l) As SymbolName(_curl_multi_add_handle)
  curl_multi_assign(*multi_handle, sockfd.l, *sockp) As SymbolName(_curl_multi_assign)
  curl_multi_cleanup(multi_handle.l) As SymbolName(_curl_multi_cleanup)
  curl_multi_fdset(multi_handle.l, read_fd_set.l, write_fd_set.l, exc_fd_set.l, max_fd.l) As SymbolName(_curl_multi_fdset)
  curl_multi_info_read(multi_handle.l, msgs_in_queue.l) As SymbolName(_curl_multi_info_read)
  curl_multi_init() As SymbolName(_curl_multi_init)
  curl_multi_perform(multi_handle.l, running_handles.l) As SymbolName(_curl_multi_perform)
  curl_multi_remove_handle(multi_handle.l, easy_handle.l) As SymbolName(_curl_multi_remove_handle)
  curl_multi_strerror(errornum.l) As SymbolName(_curl_multi_strerror)
  curl_multi_socket(*multi_handle, s.l, *running_handles) As SymbolName(_curl_multi_socket)
  curl_multi_socket_action(*multi_handle, s.l, ev_bitmask.l, *running_handles) As SymbolName(_curl_multi_socket_action)
  curl_multi_socket_all(*multi_handle, *running_handles) As SymbolName(_curl_multi_socket_all)
  curl_share_cleanup(share_handle.l) As SymbolName(_curl_share_cleanup)
  curl_share_init() As SymbolName(_curl_share_init)
  curl_share_setopt(share.l, option.l, parameter.l) As SymbolName(_curl_share_setopt)
  curl_share_strerror(errornum.l) As SymbolName(_curl_share_strerror)
  curl_slist_append(slist.l, string.p-utf8) As SymbolName(_curl_slist_append)
  curl_slist_free_all(slist.l) As SymbolName(_curl_slist_free_all)
  curl_strequal(str1.l, str2.l) As SymbolName(_curl_strequal)
  curl_strnequal(str1.l, str2.l, len.l) As SymbolName(_curl_strnequal)
  curl_unescape(url.l, length.l) As SymbolName(_curl_unescape)
  curl_version() As SymbolName(_curl_version)
  curl_version_info(type.l) As SymbolName(_curl_version_info)
EndImport;}


Procedure RW_LibCurl_InitString()
  Shared ReceivedData.s
  If ReceivedData > ""
    ReceivedData = ""
  EndIf
EndProcedure
Procedure RW_LibCurl_InitData()
  Shared *LibCurl_SharedMem
  If *LibCurl_SharedMem
    FreeMemory(*LibCurl_SharedMem)
    *LibCurl_SharedMem = 0
  EndIf
EndProcedure
ProcedureC  RW_LibCurl_WriteStrFunction(*ptr, Size, NMemB, *Stream)
  ;retreives utf-8/ascii encoded data
  Protected SizeProper.l  = Size & 255
  Protected NMemBProper.l = NMemB
  Protected MyDataS.s
  Shared ReceivedData.s
  
  MyDataS = PeekS(*ptr, SizeProper * NMemBProper)
  ReceivedData + MyDataS
  ;Debug "> " + MyDataS
  ;Debug "# " + Str(Len(MyDataS))
  ;Debug "@ " + Str(Len(ReceivedData))
  ProcedureReturn SizeProper * NMemBProper
EndProcedure
Procedure.s RW_LibCurl_GetString()
  Shared ReceivedData.s
  ProcedureReturn ReceivedData
EndProcedure
ProcedureC  RW_LibCurl_WriteDataFunction(*ptr, Size, NMemB, *Stream)
  Protected plSize.l  = Size & 255
  Protected plNmemB.l = NMemB
  Protected plMemorySize.l = plSize * plNmemB
  Protected plLibCurl_SharedMemSize.l
  
  Protected *LibCurl_TempMemory
  Protected *LibCurl_TempSharedMem
  
  Shared *LibCurl_SharedMem

  ; allocates memory for receiving data
  *LibCurl_TempMemory = AllocateMemory(plMemorySize)
  CopyMemory(*ptr, *LibCurl_TempMemory, plMemorySize)
  
  ; if memory doesn't exists
  If *LibCurl_SharedMem = 0
    *LibCurl_SharedMem = AllocateMemory(plMemorySize)
    CopyMemory(*LibCurl_TempMemory, *LibCurl_SharedMem, plMemorySize)
  Else
    ; we allocate a temporary memory zone for storing previous *LibCurl_SharedMem
    plLibCurl_SharedMemSize  = MemorySize(*LibCurl_SharedMem)
    *LibCurl_TempSharedMem = AllocateMemory(plLibCurl_SharedMemSize)
    CopyMemory(*LibCurl_SharedMem, *LibCurl_TempSharedMem, plLibCurl_SharedMemSize)
    ; we free *LibCurl_SharedMem
    FreeMemory(*LibCurl_SharedMem)
    ; we allocate *LibCurl_SharedMem wtih size of previous *LibCurl_SharedMem + new data
    *LibCurl_SharedMem = AllocateMemory(plLibCurl_SharedMemSize + plMemorySize)
    CopyMemory(*LibCurl_TempSharedMem,  *LibCurl_SharedMem,                         plLibCurl_SharedMemSize)
    CopyMemory(*LibCurl_TempMemory,     *LibCurl_SharedMem+plLibCurl_SharedMemSize, plMemorySize)
    ; we free memory
    FreeMemory(*LibCurl_TempMemory)
    FreeMemory(*LibCurl_TempSharedMem)
  EndIf
  ProcedureReturn plMemorySize
EndProcedure
Procedure RW_LibCurl_GetData()
  Shared *LibCurl_SharedMem
  Protected *LibCurl_NewMemory
  *LibCurl_NewMemory = AllocateMemory(MemorySize(*LibCurl_SharedMem))
  CopyMemory(*LibCurl_SharedMem, *LibCurl_NewMemory, MemorySize(*LibCurl_SharedMem))
  ProcedureReturn *LibCurl_NewMemory
EndProcedure
Maintenant à la compilation j'ai une erreur sur le chargement de la base de données sql lignes 249 sur cette commande:

Code : Tout sélectionner

DatabaseUpdate(glSQLiteDB, psSQLRequest)
Message du compilateur: Le #Database spécifié n'est pas initialisé.

Re: OpenStreetMap embarqué dans votre application

Publié : jeu. 12/juin/2014 10:29
par MetalOS
Pas d'idée ?

Re: OpenStreetMap embarqué dans votre application

Publié : jeu. 12/juin/2014 15:20
par djes
Regarde dans la procédure OSM_CacheInit() et vérifie tout (surtout l'ouverture de la base de données) à grands coups de Debug.

Re: OpenStreetMap embarqué dans votre application

Publié : jeu. 12/juin/2014 19:11
par MetalOS
Voici la Procedure OSM_CacheInit()

Code : Tout sélectionner

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, "", "", #PB_Database_SQLite)
    Debug glSQLiteDB
    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

Franchement je ne voie pas. Quand je fait un Debug sur gsSQLiteDBPath j'ai bien le chemin ou à été créée la base de données.

Quand je fait un Debug sur glSQLiteDB qui lui est égale à

Code : Tout sélectionner

OpenDatabase(#PB_Any, gsSQLiteDBPath, "", "", #PB_Database_SQLite)
Voici le retour de debug:

Code : Tout sélectionner

5550472
Mais arrivée ici:

Code : Tout sélectionner

DatabaseUpdate(glSQLiteDB, psSQLRequest)
Le programme plante et me dit que la base de données n'est pas initialisé.

Re: OpenStreetMap embarqué dans votre application

Publié : jeu. 12/juin/2014 21:25
par djes
Tu mets un calldebugger() juste avant cette fonction, et en passant la souris sur les variables, tu auras leurs valeurs, il y a fort à parier que l'une d'entre elles soit nulle. Alors tu avances l'exécution pas à pas pour voir...

Re: OpenStreetMap embarqué dans votre application

Publié : jeu. 12/juin/2014 22:03
par MetalOS
Non justement aucune n'est nulle.

Re: OpenStreetMap embarqué dans votre application

Publié : ven. 13/juin/2014 8:53
par djes
Hum, il y a un loup là ! Dans la doc sur cette fonction, l'exemple lui-même ne comporte pas de numéro de base de données
DatabaseUpdate("UPDATE employee SET checked=1 WHERE id="+GetDatabaseString(#BaseDeDonnees, 0))
Je me demande si l'implémentation sur MacOS est correcte... Peux-tu essayer l'exemple de la doc :

Code : Tout sélectionner

;
; ------------------------------------------------------------
;
;   PureBasic - Database example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

UseSQLiteDatabase()

Procedure CheckDatabaseUpdate(Database, Query$)
   Result = DatabaseUpdate(Database, Query$)
   If Result = 0
      Debug DatabaseError()
   EndIf
   
   ProcedureReturn Result
EndProcedure

DatabaseFile$ = GetTemporaryDirectory()+"Database.sqlite"

If CreateFile(0, DatabaseFile$)
   CloseFile(0)
   
   If OpenDatabase(0, DatabaseFile$, "", "")
   
      CheckDatabaseUpdate(0, "CREATE TABLE food (name CHAR(50), weight INT)")

      CheckDatabaseUpdate(0, "INSERT INTO food (name, weight) VALUES ('apple', '10')")
      CheckDatabaseUpdate(0, "INSERT INTO food (name, weight) VALUES ('pear', '5')")
      CheckDatabaseUpdate(0, "INSERT INTO food (name, weight) VALUES ('banana', '20')")
      
      If DatabaseQuery(0, "SELECT * FROM food WHERE weight > 7")
      
         While NextDatabaseRow(0)
            Debug GetDatabaseString(0, 0)
         Wend
      
         FinishDatabaseQuery(0)
      EndIf
      
      CloseDatabase(0)
   Else
      Debug "Can't open database !"
   EndIf
Else
   Debug "Can't create the database file !"
EndIf


Re: OpenStreetMap embarqué dans votre application

Publié : ven. 13/juin/2014 10:13
par MetalOS
L'exemple de la doc fonctionne très bien. C'est un truc de fou...

Re: OpenStreetMap embarqué dans votre application

Publié : ven. 13/juin/2014 10:20
par djes
Et si dans l'exemple tu mets 6000000 comme numéro de db à la place de 0 ?

Re: OpenStreetMap embarqué dans votre application

Publié : ven. 13/juin/2014 10:48
par MetalOS
Le compilateur s'arrête à "CreateFile() et me dit:

Code : Tout sélectionner

ERREUR: Le numéro d'objet #File est très élevé (au dessus de 1000), Etes-vous sûr ?

Re: OpenStreetMap embarqué dans votre application

Publié : ven. 13/juin/2014 11:41
par djes
Ca ce n'est pas grave, c'est juste un avertissement, tu peux continuer l'execution en appuyant sur F7. En plus, tu peux laisser 0 pour le file, c'est pour les commandes basées sur une base de données *database qu'il faut essayer avec une autre valeur.

Code : Tout sélectionner

;
; ------------------------------------------------------------
;
;   PureBasic - Database example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

UseSQLiteDatabase()

Procedure CheckDatabaseUpdate(Database, Query$)
   Result = DatabaseUpdate(Database, Query$)
   If Result = 0
      Debug DatabaseError()
   EndIf
   
   ProcedureReturn Result
EndProcedure

DatabaseFile$ = GetTemporaryDirectory()+"Database.sqlite"

If CreateFile(0, DatabaseFile$)
   CloseFile(0)
   
   If OpenDatabase(6000000, DatabaseFile$, "", "")
   
      CheckDatabaseUpdate(6000000, "CREATE TABLE food (name CHAR(50), weight INT)")

      CheckDatabaseUpdate(6000000, "INSERT INTO food (name, weight) VALUES ('apple', '10')")
      CheckDatabaseUpdate(6000000, "INSERT INTO food (name, weight) VALUES ('pear', '5')")
      CheckDatabaseUpdate(6000000, "INSERT INTO food (name, weight) VALUES ('banana', '20')")
      
      If DatabaseQuery(6000000, "SELECT * FROM food WHERE weight > 7")
      
         While NextDatabaseRow(6000000)
            Debug GetDatabaseString(6000000, 0)
         Wend
      
         FinishDatabaseQuery(6000000)
      EndIf
      
      CloseDatabase(6000000)
   Else
      Debug "Can't open database !"
   EndIf
Else
   Debug "Can't create the database file !"
EndIf


Re: OpenStreetMap embarqué dans votre application

Publié : ven. 13/juin/2014 20:26
par MetalOS
Et bien non tous fonctionne bien même avec cette valeur :lol: c'est du délire...

Re: OpenStreetMap embarqué dans votre application

Publié : ven. 13/juin/2014 22:16
par djes
Bon ben tu n'as plus qu'à mettre un calldebugger au début du programme et faire du pas à pas (entrant) en vérifiant toutes les valeurs à chaque fonction... Bon courage ! :-)