APP-COMM-Capitel/capitel/source.os2/capitel.c

1715 lines
47 KiB
C

#ifdef LANG_GER
#define ACT_LANG LANGUAGE_GER
#else
#define ACT_LANG LANGUAGE_ENG
#endif
#define INCL_PM
#define INCL_DOS
#define INCL_32
#define INCL_MCIOS2
#define INCL_WINWORKPLACE
#include <os2.h>
#include <os2me.h>
#include <mciapi.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <io.h>
#include "capitel.h"
#include "..\..\common\source\version.h"
#include "configex.h"
#include "toolbar.h"
#include "statbar.h"
#include "cntr.h"
#include "config.h"
#include "configrc.h"
// #include "loadmci.h"
#include "regist.h"
#include "sysfile.h"
#include "texte.h"
#include "..\..\answer\source\answer.h"
#include "..\..\common\source\global.h"
#include "..\..\..\units\common.src\cfg_file.h"
#include "..\..\util\source\dosstart.h"
#include "..\..\util\source\register.h"
#define SetAppTitle( str ) WinSetWindowText( hwndFrame, (PSZ) str );
MRESULT EXPENTRY ctelFrameProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 );
MRESULT EXPENTRY ctelCntrProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 );
MRESULT EXPENTRY cmdProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
MRESULT EXPENTRY recProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
MRESULT EXPENTRY aboutProc(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2);
MRESULT EXPENTRY inCallProc(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2);
MRESULT EXPENTRY recordInfoProc(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2);
void MsgBox( char * );
void ErrorBox( char *, HWND );
void sigFunc( short, void * );
void ScanForCalls( void );
void DeleteCall( void );
void LoadBitmaps( HWND );
void centerDialog( HWND, HWND );
void copyFile( char *, char *);
void setHeard( CntrRec * );
void delete_cr( char * );
short queryDimensions( HWND, char *, ULONG *, ULONG * );
short onlyDigits( char * );
char *strip_blanks( char * );
void shExecute( char *, BOOL );
void ctel_disc_ind( long, short );
void ctel_filenum( short );
void ctel_connect_ind( TCapiInfo * );
void ctel_convert_status( short );
void ctel_rescan( void );
int wavplay_start( HWND hwnd, char* wavFile );
int wavplay_stop( short deviceID );
short wavplay_current_deviceID = 0;
int MyMsgBox(HWND hwndParent, HWND hwndOwner,
char* text, char* title, int style, int icon);
int MyMsgBoxEx(HWND hwndParent, HWND hwndOwner,
char* text, char* title, char* checktext, int style, int icon,
char* pCfgFile, char* pCfgKey);
MRESULT EXPENTRY MsgBoxProc(
HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
PFNWP oldFrameProc, oldCntrProc;
HPOINTER cntrIcoCall, cntrIcoCallWav, cntrIcoCallHeard, cntrIcoCallDigital;
HPOINTER portsIcoActive, portsIcoInactive, callersIcoActive, callersIcoInactive;
HPOINTER actionIcoActive, actionIcoInactive;
TCallInfo CallInfo;
char do_isdn_close = 0, isRecording = 0, wasInActive = 0;
char callPending = 0;
char recFile[256], textmsg[256], defaultBarText[256];
CntrRec *currRec;
char mmpmInstalled = 1;
HWND hwndFrame, hwndCntr, hwndToolbar, hwndStatusbar, hwndPopup;
HWND hwndInCall = 0, hwndRecInfo = 0;
int main( int argc, char *argv[] )
{
HAB hab;
HMQ hmq;
QMSG qmsg;
FRAMECDATA fcd;
int i;
hab = WinInitialize( 0 );
hmq = WinCreateMsgQueue( hab, 0 );
registerToolbar( hab );
registerStatusbar( hab );
fcd.cb = sizeof( FRAMECDATA );
fcd.flCreateFlags = FCF_MINMAX | FCF_SIZEBORDER | FCF_SYSMENU |
FCF_TITLEBAR | FCF_SHELLPOSITION | FCF_TASKLIST |
FCF_MENU | FCF_ICON | FCF_ACCELTABLE | FCF_CLOSEBUTTON;
fcd.hmodResources = 0;
fcd.idResources = ID_FRAME;
hwndFrame = WinCreateWindow( HWND_DESKTOP, WC_FRAME, APPNAME,
0, 0, 0, 0, 0, 0, HWND_TOP, ID_FRAME,
&fcd, 0 );
WinShowWindow( hwndFrame, FALSE );
WinCreateWindow( hwndFrame, "pmToolbar", "", 0, 10, 10, 30, 30,
hwndFrame, HWND_TOP, ID_TOOLBAR, 0, 0 );
WinCreateWindow( hwndFrame, "pmStatusbar", APPNAME, 0, 0, 0, 0, 0,
hwndFrame, HWND_TOP, ID_STATUSBAR, 0, 0 );
hwndCntr = WinCreateWindow( hwndFrame, WC_CONTAINER, 0,
CCS_MINIRECORDCORE | CCS_READONLY |
CCS_SINGLESEL, 0, 0, 0, 0, hwndFrame,
HWND_BOTTOM, FID_CLIENT, 0, 0 );
oldFrameProc = WinSubclassWindow( hwndFrame, ctelFrameProc );
oldCntrProc = WinSubclassWindow( hwndCntr, ctelCntrProc );
hwndToolbar = WinWindowFromID( hwndFrame, ID_TOOLBAR );
hwndStatusbar = WinWindowFromID( hwndFrame, ID_STATUSBAR );
hwndPopup = WinLoadMenu( hwndCntr, NULLHANDLE, ID_POPUP );
/* Fake window creation... */
WinPostMsg( hwndFrame, WM_CREATE, 0, 0 );
while( WinGetMsg(hab, (PQMSG) &qmsg, 0, 0, 0) )
WinDispatchMsg(hab, (PQMSG) &qmsg );
WinSetWindowPos( hwndFrame, 0, 0, 0, 0, 0, SWP_HIDE );
WinStoreWindowPos( "CapiTel", "WinPos", hwndFrame );
WinDestroyWindow( hwndFrame );
WinDestroyMsgQueue( hmq );
WinTerminate( hab );
if( do_isdn_close )
{
answer_exit();
while( answer_cannot_close() ) DosSleep (300);
}
return 0;
}
MRESULT EXPENTRY ctelFrameProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
{
MRESULT rc;
PRECTL prectl;
SHORT countSwp;
PSWP pswp, pswpClient=0, pswpToolbar=0, pswpStatusbar=0;
int cy, cyStatus;
SWP swp, *sav;
RGB rgb;
ULONG fl;
TRACKINFO TrackInfo;
switch( msg )
{
case WM_CREATE: /* Faked Window Creation !!! */
if( !initRegistration() )
{
/*
if( !checkSystemFile() )
{
MsgBox( VEREXP );
WinDlgBox( HWND_DESKTOP, hwndFrame, (PFNWP) registrationProc,
NULLHANDLE, REG_DIALOG, NULL );
if( strlen( QueryRegName() ) > 0 )
MsgBox( RESTART );
WinPostMsg( hwnd, WM_QUIT, 0, 0 );
break;
}
*/
if (999 == config_file_read_ulong (STD_CFG_FILE,DEFAULT_ANSW_DELAY,DEFAULT_ANSW_DELAY_DEF)) {
sprintf( defaultBarText, FREETEXT, APPNAME );
} else {
sprintf( defaultBarText, UNREGTEXT, APPNAME );
}
}
else
sprintf( defaultBarText, ISREGTEXT, APPNAME,
QueryRegName() );
LoadBitmaps( hwnd );
AddButton( IDI_TOGGLE );
AddSpace( 8 );
AddButton( ID_CALL_PLAY );
AddButton( ID_CALL_PLAY_ALL );
AddButton( ID_CALL_DEL );
AddSpace( 8 );
AddButton( IDI_SETUP );
AddButton( IDI_PORTS );
AddButton( IDI_PEOPLE );
AddButton( IDI_DTMF );
InitContainer( );
if( !(fl = config_file_read_ulong( STD_CFG_FILE, CAPITEL_RUN_CNT, CAPITEL_RUN_CNT_DEF )) )
{
config_file_write_ulong( STD_CFG_FILE, CAPITEL_RUN_CNT, 1 );
WinPostMsg( hwnd, WM_COMMAND, MPFROM2SHORT( IDI_SETUP, 0 ), NULL );
}
else
{
config_file_write_ulong( STD_CFG_FILE, CAPITEL_RUN_CNT, ++fl );
if( config_file_read_ulong( STD_CFG_FILE, WINDOW_FRAMECTRLS_HIDDEN, WINDOW_FRAMECTRLS_HIDDEN_DEF ) )
{
config_file_write_ulong( STD_CFG_FILE, WINDOW_FRAMECTRLS_HIDDEN, 0 );
WinPostMsg( hwndFrame, WM_COMMAND, MPFROM2SHORT( IDI_HIDE, 0 ), 0 );
}
else
{
WinSendMsg( WinWindowFromID( hwnd, FID_MENU ), MM_SETITEMATTR,
MPFROM2SHORT( IDI_HIDE, TRUE ),
MPFROM2SHORT( MIA_CHECKED, MIA_CHECKED ) );
WinSendMsg( hwndPopup, MM_SETITEMATTR,
MPFROM2SHORT( IDI_HIDE, TRUE ),
MPFROM2SHORT( MIA_CHECKED, MIA_CHECKED ) );
}
}
if( !WinRestoreWindowPos( "CapiTel", "WinPos", hwndFrame ) )
{
/* Set some defaults values */
rgb.bBlue = 254;
rgb.bGreen = 254;
rgb.bRed = 254;
WinSetPresParam( hwndCntr, PP_BACKGROUNDCOLOR, sizeof( RGB ), &rgb );
WinSetPresParam( hwndCntr, PP_FONTNAMESIZE, sizeof( DefCntrFont ),
DefCntrFont );
WinSetWindowPos( hwndFrame, 0, 15, 15, 450, 300,
SWP_MOVE | SWP_SIZE | SWP_SHOW );
}
else
WinSetWindowPos( hwndFrame, HWND_TOP, 0, 0, 0, 0, SWP_SHOW |
SWP_ACTIVATE | SWP_ZORDER );
WinSendMsg( WinWindowFromID( hwnd, FID_MENU ), MM_SETITEMATTR,
MPFROM2SHORT( IDI_TOGGLE, TRUE ),
MPFROM2SHORT( MIA_CHECKED, MIA_CHECKED ) );
WinSendMsg( hwndPopup, MM_SETITEMATTR,
MPFROM2SHORT( IDI_TOGGLE, TRUE ),
MPFROM2SHORT( MIA_CHECKED, MIA_CHECKED ) );
// SetStatus( "Initializing MMPM..." );
// LoadMMPM();
SetStatus( INITISDN );
if( answer_init( sigFunc, 1 , ACT_LANG) )
break;
answer_listen();
do_isdn_close = 1;
SetStatus( SCANCALLS );
ScanForCalls();
SetStatus( defaultBarText );
break;
case WM_CALCFRAMERECT:
rc = ( *oldFrameProc )( hwnd, msg, mp1, mp2 );
if( rc && mp2 )
{
if( config_file_read_ulong( STD_CFG_FILE, WINDOW_FRAMECTRLS_HIDDEN, WINDOW_FRAMECTRLS_HIDDEN_DEF) )
{
cy = 0;
cyStatus = 0;
}
else
{
cy = 30;
cyStatus = 22;
}
prectl = (PRECTL) mp1;
prectl->yTop -= (cy+cyStatus);
prectl->yBottom += cyStatus;
}
return rc;
case WM_FORMATFRAME:
countSwp = (int) (*oldFrameProc)(hwnd, msg, mp1, mp2);
pswp=(PSWP)mp1;
if( config_file_read_ulong( STD_CFG_FILE, WINDOW_FRAMECTRLS_HIDDEN, WINDOW_FRAMECTRLS_HIDDEN_DEF ) )
{
cy = 0;
cyStatus = 0;
}
else
{
cy = 30;
cyStatus = 22;
}
sav=pswpToolbar=&pswp[countSwp-1];
pswpStatusbar=&pswp[countSwp];
pswpClient=&pswp[countSwp+1];
*pswpStatusbar = *sav;
*pswpClient = *sav;
pswpClient->y += cyStatus;
pswpClient->cy -= cyStatus+cy;
pswpToolbar->hwnd=WinWindowFromID(hwnd, ID_TOOLBAR);
pswpToolbar->y = (pswpClient->y+pswpClient->cy);
pswpToolbar->cy = cy;
pswpStatusbar->hwnd=WinWindowFromID(hwnd, ID_STATUSBAR);
pswpStatusbar->y = pswpClient->y - cyStatus;
pswpStatusbar->cy = cyStatus;
return MRFROMSHORT( countSwp+2 );
case WM_QUERYFRAMECTLCOUNT:
return MPFROMSHORT( (ULONG)((*oldFrameProc)(hwnd, msg, mp1, mp2)) +2 );
case WM_WINDOWPOSCHANGED:
pswp = (PSWP) PVOIDFROMMP( mp1 );
if( pswp->fl & SWP_MINIMIZE )
memcpy( &oldSWP, ++pswp, sizeof( SWP ) );
return ( *oldFrameProc )( hwnd, msg, mp1, mp2 );
case WM_TRACKFRAME:
if( !(WinGetKeyState( HWND_DESKTOP, VK_BUTTON2 ) & 0x8000) )
return ( *oldFrameProc )( hwnd, msg, mp1, mp2 );
WinSetFocus( HWND_DESKTOP, hwnd );
WinQueryWindowPos( hwnd, &swp );
if( swp.fl & SWP_MINIMIZE )
return ( *oldFrameProc )( hwnd, msg, mp1, mp2 );
memset ( &TrackInfo, 0, sizeof(TrackInfo) ) ;
TrackInfo.cxBorder = 2 ;
TrackInfo.cyBorder = 2 ;
TrackInfo.cxGrid = 2 ;
TrackInfo.cyGrid = 2 ;
TrackInfo.cxKeyboard = 8 ;
TrackInfo.cyKeyboard = 8 ;
WinQueryWindowPos ( hwnd, &swp ) ;
TrackInfo.rclTrack.xLeft = swp.x ;
TrackInfo.rclTrack.xRight = swp.x + swp.cx ;
TrackInfo.rclTrack.yBottom = swp.y ;
TrackInfo.rclTrack.yTop = swp.y + swp.cy ;
WinQueryWindowPos ( HWND_DESKTOP, &swp ) ;
TrackInfo.rclBoundary.xLeft = swp.x ;
TrackInfo.rclBoundary.xRight = swp.x + swp.cx ;
TrackInfo.rclBoundary.yBottom = swp.y ;
TrackInfo.rclBoundary.yTop = swp.y + swp.cy ;
TrackInfo.ptlMinTrackSize.x = 0 ;
TrackInfo.ptlMinTrackSize.y = 0 ;
TrackInfo.ptlMaxTrackSize.x = swp.cx ;
TrackInfo.ptlMaxTrackSize.y = swp.cy ;
TrackInfo.fs = TF_MOVE | TF_STANDARD | TF_ALLINBOUNDARY ;
if ( WinTrackRect ( HWND_DESKTOP, (HPS)NULL, &TrackInfo ) )
{
WinSetWindowPos ( hwnd, 0, TrackInfo.rclTrack.xLeft,
TrackInfo.rclTrack.yBottom, 0, 0, SWP_MOVE ) ;
}
return MPFROMSHORT( 1 );
case WM_COMMAND:
case WM_CONTROL:
return cmdProc( hwnd, msg, mp1, mp2 );
case WM_INITMENU:
if( SHORT1FROMMP( mp1 ) != IDS_CALL )
break;
currRec = (CntrRec *) WinSendMsg( hwndCntr, CM_QUERYRECORDEMPHASIS,
MPFROMSHORT( CMA_FIRST ),
MPFROMSHORT( CRA_SELECTED ) );
WinEnableMenuItem( (HWND) mp2, ID_CALL_PLAY, currRec && currRec->itemInfo.seconds );
WinEnableMenuItem( (HWND) mp2, ID_CALL_DEL, currRec );
WinEnableMenuItem( (HWND) mp2, ID_ADD_CALLER, currRec && onlyDigits( currRec->itemInfo.caller ) );
break;
case WM_MSGBOXDISMISS:
WinDestroyWindow( (HWND) mp1 );
break;
case UM_WARNING:
ErrorBox( WARNING, hwnd );
break;
case UM_CRITICAL:
ErrorBox( CRITICAL, hwnd );
break;
case UM_FATAL:
ErrorBox( FATAL, hwnd );
break;
case UM_PLAYWAV:
if(wavplay_current_deviceID) wavplay_stop(wavplay_current_deviceID);
remove("TEMP.WAV");
wavplay_current_deviceID = wavplay_start(hwnd, textmsg);
break;
case MM_MCINOTIFY:
if(SHORT1FROMMP(mp1) != MCI_NOTIFY_SUCCESSFUL || SHORT1FROMMP(mp2) != wavplay_current_deviceID) break;
wavplay_stop(wavplay_current_deviceID);
wavplay_current_deviceID = 0;
remove("TEMP.WAV");
break;
default:
return ( *oldFrameProc )( hwnd, msg, mp1, mp2 );
}
return FALSE;
}
MRESULT EXPENTRY ctelCntrProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
{
switch( msg )
{
case WM_CLOSE:
if( MyMsgBoxEx( HWND_DESKTOP, hwndFrame,
REALYEXIT, CTELMSG, REALYEXIT_CHK,
MB_YESNO, SPTR_ICONQUESTION,
STD_CFG_FILE, CONFIRM_EXIT_PROGRAM ) != MBID_YES )
return 0;
break;
}
return ( *oldCntrProc )( hwnd, msg, mp1, mp2 );
}
MRESULT EXPENTRY cmdProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
{
POINTL ptlMouse;
RECTL Rectangle;
FRAMECDATA frameData;
short i;
switch( msg )
{
case WM_COMMAND:
switch( SHORT1FROMMP( mp1 ) )
{
case IDI_EXIT:
WinPostMsg( WinWindowFromID(hwnd,FID_CLIENT), WM_CLOSE, 0, 0 );
break;
case IDI_SETUP:
case IDI_PORTS:
case IDI_PEOPLE:
case IDI_DTMF:
if( callPending || isRecording )
break;
i = SHORT1FROMMP( mp1 );
WinDlgBox( HWND_DESKTOP, hwndFrame, (PFNWP) configProc,
NULLHANDLE, CFG_DIALOG, (PVOID) &i );
if( config_file_read_ulong( STD_CFG_FILE, CAPITEL_ACTIVE, CAPITEL_ACTIVE_DEF ) )
answer_listen();
break;
case IDI_INFO:
WinDlgBox( HWND_DESKTOP, hwndFrame, (PFNWP) aboutProc,
NULLHANDLE, ABOUT_DIALOG, NULL );
break;
case IDI_README: shExecute( EXEC_README, TRUE ); break;
case IDI_ORDER: shExecute( EXEC_ORDER, TRUE ); break;
case IDI_ORDERBMT: shExecute( EXEC_ORDERBMT, TRUE ); break;
case IDI_LICENSE: shExecute( EXEC_LICENSE, TRUE ); break;
case IDI_WHATSNEW: shExecute( EXEC_WHATSNEW, TRUE ); break;
case IDI_HOMEPAGE: shExecute( APP_HOMEPAGE, FALSE ); break;
case IDI_REGISTRATION:
WinDlgBox( HWND_DESKTOP, hwndFrame, (PFNWP) registrationProc,
NULLHANDLE, REG_DIALOG, NULL );
if( strlen( QueryRegName() ) > 0 )
{
sprintf( defaultBarText, ISREGTEXT, APPNAME,
QueryRegName() );
SetStatus( defaultBarText );
}
break;
case IDI_TOGGLE:
if( callPending || isRecording )
break;
if( config_file_read_ulong( STD_CFG_FILE, CAPITEL_ACTIVE, CAPITEL_ACTIVE_DEF ) )
{
// SetBitmap( IDI_TOGGLE, ID_BMP_ONOFF0 );
WinSendMsg( WinWindowFromID( hwnd, FID_MENU ), MM_SETITEMATTR,
MPFROM2SHORT( IDI_TOGGLE, TRUE ),
MPFROM2SHORT( MIA_CHECKED, FALSE ) );
WinSendMsg( hwndPopup, MM_SETITEMATTR,
MPFROM2SHORT( IDI_TOGGLE, TRUE ),
MPFROM2SHORT( MIA_CHECKED, FALSE ) );
SetStatus( DEACTMSG );
config_file_write_ulong( STD_CFG_FILE, CAPITEL_ACTIVE, 0 );
}
else
{
// SetBitmap( IDI_TOGGLE, IDI_TOGGLE );
WinSendMsg( WinWindowFromID( hwnd, FID_MENU ), MM_SETITEMATTR,
MPFROM2SHORT( IDI_TOGGLE, TRUE ),
MPFROM2SHORT( MIA_CHECKED, MIA_CHECKED ) );
WinSendMsg( hwndPopup, MM_SETITEMATTR,
MPFROM2SHORT( IDI_TOGGLE, TRUE ),
MPFROM2SHORT( MIA_CHECKED, MIA_CHECKED ) );
SetStatus( defaultBarText );
config_file_write_ulong( STD_CFG_FILE, CAPITEL_ACTIVE, 1 );
}
break;
case IDI_HIDE:
if( config_file_read_ulong( STD_CFG_FILE, WINDOW_FRAMECTRLS_HIDDEN, WINDOW_FRAMECTRLS_HIDDEN_DEF ) )
{
config_file_write_ulong( STD_CFG_FILE, WINDOW_FRAMECTRLS_HIDDEN, 0 );
frameData.cb = sizeof( FRAMECDATA );
frameData.flCreateFlags = FCF_TITLEBAR | FCF_SYSMENU |
FCF_MENU | FCF_MINMAX;
frameData.hmodResources = 0;
frameData.idResources = ID_FRAME;
WinCreateFrameControls( hwnd, &frameData, APPNAME );
WinSendMsg( WinWindowFromID(hwnd, FID_TITLEBAR), TBM_SETHILITE,
MPFROMSHORT( TRUE ), 0 );
WinSendMsg( WinWindowFromID( hwnd, FID_MENU ), MM_SETITEMATTR,
MPFROM2SHORT( IDI_HIDE, TRUE ),
MPFROM2SHORT( MIA_CHECKED, MIA_CHECKED ) );
WinSendMsg( hwndPopup, MM_SETITEMATTR,
MPFROM2SHORT( IDI_HIDE, TRUE ),
MPFROM2SHORT( MIA_CHECKED, MIA_CHECKED ) );
if( config_file_read_ulong( STD_CFG_FILE, CAPITEL_ACTIVE, CAPITEL_ACTIVE_DEF ) )
{
WinSendMsg( WinWindowFromID( hwnd, FID_MENU ), MM_SETITEMATTR,
MPFROM2SHORT( IDI_TOGGLE, TRUE ),
MPFROM2SHORT( MIA_CHECKED, MIA_CHECKED ) );
WinSendMsg( hwndPopup, MM_SETITEMATTR,
MPFROM2SHORT( IDI_TOGGLE, TRUE ),
MPFROM2SHORT( MIA_CHECKED, MIA_CHECKED ) );
}
else
{
WinSendMsg( WinWindowFromID( hwnd, FID_MENU ), MM_SETITEMATTR,
MPFROM2SHORT( IDI_TOGGLE, TRUE ),
MPFROM2SHORT( MIA_CHECKED, FALSE ) );
WinSendMsg( hwndPopup, MM_SETITEMATTR,
MPFROM2SHORT( IDI_TOGGLE, TRUE ),
MPFROM2SHORT( MIA_CHECKED, FALSE ) );
}
}
else
{
config_file_write_ulong( STD_CFG_FILE, WINDOW_FRAMECTRLS_HIDDEN, 1);
WinDestroyWindow( WinWindowFromID(hwnd, FID_SYSMENU) );
WinDestroyWindow( WinWindowFromID(hwnd, FID_TITLEBAR) );
WinDestroyWindow( WinWindowFromID(hwnd, FID_MINMAX) );
WinDestroyWindow( WinWindowFromID(hwnd, FID_MENU) );
WinSendMsg( hwndPopup, MM_SETITEMATTR,
MPFROM2SHORT( IDI_HIDE, TRUE ),
MPFROM2SHORT( MIA_CHECKED, FALSE ) );
}
WinSendMsg( hwndFrame, WM_UPDATEFRAME,
MPFROMSHORT( FCF_TITLEBAR|FCF_SYSMENU|FCF_MENU|
FCF_MINMAX|ID_TOOLBAR ), 0 );
WinSendMsg( hwndToolbar, TB_REDRAW, 0, 0 );
break;
case ID_CALL_PLAY:
currRec = (CntrRec *) WinSendMsg( hwndCntr, CM_QUERYRECORDEMPHASIS,
MPFROMSHORT( CMA_FIRST ),
MPFROMSHORT( CRA_SELECTED ) );
/* automagically jump to the real play-function */
case ID_POPUP_PLAY:
if( (currRec == NULL) || (!mmpmInstalled) ||
!(currRec->itemInfo.seconds) )
break;
answer_stop_bell();
if(wavplay_current_deviceID) wavplay_stop(wavplay_current_deviceID);
copyFile( currRec->itemInfo.filename, "TEMP.WAV" );
wavplay_current_deviceID = wavplay_start(hwnd, "TEMP.WAV");
if(wavplay_current_deviceID) setHeard( currRec );
break;
case ID_CALL_PLAY_ALL:
case ID_POPUP_PLAY_ALL:
answer_stop_bell();
answer_play_all();
break;
case ID_ADD_CALLER:
currRec = (CntrRec *) WinSendMsg( hwndCntr, CM_QUERYRECORDEMPHASIS,
MPFROMSHORT( CMA_FIRST ),
MPFROMSHORT( CRA_SELECTED ) );
/* automagically jump to the real add-function */
case ID_POPUP_ADD_CALLER:
if( !currRec || !onlyDigits( currRec->itemInfo.caller ) )
break;
WinDlgBox( HWND_DESKTOP, hwnd, (PFNWP) addNewCallerProc,
NULLHANDLE, CFG_PEOPLE_EDITDLG, NULL );
break;
case ID_CALL_DEL:
currRec = (CntrRec *) WinSendMsg( hwndCntr, CM_QUERYRECORDEMPHASIS,
MPFROMSHORT( CMA_FIRST ),
MPFROMSHORT( CRA_SELECTED ) );
/* automagically jump to the real delete-function */
case ID_POPUP_DEL:
answer_stop_bell();
if( currRec == NULL )
break;
if( !config_file_read_ulong( STD_CFG_FILE, CONFIRM_CALL_DELETE, CONFIRM_CALL_DELETE_DEF ) )
{
DeleteCall();
break;
}
if( MyMsgBox( HWND_DESKTOP, hwndFrame,
DELCALL,
CTELMSG, MB_YESNO, SPTR_ICONQUESTION )
== MBID_YES )
DeleteCall();
break;
case ID_CALL_REC:
if( callPending || isRecording )
break;
if( WinDlgBox( HWND_DESKTOP, hwndFrame, (PFNWP) recProc,
NULLHANDLE, ID_RECDLG, NULL ) )
break;
isRecording = 1;
answer_record_welcome( recFile );
hwndRecInfo = WinLoadDlg( HWND_DESKTOP, hwndFrame,
(PFNWP) recordInfoProc,
NULLHANDLE, RECORD_DIALOG, NULL );
break;
case ID_INCALL_START:
{
int iPopFlag;
if(hwndInCall) break;
iPopFlag = config_file_read_ulong(STD_CFG_FILE,
SHOW_POPUP_WINDOW, SHOW_POPUP_WINDOW_DEF);
if(!iPopFlag) break;
hwndInCall = WinLoadDlg(HWND_DESKTOP,
hwndFrame, (PFNWP)inCallProc, 0, INCALL_DIALOG, &iPopFlag);
break;
}
case ID_INCALL_STOP:
if(hwndInCall)
{
WinDestroyWindow(hwndInCall);
hwndInCall = 0;
}
break;
case ID_RECINFO_STOP:
WinDestroyWindow( hwndRecInfo );
break;
}
break;
case WM_CONTROL:
switch( SHORT2FROMMP( mp1 ) )
{
case CN_ENTER:
if( (currRec = (CntrRec *) ((PNOTIFYRECORDENTER) mp2)->pRecord)
== NULL )
break;
WinPostMsg( hwnd, WM_COMMAND, MPFROMSHORT( ID_POPUP_PLAY ), NULL );
break;
case CN_CONTEXTMENU:
currRec = (CntrRec *) PVOIDFROMMP( mp2 );
if( !currRec )
{
BOOL fEnable = FALSE; /* wegen compiler warnings ;-( */
/* Alles abschalten, weil kein richtiger Eintrag angewaehlt */
WinEnableMenuItem( hwndPopup, ID_POPUP_PLAY, fEnable );
WinEnableMenuItem( hwndPopup, ID_POPUP_DEL, fEnable );
WinEnableMenuItem( hwndPopup, ID_POPUP_ADD_CALLER, fEnable );
}
else
{
BOOL fEnable = TRUE; /* wegen compiler warnings ;-( */
/* Delete Call geht immer */
WinEnableMenuItem( hwndPopup, ID_POPUP_DEL, fEnable );
/* Abspielbar ? */
WinEnableMenuItem( hwndPopup, ID_POPUP_PLAY, (currRec->itemInfo.seconds)?TRUE:FALSE );
/* Add moeglich? */
WinEnableMenuItem( hwndPopup, ID_POPUP_ADD_CALLER, onlyDigits( currRec->itemInfo.caller )?TRUE:FALSE );
}
WinQueryPointerPos( HWND_DESKTOP, &ptlMouse );
WinMapWindowPoints( HWND_DESKTOP, hwndCntr, &ptlMouse, 1 );
WinPopupMenu( hwndCntr, hwnd, hwndPopup, ptlMouse.x,
ptlMouse.y, 0, PU_HCONSTRAIN | PU_VCONSTRAIN |
PU_KEYBOARD | PU_MOUSEBUTTON1 | PU_MOUSEBUTTON2 |
PU_NONE );
break;
}
break;
}
return FALSE;
}
void MsgBox( char *message )
{
MyMsgBox( HWND_DESKTOP, hwndFrame,
(PSZ) message,
(PSZ) CTELMSG,
MB_OK, SPTR_ICONERROR );
return;
}
void ErrorBox( char *title, HWND hwnd )
{
MB2INFO boxInfo;
boxInfo.cb = sizeof( boxInfo );
boxInfo.cButtons = 1;
boxInfo.flStyle = MB_NONMODAL | MB_ERROR | MB_MOVEABLE;
boxInfo.hwndNotify = hwnd;
strcpy( boxInfo.mb2d[0].achText, OKMSG );
boxInfo.mb2d[0].idButton = 0;
boxInfo.mb2d[0].flStyle = BS_DEFAULT;
WinMessageBox2( HWND_DESKTOP, hwnd, textmsg, title,
0, (PMB2INFO) &boxInfo );
}
void sigFunc( short num, void *msg )
{
HAB hab;
HMQ hmq;
hab = WinInitialize( 0 );
hmq = WinCreateMsgQueue( hab, 0 );
switch( num )
{
case 1: /* Warning Message */
strcpy( textmsg, msg );
WinSendMsg( hwndFrame, UM_WARNING, 0, 0 );
break;
case 2: /* Critical Error */
strcpy( textmsg, msg );
WinSendMsg( hwndFrame, UM_CRITICAL, 0, 0 );
break;
case 3: /* Fatal Error */
MsgBox( msg );
WinPostMsg( hwndFrame, WM_QUIT, 0, 0 );
break;
case 4: /* Incoming Call */
ctel_connect_ind( (TCapiInfo *) msg );
break;
case 5: /* FileName of incoming call */
ctel_filenum( *((short *) msg) );
break;
case 6: /* Connection closed */
ctel_disc_ind( *((long *) msg), 1 );
break;
case 7: /* Idle Msg while converting */
ctel_convert_status( *((short *) msg) );
break;
case 8: /* Rescan directory */
ctel_rescan();
break;
case 9: /* Connection closed (no entry) */
ctel_disc_ind( *((long *) msg), 0 );
break;
case 10: /* Play .WAV File */
strcpy( textmsg, msg );
WinSendMsg( hwndFrame, UM_PLAYWAV, 0, 0 );
break;
case 11: /* Deactivate CapiTel */
SetStatus( DEACTMSG );
config_file_write_ulong( STD_CFG_FILE, CAPITEL_ACTIVE, 0 );
break;
case 12: /* Quit CapiTel */
WinPostMsg( hwndFrame, WM_QUIT, 0, 0 );
break;
}
WinDestroyMsgQueue( hmq );
WinTerminate( hab );
}
void ctel_connect_ind( TCapiInfo *msg )
{
struct tm *tmbuf;
time_t tod;
char str[150], *number, *pt;
int i;
HAB hab;
HMQ hmq;
SWP swp;
callPending = 1;
time( &tod );
tmbuf = localtime( &tod );
while (tmbuf->tm_year >= 100) tmbuf->tm_year -= 100;
sprintf( CallInfo.date, "%02d.%02d.%02d", tmbuf->tm_mday,
tmbuf->tm_mon+1, tmbuf->tm_year );
sprintf( CallInfo.time, "%02d:%02d:%02d", tmbuf->tm_hour,
tmbuf->tm_min, tmbuf->tm_sec );
strcpy( CallInfo.calledEAZ, msg->called_name );
strcpy( CallInfo.caller, msg->caller_name );
CallInfo.digital = msg->is_digital;
hab = WinInitialize( 0 );
hmq = WinCreateMsgQueue( hab, 0 );
if( !isRecording )
WinSendMsg( hwndFrame, WM_COMMAND, MPFROM2SHORT( ID_INCALL_START, 0 ), 0 );
else
WinSetDlgItemText( hwndRecInfo, RECORD_STATUS, (PSZ)"" );
WinDestroyMsgQueue( hmq );
WinTerminate( hab );
}
void ctel_filenum( short num )
{
sprintf( CallInfo.filename, "CALL%04d.WAV", num );
}
void ctel_disc_ind( long secs, short addToContainer )
{
HAB hab;
HMQ hmq;
FILE *fh;
char str[256];
int i;
HPOINTER bmp;
SWP swp;
hab = WinInitialize( 0 );
hmq = WinCreateMsgQueue( hab, 0 );
if( isRecording )
{
isRecording = 0;
WinSendMsg( hwndFrame, WM_COMMAND,
MPFROM2SHORT( ID_RECINFO_STOP, 0 ), 0 );
if( config_file_read_ulong( STD_CFG_FILE, CAPITEL_ACTIVE, CAPITEL_ACTIVE_DEF ) )
{
SetStatus( defaultBarText );
}
else
{
SetStatus( DEACTMSG );
}
WinDestroyMsgQueue( hmq );
WinTerminate( hab );
callPending = 0;
return;
}
if (CallInfo.digital)
{
CallInfo.seconds = 0;
bmp = cntrIcoCallDigital;
} else {
switch( secs )
{
case -1:
case 0:
CallInfo.seconds = 0;
bmp = cntrIcoCall;
break;
default:
CallInfo.seconds = secs;
bmp = cntrIcoCallWav;
break;
}
}
if( config_file_read_ulong( STD_CFG_FILE, CAPITEL_ACTIVE, CAPITEL_ACTIVE_DEF ) )
{
SetStatus( defaultBarText );
}
else
{
SetStatus( DEACTMSG );
}
WinSendMsg( hwndFrame, WM_COMMAND, MPFROM2SHORT( ID_INCALL_STOP, 0 ), 0 );
/* Ignore empty call?? */
if( (config_file_read_ulong( STD_CFG_FILE, IGNORE_EMPTY_CALLS, IGNORE_EMPTY_CALLS_DEF )) && (CallInfo.seconds == 0) )
{
remove( CallInfo.filename );
}
else
{
if( config_file_read_ulong( STD_CFG_FILE, RESTORE_WINDOW_ON_NEW_CALL, RESTORE_WINDOW_ON_NEW_CALL_DEF ) )
{
WinQueryWindowPos( hwndFrame, &swp );
if( swp.fl & SWP_MINIMIZE )
WinSetWindowPos( hwndFrame, 0, 0, 0, 0, 0, SWP_RESTORE );
}
if( addToContainer )
{
AddItem( bmp, CallInfo.caller, CallInfo.date, CallInfo.time,
CallInfo.seconds, CallInfo.calledEAZ, CallInfo.filename, CallInfo.digital );
strcpy( str, CallInfo.filename );
for( i=0 ; (str[i]!='.')&&(i<strlen(str)) ; i++ )
;
str[i] = 0;
strcat( str, ".IDX" );
fh = fopen( str, "w" );
fprintf( fh, "%s\n%s\n%s\n%ld\n%s\n%s\n0\n%d\n", CallInfo.caller, CallInfo.date,
CallInfo.time, CallInfo.seconds, CallInfo.calledEAZ,
CallInfo.filename, CallInfo.digital );
fclose( fh );
}
else /* Fernabfrage */
ctel_rescan();
}
callPending = 0;
WinDestroyMsgQueue( hmq );
WinTerminate( hab );
}
void ctel_convert_status( short status )
{
HAB hab;
HMQ hmq;
hab = WinInitialize( 0 );
hmq = WinCreateMsgQueue( hab, 0 );
if( !status )
{
SetStatus( defaultBarText );
}
else
{
SetStatus( DISCONV );
}
WinDestroyMsgQueue( hmq );
WinTerminate( hab );
}
void ctel_rescan( void )
{
EmptyContainer();
ScanForCalls();
}
void ScanForCalls( void )
{
APIRET rc;
HDIR hdirFindHandle = HDIR_CREATE;
FILEFINDBUF3 FindBuffer = {0}; ULONG ulResultBufLen = sizeof( FILEFINDBUF3 );
ULONG ulFindCount = 1;
TCallInfo cInfo;
char str[256];
HPOINTER bmp;
FILE *fh;
rc = DosFindFirst( "*.IDX", &hdirFindHandle, FILE_NORMAL,
&FindBuffer, ulResultBufLen, &ulFindCount,
FIL_STANDARD );
while( !rc )
{
fh = fopen( FindBuffer.achName, "r" );
fgets( cInfo.caller, sizeof( cInfo.caller ), fh );
delete_cr( cInfo.caller );
fgets( cInfo.date, sizeof( cInfo.date ), fh );
delete_cr( cInfo.date );
fgets( cInfo.time, sizeof( cInfo.time ), fh );
delete_cr( cInfo.time );
fgets( str, sizeof( str ), fh );
delete_cr( str );
cInfo.seconds = (ULONG) atoi( str );
fgets( cInfo.calledEAZ, sizeof( cInfo.calledEAZ ), fh );
delete_cr( cInfo.calledEAZ );
fgets( cInfo.filename, sizeof( cInfo.filename ), fh );
delete_cr( cInfo.filename );
fgets( str, sizeof( str ), fh );
delete_cr( str );
cInfo.heard = (USHORT) atoi( str );
fgets( str, sizeof( str ), fh );
delete_cr( str );
cInfo.digital = (CHAR) atoi( str );
if (cInfo.digital)
{
bmp = cntrIcoCallDigital;
} else {
if( cInfo.seconds == 0 )
bmp = cntrIcoCall;
else
{
if( cInfo.heard )
bmp = cntrIcoCallHeard;
else
bmp = cntrIcoCallWav;
}
}
AddItem( bmp, cInfo.caller, cInfo.date, cInfo.time,
cInfo.seconds, cInfo.calledEAZ, cInfo.filename, CallInfo.digital );
fclose( fh );
rc = DosFindNext( hdirFindHandle, &FindBuffer, ulResultBufLen,
&ulFindCount );
}
DosFindClose( hdirFindHandle );
}
void DeleteCall( void )
{
char base[256];
int i;
strcpy( base, currRec->itemInfo.filename );
remove( base ); /* remove .wav file */
for( i=0 ; (base[i]!='.')&&(i<strlen(base)) ; i++ )
;
base[i] = 0;
strcat( base, ".IDX" );
remove( base ); /* remove .idx file */
for( i=0 ; (base[i]!='.')&&(i<strlen(base)) ; i++ )
;
base[i] = 0;
strcat( base, ".ALW" );
remove( base ); /* remove .alw file */
WinSendMsg( hwndCntr, CM_REMOVERECORD, MPFROMP( &currRec ),
MPFROM2SHORT( 1, CMA_FREE | CMA_INVALIDATE ) );
}
void LoadBitmaps( HWND hwnd )
{
cntrIcoCall = WinLoadPointer( HWND_DESKTOP, NULLHANDLE, ID_BMP_CALL0 );
cntrIcoCallWav = WinLoadPointer( HWND_DESKTOP, NULLHANDLE, ID_BMP_CALL1 );
cntrIcoCallHeard = WinLoadPointer( HWND_DESKTOP, NULLHANDLE, ID_BMP_CALL2 );
cntrIcoCallDigital = WinLoadPointer( HWND_DESKTOP, NULLHANDLE, ID_BMP_CALL3 );
portsIcoActive = WinLoadPointer( HWND_DESKTOP, NULLHANDLE, ID_BMP_PORT0 );
portsIcoInactive = WinLoadPointer( HWND_DESKTOP, NULLHANDLE, ID_BMP_PORT1 );
callersIcoActive = WinLoadPointer( HWND_DESKTOP, NULLHANDLE, ID_BMP_CALLER0 );
callersIcoInactive = WinLoadPointer( HWND_DESKTOP, NULLHANDLE, ID_BMP_CALLER1 );
actionIcoActive = WinLoadPointer( HWND_DESKTOP, NULLHANDLE, ID_BMP_ACTION0 );
actionIcoInactive = WinLoadPointer( HWND_DESKTOP, NULLHANDLE, ID_BMP_ACTION1 );
}
MRESULT EXPENTRY aboutProc(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
{
char str[100], str2[100];
switch( msg )
{
case WM_INITDLG:
centerDialog( HWND_DESKTOP, hwnd );
sprintf( str, "%s", APPVER_FULL );
WinSetDlgItemText( hwnd, ABOUT_VERSION, str );
if( queryRegistration( str2, str ) )
{
sprintf( str, REGTOMSG, str2 );
WinSetDlgItemText( hwnd, ABOUT_REG, str );
}
break;
default:
return( WinDefDlgProc( hwnd, msg, mp1, mp2 ) );
}
return 0;
}
MRESULT EXPENTRY recProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
{
char str[255];
strcpy( str, DEFALWFILE );
switch( msg )
{
case WM_INITDLG:
centerDialog( HWND_DESKTOP, hwnd );
WinSetDlgItemText( hwnd, ID_RECDLG_ENTRY, str );
WinSendMsg( WinWindowFromID( hwnd, ID_RECDLG_ENTRY ), EM_SETTEXTLIMIT,
MPFROMSHORT( 255 ), NULL );
WinSendMsg( WinWindowFromID( hwnd, ID_RECDLG_ENTRY ), EM_SETSEL,
MPFROM2SHORT( 0, 255 ), NULL );
break;
case WM_COMMAND:
switch( SHORT1FROMMP( mp1 ) )
{
case ID_RECDLG_OK:
WinQueryDlgItemText( hwnd, ID_RECDLG_ENTRY,
sizeof( str ), (PSZ) str );
if( !strlen( str ) )
strcpy( recFile, DEFALWFILE );
else
strcpy( recFile, str );
WinDismissDlg( hwnd, FALSE );
break;
case ID_RECDLG_CANCEL:
WinDismissDlg( hwnd, TRUE );
break;
default:
return( WinDefDlgProc( hwnd, msg, mp1, mp2 ) );
}
break;
default:
return( WinDefDlgProc( hwnd, msg, mp1, mp2 ) );
}
return 0;
}
MRESULT EXPENTRY inCallProc(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
{
switch( msg )
{
case WM_CONTROL:
case WM_COMMAND:
return 0;
case WM_INITDLG:
{
SWP swp;
char str[100];
int cxScreen, cyScreen;
sprintf( str, FROM_STR, CallInfo.caller );
WinSetDlgItemText( hwnd, INCALL_FROM, str );
sprintf( str, ON_STR, CallInfo.calledEAZ );
WinSetDlgItemText( hwnd, INCALL_ON, str );
/* Set position and size */
WinQueryWindowPos( hwndFrame, &swp );
if( swp.fl & SWP_MINIMIZE )
{
cxScreen = WinQuerySysValue( HWND_DESKTOP, SV_CXSCREEN );
cyScreen = WinQuerySysValue( HWND_DESKTOP, SV_CYSCREEN );
WinQueryWindowPos( hwnd, &swp );
switch(*(int*)mp2)
{
case 1: // top left
WinSetWindowPos( hwnd, HWND_TOP, 0, cyScreen - swp.cy, 0, 0, SWP_MOVE );
break;
case 2: // top right
WinSetWindowPos( hwnd, HWND_TOP, cxScreen - swp.cx, cyScreen - swp.cy, 0, 0, SWP_MOVE );
break;
case 3: // bottom left
WinSetWindowPos( hwnd, HWND_TOP, 0, 0, 0, 0, SWP_MOVE );
break;
default: // bottom right
WinSetWindowPos( hwnd, HWND_TOP, cxScreen - swp.cx, 0, 0, 0, SWP_MOVE );
break;
}
}
else
{
centerDialog( hwndFrame, hwnd );
}
return (MPARAM) TRUE;
}
default:
break;
}
return( WinDefDlgProc( hwnd, msg, mp1, mp2 ) );
}
MRESULT EXPENTRY recordInfoProc(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
{
switch( msg )
{
case WM_CONTROL:
case WM_COMMAND:
return 0;
case WM_INITDLG:
centerDialog( HWND_DESKTOP, hwnd );
return 0;
default:
break;
}
return( WinDefDlgProc( hwnd, msg, mp1, mp2 ) );
}
void centerDialog(HWND hwndFrame, HWND hWndDlg)
{
RECTL rclWindow, rclDlg;
LONG dWidth, dHeight, wWidth, wHeight, sBLCx, sBLCy;
SWP swp, swpd;
WinQueryWindowPos(HWND_DESKTOP,&swpd); // get desktop dimensions
WinQueryWindowRect(hwndFrame,&rclWindow);
WinQueryWindowRect(hWndDlg,&rclDlg);
WinQueryWindowPos(hwndFrame,&swp);
dWidth = (LONG) (rclDlg.xRight - rclDlg.xLeft);
dHeight = (LONG) (rclDlg.yTop - rclDlg.yBottom);
wWidth = (LONG) (rclWindow.xRight - rclWindow.xLeft);
wHeight = (LONG) (rclWindow.yTop - rclWindow.yBottom);
sBLCx = swp.x + (((LONG) wWidth - dWidth) / 2);
sBLCy = swp.y + (((LONG) wHeight - dHeight) / 2);
// make sure the dialog doesn't run off one of the edges
if (sBLCx < 1) sBLCx = 1;
if (sBLCy < 1) sBLCy = 1;
if ((sBLCx + dWidth) > swpd.cx) sBLCx = swpd.cx - (dWidth + 1);
if ((sBLCy + dHeight) > swpd.cy) sBLCy = swpd.cy - (dHeight + 1);
WinSetWindowPos(hWndDlg,HWND_TOP,sBLCx,sBLCy,0,0,SWP_MOVE);
}
void copyFile( char *from, char *to )
{
char *dat;
FILE *fh_from, *fh_to;
long size;
if( (fh_from = fopen( from, "rb" )) != NULL )
{
if( (fh_to = fopen( to, "wb" )) != NULL )
{
size = _filelength( fileno( fh_from ) );
dat = (char *) malloc( size );
fread( dat, size, 1, fh_from );
fwrite( dat, size, 1, fh_to );
free( dat );
fclose( fh_to );
}
fclose( fh_from );
}
}
void setHeard( CntrRec *currRec )
{
char base[256];
int i;
FILE *fh;
strcpy( base, currRec->itemInfo.filename );
for( i=0 ; (base[i]!='.')&&(i<strlen(base)) ; i++ )
;
base[i] = 0;
strcat( base, ".IDX" );
fh = fopen( base, "w" );
fprintf( fh, "%s\n%s\n%s\n%ld\n%s\n%s\n1\n%d\n", currRec->itemInfo.caller,
currRec->itemInfo.date, currRec->itemInfo.time,
currRec->itemInfo.seconds, currRec->itemInfo.calledEAZ,
currRec->itemInfo.filename, currRec->itemInfo.digital );
fclose( fh );
if (currRec->itemInfo.digital) {
currRec->itemInfo.icon = (HPOINTER) cntrIcoCallDigital;
} else {
currRec->itemInfo.icon = (HPOINTER) cntrIcoCallHeard;
}
WinSendMsg( hwndCntr, CM_INVALIDATERECORD, MPFROMP( NULL ),
MPFROM2SHORT( 0, CMA_REPOSITION ) );
}
short queryDimensions( HWND hwnd, char *str, ULONG *breite, ULONG *hoehe )
{
HPS hps;
POINTL p[TXTBOX_COUNT];
hps = WinGetPS( hwnd );
GpiQueryTextBox( hps, strlen( str ), str, TXTBOX_COUNT, p );
WinReleasePS( hps );
*breite = p[TXTBOX_BOTTOMRIGHT].x - p[TXTBOX_BOTTOMLEFT].x;
*hoehe = p[TXTBOX_TOPLEFT].y - p[TXTBOX_BOTTOMLEFT].y;
return 0;
}
short onlyDigits( char *str )
{
char tmp[256], *pt;
short i;
strcpy( tmp, strip_blanks( str ) );
if( strchr( tmp,'(' ) ) strchr( tmp, '(' )[-1] = 0;
for( i=0 ; i < strlen( tmp ) ; i++ )
{
if( (tmp[i] < 48) || (tmp[i] > 57) )
return 0;
}
return 1;
}
int wavplay_start( HWND hwnd, char* wavFile ) {
int rc;
MCI_OPEN_PARMS OpenParams;
MCI_PLAY_PARMS PlayParams;
MCI_GENERIC_PARMS GenericParams;
memset(&OpenParams, 0, sizeof(OpenParams));
OpenParams.pszElementName = wavFile;
rc = mciSendCommand(0, MCI_OPEN, MCI_WAIT|MCI_OPEN_ELEMENT, &OpenParams, 0);
if(SHORT1FROMMP(rc) != MCIERR_SUCCESS) return 0;
memset(&PlayParams, 0, sizeof(PlayParams));
PlayParams.hwndCallback = hwnd;
rc = mciSendCommand(OpenParams.usDeviceID, MCI_PLAY, MCI_NOTIFY, &PlayParams, 0);
if(SHORT1FROMMP(rc) != MCIERR_SUCCESS) {
wavplay_stop(OpenParams.usDeviceID);
return 0;
}
return OpenParams.usDeviceID;
}
int wavplay_stop( short deviceID )
{
MCI_GENERIC_PARMS GenericParams;
memset(&GenericParams, 0, sizeof(GenericParams));
mciSendCommand(deviceID, MCI_STOP, MCI_WAIT, &GenericParams, 0);
mciSendCommand(deviceID, MCI_CLOSE, MCI_WAIT, &GenericParams, 0);
return 1;
}
void shExecute( char *file, BOOL addPath )
{
HOBJECT hObj;
UCHAR complete[_MAX_PATH], currDir[_MAX_PATH];
ULONG currDrive, driveMapping, len=_MAX_PATH;
if( addPath )
{
DosQueryCurrentDisk( &currDrive, &driveMapping );
DosQueryCurrentDir( currDrive, currDir, &len );
sprintf( complete, "%c:\\%s\\%s", (UCHAR) 'A' + currDrive - 1,
currDir, file );
}
else
{
strcpy( complete, file );
}
if( 0 != (hObj = WinQueryObject( (PSZ)complete )) )
WinOpenObject( hObj, 0, TRUE );
}
typedef struct sMsgBoxStruct
{
int extended;
char* text;
char* title;
char* check_text;
int* check_state;
int style;
HPOINTER icon;
}
tMsgBoxStruct;
int MyMsgBox(HWND hwndParent, HWND hwndOwner,
char* text, char* title, int style, int icon)
{
int rc;
tMsgBoxStruct mb;
mb.extended = 0;
mb.text = text;
mb.title = title;
mb.style = style;
mb.icon = WinQuerySysPointer(HWND_DESKTOP, icon, 1);
if(!mb.icon) mb.icon = WinLoadPointer(HWND_DESKTOP, 0, icon);
rc = WinDlgBox(hwndParent,hwndOwner,MsgBoxProc,0,IDD_MSGBOX,&mb);
if(mb.icon) WinDestroyPointer(mb.icon);
return rc;
}
int MyMsgBoxEx(HWND hwndParent, HWND hwndOwner,
char* text, char* title, char* checktext, int style, int icon,
char* pCfgFile, char* pCfgKey)
{
int rc;
tMsgBoxStruct mb;
int DontAskAgain = 0;
ULONG buffsize = sizeof(DontAskAgain);
DontAskAgain = config_file_read_ulong(pCfgFile, pCfgKey, 0);
if(DontAskAgain) return (style == MB_YESNO) ? MBID_YES : MBID_OK;
mb.extended = 1;
mb.text = text;
mb.title = title;
mb.check_text = checktext;
mb.check_state = &DontAskAgain;
mb.style = style;
mb.icon = WinQuerySysPointer(HWND_DESKTOP, icon, 1);
if(!mb.icon) mb.icon = WinLoadPointer(HWND_DESKTOP, 0, icon);
rc = WinDlgBox(hwndParent,hwndOwner,MsgBoxProc,0,IDD_MSGBOXEX,&mb);
if(mb.icon) WinDestroyPointer(mb.icon);
if((rc == MBID_YES || rc == MBID_OK) && DontAskAgain)
config_file_write_ulong(pCfgFile, pCfgKey, 1);
return rc;
}
MRESULT EXPENTRY MsgBoxProc(
HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
{
switch(msg)
{
case WM_INITDLG:
{
HPS hps;
SWP swp;
RECTL rect;
HWND hwndText;
HPOINTER icon;
int textHeight = 0;
tMsgBoxStruct* pMb = (tMsgBoxStruct*)mp2;
char* c,* buff, ok_btn[128], cancel_btn[128], yes_btn[128], no_btn[128];
icon = (HPOINTER)WinSendDlgItemMsg(hwnd,
IDC_ICONSTATIC, SM_QUERYHANDLE, 0, 0);
if(icon) WinDestroyPointer(icon);
WinSendDlgItemMsg(hwnd, IDC_ICONSTATIC,
SM_SETHANDLE, MPFROMLONG(pMb->icon), 0);
WinSetWindowText(hwnd, pMb->title);
WinSetDlgItemText(hwnd, IDC_TEXT, pMb->text);
c = pMb->text;
hwndText = WinWindowFromID(hwnd, IDC_TEXT);
WinQueryWindowPos(hwndText, &swp);
hps = WinGetPS(hwndText);
while(*c)
{
WinQueryWindowRect(hwndText, &rect);
c += WinDrawText(hps, -1, c, &rect, 0, 0,
DT_LEFT|DT_TOP|DT_QUERYEXTENT|DT_WORDBREAK);
textHeight += rect.yTop - rect.yBottom;
}
WinReleasePS(hps);
if(textHeight > swp.cy)
{
textHeight -= swp.cy;
WinSetWindowPos(hwndText,0,0,0,swp.cx,swp.cy+textHeight,SWP_SIZE);
WinQueryWindowPos(WinWindowFromID(hwnd,IDC_ICONSTATIC), &swp);
WinSetWindowPos(WinWindowFromID(hwnd,IDC_ICONSTATIC),
0,swp.x,swp.y+textHeight,0,0,SWP_MOVE);
WinQueryWindowPos(hwnd, &swp);
WinSetWindowPos(hwnd,0,0,0,swp.cx,swp.cy+textHeight,SWP_SIZE);
}
if(pMb->extended == 1)
{
WinSetDlgItemText(hwnd, IDC_CHECK, pMb->check_text);
WinCheckButton(hwnd, IDC_CHECK, *(pMb->check_state));
WinSetWindowULong(hwnd, QWL_USER, (ULONG)pMb->check_state);
}
WinLoadString(0,0,STR_OK_BUTTON,sizeof(ok_btn),ok_btn);
WinLoadString(0,0,STR_CANCEL_BUTTON,sizeof(cancel_btn),cancel_btn);
WinLoadString(0,0,STR_YES_BUTTON,sizeof(yes_btn),yes_btn);
WinLoadString(0,0,STR_NO_BUTTON,sizeof(no_btn),no_btn);
switch(pMb->style)
{
case MB_OKCANCEL:
WinSetDlgItemText(hwnd, DID_OK, ok_btn);
WinSetWindowUShort(WinWindowFromID(hwnd,DID_OK),QWS_ID,MBID_OK);
WinSetDlgItemText(hwnd, DID_CANCEL, cancel_btn);
WinSetWindowUShort(WinWindowFromID(hwnd,DID_CANCEL),QWS_ID,MBID_CANCEL);
break;
case MB_YESNO:
WinSetDlgItemText(hwnd, DID_OK, yes_btn);
WinSetWindowUShort(WinWindowFromID(hwnd,DID_OK),QWS_ID,MBID_YES);
WinSetDlgItemText(hwnd, DID_CANCEL, no_btn);
WinSetWindowUShort(WinWindowFromID(hwnd,DID_CANCEL),QWS_ID,MBID_NO);
break;
case MB_OK:
default:
WinSetDlgItemText(hwnd, DID_OK, ok_btn);
WinSetWindowUShort(WinWindowFromID(hwnd,DID_OK),QWS_ID,MBID_OK);
WinDestroyWindow(WinWindowFromID(hwnd,DID_CANCEL));
break;
}
centerDialog(WinQueryWindow(hwnd,QW_OWNER),hwnd);
break;
}
case WM_CLOSE:
{
int* check_state = (int*)WinQueryWindowULong(hwnd, QWL_USER);
if(check_state) *check_state = WinQueryButtonCheckstate(hwnd, IDC_CHECK);
if(WinWindowFromID(hwnd,MBID_NO)) WinDismissDlg(hwnd, MBID_NO);
else WinDismissDlg(hwnd, MBID_CANCEL);
return 0;
}
case WM_COMMAND:
switch(SHORT1FROMMP(mp1))
{
case MBID_OK:
case MBID_CANCEL:
case MBID_YES:
case MBID_NO:
{
int* check_state = (int*)WinQueryWindowULong(hwnd, QWL_USER);
if(check_state) *check_state = WinQueryButtonCheckstate(hwnd, IDC_CHECK);
if(SHORT1FROMMP(mp1) == MBID_CANCEL && WinWindowFromID(hwnd,MBID_NO))
WinDismissDlg(hwnd, MBID_NO);
else WinDismissDlg(hwnd, SHORT1FROMMP(mp1));
break;
}
}
return 0;
}
return WinDefDlgProc(hwnd, msg, mp1, mp2);
}