📄 frame.c
字号:
}
for (i = 0; i < multiMemberships; i++) {
char psn[24], rcr[MAX_HOST];
wsprintf(psn, Format(3), i + 1);
GetPrivateProfileString(cg, psn, "", rcr,
sizeof rcr, pfn);
multiAddr[i].s_addr = inet_addr(rcr);
wsprintf(psn, Format(4), i + 1);
GetPrivateProfileString(cg, psn, "", rcr, sizeof rcr, pfn);
multiName[i] = NULL;
if (strlen(rcr) > 0) {
LPSTR rcon = (LPSTR) GlobalAllocPtr(GPTR, strlen(rcr) + 1);
if (rcon!= NULL) {
strcpy(rcon, rcr);
multiName[i] = rcon;
}
}
}
multiLoop = GetPrivateProfileInt(cg, rstring(IDS_PF_LOOPBACK), TRUE, pfn);
multicastJoin(hwnd, TRUE);
#endif
// Restore compression modes
#define BoolProfile(var, section, itemname, defval) var = GetPrivateProfileInt(section, itemname, defval, pfn)
strcpy(cg, rstring(IDS_PF_COMPRESSION));
BoolProfile(compression, cg, rstring(IDS_PF_COMP_SIMPLE), FALSE);
BoolProfile(gsmcompress, cg, rstring(IDS_PF_COMP_GSM), TRUE);
BoolProfile(adpcmcompress, cg, rstring(IDS_PF_COMP_ADPCM), FALSE);
BoolProfile(lpccompress, cg, rstring(IDS_PF_COMP_LPC), FALSE);
BoolProfile(lpc10compress, cg, rstring(IDS_PF_COMP_LPC10), FALSE);
BoolProfile(celpcompress, cg, rstring(IDS_PF_COMP_CELP), FALSE);
// Restore transmit protocol
strcpy(cg, rstring(IDS_PF_PROTOCOL));
protocolXmit = protocolSent = GetPrivateProfileInt(cg, rstring(IDS_PF_PROTOCOL_XMIT), PROTOCOL_SPEAKFREE, pfn);
BoolProfile(protocolAuto, cg, rstring(IDS_PF_PROTOCOL_SEND_RECEIVED), TRUE);
robust = GetPrivateProfileInt(cg, rstring(IDS_PF_ROBUST), TRUE, pfn);
// Encryption modes
{
static char pk_package_name[12]; // Public key package name
strcpy(cg, rstring(IDS_PF_ENCRYPTION_MODES));
GetPrivateProfileString(cg, rstring(IDS_PF_PUBLIC_KEY), rstring(IDS_PF_PUBLIC_KEY_PGP), pk_package_name,
sizeof pk_package_name, pfn);
if (strcmp(pk_package_name, rstring(IDS_PF_PUBLIC_KEY_PGP)) == 0) {
pk_package = PGP;
} else if (strcmp(pk_package_name, rstring(IDS_PF_PUBLIC_KEY_GPG)) == 0) {
pk_package = GPG;
} else {
pk_package = Unspecified;
}
}
#ifdef MODEM
// Restore modem configuration and initialise if enabled
strcpy(cg, rstring(IDS_PF_MODEM));
BoolProfile(modemEnable, cg, rstring(IDS_PF_ENABLE), FALSE);
GetPrivateProfileString(cg, rstring(IDS_PF_PORT), "COM1", commport,
sizeof commport, pfn);
GetPrivateProfileString(cg, rstring(IDS_PF_BAUDRATE), "19200", baudrate,
sizeof baudrate, pfn);
GetPrivateProfileString(cg, rstring(IDS_PF_MODEM_INIT_STRING), "ATQ0V1E1S0=1",
modemInitString, sizeof modemInitString, pfn);
BoolProfile(modemShowRant, cg, rstring(IDS_PF_SHOW_RANT), TRUE);
#endif
// Restore answering machine settings
strcpy(cg, rstring(IDS_PF_ANSWER));
GetPrivateProfileString(cg, rstring(IDS_PF_FILE_NAME), "", answerFileName,
sizeof answerFileName, pfn);
GetPrivateProfileString(cg, rstring(IDS_PF_OUT_FILE_NAME), "", answerOutFileName,
sizeof answerOutFileName, pfn);
BoolProfile(answerRecord, cg, rstring(IDS_PF_RECORD_MESSAGES), FALSE);
// Restore show your face settings
GetPrivateProfileString(rstring(IDS_PF_FACE), rstring(IDS_PF_FILE_NAME), "", faceFileName,
sizeof faceFileName, pfn);
BoolProfile(faceShow, rstring(IDS_PF_FACE), rstring(IDS_PF_SHOW_FACES), TRUE);
// Restore miscellaneous configuration parameters
GetPrivateProfileString(rstring(IDS_PF_RING), rstring(IDS_PF_FILE_NAME), "",
ringFileName, sizeof ringFileName, pfn);
jitterBuf = GetPrivateProfileInt(rstring(IDS_PF_PREFERENCES), rstring(IDS_PF_JITTER), jitterBuf, pfn);
// Restore window display configuration parameters
// BoolProfile(lookWho_sTalking, rstring(IDS_PF_PREFERENCES), rstring(IDS_PF_LOOKWHO), FALSE);
#define WindowPref(var, prefName) BoolProfile(var, rstring(IDS_PF_DISPLAY_MODES), rstring(IDS_PF_OPT_ ## prefName), FALSE)
WindowPref(lookWho_sTalking, LOOK_WHO);
WindowPref(openOnAnswerMessage, OPEN_ON_ANSWER_MESSAGE);
WindowPref(lurkInTray, USE_TRAY_ICON);
WindowPref(hideWhenMinimised, HIDE_WHEN_MINIMISED);
WindowPref(startMinimised, START_MINIMISED);
#undef WindowPref
// Restore Look Who's Listening parameters
GetPrivateProfileString(rstring(IDS_PF_LWL_TELL), rstring(IDS_PF_SERVER), "",
lwl_s_server, sizeof lwl_s_server, pfn);
GetPrivateProfileString(rstring(IDS_PF_LWL_TELL), rstring(IDS_PF_EMAIL), "",
lwl_s_email, sizeof lwl_s_email, pfn);
GetPrivateProfileString(rstring(IDS_PF_LWL_TELL), rstring(IDS_PF_FULLNAME), "",
lwl_s_fullname, sizeof lwl_s_fullname, pfn);
GetPrivateProfileString(rstring(IDS_PF_LWL_TELL), rstring(IDS_PF_PHONE), "",
lwl_s_phone, sizeof lwl_s_phone, pfn);
GetPrivateProfileString(rstring(IDS_PF_LWL_TELL), rstring(IDS_PF_LOCATION), "",
lwl_s_location, sizeof lwl_s_location, pfn);
BoolProfile(lwl_s_publish, rstring(IDS_PF_LWL_TELL), rstring(IDS_PF_PUBLISH), FALSE);
BoolProfile(lwl_s_exact, rstring(IDS_PF_LWL_TELL), rstring(IDS_PF_EXACT), FALSE);
GetPrivateProfileString(rstring(IDS_PF_LWL_ASK), rstring(IDS_PF_SERVER), "",
lwl_a_server, sizeof lwl_a_server, pfn);
BoolProfile(lwl_a_exact, rstring(IDS_PF_LWL_ASK), rstring(IDS_PF_EXACT), FALSE);
// Restore bug workaround parameters
strcpy(cg, rstring(IDS_PF_WORKAROUNDS));
BoolProfile(alwaysBindSocket, cg, rstring(IDS_PF_ALWAYS_BIND), FALSE);
BoolProfile(waNetNoConnect, cg, rstring(IDS_PF_NET_NO_CONNECT), FALSE);
BoolProfile(waNetUseSend, cg, rstring(IDS_PF_NET_USE_SEND), FALSE);
BoolProfile(waNetMultiTTLisChar, cg, rstring(IDS_PF_MULTICAST_CHAR_ARG), FALSE);
BoolProfile(waNetNoOutOverflow, cg, rstring(IDS_PF_NO_OUT_OVERFLOW), FALSE);
BoolProfile(waNetNoMsgLoopIns, cg, rstring(IDS_PF_NO_MSG_LOOP), FALSE);
waNetSynchronousGetHostname = GetPrivateProfileInt(cg, rstring(IDS_PF_SYNC_HOSTNAME), 2, pfn);
BoolProfile(waProtNoHeartbeat, cg, rstring(IDS_PF_WA_NO_HEARTBEAT), FALSE);
BoolProfile(waProtUseLargerRTCPackets, cg, rstring(IDS_PF_WA_RTP_LARGER_PKTS), FALSE);
BoolProfile(waProtNoVAT, cg, rstring(IDS_PF_WA_NO_VAT), FALSE);
BoolProfile(waProtNoRTP, cg, rstring(IDS_PF_WA_NO_RTP), FALSE);
BoolProfile(waProtNoRTCPCrypt, cg, rstring(IDS_PF_WA_NO_RTCP_CRYPT), FALSE);
BoolProfile(waAudioHalf, cg, rstring(IDS_PF_AUDIO_HALF_DUPLEX), FALSE);
BoolProfile(waAudio11025, cg, rstring(IDS_PF_AUDIO_SAMPLE_11025), FALSE);
BoolProfile(waAudioRingMaxVolume, cg, rstring(IDS_PF_RING_VOLUME), FALSE);
BoolProfile(waAudioNoOutputRateAdjustment, cg, rstring(IDS_PF_NO_OUTPUT_RATE_ADJUSTMENT), FALSE);
BoolProfile(waAudioBeepOnTransmit, cg, rstring(IDS_PF_BEEP_ON_TRANSMIT), FALSE);
waAudioInDevice = GetPrivateProfileInt(cg, rstring(IDS_PF_AUDIO_IN_DEVICE), WAVE_MAPPER, pfn);
waAudioOutDevice = GetPrivateProfileInt(cg, rstring(IDS_PF_AUDIO_OUT_DEVICE), WAVE_MAPPER, pfn);
waNetSynchronousGetHostnameAction = (waNetSynchronousGetHostname == 2) ? isPC_NFS :
waNetSynchronousGetHostname;
// Load the RLE and VOX parameters
load_vox_params();
// Load audio monitor parameters
strcpy(cg, rstring(IDS_PF_MONITOR));
BoolProfile(spectrumBarGraph, cg, rstring(IDS_PF_MON_BARGRAPH), TRUE);
BoolProfile(spectrumVoicePrint, cg, rstring(IDS_PF_MON_VOICEPRINT), FALSE);
BoolProfile(spectrumTransmitOnly, cg, rstring(IDS_PF_MON_TRANSMIT), FALSE);
BoolProfile(spectrumReceiveOnly, cg, rstring(IDS_PF_MON_RECEIVE), FALSE);
BoolProfile(spectrumMaxEnergy, cg, rstring(IDS_PF_MON_ENV_MAX), FALSE);
#undef BoolProfile
useSendNotSendto = waNetUseSend;
// Check out the audio hardware
halfDuplex = isHalfDuplex(hwnd);
// Create the timeout timer
if (SetTimer(hwnd, FRAME_TIMER_ID, 1000, NULL) == 0) {
MsgBox(NULL, MB_ICONSTOP | MB_OK, Format(15));
return -1;
}
// Calculate packet size based on selected modes
currentInputLength = inputBufferLength();
currentInputSamples = inputSampleCount();
// Get textmetric data
hdc = GetDC(hwnd);
ofont = SelectObject(hdc, GetStockObject(ANSI_VAR_FONT));
GetTextMetrics(hdc, &tm);
SelectObject(hdc, ofont);
ReleaseDC(hwnd, hdc);
tmAveCharWidth = (INT) tm.tmAveCharWidth;
tmHeight = (INT) tm.tmHeight;
DragAcceptFiles(hwnd, TRUE);
#ifdef TRAY
// Create notification icon in system tray
if (lurkInTray) {
trayIconWindow = createTrayIcon();
updateTrayToolTipText();
}
#endif
/* If an answering machine message file was named, open
it. This doesn't imply we're recording messages; that's
controlled by answerRecord. */
if (answerFileName[0] != 0) {
answerOpen();
}
// Open the face image file, if any
V openFaceFile(hwnd);
/* If we're publishing our information with a Look Who's Listening
server, establish contact with it. */
V lwl_reconnect(hwnd);
// Finally, open the input sockets for business.
if (WSAAsyncSelect(sCommand, hwnd, WM_SOCKET_SELECT, FD_READ) != 0) {
serr = WSAGetLastError();
}
if (serr != 0) {
MsgBox(NULL, MB_ICONSTOP | MB_OK, Format(14),
serr, SockerrToString(serr));
}
if (WSAAsyncSelect(sControl, hwnd, WM_SOCKET_CONTROL, FD_READ) != 0) {
serr = WSAGetLastError();
}
if (serr != 0) {
MsgBox(NULL, MB_ICONSTOP | MB_OK, Format(14),
serr, SockerrToString(serr));
}
createSuccessful = TRUE;
return TRUE;
}
/* onCommand -- Dispatch WM_COMMAND messages. Some are processed
at the frame level, some sent to the MDI client,
and others forwarded to the active MDI connection
window. */
static VOID onCommand(HWND hwnd, INT id, HWND hwndCtl, UINT codeNotify)
{
if (id > IDM_CUSTOM && id <= (IDM_CUSTOM + rememberedConnections)) {
newConnection(hwnd, rememberedConnection[(id - IDM_CUSTOM) - 1], NULL);
return;
}
switch (id) {
case IDM_CONNECTION_NEW:
newConnection(hwnd, NULL, NULL);
break;
case IDM_CONN_OPEN:
{
OPENFILENAME ofn;
char cfName[MAX_PATH];
memset(&ofn, 0, sizeof(ofn));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd;
ofn.lpstrFilter = rfilter(IDS_T_CONNECTION_FILTER);
ofn.lpstrCustomFilter = NULL;
cfName[0] = 0;
ofn.lpstrFile = (LPSTR) cfName;
ofn.nMaxFile = sizeof cfName;
ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle = rstring(IDS_T_CONNECTION_OPEN_TITLE);
ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_SHOWHELP;
fileHelpKey = rstring(IDS_HELP_OPEN_CONNECTION);
if (GetOpenFileName((LPOPENFILENAME) &ofn) == 0) {
break;
}
newConnection(hwnd, cfName, NULL);
}
break;
case IDM_CONN_SAVE_AS:
{
OPENFILENAME ofn;
HWND cWnd = getActiveConnection();
if (cWnd != NULL) {
LPCLIENT_DATA d = CLIENTPTR(cWnd);
d->timeout = -1; // Make connection immortal
memset(&ofn, 0, sizeof(ofn));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd;
ofn.lpstrDefExt = "SFX";
ofn.lpstrFilter = rfilter(IDS_T_CONNECTION_FILTER);
ofn.lpstrCustomFilter = NULL;
d->szFile[0] = 0;
ofn.lpstrFile = (LPSTR) d->connectionFileName;
ofn.nMaxFile = sizeof d->connectionFileName;
ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle = rstring(IDS_T_CONNECTION_SAVE_TITLE);
ofn.Flags = OFN_NOREADONLYRETURN | OFN_OVERWRITEPROMPT |
OFN_HIDEREADONLY | OFN_SHOWHELP;
fileHelpKey = rstring(IDS_HELP_SAVE_CONNECTION);
if (GetSaveFileName((LPOPENFILENAME) &ofn) == 0) {
break;
}
}
}
// Wheee!!! Note fall-through
case IDM_CONN_SAVE:
{
HWND cWnd = getActiveConnection();
if (cWnd != NULL) {
LPCLIENT_DATA d = CLIENTPTR(cWnd);
char mcs[10], pno[10];
wsprintf(mcs, Format(5), d->multicast_scope);
wsprintf(pno, Format(5), d->port);
d->timeout = -1; // Make connection immortal
if (WritePrivateProfileString(rstring(IDS_PF_HOST), rstring(IDS_PF_HOST_NAME),
d->szHost, d->connectionFileName) == 0 ||
WritePrivateProfileString(rstring(IDS_PF_HOST), rstring(IDS_PF_NETADDR),
inet_ntoa(d->inetSock.sin_addr), d->connectionFileName) == 0 ||
WritePrivateProfileString(rstring(IDS_PF_HOST), rstring(IDS_PF_PORT_NUMBER),
pno, d->connectionFileName) == 0 ||
WritePrivateProfileString(rstring(IDS_PF_DEBUG), rstring(IDS_PF_DEBUGGING),
d->debugging ? kS1 : kS0, d->connectionFileName) == 0 ||
WritePrivateProfileString(rstring(IDS_PF_DEBUG), rstring(IDS_PF_LOOPBACK),
d->loopback ? kS1 : kS0, d->connectionFileName) == 0 ||
WritePrivateProfileString(rstring(IDS_PF_MULTICAST), rstring(IDS_PF_SCOPE),
mcs, d->connectionFileName) == 0 ||
WritePrivateProfileString(rstring(IDS_PF_ENCRYPTION), rstring(IDS_PF_SAVE_KEYS),
d->saveKeys ? kS1 : kS0, d->connectionFileName) == 0 ||
WritePrivateProfileString(rstring(IDS_PF_ENCRYPTION), rstring(IDS_PF_PGP_USER_NAMES),
d->opgpUserList, d->connectionFileName) == 0 ||
(!d->saveKeys ? 0 : (
WritePrivateProfileString(rstring(IDS_PF_ENCRYPTION), rstring(IDS_PF_DES_KEY),
d->desKeyString, d->connectionFileName) == 0 ||
WritePrivateProfileString(rstring(IDS_PF_ENCRYPTION), rstring(IDS_PF_IDEA_KEY),
d->ideaKeyString, d->connectionFileName) == 0 ||
WritePrivateProfileString(rstring(IDS_PF_ENCRYPTION), rstring(IDS_PF_BLOWFISH_KEY),
d->blowfishKeyString, d->connectionFileName) == 0 ||
WritePrivateProfileString(rstring(IDS_PF_ENCRYPTION), rstring(IDS_PF_AES_KEY),
d->aesKeyString, d->connectionFileName) == 0 ||
WritePrivateProfileString(rstring(IDS_PF_ENCRYPTION), rstring(IDS_PF_AES_KEY_HEX),
d->aesKeyHex ? kS1 : kS0, d->connectionFileName) == 0 ||
WritePrivateProfileString(rstring(IDS_PF_ENCRYPTION), rstring(IDS_PF_KEY_FILE),
d->otpFileName, d->connectionFileName) == 0))) {
MessageBox(hwnd, rstring(IDS_T_CONN_SAVE_ERR), NULL,
MB_OK | MB_ICONEXCLAMATION);
} else {
rememberNewConnection(d->connectionFileName);
}
}
}
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -