IdIMAP4Server.pas 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  1. { $HDR$}
  2. {**********************************************************************}
  3. { Unit archived using Team Coherence }
  4. { Team Coherence is Copyright 2002 by Quality Software Components }
  5. { }
  6. { For further information / comments, visit our WEB site at }
  7. { http://www.TeamCoherence.com }
  8. {**********************************************************************}
  9. {}
  10. { $Log: 10207: IdIMAP4Server.pas
  11. {
  12. { Rev 1.0 2002.11.12 10:42:10 PM czhower
  13. }
  14. Unit IdIMAP4Server;
  15. Interface
  16. {
  17. 2002-Apr-21 - J. Berg
  18. -use fetch()
  19. 2000-May-18 - J. Peter Mugaas
  20. -Ported to Indy
  21. 2000-Jan-13 - MTL
  22. -Moved to new Palette Scheme (Winshoes Servers)
  23. 1999-Aug-26 - Ray Malone
  24. -Started unit
  25. }
  26. Uses
  27. Classes,
  28. IdAssignedNumbers,
  29. IdTCPServer;
  30. Const
  31. IMAPCommands : Array [1..25] Of String =
  32. ({ Client Commands - Any State}
  33. 'CAPABILITY', {Do not Localize}
  34. 'NOOP', {Do not Localize}
  35. 'LOGOUT', {Do not Localize}
  36. { Client Commands - Non Authenticated State}
  37. 'AUTHENTICATE', {Do not Localize}
  38. 'LOGIN', {Do not Localize}
  39. { Client Commands - Authenticated State}
  40. 'SELECT', {Do not Localize}
  41. 'EXAMINE', {Do not Localize}
  42. 'CREATE', {Do not Localize}
  43. 'DELETE', {Do not Localize}
  44. 'RENAME', {Do not Localize}
  45. 'SUBSCRIBE', {Do not Localize}
  46. 'UNSUBSCRIBE', {Do not Localize}
  47. 'LIST', {Do not Localize}
  48. 'LSUB', {Do not Localize}
  49. 'STATUS', {Do not Localize}
  50. 'APPEND', {Do not Localize}
  51. { Client Commands - Selected State}
  52. 'CHECK', {Do not Localize}
  53. 'CLOSE', {Do not Localize}
  54. 'EXPUNGE', {Do not Localize}
  55. 'SEARCH', {Do not Localize}
  56. 'FETCH', {Do not Localize}
  57. 'STORE', {Do not Localize}
  58. 'COPY', {Do not Localize}
  59. 'UID', {Do not Localize}
  60. { Client Commands - Experimental/ Expansion}
  61. 'X'); {Do not Localize}
  62. Type
  63. TCommandEvent = procedure (Thread : TIdPeerThread; const Tag, CmdStr: String;
  64. var Handled: Boolean) of Object;
  65. TIdIMAP4Server = class ( TIdTCPServer )
  66. Protected
  67. fOnCommandCAPABILITY : TCommandEvent;
  68. fONCommandNOOP: TCommandEvent;
  69. fONCommandLOGOUT: TCommandEvent;
  70. fONCommandAUTHENTICATE: TCommandEvent;
  71. fONCommandLOGIN: TCommandEvent;
  72. fONCommandSELECT : TCommandEvent;
  73. fONCommandEXAMINE : TCommandEvent;
  74. fONCommandCREATE : TCommandEvent;
  75. fONCommandDELETE : TCommandEvent;
  76. fONCommandRENAME : TCommandEvent;
  77. fONCommandSUBSCRIBE : TCommandEvent;
  78. fONCommandUNSUBSCRIBE : TCommandEvent;
  79. fONCommandLIST : TCommandEvent;
  80. fONCommandLSUB : TCommandEvent;
  81. fONCommandSTATUS : TCommandEvent;
  82. fONCommandAPPEND : TCommandEvent;
  83. fONCommandCHECK : TCommandEvent;
  84. fONCommandCLOSE : TCommandEvent;
  85. fONCommandEXPUNGE : TCommandEvent;
  86. fONCommandSEARCH : TCommandEvent;
  87. fONCommandFETCH : TCommandEvent;
  88. fONCommandSTORE : TCommandEvent;
  89. fONCommandCOPY : TCommandEvent;
  90. fONCommandUID : TCommandEvent;
  91. fONCommandX : TCommandEvent;
  92. fOnCommandError : TCommandEvent;
  93. procedure DoCommandCAPABILITY ( Thread: TIdPeerThread; const Tag, CmdStr : String; var Handled : Boolean );
  94. procedure DoCommandNOOP(Thread: TIdPeerThread; const Tag, CmdStr : String; var Handled : Boolean );
  95. procedure DoCommandLOGOUT ( Thread : TIdPeerThread; const Tag, CmdStr : String; var Handled : Boolean );
  96. Procedure DoCommandAUTHENTICATE ( Thread : TIdPeerThread; const Tag, CmdStr : String; var Handled : Boolean );
  97. Procedure DoCommandLOGIN ( Thread : TIdPeerThread; const Tag, CmdStr : String; var Handled : Boolean );
  98. Procedure DoCommandSELECT ( Thread : TIdPeerThread; const Tag, CmdStr : String; var Handled : Boolean );
  99. Procedure DoCommandEXAMINE ( Thread : TIdPeerThread; const Tag, CmdStr :String; var Handled : Boolean );
  100. Procedure DoCommandCREATE ( Thread : TIdPeerThread; const Tag, CmdStr :String; var Handled : Boolean );
  101. Procedure DoCommandDELETE ( Thread : TIdPeerThread; const Tag, CmdStr : String; var Handled : Boolean );
  102. Procedure DoCommandRENAME ( Thread : TIdPeerThread; const Tag, CmdStr :String; var Handled : Boolean);
  103. Procedure DoCommandSUBSCRIBE ( Thread : TIdPeerThread; const Tag, CmdStr : String; var Handled : Boolean );
  104. Procedure DoCommandUNSUBSCRIBE ( Thread: TIdPeerThread; const Tag, CmdStr : String; var Handled : Boolean );
  105. Procedure DoCommandLIST(Thread: TIdPeerThread; const Tag, CmdStr : String; var Handled : Boolean );
  106. Procedure DoCommandLSUB(Thread: TIdPeerThread; const Tag, CmdStr : String; var Handled : Boolean );
  107. Procedure DoCommandSTATUS(Thread: TIdPeerThread; const Tag, CmdStr : String; var Handled : Boolean );
  108. Procedure DoCommandAPPEND(Thread: TIdPeerThread; const Tag, CmdStr : String; var Handled : Boolean );
  109. Procedure DoCommandCHECK(Thread: TIdPeerThread; const Tag, CmdStr : String; var Handled : Boolean );
  110. Procedure DoCommandCLOSE(Thread: TIdPeerThread; const Tag, CmdStr : String; var Handled : Boolean );
  111. Procedure DoCommandEXPUNGE ( Thread: TIdPeerThread; const Tag, CmdStr : String; var Handled : Boolean );
  112. Procedure DoCommandSEARCH ( Thread: TIdPeerThread; const Tag, CmdStr : String; var Handled : Boolean );
  113. Procedure DoCommandFETCH ( Thread: TIdPeerThread; const Tag, CmdStr : String; var Handled : Boolean );
  114. Procedure DoCommandSTORE ( Thread: TIdPeerThread; const Tag, CmdStr : String; var Handled : Boolean );
  115. Procedure DoCommandCOPY ( Thread: TIdPeerThread; const Tag, CmdStr : String; var Handled : Boolean );
  116. Procedure DoCommandUID ( Thread: TIdPeerThread; const Tag, CmdStr : String; var Handled : Boolean );
  117. Procedure DoCommandX ( Thread: TIdPeerThread; const Tag, CmdStr : String; var Handled : Boolean );
  118. Procedure DoCommandError(Thread: TIdPeerThread; const Tag, CmdStr : String; var Handled : Boolean );
  119. Function DoExecute(Thread: TIdPeerThread): Boolean; override;
  120. public
  121. Constructor Create(AOwner: TComponent); Override;
  122. published
  123. Property ONCommandCAPABILITY : TCommandEvent Read fOnCommandCAPABILITY write fOnCommandCAPABILITY;
  124. Property ONCommandNOOP : TCommandEvent Read fONCommandNOOP write fONCommandNOOP;
  125. Property ONCommandLOGOUT : TCommandEvent Read fONCommandLOGOUT write fONCommandLOGOUT;
  126. Property ONCommandAUTHENTICATE : TCommandEvent Read fONCommandAUTHENTICATE write fONCommandAUTHENTICATE;
  127. Property ONCommandLOGIN : TCommandEvent Read fONCommandLOGIN write fONCommandLOGIN;
  128. Property ONCommandSELECT : TCommandEvent Read fONCommandSELECT write fONCommandSELECT;
  129. Property OnCommandEXAMINE :TCommandEvent Read fOnCommandEXAMINE write fOnCommandEXAMINE;
  130. property ONCommandCREATE : TCommandEvent Read fONCommandCREATE write fONCommandCREATE;
  131. property ONCommandDELETE : TCommandEvent Read fONCommandDELETE write fONCommandDELETE;
  132. property OnCommandRENAME : TCommandEvent Read fOnCommandRENAME write fOnCommandRENAME;
  133. property ONCommandSUBSCRIBE : TCommandEvent read fONCommandSUBSCRIBE write fONCommandSUBSCRIBE;
  134. property ONCommandUNSUBSCRIBE : TCommandEvent read fONCommandUNSUBSCRIBE write fONCommandUNSUBSCRIBE;
  135. property ONCommandLIST : TCommandEvent read fONCommandLIST write fONCommandLIST;
  136. property OnCommandLSUB : TCommandEvent read fOnCommandLSUB write fOnCommandLSUB;
  137. property ONCommandSTATUS : TCommandEvent read fONCommandSTATUS write fONCommandSTATUS;
  138. property OnCommandAPPEND : TCommandEvent read fOnCommandAPPEND write fOnCommandAPPEND;
  139. property ONCommandCHECK : TCommandEvent read fONCommandCHECK write fONCommandCHECK;
  140. property OnCommandCLOSE : TCommandEvent read fOnCommandCLOSE write fOnCommandCLOSE;
  141. property ONCommandEXPUNGE : TCommandEvent read fONCommandEXPUNGE write fONCommandEXPUNGE;
  142. property OnCommandSEARCH : TCommandEvent read fOnCommandSEARCH write fOnCommandSEARCH;
  143. property ONCommandFETCH : TCommandEvent read fONCommandFETCH write fONCommandFETCH;
  144. property OnCommandSTORE : TCommandEvent read fOnCommandSTORE write fOnCommandSTORE;
  145. property OnCommandCOPY : TCommandEvent read fOnCommandCOPY write fOnCommandCOPY;
  146. property ONCommandUID : TCommandEvent read fONCommandUID write fONCommandUID;
  147. property OnCommandX : TCommandEvent read fOnCommandX write fOnCommandX;
  148. property OnCommandError : TCommandEvent read fOnCommandError write fOnCommandError;
  149. end;
  150. Implementation
  151. Uses
  152. IdGlobal,
  153. SysUtils;
  154. //--------------------Start of TIdIMAP4Server Code ---------------------
  155. // Started August 26, 1999
  156. //------------------------------------------------------------------------------
  157. Const
  158. cCAPABILITY = 1;
  159. cNOOP = 2;
  160. cLOGOUT = 3;
  161. cAUTHENTICATE = 4;
  162. cLOGIN = 5;
  163. cSELECT = 6;
  164. cEXAMINE = 7;
  165. cCREATE = 8;
  166. cDELETE = 9;
  167. cRENAME = 10;
  168. cSUBSCRIBE = 11;
  169. cUNSUBSCRIBE = 12;
  170. cLIST = 13;
  171. cLSUB = 14;
  172. cSTATUS = 15;
  173. cAPPEND = 16;
  174. cCHECK = 17;
  175. cCLOSE = 18;
  176. cEXPUNGE = 19;
  177. cSEARCH = 20;
  178. cFETCH = 21;
  179. cSTORE = 22;
  180. cCOPY = 23;
  181. cUID = 24;
  182. cXCmd = 25;
  183. constructor TIdIMAP4Server.Create(AOwner: TComponent);
  184. begin
  185. Inherited;
  186. DefaultPort := IdPORT_IMAP4;
  187. end;
  188. function TIdIMAP4Server.DoExecute(Thread: TIdPeerThread): Boolean;
  189. var
  190. RcvdStr,
  191. ArgStr,
  192. sTag,
  193. sCmd : String;
  194. cmdNum : Integer;
  195. Handled : Boolean;
  196. begin
  197. result := true;
  198. while Thread.Connection.Connected Do
  199. begin
  200. Handled := False;
  201. RcvdStr := Thread.Connection.ReadLn;
  202. ArgStr := RcvdStr;
  203. sTag := UpperCase ( Fetch ( ArgStr, CHAR32 ) );
  204. sCmd := UpperCase ( Fetch ( ArgStr, CHAR32 ) );
  205. CmdNum := Succ ( PosInStrArray ( Uppercase ( sCmd ), IMAPCommands ) );
  206. case CmdNum Of
  207. cCAPABILITY : DoCommandCAPABILITY ( Thread, sTag, ArgStr, Handled );
  208. cNOOP : DoCommandNOOP ( Thread, sTag, ArgStr, Handled );
  209. cLOGOUT : DoCommandLOGOUT ( Thread, sTag, ArgStr, Handled );
  210. cAUTHENTICATE : DoCommandAUTHENTICATE ( Thread, sTag, ArgStr, Handled );
  211. cLOGIN : DoCommandLOGIN ( Thread, sTag, ArgStr, Handled );
  212. cSELECT : DoCommandSELECT ( Thread, sTag, ArgStr, Handled );
  213. cEXAMINE : DoCommandEXAMINE ( Thread, sTag, ArgStr, Handled );
  214. cCREATE : DoCommandCREATE ( Thread, sTag, ArgStr, Handled );
  215. cDELETE : DoCommandDELETE ( Thread, sTag, ArgStr, Handled );
  216. cRENAME : DoCommandRENAME ( Thread, sTag, ArgStr, Handled );
  217. cSUBSCRIBE : DoCommandSUBSCRIBE ( Thread, sTag, ArgStr, Handled );
  218. cUNSUBSCRIBE : DoCommandUNSUBSCRIBE ( Thread, sTag, ArgStr, Handled );
  219. cLIST : DoCommandLIST ( Thread, sTag, ArgStr, Handled );
  220. cLSUB : DoCommandLSUB ( Thread, sTag, ArgStr, Handled );
  221. cSTATUS : DoCommandSTATUS ( Thread, sTag, ArgStr, Handled );
  222. cAPPEND : DoCommandAPPEND ( Thread, sTag, ArgStr, Handled );
  223. cCHECK : DoCommandCHECK ( Thread, sTag, ArgStr, Handled );
  224. cCLOSE : DoCommandCLOSE ( Thread, sTag, ArgStr, Handled );
  225. cEXPUNGE : DoCommandEXPUNGE ( Thread, sTag, ArgStr, Handled);
  226. cSEARCH : DoCommandSEARCH ( Thread, sTag, ArgStr, Handled );
  227. cFETCH : DoCommandFETCH ( Thread, sTag, ArgStr, Handled );
  228. cSTORE : DoCommandSTORE ( Thread, sTag, ArgStr, Handled );
  229. cCOPY : DoCommandCOPY ( Thread, sTag, ArgStr, Handled );
  230. cUID : DoCommandUID ( Thread, sTag, ArgStr, Handled );
  231. else
  232. begin
  233. if ( Length ( SCmd ) > 0 ) and ( UpCase ( SCmd[1] ) = 'X' ) then {Do not Localize}
  234. begin
  235. DoCommandX ( Thread, sTag, ArgStr, Handled );
  236. end //if ( Length ( SCmd ) > 0) and ( UpCase ( SCmd[1] ) = 'X' ) then {Do not Localize}
  237. else
  238. begin
  239. DoCommandError ( Thread, sTag, ArgStr, Handled );
  240. end; // else ..if ( Length ( SCmd ) > 0) and ( UpCase ( SCmd[1] ) = 'X' ) then {Do not Localize}
  241. end; // else .. case
  242. end; {Case}
  243. end; {while}
  244. end; { doExecute }
  245. procedure TIdIMAP4Server.DoCommandCapability(Thread: TIdPeerThread; Const Tag, CmdStr :String;
  246. Var Handled :Boolean);
  247. begin
  248. if Assigned ( fOnCommandCAPABILITY ) then
  249. begin
  250. OnCommandCAPABILITY ( Thread, Tag, CmdStr, Handled );
  251. end; //if Assigned ( fOnCommandCAPABILITY ) then
  252. end;
  253. procedure TIdIMAP4Server.DoCommandNOOP ( Thread : TIdPeerThread;
  254. const Tag, CmdStr : String; var Handled : Boolean );
  255. begin
  256. if Assigned ( fONCommandNOOP ) then
  257. begin
  258. OnCommandNOOP ( Thread, Tag, CmdStr, Handled );
  259. end; // if Assigned ( fONCommandNOOP ) then
  260. end;
  261. procedure TIdIMAP4Server.DoCommandLOGOUT( Thread : TIdPeerThread;
  262. const Tag,CmdStr : String; var Handled : Boolean );
  263. begin
  264. if Assigned ( fONCommandLOGOUT ) then
  265. begin
  266. OnCommandLOGOUT ( Thread, Tag, CmdStr, Handled );
  267. end; // if Assigned ( fONCommandLOGOUT ) then
  268. end;
  269. procedure TIdIMAP4Server.DoCommandAUTHENTICATE ( Thread : TIdPeerThread;
  270. const Tag, CmdStr : String; var Handled : Boolean );
  271. begin
  272. if Assigned ( fONCommandAUTHENTICATE ) then
  273. begin
  274. OnCommandAUTHENTICATE(Thread,Tag, CmdStr,Handled);
  275. end; // if Assigned ( fONCommandAUTHENTICATE ) then
  276. end;
  277. procedure TIdIMAP4Server.DoCommandLOGIN ( Thread : TIdPeerThread;
  278. const Tag,CmdStr :String; var Handled :Boolean );
  279. begin
  280. if Assigned ( fONCommandLOGIN ) then
  281. begin
  282. OnCommandLOGIN ( Thread,Tag, CmdStr, Handled );
  283. end; //if Assigned ( fONCommandLOGIN ) then
  284. end;
  285. procedure TIdIMAP4Server.DoCommandSELECT(Thread : TIdPeerThread;
  286. const Tag, CmdStr : String; var Handled : Boolean );
  287. begin
  288. if Assigned ( fONCommandSELECT ) then
  289. begin
  290. OnCommandSELECT ( Thread, Tag, CmdStr, Handled );
  291. end; //if Assigned ( fONCommandSELECT ) then
  292. end;
  293. procedure TIdIMAP4Server.DoCommandEXAMINE(Thread : TIdPeerThread;
  294. const Tag, CmdStr :String; var Handled : Boolean);
  295. begin
  296. if Assigned ( fONCommandEXAMINE ) then
  297. begin
  298. OnCommandEXAMINE ( Thread, Tag, CmdStr, Handled );
  299. end; // if Assigned ( fONCommandEXAMINE ) then
  300. end;
  301. procedure TIdIMAP4Server.DoCommandCREATE ( Thread : TIdPeerThread;
  302. const Tag, CmdStr : String; var Handled :Boolean);
  303. begin
  304. if Assigned ( fONCommandCREATE ) then
  305. begin
  306. OnCommandCREATE( Thread, Tag, CmdStr, Handled );
  307. end; // if Assigned ( fONCommandCREATE ) then
  308. end;
  309. procedure TIdIMAP4Server.DoCommandDELETE ( Thread : TIdPeerThread;
  310. const Tag, CmdStr : String; var Handled :Boolean );
  311. begin
  312. if Assigned ( fONCommandDELETE ) then
  313. begin
  314. OnCommandDELETE ( Thread, Tag, CmdStr, Handled );
  315. end; // if Assigned ( fONCommandDELETE ) then
  316. end;
  317. procedure TIdIMAP4Server.DoCommandRENAME ( Thread : TIdPeerThread;
  318. const Tag, CmdStr : String; var Handled : Boolean );
  319. begin
  320. if Assigned ( fONCommandRENAME ) then
  321. begin
  322. OnCommandRENAME( Thread, Tag, CmdStr, Handled );
  323. end; // if Assigned ( fONCommandRENAME ) then
  324. end;
  325. procedure TIdIMAP4Server.DoCommandSUBSCRIBE( Thread : TIdPeerThread;
  326. const Tag, CmdStr : String; var Handled : Boolean );
  327. begin
  328. if Assigned ( fONCommandSUBSCRIBE ) then
  329. begin
  330. OnCommandSUBSCRIBE ( Thread, Tag, CmdStr, Handled );
  331. end; // if Assigned ( fONCommandSUBSCRIBE ) then
  332. end;
  333. procedure TIdIMAP4Server.DoCommandUNSUBSCRIBE( Thread : TIdPeerThread;
  334. const Tag, CmdStr : String; var Handled : Boolean );
  335. begin
  336. if Assigned ( fONCommandUNSUBSCRIBE ) then
  337. begin
  338. OnCommandUNSUBSCRIBE(Thread,Tag,CmdStr,Handled);
  339. end; // if Assigned ( fONCommandUNSUBSCRIBE ) then
  340. end;
  341. procedure TIdIMAP4Server.DoCommandLIST(Thread: TIdPeerThread;
  342. const Tag, CmdStr : String; var Handled : Boolean);
  343. begin
  344. if Assigned ( fONCommandLIST ) then
  345. begin
  346. OnCommandLIST(Thread,Tag, CmdStr, Handled );
  347. end; // if Assigned ( fONCommandLIST ) then
  348. end;
  349. procedure TIdIMAP4Server.DoCommandLSUB ( Thread: TIdPeerThread;
  350. const Tag, CmdStr :String; var Handled : Boolean );
  351. begin
  352. if Assigned ( fONCommandLSUB ) then
  353. begin
  354. OnCommandLSUB ( Thread, Tag, CmdStr, Handled );
  355. end; //if Assigned ( fONCommandLSUB ) then
  356. end;
  357. procedure TIdIMAP4Server.DoCommandSTATUS( Thread: TIdPeerThread;
  358. const Tag, CmdStr : String; var Handled : Boolean);
  359. begin
  360. if Assigned ( fONCommandSTATUS ) then
  361. begin
  362. OnCommandSTATUS ( Thread, Tag, CmdStr, Handled );
  363. end; // if Assigned ( fONCommandSTATUS ) then
  364. end;
  365. procedure TIdIMAP4Server.DoCommandAPPEND( Thread : TIdPeerThread;
  366. const Tag, CmdStr : String; var Handled : Boolean );
  367. begin
  368. if Assigned ( fONCommandAPPEND ) then
  369. begin
  370. OnCommandAPPEND ( Thread, Tag, CmdStr, Handled );
  371. end; // if Assigned(fONCommandAPPEND) then
  372. end;
  373. procedure TIdIMAP4Server.DoCommandCHECK(Thread: TIdPeerThread;
  374. const Tag, CmdStr : String; var Handled :Boolean);
  375. begin
  376. if Assigned ( fONCommandCHECK ) then
  377. begin
  378. OnCommandCHECK ( Thread, Tag, CmdStr, Handled );
  379. end; // if Assigned(fONCommandCHECK) then
  380. end;
  381. procedure TIdIMAP4Server.DoCommandCLOSE(Thread: TIdPeerThread;
  382. const Tag, CmdStr : String; var Handled :Boolean );
  383. begin
  384. if Assigned ( fONCommandCLOSE ) then
  385. begin
  386. OnCommandCLOSE ( Thread, Tag, CmdStr, Handled );
  387. end; // if Assigned ( fONCommandCLOSE ) then
  388. end;
  389. procedure TIdIMAP4Server.DoCommandEXPUNGE(Thread: TIdPeerThread;
  390. const Tag, CmdStr : String; var Handled :Boolean);
  391. begin
  392. if Assigned ( fONCommandEXPUNGE ) then
  393. begin
  394. OnCommandEXPUNGE ( Thread, Tag, CmdStr, Handled );
  395. end; //if Assigned ( fONCommandEXPUNGE ) then
  396. end;
  397. procedure TIdIMAP4Server.DoCommandSEARCH(Thread: TIdPeerThread;
  398. const Tag, CmdStr : String; var Handled :Boolean );
  399. begin
  400. if Assigned ( fONCommandSEARCH ) then
  401. begin
  402. OnCommandSEARCH ( Thread, Tag, CmdStr, Handled );
  403. end; // if Assigned ( fONCommandSEARCH ) then
  404. end;
  405. procedure TIdIMAP4Server.DoCommandFETCH(Thread: TIdPeerThread;
  406. const Tag, CmdStr : String; var Handled :Boolean);
  407. begin
  408. if Assigned ( fONCommandFETCH ) then
  409. begin
  410. OnCommandFETCH ( Thread,Tag, CmdStr, Handled );
  411. end; // if Assigned ( fONCommandFETCH ) then
  412. end;
  413. procedure TIdIMAP4Server.DoCommandSTORE(Thread: TIdPeerThread;
  414. const Tag, CmdStr : String; var Handled :Boolean);
  415. begin
  416. if Assigned ( fONCommandSTORE ) then
  417. begin
  418. OnCommandSTORE ( Thread, Tag, CmdStr, Handled );
  419. end; //if Assigned ( fONCommandSTORE ) then
  420. end;
  421. procedure TIdIMAP4Server.DoCommandCOPY(Thread: TIdPeerThread;
  422. const Tag, CmdStr : String; var Handled :Boolean);
  423. begin
  424. if Assigned ( fONCommandCOPY ) then
  425. begin
  426. OnCommandCOPY ( Thread, Tag, CmdStr, Handled );
  427. end; // if Assigned ( fONCommandCOPY ) then
  428. end;
  429. procedure TIdIMAP4Server.DoCommandUID(Thread: TIdPeerThread; const Tag, CmdStr :String;
  430. var Handled : Boolean );
  431. begin
  432. if Assigned ( fONCommandUID ) then
  433. begin
  434. OnCommandUID ( Thread, Tag, CmdStr, Handled );
  435. end; // if Assigned ( fONCommandUID ) then
  436. end;
  437. procedure TIdIMAP4Server.DoCommandX(Thread: TIdPeerThread; const Tag, CmdStr :String;
  438. var Handled : Boolean);
  439. begin
  440. if Assigned ( fONCommandX ) then
  441. begin
  442. OnCommandX ( Thread, Tag, CmdStr, Handled );
  443. end; // if Assigned ( fONCommandX ) then
  444. end;
  445. procedure TIdIMAP4Server.DoCommandError(Thread: TIdPeerThread; const Tag, CmdStr :String;
  446. var Handled : Boolean );
  447. begin
  448. if Assigned ( fONCommandError ) then
  449. begin
  450. OnCommandError ( Thread, Tag, CmdStr, Handled );
  451. end; // if Assigned ( fONCommandError ) then
  452. end;
  453. //------------------------------------------------------------------------------
  454. // End of TIdIMAP4Server Code
  455. // Started August 26, 1999
  456. //------------------------------------------------------------------------------
  457. End.