// This may look like C code, but it is really -*- C++ -*-
//
// Copyright Bob Friesenhahn, 2001, 2002
//
// CoderInfo implementation
//

#define MAGICKCORE_IMPLEMENTATION  1
#define MAGICK_PLUSPLUS_IMPLEMENTATION  1

#include "Magick++/Include.h"
#include "Magick++/CoderInfo.h"
#include "Magick++/Exception.h"

using namespace std;

Magick::CoderInfo::CoderInfo(void)
  : _name(),
    _description(),
    _mimeType(),
    _isReadable(false),
    _isWritable(false),
    _isMultiFrame(false)
{
}

Magick::CoderInfo::CoderInfo(const Magick::CoderInfo &coder_)
{
  _name=coder_._name;
  _description=coder_._description;
  _mimeType=coder_._mimeType;
  _isReadable=coder_._isReadable;
  _isWritable=coder_._isWritable;
  _isMultiFrame=coder_._isMultiFrame;
}

Magick::CoderInfo::CoderInfo(const std::string &name_)
  : _name(),
    _description(),
    _mimeType(),
    _isReadable(false),
    _isWritable(false),
    _isMultiFrame(false)
{
  ExceptionInfo
    exceptionInfo;

  const Magick::MagickInfo
    *magickInfo;

  GetExceptionInfo(&exceptionInfo);
  magickInfo=GetMagickInfo(name_.c_str(),&exceptionInfo);
  throwException(exceptionInfo);
  (void) DestroyExceptionInfo(&exceptionInfo);
  if (magickInfo == 0)
    {
      throwExceptionExplicit(OptionError,"Coder not found",name_.c_str());
    }
  else
    {
      _name=string(magickInfo->name);
      _description=string(magickInfo->description);
      _mimeType=string(magickInfo->mime_type ? magickInfo->mime_type : "");
      _isReadable=((magickInfo->decoder == 0) ? false : true);
      _isWritable=((magickInfo->encoder == 0) ? false : true);
      _isMultiFrame=((magickInfo->adjoin == 0) ? false : true);
    }
}

Magick::CoderInfo::~CoderInfo(void)
{
}

Magick::CoderInfo& Magick::CoderInfo::operator=(const CoderInfo &coder_)
{
  // If not being set to ourself
  if (this != &coder_)
    {
      _name=coder_._name;
      _description=coder_._description;
      _mimeType=coder_._mimeType;
      _isReadable=coder_._isReadable;
      _isWritable=coder_._isWritable;
      _isMultiFrame=coder_._isMultiFrame;
    }
  return(*this);
}

std::string Magick::CoderInfo::description(void) const
{
  return(_description);
}

bool Magick::CoderInfo::isReadable(void) const
{
  return(_isReadable);
}

bool Magick::CoderInfo::isWritable(void) const
{
  return(_isWritable);
}

bool Magick::CoderInfo::isMultiFrame(void) const
{
  return(_isMultiFrame);
}

std::string Magick::CoderInfo::mimeType(void) const
{
  return(_mimeType);
}

std::string Magick::CoderInfo::name(void) const
{
  return(_name);
}

bool Magick::CoderInfo::unregister(void) const
{
  return(UnregisterMagickInfo(_name.c_str()) != MagickFalse);
}