summaryrefslogtreecommitdiffabout
authorMichael Krelin <hacker@klever.net>2004-11-04 20:04:19 (UTC)
committer Michael Krelin <hacker@klever.net>2004-11-04 20:04:19 (UTC)
commita494b6d595059d6fb6464935e429176a714d490d (patch) (side-by-side diff)
tree20b82b6d6512ace8abcc7774d0a9c9d7c0bcfbb2
parent5f552506513653f08acc6921b8c158489a7ebbbb (diff)
downloadpumpkin-a494b6d595059d6fb6464935e429176a714d490d.zip
pumpkin-a494b6d595059d6fb6464935e429176a714d490d.tar.gz
pumpkin-a494b6d595059d6fb6464935e429176a714d490d.tar.bz2
invalid opcode during xfer message shows the opcode itself now.
git-svn-id: http://svn.klever.net/kin/pumpkin/trunk@48 fe716a7a-6dde-0310-88d9-d003556173a8
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--PumpKINDlg.cpp20
-rw-r--r--pumpkin.rc2
2 files changed, 15 insertions, 7 deletions
diff --git a/PumpKINDlg.cpp b/PumpKINDlg.cpp
index fc24596..b6b8a36 100644
--- a/PumpKINDlg.cpp
+++ b/PumpKINDlg.cpp
@@ -560,851 +560,859 @@ DWORD fionread = 0;
tftp *p = tftp::Allocate(fionread);
ASSERT(p);
SOCKADDR_IN sin;
if(!p->Receive(this,fionread,&sin)){
m_Daddy->LogLine(IDS_LOG_XFERUDPRECEIVE);
delete p;
}else
if(m_Peer.sin_addr.s_addr==INADDR_NONE){
m_Peer.sin_addr=sin.sin_addr;
m_Peer.sin_port=sin.sin_port;
}
BOOL alive = TRUE;
if(state==stateInit){
state=stateXfer;
m_Peer.sin_port=sin.sin_port;
UpdateList();
}
if(sin.sin_addr.s_addr!=m_Peer.sin_addr.s_addr || sin.sin_port!=m_Peer.sin_port){
m_Daddy->LogLine(IDS_LOG_XFERSOURCETID);
// *** Bounce it!
}else{
alive = OnTFTP(p);
}
delete p;
if(alive){
DoSelect();
ResetTimeout();
}
}
void CXferSocket::SetPeer(SOCKADDR_IN *sin)
{
ASSERT(sin);
memmove(&m_Peer,sin,sizeof(m_Peer));
}
void CXferSocket::UpdateList()
{
ASSERT(m_Daddy);
LV_FINDINFO lvf;
memset(&lvf,0,sizeof(lvf));
lvf.flags=LVFI_PARAM;
lvf.lParam=(LPARAM)this;
int i = m_Daddy->m_List.FindItem(&lvf);
if(i<0){
ASSERT(IsKindOf(RUNTIME_CLASS(CRRQSocket)) || IsKindOf(RUNTIME_CLASS(CWRQSocket)));
i=m_Daddy->m_List.InsertItem(0,m_FileName,IsKindOf(RUNTIME_CLASS(CRRQSocket))?m_Daddy->m_iRRQ:m_Daddy->m_iWRQ);
ASSERT(!(i<0));
m_Daddy->m_List.SetItemData(i,(DWORD)this);
}
m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemFile,m_FileName);
m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemType,m_Type);
m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemPeer,inet_ntoa(m_Peer.sin_addr));
CString tmp;
tmp.Format(IDS_FMT_BYTES,GetACK());
m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemBytes,tmp);
if(m_xferSize>=0){
tmp.Format(IDS_FMT_BYTES,m_xferSize);
m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemTSize,tmp);
}
}
CXferSocket::CXferSocket()
: m_wndResolver(NULL), m_Retry(NULL), m_bRetry(FALSE),
m_blkSize(512), m_timeOut(30), m_xferSize(-1),
m__blkSize(512), m__timeOut(30)
{
m_Daddy=NULL;
m_Peer.sin_addr.s_addr=INADDR_NONE;
m_Peer.sin_family=AF_INET;
state=stateNone;
}
ULONG CXferSocket::GetACK()
{
return 0;
}
CXferSocket::CXferSocket(CPumpKINDlg *daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN* sin)
: m_wndResolver(NULL), m_Retry(NULL), m_bRetry(FALSE),
m_blkSize(512), m_timeOut(30), m_xferSize(-1),
m__blkSize(512), m__timeOut(30)
{
m_Peer.sin_family=AF_INET;
state=stateNone;
ASSERT(daddy);
m_Daddy=daddy;
m_timeOut=m__timeOut=m_Daddy->m_TFTPTimeOut.GetTotalSeconds();
if(sin){
m_Peer.sin_addr.s_addr=sin->sin_addr.s_addr;
m_Peer.sin_port=sin->sin_port;
}else
m_Peer.sin_addr.s_addr=INADDR_NONE;
m_FileName=fileName;
m_Type=type;
}
BOOL CRRQSocket::Create(LPCTSTR localFile,LPCTSTR hostName)
{
if(!CAsyncSocket::Create(0,SOCK_DGRAM))
return FALSE;
ASSERT(m_Daddy);
ASSERT(m_Peer.sin_addr.s_addr!=INADDR_NONE || hostName);
m_Daddy->m_Xfers[m_hSocket]=this;
CString lFile = localFile?localFile:m_FileName;
TurnSlashes(lFile,TRUE);
UpdateList();
if(!localFile){ // Check only if server
if(CheckBadRelativeness(m_FileName)){
Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS);
return TRUE;
}
switch(m_Daddy->m_RRQMode){
case CPumpKINDlg::rrqGiveAll:
break;
case CPumpKINDlg::rrqAlwaysConfirm:
if(ConfirmRequest())
break;
case CPumpKINDlg::rrqDenyAll:
Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS);
return TRUE;
}
}
CString fn = localFile?ApplyRootGently(lFile):ApplyRoot(lFile);
CFileException e;
if(!m_File.Open(fn,CFile::modeRead|CFile::shareDenyWrite,&e)){
if(localFile){
CString tmp;
tmp.Format(IDS_LOG_FAILEDLOCALFILE,fn);
m_Daddy->LogLine(tmp);
return FALSE;
}
Deny(&e);
return TRUE;
}
m_xferSize=m_File.GetLength(); // *** HANDLE EXCEPTION
if(hostName){
m_HostName=hostName;
CString tmp;
tmp.Format(IDS_LOG_SENDING,m_FileName,m_HostName);
m_Daddy->LogLine(tmp);
CString inAddr = hostName;
int at = inAddr.Find('@');
if(at>=0)
inAddr=inAddr.Mid(at+1);
if((m_Peer.sin_addr.s_addr=inet_addr((LPCTSTR)inAddr))==INADDR_NONE){
ASSERT(!m_wndResolver);
m_wndResolver = new CResolver(this);
ASSERT(m_wndResolver);
return m_wndResolver->Resolve();
}
else
OnHostKnown();
}else{
tftp::tftpOptions o;
CString v;
if(m_Options.Lookup(tftpoBSize,v)){
m__blkSize=atoi(v);
if(m__blkSize){
m_blkSize=m__blkSize;
v.Format("%u",m_blkSize);
o[tftpoBSize]=v;
}
}
if(m_Options.Lookup(tftpoTSize,v)){
v.Format("%lu",m_xferSize);
o[tftpoTSize]=v;
}
if(m_Options.Lookup(tftpoTOut,v)){
m__timeOut=atoi(v);
if(m__timeOut){
m_timeOut=m__timeOut;
v.Format("%u",m_timeOut);
o[tftpoTOut]=v;
}
}
state = stateXfer;
m_ACK=0;
if(o.GetCount()){
tftp *p = tftp::Allocate(tftp::tftpOACK::tftpSize(&o));
ASSERT(p);
p->SetOpcode(tftp::opOACK);
p->data.m_OACK.Set(&o);
PostTFTP(p,TRUE);
}else
DoXfer();
}
return TRUE;
}
CRRQSocket::CRRQSocket(CPumpKINDlg *daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN *sin)
: CXferSocket(daddy,fileName,type,sin)
{
m_ACK=0;
m_LastSlack=0;
}
UINT tftp::tftpERROR::tftpSize(LPCTSTR msg)
{
return tftpHdrSize-tftpSlackSize+sizeof(tftp::tftpERROR::tftpErrorCode)+strlen(msg)+1;
}
tftp* tftp::Allocate(UINT tftpSize)
{
ASSERT(tftpSize);
tftp* rv = (tftp*) new BYTE[tftpSlackSize+tftpSize];
ASSERT(rv);
rv->length=tftpSize;
return rv;
}
void tftp::errSet(UINT code,LPCTSTR msg)
{
ASSERT(this);
ASSERT(length>=data.m_ERROR.tftpSize(msg));
strcpy((char*)data.m_ERROR.data,msg);
data.m_ERROR.SetCode(code);
}
void CXferSocket::PostTFTP(tftp* p,BOOL retryable)
{
ASSERT(p);
m_Queue.AddTail(p);
DoSelect();
if(!m_bRetry){
if(retryable)
SetTry(p);
else
SetTry();
}
ResetTimeout();
}
void CXferSocket::Deny(UINT errCode,UINT errID)
{
PostError(errCode,errID);
state=stateDeny;
}
void CRRQSocket::DoXfer()
{
tftp *p = tftp::Allocate(tftp::tftpDATA::tftpSize(m_blkSize));
ASSERT(p);
p->SetOpcode(tftp::opDATA);
TRY{
m_File.Seek(m_ACK*m_blkSize,CFile::begin);
int bytes = m_File.Read(p->data.m_DATA.data,m_blkSize);
p->data.m_DATA.SetBlock(m_ACK+1);
p->length=p->length-m_blkSize+bytes;
m_LastSlack = m_blkSize-bytes;
PostTFTP(p);
if(bytes<m_blkSize){
state=stateFinish;
ASSERT(m_Daddy);
CString tmp;
tmp.Format(IDS_LOG_XFERRRQFINISHED,(LPCTSTR)m_FileName);
m_Daddy->LogLine(tmp);
}
}CATCH(CFileException,e){
Deny(e);
}END_CATCH
}
UINT tftp::tftpDATA::tftpSize(UINT blkSize)
{
return tftpHdrSize-tftpSlackSize+sizeof(tftp::tftpDATA)
-sizeof(BYTE)+blkSize;
}
void CXferSocket::Deny(CFileException* e)
{
PostError(e);
state=stateDeny;
}
void CXferSocket::PostError(UINT errCode,UINT errID)
{
CString msg;
msg.LoadString(errID);
ASSERT(m_Daddy);
/* // ***
CString tmp;
tmp.Format(IDS_LOG_SENTTFTPERROR,errCode,(LPCTSTR)msg);
m_Daddy->LogLine(tmp);
*/
tftp* err = tftp::Allocate(tftp::tftpERROR::tftpSize(msg));
err->SetOpcode(tftp::opERROR);
err->errSet(errCode,msg);
PostTFTP(err);
}
void CXferSocket::PostError(CFileException* e)
{
UINT eCode;
UINT eMsgID;
switch(e->m_cause){
case CFileException::fileNotFound:
eCode=tftp::errNotFound;
eMsgID=IDS_TFTP_ERROR_NOTFOUND;
break;
case CFileException::accessDenied:
eCode=tftp::errAccessViolation;
eMsgID=IDS_TFTP_ERROR_ACCESS;
break;
case CFileException::directoryFull:
eCode=tftp::errDiskFull;
eMsgID=IDS_TFTP_ERROR_DIRFULL;
break;
case CFileException::sharingViolation:
eCode=tftp::errAccessViolation;
eMsgID=IDS_TFTP_ERROR_SHARING;
break;
case CFileException::diskFull:
eCode=tftp::errDiskFull;
eMsgID=IDS_TFTP_ERROR_DISKFULL;
break;
default:
eCode=tftp::errUndefined;
eMsgID=IDS_TFTP_ERROR_UNDEFINED;
break;
}
PostError(eCode,eMsgID);
}
ULONG CRRQSocket::GetACK(void)
{
return (m_ACK*m_blkSize)-m_LastSlack;
}
BOOL CRRQSocket::OnTFTP(tftp* p)
{
BOOL rv = TRUE;
switch(p->Opcode()){
case tftp::opOACK:
m_ACK=0;
ASSERT(state!=stateFinish);
{
tftp::tftpOptions o;
if(p->GetOptions(&o)){
CString v;
if(o.Lookup(tftpoBSize,v)){
m_blkSize=atoi(v);
if(!m_blkSize){ // *** More sanity checks
Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE);
rv = TRUE;
break;
}
}
if(o.Lookup(tftpoTOut,v)){
m_timeOut=atoi(v);
if(!m_timeOut){ // *** More sanity checks
Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT);
rv = TRUE;
break;
}
}
if(o.Lookup(tftpoXResume,v)){
m_ACK=atoi(v);
}
}
UpdateList();
DoXfer();
}
break;
case tftp::opACK:
m_ACK=p->data.m_ACK.Block();
if(state!=stateFinish){
UpdateList();
DoXfer();
}
break;
case tftp::opERROR:
{
ASSERT(m_Daddy);
CString tmp;
tmp.Format(IDS_LOG_GOTTFTPERROR,p->data.m_ERROR.Code(),(LPCTSTR)p->errMessage());
m_Daddy->LogLine(tmp);
}
Destroy(FALSE);
rv = FALSE;
break;
default:
- ASSERT(m_Daddy);
- m_Daddy->LogLine(IDS_LOG_XFEROPCODE);
- // *** Self destruct maybe??
+ {
+ ASSERT(m_Daddy);
+ CString tmp;
+ tmp.Format(IDS_LOG_XFEROPCODE,p->Opcode());
+ m_Daddy->LogLine(tmp);
+ // *** Self destruct maybe??
+ }
break;
}
return rv;
}
BOOL CWRQSocket::OnTFTP(tftp* p)
{
switch(p->Opcode()){
case tftp::opOACK:
ASSERT(state!=stateFinish);
{
if(m_bResume)
m_ACK=m_File.GetLength()/m_blkSize;
else
m_ACK=0;
tftp::tftpOptions o;
if(p->GetOptions(&o)){
CString v;
if(o.Lookup(tftpoBSize,v)){
m_blkSize=atoi(v);
if(!m_blkSize){ // *** More sanity checks
Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE);
return TRUE;
}
}
if(o.Lookup(tftpoTOut,v)){
m_timeOut=atoi(v);
if(!m_timeOut){ // *** More sanity checks
Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT);
return TRUE;
}
}
if(o.Lookup(tftpoTSize,v)){
m_xferSize=atoi(v);
}
}
UpdateList();
DoXfer();
}
break;
case tftp::opDATA:
{
UINT block = p->data.m_DATA.Block();
TRY{
m_File.Seek((block-1)*m_blkSize,CFile::begin);
int bytes = p->length-sizeof(p->data.m_DATA.block)-(tftpHdrSize-tftpSlackSize);
if(bytes){
m_File.Write(p->data.m_DATA.data,bytes);
// *** Move to the other place where we can do it not that often
m_File.SetLength(m_File.GetPosition());
}
if(bytes<m_blkSize){
state=stateFinish;
ASSERT(m_Daddy);
CString tmp;
tmp.Format(IDS_LOG_XFERWRQFINISHED,(LPCTSTR)m_FileName);
m_Daddy->LogLine(tmp);
}
m_ACK=block;
m_LastSlack=m_blkSize-bytes;
UpdateList();
DoXfer();
}CATCH(CFileException,e){
Deny(e);
}END_CATCH
}
break;
case tftp::opERROR:
{
ASSERT(m_Daddy);
CString tmp;
tmp.Format(IDS_LOG_GOTTFTPERROR,p->data.m_ERROR.Code(),(LPCTSTR)p->errMessage());
m_Daddy->LogLine(tmp);
}
Destroy(FALSE);
return FALSE;
default:
- ASSERT(m_Daddy);
- m_Daddy->LogLine(IDS_LOG_XFEROPCODE);
- // *** Self destruct maybe??
+ {
+ ASSERT(m_Daddy);
+ CString tmp;
+ tmp.Format(IDS_LOG_XFEROPCODE,p->Opcode());
+ m_Daddy->LogLine(tmp);
+ // *** Self destruct maybe??
+ }
break;
}
return TRUE;
}
void tftp::SetOpcode(WORD op)
{
opcode = REVERSEBYTES(op);
}
void tftp::tftpDATA::SetBlock(WORD b)
{
block=REVERSEBYTES(b);
}
WORD tftp::tftpDATA::Block()
{
return REVERSEBYTES(block);
}
WORD tftp::tftpACK::Block()
{
return REVERSEBYTES(block);
}
void tftp::tftpACK::SetBlock(WORD b)
{
block = REVERSEBYTES(b);
}
WORD tftp::tftpERROR::Code()
{
return REVERSEBYTES(code);
}
void tftp::tftpERROR::SetCode(WORD c)
{
code = REVERSEBYTES(c);
}
CString tftp::errMessage()
{
CString rv;
if(memchr(data.m_ERROR.data,0,length-(tftpHdrSize-tftpSlackSize)-sizeof(data.m_ERROR.code)))
rv = (LPCTSTR)data.m_ERROR.data;
return rv;
}
void CXferSocket::Destroy(BOOL success)
{
if(m_wndResolver){
delete m_wndResolver;
m_wndResolver=NULL;
}
SetTry();
m_Daddy->m_bnw.StartSound(
success
? m_Daddy->m_bnwSuccess
: m_Daddy->m_bnwAbort
);
if(m_File.m_hFile!=CFile::hFileNull){
TRY{
m_File.Close();
}CATCH(CFileException,e){
TRACE0("Error closing file\n");
}END_CATCH
}
ASSERT(m_Daddy);
m_Daddy->KillTimer(m_hSocket);
m_Daddy->m_Xfers.RemoveKey(m_hSocket);
LV_FINDINFO lvf;
memset(&lvf,0,sizeof(lvf));
lvf.flags=LVFI_PARAM;
lvf.lParam=(LPARAM)this;
int i = m_Daddy->m_List.FindItem(&lvf);
if(i>=0)
m_Daddy->m_List.DeleteItem(i);
delete this;
}
void CPumpKINDlg::LogLine(LPCTSTR str)
{
ASSERT(m_LogLength);
while(m_Log.GetCount()>m_LogLength && m_Log.GetCount()!=LB_ERR){
CTime *t = (CTime*)m_Log.GetItemData(0);
if(((DWORD)t)!=LB_ERR){
ASSERT(t);
m_LogTimes.RemoveKey(t);
delete t;
}
m_Log.DeleteString(0);
}
int i = m_Log.AddString(str);
ASSERT(i!=LB_ERR);
CTime *t = new CTime(CTime::GetCurrentTime());
m_Log.SetItemData(i,(DWORD)(m_LogTimes[t]=t));
m_Log.SetCurSel(i);
}
void CPumpKINDlg::LogLine(UINT msgID)
{
CString tmp;
tmp.Format(msgID);
LogLine(tmp);
}
void CXferSocket::TurnSlashes(CString& fn,BOOL bBack)
{
int s = fn.Find(bBack?'/':'\\');
while(s>=0){
fn.SetAt(s,bBack?'\\':'/');
s = fn.Find(bBack?'/':'\\');
}
}
CString CXferSocket::ApplyRoot(LPCTSTR fileName)
{
ASSERT(m_Daddy);
CString fn = fileName;
CString rv = m_Daddy->m_TFTPRoot;
if(rv.IsEmpty())
rv = ".";
if(rv[rv.GetLength()-1]!='\\')
rv+="\\";
while((!fn.IsEmpty()) && fn[0]=='\\')
fn=fn.Mid(1);
rv+=fn;
return rv;
}
void CPumpKINDlg::OnOptions()
{
CPropertySheet cps(IDS_TITLE_OPTIONS,this);
CPropsServer server;
CPropsNetwork network;
CPropsSounds sounds;
server.m_RRQMode=m_RRQMode;
server.m_TFTPRoot=m_TFTPRoot;
server.m_TFTPSubdirs=m_bTFTPSubdirs;
server.m_WRQMode=m_WRQMode;
server.m_PromptTimeOut=m_PromptTimeOut;
network.m_ListenPort=m_ListenPort;
network.m_SpeakPort=m_SpeakPort;
network.m_TimeOut=m_TFTPTimeOut.GetTotalSeconds();
network.m_BlockSize=m_BlockSize;
sounds.m_Request = m_bnwRequest;
sounds.m_Success = m_bnwSuccess;
sounds.m_Abort = m_bnwAbort;
cps.AddPage(&server);
cps.AddPage(&network);
cps.AddPage(&sounds);
if(cps.DoModal()==IDOK){
m_RRQMode=server.m_RRQMode;
m_TFTPRoot=server.m_TFTPRoot;
m_bTFTPSubdirs=server.m_TFTPSubdirs;
m_WRQMode=server.m_WRQMode;
m_PromptTimeOut=server.m_PromptTimeOut;
m_ListenPort=network.m_ListenPort;
m_SpeakPort=network.m_SpeakPort;
m_TFTPTimeOut=CTimeSpan(network.m_TimeOut);
m_BlockSize=network.m_BlockSize;
m_bnwRequest = sounds.m_Request;
m_bnwSuccess = sounds.m_Success;
m_bnwAbort = sounds.m_Abort;
}
}
BOOL CRRQSocket::ConfirmRequest()
{
CConfirmRRQDlg cd(NULL);
cd.m_Daddy=this;
cd.m_File=m_FileName;
cd.m_Host=inet_ntoa(m_Peer.sin_addr);
if(cd.DoModal()==IDOK)
return TRUE;
return FALSE;
}
CWRQSocket::CWRQSocket(CPumpKINDlg* daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN *sin)
: CXferSocket(daddy,fileName,type,sin)
{
state=stateNone;
m_ACK=0;
m_LastSlack=0;
m_bResume=FALSE;
}
BOOL CWRQSocket::Create(LPCTSTR localFile,LPCTSTR hostName)
{
if(!CAsyncSocket::Create(0,SOCK_DGRAM))
return FALSE;
ASSERT(m_Daddy);
ASSERT(m_Peer.sin_addr.s_addr!=INADDR_NONE || hostName);
m_Daddy->m_Xfers[m_hSocket]=this;
UpdateList();
CString lf;
if(!localFile) {
lf = m_FileName;
TurnSlashes(lf,TRUE);
}
CString fn = localFile?ApplyRootGently(localFile):ApplyRoot(lf);
if(!localFile){ // This is an incoming request..
if(CheckBadRelativeness(m_FileName)){
Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS);
return TRUE;
}
BOOL exists;
if(!_access((LPCTSTR)fn,0))
m_Rename=exists=TRUE;
else
m_Rename=exists=FALSE;
// *** m_WRQMode only if server transfer
switch(m_Daddy->m_WRQMode){
case CPumpKINDlg::wrqTakeAll:
if(exists){
if(!RenameFile(fn)){
Deny(tftp::errDiskFull,IDS_TFTP_ERROR_FAILEDTORENAME);
return TRUE;
}
}
break;
case CPumpKINDlg::wrqConfirmIfExists:
if(!exists)
break;
case CPumpKINDlg::wrqAlwaysConfirm:
if(exists)
m_bResume=TRUE;
if(ConfirmRequest()){
if(m_Rename){
RenameFile(fn);
if(SaveAs(fn))
break;
}else
break;
}
case CPumpKINDlg::wrqDenyAll:
Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS);
return TRUE;
}
}
CFileException e;
if(!m_File.Open(
fn,
m_bResume
?(CFile::modeWrite|CFile::shareDenyWrite)
:(CFile::modeCreate|CFile::modeWrite|CFile::shareDenyWrite),
&e
)){
if(localFile){ // Outgoing request
CString tmp;
tmp.Format(IDS_LOG_FAILEDTOOPEN,fn);
m_Daddy->LogLine(tmp);
return FALSE;
}else{
Deny(&e);
return TRUE;
}
}
if(hostName){
m_HostName=hostName;
CString tmp;
tmp.Format(IDS_LOG_REQUESTING,m_FileName,m_HostName);
m_Daddy->LogLine(tmp);
CString inAddr = hostName;
int at = inAddr.Find('@');
if(at>=0)
inAddr=inAddr.Mid(at+1);
if((m_Peer.sin_addr.s_addr=inet_addr((LPCTSTR)inAddr))==INADDR_NONE){
ASSERT(!m_wndResolver);
m_wndResolver = new CResolver(this);
ASSERT(m_wndResolver);
return m_wndResolver->Resolve();
}else{
OnHostKnown();
return TRUE;
}
}
CString v;
tftp::tftpOptions oack;
if(m_Options.Lookup(tftpoTSize,v)){
m_xferSize=atol(v);
if(!m_xferSize){
Deny(tftp::errOption,IDS_TFTP_ERROR_TSIZE);
return TRUE;
}
}
if(m_Options.Lookup(tftpoBSize,v)){
m_blkSize=atoi(v);
if(!m_blkSize){ // *** Do more about sanity check
Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE);
return TRUE;
}
v.Format("%u",m_blkSize);
oack[tftpoBSize]=v;
}
if(m_Options.Lookup(tftpoTOut,v)){
m_timeOut=atoi(v);
if(!m_timeOut){ // *** Do more about sanity check
Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT);
return TRUE;
}
v.Format("%u",m_timeOut);
oack[tftpoTOut]=v;
}
if(m_Options.Lookup(tftpoXResume,v) && m_bResume){
m_ACK=m_File.GetLength()/m_blkSize;
v.Format("%u",m_ACK);
oack[tftpoXResume]=v;
}else
m_ACK=0;
state=stateXfer;
if(oack.GetCount()){
tftp *p = tftp::Allocate(tftp::tftpOACK::tftpSize(&oack));
ASSERT(p);
p->SetOpcode(tftp::opOACK);
p->data.m_OACK.Set(&oack);
PostTFTP(p,TRUE);
}else
DoXfer();
return TRUE;
}
BOOL CWRQSocket::ConfirmRequest()
{
CConfirmWRQDlg cd(NULL);
cd.m_Daddy=this;
cd.m_File=m_FileName;
cd.m_Host=inet_ntoa(m_Peer.sin_addr);
switch(cd.DoModal()){
case IDOK:
m_Rename=FALSE;
m_bResume=FALSE;
return TRUE;
case IDC_RENAME:
m_bResume=FALSE;
m_Rename=TRUE;
return TRUE;
case IDC_RESUME:
m_Rename=FALSE;
m_bResume=TRUE;
return TRUE;
case IDCANCEL:
return FALSE;
}
return FALSE;
}
BOOL CWRQSocket::RenameFile(CString& fn)
{
CString renamed = fn;
if(fn.IsEmpty())
return FALSE;
if(fn[fn.GetLength()-1]==')'){
int op = fn.ReverseFind('(');
if(op>0 && fn[op-1]==' '){
if(fn.Mid(op+1,fn.GetLength()-op-2).SpanExcluding("0123456789").IsEmpty())
renamed = renamed.Left(op-1);
}
}
CString testFN;
for(UINT tmp=0;tmp<32768;tmp++){
testFN.Format("%s (%u)",(LPCTSTR)renamed,tmp);
if(!_access((LPCTSTR)testFN,0))
continue;
fn=testFN;
return TRUE;
}
return FALSE;
}
BOOL CWRQSocket::SaveAs(CString& fn)
{
CFileDialog cfd(FALSE,NULL,fn,OFN_EXPLORER|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_PATHMUSTEXIST,NULL,m_Daddy);
CString title;
title.LoadString(IDS_RENAME_TITLE);
cfd.m_ofn.lpstrTitle=(LPCTSTR)title;
if(cfd.DoModal()!=IDOK)
return FALSE;
fn = cfd.GetPathName();
return TRUE;
}
diff --git a/pumpkin.rc b/pumpkin.rc
index 7f3bbde..1bf0fd3 100644
--- a/pumpkin.rc
+++ b/pumpkin.rc
@@ -114,494 +114,494 @@ BEGIN
WS_VSCROLL | WS_HSCROLL,WS_EX_DLGMODALFRAME
PUSHBUTTON "..",IDCANCEL,0,183,6,7,NOT WS_VISIBLE | NOT WS_TABSTOP
END
IDD_PROPS_SERVER DIALOG DISCARDABLE 0, 0, 210, 154
STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Server"
FONT 8, "MS Sans Serif"
BEGIN
GROUPBOX "TFTP filesystem &root (download path)",IDC_STATIC,7,7,
196,38
EDITTEXT IDC_TFTPROOT,13,16,170,13,ES_AUTOHSCROLL
PUSHBUTTON "&B",IDC_BROWSE,186,16,13,13,BS_ICON
CONTROL "Allow access to &subdirectories",IDC_TFTPSUBDIRS,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,31,111,10
GROUPBOX "Read Request Behavior",IDC_STATIC,7,48,153,42
CONTROL "Give &all files",IDC_RRQ_GIVEALL,"Button",
BS_AUTORADIOBUTTON | BS_NOTIFY | WS_GROUP,13,57,53,10
CONTROL "&Prompt before giving file",IDC_RRQ_ALWAYSCONFIRM,
"Button",BS_AUTORADIOBUTTON | BS_NOTIFY,23,67,91,10
CONTROL "&Deny all requests",IDC_RRQ_DENYALL,"Button",
BS_AUTORADIOBUTTON | BS_NOTIFY,33,77,70,10
GROUPBOX "Write Request Behavior",IDC_STATIC,7,93,172,54,WS_GROUP
CONTROL "Take a&ll files",IDC_WRQ_TAKEALL,"Button",
BS_AUTORADIOBUTTON | WS_GROUP,13,103,55,10
CONTROL "Prompt if file &exists",IDC_WRQ_PROMPTEXISTING,"Button",
BS_AUTORADIOBUTTON,23,113,73,10
CONTROL "Always pro&mpt before accepting file",
IDC_WRQ_ALWAYSCONFIRM,"Button",BS_AUTORADIOBUTTON,33,123,
139,10
CONTROL "D&eny all requests",IDC_WRQ_DENYALL,"Button",
BS_AUTORADIOBUTTON,43,133,70,10
CTEXT "Confirmation &timeout",IDC_STATIC,163,52,40,19,
SS_NOTIFY
CONTROL "Slider1",IDC_PROMPTTIMEOUT,"msctls_trackbar32",
TBS_AUTOTICKS | TBS_VERT | TBS_TOP | WS_TABSTOP,182,73,
21,74
END
IDD_PROPS_NETWORK DIALOG DISCARDABLE 0, 0, 210, 154
STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Network"
FONT 8, "MS Sans Serif"
BEGIN
GROUPBOX "UDP Ports",IDC_STATIC,7,7,196,40
RTEXT "Listen for &incoming requests on port:",IDC_STATIC,13,
18,135,8
EDITTEXT IDC_LISTENPORT,154,16,40,13,ES_AUTOHSCROLL
CONTROL "Spin1",IDC_LISTENSPIN,"msctls_updown32",UDS_WRAP |
UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY |
UDS_ARROWKEYS | UDS_NOTHOUSANDS,183,16,11,13
RTEXT "Send &outging requests to port:",IDC_STATIC,13,31,135,8
EDITTEXT IDC_SPEAKPORT,154,29,40,13,ES_AUTOHSCROLL
CONTROL "Spin1",IDC_SPEAKSPIN,"msctls_updown32",UDS_WRAP |
UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY |
UDS_ARROWKEYS | UDS_NOTHOUSANDS,183,29,11,13
LTEXT "Default connection timeout:",IDC_STATIC,7,52,88,8
EDITTEXT IDC_TIMEOUT,110,50,40,13,ES_AUTOHSCROLL | ES_NUMBER
CONTROL "Spin3",IDC_TIMESPIN,"msctls_updown32",UDS_WRAP |
UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY |
UDS_ARROWKEYS | UDS_NOTHOUSANDS,140,50,11,13
LTEXT "Default block size:",IDC_STATIC,7,66,59,8
LTEXT "seconds",IDC_STATIC,154,52,28,8
LTEXT "bytes",IDC_STATIC,154,66,18,8
EDITTEXT IDC_BLOCKSIZE,110,64,40,13,ES_AUTOHSCROLL | ES_NUMBER
CONTROL "Spin3",IDC_BSIZESPIN,"msctls_updown32",UDS_WRAP |
UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY |
UDS_ARROWKEYS | UDS_NOTHOUSANDS,140,64,11,13
END
IDD_CONFIRM_RRQ DIALOGEX 0, 0, 181, 79
STYLE DS_MODALFRAME | DS_NOIDLEMSG | DS_SETFOREGROUND | DS_3DLOOK | WS_POPUP |
WS_CAPTION
EXSTYLE WS_EX_TOOLWINDOW | WS_EX_CLIENTEDGE
CAPTION " PumpKIN - Confirm Read Request"
FONT 8, "MS Sans Serif", 0, 0, 0x1
BEGIN
DEFPUSHBUTTON "&Grant Access",IDOK,27,58,54,14
PUSHBUTTON "&Deny Access",IDCANCEL,97,58,54,14
LTEXT "The host",IDC_STATIC,77,7,29,8
CTEXT "255.255.255.255",IDC_HOST,57,15,68,14,SS_NOTIFY |
SS_SUNKEN | WS_BORDER,WS_EX_DLGMODALFRAME |
WS_EX_CLIENTEDGE
CTEXT "is requesting the file",IDC_STATIC,23,29,135,8
CTEXT "",IDC_FILE,23,37,135,14,SS_NOTIFY | SS_SUNKEN |
WS_BORDER,WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE
CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,7,54,167,1
ICON IDR_MAINFRAME,IDC_STATIC,7,7,18,20
ICON IDR_MAINFRAME,IDC_STATIC,153,7,18,20
END
IDD_CONFIRM_WRQ DIALOGEX 0, 0, 201, 95
STYLE DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | WS_POPUP | WS_CAPTION
EXSTYLE WS_EX_TOOLWINDOW | WS_EX_CLIENTEDGE
CAPTION " PumpKIN - Confirm Write Request"
FONT 8, "MS Sans Serif", 0, 0, 0x1
BEGIN
DEFPUSHBUTTON "&Accept",IDOK,7,58,59,14
PUSHBUTTON "&Rename",IDC_RENAME,71,58,59,14
PUSHBUTTON "&Deny Access",IDCANCEL,135,58,59,14
LTEXT "The host",IDC_STATIC,87,7,29,8
CTEXT "255.255.255.255",IDC_HOST,67,15,68,14,SS_NOTIFY |
SS_SUNKEN | WS_BORDER,WS_EX_DLGMODALFRAME |
WS_EX_CLIENTEDGE
CTEXT "is attempting to send you a file",IDC_STATIC,33,29,135,
8
CTEXT "",IDC_FILE,33,37,135,14,SS_NOTIFY | SS_SUNKEN |
WS_BORDER,WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE
CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,7,54,187,1
ICON IDR_MAINFRAME,IDC_STATIC,7,7,21,20
ICON IDR_MAINFRAME,IDC_STATIC,173,7,21,20
PUSHBUTTON "Res&ume",IDC_RESUME,71,74,59,14
END
IDD_REQUEST DIALOGEX 0, 0, 191, 161
STYLE DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | WS_POPUP | WS_CAPTION |
WS_SYSMENU
EXSTYLE WS_EX_CLIENTEDGE
CAPTION "Request"
FONT 8, "MS Sans Serif", 0, 0, 0x1
BEGIN
LTEXT "&Local file:",IDC_STATIC,7,7,31,8,SS_NOTIFY
EDITTEXT IDC_LOCALFILE,7,16,157,14,ES_AUTOHSCROLL,
WS_EX_CLIENTEDGE | WS_EX_STATICEDGE
PUSHBUTTON "...",IDC_BROWSE,165,16,19,14,BS_ICON,WS_EX_STATICEDGE
LTEXT "&Remote file:",IDC_STATIC,7,34,38,8,SS_NOTIFY
EDITTEXT IDC_REMOTEFILE,7,44,177,14,ES_AUTOHSCROLL,
WS_EX_CLIENTEDGE | WS_EX_STATICEDGE
LTEXT "Remote &host:",IDC_STATIC,7,61,43,8,SS_NOTIFY
COMBOBOX IDC_TALKS,7,72,157,66,CBS_SIMPLE | CBS_AUTOHSCROLL |
CBS_SORT | CBS_NOINTEGRALHEIGHT | WS_VSCROLL |
WS_TABSTOP,WS_EX_CLIENTEDGE | WS_EX_STATICEDGE
PUSHBUTTON "R\nE\n&F\nR\nE\nS\nH",IDC_REFRESH,165,72,19,66,
BS_CENTER | BS_VCENTER | BS_MULTILINE | BS_NOTIFY,
WS_EX_CLIENTEDGE
LTEXT "&Type:",IDC_STATIC,58,34,19,8
COMBOBOX IDC_TYPE,80,31,43,41,CBS_DROPDOWN | CBS_AUTOHSCROLL |
CBS_LOWERCASE | WS_VSCROLL | WS_TABSTOP
LTEXT "&Block:",IDC_STATIC,127,34,21,8
COMBOBOX IDC_BSIZE,149,31,35,53,CBS_DROPDOWN | WS_VSCROLL |
WS_TABSTOP
DEFPUSHBUTTON "OK",IDOK,35,140,50,14
PUSHBUTTON "Cancel",IDCANCEL,101,140,50,14
CONTROL "",IDC_STATIC,"Static",SS_ETCHEDVERT,52,32,1,11
END
IDD_PROPS_SOUNDS DIALOG DISCARDABLE 0, 0, 210, 154
STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Sounds"
FONT 8, "MS Sans Serif"
BEGIN
LTEXT "&Incoming request:",IDC_STATIC,7,9,57,8
COMBOBOX IDC_RING,70,7,103,100,CBS_DROPDOWN | CBS_AUTOHSCROLL |
CBS_SORT | WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "browse",IDC_RING_BROWSE,175,7,13,13,BS_ICON
PUSHBUTTON "play",IDC_RING_PLAY,190,7,13,13,BS_ICON
LTEXT "xfer &finished:",IDC_STATIC,7,25,57,8
COMBOBOX IDC_FINISHED,70,22,103,100,CBS_DROPDOWN |
CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "browse",IDC_FINISHED_BROWSE,175,22,13,13,BS_ICON
PUSHBUTTON "play",IDC_FINISHED_PLAY,190,22,13,13,BS_ICON
LTEXT "xfer &aborted:",IDC_STATIC,7,40,57,8
COMBOBOX IDC_ABORTED,70,37,103,100,CBS_DROPDOWN | CBS_AUTOHSCROLL |
CBS_SORT | WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "browse",IDC_ABORTED_BROWSE,175,37,13,13,BS_ICON
PUSHBUTTON "play",IDC_ABORTED_PLAY,190,37,13,13,BS_ICON
END
#ifndef _MAC
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 2,5,1,0
PRODUCTVERSION 2,5,1,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "CompanyName", "Klever Group (http://www.klever.net/)\0"
VALUE "FileDescription", "PumpKIN, tftp client/daemon\0"
VALUE "FileVersion", "2, 5, 1, 0\0"
VALUE "InternalName", "PUMPKIN\0"
VALUE "LegalCopyright", "Copyright © 1997-2004 Klever Group (http://www.klever.net)\0"
VALUE "LegalTrademarks", "Klever Group (http://www.klever.net/)\0"
VALUE "OriginalFilename", "PUMPKIN.EXE\0"
VALUE "ProductName", "PumpKIN\0"
VALUE "ProductVersion", "2, 5, 1, 0\0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
#endif // !_MAC
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE
BEGIN
IDD_ABOUTBOX, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 210
TOPMARGIN, 7
BOTTOMMARGIN, 67
END
IDD_PUMPKIN_DIALOG, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 355
TOPMARGIN, 7
BOTTOMMARGIN, 184
HORZGUIDE, 115
END
IDD_PROPS_SERVER, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 203
TOPMARGIN, 7
BOTTOMMARGIN, 147
END
IDD_PROPS_NETWORK, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 203
TOPMARGIN, 7
BOTTOMMARGIN, 147
END
IDD_CONFIRM_RRQ, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 174
TOPMARGIN, 7
BOTTOMMARGIN, 72
END
IDD_CONFIRM_WRQ, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 194
TOPMARGIN, 7
BOTTOMMARGIN, 88
END
IDD_REQUEST, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 184
TOPMARGIN, 7
BOTTOMMARGIN, 154
END
IDD_PROPS_SOUNDS, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 203
TOPMARGIN, 7
BOTTOMMARGIN, 147
END
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Bitmap
//
IDB_BACKGROUND BITMAP DISCARDABLE "shared-data/klever-background.bmp"
/////////////////////////////////////////////////////////////////////////////
//
// WAVE
//
IDR_WAVE_RING WAVE DISCARDABLE "res\\ring.wav"
IDR_WAVE_FINISHED WAVE DISCARDABLE "res\\finished.wav"
IDR_WAVE_ABORTED WAVE DISCARDABLE "res\\failed.wav"
/////////////////////////////////////////////////////////////////////////////
//
// Dialog Info
//
IDD_REQUEST DLGINIT
BEGIN
IDC_TYPE, 0x403, 6, 0
0x636f, 0x6574, 0x0074,
IDC_TYPE, 0x403, 9, 0
0x656e, 0x6174, 0x6373, 0x6969, "\000"
IDC_BSIZE, 0x403, 4, 0
0x3135, 0x0032,
IDC_BSIZE, 0x403, 5, 0
0x3031, 0x3432, "\000"
IDC_BSIZE, 0x403, 5, 0
0x3032, 0x3834, "\000"
IDC_BSIZE, 0x403, 5, 0
0x3034, 0x3639, "\000"
IDC_BSIZE, 0x403, 5, 0
0x3138, 0x3239, "\000"
0
END
/////////////////////////////////////////////////////////////////////////////
//
// Menu
//
IDM_POPUPS MENU DISCARDABLE
BEGIN
POPUP "&Tray"
BEGIN
MENUITEM "&Send File", ID_TRAY_SENDFILE
MENUITEM "F&etch file", ID_TRAY_FETCHFILE
MENUITEM "&Options", ID_TRAY_OPTIONS
MENUITEM "Show &PumpKIN Window", ID_TRAY_SHOWPUMPKINWINDOW
MENUITEM "Open &Files Folder", ID_TRAY_OPENFILESFOLDER
MENUITEM SEPARATOR
MENUITEM "&Help Topics", ID_TRAY_HELP
MENUITEM "&About PumpKIN", ID_TRAY_ABOUTPUMPKIN
MENUITEM SEPARATOR
MENUITEM "E&xit", ID_TRAY_EXIT
END
END
/////////////////////////////////////////////////////////////////////////////
//
// String Table
//
STRINGTABLE DISCARDABLE
BEGIN
IDS_ABOUTBOX "&About PumpKIN..."
IDS_FMT_BYTES "%lu"
IDP_SOCKETS_INIT_FAILED "Windows sockets initialization failed."
IDS_TFTP_ERROR_ACCESS "Access violation"
IDS_TFTP_ERROR_NOTFOUND "File not found"
IDS_TFTP_ERROR_DIRFULL "Directory is full"
IDS_TFTP_ERROR_SHARING "Sharing violation"
IDS_TFTP_ERROR_DISKFULL "Disk full"
IDS_TFTP_ERROR_UNDEFINED "Undefined error"
IDS_LOG_START "PumpKIN started"
IDS_LOG_LISTENRECEIVEERROR "Error listening for incoming connections"
END
STRINGTABLE DISCARDABLE
BEGIN
IDS_LOG_LISTENACCEPTERROR "Error accepting incoming connection"
IDS_LOG_RRQSERVE "'%s' of type '%s' is requested from %s"
IDS_LOG_LISTENOPCODE "Invalid opcode in initial connection request"
IDS_LOG_XFERUDPSEND "UDP packet send failed"
IDS_LOG_XFERRECEIVE "Error on xfer socket"
IDS_LOG_XFERSEND "Error on xfer socket"
IDS_LOG_XFERUDPRECEIVE "UDP packet receive failed"
IDS_LOG_XFERSOURCETID "Packet from unexpected source"
IDS_LOG_SENTTFTPERROR ":%u: %s"
IDS_LOG_GOTTFTPERROR "TFTP:%u: %s"
- IDS_LOG_XFEROPCODE "Invalid opcode during transfer received"
+ IDS_LOG_XFEROPCODE "Invalid opcode (%u) during transfer received"
IDS_LOG_XFERRRQFINISHED "Transfer of '%s' has successfully completed"
IDS_TITLE_OPTIONS "Options"
IDS_LOG_WRQSERVE "Writing of '%s' of type '%s' is requested by %s"
IDS_TFTP_ERROR_FAILEDTORENAME "Too many clones of the file"
IDS_RENAME_TITLE "Save As"
END
STRINGTABLE DISCARDABLE
BEGIN
IDS_LOG_TIMEDOUT "Transmission of '%s' is timed out"
IDS_CONFIRMEXIT_TITLE "Exit"
IDS_CONFIRMEXIT_TEXT "File transmission is currently in progress. Are you sure you want to exit?"
IDS_LOG_XFERWRQFINISHED "Transfer of '%s' has successfully completed"
IDS_LOG_XFERABORTED "Transfer of '%s' was aborted"
IDS_TITLE_PUTREQUEST "Send file"
IDS_TITLE_GETREQUEST "Fetch file"
IDS_WTALKHEADING "Talk with "
IDS_TITLE_BROWSEFILE "Browse"
IDS_LOG_RESOLVEFAILED "Failed to resolve host address for '%s'"
IDS_LOG_FAILEDLOCALFILE "Failed to open local file '%s'"
IDS_LOG_FAILEDTOOPEN "Failed to open '%s'"
IDS_OTALXHEADING "Open Talks: talking to "
IDS_REGISTRYKEY "Klever Group"
IDS_KLEVERNET_URL "http://www.klever.net/"
IDS_LOGTIMEFORMAT "%H:%M:%S %B %d"
END
STRINGTABLE DISCARDABLE
BEGIN
ID_TRAY_HELP "Read the help on PumpKIN"
ID_TRAY_ABOUTPUMPKIN "Learn about PumpKIN and it's creator"
ID_TRAY_EXIT "Close PumpKIN"
ID_TRAY_SENDFILE "Send file over the network to your tete-a-tete"
ID_TRAY_FETCHFILE "Fetch file from remote computer"
ID_TRAY_OPTIONS "Set PumpKIN options"
ID_TRAY_SHOWPUMPKINWINDOW "Show main window"
ID_TRAY_OPENFILESFOLDER "Explore TFTP root folder"
END
STRINGTABLE DISCARDABLE
BEGIN
IDC_CONNECTIONS "Active transfers"
IDC_LOG "PumpKIN Activity Log"
IDC_GET "Fetch file from remote server"
IDC_PUT "Send file over the net"
IDC_ABORT "Abort transfer currently in progress"
IDC_EXIT "Close PumpKIN"
END
STRINGTABLE DISCARDABLE
BEGIN
IDC_OPTIONS "Set PumpKIN options"
IDC_REFRESH "Refresh talks list"
IDC_BROWSE "Browse"
END
STRINGTABLE DISCARDABLE
BEGIN
ID_HELP "Read help on PumpKIN"
END
STRINGTABLE DISCARDABLE
BEGIN
IDS_DROPFILES_TITLE "Drop Files"
IDS_NOMULTIPLEDROP_TEXT "You can't drop more than one file here. Only the first one will be accepted"
IDS_LOG_REQUESTING "Requesting '%s' from '%s'"
IDS_LOG_SENDING "Sending '%s' to '%s'"
IDS_WTALKAT "@"
IDS_OTALXAT " at "
IDS_TFTP_ERROR_TSIZE "Invalid transfer size"
IDS_TFTP_ERROR_BSIZE "Invalid block size"
IDS_TFTP_ERROR_TOUT "Invalid timeout"
IDS_SELECT_TFTPROOT "Select TFTP filesystem root.."
IDS_FILTER_WAV "Sound Files (*.wav)|*.wav||"
IDS_TITLE_WAV "Select sound.."
IDS_BOX_CANTBIND "Failed to create listening socket. The port may be in use by another application."
END
STRINGTABLE DISCARDABLE
BEGIN
AFX_IDS_APP_TITLE "PUMPKIN"
END
#endif // English (U.S.) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
#define _AFX_NO_SPLITTER_RESOURCES
#define _AFX_NO_OLE_RESOURCES
#define _AFX_NO_TRACKER_RESOURCES
#define _AFX_NO_PROPERTY_RESOURCES
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE 9, 1
#pragma code_page(1252)
#endif
#include "res\PumpKIN.rc2" // non-Microsoft Visual C++ edited resources
#include "afxres.rc" // Standard components
#endif
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED