/** * Copyright 2013 (c) Anna Schumaker. */ extern "C" { #include #include } #include #include static std::list queue_deck; static struct file deck_file; void TempQueue :: write(file &file) { file_writef(&file, "%u %zu", q_flags, queue_size(this)); for (unsigned int i = 0; i < queue_size(this); i++) file_writef(&file, " %u", queue_at(this, i)->tr_dbe.dbe_index); } void TempQueue :: read(file &file) { unsigned int n, id; file_readf(&file, "%u %u", &q_flags, &n); for (unsigned int i = 0; i < n; i++) { file_readf(&file, "%u", &id); queue_add(this, track_get(id)); } } unsigned int TempQueue :: add(struct track *track) { unsigned int res = queue_add(this, track); deck :: write(); return res; } void TempQueue :: del(struct track *track) { queue_remove_all(this, track); deck :: write(); } void TempQueue :: del(unsigned int id) { queue_remove(this, id); deck :: write(); } static unsigned int __tempq_index(struct queue *queue) { unsigned int i = 0; std::list::iterator it; for (it = queue_deck.begin(); it != queue_deck.end(); it++) { if (&(*it) == queue) return i; i++; } return queue_deck.size(); } void tempq_init(struct queue_ops *ops) { unsigned int num, i; file_init(&deck_file, "deck", 1); if (!file_open(&deck_file, OPEN_READ)) return; if (file_version(&deck_file) < 1) return; file_readf(&deck_file, "%u", &num); for (i = 0; i < num; i++) { ((TempQueue *)tempq_alloc(NULL, 0))->read(deck_file); queue_deck.back().q_ops = ops; } file_close(&deck_file); } struct queue *tempq_alloc(struct queue_ops *ops, unsigned int flags) { struct queue *queue; queue_deck.push_back(TempQueue()); queue = &queue_deck.back(); queue_init(queue, flags | Q_ENABLED | Q_SAVE_FLAGS | Q_SAVE_SORT, ops); return queue; } void tempq_free(struct queue *queue) { std::list::iterator it; for (it = queue_deck.begin(); it != queue_deck.end(); it++) { if (&(*it) == queue) { queue_deck.erase(it); deck :: write(); return; } } return; } struct queue *tempq_get(unsigned int index) { std::list::iterator it; unsigned int i; it = queue_deck.begin(); for (i = 0; i < queue_deck.size(); i++) { if (i == index) return &(*it); it++; } return NULL; } void tempq_move(struct queue *queue, unsigned int index) { unsigned int old_pos = __tempq_index(queue); std::list::iterator it_old = queue_deck.begin(); std::list::iterator it_new = queue_deck.begin(); for (unsigned int i = 0; i < queue_deck.size(); i++) { if (i < old_pos) it_old++; if (i < index) it_new++; } if (index > old_pos) it_new++; queue_deck.splice(it_new, queue_deck, it_old); deck :: write(); } void deck :: write() { std::list::iterator it; if (!file_open(&deck_file, OPEN_WRITE)) return; file_writef(&deck_file, "%zu\n", queue_deck.size()); for (it = queue_deck.begin(); it != queue_deck.end(); it++) { it->write(deck_file); file_writef(&deck_file, "\n"); } file_close(&deck_file); } void deck :: save(struct queue *queue, enum queue_flags flag) { deck :: write(); } struct track *deck :: next() { struct track *track = NULL; std::list::iterator it; for (it = queue_deck.begin(); it != queue_deck.end(); it++) { if (queue_has_flag(&(*it), Q_ENABLED) == false) continue; track = queue_next(&(*it)); if (queue_size(&(*it)) == 0) tempq_free(&(*it)); break; } if (!track) track = queue_next(collection_get_queue()); return track; } std::list &deck :: get_queues() { return queue_deck; }