/*
 * TAPI32 Assisted Telephony
 *
 * Copyright 1999  Andreas Mohr
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#include <stdarg.h>
#include <stdio.h>
#include "windef.h"
#include "winbase.h"
#include "winreg.h"
#include "tapi.h"
#include "wine/debug.h"

WINE_DEFAULT_DEBUG_CHANNEL(tapi);

/***********************************************************************
 *		tapiGetLocationInfo (TAPI32.@)
 */
DWORD WINAPI tapiGetLocationInfoA(LPSTR lpszCountryCode, LPSTR lpszCityCode)
{
    HKEY hkey, hsubkey;
    DWORD currid;
    DWORD valsize;
    DWORD type;
    DWORD bufsize;
    BYTE buf[100];
    char szlockey[20];
    if(!RegOpenKeyA(HKEY_LOCAL_MACHINE,
           "Software\\Microsoft\\Windows\\CurrentVersion\\Telephony\\Locations",
           &hkey) != ERROR_SUCCESS) { 
        valsize = sizeof( DWORD);
        if(!RegQueryValueExA(hkey, "CurrentID", 0, &type, (LPBYTE) &currid,
                    &valsize) && type == REG_DWORD) {
            /* find a subkey called Location1, Location2... */
            sprintf( szlockey, "Location%lu", currid); 
            if( !RegOpenKeyA( hkey, szlockey, &hsubkey)) {
                if( lpszCityCode) {
                    bufsize=sizeof(buf);
                    if( !RegQueryValueExA( hsubkey, "AreaCode", 0, &type, buf,
                                &bufsize) && type == REG_SZ) {
                        strncpy( lpszCityCode, (char *) buf, 8);
                        if(bufsize > 8) lpszCityCode[7] = '\0';
                    } else 
                        lpszCityCode[0] = '\0';
                }
                if( lpszCountryCode) {
                    bufsize=sizeof(buf);
                    if( !RegQueryValueExA( hsubkey, "Country", 0, &type, buf,
                                &bufsize) && type == REG_DWORD)
                        snprintf( lpszCountryCode, 8, "%lu", *(LPDWORD) buf );
                    else
                        lpszCountryCode[0] = '\0';
                }
                TRACE("(%p \"%s\", %p \"%s\"): success.\n",
                        lpszCountryCode, debugstr_a(lpszCountryCode),
                        lpszCityCode, debugstr_a(lpszCityCode));
                RegCloseKey( hkey);
                RegCloseKey( hsubkey);
                return 0; /* SUCCESS */
            }
        }
        RegCloseKey( hkey);
    }
    WARN("(%p, %p): failed (no telephony registry entries?).\n",
            lpszCountryCode, lpszCityCode);
    return TAPIERR_REQUESTFAILED;
}

/***********************************************************************
 *		tapiRequestMakeCall (TAPI32.@)
 */
DWORD WINAPI tapiRequestMakeCallA(LPCSTR lpszDestAddress, LPCSTR lpszAppName,
                                 LPCSTR lpszCalledParty, LPCSTR lpszComment)
{
    FIXME("(%s, %s, %s, %s): stub.\n", lpszDestAddress, lpszAppName, lpszCalledParty, lpszComment);
    return 0;
}
