#include <windows.h>

#include <stdio.h>

void Renamer(const char* mask)
{
  char drive[_MAX_DRIVE], path[_MAX_PATH], fname[_MAX_FNAME], ext[_MAX_EXT];
  _splitpath(mask, drive, path, NULL, NULL);


  WIN32_FIND_DATA data;
  HANDLE hHandle = ::FindFirstFile(mask, &data);
  BOOL bRunning = hHandle != INVALID_HANDLE_VALUE;
  while (bRunning)
  {
    _splitpath(data.cFileName, NULL, NULL, fname, ext);

    const char* newext = NULL;
    if (stricmp(ext, ".ex_") == 0) 
      newext = ".exe"; else
    if (stricmp(ext, ".dl_") == 0) 
      newext = ".dll";

    if (newext != NULL)
    {
      char oldpath[_MAX_PATH], newpath[_MAX_PATH];
      _makepath(oldpath, drive, path, fname, ext);
      _makepath(newpath, drive, path, fname, newext);
      if (::CopyFile(oldpath, newpath, FALSE))
      {
        ::DeleteFile(oldpath);
      }
      else
      {
        char msg[512];
        LPVOID lpMsgBuf;
        FormatMessage( 
          FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
          NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
          (LPTSTR) &lpMsgBuf, 0, NULL);
        sprintf(msg, "Impossibile ridenominare il file %s in %s:\n%s", 
                oldpath, newpath, lpMsgBuf);
        ::LocalFree(lpMsgBuf);
        ::MessageBox(NULL, msg, "Aggiornamento sistema", MB_ICONERROR | MB_OK);
      }
    }
    
    bRunning = ::FindNextFile(hHandle, &data);
  }
}

int PASCAL WinMain(HINSTANCE, HINSTANCE , LPSTR cmd_line, int)
{
  ::MessageBox(NULL, "Premere OK ed attendere il riavvio del programma", 
               "Aggiornamento sistema", MB_ICONWARNING | MB_OK);
  ::Sleep(3000); // Apetta qualche secondo che termini ba0.exe

  Renamer("*.??_");
  Renamer("Servers\\*.??_");

	int modules_pending = ::GetPrivateProfileInt("ba0close", "ModulesPending", 0, "./campo.ini");
  
	if (modules_pending != 0)
	{
		char cmd[256];
		strcpy(cmd, "ba1.exe -6 /u");
		const char* u = strstr(cmd_line, "/u");
		if (u != NULL)
			strcat(cmd, u+2);
		else
			strcat(cmd, "ADMIN");

		WinExec(cmd, SW_SHOWNORMAL);
	}
	else
		WinExec("ba0.exe", SW_SHOWNORMAL);

  return 0;
}