/*
 * Class:     fr_umlv_unitex_jni_UnitexJni
 * Method:    installLogger
 * Signature: (Ljava/lang/String;Z)Z
 */
JNIEXPORT jboolean JNICALL Java_fr_umlv_unitex_jni_UnitexJni_installLogger
  (JNIEnv *env, jclass, jstring foldername, jboolean store_file_out_content)
{
	jstringToCUtf jstc_foldername;
	jstc_foldername.initJString(env,foldername);

	if (p_ule)
		return JNI_FALSE;

	p_ule= (struct UniLoggerSpace *)malloc(sizeof(struct UniLoggerSpace));
    if (!p_ule)
		return JNI_FALSE;
	memset(p_ule,0,sizeof(struct UniLoggerSpace));

	p_ule->size_of_struct = sizeof(struct UniLoggerSpace);
	p_ule->privateUnloggerData = NULL;
	p_ule->szPathLog = strdup(jstc_foldername.getJString());
	p_ule->szNameLog = NULL;
	p_ule->store_file_out_content = store_file_out_content;
	p_ule->store_list_file_out_content = 1;
	p_ule->store_file_in_content = 1;
	p_ule->store_list_file_in_content = 1;
	p_ule->store_std_out_content = 0;
	p_ule->store_std_err_content = 0;
	p_ule->auto_increment_logfilename = 1;

	if (0 != AddActivityLogger(p_ule))
		return JNI_TRUE;

	free(p_ule);
	return JNI_FALSE;
}
void InstallLogger::LoadParamFile(const char* parameter_filename) {
    init_done = 0;
    
    ABSTRACTFILE *af_fin = af_fopen_unlogged((parameter_filename != NULL) ?
                                parameter_filename : "unitex_logging_parameters.txt","rb");
    if (af_fin!=NULL)
    {
        size_t size_param=0;

        if (af_fseek(af_fin, 0, SEEK_END) == 0)
	    {
		    size_param = af_ftell(af_fin);
            af_fseek(af_fin, 0, SEEK_SET);
        }

        char* param=(char*)malloc(size_param+1);
        *(param+size_param)=0;
        if (af_fread(param,1,size_param,af_fin) == size_param)
        {
            
            int write_file_out=0;
            char*szPath = (char*)malloc(size_param+1);
            *szPath=0;
            sscanf(param,"%s\n%u",szPath,&write_file_out);
            write_file_out+=0;
            if ((*szPath) != 0)
            {
                ClearUniLoggerSpaceStruct(0);

                ule.szPathLog = szPath;
                ule.szNameLog = NULL;
                ule.store_file_out_content = write_file_out;

                if (AddActivityLogger(&ule) != 0)
                    init_done = 1;
                else
                {
                    ClearUniLoggerSpaceStruct(1);
                }
            }
            else
                free(szPath);
        }
        af_fclose(af_fin);
        free(param);        
    }
}
	UnitexLogInstaller::UnitexLogInstaller(string const & strPathLog, bool bStoreFileOutContent)
	{
		init_done = 0;

		/* we want "mini log" with only list */

		ule.size_of_struct = sizeof(struct unitex::logger::UniLoggerSpace);
		ule.privateUnloggerData = NULL;
		ule.szPathLog = strdup(strPathLog.c_str());
		ule.szNameLog = NULL;
		ule.store_file_out_content = bStoreFileOutContent ? 1 : 0;
		ule.store_list_file_out_content = 1;
		ule.store_file_in_content = 1;
		ule.store_list_file_in_content = 1;
		ule.store_std_out_content = 0;
		ule.store_std_err_content = 0;
		ule.auto_increment_logfilename = 1;

		if (AddActivityLogger(&ule) != 0)
			init_done = 1;
	}
	UnitexLogInstaller::UnitexLogInstaller(bool bStoreFileOutContent)
	{
		init_done = 0;

		/* we want "mini log" with only list */

		ule.size_of_struct = sizeof(struct unitex::logger::UniLoggerSpace);
		ule.privateUnloggerData = NULL;
		ule.szPathLog = NULL;
		ule.store_file_out_content = bStoreFileOutContent ? 1 : 0;
		ule.store_list_file_out_content = 1;

		ule.store_file_in_content = 0 + 1;
		ule.store_list_file_in_content = 1;

		/* we dont want "auto generate" log */
		ule.auto_increment_logfilename = 0;

		if (AddActivityLogger(&ule) != 0)
			init_done = 1;
	}
