📄 cpfwindow.cpp
字号:
case IDI_CODERCOMBOBOX:
if((wParam >> 16) == CBN_SELCHANGE)
{
CString str;
ulong newEncoder;
// get the string for the current selection
mCoderComboBox.GetLBText(mCoderComboBox.GetCurSel(), str);
if(!strcmp(str, "GSM Lite 4410 hz")) newEncoder ='GS4L';
else if(!strcmp(str, "GSM Lite 6000 hz")) newEncoder ='GS6L';
else if(!strcmp(str, "GSM Lite 7350 hz")) newEncoder ='GS7L';
else if(!strcmp(str, "GSM Lite 8000 hz")) newEncoder ='GL80';
else if(!strcmp(str, "GSM Lite 11025 hz")) newEncoder ='GS1L';
else if(!strcmp(str, "GSM 4410 hz")) newEncoder ='GSM4';
else if(!strcmp(str, "GSM 6000 hz")) newEncoder ='GSM6';
else if(!strcmp(str, "GSM 7350 hz")) newEncoder ='GSM7';
else if(!strcmp(str, "GSM 8000 hz")) newEncoder ='GS80';
else if(!strcmp(str, "GSM 11025 hz")) newEncoder ='GSM1';
else if(!strcmp(str, "ADPCM 8000 hz")) newEncoder ='ADP8';
else
pgp_errstring("unknown encoder");
mControlQueue->Send(_mt_changeEncoder, (void*)newEncoder);
}
break;
case IDI_DECODERCOMBOBOX:
if((wParam >> 16) == CBN_SELCHANGE)
{
CString str;
ulong newDecoder;
// get the string for the current selection
mDecoderComboBox.GetLBText(mDecoderComboBox.GetCurSel(), str);
if(!strcmp(str, "GSM Lite 4410 hz")) newDecoder ='GS4L';
else if(!strcmp(str, "GSM Lite 6000 hz")) newDecoder ='GS6L';
else if(!strcmp(str, "GSM Lite 7350 hz")) newDecoder ='GS7L';
else if(!strcmp(str, "GSM Lite 8000 hz")) newDecoder ='GL80';
else if(!strcmp(str, "GSM Lite 11025 hz")) newDecoder ='GS1L';
else if(!strcmp(str, "GSM 4410 hz")) newDecoder ='GSM4';
else if(!strcmp(str, "GSM 6000 hz")) newDecoder ='GSM6';
else if(!strcmp(str, "GSM 7350 hz")) newDecoder ='GSM7';
else if(!strcmp(str, "GSM 8000 hz")) newDecoder ='GS80';
else if(!strcmp(str, "GSM 11025 hz")) newDecoder ='GSM1';
else if(!strcmp(str, "ADPCM 8000 hz")) newDecoder ='ADP8';
else
pgp_errstring("unknown decoder");
mControlQueue->Send(_mt_changeDecoder, (void*)newDecoder);
}
break;
case IDI_CONNECTBUTTON:{
char s[256];
if((wParam >> 16) == BN_CLICKED)
{
switch(mState)
{
case _cs_none:
case _cs_uninitialized:
case _cs_listening:
ContactEntry *entry;
if(mState == _cs_listening)
mControlThread->GetTransport()->AbortSync();
mCallComboBox.GetWindowText(s, 256);
if(mCallComboBox.FindStringExact(-1,s) == CB_ERR)
mCallComboBox.AddString(s);
entry = (ContactEntry*)pgp_mallocclear(sizeof(ContactEntry));
switch(gPGFOpts.popt.connection)
{
case _cme_Serial:
entry->method = _cme_Serial;
strncpy(entry->phoneNumber, s, PHONENUMBERLEN);
entry->modemInit[0] = 0;
strcat(entry->modemInit, "AT");
strcat(entry->modemInit, gPGFOpts.sopt.modemInit);
break;
case _cme_Internet:
entry->method = _cme_Internet;
entry->useIPSearch = 0;
strncpy(entry->internetAddress, s, PHONENUMBERLEN);
break;
}
CStatusPane::GetStatusPane()->Clear();
mControlQueue->Send(_mt_call, entry);
break;
case _cs_calldetected:
mControlThread->GetTransport()->Answer();
break;
case _cs_connecting:
case _cs_disconnecting:
case _cs_initializing:
case _cs_connected:
mControlThread->AbortSync(FALSE, FALSE);
mFTP.ShowWindow(SW_HIDE);
break;
}
}
break;}
case IDI_TALKBUTTON:
if((wParam >> 16) == BN_CLICKED)
{
switch(mState)
{
case _cs_none:
case _cs_uninitialized:
case _cs_listening:
if(mSoundInput->Recording())
{
mSoundInput->Record(FALSE);
mSoundOutput->Play(FALSE);
mTalkButton.SetWindowText("Test");
}
else
{
mSoundInput->SetCodec(gPGFOpts.popt.prefCoder);
mSoundOutput->SetCodec(gPGFOpts.popt.prefCoder);
mSoundInput->SetOutput(mSoundOutput, mSoundOutput->GetPlayQueue());
mSoundInput->Record(TRUE);
mSoundOutput->Play(TRUE);
mTalkButton.SetWindowText("Stop Test");
}
break;
case _cs_connected:
if(mTalkFlag)
mControlQueue->SendUnique(_mt_listen);
else
mControlQueue->SendUnique(_mt_talk);
break;
case _cs_calldetected:
case _cs_connecting:
case _cs_disconnecting:
case _cs_initializing:
break;
}
}
break;
}
return CView::OnCommand(wParam, lParam);
}
void
CPFWindow::OnTimer(UINT nIDEvent)
{
switch(nIDEvent)
{
case RANDOM_DATA_TIMER:
{
ulong ticks;
static BOOL performanceCounterAvailable;
static BOOL checkedPerformanceCounterAvailability = FALSE;
LARGE_INTEGER performanceCount;
/*First, get clock tick info...*/
ticks = GetTickCount();
randPoolAddWord(ticks);
/*The performance counter is available on some platforms. If it is
*available, it can have a precision of about one microsecond. If it
*is available, we use it as a random bit source. Since it seems
*silly to check if the thing is available every time we get a timer
*message, we only check our first run through.
*/
if(!checkedPerformanceCounterAvailability)
{
checkedPerformanceCounterAvailability = TRUE;
performanceCounterAvailable =
QueryPerformanceCounter(&performanceCount);
}
if(performanceCounterAvailable)
{
if(QueryPerformanceCounter(&performanceCount))
randPoolAddBytes((uchar *) &performanceCount,
sizeof(performanceCount));
else
{
/*This is a very bad thing: we said it was available before,
*but now MS says it's not!
*/
pgp_errstring(
"performanceCounterAvailable contains inconsistant value!");
}
}
break;
}
#if 0
case DEBUG_TIMER:
{
ShowStatus();
break;
}
#endif
case UPDATE_TIMER:
{
char s[128], t[128];
long samp, inx;
if(mHPPOutQueue)
{
samp = mHPPOutQueue->GetSize();
if(samp > mMaxQueueSize)
{
mMaxQueueSize = samp;
}
if(mLastSampleTime + 1000 <= pgp_getticks())
{
mOutQueueSizes[mEntryPos] = samp;
mEntryPos++;
mEntryPos %= OUTQUEUEENTRIES;
mLastSampleTime = pgp_getticks();
for(inx=mAvgHPP=0;inx<OUTQUEUEENTRIES;inx++)
{
mAvgHPP += mOutQueueSizes[inx];
}
mAvgHPP /= OUTQUEUEENTRIES;
if(mAvgHPP >= SOUNDINPUTQUEUEAVGMAX)
{
// we have become very backed up
mOverflows += samp;
for(inx=mAvgHPP=0;inx<OUTQUEUEENTRIES;inx++)
{
mOutQueueSizes[inx]=0;
}
// so ditch outgoing
mHPPOutQueue->FreeType(_mt_voicePacket);
InterlockedIncrement(&mDirty);
}
}
}
if(!mDirty)
{
return;
}
InterlockedExchange(&mDirty, 0);
_itoa(mRTTms, t, 10);
sprintf(s, "%d\r%d\r%d\r%sms\r%d%%",
mPacketsSent, mGoodPackets, mBadPackets,
t, mGSMfull);
mInfo1.SetWindowText(s);
_itoa(mSoundOutput->GetNumPlaying(), t, 10);
sprintf(s, "%s\r%d\r%d\r%dms\r%d",
t, mOutputUnderflows, mOverflows, mJitter, mBandwidth);
mInfo2.SetWindowText(s);
mStatusPane.UpdateStatus();
break;
}
}
CView::OnTimer(nIDEvent);
}
void
CPFWindow::OnMouseMove(UINT nFlags, CPoint point)
{
//This uses the mouse movements for random data. The nFlags
//as a general rule will equal 0, but will allow an extra little
//bit of randomness (no pun intended) if the user is clicking or
//shifting or what-have-you-ing.
randPoolAddBytes((uchar *) &nFlags, sizeof(nFlags));
randPoolAddBytes((uchar *) &point, sizeof(point));
CView::OnMouseMove(nFlags, point);
}
int
CPFWindow::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
ModifyStyleEx(0, WS_EX_CONTROLPARENT, SWP_NOSIZE);
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
//Set up the Timer so that we can get random data from the system timers
if(!SetTimer(RANDOM_DATA_TIMER, 350, NULL))
pgp_errstring("Error Creating Random Data Timer");
if(!SetTimer(DEBUG_TIMER, 1000, NULL))
pgp_errstring("Error Creating Debug Timer");
return 0;
}
void CPFWindow::OnFileAnswer()
{
if((mState == _cs_uninitialized || mState == _cs_listening) &&
(gPGFOpts.popt.connection == _cme_Serial))
{
if(mState == _cs_listening)
mControlThread->GetTransport()->AbortSync();
mControlQueue->SendUnique(_mt_answer);
}
}
void CPFWindow::OnUpdateFileAnswer(CCmdUI* pCmdUI)
{
if((mState == _cs_uninitialized || mState == _cs_listening) &&
(gPGFOpts.popt.connection == _cme_Serial))
pCmdUI->Enable(1);
else
pCmdUI->Enable(0);
}
void CPFWindow::OnClose()
{
// TODO: Add your message handler code here and/or call default
CView::OnClose();
}
void CPFWindow::Die(void)
{
ulong start;
mDead = TRUE;
mControlThread->AbortSync(TRUE);
while(!mControlResult)
Sleep(0);
delete mControlQueue;
mSoundInput->AbortSync();
mSoundOutput->GetPlayQueue()->SendUnique(_mt_quit);
start = pgp_getticks();
while((!mSoundInputResult || !mSoundOutputResult) &&
pgp_getticks() - start < 15000)
Sleep(0);
pgpAssert(mControlResult);
pgpAssert(mSoundInputResult);
pgpAssert(mSoundOutputResult);
mAuthWindow.DestroyWindow();
mFTP.DestroyWindow();
}
//This handler is needed to enable dialog-like handling of things like
//tabs.
BOOL CPFWindow::PreTranslateMessage(MSG* msg)
{
//Ugly hack: We catch WM_KEY here when they hit "ENTER" and use it to fake
//like the Connect button has been hit.
if(msg->message == WM_KEYDOWN)
{
if(msg->wParam == '\n' ||
msg->wParam == '\r')
{
this->PostMessage(WM_COMMAND, IDI_CONNECTBUTTON);
return(TRUE);
}
}
//Basically, IsDialogMessage handles any dialog messages.
if(IsDialogMessage(msg))
return TRUE; //If it was a dialog message, it's been handled, we're done.
else
return CWnd::PreTranslateMessage(msg); //Else do the normal thing
}
void
CPFWindow::SetRTTime(ulong rttVal)
{
InterlockedExchange(&mRTTms, rttVal);
InterlockedExchange(&mDirty, 1);
}
void
CPFWindow::SetJitter(long jitter)
{
InterlockedExchange(&mJitter, jitter);
InterlockedExchange(&mDirty, 1);
}
void
CPFWindow::SetBandwidth(long bandwidth)
{
InterlockedExchange(&mBandwidth, bandwidth);
InterlockedExchange(&mDirty, 1);
}
void
CPFWindow::GotPacket(Boolean good)
{
if(!good)
InterlockedIncrement(&mBadPackets);
else
InterlockedIncrement(&mGoodPackets);
InterlockedExchange(&mDirty, 1);
}
void
CPFWindow::SentPacket(void)
{
InterlockedIncrement(&mPacketsSent);
InterlockedExchange(&mDirty, 1);
}
void
CPFWindow::SetGSMTimes(long full, long lite, long fullDec, long liteDec)
{
InterlockedExchange(&mGSMfull, full/10);
InterlockedExchange(&mGSMlite, lite/10);
InterlockedExchange(&mGSMfullDec, fullDec/10);
InterlockedExchange(&mGSMliteDec, liteDec/10);
InterlockedExchange(&mDirty, 1);
}
void
CPFWindow::InitCall(void)
{
long inx;
InterlockedExchange(&mGoodPackets, 0);
InterlockedExchange(&mBadPackets, 0);
InterlockedExchange(&mAvgHPP, 0);
InterlockedExchange(&mMaxQueueSize, 0);
InterlockedExchange(&mEntryPos, 0);
InterlockedExchange(&mPacketsSent, 0);
InterlockedExchange(&mOutputUnderflows, 0);
InterlockedExchange(&mOverflows, 0);
InterlockedExchange(&mDirty, 1);
InterlockedExchange(&mRTTms, 0);
InterlockedExchange(&mAvgHPP, 0);
InterlockedExchange(&mMaxQueueSize, 0);
for(inx=0;inx<OUTQUEUEENTRIES;inx++)
mOutQueueSizes[inx] = 0;
}
void
CPFWindow::Underflow()
{
InterlockedIncrement(&mOutputUnderflows);
InterlockedExchange(&mDirty, 1);
}
void
CPFWindow::OverflowOut(short numLost)
{
mOverflows += numLost;
InterlockedExchange(&mDirty, 1);
}
BOOL CPFWindow::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
int pos;
switch( wParam )
{
case IDI_VOLUMESLIDER:
pos = mVolumeSlider.GetPos();
mSoundOutput->SetVolume( (unsigned long)pos * (unsigned long)100 );
break;
case IDI_GAINSLIDER:
pos = mGainSlider.GetPos();
mSoundInput->SetGain( pos );
break;
}
return CView::OnNotify(wParam, lParam, pResult);
}
BEGIN_MESSAGE_MAP(CPFWindow, CView)
//{{AFX_MSG_MAP(CPFWindow)
ON_WM_TIMER()
ON_WM_MOUSEMOVE()
ON_WM_CREATE()
ON_WM_CLOSE()
ON_COMMAND(ID_FILE_ANSWER, OnFileAnswer)
ON_UPDATE_COMMAND_UI(ID_FILE_ANSWER, OnUpdateFileAnswer)
ON_COMMAND(ID_VIEW_STATUS_INFO, OnViewStatusInfo)
ON_UPDATE_COMMAND_UI(ID_VIEW_STATUS_INFO, OnUpdateViewStatusInfo)
ON_COMMAND(ID_EDIT_PREFERENCES, OnEditPreferences)
ON_UPDATE_COMMAND_UI(ID_EDIT_PREFERENCES, OnUpdateEditPreferences)
ON_COMMAND(ID_VIEW_ENCODING_DETAILS, OnViewEncodingDetails)
ON_UPDATE_COMMAND_UI(ID_VIEW_ENCODING_DETAILS, OnUpdateViewEncodingDetails)
ON_COMMAND(ID_TRANSFER_FILE, OnTransferFile)
ON_UPDATE_COMMAND_UI(ID_TRANSFER_FILE, OnUpdateTransferFile)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -