XDCC-Fetch 1.386

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. data/COPYING +23 -0
  2. data/XDCC-Fetch.rbw +54 -0
  3. data/doc/ark.png +0 -0
  4. data/doc/connect_established.png +0 -0
  5. data/doc/index.html +300 -0
  6. data/doc/mega_ark.png +0 -0
  7. data/doc/package.png +0 -0
  8. data/doc/package_unknown.png +0 -0
  9. data/doc/shot1.png +0 -0
  10. data/doc/shot1_mini.png +0 -0
  11. data/doc/shot2.png +0 -0
  12. data/doc/shot2_mini.png +0 -0
  13. data/doc/xdccfetch.css +155 -0
  14. data/icons/ark.png +0 -0
  15. data/icons/ark_big.png +0 -0
  16. data/icons/camera_test.png +0 -0
  17. data/icons/cancel.png +0 -0
  18. data/icons/connect_creating.png +0 -0
  19. data/icons/connect_established.png +0 -0
  20. data/icons/connect_failed.png +0 -0
  21. data/icons/connect_no.png +0 -0
  22. data/icons/edit_add.png +0 -0
  23. data/icons/edit_remove.png +0 -0
  24. data/icons/exit.png +0 -0
  25. data/icons/fileclose.png +0 -0
  26. data/icons/folder_inbox.png +0 -0
  27. data/icons/idea.png +0 -0
  28. data/icons/mega_ark.png +0 -0
  29. data/icons/messagebox_critical.png +0 -0
  30. data/icons/messagebox_info.png +0 -0
  31. data/icons/messagebox_warning.png +0 -0
  32. data/icons/messagebox_warning_small.png +0 -0
  33. data/icons/package.png +0 -0
  34. data/icons/package_favourite.png +0 -0
  35. data/icons/package_unknown.png +0 -0
  36. data/src/Console/Console_Parser.rb +71 -0
  37. data/src/Console/XDCC_Pack_Match_Template.rb +29 -0
  38. data/src/Console/xdcc-fetch.rb +123 -0
  39. data/src/GUI/About_Dialog.rb +50 -0
  40. data/src/GUI/Application_Builder.rb +280 -0
  41. data/src/GUI/Context_Menu.rb +81 -0
  42. data/src/GUI/Custom_Tabs.rb +60 -0
  43. data/src/GUI/Dialog_Box.rb +116 -0
  44. data/src/GUI/Download_Finished_Box.rb +41 -0
  45. data/src/GUI/Empty_Text_Field_Handler.rb +86 -0
  46. data/src/GUI/Gui_Logic.rb +629 -0
  47. data/src/GUI/Icon_Loader.rb +58 -0
  48. data/src/GUI/Main_Window.rb +227 -0
  49. data/src/GUI/Packet_Item.rb +171 -0
  50. data/src/GUI/Packet_List.rb +145 -0
  51. data/src/GUI/Speed_Widget.rb +101 -0
  52. data/src/GUI/Talk_Back.rb +118 -0
  53. data/src/GUI/Toggle_Button.rb +56 -0
  54. data/src/Network/CTCP_Handler.rb +61 -0
  55. data/src/Network/DCC_File.rb +323 -0
  56. data/src/Network/DCC_Parser.rb +71 -0
  57. data/src/Network/IPAddr_Ext.rb +76 -0
  58. data/src/Network/IRC_Message.rb +161 -0
  59. data/src/Network/IRC_Server.rb +273 -0
  60. data/src/Network/IRC_Server_Respond_Map.rb +223 -0
  61. data/src/Network/IRC_User.rb +58 -0
  62. data/src/Network/TCP_Connection.rb +168 -0
  63. data/src/Network/XDCC_Announcement.rb +120 -0
  64. data/src/Network/XDCC_Announcement_Storage.rb +167 -0
  65. data/src/Network/XDCC_Download_Handler.rb +412 -0
  66. data/src/Network/XDCC_Pack.rb +58 -0
  67. data/src/Network/XDCC_Parser.rb +253 -0
  68. data/src/Translations/README +61 -0
  69. data/src/Translations/check_translations +83 -0
  70. data/src/Translations/de.rb +140 -0
  71. data/src/Translations/en.rb +145 -0
  72. data/src/Utilities/Configuration.rb +91 -0
  73. data/src/Utilities/Events.rb +87 -0
  74. data/src/Utilities/Globals.rb +138 -0
  75. data/src/Utilities/PrettyException.rb +1091 -0
  76. data/src/Utilities/Recursive_Open_Struct.rb +159 -0
  77. data/src/Utilities/Timer.rb +71 -0
  78. metadata +135 -0
