guint32 get_nonzero_guint32(const char *string, const char *name) { guint32 number; number = get_guint32(string, name); if (number == 0) { cmdarg_err("The specified %s is zero", name); exit(1); } return number; }
static int write_mhii (Itdb_DB *db, void *data, iPodBuffer *buffer) { MhiiHeader *mhii; unsigned int total_bytes; int bytes_written; int num_children; const GList *it = NULL; Itdb_Track *song; Itdb_Artwork *artwork; guint64 mactime; Itdb_Device *device = db_get_device (db); mhii = (MhiiHeader *)init_header (buffer, "mhii", sizeof (MhiiHeader)); if (mhii == NULL) { return -1; } total_bytes = get_gint32 (mhii->header_len, buffer->byte_order); switch( buffer->db_type) { case DB_TYPE_ITUNES: song = (Itdb_Track *)data; artwork = song->artwork; mhii->song_id = get_gint64 (song->dbid, buffer->byte_order); break; case DB_TYPE_PHOTO: artwork = (Itdb_Artwork *)data; mhii->song_id = get_gint64 (artwork->id + 2, buffer->byte_order); break; default: g_return_val_if_reached (-1); } mhii->image_id = get_guint32 (artwork->id, buffer->byte_order); mhii->unknown4 = get_gint32 (artwork->unk028, buffer->byte_order); mhii->rating = get_gint32 (artwork->rating, buffer->byte_order); mhii->unknown6 = get_gint32 (artwork->unk036, buffer->byte_order); mactime = device_time_time_t_to_mac (device, artwork->creation_date); mhii->orig_date = get_guint32 (mactime, buffer->byte_order); mactime = device_time_time_t_to_mac (device, artwork->digitized_date); mhii->digitized_date = get_guint32 (mactime, buffer->byte_order); mhii->orig_img_size = get_gint32 (artwork->artwork_size, buffer->byte_order); num_children = 0; /* Before trying to write the artwork or photo database, the ithmb * files have been written, which will have converted all thumbnails * attached to the tracks to ITDB_THUMB_TYPE_IPOD thumbnails. */ g_assert (artwork->thumbnail->data_type == ITDB_THUMB_TYPE_IPOD); for (it=itdb_thumb_ipod_get_thumbs ((Itdb_Thumb_Ipod *)artwork->thumbnail); it!=NULL; it=it->next) { iPodBuffer *sub_buffer; Itdb_Thumb_Ipod_Item *thumb; thumb = (Itdb_Thumb_Ipod_Item *)it->data; if (thumb->format == NULL) { /* skip this thumb */ continue; } mhii->num_children = get_gint32 (num_children, buffer->byte_order); mhii->total_len = get_gint32 (total_bytes, buffer->byte_order); sub_buffer = ipod_buffer_get_sub_buffer (buffer, total_bytes); if (sub_buffer == NULL) { return -1; } bytes_written = write_mhod (db, thumb, sub_buffer); ipod_buffer_destroy (sub_buffer); if (bytes_written == -1) { return -1; } total_bytes += bytes_written; mhii = ipod_buffer_get_pointer (buffer); num_children++; } mhii->num_children = get_gint32 (num_children, buffer->byte_order); mhii->total_len = get_gint32 (total_bytes, buffer->byte_order); dump_mhii (mhii); return total_bytes; }