/*********************************
Autor:   Steve Moser
Name: 	 save and restore
Funtion: save or restore special kind of filetypes
status:  complete

**********************************/


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <direct.h>
#include <string.h>
#include <io.h>

char tempbuffer[128];
int counter=0;
int dirlaenge;
char files[255];
char quelle[255];
char ziel[255];
char curdrive[255];
char mitVerz;
char i;

FILE *stream;
FILE *stream1;
FILE *stream2;



/*******************
//function: save
//return value: none
*******************/
int sichern()
{   
	
	char help[255];

	
	
	if(mitVerz=='j')
		strcpy(help,"xcopy /e ");
	else
		strcpy(help,"xcopy ");

	strcat(help,quelle);						//endgueltiger satzzusammenbau fuer systemaufruf
	strcat(help,files);
	strcat(help," ");		
	strcat(help,ziel);
	system(help);


	return 0;
}

/*********************
function: question to save with subdirectories
return value: none
*********************/
void mitUV()
{
	printf("Sollen die Unterverzeichnisse mitgesichert werden?\n");
	scanf("%c",&mitVerz);
}

/*****************
function: get source to save or restore
return value: void
*****************/

void getsource()								//sucht nach dem quellpfad in der ini
{
	int result=-1;
	char source[]="[SOURCEPATH]";
	char string[255];
	struct _finddata_t ini_file;
	long hFile;

	_chdir(curdrive);


	if( (hFile = _findfirst( "HCTSAVE.INI", &ini_file )) == -1L )
		{	
			printf( "Die HCTSAVE.INI Datei befindet sich nicht im aktuellen Verzeichnis!\n" );
			printf( "Das Programm wird beendet!!");
			fflush(stdin);
			scanf("%c",&i);
			exit(-1);
		}

		else
		{
				stream1  = fopen( "HCTSAVE.INI", "r" );

				while(result!=0)
				{
					fgets(string,255,stream1);
					string[strlen(string)-1]='\0';
					result=strcmp(string,source);			//compares strings and sets result=0 if equal
				}
					fgets(quelle,255,stream1);
					quelle[strlen(quelle)-1]='\0';		//nun kommt nur der wirkliche quellpfad und wird in quelle gespeichert
		}
				fclose(stream1);
}

void makedir()									//sucht nach vorhandenen save ordner und zaehlt sie aufwaerts
{												//wenn der letzte gefunden wurde,wird ein neuer angelegt
	
	char pfad[255];
	char finalpfad[255];
	char* temp;
	temp = malloc(255);

	itoa(counter,temp,10);						//umwandlung von int in char			

	strcpy(pfad, ziel );						//string generierung zur ueberpruefung der vorhandenen files
	strcat(pfad, "\\save");
	strcat(pfad,temp);


	while( _chdir(pfad) != -1   )				//durch counter wird der save folder erhoeht z.b.save5
	{
		counter++;
	    itoa(counter,temp,10);					//jeweilige umwandlung von int in char fuer den string
		strcpy(pfad, ziel);
		strcat(pfad, "\\save");
		strcat(pfad, temp);
		
	}
	strcpy(ziel,pfad);			
	strcpy(finalpfad, "md ");
	strcat(finalpfad,"\"");
	strcat(finalpfad, pfad);
	strcat(finalpfad,"\"");
	system(finalpfad);							//systemaufruf mit letztendlichem md dos befehl & filename 
												//z.b."md c:\save\save5"
	_chdir(curdrive);
}


void gettarget()								//sucht sich in der ini file den zielpfad
{
	int result=-1;
	char save[]="[SAVEPATH]";
	char string[255];
	struct _finddata_t ini_file;
	long hFile;

	_chdir(curdrive);

	if( (hFile = _findfirst( "HCTSAVE.INI", &ini_file )) == -1L )		//ueberprueft ob die file vorhanden ist
		{	
			printf( "Die HCTSAVE.INI Datei befindet sich nicht im aktuellen Verzeichnis!\n" );
			printf( "Das Programm wird beendet!!");
			fflush(stdin);
			scanf("%c",&i);
			exit(-1);
		}
			else
		{
				stream2  = fopen( "HCTSAVE.INI", "r" );
				while(result!=0)
				{
					fgets(string,255,stream2);
					string[strlen(string)-1] = '\0';
					result=strcmp(string,save);
				}
			fgets(ziel,255,stream2);
			ziel[strlen(ziel)-1]='\0';
		}
		fclose(stream2);
}

void DestroyOld()
{
	char help[255];

	strcpy(help,"del/s ");
	strcat(help,quelle);
	strcat(help,"\\");
	strcat(help,files);
	system(help);
}