InstallLogger::InstallLogger(int argc,char* const argv[]) :
  ule(ule_default_init), init_done(0) {
  ClearUniLoggerSpaceStruct(0);
  if (argc==1) {
    usage();
    return;
  }

  Encoding encoding_output = DEFAULT_ENCODING_OUTPUT;
  int bom_output = DEFAULT_BOM_OUTPUT;
  int mask_encoding_compatibility_input = DEFAULT_MASK_ENCODING_COMPATIBILITY_INPUT;
  int val,index=-1;
  bool only_verify_arguments = false;
  UnitexGetOpt options;
  while (EOF!=(val=options.parse_long(argc,argv,optstring_CreateLog,lopts_CreateLog,&index))) {
     switch(val) {
       case 'V': only_verify_arguments = true;
                 break;
       case 'h': usage();
                 return;
       case 'n': ule.store_file_in_content = 0;
                 break;
       case 'i': ule.store_file_in_content = 1;
                 break;
       case 'o': ule.store_file_out_content = 1;
                 break;
       case 'u': ule.store_file_out_content = 0;
                 break;
       case 's': ule.store_list_file_in_content = 1;
                 break;
       case 't': ule.store_list_file_in_content = 0;
                 break;
       case 'r': ule.store_list_file_out_content = 1;
                 break;
       case 'f': ule.store_list_file_out_content = 0;
                 break;
       case ':': index==-1 ? error("Missing argument for option -%c\n",options.vars()->optopt) :
                             error("Missing argument for option --%s\n",lopts_CreateLog[index].name);
                 return;            
       case 'k': if (options.vars()->optarg[0]=='\0') {
                    error("Empty input_encoding argument\n");
                    return;
                 }
                 decode_reading_encoding_parameter(&mask_encoding_compatibility_input,options.vars()->optarg);
                 break;
       case 'q': if (options.vars()->optarg[0]=='\0') {
                    error("Empty output_encoding argument\n");
                    return;
                 }
                 decode_writing_encoding_parameter(&encoding_output,&bom_output,options.vars()->optarg);
                 break;
       case 'g': ClearUniLoggerSpaceStruct(1);
                 return;
       case 'p': if (options.vars()->optarg[0]=='\0') {
                    error("You must specify a non empty param file\n");
                    return;
                 }
                 ClearUniLoggerSpaceStruct(1);
                 LoadParamFile(options.vars()->optarg);
                 return;
       case 'l': if (options.vars()->optarg[0]=='\0') {
                    error("You must specify a non empty log filename\n");
                    return;
                 }
                 if (ule.szNameLog != NULL) {
                     free((void*)ule.szNameLog);
                 }
                 ule.szNameLog = strdup(options.vars()->optarg);
                 break;
     
       case 'd': if (options.vars()->optarg[0]=='\0') {
                    error("You must specify a non empty directory\n");
                    return;
                 }
                 if (ule.szPathLog != NULL) {
                     free((void*)ule.szPathLog);
                 }    
                 ule.szPathLog = strdup(options.vars()->optarg);
                 break;

       case '?': index==-1 ? error("Invalid option -%c\n",options.vars()->optopt) :
                             error("Invalid option --%s\n",options.vars()->optarg);
                 return;
     }
     index=-1;
  }

  if (options.vars()->optind!=argc-1) {
  }

  if (only_verify_arguments) {
    // freeing all allocated memory
    return;
  }

  if (AddActivityLogger(&ule) != 0) {
    init_done = 1;
  } else {
    ClearUniLoggerSpaceStruct(1);
  }
}