## Copyright 2007-2008 Cisco Systems Inc.
##
## Licensed under the Apache License, Version 2.0 (the "License"); you may not
## use this file except in compliance with the License. You may obtain a copy
## of the License at
##
##      http://www.apache.org/licenses/LICENSE-2.0
##
## Unless required by applicable law or agreed to in writing, software
## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
## License for the specific language governing permissions and limitations
## under the License.
// This file automatically generated by:
//   $version
//   $now
// This file is automatically created and should not be edited!

This is a description of the etch-generated files for your service.

----------------
- How To Build -
----------------

In the directory where the etch file is located, execute the following command:

etch -q -d . -I . -b csharp -w all Blah.etch

This would compile the service description Blah.etch, generating all csharp files,
into csharp namespaces rooted in the current directory (-d .), resolving includes
and mixins from the current directory (-I .) and being quiet about it (-q).

Assuming the Blah.etch specified a module of "demo" and a service of "Blah",
the csharp files would be generated into a sub-directory demo of the current
directory. you may now change to that directory and compile the resulting files:

cd demo
csc "/reference:%ETCH_HOME%\lib\Etch4CS.dll" /main:demo.MainBlahListener *.cs
csc "/reference:%ETCH_HOME%\lib\Etch4CS.dll" /main:demo.MainBlahClient *.cs

(Assuming windows; for unix, read the mono directions.)

Depending upon how etch was installed, you may need to install the Etch4CS.dll
into the system global assembly cache. This command will do the trick:

copy /y "%ETCH_HOME%\lib\Etch4CS.dll" %windir%\assembly

You only need to do this once after each installation of etch. And once the
installer is fixed, you won't need to do it at all.

To run the service (which initially won't do anything but make a connection and
then close it, use the following two commands in separate shells (again, from
the demo directory):

MainBlahListener

MainBlahClient

The first command (MainBlahListener) starts the service listener which accepts
connections. The second command (MainBlahClient) runs a sample client, which
makes a connection to the running listener and then closes it again.

Once you've compiled the service and tested the result, you may implement your
service by adding content to the etch file, adding implementation details to the
Impl*.cs and Main*.cs files, and recompiling using the above steps. You may also
load these files into an IDE such as visual studio, or use a build management
system such as msbuild or nant. Remember, whenever you change the etch file, you
must re-etch the service description and then re-csc all the cs
files.

-------------------
- Generated Files -
-------------------

Here is a description of the generated files for a service named Blah.

Blah.cs
BlahClient.cs
BlahServer.cs

These three files are the generated interface classes. Service defined constants
and types are in Blah.cs, as well as direction "both" messages, which are
messages which are shared between client and server. BlahClient.cs and
BlahServer.cs are respectively the messages for just the direction client or
server. You should not edit these files.

RemoteBlah.cs
RemoteBlahClient.cs
RemoteBlahServer.cs

RemoteBlah*.cs are the generated classes which implement the interfaces,
with message implementations which encode the message type and arguments for
transport to the connection peer and then receive and decode any response. You
should not edit these files.

StubBlah.cs
StubBlahClient.cs
StubBlahServer.cs

StubBlah*.cs are the generated classes which receive messages encoded by
RemoteBlah*.cs and decode them, calling the appropriate message implementation
and then encoding and sending any result. You should not edit these files.

ValueFactoryBlah.cs

ValueFactoryBlah.cs is a generated class which contains helper code to
serialize service defined types and also the meta data which describes the
messages and fields, field types, timeouts, etc. You should not edit this file.

BaseBlah.cs
BaseBlahClient.cs
BaseBlahServer.cs

BaseBlah*.cs are generated classes which implement the interfaces, with
message implementations which do nothing but throw UnsupportedOperationException.
They can be used to supply an implementation when you don't want to immediately
implement all the messages. You should not edit these files.

ImplBlahClient.cs
ImplBlahServer.cs

ImplBlah*.cs are the generated sample client and server implementation
classes. They extend the generated base classes. These are used by the sample
main programs to provide implementations of the client or server messages. Edit
these files as you wish to implement your service (overriding the default
implementations from the generated base classes).

BlahHelper.cs

BlahHelper.cs is a generated class which includes static methods to help
construct transports for client and listener. You should not edit this file.

MainBlahClient.cs
MainBlahListener.cs

MainBlah*.cs are the generated sample client and server main programs.
They show how to setup a transport and start it and how to create a session.
Edit these files as you wish to implement your service, or just copy the code
into your own application.

