/*
    ktnefproperty.cpp

    Copyright (C) 2002 Michael Goffioul <kdeprint@swing.be>

    This file is part of KTNEF, the KDE TNEF support library/program.

    This library 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 library 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 library; see the file COPYING.LIB.  If not, write to
    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
    Boston, MA 02110-1301, USA.
 */
/**
 * @file
 * This file is part of the API for handling TNEF data and
 * defines the KTNEFProperty class.
 *
 * @author Michael Goffioul
 */

#include "ktnefproperty.h"
#include "mapi.h"

#include <QtCore/QDateTime>

#include <ctype.h>

using namespace KTnef;

class KTNEFProperty::Private
{
  public:
    int _key;
    int _type;
    QVariant _value;
    QVariant _name;
};

KTNEFProperty::KTNEFProperty()
  : d( new Private )
{
}

KTNEFProperty::KTNEFProperty( int key_, int type_, const QVariant &value_,
                              const QVariant &name_ )
  : d( new Private )
{
  d->_key = key_;
  d->_type = type_;
  d->_value = value_;
  d->_name = name_;
}

KTNEFProperty::KTNEFProperty( const KTNEFProperty &p )
  : d( new Private )
{
  *d = *p.d;
}

KTNEFProperty::~KTNEFProperty()
{
  delete d;
}

KTNEFProperty &KTNEFProperty::operator=( const KTNEFProperty &other )
{
  if ( this != &other ) {
    *d = *other.d;
  }

  return *this;
}

QString KTNEFProperty::keyString() const
{
  if ( d->_name.isValid() ) {
    if ( d->_name.type() == QVariant::String ) {
      return d->_name.toString();
    } else {
      return mapiNamedTagString( d->_name.toUInt(), d->_key );
    }
  } else {
    return mapiTagString( d->_key );
  }
}

QString KTNEFProperty::formatValue( const QVariant &value, bool beautify )
{
  if ( value.type() == QVariant::ByteArray ) {
    // check the first bytes (up to 8) if they are
    // printable characters
    QByteArray arr = value.toByteArray();
    bool printable = true;
    for ( int i=qMin( arr.size(), 8 )-1; i>=0 && printable; i-- ) {
      printable = ( isprint( arr[ i ] ) != 0 );
    }
    if ( !printable ) {
      QString s;
      int i;
      int txtCount = beautify ? qMin( arr.size(), 32 ) : arr.size();
      for ( i=0; i < txtCount; ++i ) {
        s.append( QString().sprintf( "%02X", ( uchar )arr[ i ] ) );
        if ( beautify ) {
          s.append( " " );
        }
      }
      if ( i < arr.size() ) {
        s.append( "... (size=" + QString::number( arr.size() ) + ')' );
      }
      return s;
    }
  }
  //else if ( value.type() == QVariant::DateTime )
  //	return value.toDateTime().toString();
  return value.toString();
}

QString KTNEFProperty::valueString() const
{
  return formatValue( d->_value );
}

int KTNEFProperty::key() const
{
  return d->_key;
}

int KTNEFProperty::type() const
{
  return d->_type;
}

QVariant KTNEFProperty::value() const
{
  return d->_value;
}

QVariant KTNEFProperty::name() const
{
  return d->_name;
}

bool KTNEFProperty::isVector() const
{
  return d->_value.type() == QVariant::List;
}
