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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: asn_connection.c,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:14:34  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: asn_connection.c,v 1000.3 2004/06/01 19:14:34 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.  * Author:  Anton Lavrentiev
  35.  *
  36.  * File Description:
  37.  *     Build C Toolkit ASN streams on top of CONN (connection).
  38.  *
  39.  */
  40. #include <connect/ncbi_service_connector.h>
  41. #include <ctools/asn_connection.h>
  42. #include "../connect/ncbi_priv.h"
  43. #ifdef __cplusplus
  44. extern "C" {
  45.     static Int2 LIBCALLBACK s_AsnRead(Pointer p, CharPtr buff, Uint2 len);
  46.     static Int2 LIBCALLBACK s_AsnWrite(Pointer p, CharPtr buff, Uint2 len);
  47.     static void s_CloseAsnConn(CONN conn, ECONN_Callback type, void* data);
  48. }
  49. #endif
  50. static Int2 LIBCALLBACK s_AsnRead(Pointer p, CharPtr buff, Uint2 len)
  51. {
  52.     size_t n_read;
  53.     CONN_Read((CONN) p, buff, len, &n_read, eIO_ReadPlain);
  54.     return (Int2) n_read;
  55. }
  56. static Int2 LIBCALLBACK s_AsnWrite(Pointer p, CharPtr buff, Uint2 len)
  57. {
  58.     size_t n_written;
  59.     CONN_Write((CONN) p, buff, len, &n_written, eIO_WritePersist);
  60.     return (Int2) n_written;
  61. }
  62. struct SAsnConn_Cbdata {
  63.     SCONN_Callback cb;
  64.     AsnIoPtr       ptr;
  65. };
  66. static void s_CloseAsnConn(CONN conn, ECONN_Callback type, void* data)
  67. {
  68.     struct SAsnConn_Cbdata* cbdata = (struct SAsnConn_Cbdata*) data;
  69.     assert(type == eCONN_OnClose && cbdata && cbdata->ptr);
  70.     CONN_SetCallback(conn, type, &cbdata->cb, 0); 
  71.     AsnIoFree(cbdata->ptr, 0/*not a file - don't close*/);
  72.     if ( cbdata->cb.func )
  73.         (*cbdata->cb.func)(conn, type, cbdata->cb.data);
  74.     free(cbdata);
  75. }
  76. static void s_SetAsnConn_CloseCb(CONN conn, AsnIoPtr ptr)
  77. {
  78.     struct SAsnConn_Cbdata* cbdata = (struct SAsnConn_Cbdata*)
  79.         malloc(sizeof(*cbdata));
  80.     assert( ptr );
  81.     if ( cbdata ) {
  82.         SCONN_Callback cb;
  83.         cbdata->ptr = ptr;
  84.         cb.func = s_CloseAsnConn;
  85.         cb.data = cbdata;
  86.         CONN_SetCallback(conn, eCONN_OnClose, &cb, &cbdata->cb);
  87.     } else
  88.         CORE_LOG(eLOG_Error,
  89.                  "Cannot create cleanup callback for ASN conn-based stream");
  90. }
  91. AsnIoPtr CreateAsnConn(CONN               conn,
  92.                        EAsnConn_Direction direction,
  93.                        EAsnConn_Format    fmt)
  94. {
  95.     AsnIoPtr ptr;
  96.     int flags;
  97.     switch (fmt) {
  98.     case eAsnConn_Binary:
  99.         flags = ASNIO_BIN;
  100.         break;
  101.     case eAsnConn_Text:
  102.         flags = ASNIO_TEXT;
  103.         break;
  104.     default:
  105.         return 0;
  106.     }
  107.     switch (direction) {
  108.     case eAsnConn_Input:
  109.         ptr = AsnIoNew(flags | ASNIO_IN, 0, (void*) conn, s_AsnRead, 0);
  110.         break;
  111.     case eAsnConn_Output:
  112.         ptr = AsnIoNew(flags | ASNIO_OUT, 0, (void*) conn, 0, s_AsnWrite);
  113.         break;
  114.     default:
  115.         return 0;
  116.     }
  117.     if (ptr)
  118.         s_SetAsnConn_CloseCb(conn, ptr);
  119.     return ptr;
  120. }
  121. CONN CreateAsnConn_ServiceEx(const char*           service,
  122.                              EAsnConn_Format       input_fmt,
  123.                              AsnIoPtr*             input,
  124.                              EAsnConn_Format       output_fmt,
  125.                              AsnIoPtr*             output,
  126.                              TSERV_Type            type,
  127.                              const SConnNetInfo*   net_info,
  128.                              const SSERVICE_Extra* params)
  129. {
  130.     CONN conn;
  131.     CONNECTOR c = SERVICE_CreateConnectorEx(service, type, net_info, params);
  132.     if (!c || CONN_Create(c, &conn) != eIO_Success)
  133.         return 0/*failed*/;
  134.     assert(conn);
  135.     if (input)
  136.         *input = CreateAsnConn(conn, eAsnConn_Input, input_fmt);
  137.     if (output)
  138.         *output = CreateAsnConn(conn, eAsnConn_Output, output_fmt);
  139.     return conn;
  140. }
  141. CONN CreateAsnConn_Service(const char*     service,
  142.                            EAsnConn_Format input_fmt,
  143.                            AsnIoPtr*       input,
  144.                            EAsnConn_Format output_fmt,
  145.                            AsnIoPtr*       output)
  146. {
  147.     return CreateAsnConn_ServiceEx(service, input_fmt, input,
  148.                                    output_fmt, output, fSERV_Any, 0, 0);
  149. }
  150. /*
  151.  * --------------------------------------------------------------------------
  152.  * $Log: asn_connection.c,v $
  153.  * Revision 1000.3  2004/06/01 19:14:34  gouriano
  154.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  155.  *
  156.  * Revision 1.7  2004/03/23 02:29:19  lavr
  157.  * Remove redundant inits in I/O callbacks
  158.  *
  159.  * Revision 1.6  2004/02/23 15:23:50  lavr
  160.  * New (last) parameter "how" added in CONN_Write() API call
  161.  *
  162.  * Revision 1.5  2003/11/13 16:01:31  lavr
  163.  * Included headers revised
  164.  *
  165.  * Revision 1.4  2002/08/07 16:38:18  lavr
  166.  * EIO_ReadMethod enums changed accordingly; log moved to end
  167.  *
  168.  * Revision 1.3  2001/09/24 20:32:44  lavr
  169.  * +SSERVICE_Extra* parameter in CreateAsnConn_ServiceEx()
  170.  *
  171.  * Revision 1.2  2001/06/29 14:04:17  lavr
  172.  * Close callback removes itself when called; fixes not to add callbacks
  173.  * in CreateAsnConn_ServiceEx, because they are already there!
  174.  *
  175.  * Revision 1.1  2001/06/28 21:58:23  lavr
  176.  * Initial revision
  177.  *
  178.  * ==========================================================================
  179.  */