// ==========================================================
// fipTag class implementation
//
// Design and implementation by
// - Hervé Drolon (drolon@infonie.fr)
//
// This file is part of FreeImage 3
//
// COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY
// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
// THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
// OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED
// CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT
// THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
// SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
// PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
// THIS DISCLAIMER.
//
// Use at your own risk!
// ==========================================================

#include <string.h>
#include "FreeImagePlus.h"

fipTag::fipTag() {
	_tag = FreeImage_CreateTag();
}

fipTag::~fipTag() {
	FreeImage_DeleteTag(_tag);
}

BOOL fipTag::setKeyValue(const char *key, const char *value) {
	if(_tag) {
		FreeImage_DeleteTag(_tag);
		_tag = NULL;
	}
	// create a tag
	_tag = FreeImage_CreateTag();
	if(_tag) {
		BOOL bSuccess = TRUE;
		// fill the tag
		DWORD tag_length = (DWORD)(strlen(value) + 1);
		bSuccess &= FreeImage_SetTagKey(_tag, key);
		bSuccess &= FreeImage_SetTagLength(_tag, tag_length);
		bSuccess &= FreeImage_SetTagCount(_tag, tag_length);
		bSuccess &= FreeImage_SetTagType(_tag, FIDT_ASCII);
		bSuccess &= FreeImage_SetTagValue(_tag, value);
		return bSuccess;
	}
	return FALSE;
}

fipTag::fipTag(const fipTag& tag) {
	_tag = FreeImage_CloneTag(tag._tag);
}

fipTag& fipTag::operator=(const fipTag& tag) {
	if(this != &tag) {
		if(_tag) FreeImage_DeleteTag(_tag);
		_tag = FreeImage_CloneTag(tag._tag);
	}
	return *this;
}

fipTag& fipTag::operator=(FITAG *tag) {
	if(_tag) FreeImage_DeleteTag(_tag);
	_tag = tag;
	return *this;
}

BOOL fipTag::isValid() const {
	return (_tag != NULL) ? TRUE : FALSE;
}

const char* fipTag::getKey() const {
	return FreeImage_GetTagKey(_tag);
}

const char* fipTag::getDescription() const {
	return FreeImage_GetTagDescription(_tag);
}

WORD fipTag::getID() const {
	return FreeImage_GetTagID(_tag);
}

FREE_IMAGE_MDTYPE fipTag::getType() const {
	return FreeImage_GetTagType(_tag);
}

DWORD fipTag::getCount() const {
	return FreeImage_GetTagCount(_tag);
}

DWORD fipTag::getLength() const {
	return FreeImage_GetTagLength(_tag);
}

const void* fipTag::getValue() const {
	return FreeImage_GetTagValue(_tag);
}

BOOL fipTag::setKey(const char *key) {
	return FreeImage_SetTagKey(_tag, key);
}

BOOL fipTag::setDescription(const char *description) {
	return FreeImage_SetTagDescription(_tag, description);
}

BOOL fipTag::setID(WORD id) {
	return FreeImage_SetTagID(_tag, id);
}

BOOL fipTag::setType(FREE_IMAGE_MDTYPE type) {
	return FreeImage_SetTagType(_tag, type);
}

BOOL fipTag::setCount(DWORD count) {
	return FreeImage_SetTagCount(_tag, count);
}

BOOL fipTag::setLength(DWORD length) {
	return FreeImage_SetTagLength(_tag, length);
}

BOOL fipTag::setValue(const void *value) {
	return FreeImage_SetTagValue(_tag, value);
}

const char* fipTag::toString(FREE_IMAGE_MDMODEL model, char *Make) const {
	return FreeImage_TagToString(model, _tag, Make);
}
