-rwxr-xr-x | PumpKINDlg.h | 502 |
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]; | ||
41 | public: | ||
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]; | ||
47 | public: | ||
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]; | ||
53 | public: | ||
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; } | ||
99 | public: | ||
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 | |||
116 | struct 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 | |||
205 | class acl_rules_t : public CArray<acl_rule,acl_rule&> { | ||
206 | public: | ||
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 | |||
257 | class CPumpKINDlg; | ||
258 | class CListenSocket : public CAsyncSocket{ | ||
259 | public: | ||
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; | ||
271 | class CResolver; | ||
272 | class CXferSocket : public CAsyncSocket{ | ||
273 | public: | ||
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 | }; | ||
323 | class CWRQSocket : public CXferSocket { | ||
324 | public: | ||
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 | }; | ||
342 | class CRRQSocket : public CXferSocket { | ||
343 | public: | ||
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; | ||
360 | typedef CMap<CTime*,CTime*,CTime*,CTime*> CTimeMap; | ||
361 | |||
362 | ///////////////////////////////////////////////////////////////////////////// | ||
363 | // CPumpKINDlg dialog | ||
364 | |||
365 | class CTrayer; | ||
366 | class CRetrier; | ||
367 | class CPumpKINDlg : public CDialog | ||
368 | { | ||
369 | // Construction | ||
370 | public: | ||
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 | ||
460 | protected: | ||
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 | }; | ||