add bug closure to changelog
[debian/amanda] / device-src / device.h
index b39a7d0b462e94598334f79ce91698ac78a71a37..0945b0b1ef930fa12e6610bf0ff092d63bff0939 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2008, 2009, 2010 Zmanda, Inc.  All Rights Reserved.
+ * Copyright (c) 2007-2012 Zmanda, Inc.  All Rights Reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 as published
@@ -91,6 +91,11 @@ typedef struct Device {
     /* You can peek at the stuff below, but only subclasses should
        change these values.*/
 
+    /* A mutex to protect field accessed from another thread.
+     * Only get_bytes_read and get_bytes_written are allowed from another
+     * Only in_file, bytes_read and bytes_written are protected */
+    GMutex  *device_mutex;
+
     /* What file, block are we at? (and are we in the middle of a file?) */
     int file;
     guint64 block;
@@ -132,6 +137,10 @@ typedef struct Device {
     gsize min_block_size;
     gsize max_block_size;
     gsize block_size;
+    gsize header_block_size;
+
+    guint64 bytes_read;
+    guint64 bytes_written;
 
     /* surety and source for the block size; if you set block_size directly,
      * set these, too! */
@@ -175,12 +184,10 @@ struct _DeviceClass {
                         char * label, char * timestamp);
     gboolean (* start_file) (Device * self, dumpfile_t * info);
     gboolean (* write_block) (Device * self, guint size, gpointer data);
-    gboolean (* write_from_fd) (Device * self, queue_fd_t *queue_fd);
     gboolean (* finish_file) (Device * self);
     dumpfile_t* (* seek_file) (Device * self, guint file);
     gboolean (* seek_block) (Device * self, guint64 block);
     int (* read_block) (Device * self, gpointer buf, int * size);
-    gboolean (* read_to_fd) (Device * self, queue_fd_t *queue_fd);
     gboolean (* property_get_ex) (Device * self, DevicePropertyId id,
                                  GValue * val,
                                  PropertySurety *surety,
@@ -194,10 +201,20 @@ struct _DeviceClass {
     gboolean (* erase) (Device * self);
     gboolean (* eject) (Device * self);
     gboolean (* finish) (Device * self);
+    guint64  (* get_bytes_read) (Device * self);
+    guint64  (* get_bytes_written) (Device * self);
 
     gboolean (* listen)(Device *self, gboolean for_writing, DirectTCPAddr **addrs);
     gboolean (* accept)(Device *self, DirectTCPConnection **conn,
                        ProlongProc prolong, gpointer prolong_data);
+    int (* accept_with_cond)(Device *self, DirectTCPConnection **conn,
+                                 GMutex *abort_mutex, GCond *abort_cond);
+    gboolean (* connect)(Device *self, gboolean for_writing, DirectTCPAddr *addrs,
+                       DirectTCPConnection **conn, ProlongProc prolong,
+                       gpointer prolong_data);
+    gboolean (* connect_with_cond)(Device *self, gboolean for_writing,
+                       DirectTCPAddr *addrs, DirectTCPConnection **conn,
+                       GMutex *abort_mutex, GCond *abort_cond);
     gboolean (* write_from_connection)(Device *self, guint64 size, guint64 *actual_size);
     gboolean (* read_to_connection)(Device *self, guint64 size, guint64 *actual_size);
     gboolean (* use_connection)(Device *self, DirectTCPConnection *conn);
@@ -292,21 +309,19 @@ gboolean  device_start    (Device * self,
                                  DeviceAccessMode mode, char * label,
                                  char * timestamp);
 gboolean       device_finish   (Device * self);
+guint64        device_get_bytes_read   (Device * self);
+guint64        device_get_bytes_written(Device * self);
 gboolean        device_start_file       (Device * self,
                                          dumpfile_t * jobInfo);
 gboolean       device_write_block      (Device * self,
                                          guint size,
                                          gpointer data);
-gboolean       device_write_from_fd    (Device * self,
-                                       queue_fd_t *queue_fd);
 gboolean       device_finish_file      (Device * self);
 dumpfile_t*    device_seek_file        (Device * self,
                                        guint file);
 gboolean       device_seek_block       (Device * self,
                                        guint64 block);
 int    device_read_block       (Device * self, gpointer buffer, int * size);
-gboolean       device_read_to_fd       (Device * self,
-                                       queue_fd_t *queue_fd);
 const GSList * device_property_get_list        (Device * self);
 gboolean       device_property_get_ex  (Device * self,
                                          DevicePropertyId id,
@@ -333,6 +348,14 @@ gboolean   device_eject    (Device * self);
 gboolean device_listen(Device *self, gboolean for_writing, DirectTCPAddr **addrs);
 gboolean device_accept(Device *self, DirectTCPConnection **conn,
                 ProlongProc prolong, gpointer prolong_data);
+int device_accept_with_cond(Device *self, DirectTCPConnection **conn,
+                                GMutex *abort_mutex, GCond *abort_cond);
+gboolean device_connect(Device *self, gboolean for_writing, DirectTCPAddr *addrs,
+                       DirectTCPConnection **conn, ProlongProc prolong,
+                       gpointer prolong_data);
+gboolean device_connect_with_cond(Device *self, gboolean for_writing,
+                       DirectTCPAddr *addrs, DirectTCPConnection **conn,
+                       GMutex *abort_mutex, GCond *abort_cond);
 gboolean device_write_from_connection(Device *self, guint64 size, guint64 *actual_size);
 gboolean device_read_to_connection(Device *self, guint64 size, guint64 *actual_size);
 gboolean device_use_connection(Device *self, DirectTCPConnection *conn);