void getfiles()														//sucht nach den zu sicherndern files in der ini datei
{
	int result=-1;
	char file[]="[FILES]";
	char source[]="[SOURCEPATH]";
	char string[255];
	struct _finddata_t ini_file;
	long hFile;	
	


	gettarget();
	getsource();
	if(i!='w')
	makedir();
    

	if( (hFile = _findfirst( "HCTSAVE.INI", &ini_file )) == -1L )
		{	
			printf( "Die HCTSAVE.INI Datei befindet sich nicht im aktuellen Verzeichnis!\n" );
			printf( "Das Programm wird beendet!!");
			fflush(stdin);
			scanf("%c",&i);
			exit(-1);
		}

	else
		{
			stream  = fopen( "HCTSAVE.INI", "r" );
				while(result!=0)
				{
					
					fgets(string,255,stream);
					string[strlen(string)-1]='\0';
					if (strlen(string)==0)
						continue;
					result=strcmp(string,file);
				}

				result=-1;											//fuer naechste while schleife

				while(result!=0) 
				{
					fgets(files, 255,stream);
					files[strlen(files)-1] = '\0';
					if(strlen(files)==0)
						continue;
					result=strcmp(files,source);
					if(result==0)
						continue;
					if(i=='w')
					DestroyOld();
					else
						sichern();										// sofortiger aufruf zum sichern
																	// der einzelnen datei(endung)
				}
												
							

			fclose(stream);
		}
}
		



int wiederherstellen()												//stellt ordner zur auswahl und stellt den
{																	//gewaehlten ordner wieder her
	char help[255];
	char warten;
	
	char* temp;
	temp = malloc(255);

	printf("\nSollen die in der .ini gennanten Dateien vorher geloescht werden?[j][n]:");
	scanf("%c",&warten);
	if (warten=='j')
		getfiles();
	else
	{	
		getsource();
		gettarget();
	}
	
	printf("Welcher Ordner soll wiederhergestellt werden?(Zahl)\n\n");
	strcpy(help,"dir /a " );									//creating a full order for systemcall
	strcat(help,ziel);											//				
	system(help);												//						
	printf("Bitte geben Sie nur die Nummer des Ordners an:");
	scanf("%d",&counter);										//number of save folder e.g. 5 for save5 folder

	itoa(counter,temp,10);										//converts int to char
	strcpy(help, "xcopy /s /y /f ");
	strcat(help,"\"");
	strcat(help,ziel);
	strcat(help,"\\");
	strcat(help,"save");
	strcat(help, temp);
	strcat(help,"\"");
	strcat(help," ");
	strcat(help,"\"");
	strcat(help,quelle );
	strcat(help,"\"");
	system(help);
	scanf("%c",&warten);										//wait for finish
	return 0;
}

void info()
{
	printf("Ver.1.0\n");
	printf("SAFE AND RESTORE FOR HCT\n");
	_strtime( tempbuffer );
	printf( "OS time:\t\t\t\t%s\n", tempbuffer );
	_strdate( tempbuffer );
	printf( "OS date:\t\t\t\t%s\n", tempbuffer );
	printf("===========================================================================\n\n");
	printf("Dieses Programm dient zur Sicherung und Wiederherstellung der *.log und\n*.ini Dateien des HCT-Programmes.\n");
	printf("Die Quell-, und Zielfade koennen in der HCTSAVE.INI ueber den Editor veraendert werden.\n");
	printf("Es koennen unter [FILES] in der .ini Datei beliebige Dateienendungen,\nwie z.B. *.log, zur Sicherung eingetragen werden.\n");
	printf("ACHTUNG!! Die .INI muss sich in dem gleichen Verzeichnis befinden wie \ndie exe Datei.\n");
	printf("Das aktuelle Verzeichnis ist: %s \n",curdrive);

}

void main(int argc, char *argv[ ] )
{
	
	
	
	strcpy (curdrive,argv[0]);
	dirlaenge=(strlen(argv[0]));
	

	while(curdrive[strlen(curdrive)-1] != '\\')			//da in curdrive das verzeichnis und filename stehen
		curdrive[strlen(curdrive)-1] = '\0';			//wird er abgeschnitten bis nur das verzeichnis uebrig bleibt
	
		
	info();

	printf("\nWas moechten Sie machen?\n\nSichern(s)\n----------------------\nWiederherstellen(w)\n\n==========================================================================\n\n");

nochmal:	
	scanf("%c",&i);
	fflush(stdin);
	
	switch(i)
	{
		case 's': mitUV();
				  getfiles();
				  break;

		case 'w': wiederherstellen();
					break;

		case 'e': exit (-1);

		default: printf("\nBitte s,w oder e fuer Exit eingeben.\n");
			     goto nochmal;
	}
	scanf("%c",&i);										//zum beenden des programms taste druecken
}

syntax highlighted by Code2HTML, v. 0.9.1