/*
 * 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 tapiGetLocationInfo(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 tapiRequestMakeCall(LPCSTR lpszDestAddress, LPCSTR lpszAppName,
                                 LPCSTR lpszCalledParty, LPCSTR lpszComment)
{
    FIXME("(%s, %s, %s, %s): stub.\n", lpszDestAddress, lpszAppName, lpszCalledParty, lpszComment);
    return 0;
}
