Page 6 of 6

Posted: Fri Oct 24, 2008 4:28 pm
by Thorsten1867
I download "LibXSLT", but I can't find the file "RW_LibXML2_Inc.pb" in the archive.

Posted: Sun Nov 16, 2008 10:27 pm
by Inner
does anyone have any examples of libcurl for changing directories and getting a list ?

I have something that works but it's just not right;

Code: Select all

bad code see below for good code :)
when it changes directory I get all previous content directories before it, and I really don't think it's right to have to add the address when changing directories it just feels wrong.

Posted: Mon Nov 17, 2008 1:21 am
by Inner
Actually I think you've got a bug somewhere;

Code: Select all

ProcedureC Curl_FTP_Debug(*cp.l,type.l,*buf.l,length.l,*ctx.l)
  PrintN(PeekS(*buf))
  ProcedureReturn 0
EndProcedure
Corrupted strings in the output by using;

Code: Select all

  *slist = curl_slist_append(*slist,"ls")
  curl_easy_setopt(curl,#CURLOPT_QUOTE,*slist)  
  res = curl_easy_perform(curl)
  curl_slist_free_all(slist)
With a brutal lack of documentation, and enforced reconnection to change directories libcurl at least for PB doesn't seem like a preferred method right now for me, of course I could be just messing this all up, but without proper documentation it's a useless library not that has reflection on the importer of the library.

Posted: Mon Nov 17, 2008 8:59 am
by Inner
Alright finally got it working there is however a serious buffer problem with;

Code: Select all

ProcedureC  RW_LibCurl_WriteFunction(*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
  ReceivedData=""
  Debug "!!! "+ReceivedData
  MyDataS = PeekS(*ptr, SizeProper * NMemBProper)
  ReceivedData + MyDataS
  ;Debug "> " + MyDataS
  ;Debug "# " + Str(Len(MyDataS))
  ;Debug "@ " + Str(Len(ReceivedData))
  ProcedureReturn SizeProper * NMemBProper
EndProcedure
With large directories it just falls on it's face and gives you half measures of what is actually being read in, when you view the debug output.

And yes there is a reason I'm nuking the ReceivedData string to "", because on calls to the function following it just keeps filling and filling into infinity.

Code: Select all

XIncludeFile "RW_LibCurl_Res.pb"
XIncludeFile "RW_LibCurl_Inc.pb"

;- Window Constants
;
Enumeration
  #FTPMAINWINDOW
EndEnumeration

;- Gadget Constants
;
Enumeration
  #GAD_FTPBROWSERLIST
  #GAD_FTPLOCATION
  #GAD_OK
  #GAD_CANCEL
  #GAD_FTPUP
EndEnumeration

#DIRECTORY=1000

Macro CurlError(value)
  PeekS(curl_easy_strerror(value))
EndMacro

ProcedureC Curl_FTP_Debug(*cp.l,type.l,*buf.l,length.l,*ctx.l)
  PrintN(PeekS(*buf))
  ProcedureReturn 0
EndProcedure

Procedure Curl_FTP_List(curl.l,ftp_url.s,login.s, mdp.s, timeout.l = 10)
  url.s = "ftp://"+login+":"+mdp+"@"+ftp_url
  
  Debug url 
  
  If curl=0
    curl = curl_easy_init()
  EndIf
  If curl
    curl_easy_setopt(curl, #CURLOPT_URL, @url)
    curl_easy_setopt(curl, #CURLOPT_TIMEOUT, timeout.l)
    curl_easy_setopt(curl, #CURLOPT_CONNECTTIMEOUT, timeout.l)
    curl_easy_setopt(curl, #CURLOPT_FTPLISTONLY, #True)
    curl_easy_setopt(curl, #CURLOPT_DEBUGFUNCTION, @Curl_FTP_Debug())    
    curl_easy_setopt(curl, #CURLOPT_VERBOSE, #True)
    curl_easy_setopt(curl, #CURLOPT_WRITEFUNCTION, @RW_LibCurl_WriteFunction())
    res = curl_easy_perform(curl)
    If res <> #False
      ProcedureReturn #False;
    Else
      ClearGadgetItems(#GAD_FTPBROWSERLIST)
      FileList.s=""
      FileList.s = ReplaceString(RW_LibCurl_GetData(), Chr(13)+Chr(10),",")
      For i = 1 To CountString(FileList, ",")
        If GetExtensionPart(StringField(FileList, i, ",")) =""
          ;Debug "["+StringField(FileList, i, "-")+"]"
          AddGadgetItem(#GAD_FTPBROWSERLIST,-1,"*"+Chr(10)+StringField(FileList, i, ","))
          SetGadgetItemData(#GAD_FTPBROWSERLIST,i-1,#DIRECTORY)

        Else
          AddGadgetItem(#GAD_FTPBROWSERLIST,-1,Chr(10)+StringField(FileList, i, ","))
        EndIf
      Next
      ProcedureReturn curl
    EndIf
  Else
    ProcedureReturn #False
  EndIf
EndProcedure

Procedure.s DirUP(string.s)
  dirdepth.l=CountString(string,"/")  
  For i=1 To Len(string)
    If Mid(string,i,1)="/"
      depthlvl=depthlvl+1
      Debug Mid(string,1,i)
      If depthlvl=dirdepth-1
        ProcedureReturn Mid(string,1,i)
      EndIf       
    EndIf
  Next

EndProcedure

Procedure Open_FTPMAINWINDOW(address.s,user.s,pass.s,dir.s)
  If OpenWindow(#FTPMAINWINDOW, 404, 316, 466, 500, "FTP Browser ("+address+")",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    ListIconGadget(#GAD_FTPBROWSERLIST, 5, 35, 455, 430, "", 25, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
    AddGadgetColumn(#GAD_FTPBROWSERLIST, 1, "File", 300)
    AddGadgetColumn(#GAD_FTPBROWSERLIST, 2, "Size", 100)
    StringGadget(#GAD_FTPLOCATION, 40, 5, 415, 25, "")
    ButtonGadget(#GAD_FTPUP, 5, 5, 25, 25, "Up")
    ButtonGadget(#GAD_OK, 5, 470, 105, 25, "Ok")
    ButtonGadget(#GAD_CANCEL, 355, 470, 105, 25, "Cancel")
  EndIf
  SetGadgetText(#GAD_FTPLOCATION,dir)
  WindowEvent()
  OpenConsole()
  curl=Curl_FTP_List(0,address.s,user.s,pass.s)
  Repeat
    event=WaitWindowEvent()
    eventtype=EventType()
    Select Event     
       Case #PB_Event_Gadget
         Select EventGadget()
           Case #GAD_FTPUP
            dir.s=DirUP(GetGadgetText(#GAD_FTPLOCATION))
            Debug dir
            Curl_FTP_List(curl,address+dir+"/",user,pass)
            SetGadgetText(#GAD_FTPLOCATION,dir)
           Case #GAD_FTPBROWSERLIST
             If eventtype=#PB_EventType_LeftDoubleClick
               If GetGadgetItemData(#GAD_FTPBROWSERLIST,GetGadgetState(#GAD_FTPBROWSERLIST))=#DIRECTORY
                newdir.s=GetGadgetItemText(#GAD_FTPBROWSERLIST,GetGadgetState(#GAD_FTPBROWSERLIST),1)
                olddir.s=GetGadgetText(#GAD_FTPLOCATION)                
                dir.s=olddir+newdir+"/"               
                Curl_FTP_List(curl,address+dir+"/",user,pass)
                SetGadgetText(#GAD_FTPLOCATION,dir)
               EndIf
             EndIf
         EndSelect
    EndSelect
       
  Until event=#PB_Event_CloseWindow
  curl_easy_cleanup(curl)
  CloseConsole()
EndProcedure

Open_FTPMAINWINDOW("ftp.modland.com","anonymous","","/")
The above is functional.

Posted: Mon Nov 17, 2008 1:49 pm
by Inner
a fix;

Code: Select all

#FTPEOL=Chr(13)+Chr(10)

ProcedureC LibCurl_WriteFunction(*ptr, Size, NMemB, *Stream)
  Protected SizeProper.l  = Size & 255
  Protected NMemBProper.l = NMemB
  rdata.s=PeekS(*ptr)
  loops=CountString(rdata,#FTPEOL)
  For i=1 To loops
    file.s=RemoveString(StringField(rdata,i,#FTPEOL),Chr(13))
    file.s=RemoveString(file,Chr(10))
    PrintN(file)
  Next

  ProcedureReturn SizeProper * NMemBProper
EndProcedure
warning may have bugs, it's entirely possible that a folder/file could start after the last #FTPEOL and continue on until the next call from libcurl to the writefunction, because we're dealing with a stream.

Posted: Wed Nov 19, 2008 6:08 am
by Inner

Code: Select all

;================================================================
; Project   LibCurl
; Title     BrowseDownload.pb
; Author    T.J.Roughton
; Date      19/11/2008
; Notes     Browse & Download
;================================================================
XIncludeFile "RW_LibCurl_Res.pb"
XIncludeFile "RW_LibCurl_Inc.pb"

;- Window Constants
;
Enumeration
  #FTPMAINWINDOW
EndEnumeration

;- Gadget Constants
;
Enumeration
  #GAD_FTPBROWSERLIST
  #GAD_FTPLOCATION
  #GAD_OK
  #GAD_CANCEL
  #GAD_FTPUP
  #GAD_GO
  #GAD_DOWNLOAD
  #GAD_PROGRESS
EndEnumeration

#DIRECTORY=1000
#FTPEOL=Chr(13)+Chr(10)

Structure S_FtpFile 
  filename.s
  stream.l
EndStructure
Global ftpfile.S_FtpFile

Macro CurlError(value)
  PeekS(curl_easy_strerror(value))
EndMacro

ProcedureC Curl_FTP_Debug(*cp.l,type.l,*buf.l,length.l,*ctx.l)
  PrintN(PeekS(*buf))
  ProcedureReturn 0
EndProcedure

ProcedureC LibCurl_WriteFunction(*ptr, Size, NMemB, *Stream)
  Protected SizeProper.l  = Size & 255
  Protected NMemBProper.l = NMemB
  rdata.s=PeekS(*ptr)
  ;
  ; LIST
  ;  
;  nline.l=CountString(rdata,#FTPEOL)
;   For i=1 To nline
;     line.s=StringField(rdata,i,#FTPEOL)
;     idfile.b=#True
;     For id=1 To 2
;       If LCase(Mid(line,id,1))="d"
;         idfile=#False
;         Break
;       EndIf
;     Next
;     If idfile=#False
;       ;Debug "<DIR>"+Mid(line,10,Len(line)) 
;     Else
;       ;Debug "<FILE>"+Mid(line,10,Len(line)) 
;     EndIf
;     Debug ReplaceString(line," ","#")
;   Next
  
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Linux
    iloop=CountString(rdata,Chr(10))
    For i=1 To iloop
      line.s=StringField(rdata,i,Chr(10))
      numargs.l=CountString(line,";")+1
      file.s=Trim(StringField(line,numargs,";"))
      If (file<>"." And file<>"..")
        idfile.b=#True
        For numi=1 To numargs
          WindowEvent()
          flag.s=Trim(LCase(StringField(line,numi,";")))
          If (FindString(flag,"type=dir",0) And file<>"")
            AddGadgetItem(#GAD_FTPBROWSERLIST,-1,"*"+Chr(10)+file)
            SetGadgetItemData(#GAD_FTPBROWSERLIST,CountGadgetItems(#GAD_FTPBROWSERLIST)-1,#DIRECTORY)
            idfile.b=#False
          ElseIf FindString(flag,"type=file",0)
            filename.s=file
          ElseIf FindString(flag,"size=",0)
            filesize.s=RemoveString(flag,"size=",#PB_String_NoCase)
          EndIf
        Next
        If (idfile=#True And filename<>"")
          AddGadgetItem(#GAD_FTPBROWSERLIST,-1,Chr(10)+filename+Chr(10)+filesize)
        EndIf
      EndIf
    Next
    
    CompilerCase #PB_OS_Windows
    iloop=CountString(rdata,#FTPEOL)
    For i=1 To iloop
      line.s=RemoveString(StringField(rdata,i,#FTPEOL),Chr(13))
      numargs.l=CountString(line,";")+1
      file.s=Trim(StringField(line,numargs,";"))
      If (file<>"." And file<>"..")
        idfile.b=#True
        For numi=1 To numargs
          WindowEvent()
          flag.s=Trim(LCase(StringField(line,numi,";")))
          If (FindString(flag,"type=dir",0) And file<>"")
            AddGadgetItem(#GAD_FTPBROWSERLIST,-1,"*"+Chr(10)+file)
            SetGadgetItemData(#GAD_FTPBROWSERLIST,CountGadgetItems(#GAD_FTPBROWSERLIST)-1,#DIRECTORY)
            idfile.b=#False
          ElseIf FindString(flag,"type=file",0)
            filename.s=file
          ElseIf FindString(flag,"size=",0)
            filesize.s=RemoveString(flag,"size=",#PB_String_NoCase)
          EndIf
        Next
        If (idfile=#True And filename<>"")
          AddGadgetItem(#GAD_FTPBROWSERLIST,-1,Chr(10)+filename+Chr(10)+filesize)
        EndIf
      EndIf
    Next
  CompilerEndSelect
  
  ProcedureReturn SizeProper * NMemBProper
EndProcedure

Procedure Curl_FTP_List(curl.l,ftp_url.s,dir.s,login.s, mdp.s, timeout.l = 1000)
  url.s = "ftp://"+login+":"+mdp+"@"+ftp_url    
  If curl=0
    curl = curl_easy_init()
  EndIf
  If curl
    curl_easy_setopt(curl, #CURLOPT_URL, @url)
    curl_easy_setopt(curl, #CURLOPT_TIMEOUT, timeout.l)
    curl_easy_setopt(curl, #CURLOPT_CONNECTTIMEOUT, timeout.l)
    ;curl_easy_setopt(curl, #CURLOPT_FTPLISTONLY, #True)
    curl_easy_setopt(curl, #CURLOPT_DEBUGFUNCTION, @Curl_FTP_Debug())    
    curl_easy_setopt(curl, #CURLOPT_VERBOSE, #True)
    curl_easy_setopt(curl, #CURLOPT_WRITEFUNCTION, @LibCurl_WriteFunction())
    ;ftpdir.s="LIST "
    ftpdir.s="MLSD "
    curl_easy_setopt(curl, #CURLOPT_CUSTOMREQUEST,@ftpdir)
    res = curl_easy_perform(curl)
    If res <> #False
      ProcedureReturn #False;
    Else
      ProcedureReturn curl
    EndIf
  Else
    ProcedureReturn #False
  EndIf
EndProcedure

ProcedureC.l Curl_FTP_Progress(clientp.l,total.d,dlnow.d,ultotal.d,ulnow.d)
  WindowEvent()
  
  SetGadgetAttribute(#GAD_PROGRESS,#PB_ProgressBar_Maximum,total)
  SetGadgetState(#GAD_PROGRESS,dlnow)
  
  ProcedureReturn 0
EndProcedure


ProcedureC.l FTP_WriteFile(buffer.l, size.l, nmemb.l, *Stream.S_FtpFile)
  WindowEvent()
  If *Stream And Not *Stream\stream
    ; Open file For writing
    *Stream\stream = CreateFile(#PB_Any, *Stream\filename)
    Debug "CreateFile()"
    If Not *Stream\stream
      ; Failure, can't open file to write
      ProcedureReturn -1
    EndIf
  EndIf
  If IsFile(*Stream\stream)<>0
    WriteData(*Stream\stream, buffer, (size & 255) * nmemb)
  EndIf
  ProcedureReturn (size & 255) * nmemb
EndProcedure

Procedure Curl_FTP_Download(curl.l,ftp_url.s,localfile.s,login.s, mdp.s, timeout.l = 1000)
  url.s = "ftp://"+login+":"+mdp+"@"+ftp_url
  ftpfile\filename=localfile ; local file
  Debug url
  Debug localfile
  If curl
    curl_easy_setopt(curl, #CURLOPT_URL, @url)
    curl_easy_setopt(curl, #CURLOPT_WRITEFUNCTION, @FTP_WriteFile())
    curl_easy_setopt(curl, #CURLOPT_WRITEDATA, ftpfile)
    curl_easy_setopt(curl, #CURLOPT_NOPROGRESS, 0)
    curl_easy_setopt(curl, #CURLOPT_PROGRESSFUNCTION,@Curl_FTP_Progress())
    
    curl_easy_setopt(curl, #CURLOPT_VERBOSE, 0)  
    res = curl_easy_perform(curl)
      
    If #CURLE_OK <> res
      Debug ">"+Str(res)
    EndIf
    If ftpfile\stream
      CloseFile(ftpfile\stream)
      ftpfile\stream=0
      SetGadgetState(#GAD_PROGRESS,0)
    Else
      Debug "!@##"
    EndIf
  EndIf
EndProcedure

Procedure.s DirUP(string.s)
  dirdepth.l=CountString(string,"/")  
  For i=1 To Len(string)
    If Mid(string,i,1)="/"
      depthlvl=depthlvl+1
      Debug Mid(string,1,i)
      If depthlvl=dirdepth-1
        ProcedureReturn Mid(string,1,i)
      EndIf       
    EndIf
  Next

EndProcedure

Procedure Open_FTPMAINWINDOW(address.s,user.s,pass.s,dir.s)
  If OpenWindow(#FTPMAINWINDOW, 404, 316, 466, 500, "FTP Browser ("+address+")",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    ListIconGadget(#GAD_FTPBROWSERLIST, 5, 35, 455, 430, "", 25, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
    AddGadgetColumn(#GAD_FTPBROWSERLIST, 1, "File", 300)
    AddGadgetColumn(#GAD_FTPBROWSERLIST, 2, "Size", 100)
    StringGadget(#GAD_FTPLOCATION, 40, 5, 385, 25, "")
    ButtonGadget(#GAD_FTPUP, 5, 5, 30, 25, "Up")
    ButtonGadget(#GAD_GO, 430, 5, 30, 25, "Go")
    ButtonGadget(#GAD_OK, 5, 470, 105, 25, "Ok")
    ButtonGadget(#GAD_CANCEL, 355, 470, 105, 25, "Cancel")
    ButtonGadget(#GAD_DOWNLOAD, 120, 470, 105, 25, "Download")
    ProgressBarGadget(#GAD_PROGRESS,240,470,100,25,0,0)
  EndIf
  SetGadgetText(#GAD_FTPLOCATION,dir)
  WindowEvent()
  OpenConsole()
  curl=Curl_FTP_List(0,address,dir,user,pass)
  Repeat
    event=WaitWindowEvent()
    eventtype=EventType()
    Select Event     
       Case #PB_Event_Gadget
         Select EventGadget()
           Case #GAD_DOWNLOAD
              If GetGadgetItemData(#GAD_FTPBROWSERLIST,GetGadgetState(#GAD_FTPBROWSERLIST))<>#DIRECTORY
                file.s=GetGadgetItemText(#GAD_FTPBROWSERLIST,GetGadgetState(#GAD_FTPBROWSERLIST),1)
                dir.s=GetGadgetText(#GAD_FTPLOCATION)                
                Curl_FTP_Download(curl,address+dir+file,file,user,pass)
              EndIf
           Case #GAD_GO
            ClearGadgetItems(#GAD_FTPBROWSERLIST)
            dir.s=GetGadgetText(#GAD_FTPLOCATION)
            If dir.s="" : dir="/" : EndIf
            Curl_FTP_List(curl,address+dir+"/",dir,user,pass)           
           Case #GAD_FTPUP
            ClearGadgetItems(#GAD_FTPBROWSERLIST)
            dir.s=DirUP(GetGadgetText(#GAD_FTPLOCATION))
            If dir.s="" : dir="/" : EndIf            
            Curl_FTP_List(curl,address+dir+"/",dir,user,pass)
            SetGadgetText(#GAD_FTPLOCATION,dir)
           Case #GAD_FTPBROWSERLIST
             If eventtype=#PB_EventType_LeftDoubleClick
              If GetGadgetItemData(#GAD_FTPBROWSERLIST,GetGadgetState(#GAD_FTPBROWSERLIST))=#DIRECTORY
                newdir.s=GetGadgetItemText(#GAD_FTPBROWSERLIST,GetGadgetState(#GAD_FTPBROWSERLIST),1)
                olddir.s=GetGadgetText(#GAD_FTPLOCATION)                
                dir.s=olddir+newdir+"/"               
                ClearGadgetItems(#GAD_FTPBROWSERLIST)
                Curl_FTP_List(curl,address+dir+"/",dir,user,pass)
                SetGadgetText(#GAD_FTPLOCATION,dir)
              EndIf
             EndIf
         EndSelect
    EndSelect
       
  Until event=#PB_Event_CloseWindow
  curl_easy_cleanup(curl)
  CloseConsole()
EndProcedure

Open_FTPMAINWINDOW("<your address here>","anonymous","","/")

Linux libid3.so

Posted: Sun Nov 30, 2008 6:37 pm
by Inner
Add to : RW_id3lib_Inc.pb

Code: Select all

CompilerIf #PB_Compiler_OS = #PB_OS_Windows
; INSERT THE WINDOWS STUFF HERE.
CompilerEndIf
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
ImportC "libid3.so"
  ;- field wrappers
  ID3Field_AddASCII(*field.ID3Field, string.p-ascii) As "ID3Field_AddASCII"
  ID3Field_AddUNICODE(*field.ID3Field, string.p-unicode) As "ID3Field_AddUNICODE"
  ID3Field_Clear(*field.ID3Field) As "ID3Field_Clear"
  ID3Field_FromFile(*field.ID3Field, filename.p-ascii) As "ID3Field_FromFile"
  ID3Field_GetASCII(*field.ID3Field, *buffer, maxChars.l) As "ID3Field_GetASCII"
  ID3Field_GetASCIIItem(*field.ID3Field, *buffer, maxChars.l, itemNum.l) As "ID3Field_GetASCIIItem"
  ID3Field_GetBINARY(*field.ID3Field, *buffer, buffLength.l) As "ID3Field_GetBINARY"
  ID3Field_GetINT(*field.ID3Field) As "ID3Field_GetINT"
  ID3Field_GetNumTextItems(*field.ID3Field) As "ID3Field_GetNumTextItems"
  ID3Field_GetUNICODE(*field.ID3Field, *buffer, maxChars.l) As "ID3Field_GetUNICODE"
  ID3Field_GetUNICODEItem(*field.ID3Field, *buffer.l, maxChars.l, itemNum.l) As "ID3Field_GetUNICODEItem"
  ID3Field_SetASCII(*field.ID3Field, string.p-ascii) As "ID3Field_SetASCII"
  ID3Field_SetBINARY(*field.ID3Field, *data_, size.l) As "ID3Field_SetBINARY"
  ID3Field_SetINT(*field.ID3Field, data_.l) As "ID3Field_SetINT"
  ID3Field_SetUNICODE(*field.ID3Field, string.p-unicode) As "ID3Field_SetUNICODE"
  ID3Field_Size(*field.ID3Field) As "ID3Field_Size"
  ID3Field_ToFile(*field.ID3Field, filename.p-ascii) As "ID3Field_ToFile"
  ;-frame wrappers
  ID3Frame_Clear(*frame.ID3Frame) As "ID3Frame_Clear"
  ID3Frame_Delete(*frame.ID3Frame) As "ID3Frame_Delete"
  ID3Frame_GetCompression(*frame.ID3Frame) As "ID3Frame_GetCompression"
  ID3Frame_GetField(*frame.ID3Frame, name.l) As "ID3Frame_GetField"
  ID3Frame_GetID(*frame.ID3Frame) As "ID3Frame_GetID"
  ID3Frame_New() As "ID3Frame_New"
  ID3Frame_NewID(id.l) As "ID3Frame_NewID"
  ID3Frame_SetCompression(*frame.ID3Frame, comp.l) As "ID3Frame_SetCompression"
  ID3Frame_SetID(*frame.ID3Frame, id.l) As "ID3Frame_SetID"
  ID3TagConstIterator_Delete(*iter.ID3TagConstIterator) As "ID3TagConstIterator_Delete"
  ID3TagConstIterator_GetNext(*iter.ID3TagConstIterator) As "ID3TagConstIterator_GetNext"
  ;-tag wrappers
  ID3TagIterator_Delete(*iter.ID3TagIterator) As "ID3TagIterator_Delete"
  ID3TagIterator_GetNext(*iter.ID3TagIterator) As "ID3TagIterator_GetNext"
  ID3Tag_AddFrame(*tag.ID3Tag, *frame.ID3Frame) As "ID3Tag_AddFrame"
  ID3Tag_AddFrames(*tag.ID3Tag, *frames.ID3Frame, num.l) As "ID3Tag_AddFrames"
  ID3Tag_AttachFrame(*tag.ID3Tag, *frame.ID3Frame) As "ID3Tag_AttachFrame"
  ID3Tag_Clear(*tag.ID3Tag) As "ID3Tag_Clear"
  ID3Tag_CreateConstIterator(*tag.ID3Tag) As "ID3Tag_CreateConstIterator"
  ID3Tag_CreateIterator(*tag.ID3Tag) As "ID3Tag_CreateIterator"
  ID3Tag_Delete(*tag.ID3Tag) As "ID3Tag_Delete"
  ID3Tag_FindFrameWithASCII(*tag.ID3Tag, id.l, fld.l, data_.p-ascii) As "ID3Tag_FindFrameWithASCII"
  ID3Tag_FindFrameWithID(*tag.ID3Tag, id.l) As "ID3Tag_FindFrameWithID"
  ID3Tag_FindFrameWithINT(*tag.ID3Tag, id.l, fld.l, data_.l) As "ID3Tag_FindFrameWithINT"
  ID3Tag_FindFrameWithUNICODE(*tag.ID3Tag, id.l, fld.l, data_.p-unicode) As "ID3Tag_FindFrameWithUNICODE"
  ID3Tag_HasChanged(*tag.ID3Tag) As "ID3Tag_HasChanged"
  ID3Tag_HasTagType(*tag.ID3Tag, tt.l) As "ID3Tag_HasTagType"
  ID3Tag_Link(*tag.ID3Tag, filename.p-ascii) As "ID3Tag_Link"
  ID3Tag_LinkWithFlags(*tag.ID3Tag, filename.p-ascii, flags.l) As "ID3Tag_LinkWithFlags"
  ID3Tag_New() As "ID3Tag_New"
  ID3Tag_NumFrames(*tag.ID3Tag) As "ID3Tag_NumFrames"
  ID3Tag_Parse(*tag.ID3Tag, *header, *buffer) As "ID3Tag_Parse"
  ID3Tag_RemoveFrame(*tag.ID3Tag, *frame.ID3Frame) As "ID3Tag_RemoveFrame"
  ID3Tag_SetExtendedHeader(*tag.ID3Tag, ext.l) As "ID3Tag_SetExtendedHeader"
  ID3Tag_SetPadding(*tag.ID3Tag, pad.l) As "ID3Tag_SetPadding"
  ID3Tag_SetUnsync(*tag.ID3Tag, unsync.l) As "ID3Tag_SetUnsync"
  ID3Tag_Strip(*tag.ID3Tag, ulTagFlags.l) As "ID3Tag_Strip"
  ID3Tag_Update(*tag.ID3Tag) As "ID3Tag_Update"
  ID3Tag_UpdateByTagType(*tag.ID3Tag, tag_type.l) As "ID3Tag_UpdateByTagType"
EndImport
CompilerEndIf

Posted: Fri Mar 20, 2009 3:53 pm
by Thorsten1867
How can I download "RLibPlus"? I can't find any valid link.

Posted: Wed Mar 25, 2009 11:20 pm
by Progi1984
Wahhh ! a lot of post for my small projects !

Build LibPlus for PB 4.3 : http://partage.rootslabs.net/RLibPlus_4.3.zip

I finish moebius v1 and my website, and i answer at all theses posts and MPs.

Re: Progi1984 - Programs & Userlibs

Posted: Mon Jan 03, 2011 6:06 am
by Matt
Anybody have a valid link to the RJSON.zip file for parsing JSON?

Thanks,

Matt

Re: Progi1984 - Programs & Userlibs

Posted: Mon Jan 03, 2011 10:31 am
by Progi1984

Re: Progi1984 - Programs & Userlibs

Posted: Mon Jan 03, 2011 11:05 pm
by Matt
Thanks man... however I get the usual StringExtension library not found issue with PureBasic 4.51... with 4.20 it works. Anyway it could be updated? :D

Matt

Re: Progi1984 - Programs & Userlibs

Posted: Fri Oct 28, 2011 10:46 am
by quasiperfect
i downloaded rcam and tried to run a example but the files "RCam_Res.pb" and "RCam_Inc.pb" are not included in the zip file can you please update the zip ?