Posted: Fri Oct 24, 2008 4:28 pm
I download "LibXSLT", but I can't find the file "RW_LibXML2_Inc.pb" in the archive.
http://www.purebasic.com
https://www.purebasic.fr/english/
Code: Select all
bad code see below for good code :)
Code: Select all
ProcedureC Curl_FTP_Debug(*cp.l,type.l,*buf.l,length.l,*ctx.l)
PrintN(PeekS(*buf))
ProcedureReturn 0
EndProcedure
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)
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
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","","/")
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
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","","/")
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
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?