<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
    <title>Target Communication Framework Services - PathMap</title>
</head>

<body lang='EN-US'>

<h1>Target Communication Framework Services - PathMap</h1>

<ul>
    <li><a href='#VersionHistory'>Version History</a>
    <li><a href='#Overview'>Overview</a>
    <li><a href='#Cmds'>Commands</a>
    <ul>
        <li><a href='#CmdGet'>Get</a>
        <li><a href='#CmdSet'>Set</a>
    </ul>
    <li><a href='#Events'>Events</a>
    <li><a href='#API'>API</a>
</ul>

<h1>Memory Service</h1>

<h2><a name='VersionHistory'>Version History</a></h2>

<table border=1 cellpadding=8>
    <tr>
        <th>Version
        <th>Date
        <th>Change
    <tr>
        <td>0.0
        <td>2012-07-22
        <td>Initial documentation based on source code
</table>

<h2><a name='Overview'>Overview</a></h2>

<p>The service manages file path translation across systems. Command and event
parameters are encoded as zero terminated <a
href='TCF JSON.html'>JSON</a> strings.</p>

<p>The service uses standard format for error reports,
see <a href='TCF Error Report Format.html'>Error Report Format</a>.</p>

<h2><a name='Cmds'>Commands</a></h2>

<h3><a name='CmdGet'>Get</a></h3>

<pre><b><font face="Courier New" size=2 color=#333399>
C &bull; <i>&lt;token&gt;</i> &bull; PathMap &bull; get &bull;
</font></b></pre>

<p>The command retrieves file path mapping rules.</p>

<p>Reply:</p>

<pre><b><font face="Courier New" size=2 color=#333399>
R &bull; <i>&lt;token&gt;</i> &bull; <i>&lt;error report&gt;</i> &bull; <i>&lt;array of path map rules&gt;</i> &bull;

<i>&lt;array of path map rules&gt;</i>
    &rArr; null
    &rArr; [ <i>&lt;path map rules list&gt;</i> ]

<i>&lt;path map rules list&gt;</i>
    &rArr; <i>&lt;object: path map rule&gt;</i>
    &rArr; <i>&lt;path map rules list&gt;</i> , <i>&lt;object: path map rule&gt;</i>
</font></b></pre>

<p>Predefined path map rule properties are:</p>
<ul>
    <li><code><b><font face="Courier New" size=2 color=#333399>"ID" : <i>&lt;string&gt;</i></font></b></code>
    - ID of the rule.

    <li><code><b><font face="Courier New" size=2 color=#333399>"Source" : <i>&lt;string&gt;</i></font></b></code>
    - source or compile time file path.

    <li><code><b><font face="Courier New" size=2 color=#333399>"Destination" : <i>&lt;string&gt;</i></font></b></code>
    - destination or run-time file path.

    <li><code><b><font face="Courier New" size=2 color=#333399>"Context" : <i>&lt;string&gt;</i></font></b></code>
    - symbols context group ID or name, deprecated - use ContextQuery.

    <li><code><b><font face="Courier New" size=2 color=#333399>"ContextQuery" : <i>&lt;string&gt;</i></font></b></code>
    - context query.

    <li><code><b><font face="Courier New" size=2 color=#333399>"Host" : <i>&lt;string&gt;</i></font></b></code>
    - host.

    <li><code><b><font face="Courier New" size=2 color=#333399>"Protocol" : <i>&lt;string&gt;</i></font></b></code>
    - file access protocol, see predefined protocol values.

    <p>Predefined protocol values are:</p>
    <ul>
        <li><code><b><font face="Courier New" size=2 color=#333399>"file"</font></b></code>
        - Regular file access using system calls.

        <li><code><b><font face="Courier New" size=2 color=#333399>"host"</font></b></code>
        - File should be accessed using File System service on host.

        <li><code><b><font face="Courier New" size=2 color=#333399>"target"</font></b></code>
        - File should be accessed using File System service on target.
    </ul>
</ul>

<h3><a name='CmdSet'>Set</a></h3>

<pre><b><font face="Courier New" size=2 color=#333399>
C &bull; <i>&lt;token&gt;</i> &bull; PathMap &bull; set &bull; [ <i>&lt;path map rules list&gt;</i> ] &bull;

<i>&lt;path map rules list&gt;</i>
    &rArr; <i>&lt;object: path map rule&gt;</i>
    &rArr; <i>&lt;path map rules list&gt;</i> , <i>&lt;object: path map rule&gt;</i>
</font></b></pre>

<p>The command set file path mapping rules.</p>

<p>Reply:</p>

<pre><b><font face="Courier New" size=2 color=#333399>
R &bull; <i>&lt;token&gt;</i> &bull; <i>&lt;error report&gt;</i> &bull;
</font></b></pre>

<h2><a name='Events'>Events</a></h2>

<p>PathMap service broadcasts notification events when path mappings are changed.</p>

<pre><b><font face="Courier New" size=2 color=#333399>
E &bull; PathMap &bull; changed &bull;
</font></b></pre>

<h2><a name='API'>API</a></h2>

<pre>
<font color=#3F5FBF>/**
 * IPathMap service manages file path translation across systems.
 *
 * <font color=#7F9FBF>@noimplement</font> This interface is not intended to be implemented by clients.
 */</font>
