File: Changes

package info (click to toggle)
snap 0.08-2
  • links: PTS
  • area: main
  • in suites: woody
  • size: 440 kB
  • ctags: 473
  • sloc: perl: 7,033; makefile: 117; sh: 70
file content (370 lines) | stat: -rw-r--r-- 14,228 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
0.07 to 0.08
------------

* Added version numbers and load status printout for the encoder scripts.

* Greatly simplified the colour parsing code in the interface scripts...
  all the things I didn't know about regexp in Perl. :)

* More error reporting... this time on invalid server or metaserver
  parameters.

* Fixed a bug in command parsing which caused trailing whitespace to be
  treated significantly.

* Changed /filter to /results, to reflect is more generalized functionality
  of re-displaying search results with various filters, etc.

* Added a -sort flag to /filter and /search, as per a suggestion from
  Myers Carpenter.  -sort takes one or more fields, which are used to
  sort search results.

* Added -sort and -regex flags to the /browse command.

* Changed the way the GTK GUI handles getting search results, so that the
  aforementioned sorting changes are reflected in the GUI.

* Fixed the COUNT option bug that so many people reported. :)

* Tweaked text parsing so if there are mismatched quotes in input, the
  code doesn't die() a horrible death. :)  Funny thing is, I don't remember
  why I did it like that in the first place...

* Modified the command_hash so that strings can be inserted as callbacks,
  which are evaluated as commands.  What this means is you can do stuff
  like:

    push @{ $code_hash{&MSG_JOIN_ACK} }, "/send I have arrived!"

  or

    push @{ $code_hash{&MSG_DISCONNECT} }, "/reconnect"

* SOCKSv4 and v5 support added through the use of Net::SOCKS.  Unfortunately,
  SOCKS-based file transfers currently use blocking connects, which sucks...
  but, at least it works (I think :).


===============================================================================


0.06 to 0.07
------------

* Split the cache update code off into a seperate function which is called
  during program initialization (MSG_INIT hook).  Should've done this a 
  while ago. :)

* Cleaned up the cache management code a little bit.  I should probably do
  this in the rest of the code, too, but I'm lazy. :)

* Added filename encoding framework and an example pig latin encoder.

* Added auto-encoding to the /search command.  Add -encode flag to use it.


===============================================================================


0.05 to 0.06
------------

* Fixed a bug in the help code which caused CODE references to not be
  properly executed.  Thanks to Glendon Johnson for the heads up.

* Modified the file index code to sort the file entries before submitting
  to the server.  Again, thanks to Glendon Johnson for the suggestion.

* Changed the Snap version in the code.  Whoops!  Thanks to Iain Lea. :)


===============================================================================


0.04 to 0.05
------------

This release is mostly about stability:

* Updated interface scripts so they recover nicely if required modules are
  missing.

* Similarly, cleaned up the toolkit import scripts to recover cleanly.

* Cleaned up perl eval code so errors are recovered from gracefully.  This,
  Snap no longer crashes when you try to call an undefined function from /eval.


===============================================================================


0.03 to 0.04
------------

This version is yet another architectural evolution.  The change to 
use of %handles hash for event loop hooking, further separation of
GUI from core code, and many other changes, make this a hefty new
version as well. :)

* More stability! :)  Uploads in the last version were rather broken.
  Hopefully those issues are fixed in this version.  Testing is gooood...

* Changed keyboard handling to add additional backspace mapping for UK
  keyboards.

* Changed /eval to use eval_file() for evaluating script files, and added
  appropriate error output to eval_file().  This means Snap outputs nice
  errors when the RC file isn't found, amongst other things.

* Added -f command-line option, which specifies a script to load on
  startup before the rcfile is loaded.  This allows, for example:

  snap -f Gtk.pl

* Moved SnapGtk into the scripts directory, and now treat it like a true
  script.  As well, SnapGtk is now known as just plain Gtk.

* Created the Curses interface script, similar in spirit to the Gtk script.
  This means that you can choose to load the Curses module or not.

* Created the Plain interface script, which provides a plain text interface
  with colour codes stripped out.

* Updated the default snaprc file with the new interface loading commands.  
  Also simplified and cleaned up the script.

