/*
 *  Copyright (C) 2004 Ewan Bhamrah Harley <code@ewan.info>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program (see the file COPYING included with this
 *  distribution); if not, write to the Free Software Foundation, Inc.,
 *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#include <WinInet.h>
#include <malloc.h>

LPCTSTR getIeHttpProxyError=NULL;

/* getIeHttpProxy fetches the current IE proxy settings for http */

LPCTSTR getIeHttpProxy()
{
  DWORD psize=0;
  INTERNET_PROXY_INFO *pinfo;
  LPTSTR proxyString;
  LPTSTR p;
  LPTSTR q;
  unsigned int len;
	
  /* first see how big a buffer we need for the IPO structure */
  InternetQueryOption(NULL, INTERNET_OPTION_PROXY, NULL, &psize);
  if(!psize)
  {
    getIeHttpProxyError="InternetQueryOption failed to return buffer size";
    return(NULL);
  }

  /* allocate memory for IPO */
  pinfo =  malloc (psize*sizeof(TCHAR));
  if (pinfo == NULL)
  {
    getIeHttpProxyError="malloc failed (1)";
    return(NULL);
  }

  /* now run the real query */
  if(!InternetQueryOption(NULL, INTERNET_OPTION_PROXY, (LPVOID) pinfo, &psize))
  {
    getIeHttpProxyError="InternetQueryOption() failed to find proxy info";
    free(pinfo);
    return(NULL);
  }


  /* see what sort of result we got */
	
  if(pinfo->dwAccessType == INTERNET_OPEN_TYPE_DIRECT)
  {
    /* No proxy configured */
    free(pinfo);
    return("");
  }
  else if(pinfo->dwAccessType == INTERNET_OPEN_TYPE_PROXY)
  {
    /* we have a proxy - now parse result string */
    /* if result string does NOT contain an '=' sign then */
    /* there is a single proxy for all protocols          */
    for (p=(LPTSTR)pinfo->lpszProxy; *p && *p != '='; p++);
    if(!*p)
    {
      /* single proxy */
      /* allocate a new string to return */
      len = 1+strlen(pinfo->lpszProxy);
      proxyString = malloc (len*sizeof(TCHAR));
      if (proxyString == NULL)
      {
        getIeHttpProxyError="malloc failed (2)";
        free(pinfo);
        return(NULL);
      }
      strncpy(proxyString, pinfo->lpszProxy,len);
      proxyString[len]=0;
      free(pinfo);
      return(proxyString);
    }
    else
    {
      /* multiple space seperated proxies defined in the form */
      /* protocol=proxyhost[:port]                            */
      /* we want the one marked "http=", if any.              */
      p=(LPTSTR)pinfo->lpszProxy;
      while(*p && strncmp(p, "http=", 5))
      {
        for(; *p && *p != ' '; p++);
        if(*p) p++;
      }
      if(*p)
      {
        /* found the proxy */
        p+=5;
        for(q=p; *q && *q != ' '; q++);
        /* allocate a buffer for the proxy information */
        len=1+(q-p);
        proxyString=malloc(len*sizeof(TCHAR));
        if(proxyString==NULL)
        {
          getIeHttpProxyError="malloc failed (3)";
          free(pinfo);
          return(NULL);
        }
        strncpy(proxyString, p, len);
        proxyString[len]=0;
        free(pinfo);
        return(proxyString);
      }
      else
      {
        /* No http proxy in list */
        free(pinfo);
        return("");
      }
    }
  }
  else
  {
    /* InternetQueryOption returned a proxy type we don't know about*/
    getIeHttpProxyError="Unknown Proxy Type";
    free(pinfo);
    return(NULL);
  }
}