@@ -0,0 +1,58 @@
1
+ # Copyright (c) 2004, 2005 Martin Ankerl
2
+ # All rights reserved.
3
+ #
4
+ # Redistribution and use in source and binary forms, with or without modification,
5
+ # are permitted provided that the following conditions are met:
6
+ #
7
+ # * Redistributions of source code must retain the above copyright notice, this list
8
+ # of conditions and the following disclaimer.
9
+ # * Redistributions in binary form must reproduce the above copyright notice, this list
10
+ # of conditions and the following disclaimer in the documentation and/or other materials
11
+ # provided with the distribution.
12
+ # * Neither the name of Martin Ankerl nor the names of its contributors may be used to
13
+ # endorse or promote products derived from this software without specific prior written
14
+ # permission.
15
+ #
16
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
17
+ # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
18
+ # AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
19
+ # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20
+ # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21
+ # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
22
+ # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
23
+ # OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24
+
25
+
26
+ # Converts a Recursive_Open_Struct that contains filenames of PNG-icons into real icons.
27
+ class Icon_Loader
28
+ # Create a new Icon_Loader. You need to specify the Fox-application.
29
+ def initialize(app)
30
+ @app = app
31
+ end
32
+
33
+ # Takes each attribute of the given Recursive_Open_Struct,
34
+ # converts it into a real icon, and sets it.
35
+ def cfg_to_icons(cfg)
36
+ cfg.attrs.each do |attr|
37
+ value = cfg.send(attr.to_sym)
38
+ if (value.class == Recursive_Open_Struct)
39
+ cfg_to_icons(value)
40
+ else
41
+ # value is a filename
42
+ icon = make_icon(value)
43
+ cfg.send((attr + "=").to_sym, icon)
44
+ end
45
+ end
46
+ end
47
+
48
+ # Constructs an icon from the given filename (from the icons directory).
49
+ def make_icon(filename)
50
+ filename = File.join("icons", filename)
51
+ icon = nil
52
+ File.open(filename, "rb") do |f|
53
+ icon = FXPNGIcon.new(@app, f.read, 0)
54
+ end
55
+ icon.create
56
+ icon
57
+ end
58
+ end
@@ -0,0 +1,227 @@
1
+ # Copyright (c) 2004, 2005 Martin Ankerl
2
+ # All rights reserved.
3
+ #
4
+ # Redistribution and use in source and binary forms, with or without modification,
5
+ # are permitted provided that the following conditions are met:
6
+ #
7
+ # * Redistributions of source code must retain the above copyright notice, this list
8
+ # of conditions and the following disclaimer.
9
+ # * Redistributions in binary form must reproduce the above copyright notice, this list
10
+ # of conditions and the following disclaimer in the documentation and/or other materials
11
+ # provided with the distribution.
12
+ # * Neither the name of Martin Ankerl nor the names of its contributors may be used to
13
+ # endorse or promote products derived from this software without specific prior written
14
+ # permission.
15
+ #
16
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
17
+ # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
18
+ # AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
19
+ # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20
+ # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21
+ # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
22
+ # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
23
+ # OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24
+
25
+ # Load FXRuby: try gem, then Fox 1.2, then Fox 1.0
26
+ begin
27
+ # try fxruby gem
28
+ require 'rubygems'
29
+ require_gem 'fxruby', '>= 1.1.0'
30
+ require 'fox12'
31
+ require 'fox12/colors'
32
+ FOXVERSION="1.2"
33
+ include Fox
34
+ rescue LoadError
35
+ # no gem? try fox12 direct.
36
+ begin
37
+ require "fox12"
38
+ require "fox12/colors"
39
+ FOXVERSION="1.2"
40
+ include Fox
41
+ rescue LoadError
42
+ # no gem, no fox12? try fox 1.0
43
+ require "fox"
44
+ require "fox/colors"
45
+ # grep for FOXVERSION to find all code that depends on this
46
+ FOXVERSION="1.0"
47
+ include Fox
48
+ FXMenuBar = FXMenubar
49
+ FXToolTip = FXTooltip
50
+ FXStatusBar = FXStatusbar
51
+ end
52
+ end
53
+
54
+ require 'thread'
55
+
56
+ require 'src/Utilities/Globals'
57
+ require 'src/Utilities/Configuration'
58
+ require 'src/GUI/Gui_Logic'
59
+ require 'src/GUI/Icon_Loader'
60
+ require 'src/GUI/Empty_Text_Field_Handler'
61
+ require 'src/GUI/Packet_List'
62
+ require 'src/GUI/Custom_Tabs'
63
+ require 'src/GUI/Context_Menu'
64
+ require 'src/GUI/Dialog_Box'
65
+ require 'src/GUI/Speed_Widget'
66
+ require 'src/GUI/Toggle_Button'
67
+ require 'src/GUI/About_Dialog'
68
+ require 'src/GUI/Download_Finished_Box'
69
+ require 'src/GUI/Application_Builder'
70
+ require 'src/GUI/Gui_Logic'
71
+
72
+ require 'src/Network/IRC_Server'
73
+ require 'src/Network/XDCC_Announcement_Storage'
74
+ require 'src/Network/XDCC_Download_Handler'
75
+ require 'src/Network/XDCC_Parser'
76
+
77
+ class FXTreeList
78
+
79
+ attr_reader :clickedItem
80
+
81
+ def init_clickedItem
82
+ self.connect(SEL_LEFTBUTTONPRESS) do |sender, sel, data|
83
+ @clickedItem = self.item_from_pos(data.click_x, data.click_y)
84
+ if @clickedItem
85
+ self.selectItem(@clickedItem, false)
86
+ else
87
+ self.killSelection(false)
88
+ end
89
+ end
90
+
91
+ self.connect(SEL_RIGHTBUTTONPRESS) do |sender, sel, data|
92
+ @clickedItem = self.item_from_pos(data.click_x, data.click_y)
93
+ if @clickedItem
94
+ self.selectItem(@clickedItem, false)
95
+ else
96
+ self.killSelection(false)
97
+ end
98
+ end
99
+ end
100
+
101
+ def hit_rec(x, y, item)
102
+ return item if self.hitItem(item, x, y) != 0
103
+ i = nil
104
+ item.each do |child|
105
+ break if i = self.hit_rec(x, y, child)
106
+ end
107
+ i
108
+ end
109
+
110
+ def item_from_pos(x, y)
111
+ i = nil
112
+ self.each do |item|
113
+ break if i = self.hit_rec(x, y, item)
114
+ end
115
+ i
116
+ end
117
+ end
118
+
119
+ # Responsible for application initialization
120
+ class Main_Window < FXMainWindow
121
+
122
+ # Initializes the XDCC-application.
123
+ def initialize(app)
124
+ #app.disableThreads
125
+ @data = Recursive_Open_Struct.new
126
+ @gui = Recursive_Open_Struct.new
127
+ @logic = Gui_Logic.new(@gui, @data)
128
+
129
+ # load configuration
130
+ @data.config = Configuration.new($cfg)
131
+ @data.config.load
132
+ init_variables
133
+ @data.close
134
+
135
+ # setup main window
136
+ $main_window = self
137
+ super(app, $cfg.app.name, nil, nil, DECOR_ALL, 0, 0, $cfg.app.width, $cfg.app.height)
138
+ set_default_font
139
+ FXToolTip.new(FXApp::instance, TOOLTIP_NORMAL)
140
+
141
+ # load icons
142
+ icon_loader = Icon_Loader.new(FXApp::instance)
143
+ icon_loader.cfg_to_icons($cfg.icons)
144
+ self.icon = $cfg.icons.app_big
145
+ self.miniIcon = $cfg.icons.app
146
+
147
+ # build base layout, and connections to logic.
148
+ @gui.main_window = self
149
+ Application_Builder.new(self, @gui, @data, @logic)
150
+
151
+ # TODO start
152
+ #sleep 1
153
+ #just_testing
154
+ @logic.connect_to_saved_servers
155
+ end
156
+
157
+ # Automatically called when the Fox application is created
158
+ def create
159
+ super
160
+ @logic.update_search_status_text
161
+ show(PLACEMENT_SCREEN)
162
+ end
163
+
164
+ # Set the default font to the first font of $cfg.app.font.name that is available on this system.
165
+ def set_default_font
166
+ # load default font
167
+ font = nil
168
+ $cfg.app.font.name.detect do |name|
169
+ next if FXFont.listFonts(name).empty?
170
+ font = FXFont.new(FXApp::instance, name, $cfg.app.font.size)
171
+ end
172
+ FXApp::instance.normalFont = font if font
173
+ end
174
+
175
+ # TODO remove
176
+ # Set up all variables.
177
+ def init_variables
178
+ @data.match_data = ""
179
+ @data.server_item_to_warning = Hash.new
180
+ @data.packet_icon_to_toggle_btn = Hash.new
181
+ @data.detached_items = Array.new
182
+ @data.allpack_to_item = Hash.new
183
+ @data.gui_mutex = Mutex.new
184
+ @data.irc_server_to_item = Hash.new
185
+ @data.downloadpack_to_item = Hash.new
186
+ @data.server_to_channels = Hash.new
187
+ @data.server_item_to_status = Hash.new
188
+ @data.ann_parser = XDCC_Parser.iroffer_parser
189
+ @data.ann_storage = XDCC_Announcement_Storage.new(@data.ann_parser)
190
+ @data.ann_storage.connect_to_events(XDCC_Announcement_Storage::ON_ANNOUNCEMENT_NEW, @logic)
191
+ @data.ann_storage.connect_to_events(XDCC_Announcement_Storage::ON_ANNOUNCEMENT_LOST, @logic)
192
+ @data.download_handlers = Hash.new
193
+ end
194
+
195
+
196
+
197
+ # debugging stuff
198
+ def just_testing
199
+ icons = [$cfg.icons.packet, $cfg.icons.free_slots, $cfg.icons.slots_unknown]
200
+ 50000.times do |i|
201
+ # set slot representing icon
202
+ icon = icons[rand(3)]
203
+ # create an unconnected item
204
+ item = Packet_Item.new(nil, icon, "bot-#{rand(1e3)}", "#{rand(1e10).to_s(36)}", rand(100).to_s + ["M","K","G"][rand(3)])
205
+ @data.allpack_to_item[i] = item
206
+ # item needs to be added to a list, before calling match()
207
+ item.parent = @gui.packet_list
208
+ #if !@logic.match?(item, @gui.search_field.text.downcase.split)
209
+ # remove if it does not match
210
+ # item.parent = nil
211
+ #else
212
+ # is_added = true
213
+ #end
214
+ #@logic.update_search_status_text
215
+ end
216
+ @logic.update_search_status_text
217
+ #@gui.packet_list.on_cmd_header(2)
218
+ #@gui.packet_list.sortItems
219
+ end
220
+ end
221
+
222
+ Thread.abort_on_exception= true
223
+
224
+ $app = FXApp.new($cfg.app.name, $cfg.app.name)
225
+ $main_window = Main_Window.new($app)
226
+ $app.create
227
+ $app.run
@@ -0,0 +1,171 @@
1
+ # Copyright (c) 2004, 2005 Christoph Heindl and Martin Ankerl
2
+ # All rights reserved.
3
+ #
4
+ # Redistribution and use in source and binary forms, with or without modification,
5
+ # are permitted provided that the following conditions are met:
6
+ #
7
+ # * Redistributions of source code must retain the above copyright notice, this list
8
+ # of conditions and the following disclaimer.
9
+ # * Redistributions in binary form must reproduce the above copyright notice, this list
10
+ # of conditions and the following disclaimer in the documentation and/or other materials
11
+ # provided with the distribution.
12
+ # * Neither the name of Christoph Heindl and Martin Ankerl nor the names of its contributors
13
+ # may be used to endorse or promote products derived from this software without specific
14
+ # prior written permission.
15
+ #
16
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
17
+ # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
18
+ # AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
19
+ # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20
+ # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21
+ # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
22
+ # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
23
+ # OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24
+
25
+
26
+ # An item for Packet_List. This is a convenient wrapper for the FXIconItem.
27
+ class Packet_Item
28
+
29
+ # Fox_Item is a very thin wrapper that calles Packet_Item functionality.
30
+ class Fox_Item < FXIconItem
31
+ # optimization: directly sort by sort_key and reversed
32
+ attr_accessor :sort_key
33
+ attr_accessor :reversed
34
+
35
+ # Create a new item with packet_item as the parent. *args is passed to the FXIconItem.
36
+ def initialize(packet_item, *args)
37
+ @packet_item = packet_item
38
+ @sort_key = nil
39
+ @reversed = 1
40
+ super(*args)
41
+ end
42
+
43
+ # Called from sortItems, uses packet_item's comparison.
44
+ def <=>(other)
45
+ (@sort_key <=> other.sort_key) * @reversed
46
+ end
47
+
48
+ # Get the packet item
49
+ def packet_item
50
+ @packet_item
51
+ end
52
+
53
+ # Pass-through method
54
+ def data
55
+ @packet_item.data
56
+ end
57
+ end
58
+
59
+ # Creates a Packet_Item with newParent as the parent list, which is allowed to be nil.
60
+ # You can also use Packet_List#add_item instead.
61
+ def initialize(newParent, icon, *content)
62
+ @content = content
63
+ @sortable = Array.new(@content.size)
64
+ @icon = icon
65
+ @data = nil
66
+ @parent = nil
67
+ @sort_key = nil
68
+ # call parent=, don't forget the self!!
69
+ self.parent = newParent
70
+ show if newParent
71
+ # update sortable
72
+ @content.each_index do |pos|
73
+ update_sortable(pos, @content[pos]) if parent
74
+ end
75
+ end
76
+
77
+ # Get the content of the given column number.
78
+ def [](column_nr)
79
+ @content[column_nr]
80
+ end
81
+
82
+ # Set new text for the given column number.
83
+ def []=(column_nr, newVal)
84
+ @content[column_nr] = newVal
85
+ return unless @parent
86
+ @item.text = @content.join("\t")
87
+ update_sortable(column_nr, newVal)
88
+ @parent.recalc
89
+ end
90
+
91
+ # Get the sortable representation of this column's content.
92
+ def sortable(pos)
93
+ @sortable[pos]
94
+ end
95
+
96
+ # update FXIconItem's sort key and reversed status
97
+ def update_sort_key
98
+ @item.sort_key = @sortable[@parent.sort_index]
99
+ @item.reversed = @parent.reversed? ? -1 : 1
100
+ end
101
+
102
+ # Get the parent list for this item.
103
+ def parent
104
+ @parent
105
+ end
106
+
107
+ # Set a new parent. This removes this item from the current list and adds itself to
108
+ # the new one.
109
+ def parent=(newParent)
110
+ return if newParent == @parent
111
+ remove_item if @parent
112
+ @parent = newParent
113
+ @content.each_index do |pos|
114
+ update_sortable(pos, @content[pos]) if @parent
115
+ end
116
+ end
117
+
118
+ # Shows item on parent without updating the search index. This can be used
119
+ # if an item is removed and added to the same list.
120
+ def show
121
+ create_item
122
+ @parent.add_item(self)
123
+ end
124
+
125
+ # Get the wrapper item.
126
+ def fox_item
127
+ @item
128
+ end
129
+
130
+ # Allows to set user data.
131
+ def data=(data)
132
+ @data = data
133
+ end
134
+
135
+ # Get user data.
136
+ def data
137
+ @data
138
+ end
139
+
140
+ # Removes the item from its parent.
141
+ def clear
142
+ @parent = nil
143
+ end
144
+
145
+ # The icon of this item.
146
+ def icon
147
+ @icon
148
+ end
149
+
150
+ private
151
+
152
+ # Calles the sort function to update the sortable representation of column pos.
153
+ def update_sortable(pos, newVal)
154
+ sort_function = @parent.sort_function(pos)
155
+ if sort_function
156
+ @sortable[pos] = sort_function.call(newVal)
157
+ else
158
+ @sortable[pos] = newVal
159
+ end
160
+ end
161
+
162
+ # Remove item from parent
163
+ def remove_item
164
+ @parent.remove_item(self)
165
+ end
166
+
167
+ # Creates wrapper item, and sets it's data
168
+ def create_item
169
+ @item = Fox_Item.new(self, @content.join("\t"), @icon, @icon)
170
+ end
171
+ end