* Created the new Sock module, for controlling Snap through a TCP/IP socket.

* Created the new %handles variable, which contains a hash which maps
  sockets and handlers, in the following structure:

    "$sock"  =>   { Handle => $sock, Callback => \&sub }

  This structure is used to add user handles to the event loop of Snap.
  See the sock.pl script for an example use.  This idea was inspired by
  a similar mechanism in Net::IRC.

  See the Gtk.pl script for how wrapper scripts can use tie() to intercept
  additions to the %handles variable to incorporate them into their
  event loops.

* Due to the existence of the new %handles variable, I've completely
  removed the input code from the main snap script, and placed it in the
  interface scripts.  As well, I've taken out any remaining window
  dependancies (clear, pageup/down) so the interface code is now totally
  segregated from the main snap script.

* Added MSG_SHUTDOWN message type, to allow hooking into the shutdown
  procedure.  Now used in the Curses module to call endwin() at the
  appropriate time.

* Added MSG_INIT.  Changed interface code to use MSG_INIT to initialize
  themselves, and then overwrite main_loop() if necessary.  snaprc script
  changed to use MSG_INIT for loading scripts.  Modified snap to use MSG_INIT
  to set up server and Napster connection.

* Changed cache behaviour so entries are allowed only if the file exists
  and it is in the correct upload directory.

* Changed hotlist and cache behaviour to not create data files if there
  are no entries.

* /clear works again in the Curses interface. :)

* Changed all downloads, uploads, server, etc, to use the new %handles
  hash for hooking into the event loop.  This is much more interface
  independant, and a much more pleasant way to implement things.

* Changed Gtk script so it properly uses %handles for event handling.

* Fixed hotlist and cache saving so, if the file can't be created, an
  appropriate error is displayed.

* Added support for file type in OpenNap searches.

* Improved documentation in example snaprc file, including some undocumented 
  variables, like the max upload speed and queue limit variables.

* Fixed upload speed throttling code.

* Fixed "sent" field updating in Uploads list.

* Changed Remote so it doesn't advertise itself in your client ID, as a
  security precaution.

* Fixed bug in filter labeling all returned results as number 1.

* Added ability to specify messages to trace for debugging purposes.

* Added ability to specify which debug messages to log to file for debugging.

* Split the Gtk module into a library import module and the actual GUI
  module.  This allows you to use Gtk with other interface modules like
  Curses or Plain, if you want to do that.  Or you could implement a
  different GUI entirely while reusing the Gtk import module.

* Split off the %handles wrapper object into a seperate object in the
  SnapLib directory, to make it easier to wrap Snap in another event model.
  
* Due to the previous change, we now have the TkImport module, for wrapping
  Snap in Perl/Tk.

* Wrote rudimentary Perl/Tk interface script.  Provides an input line and
  a fully-functional text window.

* Cleaned up file transfer callbacks (the INIT and START callbacks) for ULs
  and DLs so the called functions receive the same hash, and the START
  callback no longer hash an old_hash and new_hash argument.

* Fixed the Time::HiRes dependency for uploads.  You should be able to
  operate quite happily without it now. :)

* Added proper error handling for all sysread() and syswrite() calls.  This
  should help to clear up file transfer bugs... we'll see, though.

* Extended the ul_kill and dl_kill functions to take upload/download structure
  references.  This was exploited to greatly clean up the process reaper.


===============================================================================


0.03 to 0.03a
-------------

* Fixed a major bug in the upload code which caused a crash of the client.


===============================================================================


0.02 to 0.03
------------

Oy, too many to count.  I'll split them into two groups.  Ones visible
at the user level, and others visible at the developer and script
writer's levels.

User-Level Changes
------------------

* The ability to run Snap without needing Curses or other modules.  The
  interface defaults to a bare, text-mode interface if these modules
  aren't loaded.

* Fixed bugs in option handling.  So /exec is fixed, among other things.
  (You can again just do this:  /exec command).

* Improved Curses input line.  Supports ^D key for deleting characters, and
  the scrollback buffer now exhibits the same behaviour as GNU readline 
  (I think :).

