diff options
author | Michael Brown | 2008-06-12 22:47:19 +0200 |
---|---|---|
committer | Michael Brown | 2010-06-22 15:40:09 +0200 |
commit | a03dd97e6b4c6d1d30ac9dc7e63f87402434d9bc (patch) | |
tree | b02a2bf151bfd212bea20ae7ac208c64157a0895 /src/core/downloader.c | |
parent | [interface] Expand object interface to allow for polymorphic interfaces (diff) | |
download | ipxe-a03dd97e6b4c6d1d30ac9dc7e63f87402434d9bc.tar.gz ipxe-a03dd97e6b4c6d1d30ac9dc7e63f87402434d9bc.tar.xz ipxe-a03dd97e6b4c6d1d30ac9dc7e63f87402434d9bc.zip |
[interface] Convert all job-control interfaces to generic interfaces
Remove job-control as an interface type, and replace job-control
interfaces with generic interfaces supporting the close() method.
(Both done() and kill() are absorbed into the function of close();
kill() is merely close(-ECANCELED).)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/core/downloader.c')
-rw-r--r-- | src/core/downloader.c | 69 |
1 files changed, 30 insertions, 39 deletions
diff --git a/src/core/downloader.c b/src/core/downloader.c index 5499ddab..de5ea458 100644 --- a/src/core/downloader.c +++ b/src/core/downloader.c @@ -41,7 +41,7 @@ struct downloader { struct refcnt refcnt; /** Job control interface */ - struct job_interface job; + struct interface job; /** Data transfer interface */ struct xfer_interface xfer; @@ -74,13 +74,14 @@ static void downloader_free ( struct refcnt *refcnt ) { */ static void downloader_finished ( struct downloader *downloader, int rc ) { - /* Block further incoming messages */ - job_nullify ( &downloader->job ); - xfer_nullify ( &downloader->xfer ); + /* Register image if download was successful */ + if ( rc == 0 ) + rc = downloader->register_image ( downloader->image ); - /* Free resources and close interfaces */ + /* Shut down interfaces */ + xfer_nullify ( &downloader->xfer ); xfer_close ( &downloader->xfer, rc ); - job_done ( &downloader->job, rc ); + intf_shutdown ( &downloader->job, rc ); } /** @@ -121,28 +122,13 @@ static int downloader_ensure_size ( struct downloader *downloader, */ /** - * Handle kill() event received via job control interface - * - * @v job Downloader job control interface - */ -static void downloader_job_kill ( struct job_interface *job ) { - struct downloader *downloader = - container_of ( job, struct downloader, job ); - - /* Terminate download */ - downloader_finished ( downloader, -ECANCELED ); -} - -/** * Report progress of download job * - * @v job Downloader job control interface + * @v downloader Downloader * @v progress Progress report to fill in */ -static void downloader_job_progress ( struct job_interface *job, - struct job_progress *progress ) { - struct downloader *downloader = - container_of ( job, struct downloader, job ); +static void downloader_progress ( struct downloader *downloader, + struct job_progress *progress ) { /* This is not entirely accurate, since downloaded data may * arrive out of order (e.g. with multicast protocols), but @@ -152,13 +138,6 @@ static void downloader_job_progress ( struct job_interface *job, progress->total = downloader->image->len; } -/** Downloader job control interface operations */ -static struct job_interface_operations downloader_job_operations = { - .done = ignore_job_done, - .kill = downloader_job_kill, - .progress = downloader_job_progress, -}; - /**************************************************************************** * * Data transfer interface @@ -215,10 +194,6 @@ static void downloader_xfer_close ( struct xfer_interface *xfer, int rc ) { struct downloader *downloader = container_of ( xfer, struct downloader, xfer ); - /* Register image if download was successful */ - if ( rc == 0 ) - rc = downloader->register_image ( downloader->image ); - /* Terminate download */ downloader_finished ( downloader, rc ); } @@ -235,6 +210,22 @@ static struct xfer_interface_operations downloader_xfer_operations = { /**************************************************************************** * + * Job control interface + * + */ + +/** Downloader job control interface operations */ +static struct interface_operation downloader_job_op[] = { + INTF_OP ( job_progress, struct downloader *, downloader_progress ), + INTF_OP ( intf_close, struct downloader *, downloader_finished ), +}; + +/** Downloader job control interface descriptor */ +static struct interface_descriptor downloader_job_desc = + INTF_DESC ( struct downloader, job, downloader_job_op ); + +/**************************************************************************** + * * Instantiator * */ @@ -253,7 +244,7 @@ static struct xfer_interface_operations downloader_xfer_operations = { * the specified image object. If the download is successful, the * image registration routine @c register_image() will be called. */ -int create_downloader ( struct job_interface *job, struct image *image, +int create_downloader ( struct interface *job, struct image *image, int ( * register_image ) ( struct image *image ), int type, ... ) { struct downloader *downloader; @@ -265,8 +256,8 @@ int create_downloader ( struct job_interface *job, struct image *image, if ( ! downloader ) return -ENOMEM; ref_init ( &downloader->refcnt, downloader_free ); - job_init ( &downloader->job, &downloader_job_operations, - &downloader->refcnt ); + intf_init ( &downloader->job, &downloader_job_desc, + &downloader->refcnt ); xfer_init ( &downloader->xfer, &downloader_xfer_operations, &downloader->refcnt ); downloader->image = image_get ( image ); @@ -278,7 +269,7 @@ int create_downloader ( struct job_interface *job, struct image *image, goto err; /* Attach parent interface, mortalise self, and return */ - job_plug_plug ( &downloader->job, job ); + intf_plug_plug ( &downloader->job, job ); ref_put ( &downloader->refcnt ); va_end ( args ); return 0; |