/*************************************************************************/
/*	File : CKPathSplitter.h												 */
/*	Author :  Nicolas Galinotti											 */	
/*																		 */	
/*	Virtools SDK 															 */	 
/*	Copyright (c) Virtools 2000, All Rights Reserved.						 */	
/*************************************************************************/
#ifndef CKPATHSPLITTER_H
#define CKPATHSPLITTER_H  "$Id:$"

#include "string.h"
#include "stdlib.h"

#ifdef _WIN32_WCE
	#include "VxMathCE.h"
	#include "windows.h"
#endif



/***********************************************************************
Summary: Utility class for filenames extraction

Remarks:
	CKPathSplitter & CKPathMaker are useful for manipulation of filenames and paths.
	CKPathSplitter class is used to break a path into its four components (Drive, Directory Filename and extension).
	CKPathMaker class creates a path string from its four components..


Example:
		// for example to change the name of a file :
		CKPathSplitter	splitter(OldFilename);
		
		char* OldName = splitter.GetName();
		char* newname = ChangeName(OldName);
		CKPathMaker maker(splitter.GetDrive(),splitter.GetDir(),newname,splitter.GetExtension());
		char* NewFilename = maker.GetFileName();
	 	


See also: CKPathMaker
***********************************************************************/
class VX_EXPORT CKPathSplitter
{
public:
	// Constructs the object from a full path.
	CKPathSplitter(char* file);
	
	~CKPathSplitter();

	// Returns the optionnal drive letter, followed by a colon (:)
	char *GetDrive();
	// Returns the optionnal directory path, including trailing slash (\)
	char *GetDir();
	// Returns the file name without extension
	char *GetName();
	// Returns the file extension including period (.)
	char *GetExtension();

	// create the objet from a full path.
	CKPathSplitter& operator=(const char* file);

protected:
	char m_Drive[_MAX_DRIVE];
	char m_Dir[_MAX_DIR];
	char m_Fname[_MAX_FNAME];
	char m_Ext[_MAX_EXT];

};

/***********************************************************************
Summary: Utility class for directory and filenames concatenation

Remarks:
	CKPathSplitter & CKPathMaker are useful for manipulation of filenames and paths.
	CKPathMaker class creates a path string from its four components..


Example:
		// for example to change the name of a file :
		CKPathSplitter	splitter(OldFilename);
		
		char* OldName = splitter.GetName();
		char* newname = ChangeName(OldName);
		CKPathMaker maker(splitter.GetDrive(),splitter.GetDir(),newname,splitter.GetExtension());
		char* NewFilename = maker.GetFileName();
	 	


See also: CKPathSplitter
***********************************************************************/
class VX_EXPORT CKPathMaker
{
public:
	// Constructs the object from an optionnal Drive letter,Directory,Filename and Extension.
	CKPathMaker(char* Drive,char* Directory,char* Fname,char* Extension);
	// Returns the full path. 
	char *GetFileName();

protected:
	char m_FileName[_MAX_PATH];

};

#define VIRTOOLS_MAX_EXTENSION_SIZE	68

/***********************************************************************
Summary: Storage class for filename extensions

	 	


See also: CKPathSplitter,CKPathMaker
***********************************************************************/
struct CKFileExtension
{
	// Ctor
	CKFileExtension()
	{
		memset(m_ExtLong,0,VIRTOOLS_MAX_EXTENSION_SIZE);
	}

	CKFileExtension(char* s)
	{
		if(!s) {
			m_ExtLong[0] = 0;
		} else {
			if(s[0] == '.') {
				s = &s[1];
			}
			int len = (int)strlen(s);
			if(len>(VIRTOOLS_MAX_EXTENSION_SIZE-1)) {
				len = VIRTOOLS_MAX_EXTENSION_SIZE-1; 
			}
			memcpy(m_ExtLong,s,len);
			m_ExtLong[len]= '\0';
		}
	}

	int operator==(const CKFileExtension& s)
	{ 		
		return !strcmpi(m_ExtLong,s.m_ExtLong);
	}

	operator char*()
	{
		return m_ExtLong;
	}

	operator const char*()
	{
		return m_ExtLong;
	}

	// Members secret
	char m_ExtLong[VIRTOOLS_MAX_EXTENSION_SIZE];
};

struct CKFileExtensionShort
{
	// Ctor
	CKFileExtensionShort() {memset(m_ExtShort,0,4);}
	CKFileExtensionShort(char* s) {
		if(!s) m_ExtShort[0] = 0;
		else {
			if(s[0] == '.')
				s = &s[1];
			int len = (int)strlen(s);
			if(len>3) len = 3; 
			memcpy(m_ExtShort,s,len);
			m_ExtShort[len]= '\0';
		}
	}

	int operator==(const CKFileExtensionShort& s){ 		
		return !strcmpi(m_ExtShort,s.m_ExtShort);
	}

	operator char*(){return m_ExtShort;}
	operator const char*(){return m_ExtShort;}

	// Members secret
	char m_ExtShort[4];
};


#endif 
