file_messaging.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:7k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: file_messaging.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 18:33:49  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: file_messaging.hpp,v 1000.0 2003/10/29 18:33:49 gouriano Exp $
  10. * ===========================================================================
  11. *
  12. *                            PUBLIC DOMAIN NOTICE
  13. *               National Center for Biotechnology Information
  14. *
  15. *  This software/database is a "United States Government Work" under the
  16. *  terms of the United States Copyright Act.  It was written as part of
  17. *  the author's official duties as a United States Government employee and
  18. *  thus cannot be copyrighted.  This software/database is freely available
  19. *  to the public for use. The National Library of Medicine and the U.S.
  20. *  Government have not placed any restriction on its use or reproduction.
  21. *
  22. *  Although all reasonable efforts have been taken to ensure the accuracy
  23. *  and reliability of the software and data, the NLM and the U.S.
  24. *  Government do not and cannot warrant the performance or results that
  25. *  may be obtained by using this software or data. The NLM and the U.S.
  26. *  Government disclaim all warranties, express or implied, including
  27. *  warranties of performance, merchantability or fitness for any particular
  28. *  purpose.
  29. *
  30. *  Please cite the author in any work or product based on this material.
  31. *
  32. * ===========================================================================
  33. *
  34. * Authors:  Paul Thiessen
  35. *
  36. * File Description:
  37. *       file-based messaging system
  38. *
  39. * ===========================================================================
  40. */
  41. #ifndef FILE_MESSAGING__HPP
  42. #define FILE_MESSAGING__HPP
  43. #include <corelib/ncbistd.hpp>
  44. #include <corelib/ncbistl.hpp>
  45. #include <corelib/ncbifile.hpp>
  46. #include <string>
  47. #include <map>
  48. #include <list>
  49. BEGIN_NCBI_SCOPE
  50. //
  51. // FileMessageResponder is a mix-in class - an interface-only class that defines callback methods that
  52. // will be used to pass messages to an application object of this type. For both commands and replies,
  53. // if the 'data' string is not empty (size()>0), then it will be a series of 'n'-terminated lines.
  54. //
  55. class MessageResponder
  56. {
  57. public:
  58.     // called when a (new) command is received
  59.     virtual void ReceivedCommand(const std::string& fromApp, unsigned long id,
  60.         const std::string& command, const std::string& data) = 0;
  61.     // possible reply status values
  62.     enum ReplyStatus {
  63.         REPLY_OKAY,
  64.         REPLY_ERROR
  65.     };
  66.     // called when a reply is received
  67.     virtual void ReceivedReply(const std::string& fromApp, unsigned long id,
  68.         ReplyStatus status, const std::string& data) = 0;
  69. };
  70. //
  71. // FileMessenger represents an individual message file connection
  72. //
  73. class FileMessagingManager;
  74. class FileMessenger
  75. {
  76. private:
  77.     // (de)construction handled only by FileMessagingManager parent
  78.     friend class FileMessagingManager;
  79.     FileMessenger(FileMessagingManager *parentManager,
  80.         const std::string& messageFilename, MessageResponder *responderObject, bool isReadOnly);
  81.     // any pending commands are sent before the object is deconstructed
  82.     ~FileMessenger(void);
  83.     const FileMessagingManager * const manager;
  84.     const CDirEntry messageFile, lockFile;
  85.     MessageResponder * const responder;
  86.     const bool readOnly;
  87.     // keep track of id's used and sent to/from which recipient, and whether reply was received
  88.     typedef std::map < std::string , std::string > TargetApp2Command;
  89.     typedef std::map < unsigned long , TargetApp2Command > CommandOriginators;
  90.     CommandOriginators commandsSent, commandsReceived;
  91.     typedef std::map < std::string , MessageResponder::ReplyStatus > TargetApp2Status;
  92.     typedef std::map < unsigned long , TargetApp2Status > CommandReplies;
  93.     CommandReplies repliesReceived, repliesSent;
  94.     // keep a queue of commands to send next time the file is opened for writing
  95.     typedef struct {
  96.         std::string to;
  97.         unsigned long id;
  98.         std::string command, data;
  99.     } CommandInfo;
  100.     typedef std::list < CommandInfo > CommandList;
  101.     CommandList pendingCommands;
  102.     // keep track of file size last time the file was read
  103.     Int8 lastKnownSize;
  104.     // read the file and process any new commands
  105.     void ReceiveCommands(void);
  106.     // send any commands waiting in the queue
  107.     void SendPendingCommands(void);
  108. public:
  109.     // send a new command (must have a unique id for given target app)
  110.     void SendCommand(const std::string& targetApp, unsigned long id,
  111.         const std::string& command, const std::string& data);
  112.     // send reply to previously received command
  113.     void SendReply(const std::string& targetApp, unsigned long id,
  114.         MessageResponder::ReplyStatus status, const std::string& data);
  115.     // receives any new commands/replies and sends any pending ones
  116.     void PollMessageFile(void);
  117. };
  118. //
  119. // FileMessagingManager is a container for FileMessengers, mostly as a convenience
  120. // to poll all message files from one central function
  121. //
  122. class FileMessagingManager
  123. {
  124. private:
  125.     friend class FileMessenger;
  126.     const std::string applicationName;
  127.     typedef std::list < FileMessenger * > FileMessengerList;
  128.     FileMessengerList messengers;
  129. public:
  130.     FileMessagingManager(const std::string& appName);
  131.     // stops all monitoring and destroys all messenger objects, but does not delete any message files
  132.     ~FileMessagingManager(void);
  133.     // to create a new message file connection; if readOnly==false then replies are sent through
  134.     // the same file, otherwise replies are logged internally but the message file isn't changed
  135.     FileMessenger * CreateNewFileMessenger(const std::string& messageFilename,
  136.         MessageResponder *responderObject, bool readOnly);
  137.     // stop monitoring a connection, and destroy the messenger (but doesn't delete the file)
  138.     void DeleteFileMessenger(FileMessenger *messenger);
  139.     // for all FileMessengers, receives any new commands/replies and sends any pending ones
  140.     void PollMessageFiles(void);
  141. };
  142. END_NCBI_SCOPE
  143. #endif // FILE_MESSAGING__HPP
  144. /*
  145. * ---------------------------------------------------------------------------
  146. * $Log: file_messaging.hpp,v $
  147. * Revision 1000.0  2003/10/29 18:33:49  gouriano
  148. * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.4
  149. *
  150. * Revision 1.4  2003/10/20 23:03:33  thiessen
  151. * send pending commands before messenger is destroyed
  152. *
  153. * Revision 1.3  2003/03/19 14:44:36  thiessen
  154. * fix char/traits problem
  155. *
  156. * Revision 1.2  2003/03/13 18:55:04  thiessen
  157. * add messenger destroy function
  158. *
  159. * Revision 1.1  2003/03/13 14:26:18  thiessen
  160. * add file_messaging module; split cn3d_main_wxwin into cn3d_app, cn3d_glcanvas, structure_window, cn3d_tools
  161. *
  162. */