* Improved Curses text window, supporting better scrollback buffer (less
  glitchy, I think) and support for colours using a custom colour-code
  system akin to Ksirc.  Of course, along with all of this comes a slight
  speed degradation... doh! :)

* GTK GUI module!  Need I say more? ;)  It's rough, but the basic functions
  are there.  And in time, more and more functionality will be incorporated.

* The remote.pl script, which allows control of snap via private messages,
  has been totally revamped to take advantage of some of Snap's new
  architecture changes.  Thus, it is MUCH more stable and less hacky. :)

* Stability!  Always good... helps when you handle errors correctly. :)

* Parameters to commands are case insensitive (as it should have been
  originally).  Thanks to Guenter for noticing this. :)  Along with
  this, the help was updated to be more consistent in terms of option 
  case (even if this doesn't matter :).

* Simpler installation process which doesn't require changes to the Snap
  script.

* Creation of a SCRIPT_PATH variable to ease the loading of external scripts.

* Implementation of a download queue.  This is new code, so it's rough. :)
  See /queue command or queue interface in GUI.

* Addition of ETA information to the file transfers. 

* Transfer information (eg rate and ETA) are updated on a one second basis, 
  ensuring constant information update without excessive update speeds (which 
  results in poor application performance, particularly for GUIs).

* Addition of no-color operating mode.

* Ability to alias commands to one another by putting the string of
  the aliased command straight into the command hash.  eg:

  $command_hash{"/k"} = "/dl -kill";

  And added /alias command to do just this.


Developer-Level Changes
-----------------------

Well, this is pretty hefty... :)

* Changed windowing and input routines to use nice objects.  Now we have
  a SnapLib directory, with SnapLib::Window, SnapLib::InputLine, 
  SnapLib::StdWindow, and SnapLib::StdinLine modules.

* Changed printing code to use tie'd STDOUT instead of object or function
  calls.  Simplifies things and reduces dependancies between the interface
  and low-level functions.

* Due to the aforementioned changes, and some review of the code, I've
  decided to no longer pass the cmdwin and textwin variables around.
  These are rarely used in callbacks, and even less-so now, since the
  do_command() function was modified to take a command string.  This is
  going to break a LOT of scripts (assuming there are a lot ;).

* Changed the screen output code to allow for colour codes to specify...
  well... colours. :)  Format is as follows:  ~<num>; where num is a
  colour number.  ~c; is used to indicated the ending of a colour region.

* Napster communication now done through a new NapSocket object.  Encapsulates
  the Napster communication code very nicely, and could easily be stolen
  by other projects, if they like. :)  Now all writes to Napster go
  through $sock->send(MSG_TYPE, DATA).

* All Napster message types are stored in SnapLib::MessageTypes.  Again,
  this is a nice, modular package, so you can use it in your own stuff
  if you want. :)

* Objects created for doing the raw upload and download transactions.
  Handshaking is still done in the main app, but the objects are used to
  perform the actual transfers.

* A lot of hooks have been added for server connections and UL/DLs, to
  facilitate the new GUI and allow more flexibility in scripting.

* Error handling, Error handling, Error handling.  I've finally added
  code to handle errors in places where I just didn't bother out of
  sheer laziness, or because I was "going to get to that later". :)

* Modified the process reaper code, to make it more stable and handle
  large dl/ul deaths to be dealt with gracefully.  Also, a non-blocking
  waitpid is now used, which helps to keep program flow smooth.

* Help system changed so functions registered in %help_hash simply
  return a text string containing the help text, rather than printing
  themselves.  This makes it possible to extend the help system more
  easily, since there is greater control over display.

* I found out about "use lib ..." :)  So libraries are loaded using
  script-relative paths.

* Command and code callbacks can now be arrays of function references,
  or function references themselves.  This is mostly for convenience.

* Download and Upload status update callbacks are called on a one-second
  basis through the transfer, regardless of it's state (stalled, etc),
  improving application performance and user feedback.

* Changed download semantics, so an entry is adding immediately when a
  request is sent, rather than when a response is returned.  This makes
  more sense, and makes it easier to manage downloads (you can kill
  downloads waiting for a request response, etc).