X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=ext%2Fext.c;h=6a45359772e325ff0ca6c75f8a265917cb77df76;hb=2f95f6bbefc52f171610f8a4c49157907ced3e14;hp=9c433f285523c12196501363e132a8662f9907e5;hpb=bf1f7624bee5a466b402825083190d3afbd9c28b;p=ruby-vorbistagger.git diff --git a/ext/ext.c b/ext/ext.c index 9c433f2..6a45359 100644 --- a/ext/ext.c +++ b/ext/ext.c @@ -20,10 +20,15 @@ #include #include #include +#include #include "vcedit.h" #include "comments.h" +#define CHECK_CLOSED(o) \ + if (!o->state) \ + rb_raise (eClosed, "closed stream"); + typedef struct { vcedit_state *state; VALUE comments; @@ -31,7 +36,8 @@ typedef struct { static VALUE c_close (VALUE self); -static VALUE cComments, eVTError; +static VALUE cComments, eVT, eClosed, eOpen, eInvalidData, + eInvalidComment, eTempFile, eReopen; static ID id_length; static void @@ -100,17 +106,23 @@ c_init (VALUE self, VALUE filename) o->state = vcedit_state_new (StringValuePtr (filename)); if (!o->state) - rb_raise (eVTError, "vcedit_new_state() failed - %s", - vcedit_error (o->state)); - - if (vcedit_open (o->state) < 0) - rb_raise (eVTError, "vcedit_open() failed - %s", - vcedit_error (o->state)); + rb_raise (rb_eNoMemError, "Out of Memory"); + + switch (vcedit_open (o->state)) { + case VCEDIT_ERR_OPEN: + rb_raise (eOpen, "Cannot open file"); + case VCEDIT_ERR_INVAL: + rb_raise (eInvalidData, "Invalid data"); + default: + break; + } vc = vcedit_comments (o->state); - if (!vc) - rb_raise (eVTError, "vcedit_comments() failed - %s", - vcedit_error (o->state)); + + /* vcedit_open() succeeded, so vcedit_comments() cannot + * return NULL. + */ + assert (vc); /* check whether all comments are well-formed */ for (i = 0; i < vc->comments; i++) { @@ -118,7 +130,7 @@ c_init (VALUE self, VALUE filename) ptr = strchr (content, '='); if (!ptr || ptr == content) - rb_raise (eVTError, "malformed comment - %s", content); + rb_raise (eInvalidComment, "invalid comment - %s", content); } o->comments = rb_class_new_instance (0, NULL, cComments); @@ -141,6 +153,8 @@ c_close (VALUE self) Data_Get_Struct (self, RbVorbisTagger, o); + CHECK_CLOSED (o); + vcedit_state_unref (o->state); o->state = NULL; @@ -161,11 +175,20 @@ c_write (VALUE self) Data_Get_Struct (self, RbVorbisTagger, o); + CHECK_CLOSED (o); + comments_sync (o->comments, o->state); - if (vcedit_write (o->state) < 0) - rb_raise (rb_eIOError, "write failed - %s", - vcedit_error (o->state)); + switch (vcedit_write (o->state)) { + case VCEDIT_ERR_INVAL: + rb_raise (eInvalidData, "Invalid data"); + case VCEDIT_ERR_TMPFILE: + rb_raise (eTempFile, "Cannot create temporary file"); + case VCEDIT_ERR_REOPEN: + rb_raise (eReopen, "Cannot reopen file"); + default: + break; + } return rb_funcall (o->comments, id_length, 0); } @@ -184,6 +207,8 @@ c_comments (VALUE self) Data_Get_Struct (self, RbVorbisTagger, o); + CHECK_CLOSED (o); + return o->comments; } @@ -209,7 +234,14 @@ Init_vorbistagger_ext (void) rb_define_method (cVT, "write", c_write, 0); rb_define_method (cVT, "comments", c_comments, 0); - eVTError = rb_define_class_under (cVT, "TaggerError", eVorbis); + eVT = rb_define_class_under (cVT, "TaggerError", eVorbis); + eClosed = rb_define_class_under (cVT, "ClosedStreamError", eVT); + eOpen = rb_define_class_under (cVT, "OpenError", eVT); + eInvalidData = rb_define_class_under (cVT, "InvalidDataError", eVT); + eInvalidComment = rb_define_class_under (cVT, "InvalidCommentError", + eInvalidData); + eTempFile = rb_define_class_under (cVT, "TempFileError", eVT); + eReopen = rb_define_class_under (cVT, "ReopenError", eVT); id_length = rb_intern ("length");