Using delay so app doesn't freeze

Just starting out? Need help? Post your questions and find answers here.
mrjiles
Enthusiast
Enthusiast
Posts: 238
Joined: Fri Aug 18, 2006 7:21 pm
Location: IL

Using delay so app doesn't freeze

Post by mrjiles »

Hi all! Feels like everyone else is building my app and not me! But here's another question.

I am downloading a large XML file (10+Mb). The connection code came from codearchive. But since the file is so large I am saving it to a file after every chunk rather than loading it to memory. BUT, my app freezes while downloading the file. I have even inserted a delay but maybe I am not using it correctly.

Here is the code. Hope it makes sense:

Code: Select all

     host.s = "api.sandbox.ebay.com"
     get_url.s = "/ws/api.dll"
     result.s = ""
     open_handle = InternetOpen_("None",1,"","",0)
     connect_handle = InternetConnect_(open_handle,host,443,"","",3,0,0)
     request_handle = HttpOpenRequest_(connect_handle,"POST",get_url,"","",0,$800000,0)
     HttpAddRequestHeaders_(request_handle,headers,Len(headers), $80000000 | $20000000)
     post_data_len = Len(post_data)
     send_handle = HttpSendRequest_(request_handle,"",0,post_data,post_data_len)
     buffer.s = Space(1024)
     bytes_read.l
     total_read.l
     total_read = 0
     Repeat
     InternetReadFile_(request_handle,@buffer,1024,@bytes_read)
     result = Left(buffer,bytes_read)
     buffer = Space(1024)
     
     If OpenFile(999, "ebay.txt")
          FileSeek(999, Lof(999))
          WriteStringN(999, result)
          CloseFile(999)
          Delay(10)
     EndIf
     
     Until bytes_read=0
User avatar
netmaestro
PureBasic Bullfrog
PureBasic Bullfrog
Posts: 8452
Joined: Wed Jul 06, 2005 5:42 am
Location: Fort Nelson, BC, Canada

Post by netmaestro »

Quickest fix if it's working for you otherwise would be to put it in its own thread.
BERESHEIT
mrjiles
Enthusiast
Enthusiast
Posts: 238
Joined: Fri Aug 18, 2006 7:21 pm
Location: IL

Post by mrjiles »

netmaestro wrote:Quickest fix if it's working for you otherwise would be to put it in its own thread.
Speedy reply netmaestro! I will investigate threads and post outcome.
mrjiles
Enthusiast
Enthusiast
Posts: 238
Joined: Fri Aug 18, 2006 7:21 pm
Location: IL

Post by mrjiles »

Thanks netmaestro! Creating a new thread worked great - program doesn't hang one bit.

Now I know when and how to use threads!
mrjiles
Enthusiast
Enthusiast
Posts: 238
Joined: Fri Aug 18, 2006 7:21 pm
Location: IL

Post by mrjiles »

One more question if anyone can help. I'm trying to close a window when the download is finished but it appears that because this procedure is being accessed through a new thread that I cannot close another window (possibly due to threads not being able to return data?)

I have tried using IsThread to check if the thread has finished but it freezes the window that I open.


Here is what makes sense to me:

Code: Select all

