📄 frame.c
字号:
GetPrivateProfileString(cg, rstring(IDS_PF_KEY_FILE), "",
pClientData->otpFileName,
sizeof pClientData->otpFileName, connectionFile);
}
// Initialise settings derived from saved parameters
if (!makeInternalEncryptionKeys(hwndClient, pClientData)) {
pClientData->otpFileName[0] = 0;
}
/* Caution: don't reference connectionFile anywhere after
the call to rememberNewConnection. If we're re-opening
a remembered connection, the call may release it. */
rememberNewConnection(connectionFile);
}
#undef addrHost
}
#ifdef CRYPTO
/* PGPSETSESSIONKEY -- If needed, invoke PGP to decrypt the session
key and set it in effect for PGP encrypted
packets. */
static void pgpSetSessionKey(HWND hwnd, LPCLIENT_DATA conn, soundbuf *d)
{
char cmd[MAX_PATH + 40], kmd[16];
HFILE kfile;
struct MD5Context md5c;
MD5Init(&md5c);
MD5Update(&md5c, d->buffer.buffer_val, (unsigned) d->buffer.buffer_len);
MD5Final(kmd, &md5c);
if (memcmp(conn->pgpkeymd5, kmd, 16) != 0) {
char td[MAX_PATH];
GetTempPath(sizeof td, td);
conn->pgpkey[0] = FALSE;
memcpy(conn->pgpkeymd5, kmd, 16);
GetTempFileName(
td
, "PK", 0, conn->pgpFileName);
kfile = _lcreat(conn->pgpFileName, 0);
if (kfile == HFILE_ERROR) {
MessageBox(hwnd, rstring(IDS_T_OPEN_SESSION_KEY_FILE_ERR),
rstring(IDS_T_PGP_KEY_ERR_TITLE), MB_ICONEXCLAMATION | MB_OK);
} else {
UINT execStat = 0;
_lwrite(kfile, d->buffer.buffer_val, (UINT) d->buffer.buffer_len);
_lclose(kfile);
/* First try to run PGP via the PIF in our own directory. This
guarantees it's run with the modes we've chosen, such as
in a window rather than full-screen. */
if (GetModuleFileName(hInst, cmd, sizeof cmd) > 0) {
char *cp = cmd + strlen(cmd);
while (cp >= cmd && *cp != '\\' && *cp != ':') {
cp--;
}
cp[1] = 0;
wsprintf(cmd + strlen(cmd), Format(52), conn->pgpFileName);
execStat = WinExec(cmd, SW_SHOW);
}
/* If that didn't work, attempt to run PGP by straight path
search using the default modes. */
if (execStat < 32) {
wsprintf(cmd, Format(1), conn->pgpFileName);
execStat = WinExec(cmd, SW_SHOW);
}
// Set timer to poll for completion of decoding
if (execStat >= 32) {
conn->pgpFileName[strlen(conn->pgpFileName) - 4] = 0;
SetTimer(hwnd, 3, 1000, NULL);
} else {
wsprintf(cmd + strlen(cmd), Format(51), execStat);
MessageBox(hwnd, cmd, rstring(IDS_T_CANT_INVOKE_PGP),
MB_OK | MB_ICONEXCLAMATION);
}
}
}
}
#endif
// onCreate -- Initialise frame window when newly created
static BOOL onCreate(HWND hwnd, CREATESTRUCT FAR *pCreateStruct)
{
CLIENTCREATESTRUCT ccs;
WSADATA wsadata;
SOCKERR serr;
HDC hdc;
TEXTMETRIC tm;
HFONT ofont;
int i, j, isPC_NFS;
char pfn[80], cg[80];
char md5key[16];
// Initialize the sockets library
serr = WSAStartup(DESIRED_WINSOCK_VERSION, &wsadata);
if (serr != 0) {
MsgBox(NULL, MB_ICONSTOP | MB_OK, Format(12), serr, SockerrToString(serr));
return -1;
}
if (wsadata.wVersion < MINIMUM_WINSOCK_VERSION) {
MsgBox(NULL, MB_ICONSTOP | MB_OK, Format(13), LOBYTE(wsadata.wVersion),
HIBYTE(wsadata.wVersion), LOBYTE(MINIMUM_WINSOCK_VERSION),
HIBYTE(MINIMUM_WINSOCK_VERSION));
return -1;
}
aboutUDPmax = wsadata.iMaxUdpDg;
isPC_NFS = strcmp(wsadata.szDescription, rstring(IDS_T_SUN_SIGNATURE)) == 0;
/* If the network can't transmit sound packets as large as we'd like
to send, restrict the size to what it can accommodate. */
if (aboutUDPmax > 0) {
if ((netMaxSamples + (sizeof(soundbuf) - BUFL) + 40) > (UINT) aboutUDPmax) {
netMaxSamples = aboutUDPmax - ((sizeof(soundbuf) - BUFL) + 40);
}
}
// Create the command and control sockets
serr = CreateSocket(&sCommand, SOCK_DGRAM, htonl(INADDR_ANY), htons(NETFONE_COMMAND_PORT));
if (serr != 0) {
MsgBox(NULL, MB_ICONSTOP | MB_OK, Format(14),
serr, SockerrToString(serr));
return -1;
}
serr = CreateSocket(&sControl, SOCK_DGRAM, htonl(INADDR_ANY),
htons(NETFONE_COMMAND_PORT + 1));
if (serr != 0) {
MsgBox(NULL, MB_ICONSTOP | MB_OK, Format(14),
serr, SockerrToString(serr));
return -1;
}
// Load cursors
phoneCursor = LoadCursor(hInst, MAKEINTRESOURCE(IDC_CURSOR_PHONE));
earCursor = LoadCursor(hInst, MAKEINTRESOURCE(IDC_CURSOR_EAR));
boltCursor = LoadCursor(hInst, MAKEINTRESOURCE(IDC_CURSOR_BOLT));
// Register the message for file open/save help button pressed
fileOpenHelpButton = RegisterWindowMessage(HELPMSGSTRING);
// Initialise GSM encoding and decoding
gsmh = gsm_create();
// Initialise LPC encoding and decoding
if (!lpc_start()) {
MsgBox(NULL, MB_ICONSTOP | MB_OK, rstring(IDS_T_LWL_ALLOC));
return -1;
}
lpc_init();
lpc10init();
// Initialise simple (2X) compression
rate_start(&xrate, 8000, 4000);
// Initialise DES
#ifdef CRYPTO
desinit(1);
#endif
// Initialise RTP randomised parameters
sessionKeyGenerate(md5key, TRUE);
memcpy((char *) &ssrc, md5key, sizeof ssrc);
memcpy((char *) ×tamp, md5key + sizeof ssrc,
sizeof timestamp);
memcpy((char *) &seq, md5key + sizeof ssrc + sizeof timestamp,
sizeof seq);
memcpy((char *) &rtpdesrand, md5key + sizeof ssrc + sizeof timestamp +
sizeof seq, sizeof rtpdesrand);
// Create the MDI client window
ccs.hWindowMenu = GetSubMenu(GetMenu(hwnd), 3); // Identify Window menu
ccs.idFirstChild = IDM_WINDOW_FIRST_CHILD;
hwndMDIClient = CreateWindow(pszMDIClientClass, NULL,
WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL,
0, 0, 0, 0, hwnd, 0, hInst, (LPSTR) &ccs);
if (hwndMDIClient == NULL) {
return -1;
}
ShowWindow(hwndMDIClient, SW_SHOW);
strcpy(pfn, rstring(IDS_PF_PROFILE_FILE));
// Load remembered recent connections
strcpy(cg, rstring(IDS_PF_CONNECTIONS));
rememberedConnections = GetPrivateProfileInt(cg, rstring(IDS_PF_CONNCOUNT),
0, pfn);
if (rememberedConnections > REMEMBER_CONNECTIONS) {
rememberedConnections = REMEMBER_CONNECTIONS;
}
for (i = j = 0; i < rememberedConnections; i++) {
char psn[12], rcr[MAX_HOST];
wsprintf(psn, Format(2), i + 1);
GetPrivateProfileString(cg, psn, "", rcr,
sizeof rcr, pfn);
if (strlen(rcr) > 0) {
LPSTR rcon = (LPSTR) GlobalAllocPtr(GPTR, strlen(rcr) + 1);
if (rcon!= NULL) {
strcpy(rcon, rcr);
rememberedConnection[j++] = rcon;
}
}
}
rememberedConnections = j;
#ifdef IP_MAX_MEMBERSHIPS
// Restore multicast group memberships
strcpy(cg, rstring(IDS_PF_MULTIGROUPS));
multiMemberships = GetPrivateProfileInt(cg, rstring(IDS_PF_CONNCOUNT),
0, pfn);
if (multiMemberships > IP_MAX_MEMBERSHIPS) {
multiMemberships = IP_MAX_MEMBERSHIPS;
}
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);
// 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);
#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);
BoolProfile(lookWho_sTalking, rstring(IDS_PF_PREFERENCES), rstring(IDS_PF_LOOKWHO), FALSE);
jitterBuf = GetPrivateProfileInt(rstring(IDS_PF_PREFERENCES), rstring(IDS_PF_JITTER), jitterBuf, pfn);
// 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);
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -