/*
* Comment.java
*
* This file is part of Tritonus: http://www.tritonus.org/
*/
/*
* Copyright (c) 2000 - 2005 by Matthias Pfisterer
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published
* by the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*
|<--- this code is formatted to fit into 80 columns --->|
*/
package org.tritonus.lowlevel.pvorbis;
import java.util.ArrayList;
import java.util.List;
import org.tritonus.lowlevel.pogg.Buffer;
import org.tritonus.share.TDebug;
/** Wrapper for vorbis_comment.
*/
public class Comment
implements VorbisConstants
{
private String m_vendor;
private List<String> m_comments;
public Comment()
{
if (TDebug.TraceVorbisNative) { TDebug.out("Comment.<init>(): begin"); }
if (TDebug.TraceVorbisNative) { TDebug.out("Comment.<init>(): end"); }
}
public void finalize()
{
// TODO: call free()
// call super.finalize() first or last?
// and introduce a flag if free() has already been called?
}
// TODO: since this is now a no-op, remove calls to this method.
public void free()
{
}
/** Initializes the comment object.
Sets the vendor string to null and
removes all comments.
*/
public void init()
{
m_vendor = null;
m_comments = new ArrayList<String>();
}
/** Adds a comment to the list of comments.
The passed string is added to the list of comments as it is.
The string should have the format 'TAG=content'.
*/
public void addComment(String strComment)
{
m_comments.add(strComment);
}
/** Adds a comment with a specific tag
*/
public void addTag(String strTag, String strContents)
{
addComment(strTag + "=" + strContents);
}
/** Calls vorbis_comment_query_count().
*/
public int queryCount(String strTag)
{
String strFullTag = strTag + "=";
int nCount = 0;
for (int i = 0; i < m_comments.size(); i++)
{
if (m_comments.get(i).startsWith(strFullTag))
{
nCount++;
}
}
return nCount;
}
/** Calls vorbis_comment_query().
*/
public String query(String strTag, int nIndex)
{
int nCount = 0;
for (int i = 0; i < m_comments.size(); i++)
{
if (i == nIndex)
{
return m_comments.get(i).substring(strTag.length() + 1);
}
nCount++;
}
return null;
}
/** Accesses user_comments, comment_lengths and comments.
*/
public String[] getUserComments()
{
return m_comments.toArray(new String[m_comments.size()]);
}
/** Accesses vendor.
*/
public String getVendor()
{
return m_vendor;
}
/** Calls vorbis_comment_clear().
*/
public void clear()
{
m_comments.clear();
m_vendor = null;
}
public int pack(Buffer buffer)
{
String strVendor = "tritonus.org pvorbis library";
//String strVendor = "Xiph.Org libVorbis I 20030909";
/* preamble */
buffer.write(0x03, 8);
buffer.write("vorbis");
/* vendor */
buffer.writeWithLength(strVendor);
/* comments */
buffer.write(m_comments.size(), 32);
if(m_comments.size() > 0)
{
for(int i = 0; i < m_comments.size(); i++)
{
buffer.writeWithLength(m_comments.get(i));
}
}
buffer.write(1, 1);
return 0;
}
public int unpack(Buffer buffer)
{
String s = buffer.readString();
if (s == null)
{
clear();
return OV_EBADHEADER;
}
m_vendor = s;
int nNumComments = buffer.read(32);
if (nNumComments < 0)
{
clear();
return OV_EBADHEADER;
}
for (int i = 0; i < nNumComments; i++)
{
s = buffer.readString();
if (s == null)
{
clear();
return OV_EBADHEADER;
}
m_comments.add(s);
}
/* EOP check */
if (buffer.read(1) != 1)
{
clear();
return OV_EBADHEADER;
}
// everything ok.
return 0;
}
}
/*** Comment.java ***/