Procedure.s DownloadCategories()
     If CreateFile(999, "ebay.txt")
          CloseFile(999)
     EndIf
     
     
     headers.s = EbayHeaders("GetCategories")
     post_data.s = "<?xml version=" + Chr(34) + "1.0" + Chr(34) + "encoding=" + Chr(34) + "utf-8" + Chr(34) + "?>"  + #CRLF$
     post_data.s + "<GetCategoriesRequest xmlns=" + Chr(34) + "urn:ebay:apis:eBLBaseComponents" + Chr(34) + ">" + #CRLF$
     post_data.s + "<RequesterCredentials>" + #CRLF$
     post_data.s + "<eBayAuthToken>" + EbayAuthToken$ + "</eBayAuthToken>" + #CRLF$
     post_data.s + "</RequesterCredentials>" + #CRLF$
     post_data.s + "<DetailLevel>ReturnAll</DetailLevel>" + #CRLF$
     post_data.s + "<LevelLimit>1</LevelLimit>" + #CRLF$
     post_data.s + "</GetCategoriesRequest>"

     host.s = "api.sandbox.ebay.com"
     get_url.s = "/ws/api.dll"
     result.s = ""
     open_handle = InternetOpen_("None",1,"","",0)
     connect_handle = InternetConnect_(open_handle,host,443,"","",3,0,0)
     request_handle = HttpOpenRequest_(connect_handle,"POST",get_url,"","",0,$800000,0)
     HttpAddRequestHeaders_(request_handle,headers,Len(headers), $80000000 | $20000000)
     post_data_len = Len(post_data)
     send_handle = HttpSendRequest_(request_handle,"",0,post_data,post_data_len)
     buffer.s = Space(1024)
     bytes_read.l
     total_read.l
     total_read = 0
     Repeat
     InternetReadFile_(request_handle,@buffer,1024,@bytes_read)
     result = Left(buffer,bytes_read)
     buffer = Space(1024)
     
     If OpenFile(999, "ebay.txt")
          FileSeek(999, Lof(999))
          WriteStringN(999, result)
          CloseFile(999)
     EndIf
     
     Until bytes_read=0
     
     CloseWindow(#winDOWNLOADING)
EndProcedure
After the "repeat..until" statement is finished it should continue to the closewindow command, right?
User avatar
netmaestro
PureBasic Bullfrog
PureBasic Bullfrog
Posts: 8452
Joined: Wed Jul 06, 2005 5:42 am
Location: Fort Nelson, BC, Canada

Post by netmaestro »

Is this your thread procedure? If so, a couple of points:

-You must take in one long parameter, whether you'll use it or not. See the Createthread() doc.
-Set a threadrunning global variable to 1 at the top of the proc and loop based on <whatever's there now> AND threadrunning - that way it can be stopped gracefully from the main loop just by setting threadrunning to 0 (good for user aborts).
- Procedure.s is no use, you can't return anything. But you can set a global string var to something, poke something into allocated memory, etc. There are many good alternatives.
- Don't do a CloseWindow from the thread if the thread didn't do the OpenWindow - No window messages are passed between threads.

Start with that and see if it helps, that's what I see off the top.
BERESHEIT
User avatar
DoubleDutch
Addict
Addict
Posts: 3220
Joined: Thu Aug 07, 2003 7:01 pm
Location: United Kingdom
Contact:

Post by DoubleDutch »

mrjiles: Have you got any ebay code to show, it looks interesting.?
https://deluxepixel.com <- My Business website
https://reportcomplete.com <- School end of term reports system
mrjiles
Enthusiast
Enthusiast
Posts: 238
Joined: Fri Aug 18, 2006 7:21 pm
Location: IL

Post by mrjiles »

@DoubleDutch - I didn't finish the program because eBay is constantly changing things. Let me find the code and I will post it. It was working for the eBay Sandbox - listing test items, category download, etc.
mrjiles
Enthusiast
Enthusiast
Posts: 238
Joined: Fri Aug 18, 2006 7:21 pm
Location: IL

Post by mrjiles »

OK - found my old code.

WARNING!! It's a complete mess!! I'm posting it because it was requested and it does cover how the eBay API works. Please don't complain about formatting, comments, etc. This code should execute fine but the eBay API code needs updating. eBay API documentation is available at: http://developer.ebay.com/. Any questions, just ask!

Code: Select all

;- Enumeration
Enumeration
     ;- Main window enum
     #winMAIN
     #MAIN_GRID
     #MAIN_menu
     #MAIN_menu_exit
     #MAIN_menu_help
     #MAIN_menu_about
     #MAIN_menu_update
     #MAIN_menu_prefs
     #MAIN_btn_new
     #MAIN_btn_edit
     #MAIN_btn_delete
     
     ;- About window
     #winABOUT
     #ABOUT_btn_ok
     
     ;- Auction window
     #winAUCTION
     #AUCTION_btn_save
     #AUCTION_btn_cancel
     #AUCTION_btn_cat1
     #AUCTION_btn_cat2
     #AUCTION_panel
     #AUCTION_images
     #AUCTION_btn_addimage
     #AUCTION_btn_deleteimage
     #AUCTION_item_title
     #AUCTION_item_subtitle
     #AUCTION_item_qty
     #AUCTION_item_reserve
     #AUCTION_item_price
     #AUCTION_item_buyitnow
     #AUCTION_item_cat1
     #AUCTION_item_cat2
     #AUCTION_check_bold
     #AUCTION_check_border
     #AUCTION_check_highlight
     #AUCTION_check_paypal
     #AUCTION_item_paypalemail
     #AUCTION_check_check
     #AUCTION_check_mo
     #AUCTION_check_other
     #AUCTION_item_description
     #AUCTION_shipping
     #AUCTION_shippingtype
     
     ;- Preferences window enum
     #winPREFS
     #PREFS_btn_save
     #PREFS_btn_cancel
     #PREFS_panel
     #PREFS_check_update
     #PREFS_check_imageother
     #PREFS_check_imagegoop
     #PREFS_goop_username
     #PREFS_goop_password
     #PREFS_btn_goopsignup
     #PREFS_edit_disclaimer
     #PREFS_edit_shipping
     #PREFS_edit_return
     #PREFS_btn_upgrades
     #PREFS_btn_payments
     #PREFS_btn_shipping
     
     ;- Category window
     #winCATEGORY
     #CATEGORY_btn_ok
     #CATEGORY_btn_cancel
     #CATEGORY_tree
     #CATEGORY_database
     
     ;- Add image window
     #winIMAGEURL
     #IMAGEURL_address
     #IMAGEURL_btn_add
     #IMAGEURL_btn_cancel
     
     ;- Downloading window enum
     #winDOWNLOADING
     #DOWNLOADING_cancel
     #DOWNLOADING_list 
     
     #DATABASE
     #DATA_GADGET
     #CONFIGFILE
     
     #CALLS_time
     #CALLS_additem
     
     #CATFILE
     #XML
EndEnumeration

;- Global variables
; Your credentials go here
Global EbayDevName$ = ""
Global EbayAppName$ = ""
Global EbayCertName$ = ""
Global EbayAPIVersion$ = "533"
Global EbayAuthToken$ = ""

Global catid$
Global catlevel$
Global processcategories = #False
Global newitem
Global prefs_update$
Global prefs_disclaimer$
Global prefs_shipping$
Global prefs_return$
Global prefs_host$
Global prefs_user$
Global prefs_pass$
Global auction_title$
Global auction_subtitle$
Global auction_qty$
Global auction_price$
Global auction_reserve$
Global auction_buynow$
Global auction_cat1$
Global auction_cat2$
Global auction_bold$
Global auction_border$
Global auction_highlight$
Global auction_paypaladdress$
Global auction_usepaypal$
Global auction_check$
Global auction_mo$
Global auction_other$
Global auction_shipping$
Global auction_images$
Global auction_description$
Global close_winDOWNLOADING = #False
Global addnewtodownloadlist = #False
Global currentbytesdownloaded = 0
Global selectedforedit
Global whichcat


;- Declarations
Declare open_winMAIN()
Declare open_winABOUT()
Declare open_winAUCTION()
Declare open_winPREFS()
Declare open_winUPDATE()
Declare open_winDEFAULTS()
Declare open_winCATEGORY()
Declare open_winIMAGEURL()
Declare open_winDOWNLOADING()
Declare ListInventory()
Declare SaveInventory()
Declare SavePrefs()
Declare GetPrefs()
Declare LoadAuctionData()
Declare ClearAuctionData()
Declare.s GetXMLData(XMLTag$, String$)
Declare.s GetXMLData2(XMLTag$, String$)
Declare ProcessCategories(*CurrentNode, Position)
Declare.s ConnectToEbay(Call$)
Declare.s EbayHeaders(CallToEbay$)
Declare.s EbayOfficialTime()
Declare.s AddItem()
Declare.s DownloadCategories()



;- Main loop
GetPrefs()     ; Load preferences
open_winMAIN() ; Display main window
ListInventory()     ; List inventory in window

If prefs_update$ = "1"                  ; Check if update is set in preferences
     DisableWindow(#winMAIN, #True)     ;
     open_winDOWNLOADING()              ;
EndIf                                   ;


Repeat
     event = WindowEvent()
     
     If event = #PB_Event_CloseWindow
          quit = 1
     ElseIf event = #PB_Event_Menu
          Select EventMenu()
               Case #MAIN_menu_exit: quit = 1
               Case #MAIN_menu_about
                    DisableWindow(#winMAIN, #True)
                    open_winABOUT()
               Case #MAIN_menu_prefs
                    GetPrefs()
                    DisableWindow(#winMAIN, #True)
                    open_winPREFS()
               Case #MAIN_menu_update
                    DisableWindow(#winMAIN, #True)
                    open_winDOWNLOADING()
               Case #CALLS_time: ConnectToEbay("GeteBayOfficialTime")
               Case #CALLS_additem: ConnectToEbay("AddItem")
          EndSelect
     ElseIf event = #PB_Event_Gadget
          Select EventGadget()
               ;- Main window
               Case #MAIN_btn_new
                    newitem = 1
                    ClearAuctionData()
                    DisableWindow(#winMAIN, #True)
                    open_winAUCTION()
               Case #MAIN_btn_edit
                    If GetGadgetState(#MAIN_GRID) > -1
                         selectedforedit = GetGadgetState(#MAIN_GRID)
                         newitem = 0
                         LoadAuctionData()
                         DisableWindow(#winMAIN, #True)
                         open_winAUCTION()
                    EndIf
               Case #MAIN_btn_delete
                    If GetGadgetState(#MAIN_GRID) = -1
                    Else
                         selected = GetGadgetState(#MAIN_GRID)
                         confirm = MessageRequester("Confirm delete", "Delete item " + Chr(34) + GetGadgetItemText(#MAIN_GRID, selected, 0) + Chr(34) + "?", #PB_MessageRequester_YesNo)
                         If confirm = #PB_MessageRequester_Yes
                              RemoveGadgetItem(#MAIN_GRID, selected)
                              RemoveGadgetItem(#DATA_GADGET, selected)
                              SaveInventory()
                         EndIf
                    EndIf
               ;- About window
               Case #ABOUT_btn_ok
                    DisableWindow(#winMAIN, #False)
                    CloseWindow(#winABOUT)
               Case #AUCTION_btn_save
                    numimages = CountGadgetItems(#AUCTION_images)
                    Images$ = ""
                    If numimages <> 0
                         For num = 1 To numimages
                              Images$ + GetGadgetItemText(#AUCTION_images, num-1)
                              If num <> numimages
                                   Images$ + Chr(167)
                              EndIf
                         Next
                    EndIf
                    
                    
                    If newitem <> 1
                         RemoveGadgetItem(#MAIN_GRID, selectedforedit)
                         RemoveGadgetItem(#DATA_GADGET, selectedforedit)
                    Else
                         selectedforedit = 0
                    EndIf
                         AddGadgetItem(#DATA_GADGET, selectedforedit, GetGadgetText(#AUCTION_item_title) + Chr(10) + GetGadgetText(#AUCTION_item_subtitle) + Chr(10) + GetGadgetText(#AUCTION_item_qty) + Chr(10) + GetGadgetText(#AUCTION_item_price) + Chr(10) + GetGadgetText(#AUCTION_item_reserve) + Chr(10) + GetGadgetText(#AUCTION_item_buyitnow) + Chr(10) + GetGadgetText(#AUCTION_item_cat1) + Chr(10) + GetGadgetText(#AUCTION_item_cat2) + Chr(10) + Str(GetGadgetState(#AUCTION_check_bold)) + Chr(10) + Str(GetGadgetState(#AUCTION_check_border)) + Chr(10) + Str(GetGadgetState(#AUCTION_check_highlight)) + Chr(10) + GetGadgetText(#AUCTION_item_paypalemail) + Chr(10) + Str(GetGadgetState(#AUCTION_check_paypal)) + Chr(10) + Str(GetGadgetState(#AUCTION_check_check)) + Chr(10) + Str(GetGadgetState(#AUCTION_check_mo)) + Chr(10) + Str(GetGadgetState(#AUCTION_check_other)) + Chr(10) + GetGadgetText(#AUCTION_shipping) + Chr(10) + Images$ + Chr(10) + ReplaceString(GetGadgetText(#AUCTION_item_description), #CRLF$, Chr(167)))
                         AddGadgetItem(#MAIN_GRID, selectedforedit, GetGadgetText(#AUCTION_item_title) + Chr(10) + GetGadgetText(#AUCTION_item_price) + Chr(10) + GetGadgetText(#AUCTION_item_reserve) + Chr(10) + GetGadgetText(#AUCTION_item_title))
                    SaveInventory()
                    DisableWindow(#winMAIN, #False)
                    CloseWindow(#winAUCTION)
               Case #AUCTION_btn_cancel
                    DisableWindow(#winMAIN, #False)
                    CloseWindow(#winAUCTION)
               Case #AUCTION_btn_cat1
                    whichcat = 1
                    DisableWindow(#winAUCTION, #True)
                    If IsWindow(#winCATEGORY)
                         HideWindow(#winCATEGORY, #False)
                    Else
                         open_winCATEGORY()
                    EndIf
               Case #AUCTION_btn_cat2
                    whichcat = 2
                    If IsWindow(#winCATEGORY)
                         HideWindow(#winCATEGORY, #False)
                    Else
                         open_winCATEGORY()
                    EndIf
               Case #AUCTION_btn_addimage
                    DisableWindow(#winAUCTION, #True)
                    open_winIMAGEURL()
               ;- Category window
               Case #CATEGORY_btn_ok
                    If whichcat = 1
                         selectedcat$ = GetGadgetItemText(#CATEGORY_database, GetGadgetState(#CATEGORY_tree), 3)
                         If selectedcat$ = "true"
                              SetGadgetText(#AUCTION_item_cat1, GetGadgetItemText(#CATEGORY_database, GetGadgetState(#CATEGORY_tree), 1))
                              DisableWindow(#winAUCTION, #False)
                              CloseWindow(#winCATEGORY)
                         EndIf
                    Else
                         selectedcat$ = GetGadgetItemText(#CATEGORY_database, GetGadgetState(#CATEGORY_tree), 3)
                         If selectedcat$ = "true"
                              SetGadgetText(#AUCTION_item_cat2, GetGadgetItemText(#CATEGORY_database, GetGadgetState(#CATEGORY_tree), 1))
                              DisableWindow(#winAUCTION, #False)
                              CloseWindow(#winCATEGORY)
                         EndIf
                    EndIf
               Case #CATEGORY_btn_cancel
                    DisableWindow(#winAUCTION, #False)
                    HideWindow(#winCATEGORY, #True)
               ;- Preferences window
               Case #PREFS_btn_cancel
                    DisableWindow(#winMAIN, #False)
                    CloseWindow(#winPREFS)
               Case #PREFS_btn_save
                    SavePrefs()
                    DisableWindow(#winMAIN, #False)
                    CloseWindow(#winPREFS)
               Case #PREFS_check_imageother
                    DisableGadget(#PREFS_goop_password, #True)
                    DisableGadget(#PREFS_goop_username, #True)
               Case #PREFS_check_imagegoop
                    DisableGadget(#PREFS_goop_password, #False)
                    DisableGadget(#PREFS_goop_username, #False)
               ;- Add image window
               Case #IMAGEURL_btn_cancel
                    DisableWindow(#winAUCTION, #False)
                    CloseWindow(#winIMAGEURL)
               Case #IMAGEURL_btn_add
                    If GetGadgetText(#IMAGEURL_address) = "http://"
                    ElseIf GetGadgetText(#IMAGEURL_address) = ""
                    Else
                         AddGadgetItem(#AUCTION_images, -1, GetGadgetText(#IMAGEURL_address))
                    EndIf
                    DisableWindow(#winAUCTION, #False)
                    CloseWindow(#winIMAGEURL)
               Case #DOWNLOADING_cancel
                    If GetGadgetText(#DOWNLOADING_cancel) = "Close"
                         DisableWindow(#winMAIN, #False)
                         CloseWindow(#winDOWNLOADING)
                    Else
                         SetGadgetText(#DOWNLOADING_cancel, "Close")
                         AddGadgetItem(#DOWNLOADING_list, -1, "Download canceled")
                    EndIf
                    close_winDOWNLOADING = 3
                    addnewtodownloadlist = #False
                    createdownloadthread = #False
                    If IsThread(thread)
                         KillThread(thread)
                    EndIf
          EndSelect
     ElseIf close_winDOWNLOADING = #True
          ;CloseWindow(#winDOWNLOADING)
          close_winDOWNLOADING = #False
          AddGadgetItem(#DOWNLOADING_list, 2, "Finished")
          SetGadgetText(#DOWNLOADING_cancel, "Close")
     ElseIf close_winDOWNLOADING <> #True
          If addnewtodownloadlist = #True
               RemoveGadgetItem(#DOWNLOADING_list, 1)
               AddGadgetItem(#DOWNLOADING_list, -1, "Downloading: " + Str(currentbytesdownloaded/1024) + "Kb")
               addnewtodownloadlist = #False
          EndIf
     EndIf
     If processcategories = #True
          AddGadgetItem(#DOWNLOADING_list, -1, "Processing categories...")
          LoadXML(#XML, "categories.tmp")
          *MainNode = MainXMLNode(#XML)
          ProcessCategories(*MainNode, 0)
          processcategories = #False
     EndIf
Until quit = 1
End



;- Main window procedure
Procedure open_winMAIN()
     OpenWindow(#winMAIN, 0, 0, 650, 420, "AuctionGoop", #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget )
          CreateMenu(#MAIN_menu, WindowID(#winMAIN))
               MenuTitle("File")
                    MenuItem(#MAIN_menu_exit, "Exit")
               MenuTitle("Tools")
                    MenuItem(#MAIN_menu_prefs, "Preferences")
                    MenuBar()
                    MenuItem(#MAIN_menu_update, "Update categories")
               MenuTitle("Help")
                    MenuItem(#MAIN_menu_help, "Help Guide")
                    MenuItem(#MAIN_menu_about, "About...")
               MenuTitle("Calls")
                    MenuItem(#CALLS_time, "GetEbayOfficialTime")
                    MenuItem(#CALLS_additem, "AddItem")

          ResizeWindow(#winMAIN, #PB_Ignore, #PB_Ignore, #PB_Ignore, WindowHeight(#winMAIN)+MenuHeight())

          CreateGadgetList(WindowID(#winMAIN))
               ButtonGadget(#MAIN_btn_new, 10, 385, 100, 25, "New")
               ButtonGadget(#MAIN_btn_edit, 120, 385, 100, 25, "Edit")
               ButtonGadget(#MAIN_btn_delete, 230, 385, 100, 25, "Delete")

          ListIconGadget(#DATA_GADGET, 0, 0, 0, 0, "", 100)
               AddGadgetColumn(#DATA_GADGET, 1, "Subtitle", 0)
               AddGadgetColumn(#DATA_GADGET, 2, "QTY", 0)
               AddGadgetColumn(#DATA_GADGET, 3, "Price", 0)
               AddGadgetColumn(#DATA_GADGET, 4, "Reserve", 0)
               AddGadgetColumn(#DATA_GADGET, 5, "Buy", 0)
               AddGadgetColumn(#DATA_GADGET, 6, "CAT1", 0)
               AddGadgetColumn(#DATA_GADGET, 7, "CAT2", 0)
               AddGadgetColumn(#DATA_GADGET, 8, "BOLD", 0)
               AddGadgetColumn(#DATA_GADGET, 9, "BORDER", 0)
               AddGadgetColumn(#DATA_GADGET, 10, "HIGHLIGHT", 0)
               AddGadgetColumn(#DATA_GADGET, 11, "PAYPAL", 0)
               AddGadgetColumn(#DATA_GADGET, 12, "PAY EMAIL", 0)
               AddGadgetColumn(#DATA_GADGET, 13, "CHECK", 0)
               AddGadgetColumn(#DATA_GADGET, 14, "MO", 0)
               AddGadgetColumn(#DATA_GADGET, 15, "OTHER", 0)
               AddGadgetColumn(#DATA_GADGET, 16, "SHIPPING", 0)
               AddGadgetColumn(#DATA_GADGET, 17, "IMAGES", 0)
               AddGadgetColumn(#DATA_GADGET, 18, "DESCRIPTION", 0)
               HideGadget(#DATA_GADGET, #True)

               ListIconGadget(#MAIN_GRID, 0, 0, 650, 375, "Item Title", 250, #PB_ListIcon_GridLines | #PB_ListIcon_AlwaysShowSelection | #PB_ListIcon_FullRowSelect)
                    AddGadgetColumn(#MAIN_GRID, 3, "Price", 75)
                    AddGadgetColumn(#MAIN_GRID, 4, "Reserve", 75)
EndProcedure




;- About window procedure
Procedure open_winABOUT()
     OpenWindow(#winABOUT, 0, 0, 300, 200, "About", #PB_Window_WindowCentered, WindowID(#winMAIN))
          CreateGadgetList(WindowID(#winABOUT))
               TextGadget(#PB_Any, 10, 10, 250, 20, "AuctionGoop")
               TextGadget(#PB_Any, 10, 30, 250, 20, "version 0.1b")
               TextGadget(#PB_Any, 10, 70, 250, 20, "www.auctiongoop.com")
               ButtonGadget(#ABOUT_btn_ok, 240, 165, 50, 25, "OK")
EndProcedure



;- List inventory procedure
Procedure ListInventory()
     x = 0
     If ReadFile(#DATABASE, "db")
          While Eof(#DATABASE) = #False
               a$ = ReadString(#DATABASE)
               ; add database to the #DATA_GADGET
               AddGadgetItem(#DATA_GADGET, -1, StringField(a$, 1, Chr(160)) + Chr(10) + StringField(a$, 2, Chr(160)) + Chr(10) + StringField(a$, 3, Chr(160)) + Chr(10) + StringField(a$, 4, Chr(160)) + Chr(10) + StringField(a$, 5, Chr(160)) + Chr(10) + StringField(a$, 6, Chr(160)) + Chr(10) + StringField(a$, 7, Chr(160)) + Chr(10) + StringField(a$, 8, Chr(160)) + Chr(10) + StringField(a$, 9, Chr(160)) + Chr(10) + StringField(a$, 10, Chr(160)) + Chr(10) + StringField(a$, 11, Chr(160)) + Chr(10) + StringField(a$, 12, Chr(160)) + Chr(10) + StringField(a$, 13, Chr(160)) + Chr(10) + StringField(a$, 14, Chr(160)) + Chr(10) + StringField(a$, 15, Chr(160)) + Chr(10) + StringField(a$, 16, Chr(160)) + Chr(10) + StringField(a$, 17, Chr(160)) + Chr(10) + StringField(a$, 18, Chr(160)) + Chr(10) + StringField(a$, 19, Chr(160)))
               
               ; display on screen
               AddGadgetItem(#MAIN_GRID, -1, StringField(a$, 1, Chr(160)) + Chr(10) + StringField(a$, 4, Chr(160)) + Chr(10) + StringField(a$, 5, Chr(160)))
          Wend
     CloseFile(#DATABASE)
     Else
     EndIf
EndProcedure



;- Save inventory procedure
Procedure SaveInventory()
     If CreateFile(#DATABASE, "db")
          i = CountGadgetItems(#MAIN_GRID)
          For a = 1 To i
               WriteString(#DATABASE, GetGadgetItemText(#DATA_GADGET, a-1, 0) + Chr(160))
               WriteString(#DATABASE, GetGadgetItemText(#DATA_GADGET, a-1, 1) + Chr(160))
               WriteString(#DATABASE, GetGadgetItemText(#DATA_GADGET, a-1, 2) + Chr(160))
               WriteString(#DATABASE, GetGadgetItemText(#DATA_GADGET, a-1, 3) + Chr(160))
               WriteString(#DATABASE, GetGadgetItemText(#DATA_GADGET, a-1, 4) + Chr(160))
               WriteString(#DATABASE, GetGadgetItemText(#DATA_GADGET, a-1, 5) + Chr(160))
               WriteString(#DATABASE, GetGadgetItemText(#DATA_GADGET, a-1, 6) + Chr(160))
               WriteString(#DATABASE, GetGadgetItemText(#DATA_GADGET, a-1, 7) + Chr(160))
               WriteString(#DATABASE, GetGadgetItemText(#DATA_GADGET, a-1, 8) + Chr(160))
               WriteString(#DATABASE, GetGadgetItemText(#DATA_GADGET, a-1, 9) + Chr(160))
               WriteString(#DATABASE, GetGadgetItemText(#DATA_GADGET, a-1, 10) + Chr(160))
               WriteString(#DATABASE, GetGadgetItemText(#DATA_GADGET, a-1, 11) + Chr(160))
               WriteString(#DATABASE, GetGadgetItemText(#DATA_GADGET, a-1, 12) + Chr(160))
               WriteString(#DATABASE, GetGadgetItemText(#DATA_GADGET, a-1, 13) + Chr(160))
               WriteString(#DATABASE, GetGadgetItemText(#DATA_GADGET, a-1, 14) + Chr(160))
               WriteString(#DATABASE, GetGadgetItemText(#DATA_GADGET, a-1, 15) + Chr(160))
               WriteString(#DATABASE, GetGadgetItemText(#DATA_GADGET, a-1, 16) + Chr(160))
               WriteString(#DATABASE, GetGadgetItemText(#DATA_GADGET, a-1, 17) + Chr(160))
               WriteString(#DATABASE, GetGadgetItemText(#DATA_GADGET, a-1, 18))
               If a < i
                    WriteString(#DATABASE, #CRLF$)
               EndIf
          Next
          CloseFile(#DATABASE)
     EndIf
EndProcedure

Procedure.s GetXMLData(XMLTag$, String$)
     XMLTag_Open$ = "<" + XMLTag$ + ">"
     XMLTag_Close$ = "</" + XMLTag$ + ">"
     XMLTag_StartPosition = FindString(String$, XMLTag_Open$, 1)
     XMLTag_Open_Length = Len(XMLTag_Open$)
     XMLTag_Open_EndPoint = XMLTag_StartPosition + XMLTag_Open_Length
     XMLTag_Close_StartPosition = FindString(String$, XMLTag_Close$, XMLTag_StartPosition)
     ReturnData_Length = XMLTag_Close_StartPosition - XMLTag_Open_EndPoint
     ReturnData$ = Mid(String$, XMLTag_Open_EndPoint, ReturnData_Length)
     ProcedureReturn ReturnData$
EndProcedure

Procedure.s GetXMLData2(XMLTag$, String$)
     XMLTag_Open$ = "<" + XMLTag$ + Chr(160) + ">"
     XMLTag_Close$ = "</" + XMLTag$ + Chr(160) + ">"
     XMLTag_StartPosition = FindString(String$, XMLTag_Open$, 1)
     XMLTag_Open_Length = Len(XMLTag_Open$)
     XMLTag_Open_EndPoint = XMLTag_StartPosition + XMLTag_Open_Length
     XMLTag_Close_StartPosition = FindString(String$, XMLTag_Close$, XMLTag_StartPosition)
     ReturnData_Length = XMLTag_Close_StartPosition - XMLTag_Open_EndPoint
     ReturnData$ = Mid(String$, XMLTag_Open_EndPoint, ReturnData_Length)
     ProcedureReturn ReturnData$
EndProcedure



;- Auction window procedure
Procedure open_winAUCTION()
     If newitem = 1
          wintitle$ = "New Item"
     Else
          wintitle$ = "Edit Item"
     EndIf
     OpenWindow(#winAUCTION, 0, 0, 714, 477, wintitle$, #PB_Window_WindowCentered, WindowID(#winMAIN))
          CreateGadgetList(WindowID(#winAUCTION))
               ButtonGadget(#AUCTION_btn_save, 600, 440, 100, 25, "Save", #PB_Button_Default)
               ButtonGadget(#AUCTION_btn_cancel, 490, 440, 100, 25, "Cancel")
               StringGadget(#AUCTION_item_title, 80, 30, 280, 20, "")
                    SetGadgetText(#AUCTION_item_title, auction_title$)
               TextGadget(#PB_Any, 20, 33, 50, 20, "Item Title:")
               StringGadget(#AUCTION_item_subtitle, 80, 60, 280, 20, "")
                    SetGadgetText(#AUCTION_item_subtitle, auction_subtitle$)
               TextGadget(#PB_Any, 20, 63, 50, 20, "Subtitle:")
               StringGadget(#AUCTION_item_qty, 310, 90, 50, 20, "")
                    SetGadgetText(#AUCTION_item_qty, auction_qty$)
               TextGadget(#PB_Any, 270, 93, 30, 20, "Qty:")
               Frame3DGadget(#PB_Any, 10, 10, 360, 110, "Item Information")
               TextGadget(#PB_Any, 20, 153, 30, 20, "Start:")
               StringGadget(#AUCTION_item_reserve, 170, 150, 60, 20, "")
                    SetGadgetText(#AUCTION_item_reserve, auction_reserve$)
               TextGadget(#PB_Any, 120, 153, 50, 20, "Reserve:")
               StringGadget(#AUCTION_item_price, 50, 150, 60, 20, "")
                    SetGadgetText(#AUCTION_item_price, auction_price$)
               TextGadget(#PB_Any, 240, 153, 60, 20, "Buy It Now:")
               StringGadget(#AUCTION_item_buyitnow, 300, 150, 60, 20, "")
                    SetGadgetText(#AUCTION_item_buyitnow, auction_buynow$)
               Frame3DGadget(#PB_Any, 10, 130, 360, 50, "Pricing")
               StringGadget(#AUCTION_item_cat1, 50, 210, 90, 20, "")
                    SetGadgetText(#AUCTION_item_cat1, auction_cat1$)
               StringGadget(#AUCTION_item_cat2, 230, 210, 90, 20, "")
                    SetGadgetText(#AUCTION_item_cat2, auction_cat2$)
               Frame3DGadget(#PB_Any, 10, 190, 360, 50, "Category")
               TextGadget(#PB_Any, 20, 213, 30, 20, "1st:")
               TextGadget(#PB_Any, 200, 213, 30, 20, "2nd:")
               ButtonGadget(#AUCTION_btn_cat1, 150, 210, 30, 20, "...")
               ButtonGadget(#AUCTION_btn_cat2, 330, 210, 30, 20, "...")
               PanelGadget(#AUCTION_panel, 380, 10, 320, 230)
               AddGadgetItem(#AUCTION_panel, -1, "Pictures")
               ListViewGadget(#AUCTION_images, 8, 8, 300, 150)
               ButtonGadget(#AUCTION_btn_addimage, 228, 168, 80, 25, "Add")
               ButtonGadget(#AUCTION_btn_deleteimage, 138, 168, 80, 25, "Remove")
               AddGadgetItem(#AUCTION_panel, -1, "Upgrades")
               CheckBoxGadget(#AUCTION_check_bold, 58, 48, 100, 20, "Bold")
                    If auction_bold$ = "1" : SetGadgetState(#AUCTION_check_bold, #True) : EndIf
               CheckBoxGadget(#AUCTION_check_border, 58, 68, 100, 20, "Border")
                    If auction_border$ = "1" : SetGadgetState(#AUCTION_check_border, #True) : EndIf
               CheckBoxGadget(#AUCTION_check_highlight, 58, 88, 100, 20, "Highlight")
                    If auction_highlight$ = "1" : SetGadgetState(#AUCTION_check_highlight, #True) : EndIf
               AddGadgetItem(#AUCTION_panel, -1, "Payment")
               CheckBoxGadget(#AUCTION_check_paypal, 58, 38, 100, 20, "PayPal")
                    If auction_usepaypal$ = "1" : SetGadgetState(#AUCTION_check_paypal, #True) : EndIf
               StringGadget(#AUCTION_item_paypalemail, 58, 58, 170, 20, "")
                    SetGadgetText(#AUCTION_item_paypalemail, auction_paypaladdress$)
               CheckBoxGadget(#AUCTION_check_check, 58, 98, 160, 20, "Personal check")
                    If auction_check$ = "1" : SetGadgetState(#AUCTION_check_check, #True) : EndIf
               CheckBoxGadget(#AUCTION_check_mo, 58, 118, 160, 20, "Money order/cashier's check")
                    If auction_mo$ = "1" : SetGadgetState(#AUCTION_check_mo, #True) : EndIf
               CheckBoxGadget(#AUCTION_check_other, 58, 138, 160, 20, "Other, see item description")
                    If auction_other$ = "1" : SetGadgetState(#AUCTION_check_other, #True) : EndIf
               AddGadgetItem(#AUCTION_panel, -1, "Shipping")
                    ComboBoxGadget(#AUCTION_shippingtype, 58, 40, 150, 20)
                         AddGadgetItem(#AUCTION_shippingtype, 0, "Flat rate")
                         SetGadgetText(#AUCTION_shippingtype, "Flat rate")
                    StringGadget(#AUCTION_shipping, 108, 70, 100, 20, "")
                         TextGadget(#PB_Any, 58, 73, 50, 20, "Amount:")
                         SetGadgetText(#AUCTION_shipping, auction_shipping$)
               ;AddGadgetItem(#AUCTION_panel, -1, "Template")
               CloseGadgetList()
               Frame3DGadget(#PB_Any, 10, 250, 690, 180, "Description:")
               EditorGadget(#AUCTION_item_description, 20, 270, 670, 150)
                    SetGadgetText(#AUCTION_item_description, ReplaceString(auction_description$, Chr(167), #CRLF$))
               
               If auction_images$ <> ""
                    countimages = CountString(auction_images$, Chr(167))
                    For a = 1 To countimages + 1
                         AddGadgetItem(#AUCTION_images, -1, StringField(auction_images$, a, Chr(167)))
                    Next
               EndIf
EndProcedure



;- Preferences window procedure
Procedure open_winPREFS()
     OpenWindow(#winPREFS, 0, 0, 450, 300, "Preferences", #PB_Window_WindowCentered, WindowID(#winMAIN))
          CreateGadgetList(WindowID(#winPREFS))
               ButtonGadget(#PREFS_btn_save, 340, 265, 100, 25, "Save", #PB_Button_Default)
               ButtonGadget(#PREFS_btn_cancel, 230, 265, 100, 25, "Cancel")
               PanelGadget(#PREFS_panel, 10, 10, 430, 245)
                    AddGadgetItem(#PREFS_panel, 1, "Application")
                         CheckBoxGadget(#PREFS_check_update, 50, 50, 250, 20, "Update categories on startup")
                              If prefs_update$ = "1"
                                   SetGadgetState(#PREFS_check_update, #True)
                              EndIf
                    AddGadgetItem(#PREFS_panel, 2, "Image Hosting")
                         OptionGadget(#PREFS_check_imageother, 50, 30, 200, 20, "Use other image hosting")
                         OptionGadget(#PREFS_check_imagegoop, 50, 60, 200, 20, "Use AuctionGoop picture service")
                         StringGadget(#PREFS_goop_username, 160, 100, 100, 20, "")
                              SetGadgetText(#PREFS_goop_username, prefs_user$)
                         TextGadget(#PB_Any, 100, 103, 50, 20, "Username:")
                         StringGadget(#PREFS_goop_password, 160, 130, 100, 20, "", #PB_String_Password)
                         SetGadgetText(#PREFS_goop_password, prefs_pass$)
                         TextGadget(#PB_Any, 100, 133, 50, 20, "Password:")
                              If prefs_host$ = "1"
                                   SetGadgetState(#PREFS_check_imagegoop, #True)
                              Else
                                   SetGadgetState(#PREFS_check_imageother, #True)
                                   DisableGadget(#PREFS_goop_password, #True)
                                   DisableGadget(#PREFS_goop_username, #True)
                              EndIf
                         ButtonGadget(#PREFS_btn_goopsignup, 250, 60, 100, 20, "Sign Up")
                    AddGadgetItem(#PREFS_panel, 3, "Disclaimer")
                         EditorGadget(#PREFS_edit_disclaimer, 10, 10, 405, 200)
                              SetGadgetText(#PREFS_edit_disclaimer, prefs_disclaimer$)
                    AddGadgetItem(#PREFS_panel, 4, "Shipping Policy")
                         EditorGadget(#PREFS_edit_shipping, 10, 10, 405, 200)
                              SetGadgetText(#PREFS_edit_shipping, prefs_shipping$)
                    AddGadgetItem(#PREFS_panel, 5, "Return Policy")
                         EditorGadget(#PREFS_edit_return, 10, 10, 405, 200)
                              SetGadgetText(#PREFS_edit_return, prefs_return$)
               CloseGadgetList()
EndProcedure

Procedure SavePrefs()
     If GetGadgetState(#PREFS_check_update) = #False
          update = #False
     Else
          update = #True
     EndIf
     
     If GetGadgetState(#PREFS_check_imagegoop) = #False
          host = #False
     Else
          host = #True
     EndIf
     
     save$ = "##### CONFIG #####" + #CRLF$
     save$ + "<update" + Chr(160) + ">" + Str(update) + "</update" + Chr(160) + ">" + #CRLF$
     save$ + "<host" + Chr(160) + ">" + Str(host) + "</host" + Chr(160) + ">" + #CRLF$
     save$ + "<user" + Chr(160) + ">" + GetGadgetText(#PREFS_goop_username) + "</user" + Chr(160) + ">" + #CRLF$
     save$ + "<pass" + Chr(160) + ">" + GetGadgetText(#PREFS_goop_password) + "</pass" + Chr(160) + ">" + #CRLF$
     save$ + "<disclaimer" + Chr(160) + ">" + GetGadgetText(#PREFS_edit_disclaimer) + "</disclaimer" + Chr(160) + ">" + #CRLF$
     save$ + "<shipping" + Chr(160) + ">" + GetGadgetText(#PREFS_edit_shipping) + "</shipping" + Chr(160) + ">" + #CRLF$
     save$ + "<return" + Chr(160) + ">" + GetGadgetText(#PREFS_edit_return) + "</return" + Chr(160) + ">" + #CRLF$
     save$ + "##### CONFIG #####"

     CreateFile(200, "config.xml")
          WriteStringN(200, save$)
     CloseFile(200)
EndProcedure

Procedure GetPrefs()
     configfile = ReadFile(#CONFIGFILE, "config.xml")

     If configfile
          While Eof(#CONFIGFILE) = 0
               ConfigData$ + ReadString(#CONFIGFILE) + #CRLF$
          Wend
          CloseFile(#CONFIGFILE)
     EndIf

     ConfigData$ = ReplaceString(ConfigData$, Chr(1), #CRLF$)

     prefs_update$ = GetXMLData2("update", ConfigData$)
     prefs_disclaimer$ = GetXMLData2("disclaimer", ConfigData$)
     prefs_shipping$ = GetXMLData2("shipping", ConfigData$)
     prefs_return$ = GetXMLData2("return", ConfigData$)
     prefs_host$ = GetXMLData2("host", ConfigData$)
     prefs_user$ = GetXMLData2("user", ConfigData$)
     prefs_pass$ = GetXMLData2("pass", ConfigData$)
EndProcedure



;- Load auction data from #DATA_GADGET into variables
Procedure LoadAuctionData()
     auction_title$ = GetGadgetItemText(#DATA_GADGET, GetGadgetState(#MAIN_GRID), 0)
     auction_subtitle$ = GetGadgetItemText(#DATA_GADGET, GetGadgetState(#MAIN_GRID), 1)
     auction_qty$ = GetGadgetItemText(#DATA_GADGET, GetGadgetState(#MAIN_GRID), 2)
     auction_price$ = GetGadgetItemText(#DATA_GADGET, GetGadgetState(#MAIN_GRID), 3)
     auction_reserve$ = GetGadgetItemText(#DATA_GADGET, GetGadgetState(#MAIN_GRID), 4)
     auction_buynow$ = GetGadgetItemText(#DATA_GADGET, GetGadgetState(#MAIN_GRID), 5)
     auction_cat1$ = GetGadgetItemText(#DATA_GADGET, GetGadgetState(#MAIN_GRID), 6)
     auction_cat2$ = GetGadgetItemText(#DATA_GADGET, GetGadgetState(#MAIN_GRID), 7)
     auction_bold$ = GetGadgetItemText(#DATA_GADGET, GetGadgetState(#MAIN_GRID), 8)
     auction_border$ = GetGadgetItemText(#DATA_GADGET, GetGadgetState(#MAIN_GRID), 9)
     auction_highlight$ = GetGadgetItemText(#DATA_GADGET, GetGadgetState(#MAIN_GRID), 10)
     auction_paypaladdress$ = GetGadgetItemText(#DATA_GADGET, GetGadgetState(#MAIN_GRID), 11)
     auction_usepaypal$ = GetGadgetItemText(#DATA_GADGET, GetGadgetState(#MAIN_GRID), 12)
     auction_check$ = GetGadgetItemText(#DATA_GADGET, GetGadgetState(#MAIN_GRID), 13)
     auction_mo$ = GetGadgetItemText(#DATA_GADGET, GetGadgetState(#MAIN_GRID), 14)
     auction_other$ = GetGadgetItemText(#DATA_GADGET, GetGadgetState(#MAIN_GRID), 15)
     auction_shipping$ = GetGadgetItemText(#DATA_GADGET, GetGadgetState(#MAIN_GRID), 16)
     auction_images$ = GetGadgetItemText(#DATA_GADGET, GetGadgetState(#MAIN_GRID), 17)
     auction_description$ = GetGadgetItemText(#DATA_GADGET, GetGadgetState(#MAIN_GRID), 18)
EndProcedure



;- Clear auction data variables
Procedure ClearAuctionData()
     auction_title$ = ""
     auction_subtitle$ = ""
     auction_qty$ = ""
     auction_price$ = ""
     auction_reserve$ = ""
     auction_buynow$ = ""
     auction_cat1$ = ""
     auction_cat2$ = ""
     auction_bold$ = ""
     auction_border$ = ""
     auction_highlight$ = ""
     auction_paypaladdress$ = ""
     auction_usepaypal$ = ""
     auction_check$ = ""
     auction_mo$ = ""
     auction_other$ = ""
     auction_shipping$ = ""
     auction_images$ = ""
     auction_description$ = ""
EndProcedure



;- Category window procedure
Procedure open_winCATEGORY()
     OpenWindow(#winCATEGORY, 0, 0, 500, 400, "Select category", #PB_Window_WindowCentered, WindowID(#winAUCTION))
          CreateGadgetList(WindowID(#winCATEGORY))
               ButtonGadget(#CATEGORY_btn_ok, 390, 365, 100, 25, "OK", #PB_Button_Default)
               ButtonGadget(#CATEGORY_btn_cancel, 280, 365, 100, 25, "Cancel")
               TreeGadget(#CATEGORY_tree, 10, 10, 480, 345)
               ListIconGadget(#CATEGORY_database, 0, 0, 0, 0, "", 0) ; category name
                    AddGadgetColumn(#CATEGORY_database, 1, "", 0) ; category id
                    AddGadgetColumn(#CATEGORY_database, 2, "", 0) ; parent id
                    AddGadgetColumn(#CATEGORY_database, 3, "", 0) ; leaf category (true of false)
                    HideGadget(#CATEGORY_database, #True)
               
               catfile = ReadFile(#CATFILE, "categories.db")
               catdata$ = ""
               If catfile
                    While Eof(#CATFILE) = 0
                         catdata$ = ReadString(#CATFILE)
                         catname$ = StringField(catdata$, 3, Chr(167))
                         catid$ = StringField(catdata$, 1, Chr(167))
                         catlevel$ = StringField(catdata$, 2, Chr(167))
                         catleaf$ = StringField(catdata$, 4, Chr(167))

                         AddGadgetItem(#CATEGORY_tree, -1, catname$, 0, Val(catlevel$)-1)
                         AddGadgetItem(#CATEGORY_database, -1, catname$ + Chr(10) + catid$ + Chr(10) + catlevel$ + Chr(10) + catleaf$)
                    Wend
                    CloseFile(#CATFILE)
               EndIf
EndProcedure

Procedure open_winIMAGEURL()
     OpenWindow(#winIMAGEURL, 0, 0, 270, 75, "Add image URL", #PB_Window_WindowCentered, WindowID(#winAUCTION))
          CreateGadgetList(WindowID(#winIMAGEURL))
               StringGadget(#IMAGEURL_address, 10, 10, 250, 20, "http://")
               ButtonGadget(#IMAGEURL_btn_add, 210, 40, 50, 25, "Add", #PB_Button_Default)
               ButtonGadget(#IMAGEURL_btn_cancel, 150, 40, 50, 25, "Cancel")
EndProcedure



;- Downloading window
Procedure open_winDOWNLOADING()
     OpenWindow(#winDOWNLOADING, 0, 0, 300, 200, "Downloading categories...", #PB_Window_WindowCentered, WindowID(#winMAIN))
          CreateGadgetList(WindowID(#winDOWNLOADING))
               ListViewGadget(#DOWNLOADING_list, 10, 10, 280, 145)
                    AddGadgetItem(#DOWNLOADING_list, -1, "Connecting...")
                    ButtonGadget(#DOWNLOADING_cancel, 190, 165, 100, 25, "Cancel")
                    
                    If IsThread(thread) <> #True
                         thread = CreateThread(@DownloadCategories(), 0)
                    EndIf
EndProcedure

Procedure.s EbayHeaders(CallToEbay$)
     EbayHeaders$ = "X-EBAY-API-COMPATIBILITY-LEVEL: " + EbayAPIVersion$ + #CRLF$
     EbayHeaders$ + "X-EBAY-API-DEV-NAME: " + EbayDevName$ + #CRLF$
     EbayHeaders$ + "X-EBAY-API-APP-NAME: " + EbayAppName$ + #CRLF$
     EbayHeaders$ + "X-EBAY-API-CERT-NAME: " + EbayCertName$ + #CRLF$
     EbayHeaders$ + "X-EBAY-API-CALL-NAME: " + CallToEbay$ + #CRLF$
     EbayHeaders$ + "X-EBAY-API-SITEID: 0" + #CRLF$ + "Content-Type: text/xml"
     ProcedureReturn EbayHeaders$
EndProcedure

Procedure.s EbayOfficialTime()
     EbayCall_Data$ = "<?xml version=" + Chr(34) + "1.0" + Chr(34) + "encoding=" + Chr(34) + "utf-8" + Chr(34) + "?>"  + #CRLF$
     EbayCall_Data$ + "<GeteBayOfficialTimeRequest xmlns=" + Chr(34) + "urn:ebay:apis:eBLBaseComponents" + Chr(34) + ">" + #CRLF$
     EbayCall_Data$ + "<RequesterCredentials>" + #CRLF$
     EbayCall_Data$ + "<eBayAuthToken>" + EbayAuthToken$ + "</eBayAuthToken>" + #CRLF$
     EbayCall_Data$ + "</RequesterCredentials>" + #CRLF$
     EbayCall_Data$ + "</GeteBayOfficialTimeRequest>" + CRLF$
     ProcedureReturn EbayCall_Data$
EndProcedure

Procedure.s ConnectToEbay(Call$)
     If CreateFile(999, "ebay.txt")
     CloseFile(999)
     EndIf

     headers.s = EbayHeaders(Call$)
     If Call$ = "GeteBayOfficialTime"
          post_data.s = EbayOfficialTime()
     ElseIf Call$ = "AddItem"
          post_data.s = AddItem()
     EndIf
     
     
     host.s = "api.sandbox.ebay.com"
     get_url.s = "/ws/api.dll"
     result.s = ""
     open_handle = InternetOpen_("None",1,"","",0)
     connect_handle = InternetConnect_(open_handle,host,443,"","",3,0,0)
     request_handle = HttpOpenRequest_(connect_handle,"POST",get_url,"","",0,$800000,0)
     HttpAddRequestHeaders_(request_handle,headers,Len(headers), $80000000 | $20000000)
     post_data_len = Len(post_data)
     send_handle = HttpSendRequest_(request_handle,"",0,post_data,post_data_len)
     Buffer.s = Space(1024)
     bytes_read.l
     total_read.l
     total_read = 0
     Repeat
     InternetReadFile_(request_handle,@Buffer,1024,@bytes_read)
     result = Left(Buffer,bytes_read)
     Buffer = Space(1024)
     
     If OpenFile(999, "ebay.txt")
          FileSeek(999, Lof(999))
          WriteStringN(999, result)
          CloseFile(999)
          Delay(100)
     EndIf
     
     Until bytes_read=0
     
     ProcedureReturn result
EndProcedure




;- Item submission procedure
Procedure.s AddItem()
          LoadAuctionData()
          auction_description$ = ReplaceString(auction_description$, Chr(167), "<br>")
          If auction_images$ <> ""
               countimages = CountString(auction_images$, Chr(167))
               For a = 1 To countimages + 1
                    auction_description$ + "<br><br>"
                    auction_description$ + "<img src=" + Chr(34) + StringField(auction_images$, a, Chr(167)) + Chr(34) + ">"
               Next
          EndIf
          auction_description$ + "<br><br><br><br><br><center><font style=" + Chr(34) + "font-family: Verdana; font-size: 10px;" + Chr(34) + ">This auction designed by XXXXXX</font></center>" + #CRLF$

          EbayCall_Data$ = "<?xml version=" + Chr(34) + "1.0" + Chr(34) + "encoding=" + Chr(34) + "utf-8" + Chr(34) + "?>"  + #CRLF$
          EbayCall_Data$ + "<AddItemRequest xmlns=" + Chr(34) + "urn:ebay:apis:eBLBaseComponents" + Chr(34) + ">" + #CRLF$
          EbayCall_Data$ + "<RequesterCredentials>" + #CRLF$
          EbayCall_Data$ + "<eBayAuthToken>" + EbayAuthToken$ + "</eBayAuthToken>" + #CRLF$
          EbayCall_Data$ + "</RequesterCredentials>" + #CRLF$
          EbayCall_Data$ + "<WarningLevel>High</WarningLevel>" + #CRLF$
          EbayCall_Data$ + "<Item>" + #CRLF$
          EbayCall_Data$ + "<CategoryMappingAllowed>true</CategoryMappingAllowed>" + #CRLF$
          EbayCall_Data$ + "<Country>US</Country>" + #CRLF$
          EbayCall_Data$ + "<Currency>USD</Currency>" + #CRLF$
          EbayCall_Data$ + "<Description><![CDATA[" + auction_description$ + "]]></Description>" + #CRLF$
          EbayCall_Data$ + "<ListingDuration>Days_7</ListingDuration>" + #CRLF$
          EbayCall_Data$ + "<ListingType>Chinese</ListingType>" + #CRLF$
          EbayCall_Data$ + "<Location>San Jose, CA</Location>" + #CRLF$
          EbayCall_Data$ + "<PaymentMethods>PayPal</PaymentMethods>" + #CRLF$
          EbayCall_Data$ + "<PayPalEmailAddress>test@ebay.com</PayPalEmailAddress>" + #CRLF$
          EbayCall_Data$ + "<PrimaryCategory>" + #CRLF$
          EbayCall_Data$ + "<CategoryID>" + auction_cat1$ + "</CategoryID>" + #CRLF$
          EbayCall_Data$ + "</PrimaryCategory>" + #CRLF$
          EbayCall_Data$ + "<Quantity>" + auction_qty$ + "</Quantity>" + #CRLF$
          EbayCall_Data$ + "<Site>US</Site>" + #CRLF$
          EbayCall_Data$ + "<StartPrice currencyID=" + Chr(34) + "USD" + Chr(34) + ">" + auction_price$ + "</StartPrice>" + #CRLF$
          EbayCall_Data$ + "<Title>" + auction_title$ + "</Title>" + #CRLF$
          
          If auction_bold$ = "1" : EbayCall_Data$ + "<ListingEnhancement>BoldTitle</ListingEnhancement>" + #CRLF$ : EndIf
          If auction_border$ = "1" : EbayCall_Data$ + "<ListingEnhancement>Border</ListingEnhancement>" + #CRLF$ : EndIf
          If auction_highlight$ = "1" : EbayCall_Data$ + "<ListingEnhancement>Highlight</ListingEnhancement>" + #CRLF$ : EndIf
          If auction_subtitle$ <> "" : EbayCall_Data$ + "<SubTitle>" + auction_subtitle$ + "</SubTitle>" + #CRLF$ : EndIf
          If auction_reserve$ <> "" : EbayCall_Data$ + "<ReservePrice>" + auction_reserve$ + "</ReservePrice>" + #CRLF$ : EndIf
          If auction_buynow$ <> "" : EbayCall_Data$ + "<BuyItNowPrice>" + auction_buynow$ + "</BuyItNowPrice>" + #CRLF$ : EndIf
          If auction_check$ = "1" : EbayCall_Data$ + "<PaymentMethods>PersonalCheck</PaymentMethods>" + #CRLF$ : EndIf
          If auction_mo$ = "1" : EbayCall_Data$ + "<PaymentMethods>MOCC</PaymentMethods>" + #CRLF$ : EndIf
          If auction_other$ = "1" : EbayCall_Data$ + "<PaymentMethods>PaymentSeeDescription</PaymentMethods>" + #CRLF$ : EndIf
          If auction_usepaypal$ = "1"
               EbayCall_Data$ + "<PaymentMethods>PayPal</PaymentMethods>" + #CRLF$
               EbayCall_Data$ + "<PayPalEmailAddress>" + auction_paypaladdress$ + "</PayPalEmailAddress>" + #CRLF$
          EndIf
          
          EbayCall_Data$ + "</Item>" + #CRLF$
          EbayCall_Data$ + "</AddItemRequest>" + #CRLF$
          ProcedureReturn EbayCall_Data$
EndProcedure



;- Download categories procedure
Procedure.s DownloadCategories()
     If CreateFile(#CATFILE, "categories.tmp")
          CloseFile(#CATFILE)
     EndIf
     
     
     headers.s = EbayHeaders("GetCategories")
     post_data.s = "<?xml version=" + Chr(34) + "1.0" + Chr(34) + "encoding=" + Chr(34) + "utf-8" + Chr(34) + "?>"  + #CRLF$
     post_data.s + "<GetCategoriesRequest xmlns=" + Chr(34) + "urn:ebay:apis:eBLBaseComponents" + Chr(34) + ">" + #CRLF$
     post_data.s + "<RequesterCredentials>" + #CRLF$
     post_data.s + "<eBayAuthToken>" + EbayAuthToken$ + "</eBayAuthToken>" + #CRLF$
     post_data.s + "</RequesterCredentials>" + #CRLF$
     post_data.s + "<DetailLevel>ReturnAll</DetailLevel>" + #CRLF$
     post_data.s + "<LevelLimit>2</LevelLimit>" + #CRLF$
     post_data.s + "</GetCategoriesRequest>"

     host.s = "api.sandbox.ebay.com"
     get_url.s = "/ws/api.dll"
     result.s = ""
     open_handle = InternetOpen_("None",1,"","",0)
     connect_handle = InternetConnect_(open_handle,host,443,"","",3,0,0)
     request_handle = HttpOpenRequest_(connect_handle,"POST",get_url,"","",0,$800000,0)
     HttpAddRequestHeaders_(request_handle,headers,Len(headers), $80000000 | $20000000)
     post_data_len = Len(post_data)
     send_handle = HttpSendRequest_(request_handle,"",0,post_data,post_data_len)
     Buffer.s = Space(1024)
     bytes_read.l
     total_read.l
     total_read = 0
     Repeat
     InternetReadFile_(request_handle,@Buffer,1024,@bytes_read)
     result = Left(Buffer,bytes_read)
     Buffer = Space(1024)
     
     addnewtodownloadlist = #True
     currentbytesdownloaded + 1024
     
     
     If OpenFile(#CATFILE, "categories.tmp")
          FileSeek(#CATFILE, Lof(#CATFILE))
          WriteString(#CATFILE, result)
          CloseFile(#CATFILE)
     EndIf
     

     
     Until bytes_read=0
     
     processcategories = #True
     
     close_winDOWNLOADING = #True
     addnewtodownloadlist = #False
     currentbytesdownloaded = 0
     createdownloadthread = #False
     result = ""
EndProcedure

Procedure ProcessCategories(*CurrentNode, CurrentSublevel)
     
     If XMLNodeType(*CurrentNode) = #PB_XML_Normal
          *ChildNode = ChildXMLNode(*CurrentNode)
          
          While *ChildNode <> 0
               nodename$ = GetXMLNodeName(*ChildNode)
               nodetext$ = GetXMLNodeText(*ChildNode)
               
               If nodename$ = "CategoryID"
                    text$ + nodetext$ + Chr(167)
               EndIf
               
               If nodename$ = "CategoryLevel"
                    text$ + nodetext$ + Chr(167)
               EndIf
               
               If nodename$ = "CategoryName"
                    text$ + nodetext$ + Chr(167)
               EndIf
               
               If nodename$ = "LeafCategory"
                    text$ + nodetext$ + #CRLF$
                    currentcat + 1
                    ;SetGadgetText(9, Str(currentcat))
                    count + 1
                    
                    ;If count = 5
                         OpenFile(999, "categories.db")
                              FileSeek(999, Lof(999))
                              ;MessageRequester("FDDS", text$)
                              WriteString(999, text$)
                         CloseFile(999)
                         count = 0
                         text$ = ""
                    ;EndIf
               EndIf
               
               ProcessCategories(*ChildNode, CurrentSublevel + 1)
               *ChildNode = NextXMLNode(*ChildNode)
          Wend
     EndIf
EndProcedure
User avatar
DoubleDutch
Addict
Addict
Posts: 3220
Joined: Thu Aug 07, 2003 7:01 pm
Location: United Kingdom
Contact:

Post by DoubleDutch »

Thanks :D
https://deluxepixel.com <- My Business website
https://reportcomplete.com <- School end of term reports system
Post Reply