1/*
2 * Copyright (c) 2010 Apple Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1.  Redistributions of source code must retain the above copyright
11 *     notice, this list of conditions and the following disclaimer.
12 * 2.  Redistributions in binary form must reproduce the above copyright
13 *     notice, this list of conditions and the following disclaimer in the
14 *     documentation and/or other materials provided with the distribution.
15 * 3.  Neither the name of Apple Inc. ("Apple") nor the names of its
16 *     contributors may be used to endorse or promote products derived from
17 *     this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
20 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 *
30 * Portions of this software have been released under the following terms:
31 *
32 * (c) Copyright 1989-1993 OPEN SOFTWARE FOUNDATION, INC.
33 * (c) Copyright 1989-1993 HEWLETT-PACKARD COMPANY
34 * (c) Copyright 1989-1993 DIGITAL EQUIPMENT CORPORATION
35 *
36 * To anyone who acknowledges that this file is provided "AS IS"
37 * without any express or implied warranty:
38 * permission to use, copy, modify, and distribute this file for any
39 * purpose is hereby granted without fee, provided that the above
40 * copyright notices and this notice appears in all source code copies,
41 * and that none of the names of Open Software Foundation, Inc., Hewlett-
42 * Packard Company or Digital Equipment Corporation be used
43 * in advertising or publicity pertaining to distribution of the software
44 * without specific, written prior permission.  Neither Open Software
45 * Foundation, Inc., Hewlett-Packard Company nor Digital
46 * Equipment Corporation makes any representations about the suitability
47 * of this software for any purpose.
48 *
49 * Copyright (c) 2007, Novell, Inc. All rights reserved.
50 * Redistribution and use in source and binary forms, with or without
51 * modification, are permitted provided that the following conditions
52 * are met:
53 *
54 * 1.  Redistributions of source code must retain the above copyright
55 *     notice, this list of conditions and the following disclaimer.
56 * 2.  Redistributions in binary form must reproduce the above copyright
57 *     notice, this list of conditions and the following disclaimer in the
58 *     documentation and/or other materials provided with the distribution.
59 * 3.  Neither the name of Novell Inc. nor the names of its contributors
60 *     may be used to endorse or promote products derived from this
61 *     this software without specific prior written permission.
62 *
63 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
64 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
65 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
66 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY
67 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
68 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
69 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
70 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
71 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
72 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
73 *
74 * @APPLE_LICENSE_HEADER_END@
75 */
76
77/*
78**
79**  NAME:
80**
81**      ifspemts.c
82**
83**  FACILITY:
84**
85**      IDL Compiler Backend
86**
87**  ABSTRACT:
88**
89**  Routines for the emission of ifspecs, including MIA transfer syntaxes
90**
91**
92*/
93
94#include <nidl.h>
95#include <ast.h>
96#include <cspell.h>
97#include <command.h>
98#include <ifspec.h>
99#include <bedeck.h>
100#include <dutils.h>
101#include <mtsbacke.h>
102
103/******************************************************************************/
104/*                                                                            */
105/*    Return a pointer to the name of the if_spec                             */
106/*                                                                            */
107/******************************************************************************/
108static char *BE_ifspec_name
109(
110    AST_interface_n_t *ifp,
111    BE_output_k_t kind
112)
113{
114    static char retval[100];
115
116    sprintf(retval, "%s_v%ld_%ld_%c_ifspec", BE_get_name(ifp->name),
117            (ifp->version%65536), (ifp->version/65536),
118            kind == BE_client_stub_k ? 'c' : 's');
119
120    return retval;
121}
122
123/******************************************************************************/
124/*                                                                            */
125/*    Spell the manager epv to the output stream                              */
126/*                                                                            */
127/******************************************************************************/
128void CSPELL_manager_epv
129(
130    FILE *fid,
131    AST_interface_n_t *ifp
132)
133{
134    AST_export_n_t *p_export;
135    boolean first_op = true;
136
137    fprintf( fid, "\nstatic %s_v%ld_%ld_epv_t IDL_manager_epv = {\n",
138           BE_get_name(ifp->name), (ifp->version%65536), (ifp->version/65536) );
139
140    for( p_export = ifp->exports; p_export != NULL; p_export = p_export->next )
141    {
142        if (p_export->kind == AST_operation_k)
143        {
144            if ( ! first_op ) fprintf( fid, "," );
145            spell_name( fid, p_export->thing_p.exported_operation->name );
146            fprintf( fid, "\n" );
147            first_op = false;
148        }
149    }
150
151    fprintf( fid,"};\n" );
152}
153
154/******************************************************************************/
155/*                                                                            */
156/*    Spell an interface definition and related material to the output stream */
157/*                                                                            */
158/******************************************************************************/
159void CSPELL_interface_def
160(
161    FILE *fid,
162    AST_interface_n_t *ifp,
163    BE_output_k_t kind,
164    boolean generate_mepv
165)
166{
167    boolean     first;
168    long        i, endpoints;
169    char const *protseq, *portspec;
170
171    if ((endpoints = ifp->number_of_ports) != 0)
172    {
173        first = true;
174        fprintf(fid,
175                "static rpc_endpoint_vector_elt_t IDL_endpoints[%ld] = \n{",
176                endpoints);
177        for (i = 0; i < endpoints; i++)
178        {
179            STRTAB_str_to_string(ifp->protocol[i], &protseq);
180            STRTAB_str_to_string(ifp->endpoints[i], &portspec);
181            if (!first) fprintf(fid, ",\n");
182            fprintf(fid,
183               "{(unsigned_char_p_t)\"%s\", (unsigned_char_p_t)\"%s\"}",
184                   protseq, portspec);
185            first = false;
186        }
187        fprintf(fid, "};\n");
188    }
189
190    /* Transfer syntaxes */
191    fprintf( fid, "\nstatic rpc_syntax_id_t IDL_transfer_syntaxes[%d] = {\n{\n",
192                                                                 1 );
193        fprintf(fid,
194"{0x8a885d04u, 0x1ceb, 0x11c9, 0x9f, 0xe8, {0x8, 0x0, 0x2b, 0x10, 0x48, 0x60}},");
195        fprintf(fid, "\n2}");
196    fprintf(fid, "};\n");
197
198    fprintf(fid, "\nstatic rpc_if_rep_t IDL_ifspec = {\n");
199    fprintf(fid, "  1, /* ifspec rep version */\n");
200    fprintf(fid, "  %d, /* op count */\n", ifp->op_count);
201    fprintf(fid, "  %ld, /* if version */\n", ifp->version);
202    fprintf(fid, "  {");
203    fprintf(fid, "0x%8.8lxu, ", ifp->uuid.time_low);
204    fprintf(fid, "0x%4.4x, ", ifp->uuid.time_mid);
205    fprintf(fid, "0x%4.4x, ", ifp->uuid.time_hi_and_version);
206    fprintf(fid, "0x%2.2x, ", ifp->uuid.clock_seq_hi_and_reserved);
207    fprintf(fid, "0x%2.2x, ", ifp->uuid.clock_seq_low);
208    fprintf(fid, "{");
209    first = true;
210    for (i = 0; i < 6; i++)
211    {
212        if (first)
213            first = false;
214        else
215            fprintf (fid, ", ");
216        fprintf (fid, "0x%x", ifp->uuid.node[i]);
217    }
218    fprintf(fid, "}},\n");
219    fprintf(fid, "  2, /* stub/rt if version */\n");
220    fprintf(fid, "  {%ld, %s}, /* endpoint vector */\n", endpoints,
221                 endpoints ? "IDL_endpoints" : "NULL");
222    fprintf(fid, "  {%d, IDL_transfer_syntaxes} /* syntax vector */\n",
223                                                                 1 );
224
225    if (kind == BE_server_stub_k)
226    {
227        fprintf(fid, ",IDL_epva /* server_epv */\n");
228        if (generate_mepv)
229        {
230            fprintf(fid,",(rpc_mgr_epv_t)&IDL_manager_epv /* manager epv */\n");
231        }
232        else
233        {
234            fprintf(fid,",NULL /* manager epv */\n");
235        }
236    }
237    else
238    {
239        fprintf(fid,",NULL /* server epv */\n");
240        fprintf(fid,",NULL /* manager epv */\n");
241    }
242    fprintf(fid, "};\n");
243    fprintf(fid,
244            "/* global */ rpc_if_handle_t %s = (rpc_if_handle_t)&IDL_ifspec;\n",
245            BE_ifspec_name(ifp, kind));
246}
247