CdTextContainer.cc
上传用户:weiliju62
上传日期:2007-01-06
资源大小:619k
文件大小:5k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /*  cdrdao - write audio CD-Rs in disc-at-once mode
  2.  *
  3.  *  Copyright (C) 1998, 1999  Andreas Mueller <mueller@daneb.ping.de>
  4.  *
  5.  *  This program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2 of the License, or
  8.  *  (at your option) any later version.
  9.  *
  10.  *  This program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  *  GNU General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with this program; if not, write to the Free Software
  17.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  */
  19. /*
  20.  * $Log: CdTextContainer.cc,v $
  21.  * Revision 1.1  1999/04/05 11:02:11  mueller
  22.  * Initial revision
  23.  *
  24.  */
  25. static char rcsid[] = "$Id: CdTextContainer.cc,v 1.1 1999/04/05 11:02:11 mueller Exp mueller $";
  26. #include <iostream.h>
  27. #include <assert.h>
  28. #include "CdTextContainer.h"
  29. #include "CdTextItem.h"
  30. CdTextContainer::CdTextContainer()
  31. {
  32.   count_ = 0;
  33.   items_ = 0;
  34.   setDefaultLanguageMapping();
  35. }
  36. CdTextContainer::CdTextContainer(const CdTextContainer &obj)
  37. {
  38.   CdTextItem *run;
  39.   CdTextItem *last = NULL;
  40.   int i;
  41.   items_ = NULL;
  42.   count_ = 0;
  43.   for (run = obj.items_; run != NULL; run = run->next_) {
  44.     if (last == NULL) {
  45.       items_ = new CdTextItem(*run);
  46.       last = items_;
  47.     }
  48.     else {
  49.       last->next_ = new CdTextItem(*run);;
  50.       last = last->next_;
  51.     }
  52.     count_++;
  53.   }
  54.   // copy language map
  55.   for (i = 0; i < 8; i++)
  56.     language_[i] = obj.language_[i];
  57. }
  58. CdTextContainer::~CdTextContainer()
  59. {
  60.   CdTextItem *next;
  61.   while (items_ != NULL) {
  62.     next = items_->next_;
  63.     delete items_;
  64.     items_ = next;
  65.   }
  66.   count_ = 0;
  67. }
  68. void CdTextContainer::setDefaultLanguageMapping()
  69. {
  70.   int i;
  71.   // set all to undefined
  72.   for (i = 0; i < 8; i++)
  73.     language_[i] = -1;
  74. }
  75. void CdTextContainer::print(int isTrack, ostream &out) const
  76. {
  77.   CdTextItem *run;
  78.   int i;
  79.   int foundLanguageMapping;
  80.   if (count_ > 0) {
  81.     int actBlockNr = items_->blockNr();
  82.     out << "CD_TEXT {n";
  83.     if (!isTrack) {
  84.       foundLanguageMapping = 0;
  85.       for (i = 0; i < 8; i++) {
  86. if (language_[i] >= 0) {
  87.   foundLanguageMapping = 1;
  88.   break;
  89. }
  90.       }
  91.       if (foundLanguageMapping) {
  92. out << "  LANGUAGE_MAP {n";
  93. for (i = 0; i < 8; i++) {
  94.   if (language_[i] >= 0) 
  95.     out << "    " << i << ": " << language_[i] << "n";
  96. }
  97.       
  98. out << "  }n";
  99.       }
  100.     }
  101.     out << "  LANGUAGE " << actBlockNr << " {n";
  102.     
  103.     for (run = items_; run != NULL; run = run->next_) {
  104.       if (run->blockNr() != actBlockNr) {
  105. actBlockNr = run->blockNr();
  106. out << "  }n  LANGUAGE " << actBlockNr << " {n";
  107.       }
  108.       out << "    ";
  109.       run->print(isTrack, out);
  110.       out << "n";
  111.     }
  112.     out << "  }n}n";
  113.   }
  114. }
  115. void CdTextContainer::add(CdTextItem *item)
  116. {
  117.   CdTextItem *pred;
  118.   CdTextItem *run;
  119.   assert(item->next_ == NULL);
  120.   remove(item->packType(), item->blockNr());
  121.   for (pred = NULL, run = items_; run != NULL; pred = run, run = run->next_) {
  122.     if (item->blockNr() < run->blockNr() ||
  123. (item->blockNr() == run->blockNr() &&
  124.  item->packType() < run->packType()))
  125.       break;
  126.   }
  127.   if (pred == NULL) {
  128.     item->next_ = items_;
  129.     items_ = item;
  130.   }
  131.   else {
  132.     item->next_ = pred->next_;
  133.     pred->next_ = item;
  134.   }
  135.   count_++;
  136. }
  137. void CdTextContainer::remove(CdTextItem::PackType type, int blockNr)
  138. {
  139.   CdTextItem *run, *pred;
  140.   for (pred = NULL, run = items_; run != NULL; pred = run, run = run->next_) {
  141.     if (run->packType() == type && run->blockNr() == blockNr) {
  142.       if (pred == NULL)
  143. items_ = run->next_;
  144.       else
  145. pred->next_ = run->next_;
  146.       count_--;
  147.       delete run;
  148.       return;
  149.     }
  150.   }
  151. }
  152. int CdTextContainer::existBlock(int blockNr) const
  153. {
  154.   CdTextItem *run;
  155.   for (run = items_; run != NULL; run = run->next_) {
  156.     if (run->blockNr() == blockNr) {
  157.       return 1;
  158.     }
  159.   }
  160.   return 0;
  161. }
  162. const CdTextItem *CdTextContainer::getPack(int blockNr,
  163.    CdTextItem::PackType type) const
  164. {
  165.   CdTextItem *run;
  166.   for (run = items_; run != NULL; run = run->next_) {
  167.     if (run->blockNr() == blockNr && run->packType() == type) {
  168.       return run;
  169.     }
  170.   }
  171.   return NULL;
  172. }
  173. void CdTextContainer::language(int blockNr, int lang)
  174. {
  175.   assert(blockNr >= 0 && blockNr <= 7);
  176.   assert(lang >= -1 && lang <= 255);
  177.   language_[blockNr] = lang;
  178. }
  179. int CdTextContainer::language(int blockNr) const
  180. {
  181.   assert(blockNr >= 0 && blockNr <= 7);
  182.   return language_[blockNr];
  183. }