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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: named_pipe.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 20:48:30  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: named_pipe.cpp,v 1000.1 2004/06/01 20:48:30 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:  Josh Cherry
  35.  *
  36.  * File Description:
  37.  *    Named pipe functionality for Genome Workbench
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "named_pipe.hpp"
  41. #include "load_file.hpp"
  42. #include "gbench.hpp"
  43. #include <gui/utils/system_path.hpp>
  44. #include <FL/Fl.H>
  45. BEGIN_NCBI_SCOPE
  46. CNamedPipeServer CGBenchPipe::sm_NamedPipeServer;
  47. void CGBenchPipe::Start(void)
  48. {
  49.     if (sm_NamedPipeServer.Create(x_GetPipeName()) != eIO_Success) {
  50.         throw runtime_error("CNamedPipeServer::Create failed");
  51.     }
  52.     // zero timeouts for open (Listen) and read
  53.     STimeout to = {0, 0};
  54.     if (sm_NamedPipeServer.SetTimeout(eIO_Open, &to) != eIO_Success) {
  55.         throw runtime_error("CNamedPipeServer::SetTimeout failed for Open");
  56.     }
  57.     if (sm_NamedPipeServer.SetTimeout(eIO_Read, &to) != eIO_Success) {
  58.         throw runtime_error("CNamedPipeServer::SetTimeout failed for Read");
  59.     }
  60.     // call the callback to read, which has itself called repeatedly
  61.     Fl::add_timeout(0.1, x_ReadPipe, NULL);   
  62. }
  63. // Determine appropriate name of pipe
  64. string CGBenchPipe::x_GetPipeName(void)
  65. {
  66. #ifdef NCBI_OS_MSWIN
  67. string user_name = CGBenchApp::Instance()->GetEnvironment().Get("USERNAME");
  68.     return "\\.\pipe\gbench_pipe-" + user_name;
  69. #else  // unix of some sort
  70.     return CSystemPath::ResolvePath("<home>/gbench_pipe");
  71. #endif
  72. }
  73. // fltk timeout callback to read pipe.
  74. // ptr argument is a pointer to the app.
  75. void CGBenchPipe::x_ReadPipe(void *ptr)
  76. {
  77.     CNamedPipeServer& srv = sm_NamedPipeServer;
  78.     if (srv.Listen() == eIO_Success) {
  79.         string data;
  80.         const size_t buf_size = 1024;
  81.         char buf[buf_size];
  82.         size_t n_read;
  83.         while (srv.Status(eIO_Read) == eIO_Success ||
  84.                srv.Status(eIO_Read) == eIO_Timeout) {
  85.             srv.Read(buf, buf_size, &n_read);
  86.             data.append(buf, n_read);
  87.         }
  88.         // data is either just a file name, or a file name
  89.         // and a file type separated by a null
  90.         string fname;
  91.         string ftype;
  92.         vector<string> tokens;
  93.         string delim;
  94.         delim = '';  // not an empty string
  95.         NStr::Tokenize (data, delim, tokens);
  96.         fname = tokens[0];
  97.         if (tokens.size() > 1) {
  98.             ftype = tokens[1];
  99.         } else {
  100.             ftype = "auto";
  101.         }
  102.         GBenchLoadFile(fname, ftype, true);
  103.     }
  104.     Fl::repeat_timeout(0.1, x_ReadPipe, ptr);   
  105. }
  106. void CGBenchPipe::OpenRemote(const string& fname, const string& ftype)
  107. {
  108.     size_t n_written;
  109.     size_t total_written = 0;
  110.     string msg = fname + '' + ftype;
  111.     CNamedPipeClient cli;
  112.     STimeout to = {0, 100000};
  113.     if (cli.SetTimeout(eIO_Open, &to) != eIO_Success) {
  114.         throw runtime_error("CNamedPipeServer::SetTimeout failed for Open");
  115.     }
  116.     if (cli.Open(x_GetPipeName()) != eIO_Success) {
  117.         throw runtime_error("Failed to open named pipe for writing");
  118.     }
  119.     while (1) {
  120.         EIO_Status status = cli.Write(msg.c_str() + total_written,
  121.                                       msg.size(), &n_written);
  122.         total_written += n_written;
  123.         if (total_written == msg.size()) {
  124.             break;
  125.         }
  126.         if (status != eIO_Success && status != eIO_Timeout) {
  127.             break;
  128.         }
  129.     }
  130.     if (total_written != msg.size()) {
  131.         throw runtime_error("Failed to write to named pipe");
  132.     }
  133. }
  134. END_NCBI_SCOPE
  135. /*
  136.  * ===========================================================================
  137.  * $Log: named_pipe.cpp,v $
  138.  * Revision 1000.1  2004/06/01 20:48:30  gouriano
  139.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  140.  *
  141.  * Revision 1.10  2004/05/21 22:27:42  gorelenk
  142.  * Added PCH ncbi_pch.hpp
  143.  *
  144.  * Revision 1.9  2004/03/23 13:38:08  dicuccio
  145.  * MOre efficient use of FLTK timeouts
  146.  *
  147.  * Revision 1.8  2004/03/22 15:40:20  jcherry
  148.  * Added file type command-line argument
  149.  *
  150.  * Revision 1.7  2004/03/17 15:46:18  jcherry
  151.  * Windows hack no longer necessary
  152.  *
  153.  * Revision 1.6  2004/03/16 18:34:44  jcherry
  154.  * Append username to pipe name on Windows to make it unique
  155.  *
  156.  * Revision 1.5  2004/03/16 17:40:06  jcherry
  157.  * A hack for Windows
  158.  *
  159.  * Revision 1.4  2004/03/16 17:29:02  jcherry
  160.  * Added timeout for opening for write
  161.  *
  162.  * Revision 1.3  2004/03/15 16:06:18  jcherry
  163.  * Launch default viewer when opening file from command line
  164.  *
  165.  * Revision 1.2  2004/03/11 19:25:35  jcherry
  166.  * Moved load_file to gui/gbench
  167.  *
  168.  * Revision 1.1  2004/03/11 17:10:35  jcherry
  169.  * Initial version
  170.  *
  171.  * ===========================================================================
  172.  */