summaryrefslogtreecommitdiffabout
path: root/PumpKINDlg.h
Unidiff
Diffstat (limited to 'PumpKINDlg.h') (more/less context) (ignore whitespace changes)
-rwxr-xr-xPumpKINDlg.h502
1 files changed, 0 insertions, 502 deletions
diff --git a/PumpKINDlg.h b/PumpKINDlg.h
deleted file mode 100755
index 9077292..0000000
--- a/PumpKINDlg.h
+++ b/dev/null
@@ -1,502 +0,0 @@
1// PumpKINDlg.h : header file
2//
3
4 //#define REVERSEBYTES(w)MAKEWORD(HIBYTE(w),LOBYTE(w));
5 #defineREVERSEBYTES(w) (htons((WORD)w))
6 #define tftpoBSize"blksize"
7 #define tftpoTSize"tsize"
8 #define tftpoTOut"timeout"
9
10 #define tftpoXResume"x-resume"
11
12 struct tftp{
13 typedef CMapStringToString tftpOptions;
14 typedef WORD tftpLength;
15 typedef WORD tftpOpcode;
16 tftpLengthlength;
17 tftpOpcode opcode;
18 enum{
19 opRRQ = 1,
20 opWRQ = 2,
21 opDATA = 3,
22 opACK = 4,
23 opERROR = 5,
24 opOACK = 6,
25
26 errUndefined = 0,
27 errNotFound = 1,
28 errAccessViolation = 2,
29 errDiskFull = 3,
30 errIllegalOp = 4,
31 errUnknownTID = 5,
32 errFileExists = 6,
33 errNoUser = 7,
34 errOption = 8
35 };
36 structtftpUNKNOWN {
37 BYTE data[1];
38 };
39 structtftpRQ {
40 BYTE data[1];
41public:
42 void Set(LPCTSTR file,LPCTSTR type,tftpOptions* ops=NULL);
43 static UINT tftpSize(LPCTSTR file,LPCTSTR type,tftpOptions* ops=NULL);
44 };
45 structtftpRRQ {
46 BYTE data[1];
47public:
48 void Set(LPCTSTR file,LPCTSTR type,tftpOptions* ops=NULL);
49 static UINT tftpSize(LPCTSTR file,LPCTSTR type,tftpOptions* ops=NULL);
50 };
51 structtftpWRQ {
52 BYTE data[1];
53public:
54 void Set(LPCTSTR file,LPCTSTR type,tftpOptions* ops=NULL);
55 static UINT tftpSize(LPCTSTR file,LPCTSTR type,tftpOptions* ops=NULL);
56 };
57 structtftpDATA {
58 WORD block;
59 BYTE data[1];
60 public:
61 WORD Block();
62 void SetBlock(WORD b);
63 static UINT tftpSize(UINT blkSize=512);
64 };
65 struct tftpACK {
66 WORD block;
67 public:
68 static UINT tftpSize();
69 void SetBlock(WORD b);
70 WORD Block();
71 };
72 structtftpERROR {
73 typedef WORD tftpErrorCode;
74 tftpErrorCode code;
75 BYTE data[1];
76 public:
77 void SetCode(WORD c);
78 WORD Code();
79 static UINT tftpSize(LPCTSTR msg);
80 };
81 struct tftpOACK {
82 BYTE data[1];
83 public:
84 void Set(tftpOptions* ops);
85 static UINT tftpSize(tftpOptions* ops);
86 };
87 uniontftpPacket {
88 tftpUNKNOWN m_UNKNOWN;
89 tftpRQ m_RQ;
90 tftpRRQ m_RRQ;
91 tftpWRQ m_WRQ;
92 tftpDATA m_DATA;
93 tftpACK m_ACK;
94 tftpERROR m_ERROR;
95 tftpOACK m_OACK;
96 }data;
97
98 void *udpBase(void){ return &opcode; }
99public:
100 static tftp* Copy(tftp *src);
101 CString errMessage();
102 void SetOpcode(WORD op);
103 void errSet(UINT code,LPCTSTR msg);
104 static tftp* Allocate(UINT tftpSize=0);
105 BOOL Send(CAsyncSocket *socket,SOCKADDR_IN* saddr);
106 CString rqType();
107 CString rqFileName();
108 UINT GetOptions(tftpOptions* ops);
109 tftp();
110 UINT Opcode();
111 BOOL Receive(CAsyncSocket* socket,UINT maxLength,SOCKADDR_IN *sin=NULL);
112};
113 #define tftpHdrSize(sizeof(tftp)-sizeof(tftp::tftpPacket))
114 #definetftpSlackSize sizeof(tftp::tftpLength)
115
116struct acl_rule {
117 enum {
118 opRRQ=tftp::opRRQ, opWRQ=tftp::opWRQ
119 };
120 int op;
121 DWORD addr, mask;
122 enum {
123 rrqGrant=0, rrqPrompt, rrqDeny,
124 rrqRules,
125 rrqNone=-1
126 };
127 enum {
128 wrqGrant=0, wrqPromptIfExists, wrqPrompt, wrqDeny,
129 wrqRules,
130 wrqNone=-1
131 };
132 int target;
133
134 acl_rule()
135 : op(-1), addr(0), mask(0), target(-1) { }
136 acl_rule(int o,DWORD a,DWORD m,int t)
137 : op(o), addr(a), mask(m), target(t) { }
138 acl_rule(const acl_rule& s)
139 : op(s.op), addr(s.addr), mask(s.mask), target(s.target) { }
140
141 BOOL IsValid() {
142 if(op==opRRQ) {
143 if(target<rrqNone || target>=rrqRules)
144 return FALSE;
145 }else if(op==opWRQ) {
146 if(target<wrqNone || target>=wrqRules)
147 return FALSE;
148 }else
149 return FALSE;
150 return TRUE;
151 }
152
153 BOOL IsMatch(int o,DWORD a) {
154 if(o!=op) return FALSE;
155 if( (a&mask) != (addr&mask)) return FALSE;
156 return TRUE;
157 }
158
159 CString str_addr() {
160 return inet_ntoa(*(struct in_addr*)&addr);
161 }
162 CString str_mask() {
163 return inet_ntoa(*(struct in_addr*)&mask);
164 }
165 CString str_target() {
166 if(op==opRRQ) {
167 switch(target) {
168 case rrqNone: return "fallback";
169 case rrqGrant: return "grant";
170 case rrqPrompt: return "prompt";
171 case rrqDeny: return "deny";
172 default: return "?";
173 }
174 }else if(op==opWRQ) {
175 switch(target) {
176 case wrqNone: return "fallback";
177 case wrqGrant: return "grant";
178 case wrqPromptIfExists: return "prompt if exists";
179 case wrqPrompt: return "prompt";
180 case wrqDeny: return "deny";
181 default: return "?";
182 }
183 }else
184 return "?";
185 }
186
187 void SaveProfile(CWinApp* app,int i) {
188 CString n; n.Format("%d",i);
189 app->WriteProfileInt("ACL","op_"+n,op);
190 app->WriteProfileString("ACL","addr_"+n,str_addr());
191 app->WriteProfileString("ACL","mask_"+n,str_mask());
192 app->WriteProfileInt("ACL","target_"+n,target);
193 }
194
195 void LoadProfile(CWinApp* app,int i) {
196 CString n; n.Format("%d",i);
197 op=app->GetProfileInt("ACL","op_"+n,-1);
198 addr=inet_addr(app->GetProfileString("ACL","addr_"+n));
199 mask=inet_addr(app->GetProfileString("ACL","mask_"+n));
200 target=app->GetProfileInt("ACL","target_"+n,-1);
201 }
202
203};
204
205class acl_rules_t : public CArray<acl_rule,acl_rule&> {
206public:
207
208 acl_rules_t& operator=(const acl_rules_t& s) {
209 // Copy(s); XXX: unsuprisingly, there's a bug in MFC Copy, *pDst++=*pSrc (no ++ for Src)
210 RemoveAll();
211 int ns = s.GetSize();
212 SetSize(ns);
213 for(int i=0;i<ns;++i)
214 m_pData[i]=s.m_pData[i];
215 return *this;
216 }
217
218 int AppendRule(acl_rule& r) {
219 return Add(r);
220 }
221
222 void DeleteRule(int r) {
223 RemoveAt(r);
224 }
225
226 int FindRule(int op,DWORD ip) {
227 for(int i=0;i<GetSize();++i)
228 if(m_pData[i].IsMatch(op,ip))
229 return i;
230 return -1;
231 }
232
233 int FindTarget(int op,DWORD ip) {
234 int r=FindRule(op,ip);
235 if(r<0) return -1;
236 return m_pData[r].target;
237 }
238
239 void SaveProfile(CWinApp* app) {
240 int s=GetSize();
241 for(int i=0;i<s;++i)
242 m_pData[i].SaveProfile(app,i);
243 app->WriteProfileInt("ACL","rules",s);
244 }
245 void LoadProfile(CWinApp* app) {
246 RemoveAll();
247 int s=app->GetProfileInt("ACL","rules",0);
248 for(int i=0;i<s;++i) {
249 acl_rule r;
250 r.LoadProfile(app,i);
251 if(r.IsValid())
252 Add(r);
253 }
254 }
255};
256
257class CPumpKINDlg;
258 class CListenSocket : public CAsyncSocket{
259public:
260 CPumpKINDlg* m_Daddy;
261 BOOL m_bListen;
262
263 CListenSocket()
264 : m_bListen(FALSE), m_Daddy(0) { }
265
266 BOOL SetListen(BOOL b);
267 virtual void OnReceive(int nErrorCode);
268};
269
270 typedef CList<tftp*,tftp*>CTFTPList;
271class CResolver;
272 class CXferSocket : public CAsyncSocket{
273public:
274 UINT m__timeOut;
275 UINT m__blkSize;
276 tftp::tftpOptions m_Options;
277 LONG m_xferSize;
278 UINT m_timeOut;
279 UINT m_blkSize;
280 BOOL m_bRetry;
281 void SetTry(tftp *p=NULL);
282 tftp* m_Retry;
283 void OnRetry();
284 BOOL CheckBadRelativeness(LPCTSTR file);
285 CString ApplyRootGently(LPCTSTR fn);
286 CString m_HostName;
287 virtual void OnResolved();
288 virtual void OnFailedToResolve();
289 CResolver *m_wndResolver;
290 BYTE m_ResolveBuff[MAXGETHOSTSTRUCT];
291 virtual void Abort();
292 void ResetTimeout();
293 enum{
294 stateNone, stateDeny, stateInit, stateOACK, stateXfer, stateFinish, stateClosing
295 };
296 int state;
297 void Deny(UINT errCode,UINT errID);
298 void Deny(CFileException* e);
299 CString ApplyRoot(LPCTSTR fileName);
300 void TurnSlashes(CString& fn,BOOL bBack=TRUE);
301 virtual void Destroy(BOOL success=TRUE);
302 void PostError(CFileException* e);
303 void PostError(UINT errCode,UINT errID);
304 void PostTFTP(tftp* p,BOOL retryable=FALSE);
305 CXferSocket(CPumpKINDlg *daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN* sin);
306 CFile m_File;
307 virtual ULONG GetACK();
308 CString m_Type;
309 CString m_FileName;
310 CXferSocket();
311 void UpdateList();
312 void SetPeer(SOCKADDR_IN *sin);
313 virtual BOOL OnTFTP(tftp* p) = 0;
314 virtual void OnReceive(int nErrorCode);
315 void DoSelect(BOOL do_select=FALSE);
316 SOCKADDR_IN m_Peer;
317 virtual void OnSend(int nErrorCode);
318 CPumpKINDlg* m_Daddy;
319 CTFTPList m_Queue;
320
321 DECLARE_DYNAMIC(CXferSocket)
322};
323class CWRQSocket : public CXferSocket {
324public:
325 BOOL m_bResume;
326 void OnHostKnown();
327 virtual void OnResolved();
328 UINT m_LastSlack;
329 ULONG GetACK();
330 void DoXfer();
331 UINT m_ACK;
332 BOOL SaveAs(CString& fn);
333 BOOL RenameFile(CString& fn);
334 BOOL m_Rename;
335 BOOL ConfirmRequest();
336 BOOL Create(LPCTSTR localFile=NULL,LPCTSTR hostName=NULL);
337 CWRQSocket(CPumpKINDlg* daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN *sin);
338 BOOL OnTFTP(tftp* p);
339
340 DECLARE_DYNAMIC(CWRQSocket)
341};
342class CRRQSocket : public CXferSocket {
343public:
344 UINT m_ACKtoClose;
345 void OnHostKnown();
346 virtual void OnResolved();
347 BOOL ConfirmRequest();
348 WORD m_LastSlack;
349 UINT m_ACK;
350 BOOL OnTFTP(tftp* p);
351 ULONG GetACK(void);
352 void DoXfer();
353 CRRQSocket(CPumpKINDlg *daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN *sin);
354 BOOL Create(LPCTSTR localFile=NULL,LPCTSTR hostName=NULL);
355
356 DECLARE_DYNAMIC(CRRQSocket)
357};
358
359 typedef CMap<SOCKET,SOCKET,CXferSocket*,CXferSocket*>CTIDMap;
360typedef CMap<CTime*,CTime*,CTime*,CTime*> CTimeMap;
361
362/////////////////////////////////////////////////////////////////////////////
363// CPumpKINDlg dialog
364
365class CTrayer;
366class CRetrier;
367class CPumpKINDlg : public CDialog
368{
369// Construction
370public:
371 void AdjustButton(CWnd& w,CRect& wrc);
372 void RecalcLayout(int,int);
373 CSize m_MinSize;
374 UINT m_bottomGapLog;
375 UINT m_bottomGapListen;
376 UINT m_rightGapList;
377 UINT m_rightGapButtons;
378 CString m_lastlogerr;
379 void LogLine(LPCTSTR str);
380 CString m_LogFile;
381 BOOL m_bListen;
382 acl_rules_t m_aclRules;
383 CString m_bnwRequest;
384 CString m_bnwSuccess;
385 CString m_bnwAbort;
386 CBellsNWhistles m_bnw;
387 CTrayer *m_Trayer;
388 CTimeSpan m_RetryTimeOut;
389 virtual ~CPumpKINDlg();
390 CRetrier* m_Retrier;
391 virtual BOOL PreTranslateMessage(MSG* pMsg);
392 BOOL m_bShown;
393 BOOL m_bExiting;
394 void SaveSettings();
395 void LoadSettings();
396 void SetupButtons();
397 BITMAP m_bitmapBack;
398 CBitmap m_bmpBack;
399 UINT m_PromptTimeOut;
400 UINT m_SpeakPort;
401 void LogLine(UINT msgID);
402 CTimeMap m_LogTimes;
403 void LogLineToFile(LPCTSTR str);
404 void LogLineToScreen(LPCTSTR str);
405 int m_LogLength;
406 enum{
407 subitemFile=0, subitemType, subitemPeer, subitemBytes, subitemTSize
408 };
409 int m_iWRQ;
410 int m_iRRQ;
411 CImageList m_Images;
412 CTIDMap m_Xfers;
413 CTimeSpan m_TFTPTimeOut;
414 enum{
415 rrqGiveAll=acl_rule::rrqGrant,
416 rrqAlwaysConfirm=acl_rule::rrqPrompt,
417 rrqDenyAll=acl_rule::rrqDeny,
418 rrqFallback=acl_rule::rrqNone,
419 rrqGrant=rrqGiveAll, rrqDeny=rrqDenyAll, rrqPrompt=rrqAlwaysConfirm
420 };
421 enum{
422 wrqTakeAll=acl_rule::wrqGrant,
423 wrqConfirmIfExists=acl_rule::wrqPromptIfExists,
424 wrqAlwaysConfirm=acl_rule::wrqPrompt,
425 wrqDenyAll=acl_rule::wrqDeny,
426 wrqFallback=acl_rule::wrqNone,
427 wrqGrant=wrqTakeAll,wrqDeny=wrqDenyAll, wrqPrompt=wrqAlwaysConfirm
428 };
429 UINT m_RRQMode;
430 UINT m_WRQMode;
431 BOOL m_bTFTPSubdirs;
432 CString m_TFTPRoot;
433 UINT m_ListenPort;
434 CString m_ListenAddress;
435 UINT m_BlockSize;
436 CListenSocket m_Listener;
437 CPumpKINDlg(CWnd* pParent = NULL);// standard constructor
438
439// Dialog Data
440 //{{AFX_DATA(CPumpKINDlg)
441 enum { IDD = IDD_PUMPKIN_DIALOG };
442 CButtonm_HelpCtl;
443 CButtonm_PutCtl;
444 CButtonm_GetCtl;
445 CButtonm_ExitCtl;
446 CButtonm_ListenCtl;
447 CButtonm_AbortCtl;
448 CButtonm_OptionsCtl;
449 CListBoxm_Log;
450 CListCtrlm_List;
451 //}}AFX_DATA
452
453 // ClassWizard generated virtual function overrides
454 //{{AFX_VIRTUAL(CPumpKINDlg)
455 protected:
456 virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV support
457 //}}AFX_VIRTUAL
458
459// Implementation
460protected:
461 CToolTipCtrl m_tooltip;
462 HICON m_hIcon;
463
464 // Generated message map functions
465 //{{AFX_MSG(CPumpKINDlg)
466 virtual BOOL OnInitDialog();
467 afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
468 afx_msg void OnDestroy();
469 afx_msg void OnPaint();
470 afx_msg HCURSOR OnQueryDragIcon();
471 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
472 afx_msg void OnOptions();
473 afx_msg void OnTimer(UINT nIDEvent);
474 afx_msg void OnExit();
475 afx_msg void OnPut();
476 afx_msg void OnGet();
477 afx_msg void OnDeleteallitemsConnections(NMHDR* pNMHDR, LRESULT* pResult);
478 afx_msg void OnDeleteitemConnections(NMHDR* pNMHDR, LRESULT* pResult);
479 afx_msg void OnInsertitemConnections(NMHDR* pNMHDR, LRESULT* pResult);
480 afx_msg void OnItemchangedConnections(NMHDR* pNMHDR, LRESULT* pResult);
481 afx_msg void OnAbort();
482 afx_msg void OnClose();
483 afx_msg void OnTrayShowpumpkinwindow();
484 afx_msg void OnTrayListen();
485 afx_msg void OnTrayExit();
486 afx_msg void OnTrayAboutpumpkin();
487 afx_msg void OnTrayFetchfile();
488 afx_msg void OnTrayHelp();
489 afx_msg void OnTrayOptions();
490 afx_msg void OnTraySendfile();
491 afx_msg void OnWindowPosChanging(WINDOWPOS FAR* lpwndpos);
492 afx_msg void OnSelchangeLog();
493 afx_msg void OnTrayOpenfilesfolder();
494 afx_msg void OnDropFiles(HDROP hDropInfo);
495 virtual void OnCancel();
496 afx_msg void OnHelp();
497 afx_msg void OnListening();
498 afx_msg void OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI);
499 afx_msg void OnSize(UINT nType, int cx, int cy);
500 //}}AFX_MSG
501 DECLARE_MESSAGE_MAP()
502};