<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>ECF New and Noteworthy</title>
<link rel="stylesheet" href="http://www.eclipse.org/default_style.css" type="text/css">

</head>

<body bgcolor="#FFFFFF">
<table border=0 cellspacing=5 cellpadding=2 width="100%">
  <tbody>
    <tr>
      <td width="69%" class="bannertext">
        <font class="indextop style">eclipse communication framework</font>
        <br><br>
        <font class="indexsub">an eclipse technology subproject</font>
        <br><br>
        <font class="indextop style2">New and Noteworthy</font><br>0.8.4 Stable Release</font>
        <br><br><br>
        Return to <a href="downloads.php">ECF download page</a></br>
        Return to <a href="comm_resources.php">ECF communication resources page</a>
        <br><br>
        <a href="NewAndNoteworthy_0.4.0.html">New and Noteworthy for 0.4.0</a><br>
        <a href="NewAndNoteworthy_0.5.2.html">New and Noteworthy for 0.5.2</a><br>
        <a href="NewAndNoteworthy_0.5.4.html">New and Noteworthy for 0.5.4</a><br>
        <a href="NewAndNoteworthy_0.6.0.html">New and Noteworthy for 0.6.0</a><br>
        <a href="NewAndNoteworthy_0.6.2.html">New and Noteworthy for 0.6.2</a><br>
        <a href="NewAndNoteworthy_0.7.0.html">New and Noteworthy for 0.7.0</a><br>
        <a href="NewAndNoteworthy_0.7.5.html">New and Noteworthy for 0.7.5</a><br>
        <a href="NewAndNoteworthy_0.7.6.html">New and Noteworthy for 0.7.6</a><br>
        <a href="NewAndNoteworthy_0.8.0.html">New and Noteworthy for 0.8.0</a><br>
        <a href="NewAndNoteworthy_0.8.1.html">New and Noteworthy for 0.8.1</a><br>
        <a href="NewAndNoteworthy_0.8.2.html">New and Noteworthy for 0.8.2</a>
      </td>
      <td width="31%">
        <div align="center">
          <img src="../images/Idea.jpg" width="120" height="86" hspace="50" align="middle">
        </div>
      </td>
    </tr>
  </tbody>
</table>

<table>

  <TR> <!----------------------------------------------------->
    <TD colSpan=2> <HR> </TD>
  </TR>
  <TR><TD colSpan=2><H2>Application-Defined Peer-to-Peer Protocols Using XMPP</H2></TD>

  <TR>
    <TD vAlign=top align=left width="30%">
        <P align=left>
	<B>New Example Application</B>
        </P>
    </TD>
    <TD vAlign=top width="70%">
      <p><br></p>
      <P>The <b>org.eclipse.ecf.example.clients</b> plugin has a new example client: <a href="http://www.eclipse.org/ecf/org.eclipse.ecf.docs/api/org/eclipse/ecf/example/clients/XMPPSORobotApplication.html">XMPPSORobotApplication</a>.
      This application shows the use an XMPP's extension mechanism to implement new protocols that can run directly on XMPP.  
      <p>
      This can be accomplished because the ECF XMPP provider (<b>ecf.xmpp.smack</b>) implements the <a href="http://www.eclipse.org/ecf/org.eclipse.ecf.docs/api/org/eclipse/ecf/core/ISharedObjectContainer.html">ISharedObjectContainer</a> API.  
      The ISharedObjectContainer API allows applications to design, implement, and use new protocols, by creating components implementing the
      <a href="http://www.eclipse.org/ecf/org.eclipse.ecf.docs/api/org/eclipse/ecf/core/ISharedObject.html">ISharedObject</a> interface.  These components
      may then be added to an ISharedObjectContainer instance at runtime.  So, for example,
      consider the following snippet:
      <pre>
      // Get shared object container from xmpp container instance
      ISharedObjectContainer socontainer = (ISharedObjectContainer) xmppcontainer.getAdapter(ISharedObjectContainer.class);
      // Create shared object ID...this will be a singleton so the ID can be the class name
      ID newID = IDFactory.getDefault().createStringID(TrivialSharedObject.class.getName());
      // Create shared object itself
      ISharedObject sharedObject = new TrivialSharedObject();
      // Add shared object to container
      soontainer.getSharedObjectManager().addSharedObject(newID, sharedObject, null);
      </pre>
      <p>
      In the case of this example application, the ISharedObject component is implemented by the <a href="http://www.eclipse.org/ecf/org.eclipse.ecf.docs/api/org/eclipse/ecf/example/clients/TrivialSharedObject.html">TrivialSharedObject</a> class.
      See the source code for this class to examine the implementation of the custom protocol.  The source code for all ECF plugins is available via anonymous CVS access described on 
      the <a href="http://www.eclipse.org/ecf/resources.html">ECF Dev Resources Page</a>.
      </p>
      Other ECF clients may define any point-to-point protocol they wish using similar mechanisms (implemented as ISharedObject instances like TrivialSharedObject), and this new protocol will then 
      run on XMPP without requiring modification to existing XMPP servers.  Other XMPP clients (e.g. GAIM, Google Talk, etc.) that do not know about the new protocol will simply
      ignore any messages directed sent to them.</p>
     <p></p>
    </TD>
  </TR>

  <TR> <!----------------------------------------------------->
    <TD colSpan=2> <HR> </TD>
  </TR>
  <TR><TD colSpan=2><H2>Call API Additions/Changes</H2></TD>

  <TR>
    <TD vAlign=top align=left width="30%">
        <P align=left>
	<B>Enhancements to Support <a href="http://www.jabber.org/jeps/jep-0166.html">Jingle/JEP-166</a></B>
        </P>
    </TD>
    <TD vAlign=top width="70%">
      <p><br></p>
      <P>The ECF plugin <b>org.eclipse.ecf.call</b> is intended to provide an abstract 'Call' API, to allow clients to do call setup in a protocol independent
      manner.  The API is not finished yet (still experimental), but the ECF team is working on an implementation based upon <a href="http://talk.google.com">Google Talk's</a> 
      <a href="http://www.jabber.org/jeps/jep-0166.html">Jingle protocol</a>.
      The new/enhanced API javadocs are <a href="http://www.eclipse.org/ecf/org.eclipse.ecf.docs/api/org/eclipse/ecf/call/package-frame.html">here</a><p>
    </TD>
  </TR>

</table>


</body>
</html>