1#include "ncdispatch.h"
2#include "ncuri.h"
3
4#define MAXSERVERURL 4096
5
6/* Define vectors of zeros and ones for use with various nc_get_varX function*/
7size_t nc_sizevector0[NC_MAX_VAR_DIMS];
8size_t nc_sizevector1[NC_MAX_VAR_DIMS];
9ptrdiff_t nc_ptrdiffvector1[NC_MAX_VAR_DIMS];
10size_t NC_coord_zero[NC_MAX_VAR_DIMS];
11size_t NC_coord_one[NC_MAX_VAR_DIMS];
12
13/* Define the known protocols and their manipulations */
14static struct NCPROTOCOLLIST {
15    char* protocol;
16    char* substitute;
17    int   model;
18ncprotolist[] = {
19    {"http",NULL,0},
20    {"https",NULL,0},
21    {"file",NULL,NC_FORMATX_DAP2},
22    {"dods","http",NC_FORMATX_DAP2},
23    {"dodss","https",NC_FORMATX_DAP2},
24    {NULL,NULL,0} /* Terminate search */
25};
26
27/* Define the default servers to ping in order;
28   make the order attempt to optimize
29   against future changes.
30*/
31static const char* default_servers[] = {
32"http://remotetest.unidata.ucar.edu",
33NULL
34};
35
36/*
37static nc_type longtype = (sizeof(long) == sizeof(int)?NC_INT:NC_INT64);
38static nc_type ulongtype = (sizeof(unsigned long) == sizeof(unsigned int)?NC_UINT:NC_UINT64);
39*/
40
41/* Allow dispatch to do general initialization and finalization */
42int
43NCDISPATCH_initialize(void)
44{
45    int status = NC_NOERR;
46    int i;
47    for(i=0;i<NC_MAX_VAR_DIMS;i++) {
48 nc_sizevector0[i] = 0;
49        nc_sizevector1[i] = 1;
50        nc_ptrdiffvector1[i] = 1;
51    }
52    for(i=0;i<NC_MAX_VAR_DIMS;i++) {
53 NC_coord_one[i] = 1;
54 NC_coord_zero[i] = 0;
55    }
56    return status;
57}
58
59int
60NCDISPATCH_finalize(void)
61{
62    int status = NC_NOERR;
63    int i;
64    return status;
65}
66
67/* search list of servers and return first that succeeds when
68   concatenated with the specified path part.
69   Search list can be prefixed by the second argument.
70*/
71char*
72NC_findtestserver(const char* path, const char** servers)
73{
74#ifdef USE_DAP
75#ifdef ENABLE_DAP_REMOTE_TESTS
76    /* NCDAP_ping is defined in libdap2/ncdap.c */
77    const char** svc;
78    int stat;
79    char* url = (char*)malloc(MAXSERVERURL);
80
81    if(path == NULLpath = "";
82    if(strlen(path) > 0 && path[0] == '/')
83 path++;
84
85    if(servers != NULL) {
86        for(svc=servers;*svc != NULL;svc++) {
87            snprintf(url,MAXSERVERURL,"%s/%s",*svc,path);
88            stat = NCDAP_ping(url);
89            if(stat == NC_NOERR)
90                return url;
91        }
92    }
93    /* not found in user supplied list; try defaults */
94    for(svc=default_servers;*svc != NULL;svc++) {
95        snprintf(url,MAXSERVERURL,"%s/%s",*svc,path);
96        stat = NCDAP_ping(url);
97        if(stat == NC_NOERR)
98            return url;
99    }
100    if(url) free(url);
101#endif
102#endif
103    return NULL;
104}
105
106
107/* return 1 if path looks like a url; 0 otherwise */
108int
109NC_testurl(const char* path)
110{
111    int isurl = 0;
112    NCURItmpurl = NULL;
113    char* p;
114
115    if(path == NULL) return 0;
116
117    /* find leading non-blank */
118    for(p=(char*)path;*p;p++) {if(*p != ' ') break;}
119
120    /* Do some initial checking to see if this looks like a file path */
121    if(*p == '/') return 0; /* probably an absolute file path */
122
123    /* Ok, try to parse as a url */
124    if(ncuriparse(path,&tmpurl)) {
125 /* Do some extra testing to make sure this really is a url */
126        /* Look for a knownprotocol */
127        struct NCPROTOCOLLISTprotolist;
128        for(protolist=ncprotolist;protolist->protocol;protolist++) {
129     if(strcmp(tmpurl->protocol,protolist->protocol) == 0) {
130         isurl=1;
131 break;
132     }
133 }
134 ncurifree(tmpurl);
135 return isurl;
136    }
137    return 0;
138}
139
140/*
141Return an NC_FORMATX_... value.
142Assumes that the path is known to be a url
143*/
144
145int
146NC_urlmodel(const char* path)
147{
148    int model = 0;
149    NCURItmpurl = NULL;
150    struct NCPROTOCOLLISTprotolist;
151
152    model = NC_FORMATX_DAP2;
153    return model;
154}
155
156#ifdef OBSOLETE
157/* Override dispatch table management */
158static NC_DispatchNC_dispatch_override = NULL;
159
160/* Override dispatch table management */
161NC_Dispatch*
162NC_get_dispatch_override(void) {
163    return NC_dispatch_override;
164}
165
166void NC_set_dispatch_override(NC_Dispatchd)
167{
168    NC_dispatch_override = d;
169}
170#endif
171
172/* OBSOLETE
173   Overlay by treating the tables as arrays of void*.
174   Overlay rules are:
175        overlay    base    merge
176        -------    ----    -----
177          null     null     null
178          null      y        y
179           x       null      x
180           x        y        x
181*/
182
183#ifdef OBSOLETE
184int
185NC_dispatch_overlay(const NC_Dispatchoverlay, const NC_DispatchbaseNC_Dispatchmerge)
186{
187    void** voverlay = (void**)overlay;
188    void** vmerge;
189    int i;
190    size_t count = sizeof(NC_Dispatch) / sizeof(void*);
191    /* dispatch table must be exact multiple of sizeof(void*) */
192    assert(count * sizeof(void*) == sizeof(NC_Dispatch));
193    *merge = *base;
194    vmerge = (void**)merge;
195    for(i=0;i<count;i++) {
196        if(voverlay[i] == NULL) continue;
197        vmerge[i] = voverlay[i];
198    }
199    /* Finally, the merge model should always be the overlay model */
200    merge->model = overlay->model;
201    return NC_NOERR;
202}
203#endif


HyperKWIC - Version 7.20DA executed at 11:37 on 27 Oct 2017 | Polyhedron Solutions - INTERNAL USE | COMMERCIAL (Any O/S) SN 4AKIed