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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: plugin_thread.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 20:44:33  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: plugin_thread.cpp,v 1000.1 2004/06/01 20:44:33 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:  Mike DiCuccio
  35.  *
  36.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "plugin_thread.hpp"
  41. #include <gui/plugin/PluginReply.hpp>
  42. #include <gui/core/plugin_utils.hpp>
  43. #include <gui/core/obj_convert.hpp>
  44. BEGIN_NCBI_SCOPE
  45. USING_SCOPE(objects);
  46. CPluginTask::CPluginTask(CPluginHandle& handle, CPluginMessage& msg)
  47.     : m_Handle(handle)
  48.     , m_Message(&msg)
  49. {
  50. #if 0 //def NCBI_THREADS
  51.     m_Thread.Reset(new CPluginThread(m_Handle, *m_Message));
  52.     m_Thread->Run(CThread::fRunAllowST);
  53. #else
  54.     m_Handle.Execute(*m_Message);
  55. #endif
  56. }
  57. bool CPluginTask::IsCompleted(void) const
  58. {
  59.     return m_Thread ? m_Thread->IsCompleted() : true;
  60. }
  61. void CPluginTask::Finalize(void)
  62. {
  63.     if ( !m_Message ) {
  64.         return;
  65.     }
  66.     if (m_Thread) {
  67.         m_Thread->Join();
  68.     }
  69.     // process the replies
  70.     CPluginReply& reply = m_Message->SetReply();
  71.     if (reply.CanGetFormatted()) {
  72.         // favor caller's preference and fit the raw objects into
  73.         // the caller's preformatted args
  74.         CPluginUtils::FillArgs(reply.SetFormatted(), reply.GetRaw());
  75.     } else if (reply.CanGetAction()) {
  76.         //
  77.         // default action processing
  78.         //
  79.         x_ProcessReply(reply);
  80.     }
  81.     switch (reply.GetStatus()) {
  82.     case eMessageStatus_failed:
  83.         LOG_POST(Error << "Failed to execute plugin");
  84.         break;
  85.     default:
  86.         break;
  87.     }
  88.     // reset our data so we're empty
  89.     LOG_POST(Info << "finalized message: " << m_Message->ToString());
  90.     m_Thread.Reset();
  91.     m_Message.Reset();
  92. }
  93. void CPluginTask::x_ProcessReply(const CPluginReply& reply) const
  94. {
  95.     ITERATE (CPluginReply::TAction, act_iter, reply.GetAction()) {
  96.         const CPluginReplyAction& act = **act_iter;
  97.         switch (act.Which()) {
  98.         case CPluginReplyAction::e_Add_to_document:
  99.             //
  100.             // add the object to the current document
  101.             //
  102.             ITERATE (CPluginReply::TRaw, raw_iter, reply.GetRaw()) {
  103.                 const CPluginValue& val = **raw_iter;
  104.                 if ( !val.IsObject() ) {
  105.                     // we only do this with values of type Object
  106.                     continue;
  107.                 }
  108.                 //
  109.                 // generically convert everything to a seq-entry
  110.                 //
  111.                 IDocument* doc =
  112.                     const_cast<IDocument*>(val.GetDocument());
  113.                 CObjectConverter::TObjList objs;
  114.                 CObjectConverter::Convert(doc->GetScope(),
  115.                                           *val.GetObject(),
  116.                                           CSeq_entry::GetTypeInfo(), objs);
  117.                 ITERATE (CObjectConverter::TObjList, obj_iter, objs) {
  118.                     const CSeq_entry* entry =
  119.                         dynamic_cast<const CSeq_entry*>
  120.                         (obj_iter->GetPointer());
  121.                     if ( !entry ) {
  122.                         continue;
  123.                     }
  124.                     doc->GetScope()
  125.                         .AddTopLevelSeqEntry(const_cast<CSeq_entry&>(*entry));
  126.                 }
  127.                 doc->UpdateAllViews();
  128.                 LOG_POST(Error << "unhandled object in plugin reply");
  129.             }
  130.             break;
  131.         case CPluginReplyAction::e_New_view:
  132.             break;
  133.         default:
  134.             break;
  135.         }
  136.     }
  137. }
  138. CPluginThread::CPluginThread(CPluginHandle& handle, CPluginMessage& msg)
  139.     : m_Handle(handle)
  140.     , m_Message(&msg)
  141.     , m_Completed(false)
  142. {
  143. }
  144. void* CPluginThread::Main()
  145. {
  146.     m_Handle.Execute(*m_Message);
  147.     m_Completed = true;
  148.     return NULL;
  149. }
  150. END_NCBI_SCOPE
  151. /*
  152.  * ===========================================================================
  153.  * $Log: plugin_thread.cpp,v $
  154.  * Revision 1000.1  2004/06/01 20:44:33  gouriano
  155.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  156.  *
  157.  * Revision 1.4  2004/05/21 22:27:40  gorelenk
  158.  * Added PCH ncbi_pch.hpp
  159.  *
  160.  * Revision 1.3  2004/01/21 12:38:18  dicuccio
  161.  * redesigned CObjectCOnverter API to eliminate temporary object creation
  162.  *
  163.  * Revision 1.2  2003/12/22 19:20:41  dicuccio
  164.  * Added implementation of plugin tasks (initial revision; not currently used)
  165.  *
  166.  * Revision 1.1  2003/12/09 15:51:19  dicuccio
  167.  * Deprecated Fl_Toggle_Tree - replaced with Flu_Tree_Browser.  Added CTreeBrowser
  168.  * as a standard tree interface
  169.  *
  170.  * ===========================================================================
  171.  */