-rw-r--r-- | ACLTargetCombo.cpp | 85 | ||||
-rw-r--r-- | ACLTargetCombo.h | 42 | ||||
-rw-r--r-- | COPYING | 2 | ||||
-rw-r--r-- | PropsACL.cpp | 290 | ||||
-rw-r--r-- | PropsACL.h | 71 | ||||
-rw-r--r-- | PropsServer.cpp | 19 | ||||
-rw-r--r-- | PropsServer.h | 3 | ||||
-rw-r--r-- | PumpKINDlg.cpp | 109 | ||||
-rw-r--r-- | PumpKINDlg.h | 178 | ||||
-rw-r--r-- | Trayer.cpp | 7 | ||||
-rw-r--r-- | Trayer.h | 1 | ||||
-rw-r--r-- | help/pumpkin.cnt | 1 | ||||
-rw-r--r-- | help/pumpkin.rtf | 15 | ||||
-rw-r--r-- | help/pumpkin.xml | 17 | ||||
-rw-r--r-- | install/Install.clw | 35 | ||||
-rw-r--r-- | install/install.cpp | 2 | ||||
-rw-r--r-- | install/install.rc | 10 | ||||
-rw-r--r-- | pumpkin.clw | 78 | ||||
-rw-r--r-- | pumpkin.mak | 362 | ||||
-rw-r--r-- | pumpkin.rc | 169 | ||||
-rw-r--r-- | res/down.ico | bin | 0 -> 766 bytes | |||
-rw-r--r-- | res/remove.ico | bin | 0 -> 766 bytes | |||
-rw-r--r-- | res/up.ico | bin | 0 -> 766 bytes | |||
-rw-r--r-- | resource.h | 29 |
24 files changed, 1394 insertions, 131 deletions
diff --git a/ACLTargetCombo.cpp b/ACLTargetCombo.cpp new file mode 100644 index 0000000..cdbd075 --- a/dev/null +++ b/ACLTargetCombo.cpp @@ -0,0 +1,85 @@ +// ACLTargetCombo.cpp : implementation file
+//
+
+#include "stdafx.h"
+#include "PumpKIN.h"
+#include "PumpKINDlg.h"
+#include "ACLTargetCombo.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+// CACLTargetCombo
+
+CACLTargetCombo::CACLTargetCombo()
+: m_op(-1)
+{
+}
+
+CACLTargetCombo::~CACLTargetCombo()
+{
+}
+
+
+BEGIN_MESSAGE_MAP(CACLTargetCombo, CComboBox)
+ //{{AFX_MSG_MAP(CACLTargetCombo)
+ // NOTE - the ClassWizard will add and remove mapping macros here.
+ //}}AFX_MSG_MAP
+END_MESSAGE_MAP()
+
+/////////////////////////////////////////////////////////////////////////////
+// CACLTargetCombo message handlers
+
+void CACLTargetCombo::SetOp(int op)
+{
+ m_op=op;
+ ResetContent();
+ switch(op) {
+ case tftp::opRRQ:
+ m_tmap.RemoveAll();
+ SetItemData(m_tmap[acl_rule::rrqNone]=AddString("fallback to global"),acl_rule::rrqNone);
+ SetItemData(m_tmap[acl_rule::rrqDeny]=AddString("deny access"),acl_rule::rrqDeny);
+ SetItemData(m_tmap[acl_rule::rrqPrompt]=AddString("prompt"),acl_rule::rrqPrompt);
+ SetItemData(m_tmap[acl_rule::rrqGrant]=AddString("grant access"),CPumpKINDlg::rrqGrant);
+ SetCurSel(0);
+ EnableWindow(TRUE);
+ break;
+ case tftp::opWRQ:
+ m_tmap.RemoveAll();
+ SetItemData(m_tmap[acl_rule::wrqNone]=AddString("fallback to global"),acl_rule::wrqNone);
+ SetItemData(m_tmap[acl_rule::wrqDeny]=AddString("deny access"),acl_rule::wrqDeny);
+ SetItemData(m_tmap[acl_rule::wrqPrompt]=AddString("prompt"),acl_rule::wrqPrompt);
+ SetItemData(m_tmap[acl_rule::wrqPromptIfExists]=AddString("prompt if file exists"),acl_rule::wrqPromptIfExists);
+ SetItemData(m_tmap[acl_rule::wrqGrant]=AddString("grant access"),acl_rule::wrqGrant);
+ SetCurSel(0);
+ EnableWindow(TRUE);
+ break;
+ default:
+ EnableWindow(FALSE);
+ break;
+ }
+}
+
+int CACLTargetCombo::GetTarget()
+{
+ int cs=GetCurSel();
+ if(cs==CB_ERR)
+ return -1;
+ return GetItemData(cs);
+}
+
+void CACLTargetCombo::SetTarget(int t,int op)
+{
+ if(op>=0)
+ SetOp(op);
+ ASSERT(m_op>=0);
+ int i;
+ if(m_tmap.Lookup(t,i))
+ SetCurSel(i);
+ else
+ SetCurSel(0);
+}
diff --git a/ACLTargetCombo.h b/ACLTargetCombo.h new file mode 100644 index 0000000..ef7baef --- a/dev/null +++ b/ACLTargetCombo.h @@ -0,0 +1,42 @@ +// ACLTargetCombo.h : header file
+//
+
+/////////////////////////////////////////////////////////////////////////////
+// CACLTargetCombo window
+
+class CACLTargetCombo : public CComboBox
+{
+// Construction
+public:
+ void SetTarget(int t,int op=-1);
+ int GetTarget();
+ void SetOp(int op);
+ int m_op;
+ CACLTargetCombo();
+
+// Attributes
+public:
+ CMap<int,int,int,int> m_tmap;
+
+// Operations
+public:
+
+// Overrides
+ // ClassWizard generated virtual function overrides
+ //{{AFX_VIRTUAL(CACLTargetCombo)
+ //}}AFX_VIRTUAL
+
+// Implementation
+public:
+ virtual ~CACLTargetCombo();
+
+ // Generated message map functions
+protected:
+ //{{AFX_MSG(CACLTargetCombo)
+ // NOTE - the ClassWizard will add and remove member functions here.
+ //}}AFX_MSG
+
+ DECLARE_MESSAGE_MAP()
+};
+
+/////////////////////////////////////////////////////////////////////////////
@@ -1,19 +1,19 @@ -Copyright (c) 1997-2005 Klever Group (http://www.klever.net/) +Copyright (c) 1997-2006 Klever Group (http://www.klever.net/) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/PropsACL.cpp b/PropsACL.cpp new file mode 100644 index 0000000..6d918ad --- a/dev/null +++ b/PropsACL.cpp @@ -0,0 +1,290 @@ +// PropsACL.cpp : implementation file
+//
+
+#include "stdafx.h"
+#include "PumpKIN.h"
+#include "PumpKINDlg.h"
+#include "ACLTargetCombo.h"
+#include "PropsACL.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+// CPropsACL property page
+
+IMPLEMENT_DYNCREATE(CPropsACL, CPropertyPage)
+
+CPropsACL::CPropsACL() : CPropertyPage(CPropsACL::IDD)
+{
+ //{{AFX_DATA_INIT(CPropsACL)
+ //}}AFX_DATA_INIT
+}
+
+CPropsACL::~CPropsACL()
+{
+}
+
+void CPropsACL::DoDataExchange(CDataExchange* pDX)
+{
+ CPropertyPage::DoDataExchange(pDX);
+ //{{AFX_DATA_MAP(CPropsACL)
+ DDX_Control(pDX, IDC_ACL_REPLACE, m_ReplaceCtl);
+ DDX_Control(pDX, IDC_ACL_NETMASK, m_NetmaskCtl);
+ DDX_Control(pDX, IDC_ACL_XFER, m_XferCtl);
+ DDX_Control(pDX, IDC_ACL_UP, m_UpCtl);
+ DDX_Control(pDX, IDC_ACL_RULE, m_RuleCtl);
+ DDX_Control(pDX, IDC_ACL_REMOVE, m_RemoveCtl);
+ DDX_Control(pDX, IDC_ACL_LIST, m_ListCtl);
+ DDX_Control(pDX, IDC_ACL_DOWN, m_DownCtl);
+ DDX_Control(pDX, IDC_ACL_ADDR, m_AddrCtl);
+ DDX_Control(pDX, IDC_ACL_ADD, m_AddCtl);
+ //}}AFX_DATA_MAP
+}
+
+
+BEGIN_MESSAGE_MAP(CPropsACL, CPropertyPage)
+ //{{AFX_MSG_MAP(CPropsACL)
+ ON_CBN_SELCHANGE(IDC_ACL_XFER, OnSelchangeAclXfer)
+ ON_NOTIFY(LVN_ITEMCHANGED, IDC_ACL_LIST, OnItemchangedAclList)
+ ON_BN_CLICKED(IDC_ACL_ADD, OnAclAdd)
+ ON_BN_CLICKED(IDC_ACL_REPLACE, OnAclReplace)
+ ON_BN_CLICKED(IDC_ACL_REMOVE, OnAclRemove)
+ ON_BN_CLICKED(IDC_ACL_UP, OnAclUp)
+ ON_BN_CLICKED(IDC_ACL_DOWN, OnAclDown)
+ //}}AFX_MSG_MAP
+END_MESSAGE_MAP()
+
+/////////////////////////////////////////////////////////////////////////////
+// CPropsACL message handlers
+
+BOOL CPropsACL::OnInitDialog()
+{
+ CPropertyPage::OnInitDialog();
+
+ m_FocusedRule=-1;
+
+ m_Images.Create(16,16,TRUE,2,1);
+ m_iRRQ = m_Images.Add(AfxGetApp()->LoadIcon(IDI_RRQ));
+ m_iWRQ = m_Images.Add(AfxGetApp()->LoadIcon(IDI_WRQ));
+ ASSERT(m_iRRQ>=0); ASSERT(m_iWRQ>=0);
+ m_ListCtl.SetImageList(&m_Images,LVSIL_NORMAL);
+ m_ListCtl.SetImageList(&m_Images,LVSIL_SMALL);
+ m_ListCtl.SetImageList(&m_Images,LVSIL_STATE);
+
+ CRect lrc; m_ListCtl.GetClientRect(&lrc);
+ long lrcw3 = lrc.Width()/3;
+ m_ListCtl.InsertColumn(0,"IP",LVCFMT_LEFT,lrcw3,subitemIP);
+ m_ListCtl.InsertColumn(1,"netmask",LVCFMT_LEFT,lrcw3,subitemNM);
+ m_ListCtl.InsertColumn(2,"action",LVCFMT_LEFT,lrc.Width()-lrcw3*2,subitemAction);
+
+ m_UpCtl.SetIcon(AfxGetApp()->LoadIcon(IDI_UP));
+ m_DownCtl.SetIcon(AfxGetApp()->LoadIcon(IDI_DOWN));
+ m_RemoveCtl.SetIcon(AfxGetApp()->LoadIcon(IDI_REMOVE));
+
+ m_XferCtl.SetItemData(0,tftp::opRRQ);
+ m_XferCtl.SetItemData(1,tftp::opWRQ);
+
+ m_AddrCtl.SetWindowText("192.168.0.0");
+ m_NetmaskCtl.SetWindowText("255.255.255.0");
+
+ for(int i=0;i<m_rulist.GetSize();++i) {
+ m_ListCtl.InsertItem(i,0);
+ SetListRule(i,m_rulist[i]);
+ }
+
+ UpdateControls();
+
+ return TRUE; // return TRUE unless you set the focus to a control
+ // EXCEPTION: OCX Property Pages should return FALSE
+}
+
+void CPropsACL::OnSelchangeAclXfer() {
+ int cs = m_XferCtl.GetCurSel();
+ if(cs==CB_ERR) {
+ m_RuleCtl.EnableWindow(FALSE);
+ }else{
+ int rq = m_XferCtl.GetItemData(cs);
+ m_RuleCtl.SetOp(rq);
+ }
+}
+
+void CPropsACL::OnItemchangedAclList(NMHDR* pNMHDR, LRESULT* pResult) {
+ NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
+ if(
+ (pNMListView->uChanged&LVIF_STATE)
+ &&
+ (pNMListView->uNewState&LVIS_FOCUSED)!=(pNMListView->uOldState&LVIS_FOCUSED)
+ &&
+ pNMListView->iItem>=0 && pNMListView->iItem<m_ListCtl.GetItemCount()
+ ){
+ if(pNMListView->uNewState&LVIS_FOCUSED)
+ m_FocusedRule=pNMListView->iItem;
+ else if(pNMListView->iItem==m_FocusedRule)
+ m_FocusedRule=-1;
+ UpdateControls();
+ }
+
+ *pResult = 0;
+}
+
+void CPropsACL::UpdateControls() {
+ if(m_FocusedRule>=m_rulist.GetSize())
+ m_FocusedRule=-1;
+ if(m_FocusedRule>=0) {
+ m_UpCtl.EnableWindow(m_FocusedRule>0);
+ m_DownCtl.EnableWindow(m_FocusedRule<(m_ListCtl.GetItemCount()-1));
+ acl_rule r;
+ GetListRule(m_FocusedRule,r);
+ SetRule(r);
+ m_AddCtl.EnableWindow(TRUE);
+ m_ReplaceCtl.EnableWindow(TRUE);
+ }else{
+ OnSelchangeAclXfer();
+ m_AddCtl.EnableWindow(TRUE);
+ m_ReplaceCtl.EnableWindow(FALSE);
+ }
+ m_RemoveCtl.EnableWindow(m_ListCtl.GetSelectedCount()!=0 || m_FocusedRule>=0);
+}
+
+void CPropsACL::OnAclAdd() {
+ acl_rule r;
+ UINT err=GetRule(r);
+ if(err) {
+ AfxMessageBox(err,MB_OK);
+ }else{
+ int i=m_rulist.AppendRule(r);
+ ASSERT(r.op==acl_rule::opRRQ || r.op==acl_rule::opWRQ);
+ m_ListCtl.InsertItem(i,0);
+ SetListRule(i,r);
+ }
+}
+
+void CPropsACL::OnAclReplace() {
+ acl_rule r;
+ UINT err=GetRule(r);
+ if(err) {
+ AfxMessageBox(err,MB_OK);
+ }else{
+ ASSERT(m_FocusedRule>=0);
+ m_rulist[m_FocusedRule]=r;
+ SetListRule(m_FocusedRule,r);
+ }
+}
+
+int CPropsACL::GetOp() {
+ int cs=m_XferCtl.GetCurSel();
+ if(cs==CB_ERR)
+ return -1;
+ else
+ return m_XferCtl.GetItemData(cs);
+}
+
+void CPropsACL::SetOp(int op) {
+ int os=m_XferCtl.GetCount();
+ for(int i=0;i<os;++i) {
+ if(m_XferCtl.GetItemData(i)==op) {
+ m_XferCtl.SetCurSel(i);
+ return;
+ }
+ }
+ m_XferCtl.SetCurSel(-1);
+}
+
+void CPropsACL::SetListRule(int i,acl_rule& r) {
+ m_ListCtl.SetItem(i,subitemIP,LVIF_TEXT|LVIF_IMAGE,r.str_addr(),(r.op==acl_rule::opRRQ)?m_iRRQ:m_iWRQ,0,0,0);
+ m_ListCtl.SetItemText(i,subitemNM,r.str_mask());
+ m_ListCtl.SetItemText(i,subitemAction,r.str_target());
+}
+
+void CPropsACL::SetRule(acl_rule& r) {
+ SetOp(r.op);
+ m_AddrCtl.SetWindowText(r.str_addr());
+ m_NetmaskCtl.SetWindowText(r.str_mask());
+ m_RuleCtl.SetTarget(r.target,r.op);
+}
+
+void CPropsACL::GetListRule(int i,acl_rule& r) {
+ r = m_rulist[i];
+}
+
+UINT CPropsACL::GetRule(acl_rule& r)
+{
+ UINT rv=0;
+ r.op=GetOp();
+ if(r.op!=acl_rule::opRRQ && r.op!=acl_rule::opWRQ)
+ rv=IDS_NO_XFER_OP;
+ else{
+ CString t;
+ m_AddrCtl.GetWindowText(t);
+ if(t.IsEmpty() || ( (r.addr=inet_addr((LPCSTR)t))==INADDR_NONE && t!="255.255.255.255") )
+ rv=IDS_INVALID_IP;
+ else{
+ m_NetmaskCtl.GetWindowText(t);
+ if(t.IsEmpty() || ( (r.mask=inet_addr((LPCSTR)t))==INADDR_NONE && t!="255.255.255.255") )
+ rv=IDS_INVALID_NETMASK;
+ else{
+ r.target=m_RuleCtl.GetTarget();
+ if(!r.IsValid())
+ rv=IDS_INVALID_RULE;
+ }
+ }
+ }
+ return rv;
+}
+
+void CPropsACL::OnAclRemove() {
+ ASSERT(m_FocusedRule>=0);
+ int fr=m_FocusedRule;
+ if(fr<0 || fr>=m_rulist.GetSize()) return;
+ m_rulist.DeleteRule(fr);
+ m_ListCtl.DeleteItem(fr);
+ ASSERT(m_rulist.GetSize()==m_ListCtl.GetItemCount());
+ if(fr>=m_rulist.GetSize()) {
+ if(fr>0) {
+ fr=m_rulist.GetSize()-1;
+ }
+ }else
+ fr=-1;
+ if(fr>0)
+ SetListFocusSelection(fr);
+ m_ListCtl.SetFocus();
+}
+
+void CPropsACL::OnAclUp() {
+ int s=m_FocusedRule;
+ if(s<=0) return;
+ int d=s-1;
+ acl_rule r=m_rulist[s];
+ m_rulist[s]=m_rulist[d];
+ m_rulist[d]=r;
+ SetListRule(d,m_rulist[d]);
+ SetListRule(s,m_rulist[s]);
+ SetListFocusSelection(d);
+ m_ListCtl.SetFocus();
+}
+
+void CPropsACL::OnAclDown() {
+ int s=m_FocusedRule;
+ int d=s+1;
+ if(s<0 || d>=m_rulist.GetSize()) return;
+ acl_rule r=m_rulist[s];
+ m_rulist[s]=m_rulist[d];
+ m_rulist[d]=r;
+ SetListRule(d,m_rulist[d]);
+ SetListRule(s,m_rulist[s]);
+ SetListFocusSelection(d);
+ m_ListCtl.SetFocus();
+}
+
+void CPropsACL::SetListFocusSelection(int i) {
+ int s=m_ListCtl.GetItemCount();
+ for(int t=0;t<s;++t)
+ if(t!=i)
+ m_ListCtl.SetItemState(t,0,LVIS_FOCUSED|LVIS_SELECTED);
+ m_ListCtl.SetItemState(i,LVIS_FOCUSED|LVIS_SELECTED,LVIS_FOCUSED|LVIS_SELECTED);
+}
+
diff --git a/PropsACL.h b/PropsACL.h new file mode 100644 index 0000000..c8773e7 --- a/dev/null +++ b/PropsACL.h @@ -0,0 +1,71 @@ +// PropsACL.h : header file
+//
+
+/////////////////////////////////////////////////////////////////////////////
+// CPropsACL dialog
+
+class CPropsACL : public CPropertyPage
+{
+ DECLARE_DYNCREATE(CPropsACL)
+
+// Construction
+public:
+ void SetListFocusSelection(int i);
+ UINT GetRule(acl_rule& r);
+ void GetListRule(int i,acl_rule& r);
+ void SetOp(int op);
+ void SetRule(acl_rule& r);
+ void SetListRule(int i,acl_rule& r);
+ int m_iWRQ;
+ int m_iRRQ;
+ CImageList m_Images;
+ int GetOp();
+ acl_rules_t m_rulist;
+ int m_FocusedRule;
+ void UpdateControls();
+ enum {
+ subitemIP=0, subitemNM, subitemAction
+ };
+
+ CPropsACL();
+ ~CPropsACL();
+
+// Dialog Data
+ //{{AFX_DATA(CPropsACL)
+ enum { IDD = IDD_PROPS_ACL };
+ CButton m_ReplaceCtl;
+ CEdit m_NetmaskCtl;
+ CComboBox m_XferCtl;
+ CButton m_UpCtl;
+ CACLTargetCombo m_RuleCtl;
+ CButton m_RemoveCtl;
+ CListCtrl m_ListCtl;
+ CButton m_DownCtl;
+ CEdit m_AddrCtl;
+ CButton m_AddCtl;
+ //}}AFX_DATA
+
+
+// Overrides
+ // ClassWizard generate virtual function overrides
+ //{{AFX_VIRTUAL(CPropsACL)
+ protected:
+ virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
+ //}}AFX_VIRTUAL
+
+// Implementation
+protected:
+ // Generated message map functions
+ //{{AFX_MSG(CPropsACL)
+ virtual BOOL OnInitDialog();
+ afx_msg void OnSelchangeAclXfer();
+ afx_msg void OnItemchangedAclList(NMHDR* pNMHDR, LRESULT* pResult);
+ afx_msg void OnAclAdd();
+ afx_msg void OnAclReplace();
+ afx_msg void OnAclRemove();
+ afx_msg void OnAclUp();
+ afx_msg void OnAclDown();
+ //}}AFX_MSG
+ DECLARE_MESSAGE_MAP()
+
+};
diff --git a/PropsServer.cpp b/PropsServer.cpp index 6f1e08c..a3948e0 100644 --- a/PropsServer.cpp +++ b/PropsServer.cpp @@ -1,79 +1,98 @@ // PropsServer.cpp : implementation file
//
#include "stdafx.h"
#include "PumpKIN.h"
#include "PropsServer.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPropsServer property page
IMPLEMENT_DYNCREATE(CPropsServer, CPropertyPage)
CPropsServer::CPropsServer() : CPropertyPage(CPropsServer::IDD)
{
//{{AFX_DATA_INIT(CPropsServer)
m_RRQMode = -1;
m_TFTPRoot = _T("");
m_TFTPSubdirs = FALSE;
m_WRQMode = -1;
+ m_LogFile = _T("");
//}}AFX_DATA_INIT
}
CPropsServer::~CPropsServer()
{
}
void CPropsServer::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPropsServer)
+ DDX_Control(pDX, IDC_LOGFILE_BROWSE, m_LogBrowseCtl);
DDX_Control(pDX, IDC_BROWSE, m_BrowseCtl);
DDX_Control(pDX, IDC_PROMPTTIMEOUT, m_PromptTimeoutCtl);
DDX_Radio(pDX, IDC_RRQ_GIVEALL, m_RRQMode);
DDX_Text(pDX, IDC_TFTPROOT, m_TFTPRoot);
DDX_Check(pDX, IDC_TFTPSUBDIRS, m_TFTPSubdirs);
DDX_Radio(pDX, IDC_WRQ_TAKEALL, m_WRQMode);
+ DDX_Text(pDX, IDC_LOGFILE, m_LogFile);
//}}AFX_DATA_MAP
if(pDX->m_bSaveAndValidate)
m_PromptTimeOut=m_PromptTimeoutCtl.GetPos();
else
m_PromptTimeoutCtl.SetPos(m_PromptTimeOut);
}
BEGIN_MESSAGE_MAP(CPropsServer, CPropertyPage)
//{{AFX_MSG_MAP(CPropsServer)
ON_BN_CLICKED(IDC_BROWSE, OnBrowse)
+ ON_BN_CLICKED(IDC_LOGFILE_BROWSE, OnLogfileBrowse)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPropsServer message handlers
BOOL CPropsServer::OnInitDialog()
{
CPropertyPage::OnInitDialog();
m_PromptTimeoutCtl.SetRange(5,60);
m_BrowseCtl.SetIcon(AfxGetApp()->LoadIcon(IDI_BROWSE));
+ m_LogBrowseCtl.SetIcon(AfxGetApp()->LoadIcon(IDI_BROWSE));
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CPropsServer::OnBrowse()
{
CString nr = m_TFTPRoot;
if(Klever::BrowseForFolder(nr,IDS_SELECT_TFTPROOT,this)){
UpdateData(TRUE);
m_TFTPRoot=nr;
UpdateData(FALSE);
}
}
+
+void CPropsServer::OnLogfileBrowse()
+{
+ UpdateData(TRUE);
+ CFileDialog cfd(
+ FALSE, ".log", (LPCSTR)m_LogFile,
+ OFN_EXPLORER|OFN_HIDEREADONLY|OFN_LONGNAMES|OFN_NOCHANGEDIR|OFN_OVERWRITEPROMPT|OFN_PATHMUSTEXIST,
+ "Log files (*.log)|*.log|All Files (*.*)|*.*||",
+ this);
+ if(cfd.DoModal()==IDOK) {
+ m_LogFile = cfd.GetPathName();
+ UpdateData(FALSE);
+ }
+}
diff --git a/PropsServer.h b/PropsServer.h index 29d85bd..1563479 100644 --- a/PropsServer.h +++ b/PropsServer.h @@ -1,45 +1,48 @@ // PropsServer.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CPropsServer dialog
class CPropsServer : public CPropertyPage
{
DECLARE_DYNCREATE(CPropsServer)
// Construction
public:
UINT m_PromptTimeOut;
CPropsServer();
~CPropsServer();
// Dialog Data
//{{AFX_DATA(CPropsServer)
enum { IDD = IDD_PROPS_SERVER };
+ CButton m_LogBrowseCtl;
CButton m_BrowseCtl;
CSliderCtrl m_PromptTimeoutCtl;
int m_RRQMode;
CString m_TFTPRoot;
BOOL m_TFTPSubdirs;
int m_WRQMode;
+ CString m_LogFile;
//}}AFX_DATA
// Overrides
// ClassWizard generate virtual function overrides
//{{AFX_VIRTUAL(CPropsServer)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CPropsServer)
virtual BOOL OnInitDialog();
afx_msg void OnBrowse();
+ afx_msg void OnLogfileBrowse();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
diff --git a/PumpKINDlg.cpp b/PumpKINDlg.cpp index b6b8a36..4cb1633 100644 --- a/PumpKINDlg.cpp +++ b/PumpKINDlg.cpp @@ -1,267 +1,287 @@ // PumpKINDlg.cpp : implementation file
//
#include "stdafx.h"
#include "PumpKIN.h"
#include "PumpKINDlg.h"
+#include "ACLTargetCombo.h"
#include "PropsServer.h"
#include "PropsNetwork.h"
#include "PropsSounds.h"
+#include "PropsACL.h"
#include "ConfirmRRQDlg.h"
#include "ConfirmWRQDlg.h"
#include "RequestDlg.h"
#include "Resolver.h"
#include "Retrier.h"
#include "Trayer.h"
#include <io.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNAMIC(CXferSocket, CAsyncSocket)
IMPLEMENT_DYNAMIC(CWRQSocket, CXferSocket)
IMPLEMENT_DYNAMIC(CRRQSocket, CXferSocket)
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
afx_msg void OnKlevernet();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
ON_BN_CLICKED(IDC_KLEVERNET, OnKlevernet)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPumpKINDlg dialog
CPumpKINDlg::CPumpKINDlg(CWnd* pParent /*=NULL*/)
: CDialog(CPumpKINDlg::IDD, pParent)
{
+ m_Listener.m_Daddy = this;
+
+ m_bListen = TRUE;
+
m_ListenPort = 69;
m_bTFTPSubdirs = TRUE;
m_RRQMode = rrqAlwaysConfirm;
m_WRQMode = wrqAlwaysConfirm;
m_TFTPTimeOut = CTimeSpan(0,0,0,30);
m_RetryTimeOut = CTimeSpan(0,0,0,10);
m_LogLength = 100;
m_SpeakPort = 69;
m_PromptTimeOut=30;
m_bShown=TRUE;
m_bExiting=FALSE;
m_BlockSize=1024;
m_bnw.AssignSound("(bang)",IDR_WAVE_RING,CBellsNWhistles::CBang::bangResource);
m_bnw.AssignSound("(done)",IDR_WAVE_FINISHED,CBellsNWhistles::CBang::bangResource);
m_bnw.AssignSound("(oops)",IDR_WAVE_ABORTED,CBellsNWhistles::CBang::bangResource);
m_bnw.AssignSound("(none)",(int)0,CBellsNWhistles::CBang::bangNone);
m_bnwRequest="(bang)"; m_bnwSuccess="(done)";
m_bnwAbort="(oops)";
//{{AFX_DATA_INIT(CPumpKINDlg)
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_bmpBack.LoadBitmap(IDB_BACKGROUND);
m_bmpBack.GetBitmap(&m_bitmapBack);
m_Retrier = new CRetrier(this);
ASSERT(m_Retrier);
m_Trayer = new CTrayer(this);
ASSERT(m_Trayer);
+ /* Ensure we're backwards compatible */
+ ASSERT(CPumpKINDlg::rrqGiveAll==0);
+ ASSERT(CPumpKINDlg::rrqAlwaysConfirm==1);
+ ASSERT(CPumpKINDlg::rrqDenyAll==2);
+ ASSERT(CPumpKINDlg::wrqTakeAll==0);
+ ASSERT(CPumpKINDlg::wrqConfirmIfExists==1);
+ ASSERT(CPumpKINDlg::wrqAlwaysConfirm==2);
+ ASSERT(CPumpKINDlg::wrqDenyAll==3);
+ /* -- */
LoadSettings();
}
void CPumpKINDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPumpKINDlg)
+ DDX_Control(pDX, IDC_LISTENING, m_ListenCtl);
DDX_Control(pDX, IDC_ABORT, m_AbortCtl);
DDX_Control(pDX, IDC_OPTIONS, m_OptionsCtl);
DDX_Control(pDX, IDC_LOG, m_Log);
DDX_Control(pDX, IDC_CONNECTIONS, m_List);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPumpKINDlg, CDialog)
//{{AFX_MSG_MAP(CPumpKINDlg)
ON_WM_SYSCOMMAND()
ON_WM_DESTROY()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_CREATE()
ON_BN_CLICKED(IDC_OPTIONS, OnOptions)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_EXIT, OnExit)
ON_BN_CLICKED(IDC_PUT, OnPut)
ON_BN_CLICKED(IDC_GET, OnGet)
ON_NOTIFY(LVN_DELETEALLITEMS, IDC_CONNECTIONS, OnDeleteallitemsConnections)
ON_NOTIFY(LVN_DELETEITEM, IDC_CONNECTIONS, OnDeleteitemConnections)
ON_NOTIFY(LVN_INSERTITEM, IDC_CONNECTIONS, OnInsertitemConnections)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_CONNECTIONS, OnItemchangedConnections)
ON_BN_CLICKED(IDC_ABORT, OnAbort)
ON_WM_CLOSE()
ON_COMMAND(ID_TRAY_SHOWPUMPKINWINDOW, OnTrayShowpumpkinwindow)
ON_COMMAND(ID_TRAY_EXIT, OnTrayExit)
ON_COMMAND(ID_TRAY_ABOUTPUMPKIN, OnTrayAboutpumpkin)
ON_COMMAND(ID_TRAY_FETCHFILE, OnTrayFetchfile)
ON_COMMAND(ID_TRAY_HELP, OnTrayHelp)
ON_COMMAND(ID_TRAY_OPTIONS, OnTrayOptions)
ON_COMMAND(ID_TRAY_SENDFILE, OnTraySendfile)
ON_WM_WINDOWPOSCHANGING()
ON_LBN_SELCHANGE(IDC_LOG, OnSelchangeLog)
ON_COMMAND(ID_TRAY_OPENFILESFOLDER, OnTrayOpenfilesfolder)
ON_WM_DROPFILES()
ON_BN_CLICKED(ID_HELP, OnHelp)
+ ON_BN_CLICKED(IDC_LISTENING, OnListening)
+ ON_COMMAND(ID_TRAY_LISTEN, OnTrayListen)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPumpKINDlg message handlers
BOOL CPumpKINDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
VERIFY(m_Retrier->Create(NULL,"PumpKIN-Retrier",WS_CHILD,CRect(0,0,0,0),this,0));
m_Images.Create(16,16,TRUE,2,1);
m_iRRQ = m_Images.Add(AfxGetApp()->LoadIcon(IDI_RRQ));
m_iWRQ = m_Images.Add(AfxGetApp()->LoadIcon(IDI_WRQ));
ASSERT(m_iRRQ>=0);
ASSERT(m_iWRQ>=0);
m_List.SetImageList(&m_Images,LVSIL_NORMAL);
m_List.SetImageList(&m_Images,LVSIL_SMALL);
m_List.SetImageList(&m_Images,LVSIL_STATE);
m_List.SetTextColor(RGB(255,255,0)); // Yellow
m_List.SetTextBkColor(RGB(12,167,0)); // Green
m_List.SetBkColor(RGB(12,167,0)); // Green
CRect listrc;
m_List.GetClientRect(&listrc);
m_List.InsertColumn(0,"File",LVCFMT_LEFT,listrc.Width()-((listrc.Width()/7)*3+listrc.Width()*2/7),subitemFile);
m_List.InsertColumn(1,"type",LVCFMT_CENTER,listrc.Width()/7,subitemType);
m_List.InsertColumn(2,"peer",LVCFMT_LEFT,listrc.Width()*2/7,subitemPeer);
m_List.InsertColumn(3,"ACK",LVCFMT_RIGHT,listrc.Width()/7,subitemBytes);
m_List.InsertColumn(4,"tsize",LVCFMT_RIGHT,listrc.Width()/7,subitemTSize);
LogLine(IDS_LOG_START);
SetupButtons();
CRect rc, drc;
GetWindowRect(rc);
GetDesktopWindow()->GetWindowRect(drc);
SetWindowPos(NULL,drc.right-6-rc.Width(),6,0,0,SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER);
if(m_bShown)
ShowWindow(SW_SHOW);
else
ShowWindow(SW_HIDE);
+ m_ListenCtl.SetCheck(m_Listener.m_bListen?1:0);
+
// CG: The following block was added by the ToolTips component.
{
// Create the ToolTip control.
m_tooltip.Create(this);
m_tooltip.Activate(TRUE);
m_tooltip.AddTool(&m_List,IDC_CONNECTIONS);
m_tooltip.AddTool(GetDlgItem(IDC_PUT),IDC_PUT);
m_tooltip.AddTool(GetDlgItem(IDC_GET),IDC_GET);
m_tooltip.AddTool(&m_AbortCtl,IDC_ABORT);
m_tooltip.AddTool(GetDlgItem(IDC_OPTIONS),IDC_OPTIONS);
m_tooltip.AddTool(GetDlgItem(IDC_EXIT),IDC_EXIT);
m_tooltip.AddTool(GetDlgItem(ID_HELP),ID_HELP);
m_tooltip.AddTool(GetDlgItem(IDC_LOG),IDC_LOG);
}
return TRUE; // return TRUE unless you set the focus to a control
}
void CPumpKINDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
void CPumpKINDlg::OnDestroy()
{
SaveSettings();
NOTIFYICONDATA nid;
memset(&nid,0,sizeof(nid));
nid.cbSize=sizeof(nid);
nid.hWnd=m_Trayer->m_hWnd;
nid.uID=IDC_TRAYICON;
nid.uFlags=0;
VERIFY(Shell_NotifyIcon(NIM_DELETE,&nid));
WinHelp(0L, HELP_QUIT);
CDialog::OnDestroy();
POSITION p = m_LogTimes.GetStartPosition();
while(p){
CTime *t,*tt;
@@ -279,101 +299,100 @@ POSITION p = m_LogTimes.GetStartPosition(); void CPumpKINDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CPaintDC pDC(this);
CDC bmpDC;
bmpDC.CreateCompatibleDC(&pDC);
bmpDC.SelectObject(&m_bmpBack);
CRect rc;
GetClientRect(&rc);
for(int x=-m_bitmapBack.bmWidth*2/4;x<rc.Width();x+=m_bitmapBack.bmWidth)
for(int y=-m_bitmapBack.bmHeight*2/4;y<rc.Height();y+=m_bitmapBack.bmHeight)
pDC.BitBlt(x,y,m_bitmapBack.bmWidth,m_bitmapBack.bmHeight,&bmpDC,0,0,SRCCOPY);
bmpDC.DeleteDC();
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CPumpKINDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
int CPumpKINDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
- m_Listener.m_Daddy=this;
- if(!m_Listener.Create(m_ListenPort,SOCK_DGRAM)){
+ if(!m_Listener.SetListen(m_bListen)) {
+ m_bListen=FALSE;
TRACE0("Failed to create socket\n");
AfxMessageBox(IDS_BOX_CANTBIND,MB_OK|MB_ICONEXCLAMATION);
- return -1;
}
if(!m_Trayer->Create(NULL,"PumpKIN TrayIcon",WS_CHILD,CRect(0,0,0,0),this,0)){
TRACE0("Failed to create trayer\n");
return -1;
}
NOTIFYICONDATA nid;
memset(&nid,0,sizeof(nid));
nid.cbSize=sizeof(nid);
nid.hWnd=m_Trayer->m_hWnd;
nid.uID=IDC_TRAYICON;
nid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
nid.uCallbackMessage=WM_TRAYICON;
nid.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
// *** Load from resource
strcpy(nid.szTip,"PumpKIN");
VERIFY(Shell_NotifyIcon(NIM_ADD,&nid));
return 0;
}
void CListenSocket::OnReceive(int nErrorCode)
{
ASSERT(m_Daddy);
if(nErrorCode){
m_Daddy->LogLine(IDS_LOG_LISTENRECEIVEERROR);
return;
}
DWORD fionread = 0;
VERIFY(IOCtl(FIONREAD,&fionread)); // *** Do some checking on the value acquired
tftp *tftpRQ = tftp::Allocate(fionread);
ASSERT(tftpRQ);
SOCKADDR_IN sin;
if(!tftpRQ->Receive(this,fionread,&sin)){
m_Daddy->LogLine(IDS_LOG_LISTENACCEPTERROR);
delete tftpRQ;
return;
}
#ifndef NDEBUG
CString tmp;
tmp.Format("%u - %s - %u\n",tftpRQ->Opcode(),inet_ntoa(sin.sin_addr),sin.sin_port);
TRACE0(tmp);
#endif
POSITION p = m_Daddy->m_Xfers.GetStartPosition();
while(p){
SOCKET key;
CXferSocket *sock;
@@ -619,107 +638,112 @@ CString 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(!localFile){ // Check only for incoming requests
if(CheckBadRelativeness(m_FileName)){
Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS);
return TRUE;
}
- switch(m_Daddy->m_RRQMode){
+ int atar=m_Daddy->m_aclRules.FindTarget(acl_rule::opRRQ,m_Peer.sin_addr.s_addr);
+ if(atar<0)
+ atar = m_Daddy->m_RRQMode;
+ switch(atar){
case CPumpKINDlg::rrqGiveAll:
break;
case CPumpKINDlg::rrqAlwaysConfirm:
if(ConfirmRequest())
break;
+ default:
+ TRACE1("Unexpected access target: %d\n",atar);
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;
}
}
@@ -1062,257 +1086,271 @@ 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)
+void CPumpKINDlg::LogLineToScreen(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;
+CPropsACL acl;
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;
+ server.m_LogFile=m_LogFile;
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;
+ acl.m_rulist = m_aclRules;
+
cps.AddPage(&server);
cps.AddPage(&network);
cps.AddPage(&sounds);
+ cps.AddPage(&acl);
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_LogFile=server.m_LogFile;
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;
+
+ m_aclRules = acl.m_rulist;
+
+ m_lastlogerr.Empty();
}
}
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){
+ int atar=m_Daddy->m_aclRules.FindTarget(acl_rule::opWRQ,m_Peer.sin_addr.s_addr);
+ if(atar<0)
+ atar=m_Daddy->m_WRQMode;
+ switch(atar){
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;
}
+ default:
+ TRACE1("Unexpected access target: %d\n",atar);
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);
@@ -1750,138 +1788,144 @@ void CPumpKINDlg::OnClose() void CPumpKINDlg::OnTrayShowpumpkinwindow()
{
if(IsWindowVisible()){
m_bShown=FALSE;
ShowWindow(SW_HIDE);
}else{
m_bShown=TRUE;
ShowWindow(SW_SHOW);
SetForegroundWindow();
SetFocus();
}
}
void CPumpKINDlg::OnTrayExit()
{
OnExit();
}
void CPumpKINDlg::OnTrayAboutpumpkin()
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
void CPumpKINDlg::OnTrayFetchfile()
{
OnGet();
}
void CPumpKINDlg::OnTrayHelp()
{
OnHelp();
}
void CPumpKINDlg::OnTrayOptions()
{
OnOptions();
}
void CPumpKINDlg::OnTraySendfile()
{
OnPut();
}
void CPumpKINDlg::LoadSettings()
{
CWinApp *app = AfxGetApp();
ASSERT(app);
+ m_bListen=app->GetProfileInt("TFTPSettings","Listen",m_bListen);
m_bnwRequest=app->GetProfileString("BellsNWhistles","Request",m_bnwRequest);
m_bnwSuccess=app->GetProfileString("BellsNWhistles","Success",m_bnwSuccess);
m_bnwAbort=app->GetProfileString("BellsNWhistles","Abort",m_bnwAbort);
m_bTFTPSubdirs=app->GetProfileInt("TFTPSettings","Subdirs",m_bTFTPSubdirs);
m_ListenPort=app->GetProfileInt("TFTPSettings","ListenPort",m_ListenPort);
m_LogLength=app->GetProfileInt("UISettings","LogLength",m_LogLength);
m_PromptTimeOut=app->GetProfileInt("UISettings","PromptTimeout",m_PromptTimeOut);
m_RRQMode=app->GetProfileInt("TFTPSettings","RRQMode",m_RRQMode);
m_SpeakPort=app->GetProfileInt("TFTPSettings","SpeakPort",m_SpeakPort);
m_TFTPRoot=app->GetProfileString("TFTPSettings","TFTPRoot",m_TFTPRoot);
+ m_LogFile=app->GetProfileString("General","LogFile",m_LogFile);
m_TFTPTimeOut=CTimeSpan(app->GetProfileInt("TFTPSettings","TFTPTimeout",m_TFTPTimeOut.GetTotalSeconds()));
m_BlockSize=app->GetProfileInt("TFTPSettings","TFTPBlockSize",m_BlockSize);
m_RetryTimeOut=CTimeSpan(app->GetProfileInt("TFTPSettings","RetryTimeout",m_RetryTimeOut.GetTotalSeconds()));
m_WRQMode=app->GetProfileInt("TFTPSettings","WRQMode",m_WRQMode);
m_bShown=app->GetProfileInt("UISettings","Visble",m_bShown);
if(m_TFTPRoot.IsEmpty()){
DWORD dL = ::GetCurrentDirectory(0,NULL);
VERIFY(::GetCurrentDirectory(dL,m_TFTPRoot.GetBuffer(dL)));
m_TFTPRoot.ReleaseBuffer();
}
::SetCurrentDirectory(m_TFTPRoot);
+ m_aclRules.LoadProfile(app);
}
void CPumpKINDlg::SaveSettings()
{
CWinApp *app = AfxGetApp();
ASSERT(app);
+ app->WriteProfileInt("TFTPSettings","Listen",m_bListen);
app->WriteProfileString("BellsNWhistles","Request",m_bnwRequest);
app->WriteProfileString("BellsNWhistles","Success",m_bnwSuccess);
app->WriteProfileString("BellsNWhistles","Abort",m_bnwAbort);
app->WriteProfileInt("TFTPSettings","Subdirs",m_bTFTPSubdirs);
app->WriteProfileInt("TFTPSettings","ListenPort",m_ListenPort);
app->WriteProfileInt("UISettings","LogLength",m_LogLength);
app->WriteProfileInt("UISettings","PromptTimeout",m_PromptTimeOut);
app->WriteProfileInt("TFTPSettings","RRQMode",m_RRQMode);
app->WriteProfileInt("TFTPSettings","SpeakPort",m_SpeakPort);
app->WriteProfileString("TFTPSettings","TFTPRoot",m_TFTPRoot);
+ app->WriteProfileString("General","LogFile",m_LogFile);
app->WriteProfileInt("TFTPSettings","TFTPTimeout",m_TFTPTimeOut.GetTotalSeconds());
app->WriteProfileInt("TFTPSettings","TFTPBlockSize",m_BlockSize);
app->WriteProfileInt("TFTPSettings","RetryTimeout",m_RetryTimeOut.GetTotalSeconds());
app->WriteProfileInt("TFTPSettings","WRQMode",m_WRQMode);
app->WriteProfileInt("UISettings","Visble",m_bShown);
+ m_aclRules.SaveProfile(app);
}
void CPumpKINDlg::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
{
CDialog::OnWindowPosChanging(lpwndpos);
if(!m_bExiting){
if(m_bShown){
lpwndpos->flags&=~SWP_HIDEWINDOW;
lpwndpos->flags|=SWP_SHOWWINDOW;
}else{
lpwndpos->flags&=~SWP_SHOWWINDOW;
lpwndpos->flags|=SWP_HIDEWINDOW;
if(::GetForegroundWindow()==m_hWnd && (m_Trayer && !m_Trayer->m_inMenu))
GetDesktopWindow()->SetForegroundWindow();
}
}
}
CString CXferSocket::ApplyRootGently(LPCTSTR fn)
{
CString f = fn;
CString rv = f;
if((!f.IsEmpty()) && f[0]!='\\' && f.Find(":")<0 && f.Find("\\")<0)
rv = ApplyRoot(f);
return rv;
}
BOOL CXferSocket::CheckBadRelativeness(LPCTSTR file)
{
CString tmp = file;
if(tmp.IsEmpty())
return FALSE;
if(tmp.Find("..")>=0)
return TRUE;
if(tmp.Find(":")>=0)
return TRUE;
if((!m_Daddy->m_bTFTPSubdirs) && m_FileName.Find('\\')>=0)
return TRUE;
return FALSE;
}
void CAboutDlg::OnKlevernet()
{
CString url;
url.LoadString(IDS_KLEVERNET_URL);
ShellExecute(::GetDesktopWindow(),"open",url,NULL,NULL,SW_SHOWMAXIMIZED);
}
@@ -1939,48 +1983,97 @@ UINT files = ::DragQueryFile(hDropInfo,0xFFFFFFFF,NULL,0); }
::DragFinish(hDropInfo);
}
void CPumpKINDlg::OnCancel()
{
OnClose();
}
CPumpKINDlg::~CPumpKINDlg()
{
delete m_Trayer;
delete m_Retrier;
}
void CXferSocket::OnRetry()
{
if(!m_Retry){
TRACE("Retrying unretriable..\n");
return;
}
TRACE0("Retrying..\n");
m_bRetry=TRUE;
PostTFTP(tftp::Copy(m_Retry));
m_bRetry=FALSE;
}
tftp* tftp::Copy(tftp *src)
{
ASSERT(src);
ASSERT(src->length);
tftp* rv = Allocate(src->length);
ASSERT(rv);
memmove(rv,src,tftpSlackSize+src->length);
return rv;
}
void CXferSocket::SetTry(tftp *p)
{
if(m_Retry)
delete m_Retry;
m_Retry=p?tftp::Copy(p):NULL;
}
void CPumpKINDlg::OnHelp()
{
AfxGetApp()->WinHelp(0,HELP_FINDER);
}
+
+BOOL CListenSocket::SetListen(BOOL b) {
+ ASSERT(m_Daddy);
+ if(b==m_bListen)
+ return TRUE;
+ if(b) {
+ if(!Create(m_Daddy->m_ListenPort,SOCK_DGRAM))
+ return FALSE;
+ return m_bListen=TRUE;
+ }else{
+ Close(); m_bListen=FALSE;
+ return TRUE;
+ }
+}
+
+void CPumpKINDlg::OnListening()
+{
+ if(!m_Listener.SetListen(m_ListenCtl.GetCheck()==1)) {
+ TRACE0("Failed to create socket\n");
+ AfxMessageBox(IDS_BOX_CANTBIND,MB_OK|MB_ICONEXCLAMATION);
+ }
+ m_ListenCtl.SetCheck(m_Listener.m_bListen?1:0);
+ m_bListen=m_Listener.m_bListen;
+}
+
+void CPumpKINDlg::OnTrayListen()
+{
+ if(!m_Listener.SetListen(!m_Listener.m_bListen)) {
+ TRACE0("Failed to create socket\n");
+ AfxMessageBox(IDS_BOX_CANTBIND,MB_OK|MB_ICONEXCLAMATION);
+ }
+ m_ListenCtl.SetCheck(m_Listener.m_bListen?1:0);
+ m_bListen=m_Listener.m_bListen;
+}
+
+void CPumpKINDlg::LogLine(LPCTSTR str)
+{
+ LogLineToScreen(str);
+ if(!m_LogFile.IsEmpty()) {
+ if(!Klever::LogRecord((LPCTSTR)m_LogFile,str)) {
+ if(m_lastlogerr!=m_LogFile) {
+ CString tmp;
+ tmp.Format(IDS_LOG_LOGERROR,m_LogFile);
+ LogLineToScreen(tmp);
+ m_lastlogerr=m_LogFile;
+ }
+ }
+ }
+}
diff --git a/PumpKINDlg.h b/PumpKINDlg.h index 42ae62d..b247c56 100644 --- a/PumpKINDlg.h +++ b/PumpKINDlg.h @@ -68,101 +68,248 @@ public: static UINT tftpSize();
void SetBlock(WORD b);
WORD Block();
};
struct tftpERROR {
typedef WORD tftpErrorCode;
tftpErrorCode code;
BYTE data[1];
public:
void SetCode(WORD c);
WORD Code();
static UINT tftpSize(LPCTSTR msg);
};
struct tftpOACK {
BYTE data[1];
public:
void Set(tftpOptions* ops);
static UINT tftpSize(tftpOptions* ops);
};
union tftpPacket {
tftpUNKNOWN m_UNKNOWN;
tftpRQ m_RQ;
tftpRRQ m_RRQ;
tftpWRQ m_WRQ;
tftpDATA m_DATA;
tftpACK m_ACK;
tftpERROR m_ERROR;
tftpOACK m_OACK;
} data;
void *udpBase(void) { return &opcode; }
public:
static tftp* Copy(tftp *src);
CString errMessage();
void SetOpcode(WORD op);
void errSet(UINT code,LPCTSTR msg);
static tftp* Allocate(UINT tftpSize=0);
BOOL Send(CAsyncSocket *socket,SOCKADDR_IN* saddr);
CString rqType();
CString rqFileName();
UINT GetOptions(tftpOptions* ops);
tftp();
UINT Opcode();
BOOL Receive(CAsyncSocket* socket,UINT maxLength,SOCKADDR_IN *sin=NULL);
};
#define tftpHdrSize (sizeof(tftp)-sizeof(tftp::tftpPacket))
#define tftpSlackSize sizeof(tftp::tftpLength)
+struct acl_rule {
+ enum {
+ opRRQ=tftp::opRRQ, opWRQ=tftp::opWRQ
+ };
+ int op;
+ DWORD addr, mask;
+ enum {
+ rrqGrant=0, rrqPrompt, rrqDeny,
+ rrqRules,
+ rrqNone=-1
+ };
+ enum {
+ wrqGrant=0, wrqPromptIfExists, wrqPrompt, wrqDeny,
+ wrqRules,
+ wrqNone=-1
+ };
+ int target;
+
+ acl_rule()
+ : op(-1), addr(0), mask(0), target(-1) { }
+ acl_rule(int o,DWORD a,DWORD m,int t)
+ : op(o), addr(a), mask(m), target(t) { }
+ acl_rule(const acl_rule& s)
+ : op(s.op), addr(s.addr), mask(s.mask), target(s.target) { }
+
+ BOOL IsValid() {
+ if(op==opRRQ) {
+ if(target<rrqNone || target>=rrqRules)
+ return FALSE;
+ }else if(op==opWRQ) {
+ if(target<wrqNone || target>=wrqRules)
+ return FALSE;
+ }else
+ return FALSE;
+ return TRUE;
+ }
+
+ BOOL IsMatch(int o,DWORD a) {
+ if(o!=op) return FALSE;
+ if( (a&mask) != (addr&mask)) return FALSE;
+ return TRUE;
+ }
+
+ CString str_addr() {
+ return inet_ntoa(*(struct in_addr*)&addr);
+ }
+ CString str_mask() {
+ return inet_ntoa(*(struct in_addr*)&mask);
+ }
+ CString str_target() {
+ if(op==opRRQ) {
+ switch(target) {
+ case rrqNone: return "fallback";
+ case rrqGrant: return "grant";
+ case rrqPrompt: return "prompt";
+ case rrqDeny: return "deny";
+ default: return "?";
+ }
+ }else if(op==opWRQ) {
+ switch(target) {
+ case wrqNone: return "fallback";
+ case wrqGrant: return "grant";
+ case wrqPromptIfExists: return "prompt if exists";
+ case wrqPrompt: return "prompt";
+ case wrqDeny: return "deny";
+ default: return "?";
+ }
+ }else
+ return "?";
+ }
+
+ void SaveProfile(CWinApp* app,int i) {
+ CString n; n.Format("%d",i);
+ app->WriteProfileInt("ACL","op_"+n,op);
+ app->WriteProfileString("ACL","addr_"+n,str_addr());
+ app->WriteProfileString("ACL","mask_"+n,str_mask());
+ app->WriteProfileInt("ACL","target_"+n,target);
+ }
+
+ void LoadProfile(CWinApp* app,int i) {
+ CString n; n.Format("%d",i);
+ op=app->GetProfileInt("ACL","op_"+n,-1);
+ addr=inet_addr(app->GetProfileString("ACL","addr_"+n));
+ mask=inet_addr(app->GetProfileString("ACL","mask_"+n));
+ target=app->GetProfileInt("ACL","target_"+n,-1);
+ }
+
+};
+
+class acl_rules_t : public CArray<acl_rule,acl_rule&> {
+public:
+
+ acl_rules_t& operator=(const acl_rules_t& s) {
+ // Copy(s); XXX: unsuprisingly, there's a bug in MFC Copy, *pDst++=*pSrc (no ++ for Src)
+ RemoveAll();
+ int ns = s.GetSize();
+ SetSize(ns);
+ for(int i=0;i<ns;++i)
+ m_pData[i]=s.m_pData[i];
+ return *this;
+ }
+
+ int AppendRule(acl_rule& r) {
+ return Add(r);
+ }
+
+ void DeleteRule(int r) {
+ RemoveAt(r);
+ }
+
+ int FindRule(int op,DWORD ip) {
+ for(int i=0;i<GetSize();++i)
+ if(m_pData[i].IsMatch(op,ip))
+ return i;
+ return -1;
+ }
+
+ int FindTarget(int op,DWORD ip) {
+ int r=FindRule(op,ip);
+ if(r<0) return -1;
+ return m_pData[r].target;
+ }
+
+ void SaveProfile(CWinApp* app) {
+ int s=GetSize();
+ for(int i=0;i<s;++i)
+ m_pData[i].SaveProfile(app,i);
+ app->WriteProfileInt("ACL","rules",s);
+ }
+ void LoadProfile(CWinApp* app) {
+ RemoveAll();
+ int s=app->GetProfileInt("ACL","rules",0);
+ for(int i=0;i<s;++i) {
+ acl_rule r;
+ r.LoadProfile(app,i);
+ if(r.IsValid())
+ Add(r);
+ }
+ }
+};
+
class CPumpKINDlg;
class CListenSocket : public CAsyncSocket {
public:
- virtual void OnReceive(int nErrorCode);
CPumpKINDlg* m_Daddy;
+ BOOL m_bListen;
+
+ CListenSocket()
+ : m_bListen(FALSE), m_Daddy(0) { }
+
+ BOOL SetListen(BOOL b);
+ virtual void OnReceive(int nErrorCode);
};
typedef CList<tftp*,tftp*> CTFTPList;
class CResolver;
class CXferSocket : public CAsyncSocket {
public:
UINT m__timeOut;
UINT m__blkSize;
tftp::tftpOptions m_Options;
LONG m_xferSize;
UINT m_timeOut;
UINT m_blkSize;
BOOL m_bRetry;
void SetTry(tftp *p=NULL);
tftp* m_Retry;
void OnRetry();
BOOL CheckBadRelativeness(LPCTSTR file);
CString ApplyRootGently(LPCTSTR fn);
CString m_HostName;
virtual void OnResolved();
virtual void OnFailedToResolve();
CResolver *m_wndResolver;
BYTE m_ResolveBuff[MAXGETHOSTSTRUCT];
virtual void Abort();
void ResetTimeout();
enum {
stateNone, stateDeny, stateInit, stateOACK, stateXfer, stateFinish, stateClosing
};
int state;
void Deny(UINT errCode,UINT errID);
void Deny(CFileException* e);
CString ApplyRoot(LPCTSTR fileName);
void TurnSlashes(CString& fn,BOOL bBack=TRUE);
virtual void Destroy(BOOL success=TRUE);
void PostError(CFileException* e);
void PostError(UINT errCode,UINT errID);
void PostTFTP(tftp* p,BOOL retryable=FALSE);
CXferSocket(CPumpKINDlg *daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN* sin);
CFile m_File;
virtual ULONG GetACK();
CString m_Type;
CString m_FileName;
CXferSocket();
void UpdateList();
void SetPeer(SOCKADDR_IN *sin);
virtual BOOL OnTFTP(tftp* p) = 0;
virtual void OnReceive(int nErrorCode);
void DoSelect();
@@ -175,153 +322,166 @@ public: };
class CWRQSocket : public CXferSocket {
public:
BOOL m_bResume;
void OnHostKnown();
virtual void OnResolved();
UINT m_LastSlack;
ULONG GetACK();
void DoXfer();
UINT m_ACK;
BOOL SaveAs(CString& fn);
BOOL RenameFile(CString& fn);
BOOL m_Rename;
BOOL ConfirmRequest();
BOOL Create(LPCTSTR localFile=NULL,LPCTSTR hostName=NULL);
CWRQSocket(CPumpKINDlg* daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN *sin);
BOOL OnTFTP(tftp* p);
DECLARE_DYNAMIC(CWRQSocket)
};
class CRRQSocket : public CXferSocket {
public:
void OnHostKnown();
virtual void OnResolved();
BOOL ConfirmRequest();
WORD m_LastSlack;
UINT m_ACK;
BOOL OnTFTP(tftp* p);
ULONG GetACK(void);
void DoXfer();
CRRQSocket(CPumpKINDlg *daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN *sin);
BOOL Create(LPCTSTR localFile=NULL,LPCTSTR hostName=NULL);
DECLARE_DYNAMIC(CRRQSocket)
};
typedef CMap<SOCKET,SOCKET,CXferSocket*,CXferSocket*> CTIDMap;
typedef CMap<CTime*,CTime*,CTime*,CTime*> CTimeMap;
/////////////////////////////////////////////////////////////////////////////
// CPumpKINDlg dialog
class CTrayer;
class CRetrier;
class CPumpKINDlg : public CDialog
{
// Construction
public:
+ CString m_lastlogerr;
+ void LogLine(LPCTSTR str);
+ CString m_LogFile;
+ BOOL m_bListen;
+ acl_rules_t m_aclRules;
CString m_bnwRequest;
CString m_bnwSuccess;
CString m_bnwAbort;
CBellsNWhistles m_bnw;
CTrayer *m_Trayer;
CTimeSpan m_RetryTimeOut;
virtual ~CPumpKINDlg();
CRetrier* m_Retrier;
virtual BOOL PreTranslateMessage(MSG* pMsg);
BOOL m_bShown;
BOOL m_bExiting;
void SaveSettings();
void LoadSettings();
void SetupButtons();
BITMAP m_bitmapBack;
CBitmap m_bmpBack;
UINT m_PromptTimeOut;
UINT m_SpeakPort;
void LogLine(UINT msgID);
CTimeMap m_LogTimes;
- void LogLine(LPCTSTR str);
+ void LogLineToFile(LPCTSTR str);
+ void LogLineToScreen(LPCTSTR str);
int m_LogLength;
enum {
subitemFile=0, subitemType, subitemPeer, subitemBytes, subitemTSize
};
int m_iWRQ;
int m_iRRQ;
CImageList m_Images;
CTIDMap m_Xfers;
CTimeSpan m_TFTPTimeOut;
enum {
- rrqGiveAll=0,
- rrqAlwaysConfirm,
- rrqDenyAll
+ rrqGiveAll=acl_rule::rrqGrant,
+ rrqAlwaysConfirm=acl_rule::rrqPrompt,
+ rrqDenyAll=acl_rule::rrqDeny,
+ rrqFallback=acl_rule::rrqNone,
+ rrqGrant=rrqGiveAll, rrqDeny=rrqDenyAll, rrqPrompt=rrqAlwaysConfirm
};
enum {
- wrqTakeAll=0,
- wrqConfirmIfExists,
- wrqAlwaysConfirm,
- wrqDenyAll
+ wrqTakeAll=acl_rule::wrqGrant,
+ wrqConfirmIfExists=acl_rule::wrqPromptIfExists,
+ wrqAlwaysConfirm=acl_rule::wrqPrompt,
+ wrqDenyAll=acl_rule::wrqDeny,
+ wrqFallback=acl_rule::wrqNone,
+ wrqGrant=wrqTakeAll,wrqDeny=wrqDenyAll, wrqPrompt=wrqAlwaysConfirm
};
UINT m_RRQMode;
UINT m_WRQMode;
BOOL m_bTFTPSubdirs;
CString m_TFTPRoot;
UINT m_ListenPort;
UINT m_BlockSize;
CListenSocket m_Listener;
CPumpKINDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CPumpKINDlg)
enum { IDD = IDD_PUMPKIN_DIALOG };
+ CButton m_ListenCtl;
CButton m_AbortCtl;
CButton m_OptionsCtl;
CListBox m_Log;
CListCtrl m_List;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CPumpKINDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
CToolTipCtrl m_tooltip;
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CPumpKINDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnDestroy();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnOptions();
afx_msg void OnTimer(UINT nIDEvent);
afx_msg void OnExit();
afx_msg void OnPut();
afx_msg void OnGet();
afx_msg void OnDeleteallitemsConnections(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnDeleteitemConnections(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnInsertitemConnections(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnItemchangedConnections(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnAbort();
afx_msg void OnClose();
afx_msg void OnTrayShowpumpkinwindow();
+ afx_msg void OnTrayListen();
afx_msg void OnTrayExit();
afx_msg void OnTrayAboutpumpkin();
afx_msg void OnTrayFetchfile();
afx_msg void OnTrayHelp();
afx_msg void OnTrayOptions();
afx_msg void OnTraySendfile();
afx_msg void OnWindowPosChanging(WINDOWPOS FAR* lpwndpos);
afx_msg void OnSelchangeLog();
afx_msg void OnTrayOpenfilesfolder();
afx_msg void OnDropFiles(HDROP hDropInfo);
virtual void OnCancel();
afx_msg void OnHelp();
+ afx_msg void OnListening();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
@@ -1,118 +1,125 @@ // Trayer.cpp : implementation file
//
#include "stdafx.h"
#include "PumpKIN.h"
#include "Trayer.h"
#include "PumpKINDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTrayer
CTrayer::CTrayer()
{
m_inMenu=0;
}
CTrayer::~CTrayer()
{
}
BEGIN_MESSAGE_MAP(CTrayer, CWnd)
//{{AFX_MSG_MAP(CTrayer)
ON_MESSAGE(WM_TRAYICON, OnTray)
ON_COMMAND(ID_TRAY_ABOUTPUMPKIN, OnTrayAboutpumpkin)
ON_COMMAND(ID_TRAY_EXIT, OnTrayExit)
ON_COMMAND(ID_TRAY_FETCHFILE, OnTrayFetchfile)
ON_COMMAND(ID_TRAY_HELP, OnTrayHelp)
ON_COMMAND(ID_TRAY_OPENFILESFOLDER, OnTrayOpenfilesfolder)
ON_COMMAND(ID_TRAY_OPTIONS, OnTrayOptions)
ON_COMMAND(ID_TRAY_SENDFILE, OnTraySendfile)
ON_COMMAND(ID_TRAY_SHOWPUMPKINWINDOW, OnTrayShowpumpkinwindow)
+ ON_COMMAND(ID_TRAY_LISTEN, OnTrayListen)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTrayer message handlers
CTrayer::CTrayer(CPumpKINDlg* daddy)
: m_Daddy(daddy)
{
m_inMenu=0;
}
LRESULT CTrayer::OnTray(WPARAM wP,LPARAM lP)
{
ASSERT(wP==IDC_TRAYICON);
switch(lP){
case WM_RBUTTONDOWN:
{
CMenu menu;
VERIFY(menu.LoadMenu(IDM_POPUPS));
CMenu *popUp = menu.GetSubMenu(0);
ASSERT(popUp);
CPoint pt;
VERIFY(::GetCursorPos(&pt));
m_inMenu++;
SetForegroundWindow();
popUp->CheckMenuItem(ID_TRAY_SHOWPUMPKINWINDOW,MF_BYCOMMAND|(IsWindowVisible()?MF_CHECKED:MF_UNCHECKED));
+ popUp->CheckMenuItem(ID_TRAY_LISTEN,MF_BYCOMMAND|(m_Daddy->m_Listener.m_bListen?MF_CHECKED:MF_UNCHECKED));
popUp->TrackPopupMenu(TPM_RIGHTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,pt.x,pt.y,this);
m_inMenu--;
SendMessage(WM_NULL);
}
break;
case WM_LBUTTONDOWN:
m_Daddy->SendMessage(WM_COMMAND,ID_TRAY_SHOWPUMPKINWINDOW);
break;
}
return 0;
}
void CTrayer::OnTrayAboutpumpkin()
{
m_Daddy->SendMessage(WM_COMMAND,ID_TRAY_ABOUTPUMPKIN);
}
void CTrayer::OnTrayExit()
{
m_Daddy->SendMessage(WM_COMMAND,ID_TRAY_EXIT);
}
void CTrayer::OnTrayFetchfile()
{
m_Daddy->SendMessage(WM_COMMAND,ID_TRAY_FETCHFILE);
}
void CTrayer::OnTrayHelp()
{
m_Daddy->SendMessage(WM_COMMAND,ID_TRAY_HELP);
}
void CTrayer::OnTrayOpenfilesfolder()
{
m_Daddy->SendMessage(WM_COMMAND,ID_TRAY_OPENFILESFOLDER);
}
void CTrayer::OnTrayOptions()
{
m_Daddy->SendMessage(WM_COMMAND,ID_TRAY_OPTIONS);
}
void CTrayer::OnTraySendfile()
{
m_Daddy->SendMessage(WM_COMMAND,ID_TRAY_SENDFILE);
}
void CTrayer::OnTrayShowpumpkinwindow()
{
m_Daddy->SendMessage(WM_COMMAND,ID_TRAY_SHOWPUMPKINWINDOW);
}
+
+void CTrayer::OnTrayListen()
+{
+ m_Daddy->SendMessage(WM_COMMAND,ID_TRAY_LISTEN);
+}
@@ -1,48 +1,49 @@ // Trayer.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CTrayer window
class CPumpKINDlg;
class CTrayer : public CWnd
{
// Construction
public:
int m_inMenu;
CPumpKINDlg* m_Daddy;
CTrayer(CPumpKINDlg* daddy);
CTrayer();
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CTrayer)
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CTrayer();
// Generated message map functions
protected:
//{{AFX_MSG(CTrayer)
afx_msg LRESULT OnTray(WPARAM,LPARAM);
afx_msg void OnTrayAboutpumpkin();
afx_msg void OnTrayExit();
afx_msg void OnTrayFetchfile();
afx_msg void OnTrayHelp();
afx_msg void OnTrayOpenfilesfolder();
afx_msg void OnTrayOptions();
afx_msg void OnTraySendfile();
afx_msg void OnTrayShowpumpkinwindow();
+ afx_msg void OnTrayListen();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
diff --git a/help/pumpkin.cnt b/help/pumpkin.cnt index 0e09da3..dfe42e5 100644 --- a/help/pumpkin.cnt +++ b/help/pumpkin.cnt @@ -1,14 +1,15 @@ :Base PumpKIN.hlp>Standard
:Title PumpKIN
1 PumpKIN
2 About PumpKIN=About
2 What's New=News
2 Using PumpKIN=Using
1 PumpKIN Dialogs
2 Confirm Read Request Dialog=ConfirmRRQ
2 Confirm Write Request Dialog=ConfirmWRQ
2 Request Dialog=Request
1 PumpKIN Options
2 Server Options=ServerOptions
2 Network Options=NetworkOptions
2 Sounds Options=SoundsOptions
+2 Access Lists=ACL
diff --git a/help/pumpkin.rtf b/help/pumpkin.rtf index b39ca9c..9c02ca9 100644 --- a/help/pumpkin.rtf +++ b/help/pumpkin.rtf @@ -1,121 +1,132 @@ {\rtf1\ansi
@{\footnote
THIS FILE WAS AUTOMATICALLY GENERATED FROM XML DOCUMENT.
DO NOT MODIFY THIS FILE DIRECTLY. EDIT XML DOCUMENT INSTEAD
}
{\fonttbl{\f0\froman Times New Roman;}{\f1\fswiss Arial;}{\f3\froman Symbol;}}{\colortbl;
\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;
\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;
\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;
\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}
\pard\plain\keepn
#{\footnote About}
${\footnote About PumpKIN}
K{\footnote about}
{ \f1\fs18\b\sb120 About {\b PumpKIN}}
\par\sa120\sb120\qj\pard \f1\fs18\sb120 {\b PumpKIN} is a program designed to send and receive files over the net while having {\uldb {\b T42}}{\v %!ExecFile("http://kin.klever.net/T42/")} or {\b\cf6 Wintalk} session running using {\i TFTP} ({\uldb {\b RFC1350}}{\v %!ExecFile("http://www.rfc-editor.org/rfc/rfc1350.txt")}) protocol. It includes full-functional {\i TFTP} server/client so it may be useful for maintaining {\uldb CISCO}{\v %!ExecFile("http://www.cisco.com/")} routers and other network equipment.
\par\sa120\sb120\qj\pard \f1\fs18\sb120
\par\sa120\sb120\qj\pard \f1\fs18\sb120 {\b {\i Enjoy!}}
{
-\par\pard\plain\sb360\sa120 \f1\fs16 Copyright (c) 1997-2005 {\uldb\cf0 Klever Group (http://www.klever.net/)}{\v %!ExecFile("http://www.klever.net/")}
+\par\pard\plain\sb360\sa120 \f1\fs16 Copyright (c) 1997-2006 {\uldb\cf0 Klever Group (http://www.klever.net/)}{\v %!ExecFile("http://www.klever.net/")}
\par\qj\sb120\sa120Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
\par The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
\par \sa360 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
}
\page
\pard\plain
#{\footnote News}
${\footnote What's New}
+\par\pard\plain\f1\fs24\qc\cf2\b 2.7 - February 1st, 2006
+\par\pard\plain\fi0\li0\f1\fs18 \bullet Added acess lists based on request IP address and TFTP opcode for automating access policy
+\par\pard\plain\fi0\li0\f1\fs18 \bullet Added possibility to start/stop TFTP server, while keeping client functionality intact
\par\pard\plain\f1\fs24\qc\cf2\b 2.6 - August 6th, 2005
\par\pard\plain\fi0\li0\f1\fs18 \bullet more robust solution to the backslash/slash dilemma
\par\pard\plain\fi0\li0\f1\fs18 \bullet A bit more elaborate error reporting
\par\pard\plain\fi0\li0\f1\fs18 \bullet Fixed uninstall procedure so that it works on XP
\par\pard\plain\f1\fs24\qc\cf2\b 2.5 - July 11th, 2004
\par\pard\plain\fi0\li0\f1\fs18 \bullet Change of {\uldb license}{\v About} and opening the source.
\par\pard\plain\fi0\li0\f1\fs18 \bullet Minor cosmetic changes
\par\pard\plain\f1\fs24\qc\cf2\b 2.0 - June 13th, 1998
\par\pard\plain\fi0\li0\f1\fs18 \bullet Sounds customization. Now you can customize {\b PumpKIN} bells and whistles or turn them off completely.
\par\pard\plain\fi0\li0\f1\fs18 \bullet Previous version of {\b PumpKIN} had a bug causing it to misbehave when you're requesting file from remote {\i tftp} server using {\b IP Address} (as opposed to {\b hostname}).
\par\pard\plain\fi0\li0\f1\fs18 \bullet Typo causing {\b PumpKIN} to log outgoing request in reverse (i.e. {\i Requesting 'hostname' from 'filename'}) fixed.
\par\pard\plain\fi0\li0\f1\fs18 \bullet Something else that you may not notice and I can not remember.
\par\pard\plain\f1\fs24\qc\cf2\b 1.5 - February 12th, 1998
\par\pard\plain\fi0\li0\f1\fs18 \bullet Transfer resumes. No checking on file contents is done, so it's up to you to decide whether you want to start transmission from the beginning or resume unfinished transfer.
\par\pard\plain\fi0\li0\f1\fs18 \bullet Support for {\b block size}, {\b trasnfer size} and {\b transfer timeout} options as described in {\uldb {\b RFC1782}}{\v %!ExecFile("http://www.rfc-editor.org/rfc/rfc1782.txt")}, {\uldb {\b RFC1783}}{\v %!ExecFile("http://www.rfc-editor.org/rfc/rfc1783.txt")} and {\uldb {\b RFC1784}}{\v %!ExecFile("http://www.rfc-editor.org/rfc/rfc1784.txt")}. I'm not sure if there are any other {\i TFTP} implementations supporting this, but at least it makes sense if you use {\b PumpKIN} on both ends.
\par\pard\plain\fi0\li0\f1\fs18 \bullet New Install program
\page
\pard\plain\keepn
#{\footnote Using}
${\footnote Using PumpKIN}
{ \f1\fs18\b\sb120 Using {\b PumpKIN}}
\par\sa120\sb120\qj\pard \f1\fs18\sb120 This is a simple program for file exchange between two parties. It allows you to send files over the network to your party while having a {\uldb {\b T42}}{\v %!ExecFile("http://kin.klever.net/T42/")} or {\b\cf6 Wintalk} conversation. It uses open sessions to determine IP address of your party. Also you may use it as a {\i TFTP} client/server by itself. To get/put files from/to {\i TFTP} server you need to enter host name/IP address manually in the {\uldb Request Dialog}{\v Request}.
\par\sa120\sb120\qj\pard \f1\fs18\sb120 To Abort transfer(s) currently in progress - select transfer(s) you want to terminate in the list and click {\b Abort xfer} button.
\par\sa120\sb120\qj\pard \f1\fs18\sb120 You may want to hide {\b PumpKIN} window and leave it as a tray icon only. Just click the \{bmct pumpkin.bmp\} icon in the tray or simply close the window.
\par\sa120\sb120\qj\pard \f1\fs18\sb120 Use {\uldb Options}{\v Options} button to set {\b PumpKIN} options.
\page
\pard\plain\keepn
#{\footnote ConfirmRRQ}
${\footnote Confirm Read Request Dialog}
{ \f1\fs18\b\sb120 Confirm Read Request Dialog}
\par\sa120\sb120\qj\pard \f1\fs18\sb120 When the file is requested from your {\i TFTP} server you may choose to {\b Grant Access} to this file or to {\b Deny Access}. If you hesitate to answer for {\uldb {\b Confirmation timeout}}{\v ConfirmationTimeout} ({\i default - 30 seconds}) {\b PumpKIN} defaults to denial of all requests.
\page
\pard\plain\keepn
#{\footnote ConfirmWRQ}
${\footnote Confirm Write Request Dialog}
{ \f1\fs18\b\sb120 Confirm Write Request Dialog}
\par\sa120\sb120\qj\pard \f1\fs18\sb120 Whenever your party sends you a file you have always a choice to accept it or not. You can also save the file under a different name by choosing the {\b Rename} option. If you already have file with such name you may chose to {\b resume} transfer. No checking on file contents is done. This option may or may not work depending on remote implementation of protocol. It does work if you use {\b PumpKIN} on both ends. If you are still unsure for {\uldb {\b Confirmation timeout}}{\v ConfirmationTimeOut} ({\i default - 30 seconds}) {\b PumpKIN} will make safe decision for you (deny).
\page
\pard\plain\keepn
#{\footnote Request}
${\footnote Request Dialog}
{ \f1\fs18\b\sb120 Request Dialog}
\par\sa120\sb120\qj\pard \f1\fs18\sb120 Request dialog is aimed to let you form read or write request. You may set the following options:\pard
\par \fi0\li0 \bullet {\b Local File} - You can change the name of the file you're sending (or destination in case you're receiving) right here. You may also use {\b Browse} button to select the file.
\par \fi0\li0 \bullet {\b Remote File} Specifies the name of file on the remote host you're requesting (in case of read request) or the name of file you want your file to appear as (in case of write request).
\par \fi0\li0 \bullet {\b Remote Host} is your party's host or {\i TFTP} server you're requesting file from/sending file to. To refresh the list of your talk windows use {\b REFRESH} button.
\par \fi0\li0 \bullet {\b Type} is the type of transfer as defined in {\uldb {\b RFC1350}}{\v %!ExecFile("http://www.rfc-editor.org/rfc/rfc1350.txt")}. Doesn't mean much, really. Defined types are '{\i octet}' or '{\i netascii}'. Default is '{\i octet}'.
\par \fi0\li0 \bullet {\b Block Size} - Use this block size if remote is {\uldb {\b RFC1783}}{\v %!ExecFile("http://www.rfc-editor.org/rfc/rfc1783.txt")}-compliant. If remote doesn't support this option {\b PumpKIN} will fallback to 512 bytes per block.\pard
\page
\pard\plain\keepn
#{\footnote Options}
${\footnote Options}
{ \f1\fs18\b\sb120 Options}
\par\sa120\sb120\qj\pard \f1\fs18\sb120 {\b PumpKIN} options property sheet consists of two tabs. For more information see {\uldb {\b Network}}{\v NetworkOptions} and {\b Server} options.
\page
\pard\plain\keepn
#{\footnote NetworkOptions}
${\footnote Network Options}
{ \f1\fs18\b\sb120 Network Options}\pard
\par \fi0\li0 \bullet {\b UDP Ports}\pard
\par \fi0\li0 \bullet {\b Listen for incoming connections on port} - specifies the port we're listening to. The default as defined in {\uldb {\b RFC1350}}{\v %!ExecFile("http://www.rfc-editor.org/rfc/rfc1350.txt")} is 69.
\par \fi0\li0 \bullet {\b Send outgoing requests to port} - specifies the port we're going to send all requests to.\pard
\par \fi0\li0 \bullet {\b Default Connection timeout} - if there's no activity for specified time, transfer is considered to be dead and terminated. {\b PumpKIN} tries to propagate this value to remote as described in {\uldb {\b RFC1782}}{\v %!ExecFile("http://www.rfc-editor.org/rfc/rfc1782.txt")} and {\uldb {\b RFC1784}}{\v %!ExecFile("http://www.rfc-editor.org/rfc/rfc1784.txt")} if possible.
\par \fi0\li0 \bullet {\b Default Block Size} - {\b PumpKIN} tries to negotiate block size with remote using this value unless specified explicitly in request. If remote doesn't support {\uldb {\b RFC1782}}{\v %!ExecFile("http://www.rfc-editor.org/rfc/rfc1782.txt")} and {\uldb {\b RFC1783}}{\v %!ExecFile("http://www.rfc-editor.org/rfc/rfc1783.txt")}{\b PumpKIN} falls back to 512 bytes per block.\pard
\page
\pard\plain\keepn
#{\footnote ServerOptions}
${\footnote Server Options}
{ \f1\fs18\b\sb120 Server Options}\pard
\par \fi0\li0 \bullet {\b TFTP Filesystem root} - Specifies the location of files you're transmitting or where to start looking for them from. Defaults to the directory you start {\b PumpKIN} for the first time from.
\par \fi0\li0 \bullet {\b Allow access to subdirectories} - specifies whether you want allow access to the whole subtree of {\b TFTP Root} or only to the directory itself.
\par \fi0\li0 \bullet {\b Read Request Behavior} - You may choose to automatically agree to give all files requested, to be prompted to confirm these operations, or to deny all requests as if you're not even here.
\par \fi0\li0 \bullet {\b Write Request Behavior} - You may chose to {\b take all files} ({\i not recommended}), to {\b prompt only if file exists already}, {\b Always prompt} or {\b Deny all requests}.
\par \fi0\li0 \bullet {#{\footnote ConfirmationTimeOut}}{\b Confirmation timeout} - this is the time {\b PumpKIN} will wait for you to accept or deny request before it will give up and take default action which is always deny.\pard
\page
\pard\plain\keepn
-#{\footnote SoundsOptoins}
+#{\footnote SoundsOptions}
${\footnote Sounds Options}
{ \f1\fs18\b\sb120 Sounds}
\par\sa120\sb120\qj\pard \f1\fs18\sb120 You can customize {\b PumpKIN} sounds notifications here. There are three customizable sounds defined - {\b Incoming request}, which notifies you about incoming request prompt if you're set to be prompted whenever incoming request occurs. {\b xfer Aborted} - which happens to sound every time transfer is interrupted for whatever reason - time out, explicit kill, denied access, etc. {\b xfer Finished} means that your file was successfully transmitted.
\par\sa120\sb120\qj\pard \f1\fs18\sb120 You can select any {\b .wav} file or one of the predefined sounds from the dropdown list.
\page
+
+\pard\plain\keepn
+#{\footnote ACL}
+${\footnote Access Lists}
+{ \f1\fs18\b\sb120 Access Lists}
+\par\sa120\sb120\qj\pard \f1\fs18\sb120 You can slightly automate your access policies by setting up read/write request behavior for different incoming requests.
+\par\sa120\sb120\qj\pard \f1\fs18\sb120 The rule consists of {\b request type}, source networke ({\b ip} and {\b netmask}) and {\b action} to take (see also {\uldb Server Options}{\v ServerOptions}).
+\page
}
\ No newline at end of file diff --git a/help/pumpkin.xml b/help/pumpkin.xml index 38c54ca..944bb54 100644 --- a/help/pumpkin.xml +++ b/help/pumpkin.xml @@ -1,91 +1,104 @@ <?xml version="1.0"?>
<winhelp>
<topic id="About" title="About PumpKIN" keywords="about">
<heading scroll="no">About <kin>PumpKIN</kin></heading>
<p><kin>PumpKIN</kin> is a program designed to send and receive files over the net while having <kin href="http://kin.klever.net/T42/">T42</kin> or <product>Wintalk</product> session running using <term>TFTP</term> (<rfc num="1350"/>) protocol. It includes full-functional <term>TFTP</term> server/client so it may be useful for maintaining <a href="http://www.cisco.com/">CISCO</a> routers and other network equipment.</p>
<p/>
<p><b><i>Enjoy!</i></b></p>
- <license years="1997-2005"/>
+ <license years="1997-2006"/>
<credist/>
</topic>
<topic id="News" title="What's New">
+ <newsfor version="2.7" date="">
+ <ni>Added acess lists based on request IP address and TFTP opcode for automating access policy</ni>
+ <ni>Added possibility to start/stop TFTP server, while keeping client functionality intact</ni>
+ </newsfor>
<newsfor version="2.6" date="August 6th, 2005">
<ni>more robust solution to the backslash/slash dilemma</ni>
<ni>A bit more elaborate error reporting</ni>
<ni>Fixed uninstall procedure so that it works on XP</ni>
</newsfor>
<newsfor version="2.5" date="July 11th, 2004">
<ni>Change of <a href="#About">license</a> and opening the source.</ni>
<ni>Minor cosmetic changes</ni>
</newsfor>
<newsfor version="2.0" date="June 13th, 1998">
<ni>Sounds customization. Now you can customize <kin>PumpKIN</kin> bells and whistles or turn them off completely.</ni>
<ni>Previous version of <kin>PumpKIN</kin> had a bug causing it to misbehave when you're requesting file from remote <term>tftp</term> server using <b>IP Address</b> (as opposed to <b>hostname</b>).</ni>
<ni>Typo causing <kin>PumpKIN</kin> to log outgoing request in reverse (i.e. <i>Requesting 'hostname' from 'filename'</i>) fixed.</ni>
<ni>Something else that you may not notice and I can not remember.</ni>
</newsfor>
<newsfor version="1.5" date="February 12th, 1998">
<ni>Transfer resumes. No checking on file contents is done, so it's up to you to decide whether you want to start transmission from the beginning or resume unfinished transfer.</ni>
<ni>Support for <b>block size</b>, <b>trasnfer size</b> and <b>transfer timeout</b> options as described in <rfc num="1782"/>, <rfc num="1783"/> and <rfc num="1784"/>. I'm not sure if there are any other <term>TFTP</term> implementations supporting this, but at least it makes sense if you use <kin>PumpKIN</kin> on both ends.</ni>
<ni>New Install program</ni>
</newsfor>
</topic>
<topic id="Using" title="Using PumpKIN">
<heading scroll="no">Using <kin>PumpKIN</kin></heading>
<p>This is a simple program for file exchange between two parties. It allows you to send files over the network to your party while having a <kin href="http://kin.klever.net/T42/">T42</kin> or <product>Wintalk</product> conversation. It uses open sessions to determine IP address of your party. Also you may use it as a <term>TFTP</term> client/server by itself. To get/put files from/to <term>TFTP</term> server you need to enter host name/IP address manually in the <a href="#Request">Request Dialog</a>.</p>
<p>To Abort transfer(s) currently in progress - select transfer(s) you want to terminate in the list and click <b>Abort xfer</b> button.</p>
<p>You may want to hide <kin>PumpKIN</kin> window and leave it as a tray icon only. Just click the <image source="pumpkin.bmp"/> icon in the tray or simply close the window.</p>
<p>Use <a href="#Options">Options</a> button to set <kin>PumpKIN</kin> options.</p>
+ <p>You can start and stop <kin>PumpKIN</kin>'s <term>TFTP</term> server by checking and unchecking the <b>Server is running</b> checkbox in the lower right corner of main <kin>PumpKIN</kin> window.</p>
</topic>
<topic id="ConfirmRRQ" title="Confirm Read Request Dialog">
<heading scroll="no">Confirm Read Request Dialog</heading>
<p>When the file is requested from your <term>TFTP</term> server you may choose to <b>Grant Access</b> to this file or to <b>Deny Access</b>. If you hesitate to answer for <a href="#ConfirmationTimeout"><b>Confirmation timeout</b></a> (<i>default - 30 seconds</i>) <kin>PumpKIN</kin> defaults to denial of all requests.</p>
</topic>
<topic id="ConfirmWRQ" title="Confirm Write Request Dialog">
<heading scroll="no">Confirm Write Request Dialog</heading>
<p>Whenever your party sends you a file you have always a choice to accept it or not. You can also save the file under a different name by choosing the <b>Rename</b> option. If you already have file with such name you may chose to <b>resume</b> transfer. No checking on file contents is done. This option may or may not work depending on remote implementation of protocol. It does work if you use <kin>PumpKIN</kin> on both ends. If you are still unsure for <a href="#ConfirmationTimeOut"><b>Confirmation timeout</b></a> (<i>default - 30 seconds</i>) <kin>PumpKIN</kin> will make safe decision for you (deny).</p>
</topic>
<topic id="Request" title="Request Dialog">
<heading scroll="no">Request Dialog</heading>
<p>Request dialog is aimed to let you form read or write request. You may set the following options:</p>
<ul>
<li><b>Local File</b> - You can change the name of the file you're sending (or destination in case you're receiving) right here. You may also use <b>Browse</b> button to select the file.</li>
<li><b>Remote File</b> Specifies the name of file on the remote host you're requesting (in case of read request) or the name of file you want your file to appear as (in case of write request).</li>
<li><b>Remote Host</b> is your party's host or <term>TFTP</term> server you're requesting file from/sending file to. To refresh the list of your talk windows use <b>REFRESH</b> button.</li>
<li><b>Type</b> is the type of transfer as defined in <rfc num="1350"/>. Doesn't mean much, really. Defined types are '<i>octet</i>' or '<i>netascii</i>'. Default is '<i>octet</i>'.</li>
<li><b>Block Size</b> - Use this block size if remote is <rfc num="1783"/>-compliant. If remote doesn't support this option <kin>PumpKIN</kin> will fallback to 512 bytes per block.</li>
</ul>
</topic>
<topic id="Options" title="Options">
<heading scroll="no">Options</heading>
<p><kin>PumpKIN</kin> options property sheet consists of two tabs. For more information see <a href="#NetworkOptions"><b>Network</b></a> and <a herf="#ServerOptions"><b>Server</b></a> options.</p>
</topic>
<topic id="NetworkOptions" title="Network Options">
<heading scroll="no">Network Options</heading>
<ul>
<li><b>UDP Ports</b>
<ul>
<li><b>Listen for incoming connections on port</b> - specifies the port we're listening to. The default as defined in <rfc num="1350"/> is 69.</li>
<li><b>Send outgoing requests to port</b> - specifies the port we're going to send all requests to.</li>
</ul>
</li>
<li><b>Default Connection timeout</b> - if there's no activity for specified time, transfer is considered to be dead and terminated. <kin>PumpKIN</kin> tries to propagate this value to remote as described in <rfc num="1782"/> and <rfc num="1784"/> if possible.</li>
<li><b>Default Block Size</b> - <kin>PumpKIN</kin> tries to negotiate block size with remote using this value unless specified explicitly in request. If remote doesn't support <rfc num="1782"/> and <rfc num="1783"/> <kin>PumpKIN</kin> falls back to 512 bytes per block.</li>
</ul>
</topic>
<topic id="ServerOptions" title="Server Options">
<heading scroll="no">Server Options</heading>
<ul>
<li><b>TFTP Filesystem root</b> - Specifies the location of files you're transmitting or where to start looking for them from. Defaults to the directory you start <kin>PumpKIN</kin> for the first time from.</li>
<li><b>Allow access to subdirectories</b> - specifies whether you want allow access to the whole subtree of <b>TFTP Root</b> or only to the directory itself.</li>
<li><b>Read Request Behavior</b> - You may choose to automatically agree to give all files requested, to be prompted to confirm these operations, or to deny all requests as if you're not even here.</li>
<li><b>Write Request Behavior</b> - You may chose to <b>take all files</b> (<i>not recommended</i>), to <b>prompt only if file exists already</b>, <b>Always prompt</b> or <b>Deny all requests</b>.</li>
<li><a name="ConfirmationTimeOut"/><b>Confirmation timeout</b> - this is the time <kin>PumpKIN</kin> will wait for you to accept or deny request before it will give up and take default action which is always deny.</li>
</ul>
</topic>
- <topic id="SoundsOptoins" title="Sounds Options">
+ <topic id="SoundsOptions" title="Sounds Options">
<heading scroll="no">Sounds</heading>
<p>You can customize <kin>PumpKIN</kin> sounds notifications here. There are three customizable sounds defined - <b>Incoming request</b>, which notifies you about incoming request prompt if you're set to be prompted whenever incoming request occurs. <b>xfer Aborted</b> - which happens to sound every time transfer is interrupted for whatever reason - time out, explicit kill, denied access, etc. <b>xfer Finished</b> means that your file was successfully transmitted.</p>
<p>You can select any <b>.wav</b> file or one of the predefined sounds from the dropdown list.</p>
</topic>
+ <topic id="ACL" title="Access Lists">
+ <heading scroll="no">Access Lists</heading>
+ <p>You can slightly automate your access policies by setting up read/write request behavior for different incoming requests.</p>
+ <p>The rule consists of <b>request type</b>, source network (<b>ip</b> and <b>netmask</b>) and <b>action</b> to take (see also <a href="#ServerOptions">Server Options</a>).</p>
+ <p>When <kin>PumpKIN</kin> receives request it goes through the list of rules and bases its decision on the first matching rule. To rearrange order of rules, select the rule you wish to move and use up and down arrows buttons on the right. To remove rule, use the cross button.</p>
+ <p>To add a new rule fill in the information about <b>request type</b>, source <b>address</b> and <b>netmask</b> and desired action. Then click on the 'Add new rule' button.</p>
+ <p>If you wish to amend the rule, select it in the rules list, change parameters below and click the 'Replace rule' button.</p>
+ </topic>
</winhelp>
diff --git a/install/Install.clw b/install/Install.clw new file mode 100644 index 0000000..6775b4c --- a/dev/null +++ b/install/Install.clw @@ -0,0 +1,35 @@ +; CLW file contains information for the MFC ClassWizard
+
+[General Info]
+Version=1
+LastClass=
+LastTemplate=CDialog
+NewFileInclude1=#include "stdafx.h"
+NewFileInclude2=#include "install.h"
+LastPage=0
+
+ClassCount=0
+
+ResourceCount=2
+Resource1=IDD_INSTALLING (FALSE)
+Resource2=IDD_PATH
+
+[DLG:IDD_INSTALLING (FALSE)]
+Type=1
+Class=?
+ControlCount=4
+Control1=IDCANCEL,button,1342295808
+Control2=IDC_DISKS,SysAnimate32,1342242822
+Control3=IDC_STATE,static,1342308736
+Control4=IDC_PROGRESS,msctls_progress32,1342177280
+
+[DLG:IDD_PATH]
+Type=1
+Class=?
+ControlCount=5
+Control1=IDC_PROMPT,static,1342308352
+Control2=IDC_PATH,edit,1350631552
+Control3=IDC_BROWSE,button,1342242816
+Control4=IDOK,button,1342242817
+Control5=IDCANCEL,button,1342242816
+
diff --git a/install/install.cpp b/install/install.cpp index d11de03..cfe4d27 100644 --- a/install/install.cpp +++ b/install/install.cpp @@ -1,52 +1,52 @@ #include "resource.h" #include "../shared-code/install.h"
-#define VERSION "2.6"
+#define VERSION "2.7"
#define KINAME "PumpKIN " VERSION
#define SKINAME "PumpKIN" BOOL Install(void) { STRING dPath = strFETCH_REG_KEY(HKEY_LOCAL_MACHINE,"Software\\Klever Group",SKINAME "Path");
STRING kPath = strFETCH_REG_KEY(HKEY_LOCAL_MACHINE,"Software\\Klever Group","KINPath");
LPCSTR qPath = ((LPCSTR)dPath)?(LPCSTR)dPath:(((LPCSTR)kPath)?(LPSTR)kPath:"C:\\Program Files\\Klever\\Nothings");
STRING path = REQUESTPATH(" " KINAME,"\nEnter destination path:",qPath);
if(!path)
return NULL;
#ifdef K_ANNED
STRING sysDir(_MAX_PATH);
GetSystemDirectory(sysDir,_MAX_PATH);
INSTALLFILE("mfc42.dl_",sysDir,"mfc42.dll");
#endif
MAKE_PATH(path);
STRING shortPath = GET_SHORT_PATH(path);
if(!shortPath){
MessageBox(NULL,"Failed to install " KINAME " in specified directory",NULL,MB_ICONERROR|MB_OK);
return FALSE;
}
if(!(
INSTALLFILE(SKINAME ".ex_",path,SKINAME ".exe") &&
INSTALLFILE(SKINAME ".hl_",path,SKINAME ".hlp") &&
INSTALLFILE(SKINAME ".cn_",path,SKINAME ".cnt")
)){
MessageBox(NULL,"Failed to install " KINAME " in specified directory",NULL,MB_ICONERROR|MB_OK);
return FALSE;
}
ADDMENU("Klever Group",SKINAME,path, SKINAME ".exe");
strSET_REG_KEY(HKEY_LOCAL_MACHINE,"Software\\Klever Group",SKINAME "Path",path);
strSET_REG_KEY(HKEY_LOCAL_MACHINE,"Software\\Klever Group","KINPath",path);
FILE* inf=CREATE_INF_FILE(path,SKINAME ".INF");
if(!inf){
MessageBox(NULL,"Failed to install " KINAME,NULL,MB_ICONERROR|MB_OK);
return FALSE;
}
INF_FILE_HEADER(inf);
INF_FILE_SECTION(inf,"Uninstall");
fprintf(inf,"AddReg=kFiles\nDelReg=kReg\nUpdateInis=kMenu\n");
INF_FILE_SECTION(inf,"kFiles");
INF_REMOVE_ROOT(inf,SKINAME "Files",shortPath);
diff --git a/install/install.rc b/install/install.rc index cc621ad..9a03edb 100644 --- a/install/install.rc +++ b/install/install.rc @@ -86,97 +86,97 @@ BEGIN BOTTOMMARGIN, 66
HORZGUIDE, 37
END
END
#endif // APSTUDIO_INVOKED
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE DISCARDABLE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""custom.rch""\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_ICON ICON DISCARDABLE "../shared-data/install-icon.ico"
#ifndef _MAC
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2,6,0,0
- PRODUCTVERSION 2,6,0,0
+ FILEVERSION 2,7,0,0
+ PRODUCTVERSION 2,7,0,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "CompanyName", "Klever Group (http://www.klever.net/)\0"
VALUE "FileDescription", "INSTALL: PumpKIN, tftp client/daemon\0"
- VALUE "FileVersion", "2, 6, 0, 0\0"
+ VALUE "FileVersion", "2, 7, 0, 0\0"
VALUE "InternalName", "INSTALL\0"
- VALUE "LegalCopyright", "Copyright © 1997-2005 Klever Group (http://www.klever.net/)\0"
+ VALUE "LegalCopyright", "Copyright © 1997-2006 Klever Group (http://www.klever.net/)\0"
VALUE "LegalTrademarks", "Klever Group (http://www.klever.net/)\0"
VALUE "OriginalFilename", "INSTALL.EXE\0"
VALUE "ProductName", "PumpKIN\0"
- VALUE "ProductVersion", "2, 6, 0, 0\0"
+ VALUE "ProductVersion", "2, 7, 0, 0\0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
#endif // !_MAC
#endif // English (U.S.) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
#include "custom.rch"
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
diff --git a/pumpkin.clw b/pumpkin.clw index 4ae747b..5344bfd 100644 --- a/pumpkin.clw +++ b/pumpkin.clw @@ -1,283 +1,327 @@ ; CLW file contains information for the MFC ClassWizard
[General Info]
Version=1
-LastClass=CPropsSounds
-LastTemplate=CPropertyPage
+LastClass=CPropsServer
+LastTemplate=CComboBox
NewFileInclude1=#include "stdafx.h"
NewFileInclude2=#include "PumpKIN.h"
-ClassCount=12
+ClassCount=14
Class1=CPumpKINApp
Class2=CPumpKINDlg
Class3=CAboutDlg
-ResourceCount=9
+ResourceCount=10
Resource1=IDD_REQUEST
-Resource2=IDD_PROPS_SERVER
+Resource2=IDD_PROPS_NETWORK
Resource3=IDD_CONFIRM_RRQ
Resource4=IDD_ABOUTBOX
Class4=CPropsServer
Class5=CPropsNetwork
Resource5=IDD_CONFIRM_WRQ
-Resource6=IDD_PROPS_NETWORK
+Resource6=IDD_PROPS_ACL
Class6=CConfirmRRQDlg
Class7=CConfirmWRQDlg
Resource7=IDD_PUMPKIN_DIALOG
Class8=CRequestDlg
Class9=CResolver
Class10=CRetrier
Class11=CTrayer
Resource8=IDD_PROPS_SOUNDS
Class12=CPropsSounds
Resource9=IDM_POPUPS
+Class13=CPropsACL
+Class14=CACLTargetCombo
+Resource10=IDD_PROPS_SERVER
[CLS:CPumpKINApp]
Type=0
HeaderFile=PumpKIN.h
ImplementationFile=PumpKIN.cpp
Filter=N
[CLS:CPumpKINDlg]
Type=0
HeaderFile=PumpKINDlg.h
ImplementationFile=PumpKINDlg.cpp
Filter=W
BaseClass=CDialog
VirtualFilter=dWC
-LastObject=ID_HELP
+LastObject=CPumpKINDlg
[CLS:CAboutDlg]
Type=0
HeaderFile=PumpKINDlg.h
ImplementationFile=PumpKINDlg.cpp
Filter=D
BaseClass=CDialog
VirtualFilter=dWC
LastObject=CAboutDlg
[DLG:IDD_ABOUTBOX]
Type=1
Class=CAboutDlg
ControlCount=5
Control1=IDC_STATIC,static,1342177283
Control2=IDC_STATIC,static,1342308480
Control3=IDC_STATIC,static,1342308352
Control4=IDOK,button,1342373889
Control5=IDC_KLEVERNET,button,1342242816
[DLG:IDD_PUMPKIN_DIALOG]
Type=1
Class=CPumpKINDlg
-ControlCount=9
+ControlCount=10
Control1=IDC_CONNECTIONS,SysListView32,1350631681
Control2=IDC_GET,button,1342259200
Control3=IDC_PUT,button,1342259200
Control4=IDC_ABORT,button,1342259200
Control5=IDC_OPTIONS,button,1342259200
Control6=IDC_EXIT,button,1342259200
Control7=ID_HELP,button,1342259200
Control8=IDC_LOG,listbox,1353728129
Control9=IDCANCEL,button,1073741824
+Control10=IDC_LISTENING,button,1342275619
[DLG:IDD_PROPS_SERVER]
Type=1
Class=CPropsServer
-ControlCount=15
+ControlCount=18
Control1=IDC_STATIC,button,1342177287
Control2=IDC_TFTPROOT,edit,1350631552
Control3=IDC_BROWSE,button,1342242880
Control4=IDC_TFTPSUBDIRS,button,1342242819
Control5=IDC_STATIC,button,1342177287
Control6=IDC_RRQ_GIVEALL,button,1342324745
Control7=IDC_RRQ_ALWAYSCONFIRM,button,1342193673
Control8=IDC_RRQ_DENYALL,button,1342193673
Control9=IDC_STATIC,button,1342308359
Control10=IDC_WRQ_TAKEALL,button,1342308361
Control11=IDC_WRQ_PROMPTEXISTING,button,1342177289
Control12=IDC_WRQ_ALWAYSCONFIRM,button,1342177289
Control13=IDC_WRQ_DENYALL,button,1342177289
Control14=IDC_STATIC,static,1342308609
Control15=IDC_PROMPTTIMEOUT,msctls_trackbar32,1342242823
+Control16=IDC_STATIC,button,1342177287
+Control17=IDC_LOGFILE,edit,1350631552
+Control18=IDC_LOGFILE_BROWSE,button,1342242880
[DLG:IDD_PROPS_NETWORK]
Type=1
Class=CPropsNetwork
ControlCount=15
Control1=IDC_STATIC,button,1342177287
Control2=IDC_STATIC,static,1342308354
Control3=IDC_LISTENPORT,edit,1350631552
Control4=IDC_LISTENSPIN,msctls_updown32,1342177463
Control5=IDC_STATIC,static,1342308354
Control6=IDC_SPEAKPORT,edit,1350631552
Control7=IDC_SPEAKSPIN,msctls_updown32,1342177463
Control8=IDC_STATIC,static,1342308352
Control9=IDC_TIMEOUT,edit,1350639744
Control10=IDC_TIMESPIN,msctls_updown32,1342177463
Control11=IDC_STATIC,static,1342308352
Control12=IDC_STATIC,static,1342308352
Control13=IDC_STATIC,static,1342308352
Control14=IDC_BLOCKSIZE,edit,1350639744
Control15=IDC_BSIZESPIN,msctls_updown32,1342177463
[CLS:CPropsServer]
Type=0
HeaderFile=PropsServer.h
ImplementationFile=PropsServer.cpp
BaseClass=CPropertyPage
Filter=D
VirtualFilter=idWC
-LastObject=CPropsServer
+LastObject=IDC_LOGFILE_BROWSE
[CLS:CPropsNetwork]
Type=0
HeaderFile=PropsNetwork.h
ImplementationFile=PropsNetwork.cpp
BaseClass=CPropertyPage
Filter=D
VirtualFilter=idWC
-LastObject=CPropsNetwork
+LastObject=IDC_BLOCKSIZE
[DLG:IDD_CONFIRM_RRQ]
Type=1
Class=CConfirmRRQDlg
ControlCount=9
Control1=IDOK,button,1342242817
Control2=IDCANCEL,button,1342242816
Control3=IDC_STATIC,static,1342308352
Control4=IDC_HOST,static,1350701313
Control5=IDC_STATIC,static,1342308353
Control6=IDC_FILE,static,1350701313
Control7=IDC_STATIC,static,1342177296
Control8=IDC_STATIC,static,1342177283
Control9=IDC_STATIC,static,1342177283
[DLG:IDD_CONFIRM_WRQ]
Type=1
Class=CConfirmWRQDlg
ControlCount=11
Control1=IDOK,button,1342242817
Control2=IDC_RENAME,button,1342242816
Control3=IDCANCEL,button,1342242816
Control4=IDC_STATIC,static,1342308352
Control5=IDC_HOST,static,1350701313
Control6=IDC_STATIC,static,1342308353
Control7=IDC_FILE,static,1350701313
Control8=IDC_STATIC,static,1342177296
Control9=IDC_STATIC,static,1342177283
Control10=IDC_STATIC,static,1342177283
Control11=IDC_RESUME,button,1342242816
[CLS:CConfirmRRQDlg]
Type=0
HeaderFile=ConfirmRRQDlg.h
ImplementationFile=ConfirmRRQDlg.cpp
BaseClass=CDialog
Filter=D
VirtualFilter=dWC
LastObject=CConfirmRRQDlg
[CLS:CConfirmWRQDlg]
Type=0
HeaderFile=ConfirmWRQDlg.h
ImplementationFile=ConfirmWRQDlg.cpp
BaseClass=CDialog
Filter=D
VirtualFilter=dWC
LastObject=IDC_RESUME
[DLG:IDD_REQUEST]
Type=1
Class=CRequestDlg
ControlCount=15
Control1=IDC_STATIC,static,1342308608
Control2=IDC_LOCALFILE,edit,1350631552
Control3=IDC_BROWSE,button,1342242880
Control4=IDC_STATIC,static,1342308608
Control5=IDC_REMOTEFILE,edit,1350631552
Control6=IDC_STATIC,static,1342308608
Control7=IDC_TALKS,combobox,1344341313
Control8=IDC_REFRESH,button,1342271232
Control9=IDC_STATIC,static,1342308352
Control10=IDC_TYPE,combobox,1344356418
Control11=IDC_STATIC,static,1342308352
Control12=IDC_BSIZE,combobox,1344339970
Control13=IDOK,button,1342242817
Control14=IDCANCEL,button,1342242816
Control15=IDC_STATIC,static,1342177297
[CLS:CRequestDlg]
Type=0
HeaderFile=RequestDlg.h
ImplementationFile=RequestDlg.cpp
BaseClass=CDialog
Filter=W
VirtualFilter=dWC
LastObject=CRequestDlg
[CLS:CResolver]
Type=0
HeaderFile=Resolver.h
ImplementationFile=Resolver.cpp
BaseClass=CWnd
Filter=W
LastObject=CResolver
VirtualFilter=WC
[MNU:IDM_POPUPS]
Type=1
Class=CPumpKINDlg
Command1=ID_TRAY_SENDFILE
Command2=ID_TRAY_FETCHFILE
Command3=ID_TRAY_OPTIONS
-Command4=ID_TRAY_SHOWPUMPKINWINDOW
-Command5=ID_TRAY_OPENFILESFOLDER
-Command6=ID_TRAY_HELP
-Command7=ID_TRAY_ABOUTPUMPKIN
-Command8=ID_TRAY_EXIT
-CommandCount=8
+Command4=ID_TRAY_LISTEN
+Command5=ID_TRAY_SHOWPUMPKINWINDOW
+Command6=ID_TRAY_OPENFILESFOLDER
+Command7=ID_TRAY_HELP
+Command8=ID_TRAY_ABOUTPUMPKIN
+Command9=ID_TRAY_EXIT
+CommandCount=9
[CLS:CRetrier]
Type=0
HeaderFile=Retrier.h
ImplementationFile=Retrier.cpp
BaseClass=CWnd
Filter=W
LastObject=CRetrier
VirtualFilter=WC
[CLS:CTrayer]
Type=0
HeaderFile=Trayer.h
ImplementationFile=Trayer.cpp
BaseClass=CWnd
Filter=W
LastObject=CTrayer
VirtualFilter=WC
[DLG:IDD_PROPS_SOUNDS]
Type=1
Class=CPropsSounds
ControlCount=12
Control1=IDC_STATIC,static,1342308352
Control2=IDC_RING,combobox,1344340290
Control3=IDC_RING_BROWSE,button,1342242880
Control4=IDC_RING_PLAY,button,1342242880
Control5=IDC_STATIC,static,1342308352
Control6=IDC_FINISHED,combobox,1344340290
Control7=IDC_FINISHED_BROWSE,button,1342242880
Control8=IDC_FINISHED_PLAY,button,1342242880
Control9=IDC_STATIC,static,1342308352
Control10=IDC_ABORTED,combobox,1344340290
Control11=IDC_ABORTED_BROWSE,button,1342242880
Control12=IDC_ABORTED_PLAY,button,1342242880
[CLS:CPropsSounds]
Type=0
HeaderFile=PropsSounds.h
ImplementationFile=PropsSounds.cpp
BaseClass=CPropertyPage
Filter=D
LastObject=CPropsSounds
VirtualFilter=idWC
+[DLG:IDD_PROPS_ACL]
+Type=1
+Class=CPropsACL
+ControlCount=14
+Control1=IDC_ACL_LIST,SysListView32,1350631425
+Control2=IDC_ACL_UP,button,1342246720
+Control3=IDC_ACL_DOWN,button,1342246720
+Control4=IDC_ACL_REMOVE,button,1342246720
+Control5=IDC_STATIC,static,1342308352
+Control6=IDC_ACL_XFER,combobox,1344339971
+Control7=IDC_STATIC,static,1342308352
+Control8=IDC_ACL_ADDR,edit,1350631552
+Control9=IDC_STATIC,static,1342308352
+Control10=IDC_ACL_NETMASK,edit,1350631552
+Control11=IDC_STATIC,static,1342308352
+Control12=IDC_ACL_RULE,combobox,1344339971
+Control13=IDC_ACL_ADD,button,1342242816
+Control14=IDC_ACL_REPLACE,button,1342242816
+
+[CLS:CPropsACL]
+Type=0
+HeaderFile=PropsACL.h
+ImplementationFile=PropsACL.cpp
+BaseClass=CPropertyPage
+Filter=D
+LastObject=CPropsACL
+VirtualFilter=idWC
+
+[CLS:CACLTargetCombo]
+Type=0
+HeaderFile=ACLTargetCombo.h
+ImplementationFile=ACLTargetCombo.cpp
+BaseClass=CComboBox
+Filter=W
+LastObject=CACLTargetCombo
+
diff --git a/pumpkin.mak b/pumpkin.mak index bd466fe..7d2ec22 100644 --- a/pumpkin.mak +++ b/pumpkin.mak @@ -21,385 +21,401 @@ CFG=Install - Win32 Debug !MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "PumpKIN - Win32 Release" (based on "Win32 (x86) Application")
!MESSAGE "PumpKIN - Win32 Debug" (based on "Win32 (x86) Application")
!MESSAGE "PumpKIN - Win32 Static" (based on "Win32 (x86) Application")
!MESSAGE "Install - Win32 Debug" (based on "Win32 (x86) Application")
!MESSAGE "Install - Win32 Pure" (based on "Win32 (x86) Application")
!MESSAGE "Install - Win32 Static" (based on "Win32 (x86) Application")
!MESSAGE "Install - Win32 Canned" (based on "Win32 (x86) Application")
!MESSAGE
!ERROR An invalid configuration is specified.
!ENDIF
!IF "$(OS)" == "Windows_NT"
NULL=
!ELSE
NULL=nul
!ENDIF
################################################################################
# Begin Project
# PROP Target_Last_Scanned "Install - Win32 Canned"
CPP=cl.exe
RSC=rc.exe
MTL=mktyplib.exe
!IF "$(CFG)" == "PumpKIN - Win32 Release"
# PROP BASE Use_MFC 6
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 6
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
OUTDIR=.\Release
INTDIR=.\Release
# Begin Custom Macros
OutDir=.\Release
TargetName=pumpkin
# End Custom Macros
ALL : "$(OUTDIR)\pumpkin.exe" "$(OUTDIR)\pumpkin.ex_" "$(OUTDIR)\pumpkin.hlp"\
"$(OUTDIR)\pumpkin.cnt" "$(OUTDIR)\pumpkin.hl_" "$(OUTDIR)\pumpkin.cn_"
CLEAN :
+ -@erase "$(INTDIR)\ACLTargetCombo.obj"
-@erase "$(INTDIR)\ConfirmRRQDlg.obj"
-@erase "$(INTDIR)\ConfirmWRQDlg.obj"
+ -@erase "$(INTDIR)\PropsACL.obj"
-@erase "$(INTDIR)\PropsNetwork.obj"
-@erase "$(INTDIR)\PropsServer.obj"
-@erase "$(INTDIR)\PropsSounds.obj"
-@erase "$(INTDIR)\pumpkin.cn_"
-@erase "$(INTDIR)\pumpkin.cnt"
-@erase "$(INTDIR)\pumpkin.hl_"
-@erase "$(INTDIR)\pumpkin.hlp"
-@erase "$(INTDIR)\PumpKIN.obj"
-@erase "$(INTDIR)\pumpkin.pch"
-@erase "$(INTDIR)\pumpkin.res"
-@erase "$(INTDIR)\PumpKINDlg.obj"
-@erase "$(INTDIR)\RequestDlg.obj"
-@erase "$(INTDIR)\Resolver.obj"
-@erase "$(INTDIR)\Retrier.obj"
-@erase "$(INTDIR)\StdAfx.obj"
-@erase "$(INTDIR)\Trayer.obj"
-@erase "$(OUTDIR)\pumpkin.ex_"
-@erase "$(OUTDIR)\pumpkin.exe"
"$(OUTDIR)" :
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
# ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /Yu"stdafx.h" /c
# ADD CPP /nologo /Zp1 /MD /W3 /GX /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /Yu"stdafx.h" /c
CPP_PROJ=/nologo /Zp1 /MD /W3 /GX /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D\
"_AFXDLL" /D "_MBCS" /Fp"$(INTDIR)/pumpkin.pch" /Yu"stdafx.h" /Fo"$(INTDIR)/"\
/c
CPP_OBJS=.\Release/
CPP_SBRS=.\.
# ADD BASE MTL /nologo /D "NDEBUG" /win32
# ADD MTL /nologo /D "NDEBUG" /win32
MTL_PROJ=/nologo /D "NDEBUG" /win32
# ADD BASE RSC /l 0x409 /d "NDEBUG" /d "_AFXDLL"
# ADD RSC /l 0x409 /d "NDEBUG" /d "_AFXDLL"
RSC_PROJ=/l 0x409 /fo"$(INTDIR)/pumpkin.res" /d "NDEBUG" /d "_AFXDLL"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
BSC32_FLAGS=/nologo /o"$(OUTDIR)/pumpkin.bsc"
BSC32_SBRS= \
LINK32=link.exe
# ADD BASE LINK32 /nologo /subsystem:windows /machine:I386
# ADD LINK32 /nologo /subsystem:windows /machine:I386
LINK32_FLAGS=/nologo /subsystem:windows /incremental:no\
/pdb:"$(OUTDIR)/pumpkin.pdb" /machine:I386 /out:"$(OUTDIR)/pumpkin.exe"
LINK32_OBJS= \
+ "$(INTDIR)\ACLTargetCombo.obj" \
"$(INTDIR)\ConfirmRRQDlg.obj" \
"$(INTDIR)\ConfirmWRQDlg.obj" \
+ "$(INTDIR)\PropsACL.obj" \
"$(INTDIR)\PropsNetwork.obj" \
"$(INTDIR)\PropsServer.obj" \
"$(INTDIR)\PropsSounds.obj" \
"$(INTDIR)\PumpKIN.obj" \
"$(INTDIR)\pumpkin.res" \
"$(INTDIR)\PumpKINDlg.obj" \
"$(INTDIR)\RequestDlg.obj" \
"$(INTDIR)\Resolver.obj" \
"$(INTDIR)\Retrier.obj" \
"$(INTDIR)\StdAfx.obj" \
"$(INTDIR)\Trayer.obj"
"$(OUTDIR)\pumpkin.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
$(LINK32) @<<
$(LINK32_FLAGS) $(LINK32_OBJS)
<<
# Begin Custom Build
OutDir=.\Release
TargetName=pumpkin
InputPath=.\Release\pumpkin.exe
SOURCE=$(InputPath)
"$(OutDir)\$(TargetName).ex_" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
compress $(OutDir)\$(TargetName).exe $(OutDir)\$(TargetName).ex_
# End Custom Build
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug"
# PROP BASE Use_MFC 6
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 6
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
OUTDIR=.\Debug
INTDIR=.\Debug
# Begin Custom Macros
OutDir=.\Debug
TargetName=pumpkin
# End Custom Macros
ALL : "$(OUTDIR)\pumpkin.exe" "$(OUTDIR)\pumpkin.bsc" "$(OUTDIR)\pumpkin.ex_"\
"$(OUTDIR)\pumpkin.hlp" "$(OUTDIR)\pumpkin.cnt" "$(OUTDIR)\pumpkin.hl_"\
"$(OUTDIR)\pumpkin.cn_"
CLEAN :
+ -@erase "$(INTDIR)\ACLTargetCombo.obj"
+ -@erase "$(INTDIR)\ACLTargetCombo.sbr"
-@erase "$(INTDIR)\ConfirmRRQDlg.obj"
-@erase "$(INTDIR)\ConfirmRRQDlg.sbr"
-@erase "$(INTDIR)\ConfirmWRQDlg.obj"
-@erase "$(INTDIR)\ConfirmWRQDlg.sbr"
+ -@erase "$(INTDIR)\PropsACL.obj"
+ -@erase "$(INTDIR)\PropsACL.sbr"
-@erase "$(INTDIR)\PropsNetwork.obj"
-@erase "$(INTDIR)\PropsNetwork.sbr"
-@erase "$(INTDIR)\PropsServer.obj"
-@erase "$(INTDIR)\PropsServer.sbr"
-@erase "$(INTDIR)\PropsSounds.obj"
-@erase "$(INTDIR)\PropsSounds.sbr"
-@erase "$(INTDIR)\pumpkin.cn_"
-@erase "$(INTDIR)\pumpkin.cnt"
-@erase "$(INTDIR)\pumpkin.hl_"
-@erase "$(INTDIR)\pumpkin.hlp"
-@erase "$(INTDIR)\PumpKIN.obj"
-@erase "$(INTDIR)\pumpkin.pch"
-@erase "$(INTDIR)\pumpkin.res"
-@erase "$(INTDIR)\PumpKIN.sbr"
-@erase "$(INTDIR)\PumpKINDlg.obj"
-@erase "$(INTDIR)\PumpKINDlg.sbr"
-@erase "$(INTDIR)\RequestDlg.obj"
-@erase "$(INTDIR)\RequestDlg.sbr"
-@erase "$(INTDIR)\Resolver.obj"
-@erase "$(INTDIR)\Resolver.sbr"
-@erase "$(INTDIR)\Retrier.obj"
-@erase "$(INTDIR)\Retrier.sbr"
-@erase "$(INTDIR)\StdAfx.obj"
-@erase "$(INTDIR)\StdAfx.sbr"
-@erase "$(INTDIR)\Trayer.obj"
-@erase "$(INTDIR)\Trayer.sbr"
-@erase "$(INTDIR)\vc40.idb"
-@erase "$(INTDIR)\vc40.pdb"
-@erase "$(OUTDIR)\pumpkin.bsc"
-@erase "$(OUTDIR)\pumpkin.ex_"
-@erase "$(OUTDIR)\pumpkin.exe"
-@erase "$(OUTDIR)\pumpkin.ilk"
-@erase "$(OUTDIR)\pumpkin.pdb"
"$(OUTDIR)" :
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /Yu"stdafx.h" /c
# ADD CPP /nologo /Zp1 /MDd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /FR /Yu"stdafx.h" /c
CPP_PROJ=/nologo /Zp1 /MDd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D\
"_WINDOWS" /D "_AFXDLL" /D "_MBCS" /FR"$(INTDIR)/" /Fp"$(INTDIR)/pumpkin.pch"\
/Yu"stdafx.h" /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c
CPP_OBJS=.\Debug/
CPP_SBRS=.\Debug/
# ADD BASE MTL /nologo /D "_DEBUG" /win32
# ADD MTL /nologo /D "_DEBUG" /win32
MTL_PROJ=/nologo /D "_DEBUG" /win32
# ADD BASE RSC /l 0x409 /d "_DEBUG" /d "_AFXDLL"
# ADD RSC /l 0x409 /d "_DEBUG" /d "_AFXDLL"
RSC_PROJ=/l 0x409 /fo"$(INTDIR)/pumpkin.res" /d "_DEBUG" /d "_AFXDLL"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
BSC32_FLAGS=/nologo /o"$(OUTDIR)/pumpkin.bsc"
BSC32_SBRS= \
+ "$(INTDIR)\ACLTargetCombo.sbr" \
"$(INTDIR)\ConfirmRRQDlg.sbr" \
"$(INTDIR)\ConfirmWRQDlg.sbr" \
+ "$(INTDIR)\PropsACL.sbr" \
"$(INTDIR)\PropsNetwork.sbr" \
"$(INTDIR)\PropsServer.sbr" \
"$(INTDIR)\PropsSounds.sbr" \
"$(INTDIR)\PumpKIN.sbr" \
"$(INTDIR)\PumpKINDlg.sbr" \
"$(INTDIR)\RequestDlg.sbr" \
"$(INTDIR)\Resolver.sbr" \
"$(INTDIR)\Retrier.sbr" \
"$(INTDIR)\StdAfx.sbr" \
"$(INTDIR)\Trayer.sbr"
"$(OUTDIR)\pumpkin.bsc" : "$(OUTDIR)" $(BSC32_SBRS)
$(BSC32) @<<
$(BSC32_FLAGS) $(BSC32_SBRS)
<<
LINK32=link.exe
# ADD BASE LINK32 /nologo /subsystem:windows /debug /machine:I386
# ADD LINK32 /nologo /subsystem:windows /debug /machine:I386
LINK32_FLAGS=/nologo /subsystem:windows /incremental:yes\
/pdb:"$(OUTDIR)/pumpkin.pdb" /debug /machine:I386 /out:"$(OUTDIR)/pumpkin.exe"
LINK32_OBJS= \
+ "$(INTDIR)\ACLTargetCombo.obj" \
"$(INTDIR)\ConfirmRRQDlg.obj" \
"$(INTDIR)\ConfirmWRQDlg.obj" \
+ "$(INTDIR)\PropsACL.obj" \
"$(INTDIR)\PropsNetwork.obj" \
"$(INTDIR)\PropsServer.obj" \
"$(INTDIR)\PropsSounds.obj" \
"$(INTDIR)\PumpKIN.obj" \
"$(INTDIR)\pumpkin.res" \
"$(INTDIR)\PumpKINDlg.obj" \
"$(INTDIR)\RequestDlg.obj" \
"$(INTDIR)\Resolver.obj" \
"$(INTDIR)\Retrier.obj" \
"$(INTDIR)\StdAfx.obj" \
"$(INTDIR)\Trayer.obj"
"$(OUTDIR)\pumpkin.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
$(LINK32) @<<
$(LINK32_FLAGS) $(LINK32_OBJS)
<<
# Begin Custom Build
OutDir=.\Debug
TargetName=pumpkin
InputPath=.\Debug\pumpkin.exe
SOURCE=$(InputPath)
"$(OutDir)\$(TargetName).ex_" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
compress $(OutDir)\$(TargetName).exe $(OutDir)\$(TargetName).ex_
# End Custom Build
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Static"
# PROP BASE Use_MFC 6
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "PumpKIN_"
# PROP BASE Intermediate_Dir "PumpKIN_"
# PROP BASE Target_Dir ""
# PROP Use_MFC 5
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Releast"
# PROP Intermediate_Dir "Releast"
# PROP Target_Dir ""
OUTDIR=.\Releast
INTDIR=.\Releast
# Begin Custom Macros
OutDir=.\Releast
TargetName=pumpkin
# End Custom Macros
ALL : "$(OUTDIR)\pumpkin.exe" "$(OUTDIR)\pumpkin.ex_" "$(OUTDIR)\pumpkin.hlp"\
"$(OUTDIR)\pumpkin.cnt" "$(OUTDIR)\pumpkin.hl_" "$(OUTDIR)\pumpkin.cn_"
CLEAN :
+ -@erase "$(INTDIR)\ACLTargetCombo.obj"
-@erase "$(INTDIR)\ConfirmRRQDlg.obj"
-@erase "$(INTDIR)\ConfirmWRQDlg.obj"
+ -@erase "$(INTDIR)\PropsACL.obj"
-@erase "$(INTDIR)\PropsNetwork.obj"
-@erase "$(INTDIR)\PropsServer.obj"
-@erase "$(INTDIR)\PropsSounds.obj"
-@erase "$(INTDIR)\pumpkin.cn_"
-@erase "$(INTDIR)\pumpkin.cnt"
-@erase "$(INTDIR)\pumpkin.hl_"
-@erase "$(INTDIR)\pumpkin.hlp"
-@erase "$(INTDIR)\PumpKIN.obj"
-@erase "$(INTDIR)\pumpkin.pch"
-@erase "$(INTDIR)\pumpkin.res"
-@erase "$(INTDIR)\PumpKINDlg.obj"
-@erase "$(INTDIR)\RequestDlg.obj"
-@erase "$(INTDIR)\Resolver.obj"
-@erase "$(INTDIR)\Retrier.obj"
-@erase "$(INTDIR)\StdAfx.obj"
-@erase "$(INTDIR)\Trayer.obj"
-@erase "$(OUTDIR)\pumpkin.ex_"
-@erase "$(OUTDIR)\pumpkin.exe"
"$(OUTDIR)" :
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
# ADD BASE CPP /nologo /Zp1 /MD /W3 /GX /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /Yu"stdafx.h" /c
# ADD CPP /nologo /Zp1 /MT /W3 /GX /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /c
CPP_PROJ=/nologo /Zp1 /MT /W3 /GX /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D\
"_MBCS" /Fp"$(INTDIR)/pumpkin.pch" /Yu"stdafx.h" /Fo"$(INTDIR)/" /c
CPP_OBJS=.\Releast/
CPP_SBRS=.\.
# ADD BASE MTL /nologo /D "NDEBUG" /win32
# ADD MTL /nologo /D "NDEBUG" /win32
MTL_PROJ=/nologo /D "NDEBUG" /win32
# ADD BASE RSC /l 0x409 /d "NDEBUG" /d "_AFXDLL"
# ADD RSC /l 0x409 /d "NDEBUG"
RSC_PROJ=/l 0x409 /fo"$(INTDIR)/pumpkin.res" /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
BSC32_FLAGS=/nologo /o"$(OUTDIR)/pumpkin.bsc"
BSC32_SBRS= \
LINK32=link.exe
# ADD BASE LINK32 /nologo /subsystem:windows /machine:I386
# ADD LINK32 /nologo /subsystem:windows /machine:I386
LINK32_FLAGS=/nologo /subsystem:windows /incremental:no\
/pdb:"$(OUTDIR)/pumpkin.pdb" /machine:I386 /out:"$(OUTDIR)/pumpkin.exe"
LINK32_OBJS= \
+ "$(INTDIR)\ACLTargetCombo.obj" \
"$(INTDIR)\ConfirmRRQDlg.obj" \
"$(INTDIR)\ConfirmWRQDlg.obj" \
+ "$(INTDIR)\PropsACL.obj" \
"$(INTDIR)\PropsNetwork.obj" \
"$(INTDIR)\PropsServer.obj" \
"$(INTDIR)\PropsSounds.obj" \
"$(INTDIR)\PumpKIN.obj" \
"$(INTDIR)\pumpkin.res" \
"$(INTDIR)\PumpKINDlg.obj" \
"$(INTDIR)\RequestDlg.obj" \
"$(INTDIR)\Resolver.obj" \
"$(INTDIR)\Retrier.obj" \
"$(INTDIR)\StdAfx.obj" \
"$(INTDIR)\Trayer.obj"
"$(OUTDIR)\pumpkin.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
$(LINK32) @<<
$(LINK32_FLAGS) $(LINK32_OBJS)
<<
# Begin Custom Build
OutDir=.\Releast
TargetName=pumpkin
InputPath=.\Releast\pumpkin.exe
SOURCE=$(InputPath)
"$(OutDir)\$(TargetName).ex_" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
compress $(OutDir)\$(TargetName).exe $(OutDir)\$(TargetName).ex_
# End Custom Build
!ELSEIF "$(CFG)" == "Install - Win32 Debug"
# PROP BASE Use_MFC 2
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Install\Debug"
# PROP BASE Intermediate_Dir "Install\Debug"
# PROP BASE Target_Dir "Install"
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Install\Debug"
# PROP Intermediate_Dir "Install\Debug"
# PROP Target_Dir "Install"
OUTDIR=.\Install\Debug
INTDIR=.\Install\Debug
ALL : "$(OUTDIR)\Install.exe"
CLEAN :
-@erase "$(INTDIR)\install.obj"
-@erase "$(INTDIR)\Install.res"
@@ -625,254 +641,308 @@ LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ LINK32_OBJS= \
"$(INTDIR)\install.obj" \
"$(INTDIR)\Install.res"
"$(OUTDIR)\Install.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
$(LINK32) @<<
$(LINK32_FLAGS) $(LINK32_OBJS)
<<
!ENDIF
.c{$(CPP_OBJS)}.obj:
$(CPP) $(CPP_PROJ) $<
.cpp{$(CPP_OBJS)}.obj:
$(CPP) $(CPP_PROJ) $<
.cxx{$(CPP_OBJS)}.obj:
$(CPP) $(CPP_PROJ) $<
.c{$(CPP_SBRS)}.sbr:
$(CPP) $(CPP_PROJ) $<
.cpp{$(CPP_SBRS)}.sbr:
$(CPP) $(CPP_PROJ) $<
.cxx{$(CPP_SBRS)}.sbr:
$(CPP) $(CPP_PROJ) $<
################################################################################
# Begin Target
# Name "PumpKIN - Win32 Release"
# Name "PumpKIN - Win32 Debug"
# Name "PumpKIN - Win32 Static"
!IF "$(CFG)" == "PumpKIN - Win32 Release"
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug"
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Static"
!ENDIF
################################################################################
# Begin Source File
SOURCE=.\PumpKIN.cpp
+
+!IF "$(CFG)" == "PumpKIN - Win32 Release"
+
DEP_CPP_PUMPK=\
- ".\PumpKIN.h"\
+ ".\pumpkin.h"\
".\PumpKINDlg.h"\
".\shared-code\BellsNWhistles.h"\
".\shared-code\kHelpers.h"\
".\stdafx.h"\
-!IF "$(CFG)" == "PumpKIN - Win32 Release"
-
-
"$(INTDIR)\PumpKIN.obj" : $(SOURCE) $(DEP_CPP_PUMPK) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug"
+DEP_CPP_PUMPK=\
+ ".\pumpkin.h"\
+ ".\PumpKINDlg.h"\
+ ".\shared-code\kHelpers.h"\
+ ".\stdafx.h"\
+
"$(INTDIR)\PumpKIN.obj" : $(SOURCE) $(DEP_CPP_PUMPK) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
"$(INTDIR)\PumpKIN.sbr" : $(SOURCE) $(DEP_CPP_PUMPK) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Static"
+DEP_CPP_PUMPK=\
+ ".\pumpkin.h"\
+ ".\PumpKINDlg.h"\
+ ".\shared-code\BellsNWhistles.h"\
+ ".\shared-code\kHelpers.h"\
+ ".\stdafx.h"\
+
"$(INTDIR)\PumpKIN.obj" : $(SOURCE) $(DEP_CPP_PUMPK) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ENDIF
# End Source File
################################################################################
# Begin Source File
SOURCE=.\PumpKINDlg.cpp
+
+!IF "$(CFG)" == "PumpKIN - Win32 Release"
+
DEP_CPP_PUMPKI=\
+ ".\ACLTargetCombo.h"\
".\ConfirmRRQDlg.h"\
".\ConfirmWRQDlg.h"\
+ ".\PropsACL.h"\
".\PropsNetwork.h"\
".\PropsServer.h"\
".\PropsSounds.h"\
- ".\PumpKIN.h"\
+ ".\pumpkin.h"\
".\PumpKINDlg.h"\
".\RequestDlg.h"\
".\Resolver.h"\
".\Retrier.h"\
".\shared-code\BellsNWhistles.h"\
".\shared-code\kHelpers.h"\
".\stdafx.h"\
".\Trayer.h"\
-!IF "$(CFG)" == "PumpKIN - Win32 Release"
-
-
"$(INTDIR)\PumpKINDlg.obj" : $(SOURCE) $(DEP_CPP_PUMPKI) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug"
+DEP_CPP_PUMPKI=\
+ ".\ACLTargetCombo.h"\
+ ".\ConfirmRRQDlg.h"\
+ ".\ConfirmWRQDlg.h"\
+ ".\PropsACL.h"\
+ ".\PropsNetwork.h"\
+ ".\PropsServer.h"\
+ ".\PropsSounds.h"\
+ ".\pumpkin.h"\
+ ".\PumpKINDlg.h"\
+ ".\RequestDlg.h"\
+ ".\Resolver.h"\
+ ".\Retrier.h"\
+ ".\shared-code\BellsNWhistles.h"\
+ ".\shared-code\kHelpers.h"\
+ ".\stdafx.h"\
+ ".\Trayer.h"\
+
"$(INTDIR)\PumpKINDlg.obj" : $(SOURCE) $(DEP_CPP_PUMPKI) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
"$(INTDIR)\PumpKINDlg.sbr" : $(SOURCE) $(DEP_CPP_PUMPKI) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Static"
+DEP_CPP_PUMPKI=\
+ ".\ACLTargetCombo.h"\
+ ".\ConfirmRRQDlg.h"\
+ ".\ConfirmWRQDlg.h"\
+ ".\PropsACL.h"\
+ ".\PropsNetwork.h"\
+ ".\PropsServer.h"\
+ ".\PropsSounds.h"\
+ ".\pumpkin.h"\
+ ".\PumpKINDlg.h"\
+ ".\RequestDlg.h"\
+ ".\Resolver.h"\
+ ".\Retrier.h"\
+ ".\shared-code\BellsNWhistles.h"\
+ ".\shared-code\kHelpers.h"\
+ ".\stdafx.h"\
+ ".\Trayer.h"\
+
"$(INTDIR)\PumpKINDlg.obj" : $(SOURCE) $(DEP_CPP_PUMPKI) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ENDIF
# End Source File
################################################################################
# Begin Source File
SOURCE=.\StdAfx.cpp
DEP_CPP_STDAF=\
".\shared-code\BellsNWhistles.h"\
".\shared-code\kHelpers.h"\
".\stdafx.h"\
!IF "$(CFG)" == "PumpKIN - Win32 Release"
# ADD CPP /Yc"stdafx.h"
BuildCmds= \
$(CPP) /nologo /Zp1 /MD /W3 /GX /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D\
"_AFXDLL" /D "_MBCS" /Fp"$(INTDIR)/pumpkin.pch" /Yc"stdafx.h" /Fo"$(INTDIR)/"\
/c $(SOURCE) \
"$(INTDIR)\StdAfx.obj" : $(SOURCE) $(DEP_CPP_STDAF) "$(INTDIR)"
$(BuildCmds)
"$(INTDIR)\pumpkin.pch" : $(SOURCE) $(DEP_CPP_STDAF) "$(INTDIR)"
$(BuildCmds)
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug"
# ADD CPP /Yc"stdafx.h"
BuildCmds= \
$(CPP) /nologo /Zp1 /MDd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D\
"_WINDOWS" /D "_AFXDLL" /D "_MBCS" /FR"$(INTDIR)/" /Fp"$(INTDIR)/pumpkin.pch"\
/Yc"stdafx.h" /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE) \
"$(INTDIR)\StdAfx.obj" : $(SOURCE) $(DEP_CPP_STDAF) "$(INTDIR)"
$(BuildCmds)
"$(INTDIR)\StdAfx.sbr" : $(SOURCE) $(DEP_CPP_STDAF) "$(INTDIR)"
$(BuildCmds)
"$(INTDIR)\pumpkin.pch" : $(SOURCE) $(DEP_CPP_STDAF) "$(INTDIR)"
$(BuildCmds)
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Static"
# ADD BASE CPP /Yc"stdafx.h"
# ADD CPP /Yc"stdafx.h"
BuildCmds= \
$(CPP) /nologo /Zp1 /MT /W3 /GX /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D\
"_MBCS" /Fp"$(INTDIR)/pumpkin.pch" /Yc"stdafx.h" /Fo"$(INTDIR)/" /c $(SOURCE) \
"$(INTDIR)\StdAfx.obj" : $(SOURCE) $(DEP_CPP_STDAF) "$(INTDIR)"
$(BuildCmds)
"$(INTDIR)\pumpkin.pch" : $(SOURCE) $(DEP_CPP_STDAF) "$(INTDIR)"
$(BuildCmds)
!ENDIF
# End Source File
################################################################################
# Begin Source File
SOURCE=.\pumpkin.rc
DEP_RSC_PUMPKIN=\
+ ".\res\down.ico"\
".\res\failed.wav"\
".\res\finished.wav"\
".\res\PumpKIN.ico"\
".\res\pumpkin.rc2"\
+ ".\res\remove.ico"\
".\res\ring.wav"\
".\res\rrq.ico"\
+ ".\res\up.ico"\
".\res\wrq.ico"\
".\shared-data\browse-icon.ico"\
".\shared-data\klever-background.bmp"\
".\shared-data\play-icon.ico"\
!IF "$(CFG)" == "PumpKIN - Win32 Release"
"$(INTDIR)\pumpkin.res" : $(SOURCE) $(DEP_RSC_PUMPKIN) "$(INTDIR)"
$(RSC) $(RSC_PROJ) $(SOURCE)
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug"
"$(INTDIR)\pumpkin.res" : $(SOURCE) $(DEP_RSC_PUMPKIN) "$(INTDIR)"
$(RSC) $(RSC_PROJ) $(SOURCE)
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Static"
"$(INTDIR)\pumpkin.res" : $(SOURCE) $(DEP_RSC_PUMPKIN) "$(INTDIR)"
$(RSC) $(RSC_PROJ) $(SOURCE)
!ENDIF
# End Source File
################################################################################
# Begin Source File
SOURCE=.\help\pumpkin.hpj
!IF "$(CFG)" == "PumpKIN - Win32 Release"
# Begin Custom Build - Making help files...
OutDir=.\Release
ProjDir=.
TargetName=pumpkin
InputPath=.\help\pumpkin.hpj
BuildCmds= \
"$(ProjDir)\makehelp.bat" \
compress $(OutDir)\$(TargetName).hlp $(OutDir)\$(TargetName).hl_ \
compress $(OutDir)\$(TargetName).cnt $(OutDir)\$(TargetName).cn_ \
@@ -906,469 +976,685 @@ BuildCmds= \ "$(OutDir)\$(TargetName).hlp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
$(BuildCmds)
"$(OutDir)\$(TargetName).cnt" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
$(BuildCmds)
"$(OutDir)\$(TargetName).hl_" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
$(BuildCmds)
"$(OutDir)\$(TargetName).cn_" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
$(BuildCmds)
# End Custom Build
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Static"
# Begin Custom Build - Making help files...
OutDir=.\Releast
ProjDir=.
TargetName=pumpkin
InputPath=.\help\pumpkin.hpj
BuildCmds= \
"$(ProjDir)\makehelp.bat" \
compress $(OutDir)\$(TargetName).hlp $(OutDir)\$(TargetName).hl_ \
compress $(OutDir)\$(TargetName).cnt $(OutDir)\$(TargetName).cn_ \
"$(OutDir)\$(TargetName).hlp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
$(BuildCmds)
"$(OutDir)\$(TargetName).cnt" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
$(BuildCmds)
"$(OutDir)\$(TargetName).hl_" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
$(BuildCmds)
"$(OutDir)\$(TargetName).cn_" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
$(BuildCmds)
# End Custom Build
!ENDIF
# End Source File
################################################################################
# Begin Source File
SOURCE=.\PropsServer.cpp
+
+!IF "$(CFG)" == "PumpKIN - Win32 Release"
+
DEP_CPP_PROPS=\
".\PropsServer.h"\
- ".\PumpKIN.h"\
+ ".\pumpkin.h"\
".\shared-code\BellsNWhistles.h"\
".\shared-code\kHelpers.h"\
".\stdafx.h"\
-!IF "$(CFG)" == "PumpKIN - Win32 Release"
-
-
"$(INTDIR)\PropsServer.obj" : $(SOURCE) $(DEP_CPP_PROPS) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug"
+DEP_CPP_PROPS=\
+ ".\PropsServer.h"\
+ ".\pumpkin.h"\
+ ".\shared-code\kHelpers.h"\
+ ".\stdafx.h"\
+
"$(INTDIR)\PropsServer.obj" : $(SOURCE) $(DEP_CPP_PROPS) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
"$(INTDIR)\PropsServer.sbr" : $(SOURCE) $(DEP_CPP_PROPS) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Static"
+DEP_CPP_PROPS=\
+ ".\PropsServer.h"\
+ ".\pumpkin.h"\
+ ".\shared-code\BellsNWhistles.h"\
+ ".\shared-code\kHelpers.h"\
+ ".\stdafx.h"\
+
"$(INTDIR)\PropsServer.obj" : $(SOURCE) $(DEP_CPP_PROPS) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ENDIF
# End Source File
################################################################################
# Begin Source File
SOURCE=.\PropsNetwork.cpp
DEP_CPP_PROPSN=\
".\PropsNetwork.h"\
- ".\PumpKIN.h"\
+ ".\pumpkin.h"\
".\shared-code\BellsNWhistles.h"\
".\shared-code\kHelpers.h"\
".\stdafx.h"\
!IF "$(CFG)" == "PumpKIN - Win32 Release"
"$(INTDIR)\PropsNetwork.obj" : $(SOURCE) $(DEP_CPP_PROPSN) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug"
"$(INTDIR)\PropsNetwork.obj" : $(SOURCE) $(DEP_CPP_PROPSN) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
"$(INTDIR)\PropsNetwork.sbr" : $(SOURCE) $(DEP_CPP_PROPSN) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Static"
"$(INTDIR)\PropsNetwork.obj" : $(SOURCE) $(DEP_CPP_PROPSN) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ENDIF
# End Source File
################################################################################
# Begin Source File
SOURCE=.\ConfirmRRQDlg.cpp
+
+!IF "$(CFG)" == "PumpKIN - Win32 Release"
+
DEP_CPP_CONFI=\
".\ConfirmRRQDlg.h"\
- ".\PumpKIN.h"\
+ ".\pumpkin.h"\
".\PumpKINDlg.h"\
".\shared-code\BellsNWhistles.h"\
".\shared-code\kHelpers.h"\
".\stdafx.h"\
-!IF "$(CFG)" == "PumpKIN - Win32 Release"
-
-
"$(INTDIR)\ConfirmRRQDlg.obj" : $(SOURCE) $(DEP_CPP_CONFI) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug"
+DEP_CPP_CONFI=\
+ ".\ConfirmRRQDlg.h"\
+ ".\pumpkin.h"\
+ ".\PumpKINDlg.h"\
+ ".\shared-code\kHelpers.h"\
+ ".\stdafx.h"\
+
"$(INTDIR)\ConfirmRRQDlg.obj" : $(SOURCE) $(DEP_CPP_CONFI) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
"$(INTDIR)\ConfirmRRQDlg.sbr" : $(SOURCE) $(DEP_CPP_CONFI) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Static"
+DEP_CPP_CONFI=\
+ ".\ConfirmRRQDlg.h"\
+ ".\pumpkin.h"\
+ ".\PumpKINDlg.h"\
+ ".\shared-code\BellsNWhistles.h"\
+ ".\shared-code\kHelpers.h"\
+ ".\stdafx.h"\
+
"$(INTDIR)\ConfirmRRQDlg.obj" : $(SOURCE) $(DEP_CPP_CONFI) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ENDIF
# End Source File
################################################################################
# Begin Source File
SOURCE=.\ConfirmWRQDlg.cpp
+
+!IF "$(CFG)" == "PumpKIN - Win32 Release"
+
DEP_CPP_CONFIR=\
".\ConfirmWRQDlg.h"\
- ".\PumpKIN.h"\
+ ".\pumpkin.h"\
".\PumpKINDlg.h"\
".\shared-code\BellsNWhistles.h"\
".\shared-code\kHelpers.h"\
".\stdafx.h"\
-!IF "$(CFG)" == "PumpKIN - Win32 Release"
-
-
"$(INTDIR)\ConfirmWRQDlg.obj" : $(SOURCE) $(DEP_CPP_CONFIR) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug"
+DEP_CPP_CONFIR=\
+ ".\ConfirmWRQDlg.h"\
+ ".\pumpkin.h"\
+ ".\PumpKINDlg.h"\
+ ".\shared-code\kHelpers.h"\
+ ".\stdafx.h"\
+
"$(INTDIR)\ConfirmWRQDlg.obj" : $(SOURCE) $(DEP_CPP_CONFIR) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
"$(INTDIR)\ConfirmWRQDlg.sbr" : $(SOURCE) $(DEP_CPP_CONFIR) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Static"
+DEP_CPP_CONFIR=\
+ ".\ConfirmWRQDlg.h"\
+ ".\pumpkin.h"\
+ ".\PumpKINDlg.h"\
+ ".\shared-code\BellsNWhistles.h"\
+ ".\shared-code\kHelpers.h"\
+ ".\stdafx.h"\
+
"$(INTDIR)\ConfirmWRQDlg.obj" : $(SOURCE) $(DEP_CPP_CONFIR) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ENDIF
# End Source File
################################################################################
# Begin Source File
SOURCE=.\RequestDlg.cpp
DEP_CPP_REQUE=\
- ".\PumpKIN.h"\
+ ".\pumpkin.h"\
".\RequestDlg.h"\
".\shared-code\BellsNWhistles.h"\
".\shared-code\kHelpers.h"\
".\stdafx.h"\
!IF "$(CFG)" == "PumpKIN - Win32 Release"
"$(INTDIR)\RequestDlg.obj" : $(SOURCE) $(DEP_CPP_REQUE) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug"
"$(INTDIR)\RequestDlg.obj" : $(SOURCE) $(DEP_CPP_REQUE) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
"$(INTDIR)\RequestDlg.sbr" : $(SOURCE) $(DEP_CPP_REQUE) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Static"
"$(INTDIR)\RequestDlg.obj" : $(SOURCE) $(DEP_CPP_REQUE) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ENDIF
# End Source File
################################################################################
# Begin Source File
SOURCE=.\Resolver.cpp
+
+!IF "$(CFG)" == "PumpKIN - Win32 Release"
+
DEP_CPP_RESOL=\
- ".\PumpKIN.h"\
+ ".\pumpkin.h"\
".\PumpKINDlg.h"\
".\Resolver.h"\
".\shared-code\BellsNWhistles.h"\
".\shared-code\kHelpers.h"\
".\stdafx.h"\
-!IF "$(CFG)" == "PumpKIN - Win32 Release"
-
-
"$(INTDIR)\Resolver.obj" : $(SOURCE) $(DEP_CPP_RESOL) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug"
+DEP_CPP_RESOL=\
+ ".\pumpkin.h"\
+ ".\PumpKINDlg.h"\
+ ".\Resolver.h"\
+ ".\shared-code\kHelpers.h"\
+ ".\stdafx.h"\
+
"$(INTDIR)\Resolver.obj" : $(SOURCE) $(DEP_CPP_RESOL) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
"$(INTDIR)\Resolver.sbr" : $(SOURCE) $(DEP_CPP_RESOL) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Static"
+DEP_CPP_RESOL=\
+ ".\pumpkin.h"\
+ ".\PumpKINDlg.h"\
+ ".\Resolver.h"\
+ ".\shared-code\BellsNWhistles.h"\
+ ".\shared-code\kHelpers.h"\
+ ".\stdafx.h"\
+
"$(INTDIR)\Resolver.obj" : $(SOURCE) $(DEP_CPP_RESOL) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ENDIF
# End Source File
################################################################################
# Begin Source File
SOURCE=.\Retrier.cpp
+
+!IF "$(CFG)" == "PumpKIN - Win32 Release"
+
DEP_CPP_RETRI=\
- ".\PumpKIN.h"\
+ ".\pumpkin.h"\
".\PumpKINDlg.h"\
".\Retrier.h"\
".\shared-code\BellsNWhistles.h"\
".\shared-code\kHelpers.h"\
".\stdafx.h"\
-!IF "$(CFG)" == "PumpKIN - Win32 Release"
-
-
"$(INTDIR)\Retrier.obj" : $(SOURCE) $(DEP_CPP_RETRI) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug"
+DEP_CPP_RETRI=\
+ ".\pumpkin.h"\
+ ".\PumpKINDlg.h"\
+ ".\Retrier.h"\
+ ".\shared-code\kHelpers.h"\
+ ".\stdafx.h"\
+
"$(INTDIR)\Retrier.obj" : $(SOURCE) $(DEP_CPP_RETRI) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
"$(INTDIR)\Retrier.sbr" : $(SOURCE) $(DEP_CPP_RETRI) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Static"
+DEP_CPP_RETRI=\
+ ".\pumpkin.h"\
+ ".\PumpKINDlg.h"\
+ ".\Retrier.h"\
+ ".\shared-code\BellsNWhistles.h"\
+ ".\shared-code\kHelpers.h"\
+ ".\stdafx.h"\
+
"$(INTDIR)\Retrier.obj" : $(SOURCE) $(DEP_CPP_RETRI) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ENDIF
# End Source File
################################################################################
# Begin Source File
SOURCE=.\Trayer.cpp
+
+!IF "$(CFG)" == "PumpKIN - Win32 Release"
+
DEP_CPP_TRAYE=\
- ".\PumpKIN.h"\
+ ".\pumpkin.h"\
".\PumpKINDlg.h"\
".\shared-code\BellsNWhistles.h"\
".\shared-code\kHelpers.h"\
".\stdafx.h"\
".\Trayer.h"\
-!IF "$(CFG)" == "PumpKIN - Win32 Release"
-
-
"$(INTDIR)\Trayer.obj" : $(SOURCE) $(DEP_CPP_TRAYE) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug"
+DEP_CPP_TRAYE=\
+ ".\pumpkin.h"\
+ ".\PumpKINDlg.h"\
+ ".\shared-code\kHelpers.h"\
+ ".\stdafx.h"\
+ ".\Trayer.h"\
+
"$(INTDIR)\Trayer.obj" : $(SOURCE) $(DEP_CPP_TRAYE) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
"$(INTDIR)\Trayer.sbr" : $(SOURCE) $(DEP_CPP_TRAYE) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Static"
+DEP_CPP_TRAYE=\
+ ".\pumpkin.h"\
+ ".\PumpKINDlg.h"\
+ ".\shared-code\BellsNWhistles.h"\
+ ".\shared-code\kHelpers.h"\
+ ".\stdafx.h"\
+ ".\Trayer.h"\
+
"$(INTDIR)\Trayer.obj" : $(SOURCE) $(DEP_CPP_TRAYE) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ENDIF
# End Source File
################################################################################
# Begin Source File
SOURCE=.\help\pumpkin.cnt
!IF "$(CFG)" == "PumpKIN - Win32 Release"
# PROP Exclude_From_Build 1
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug"
# PROP Exclude_From_Build 1
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Static"
# PROP Exclude_From_Build 1
!ENDIF
# End Source File
################################################################################
# Begin Source File
SOURCE=.\PropsSounds.cpp
+
+!IF "$(CFG)" == "PumpKIN - Win32 Release"
+
DEP_CPP_PROPSS=\
".\PropsSounds.h"\
- ".\PumpKIN.h"\
+ ".\pumpkin.h"\
".\PumpKINDlg.h"\
".\shared-code\BellsNWhistles.h"\
".\shared-code\kHelpers.h"\
".\stdafx.h"\
-!IF "$(CFG)" == "PumpKIN - Win32 Release"
-
-
"$(INTDIR)\PropsSounds.obj" : $(SOURCE) $(DEP_CPP_PROPSS) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug"
+DEP_CPP_PROPSS=\
+ ".\PropsSounds.h"\
+ ".\pumpkin.h"\
+ ".\PumpKINDlg.h"\
+ ".\shared-code\kHelpers.h"\
+ ".\stdafx.h"\
+
"$(INTDIR)\PropsSounds.obj" : $(SOURCE) $(DEP_CPP_PROPSS) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
"$(INTDIR)\PropsSounds.sbr" : $(SOURCE) $(DEP_CPP_PROPSS) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ELSEIF "$(CFG)" == "PumpKIN - Win32 Static"
+DEP_CPP_PROPSS=\
+ ".\PropsSounds.h"\
+ ".\pumpkin.h"\
+ ".\PumpKINDlg.h"\
+ ".\shared-code\BellsNWhistles.h"\
+ ".\shared-code\kHelpers.h"\
+ ".\stdafx.h"\
+
"$(INTDIR)\PropsSounds.obj" : $(SOURCE) $(DEP_CPP_PROPSS) "$(INTDIR)"\
"$(INTDIR)\pumpkin.pch"
!ENDIF
# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\PropsACL.cpp
+
+!IF "$(CFG)" == "PumpKIN - Win32 Release"
+
+DEP_CPP_PROPSA=\
+ ".\ACLTargetCombo.h"\
+ ".\PropsACL.h"\
+ ".\pumpkin.h"\
+ ".\PumpKINDlg.h"\
+ ".\shared-code\BellsNWhistles.h"\
+ ".\shared-code\kHelpers.h"\
+ ".\stdafx.h"\
+
+
+"$(INTDIR)\PropsACL.obj" : $(SOURCE) $(DEP_CPP_PROPSA) "$(INTDIR)"\
+ "$(INTDIR)\pumpkin.pch"
+
+
+!ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug"
+
+DEP_CPP_PROPSA=\
+ ".\ACLTargetCombo.h"\
+ ".\PropsACL.h"\
+ ".\pumpkin.h"\
+ ".\PumpKINDlg.h"\
+ ".\shared-code\kHelpers.h"\
+ ".\stdafx.h"\
+
+
+"$(INTDIR)\PropsACL.obj" : $(SOURCE) $(DEP_CPP_PROPSA) "$(INTDIR)"\
+ "$(INTDIR)\pumpkin.pch"
+
+"$(INTDIR)\PropsACL.sbr" : $(SOURCE) $(DEP_CPP_PROPSA) "$(INTDIR)"\
+ "$(INTDIR)\pumpkin.pch"
+
+
+!ELSEIF "$(CFG)" == "PumpKIN - Win32 Static"
+
+DEP_CPP_PROPSA=\
+ ".\ACLTargetCombo.h"\
+ ".\PropsACL.h"\
+ ".\pumpkin.h"\
+ ".\PumpKINDlg.h"\
+ ".\shared-code\BellsNWhistles.h"\
+ ".\shared-code\kHelpers.h"\
+ ".\stdafx.h"\
+
+
+"$(INTDIR)\PropsACL.obj" : $(SOURCE) $(DEP_CPP_PROPSA) "$(INTDIR)"\
+ "$(INTDIR)\pumpkin.pch"
+
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\ACLTargetCombo.cpp
+
+!IF "$(CFG)" == "PumpKIN - Win32 Release"
+
+DEP_CPP_ACLTA=\
+ ".\ACLTargetCombo.h"\
+ ".\pumpkin.h"\
+ ".\PumpKINDlg.h"\
+ ".\shared-code\BellsNWhistles.h"\
+ ".\shared-code\kHelpers.h"\
+ ".\stdafx.h"\
+
+
+"$(INTDIR)\ACLTargetCombo.obj" : $(SOURCE) $(DEP_CPP_ACLTA) "$(INTDIR)"\
+ "$(INTDIR)\pumpkin.pch"
+
+
+!ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug"
+
+DEP_CPP_ACLTA=\
+ ".\ACLTargetCombo.h"\
+ ".\pumpkin.h"\
+ ".\PumpKINDlg.h"\
+ ".\shared-code\kHelpers.h"\
+ ".\stdafx.h"\
+
+
+"$(INTDIR)\ACLTargetCombo.obj" : $(SOURCE) $(DEP_CPP_ACLTA) "$(INTDIR)"\
+ "$(INTDIR)\pumpkin.pch"
+
+"$(INTDIR)\ACLTargetCombo.sbr" : $(SOURCE) $(DEP_CPP_ACLTA) "$(INTDIR)"\
+ "$(INTDIR)\pumpkin.pch"
+
+
+!ELSEIF "$(CFG)" == "PumpKIN - Win32 Static"
+
+DEP_CPP_ACLTA=\
+ ".\ACLTargetCombo.h"\
+ ".\pumpkin.h"\
+ ".\PumpKINDlg.h"\
+ ".\shared-code\BellsNWhistles.h"\
+ ".\shared-code\kHelpers.h"\
+ ".\stdafx.h"\
+
+
+"$(INTDIR)\ACLTargetCombo.obj" : $(SOURCE) $(DEP_CPP_ACLTA) "$(INTDIR)"\
+ "$(INTDIR)\pumpkin.pch"
+
+
+!ENDIF
+
+# End Source File
# End Target
################################################################################
# Begin Target
# Name "Install - Win32 Debug"
# Name "Install - Win32 Pure"
# Name "Install - Win32 Static"
# Name "Install - Win32 Canned"
!IF "$(CFG)" == "Install - Win32 Debug"
!ELSEIF "$(CFG)" == "Install - Win32 Pure"
!ELSEIF "$(CFG)" == "Install - Win32 Static"
!ELSEIF "$(CFG)" == "Install - Win32 Canned"
!ENDIF
################################################################################
# Begin Source File
SOURCE=.\Install\Install.rc
DEP_RSC_INSTA=\
".\Install\Custom.rch"\
".\shared-data\install-icon.ico"\
!IF "$(CFG)" == "Install - Win32 Debug"
"$(INTDIR)\Install.res" : $(SOURCE) $(DEP_RSC_INSTA) "$(INTDIR)"
$(RSC) /l 0x409 /fo"$(INTDIR)/Install.res" /i "Install" /d "_DEBUG"\
$(SOURCE)
!ELSEIF "$(CFG)" == "Install - Win32 Pure"
"$(INTDIR)\Install.res" : $(SOURCE) $(DEP_RSC_INSTA) "$(INTDIR)"
$(RSC) /l 0x409 /fo"$(INTDIR)/Install.res" /i "Install" /d "NDEBUG"\
$(SOURCE)
!ELSEIF "$(CFG)" == "Install - Win32 Static"
"$(INTDIR)\Install.res" : $(SOURCE) $(DEP_RSC_INSTA) "$(INTDIR)"
@@ -25,182 +25,193 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US /////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE DISCARDABLE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE DISCARDABLE
BEGIN
"#define _AFX_NO_SPLITTER_RESOURCES\r\n"
"#define _AFX_NO_OLE_RESOURCES\r\n"
"#define _AFX_NO_TRACKER_RESOURCES\r\n"
"#define _AFX_NO_PROPERTY_RESOURCES\r\n"
"\r\n"
"#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n"
"#ifdef _WIN32\r\n"
"LANGUAGE 9, 1\r\n"
"#pragma code_page(1252)\r\n"
"#endif\r\n"
"#include ""res\\PumpKIN.rc2"" // non-Microsoft Visual C++ edited resources\r\n"
"#include ""afxres.rc"" // Standard components\r\n"
"#endif\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_RRQ ICON DISCARDABLE "res\\wrq.ico"
IDI_WRQ ICON DISCARDABLE "res\\rrq.ico"
IDI_BROWSE ICON DISCARDABLE "shared-data/browse-icon.ico"
IDR_MAINFRAME ICON DISCARDABLE "res\\pumpkin.ico"
IDI_PLAY ICON DISCARDABLE "shared-data/play-icon.ico"
+IDI_UP ICON DISCARDABLE "res\\up.ico"
+IDI_DOWN ICON DISCARDABLE "res\\down.ico"
+IDI_REMOVE ICON DISCARDABLE "res\\remove.ico"
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_ABOUTBOX DIALOG DISCARDABLE 0, 0, 217, 74
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "About PumpKIN"
FONT 8, "MS Sans Serif"
BEGIN
ICON IDR_MAINFRAME,IDC_STATIC,7,17,18,20
- LTEXT "PumpKIN, Version 2.6",IDC_STATIC,40,15,119,8,
+ LTEXT "PumpKIN, Version 2.7",IDC_STATIC,40,15,119,8,
SS_NOPREFIX
- LTEXT "Copyright © 1997-2005 Klever Group",IDC_STATIC,40,30,
+ LTEXT "Copyright © 1997-2006 Klever Group",IDC_STATIC,40,30,
170,8
DEFPUSHBUTTON "OK",IDOK,178,7,32,14,WS_GROUP
PUSHBUTTON "http://www.klever.net/",IDC_KLEVERNET,124,53,86,14
END
-IDD_PUMPKIN_DIALOG DIALOGEX 0, 0, 362, 191
+IDD_PUMPKIN_DIALOG DIALOGEX 0, 0, 362, 193
STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION |
WS_SYSMENU
EXSTYLE WS_EX_ACCEPTFILES | WS_EX_APPWINDOW
CAPTION " PumpKIN"
-FONT 8, "MS Sans Serif", 0, 0, 0x1
+FONT 8, "MS Sans Serif"
BEGIN
CONTROL "List1",IDC_CONNECTIONS,"SysListView32",LVS_REPORT |
LVS_AUTOARRANGE | WS_BORDER | WS_TABSTOP,7,7,295,108,
WS_EX_DLGMODALFRAME
PUSHBUTTON "&Get File",IDC_GET,305,7,50,17,BS_NOTIFY,
WS_EX_CLIENTEDGE
PUSHBUTTON "&Put File",IDC_PUT,305,25,50,17,BS_NOTIFY,
WS_EX_CLIENTEDGE
PUSHBUTTON "&Abort xfer",IDC_ABORT,305,43,50,17,BS_NOTIFY,
WS_EX_CLIENTEDGE
PUSHBUTTON "&Options",IDC_OPTIONS,305,61,50,17,BS_NOTIFY,
WS_EX_CLIENTEDGE
PUSHBUTTON "E&xit",IDC_EXIT,305,79,50,17,BS_NOTIFY,WS_EX_CLIENTEDGE
PUSHBUTTON "&Help",ID_HELP,305,97,50,17,BS_NOTIFY,WS_EX_CLIENTEDGE
- LISTBOX IDC_LOG,7,115,348,69,LBS_USETABSTOPS | LBS_NOSEL |
+ LISTBOX IDC_LOG,7,115,348,65,LBS_USETABSTOPS | LBS_NOSEL |
WS_VSCROLL | WS_HSCROLL,WS_EX_DLGMODALFRAME
PUSHBUTTON "..",IDCANCEL,0,183,6,7,NOT WS_VISIBLE | NOT WS_TABSTOP
+ CONTROL "&Server is running",IDC_LISTENING,"Button",
+ BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_FLAT | WS_TABSTOP,286,
+ 180,69,11,WS_EX_TRANSPARENT | WS_EX_STATICEDGE
END
-IDD_PROPS_SERVER DIALOG DISCARDABLE 0, 0, 210, 154
+IDD_PROPS_SERVER DIALOG DISCARDABLE 0, 0, 300, 201
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
+ 286,38
+ EDITTEXT IDC_TFTPROOT,13,16,256,13,ES_AUTOHSCROLL
+ PUSHBUTTON "&B",IDC_BROWSE,274,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
+ GROUPBOX "Read Request Behavior",IDC_STATIC,7,48,243,56
CONTROL "Give &all files",IDC_RRQ_GIVEALL,"Button",
- BS_AUTORADIOBUTTON | BS_NOTIFY | WS_GROUP,13,57,53,10
+ BS_AUTORADIOBUTTON | BS_NOTIFY | WS_GROUP,13,63,53,10
CONTROL "&Prompt before giving file",IDC_RRQ_ALWAYSCONFIRM,
- "Button",BS_AUTORADIOBUTTON | BS_NOTIFY,23,67,91,10
+ "Button",BS_AUTORADIOBUTTON | BS_NOTIFY,43,75,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
+ BS_AUTORADIOBUTTON | BS_NOTIFY,73,87,70,10
+ GROUPBOX "Write Request Behavior",IDC_STATIC,7,106,243,56,
+ WS_GROUP
CONTROL "Take a&ll files",IDC_WRQ_TAKEALL,"Button",
- BS_AUTORADIOBUTTON | WS_GROUP,13,103,55,10
+ BS_AUTORADIOBUTTON | WS_GROUP,13,116,55,10
CONTROL "Prompt if file &exists",IDC_WRQ_PROMPTEXISTING,"Button",
- BS_AUTORADIOBUTTON,23,113,73,10
+ BS_AUTORADIOBUTTON,43,126,73,10
CONTROL "Always pro&mpt before accepting file",
- IDC_WRQ_ALWAYSCONFIRM,"Button",BS_AUTORADIOBUTTON,33,123,
+ IDC_WRQ_ALWAYSCONFIRM,"Button",BS_AUTORADIOBUTTON,73,136,
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,
+ BS_AUTORADIOBUTTON,103,146,70,10
+ CTEXT "Confirmation &timeout",IDC_STATIC,253,52,40,19,
SS_NOTIFY
CONTROL "Slider1",IDC_PROMPTTIMEOUT,"msctls_trackbar32",
- TBS_AUTOTICKS | TBS_VERT | TBS_TOP | WS_TABSTOP,182,73,
- 21,74
+ TBS_AUTOTICKS | TBS_VERT | TBS_TOP | WS_TABSTOP,272,72,
+ 21,90
+ GROUPBOX "Log file (leave empty to disable logging to file)",
+ IDC_STATIC,7,165,286,29
+ EDITTEXT IDC_LOGFILE,13,175,256,13,ES_AUTOHSCROLL
+ PUSHBUTTON "",IDC_LOGFILE_BROWSE,274,175,13,13,BS_ICON
END
-IDD_PROPS_NETWORK DIALOG DISCARDABLE 0, 0, 210, 154
+IDD_PROPS_NETWORK DIALOG DISCARDABLE 0, 0, 300, 201
STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Network"
FONT 8, "MS Sans Serif"
BEGIN
- GROUPBOX "UDP Ports",IDC_STATIC,7,7,196,40
+ GROUPBOX "UDP Ports",IDC_STATIC,7,7,286,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
@@ -212,396 +223,464 @@ BEGIN 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
+IDD_PROPS_SOUNDS DIALOG DISCARDABLE 0, 0, 300, 201
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 |
+ COMBOBOX IDC_RING,70,7,188,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
+ PUSHBUTTON "browse",IDC_RING_BROWSE,263,7,13,13,BS_ICON
+ PUSHBUTTON "play",IDC_RING_PLAY,280,7,13,13,BS_ICON
LTEXT "xfer &finished:",IDC_STATIC,7,25,57,8
- COMBOBOX IDC_FINISHED,70,22,103,100,CBS_DROPDOWN |
+ COMBOBOX IDC_FINISHED,70,22,188,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
+ PUSHBUTTON "browse",IDC_FINISHED_BROWSE,263,22,13,13,BS_ICON
+ PUSHBUTTON "play",IDC_FINISHED_PLAY,280,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 |
+ COMBOBOX IDC_ABORTED,70,37,188,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
+ PUSHBUTTON "browse",IDC_ABORTED_BROWSE,263,37,13,13,BS_ICON
+ PUSHBUTTON "play",IDC_ABORTED_PLAY,280,37,13,13,BS_ICON
+END
+
+IDD_PROPS_ACL DIALOG DISCARDABLE 0, 0, 300, 201
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Access Lists"
+FONT 8, "MS Sans Serif"
+BEGIN
+ CONTROL "List1",IDC_ACL_LIST,"SysListView32",LVS_REPORT |
+ WS_BORDER | WS_TABSTOP,7,7,258,110
+ PUSHBUTTON "&Up",IDC_ACL_UP,273,7,20,30,BS_ICON | BS_CENTER |
+ BS_VCENTER
+ PUSHBUTTON "&Down",IDC_ACL_DOWN,273,87,20,30,BS_ICON | BS_CENTER |
+ BS_VCENTER
+ PUSHBUTTON "&Remove",IDC_ACL_REMOVE,273,47,20,30,BS_ICON |
+ BS_CENTER | BS_VCENTER
+ LTEXT "If",IDC_STATIC,13,128,8,8
+ COMBOBOX IDC_ACL_XFER,21,125,48,67,CBS_DROPDOWNLIST | WS_VSCROLL |
+ WS_TABSTOP
+ LTEXT "request comes from the address in the network",
+ IDC_STATIC,71,128,122,8
+ EDITTEXT IDC_ACL_ADDR,47,143,80,12,ES_AUTOHSCROLL
+ LTEXT "with netmask",IDC_STATIC,129,145,41,8
+ EDITTEXT IDC_ACL_NETMASK,173,143,80,12,ES_AUTOHSCROLL
+ LTEXT "then",IDC_STATIC,124,160,15,8
+ COMBOBOX IDC_ACL_RULE,143,158,123,117,CBS_DROPDOWNLIST |
+ WS_VSCROLL | WS_TABSTOP
+ PUSHBUTTON "&Add new rule",IDC_ACL_ADD,7,178,130,16
+ PUSHBUTTON "&Replace rule",IDC_ACL_REPLACE,152,178,130,16
END
#ifndef _MAC
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2,6,0,0
- PRODUCTVERSION 2,6,0,0
+ FILEVERSION 2,7,0,0
+ PRODUCTVERSION 2,7,0,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, 6, 0, 0\0"
+ VALUE "FileVersion", "2, 7, 0, 0\0"
VALUE "InternalName", "PUMPKIN\0"
- VALUE "LegalCopyright", "Copyright © 1997-2005 Klever Group (http://www.klever.net)\0"
+ VALUE "LegalCopyright", "Copyright © 1997-2006 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, 6, 0, 0\0"
+ VALUE "ProductVersion", "2, 7, 0, 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
+ BOTTOMMARGIN, 186
HORZGUIDE, 115
END
IDD_PROPS_SERVER, DIALOG
BEGIN
LEFTMARGIN, 7
- RIGHTMARGIN, 203
+ RIGHTMARGIN, 293
TOPMARGIN, 7
- BOTTOMMARGIN, 147
+ BOTTOMMARGIN, 194
END
IDD_PROPS_NETWORK, DIALOG
BEGIN
LEFTMARGIN, 7
- RIGHTMARGIN, 203
+ RIGHTMARGIN, 293
TOPMARGIN, 7
- BOTTOMMARGIN, 147
+ BOTTOMMARGIN, 194
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
+ RIGHTMARGIN, 293
TOPMARGIN, 7
- BOTTOMMARGIN, 147
+ BOTTOMMARGIN, 194
+ END
+
+ IDD_PROPS_ACL, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 293
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 194
+ HORZGUIDE, 117
+ HORZGUIDE, 125
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
+IDD_PROPS_ACL DLGINIT
+BEGIN
+ IDC_ACL_XFER, 0x403, 5, 0
+0x6572, 0x6461, "\000"
+ IDC_ACL_XFER, 0x403, 6, 0
+0x7277, 0x7469, 0x0065,
+ IDC_ACL_RULE, 0x403, 12, 0
+0x6361, 0x6563, 0x7470, 0x6620, 0x6c69, 0x0065,
+ IDC_ACL_RULE, 0x403, 33, 0
+0x6361, 0x6563, 0x7470, 0x6120, 0x646e, 0x7220, 0x6e65, 0x6d61, 0x2065,
+0x6669, 0x6620, 0x6c69, 0x2065, 0x7865, 0x7369, 0x7374, "\000"
+ IDC_ACL_RULE, 0x403, 12, 0
+0x6572, 0x656a, 0x7463, 0x6620, 0x6c69, 0x0065,
+ IDC_ACL_RULE, 0x403, 31, 0
+0x6166, 0x6c6c, 0x6162, 0x6b63, 0x7420, 0x206f, 0x6874, 0x2065, 0x6c67,
+0x626f, 0x6c61, 0x7320, 0x7465, 0x6974, 0x676e, "\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 "&Listen to requests", ID_TRAY_LISTEN
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 (%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"
+ ID_TRAY_LISTEN "Listen for incoming requests"
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."
+ IDS_NO_XFER_OP "No request type specified."
+ IDS_INVALID_IP "Invalid IP address."
+ IDS_INVALID_NETMASK "Invalid netmask."
END
STRINGTABLE DISCARDABLE
BEGIN
AFX_IDS_APP_TITLE "PUMPKIN"
END
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_INVALID_RULE "Invalid access rule."
+ IDS_LOG_LOGERROR "Error logging to '%s'"
+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
diff --git a/res/down.ico b/res/down.ico Binary files differnew file mode 100644 index 0000000..433e718 --- a/dev/null +++ b/res/down.ico diff --git a/res/remove.ico b/res/remove.ico Binary files differnew file mode 100644 index 0000000..8e4473d --- a/dev/null +++ b/res/remove.ico diff --git a/res/up.ico b/res/up.ico Binary files differnew file mode 100644 index 0000000..32f684b --- a/dev/null +++ b/res/up.ico @@ -28,121 +28,144 @@ #define IDS_LOG_XFERUDPRECEIVE 118
#define IDS_LOG_XFERSOURCETID 119
#define IDS_LOG_SENTTFTPERROR 120
#define IDS_LOG_GOTTFTPERROR 121
#define IDS_LOG_XFEROPCODE 122
#define IDS_LOG_XFERRRQFINISHED 123
#define IDS_TITLE_OPTIONS 124
#define IDS_LOG_WRQSERVE 125
#define IDS_TFTP_ERROR_FAILEDTORENAME 126
#define IDS_RENAME_TITLE 127
#define IDR_MAINFRAME 128
#define IDS_LOG_TIMEDOUT 128
#define IDS_CONFIRMEXIT_TITLE 129
#define IDI_RRQ 129
#define IDS_CONFIRMEXIT_TEXT 130
#define IDI_WRQ 130
#define IDD_CONFIRM_RRQ 131
#define IDS_LOG_XFERWRQFINISHED 131
#define IDD_CONFIRM_WRQ 132
#define IDB_BACKGROUND 132
#define IDS_LOG_XFERABORTED 132
#define IDS_TITLE_PUTREQUEST 133
#define IDS_TITLE_GETREQUEST 134
#define IDR_WAVE_RING 135
#define IDS_TALKHEADING 135
#define IDS_WTALKHEADING 135
#define IDR_WAVE_FINISHED 136
#define IDS_TITLE_BROWSEFILE 136
#define IDD_REQUEST 137
#define IDS_LOG_RESOLVEFAILED 137
#define IDS_LOG_FAILEDLOCALFILE 138
#define IDD_PROPS_SOUNDS 138
#define IDS_LOG_FAILEDTOOPEN 139
#define IDM_POPUPS 140
#define IDS_OTALXHEADING 140
#define IDS_REGISTRYKEY 141
#define IDS_KLEVERNET_URL 142
#define IDR_WAVE_ABORTED 142
#define IDS_LOGTIMEFORMAT 143
#define IDS_DROPFILES_TITLE 144
#define IDS_NOMULTIPLEDROP_TEXT 145
#define IDI_BROWSE 145
#define IDS_LOG_REQUESTING 146
#define IDS_LOG_SENDING 147
#define IDS_WTALKAT 148
#define IDS_OTALXAT 149
#define IDI_PLAY 149
#define IDS_TFTP_ERROR_TSIZE 150
+#define IDD_PROPS_ACL 150
#define IDS_TFTP_ERROR_BSIZE 151
#define IDS_TFTP_ERROR_TOUT 152
+#define IDI_UP 152
#define IDS_SELECT_TFTPROOT 153
+#define IDI_DOWN 153
#define IDS_FILTER_WAV 154
+#define IDI_REMOVE 154
#define IDS_TITLE_WAV 155
#define IDS_BOX_CANTBIND 156
+#define IDS_NO_XFER_OP 157
+#define IDS_INVALID_IP 158
+#define IDS_INVALID_NETMASK 159
+#define IDS_INVALID_RULE 160
+#define IDS_LOG_LOGERROR 161
#define IDC_KLEVERNET 1000
#define IDC_CONNECTIONS 1001
#define IDC_LOG 1003
#define IDC_GET 1004
#define IDC_PUT 1005
#define IDC_ABORT 1006
#define IDC_EXIT 1007
#define IDC_TFTPROOT 1008
#define IDC_TFTPSUBDIRS 1009
#define IDC_RRQ_GIVEALL 1010
#define IDC_RRQ_ALWAYSCONFIRM 1011
#define IDC_RRQ_DENYALL 1012
#define IDC_WRQ_TAKEALL 1013
#define IDC_WRQ_PROMPTEXISTING 1014
#define IDC_WRQ_ALWAYSCONFIRM 1015
#define IDC_WRQ_DENYALL 1016
#define IDC_PROMPTTIMEOUT 1017
#define IDC_LISTENPORT 1018
#define IDC_LISTENSPIN 1019
#define IDC_SPEAKPORT 1020
#define IDC_SPEAKSPIN 1021
#define IDC_MAXUDPSIZE 1022
#define IDC_MAXUDPSPIN 1023
#define IDC_TIMEOUT 1024
#define IDC_TIMESPIN 1025
#define IDC_OPTIONS 1026
#define IDC_BLOCKSIZE 1026
#define IDC_BSIZESPIN 1027
#define IDC_HOST 1028
#define IDC_FILE 1029
#define IDC_RENAME 1030
#define IDC_REMOTEFILE 1030
#define IDC_RESUME 1031
#define IDC_REFRESH 1032
#define IDC_BROWSE 1034
#define IDC_TALKS 1035
#define IDC_LOCALFILE 1036
#define IDC_TYPE 1037
#define IDC_BSIZE 1039
#define IDC_RING 1041
#define IDC_RING_BROWSE 1042
#define IDC_RING_PLAY 1043
+#define IDC_ACL_LIST 1043
#define IDC_FINISHED 1044
+#define IDC_ACL_UP 1044
#define IDC_FINISHED_BROWSE 1045
+#define IDC_ACL_DOWN 1045
#define IDC_FINISHED_PLAY 1046
+#define IDC_ACL_REMOVE 1046
#define IDC_ABORTED 1047
+#define IDC_ACL_ADDR 1047
#define IDC_ABORTED_BROWSE 1048
+#define IDC_ACL_RULE 1048
#define IDC_ABORTED_PLAY 1049
+#define IDC_ACL_NETMASK 1049
+#define IDC_ACL_ADD 1050
+#define IDC_ACL_XFER 1051
+#define IDC_ACL_REPLACE 1052
+#define IDC_LISTENING 1052
+#define IDC_LOGFILE 1053
+#define IDC_LOGFILE_BROWSE 1054
#define ID_TRAY_HELP 32771
#define ID_TRAY_ABOUTPUMPKIN 32772
#define ID_TRAY_EXIT 32773
#define ID_TRAY_SENDFILE 32774
#define ID_TRAY_FETCHFILE 32775
#define ID_TRAY_OPTIONS 32776
#define ID_TRAY_SHOWPUMPKINWINDOW 32777
#define ID_TRAY_OPENFILESFOLDER 32778
+#define ID_TRAY_LISTEN 32780
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE 150
-#define _APS_NEXT_COMMAND_VALUE 32780
-#define _APS_NEXT_CONTROL_VALUE 1043
+#define _APS_NEXT_RESOURCE_VALUE 155
+#define _APS_NEXT_COMMAND_VALUE 32781
+#define _APS_NEXT_CONTROL_VALUE 1055
#define _APS_NEXT_SYMED_VALUE 102
#endif
#endif
|