<font color=#7F0055>public interface</font> IPathMap <font color=#7F0055>extends</font> IService {

    <font color=#3F5FBF>/**
     * This service name, as it appears on the wire - a TCF name of the service.
     */</font>
    <font color=#7F0055>static final</font> String NAME = "PathMap";

    <font color=#3F5FBF>/**
     * Path mapping rule property names.
     */</font>
    <font color=#7F0055>static final</font> String
        <font color=#3F5FBF>/** String, rule ID */</font>
        PROP_ID = "ID",

        <font color=#3F5FBF>/** String, source, or compile-time file path */</font>
        PROP_SOURCE = "Source",

        <font color=#3F5FBF>/** String, destination, or run-time file path */</font>
        PROP_DESTINATION = "Destination",

        <font color=#3F5FBF>/** String, symbols context group ID or name, deprecated - use ContextQuery */</font>
        PROP_CONTEXT = "Context",

        <font color=#3F5FBF>/** String, contexts query, see IContextQuery */</font>
        PROP_CONTEXT_QUERY = "ContextQuery",

        <font color=#3F5FBF>/** String, */</font>
        PROP_HOST = "Host",

        <font color=#3F5FBF>/** String, file access protocol, see PROTOCOL_*, default is regular file */</font>
        PROP_PROTOCOL = "Protocol";

    <font color=#3F5FBF>/**
     * PROP_PROTOCOL values.
     */</font>
    <font color=#7F0055>static final</font> String
        <font color=#3F5FBF>/** Regular file access using system calls */</font>
        PROTOCOL_FILE = "file",

        <font color=#3F5FBF>/** File should be accessed using File System service on host */</font>
        PROTOCOL_HOST = "host",

        <font color=#3F5FBF>/** File should be accessed using File System service on target */</font>
        PROTOCOL_TARGET = "target";

    <font color=#3F5FBF>/**
     * PathMapRule interface represents a single file path mapping rule.
     */</font>
    <font color=#7F0055>interface</font> PathMapRule {

        <font color=#3F5FBF>/**
         * Get rule properties. See PROP_* definitions for property names.
         * Properties are read only, clients should not try to modify them.
         * <font color=#7F9FBF>@return</font> Map of rule properties.
         */</font>
        Map&lt;String,Object&gt; getProperties();

        <font color=#3F5FBF>/**
         * Get rule unique ID.
         * Same as getProperties().get(PROP_ID)
         * <font color=#7F9FBF>@return</font> rule ID.
         */</font>
        String getID();

        <font color=#3F5FBF>/**
         * Get compile-time file path.
         * Same as getProperties().get(PROP_SOURCE)
         * <font color=#7F9FBF>@return</font> compile-time file path.
         */</font>
        String getSource();

        <font color=#3F5FBF>/**
         * Get run-time file path.
         * Same as getProperties().get(PROP_DESTINATION)
         * <font color=#7F9FBF>@return</font> run-time file path.
         */</font>
        String getDestination();

        <font color=#3F5FBF>/**
         * Get host name of this rule.
         * Same as getProperties().get(PROP_HOST)
         * <font color=#7F9FBF>@return</font> host name.
         */</font>
        String getHost();

        <font color=#3F5FBF>/**
         * Get file access protocol name.
         * Same as getProperties().get(PROP_PROTOCOL)
         * <font color=#7F9FBF>@return</font> protocol name.
         */</font>
        String getProtocol();

        <font color=#3F5FBF>/**
         * Get context query that defines scope of the mapping rule, see also IContextQuery.
         * Same as getProperties().get(PROP_CONTEXT_QUERY)
         * <font color=#7F9FBF>@return</font> context query expression, or null.
         */</font>
        String getContextQuery();
    }

    <font color=#3F5FBF>/**
     * Retrieve file path mapping rules.
     *
     * <font color=#7F9FBF>@param</font> done - call back interface called when operation is completed.
     * <font color=#7F9FBF>@return</font> - pending command handle.
     */</font>
    IToken get(DoneGet done);

    <font color=#3F5FBF>/**
     * Client call back interface for get().
     */</font>
    <font color=#7F0055>interface</font> DoneGet {
        <font color=#3F5FBF>/**
         * Called when file path mapping retrieval is done.
         * <font color=#7F9FBF>@param</font> error - error description if operation failed, null if succeeded.
         * <font color=#7F9FBF>@param</font> map - file path mapping data.
         */</font>
        <font color=#7F0055>void</font> doneGet(IToken token, Exception error, PathMapRule[] map);
    }

    <font color=#3F5FBF>/**
     * Set file path mapping rules.
     *
     * <font color=#7F9FBF>@param</font> map - file path mapping rules.
     * <font color=#7F9FBF>@param</font> done - call back interface called when operation is completed.
     * <font color=#7F9FBF>@return</font> - pending command handle.
     */</font>
    IToken set(PathMapRule[] map, DoneSet done);

    <font color=#3F5FBF>/**
     * Client call back interface for set().
     */</font>
    <font color=#7F0055>interface</font> DoneSet {
        <font color=#3F5FBF>/**
         * Called when file path mapping transmission is done.
         * <font color=#7F9FBF>@param</font> error - error description if operation failed, null if succeeded.
         * <font color=#7F9FBF>@param</font> map - memory map data.
         */</font>
        <font color=#7F0055>void</font> doneSet(IToken token, Exception error);
    }

    <font color=#3F5FBF>/**
     * Add path map event listener.
     * <font color=#7F9FBF>@param</font> listener - path map event listener to add.
     */</font>
    <font color=#7F0055>void</font> addListener(PathMapListener listener);

    <font color=#3F5FBF>/**
     * Remove path map event listener.
     * <font color=#7F9FBF>@param</font> listener - path map event listener to remove.
     */</font>
    <font color=#7F0055>void</font> removeListener(PathMapListener listener);

    <font color=#3F5FBF>/**
     * Service events listener interface.
     */</font>
    <font color=#7F0055>interface</font> PathMapListener {

        <font color=#3F5FBF>/**
         * Called when path map changes.
         */</font>
        <font color=#7F0055>void</font> changed();
    }
}
</pre>

</body>
</html>
