/*ARGSUSED*/ const SSERV_VTable* SERV_LOCAL_Open(SERV_ITER iter, SSERV_Info** info, HOST_INFO* u/*unused*/) { struct SLOCAL_Data* data; if (!iter->ismask && strpbrk(iter->name, "?*")) return 0/*failed to start unallowed wildcard search*/; if (!(data = (struct SLOCAL_Data*) calloc(1, sizeof(*data)))) return 0; iter->data = data; if (g_NCBI_ConnectRandomSeed == 0) { g_NCBI_ConnectRandomSeed = iter->time ^ NCBI_CONNECT_SRAND_ADDEND; srand(g_NCBI_ConnectRandomSeed); } if (!s_LoadServices(iter)) { s_Reset(iter); s_Close(iter); return 0; } if (data->n_cand > 1) qsort(data->cand, data->n_cand, sizeof(*data->cand), s_Sort); /* call GetNextInfo subsequently if info is actually needed */ if (info) *info = 0; return &s_op; }
static void s_Close(CONNECTOR connector, const STimeout* timeout, int/*bool*/ close_dispatcher) { SServiceConnector* uuu = (SServiceConnector*) connector->handle; if (uuu->name) { free((void*) uuu->name); uuu->name = 0; } if (uuu->descr) { free((void*) uuu->descr); uuu->descr = 0; } if (close_dispatcher) { if (uuu->user_header) { free((void*) uuu->user_header); uuu->user_header = 0; } if (uuu->params.reset) uuu->params.reset(uuu->params.data); s_CloseDispatcher(uuu); } if (uuu->meta.list) { SMetaConnector* meta = connector->meta; METACONN_Remove(meta, uuu->meta.list); uuu->meta.list = 0; s_Reset(meta, connector); } uuu->status = eIO_Closed; }
static EIO_Status s_Close(CONNECTOR connector, const STimeout* timeout, int/*bool*/ close_dispatcher) { SServiceConnector* uuu = (SServiceConnector*) connector->handle; EIO_Status status = eIO_Success; if (uuu->meta.close) status = uuu->meta.close(uuu->meta.c_close, timeout); if (uuu->name) { free((void*) uuu->name); uuu->name = 0; } if (close_dispatcher) { if (uuu->user_header) { free((void*) uuu->user_header); uuu->user_header = 0; } if (uuu->params.reset) uuu->params.reset(uuu->params.data); s_CloseDispatcher(uuu); } if (uuu->meta.list) { SMetaConnector* meta = connector->meta; METACONN_Remove(meta, uuu->meta.list); uuu->meta.list = 0; s_Reset(meta); } uuu->status = status; return status; }
/*ARGSUSED*/ const SSERV_VTable* SERV_DISPD_Open(SERV_ITER iter, const SConnNetInfo* net_info, SSERV_Info** info, HOST_INFO* u/*unused*/) { struct SDISPD_Data* data; if (!(data = (struct SDISPD_Data*) calloc(1, sizeof(*data)))) return 0; iter->data = data; assert(net_info); /*must be called with non-NULL*/ data->net_info = ConnNetInfo_Clone(net_info); if (!ConnNetInfo_SetupStandardArgs(data->net_info, iter->name)) { s_Close(iter); return 0; } if (g_NCBI_ConnectRandomSeed == 0) { g_NCBI_ConnectRandomSeed = iter->time ^ NCBI_CONNECT_SRAND_ADDEND; srand(g_NCBI_ConnectRandomSeed); } /* Reset request method to be GET ('cause no HTTP body is ever used) */ data->net_info->req_method = eReqMethod_Get; if (iter->stateless) data->net_info->stateless = 1/*true*/; if ((iter->types & fSERV_Firewall) && !data->net_info->firewall) data->net_info->firewall = eFWMode_Adaptive; ConnNetInfo_ExtendUserHeader(data->net_info, "User-Agent: NCBIServiceDispatcher/" HTTP_DISP_VERSION #ifdef NCBI_CXX_TOOLKIT " (CXX Toolkit)" #else " (C Toolkit)" #endif /*NCBI_CXX_TOOLKIT*/ "\r\n"); data->n_skip = iter->n_skip; iter->op = &s_op; /*SERV_Update() [from HTTP callback] expects*/ s_Resolve(iter); iter->op = 0; if (!data->n_cand && (data->fail || !(data->net_info->stateless && data->net_info->firewall))) { s_Reset(iter); s_Close(iter); return 0; } /* call GetNextInfo subsequently if info is actually needed */ if (info) *info = 0; return &s_op; }
static void s_Setup(SMetaConnector *meta, CONNECTOR connector) { SServiceConnector* uuu = (SServiceConnector*) connector->handle; /* initialize virtual table */ CONN_SET_DEFAULT_TIMEOUT(meta, uuu->net_info->timeout); CONN_SET_METHOD(meta, get_type, s_VT_GetType, connector); CONN_SET_METHOD(meta, open, s_VT_Open, connector); CONN_SET_METHOD(meta, close, s_VT_Close, connector); /* reset everything else */ s_Reset(meta, connector); }