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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: obj_sniff.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 20:26:58  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.15
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJ_SNIFF__HPP
  10. #define OBJ_SNIFF__HPP
  11. /*  $Id: obj_sniff.hpp,v 1000.0 2003/10/29 20:26:58 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Author: Anatoliy Kuznetsov
  37.  *
  38.  * File Description: Methods of objects deserialization when the input 
  39.  *                   format is uncertain.
  40.  *
  41.  */
  42. #include <corelib/ncbistd.hpp>
  43. #include <util/format_guess.hpp>
  44. #include <serial/objectinfo.hpp>
  45. #include <serial/objistr.hpp>
  46. BEGIN_NCBI_SCOPE
  47. BEGIN_SCOPE(objects)
  48. //////////////////////////////////////////////////////////////////
  49. //
  50. // Serialized objects sniffer.
  51. // Binary ASN format does not include any information on what 
  52. // objects are encoded in any particular file. This class uses
  53. // try and fail method to identify if the input stream contains
  54. // any objects.
  55. //
  56. // Use AddCandidate function to tune the sniffer for recognition, 
  57. // then call Probe to interrogate the stream.
  58. // 
  59. // NOTE: This method is not 100% accurate. Small probablitity 
  60. // present that serialization code will be able to read the
  61. // wrong type.
  62. //
  63. class NCBI_XOBJUTIL_EXPORT CObjectsSniffer
  64. {
  65. public:
  66.     struct SObjectDescription 
  67.     {
  68.         CObjectTypeInfo  info;            // Type information class
  69.         size_t           stream_offset;   // Offset in file
  70.         SObjectDescription(const CObjectTypeInfo& object_info,
  71.                            size_t offset)
  72.         : info(object_info),
  73.           stream_offset(offset)
  74.         {}
  75.     };
  76.     // Specifies how the OnObjectFoundPre and OnObjectFoundPost events will
  77.     // be delivered
  78.     enum EEventCallBackMode
  79.     {
  80.         eCallAlways,  // Default mode of operation
  81.         eDoNotCall,   // Object deserialized, but OnObjectFound not called
  82.         eSkipObject   // Object is skipped from deserialization
  83.     };
  84.     struct SCandidateInfo
  85.     {
  86.         CObjectTypeInfo     type_info;
  87.         EEventCallBackMode  event_mode;
  88.         SCandidateInfo(CObjectTypeInfo tinfo, EEventCallBackMode emode)
  89.         : type_info(tinfo),
  90.           event_mode(emode)
  91.         {}
  92.     };
  93.     typedef vector<SObjectDescription>  TTopLevelMapVector;
  94.     typedef vector<SCandidateInfo>      TCandidates;
  95.     // List of objects, reflects objects serialization hierarchy
  96.     typedef list<const CObjectInfo*> TObjectStack;
  97. public:
  98.     CObjectsSniffer() : m_DiscardCurrObj(false) {}
  99.     virtual ~CObjectsSniffer() {}
  100.     // Add new possible type to the recognition list.
  101.     void AddCandidate(CObjectTypeInfo ti, 
  102.                       EEventCallBackMode emode=eCallAlways);
  103.     // Return reference on the internal vector of object candidates.
  104.     const TCandidates& GetCandidates() const { return m_Candidates; }
  105.     // The main worker function. Tryes to identify if the input stream contains
  106.     // any candidate objects. Function reads the stream up until it ends of
  107.     // deserializer cannot recognize the input file format.
  108.     void Probe(CObjectIStream& input);
  109.     // Get map of all top level objects
  110.     const TTopLevelMapVector& GetTopLevelMap() const { return m_TopLevelMap; }
  111.     // Return TRUE if Probe found at least one top level objects
  112.     bool IsTopObjectFound() const { return m_TopLevelMap.size() != 0; }
  113.     // Return stream offset of the most recently found top object.
  114.     // Note: If the top object has not been found return value is undefined.
  115.     size_t GetStreamOffset() const { return m_StreamOffset; }
  116.     // Event handling virtual function, called when candidate is found but 
  117.     // before deserialization. This function can be overloaded in child
  118.     // classes to implement some custom actions. This function is called before
  119.     // deserialization.
  120.     virtual void OnObjectFoundPre(const CObjectInfo& object, 
  121.                                   size_t stream_offset);
  122.     
  123.     // Event handling virtual function, called when candidate is found
  124.     // and deserialized.
  125.     virtual void OnObjectFoundPost(const CObjectInfo& object);
  126.     // Event indicates that sniffer objects needs to reset it's status and
  127.     // get ready for the next probing.
  128.     virtual void Reset() {}
  129.     // Set the discard flag. If set TRUE current deserialized object is not
  130.     // deserialized. 
  131.     // The mechanizm is based on CObjectIStream::SetDiscardCurrObject
  132.     void SetDiscardCurrObject(bool discard=true) { m_DiscardCurrObj = discard; }
  133.     bool GetDiscardCurrObject() const { return m_DiscardCurrObj; }
  134. protected:
  135.     void ProbeASN1_Text(CObjectIStream& input);
  136.     void ProbeASN1_Bin(CObjectIStream& input);
  137. protected:
  138.     TObjectStack         m_CallStack;
  139.     
  140.     friend class COffsetReadHook;
  141. private:
  142.     // Possible candidates for type probing
  143.     TCandidates         m_Candidates;    
  144.     // Vector of level object descriptions
  145.     TTopLevelMapVector  m_TopLevelMap;   
  146.     // Stream offset of the top level object
  147.     size_t              m_StreamOffset;  
  148.     // Flag indicates that current object should be discarded
  149.     bool                m_DiscardCurrObj;
  150. };
  151. // Return serialization format corresponding to CFormatGuess
  152. inline ESerialDataFormat FormatGuess2Serial(CFormatGuess::EFormat fmt)
  153. {
  154.     switch (fmt) 
  155.     {
  156.     case CFormatGuess::eBinaryASN:
  157.         return eSerial_AsnBinary;
  158.     case CFormatGuess::eTextASN:
  159.         return eSerial_AsnText;
  160.     case CFormatGuess::eXml:
  161.         return eSerial_Xml;
  162.     case CFormatGuess::eFasta:
  163.         return eSerial_None;       
  164.     default:
  165.         return eSerial_None;
  166.     }
  167. }
  168. END_SCOPE(objects)
  169. END_NCBI_SCOPE
  170. /*
  171.  * ===========================================================================
  172.  * $Log: obj_sniff.hpp,v $
  173.  * Revision 1000.0  2003/10/29 20:26:58  gouriano
  174.  * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.15
  175.  *
  176.  * Revision 1.15  2003/10/07 20:42:04  kuznets
  177.  * + virtual Reset() function.
  178.  * Called when object scan fails because of the format error and the
  179.  * whole state machine should be reset.
  180.  *
  181.  * Revision 1.14  2003/09/09 20:22:40  kuznets
  182.  * Fixed a bug in CObjectsSniffer::SetDiscardCurrObject()
  183.  *
  184.  * Revision 1.13  2003/08/28 16:15:23  kuznets
  185.  * + SetDiscardCurrObject() method
  186.  *
  187.  * Revision 1.12  2003/08/25 14:27:24  kuznets
  188.  * Added stack reflecting current serialization hooks call hierachy.
  189.  *
  190.  * Revision 1.11  2003/08/05 21:11:48  kuznets
  191.  * +eSkipObject deserialization callback mode
  192.  *
  193.  * Revision 1.10  2003/08/05 14:31:06  kuznets
  194.  * Implemented background "do not call" candidates for recognition.
  195.  *
  196.  * Revision 1.9  2003/07/14 19:25:20  kuznets
  197.  * Cosmetic fix.
  198.  *
  199.  * Revision 1.8  2003/06/06 20:26:56  kuznets
  200.  * Added inline function FormatGuess2Serial
  201.  *
  202.  * Revision 1.7  2003/06/02 16:01:38  dicuccio
  203.  * Rearranged include/objects/ subtree.  This includes the following shifts:
  204.  *     - include/objects/alnmgr --> include/objtools/alnmgr
  205.  *     - include/objects/cddalignview --> include/objtools/cddalignview
  206.  *     - include/objects/flat --> include/objtools/flat
  207.  *     - include/objects/objmgr/ --> include/objmgr/
  208.  *     - include/objects/util/ --> include/objmgr/util/
  209.  *     - include/objects/validator --> include/objtools/validator
  210.  *
  211.  * Revision 1.4  2003/05/22 16:46:46  kuznets
  212.  * ObjectFound methods renamed OnObjectFound, added GetCandidates() method
  213.  *
  214.  * Revision 1.3  2003/05/21 14:27:49  kuznets
  215.  * Added methods ObjectFoundPre, ObjectFoundPost
  216.  *
  217.  * Revision 1.2  2003/05/19 16:38:37  kuznets
  218.  * Added support for ASN text
  219.  *
  220.  * Revision 1.1  2003/05/16 19:34:32  kuznets
  221.  * Initial revision.
  222.  *
  223.  * ===========================================================================
  224.  */
  225. #endif /* OBJ_SNIFF__HPP */