<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
p.Code, li.Code, div.Code
        {mso-style-name:Code;
        mso-style-link:"Code Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Courier New";}
span.CodeChar
        {mso-style-name:"Code Char";
        mso-style-link:Code;
        font-family:"Courier New";}
.MsoChpDefault
        {mso-style-type:export-only;}
@page Section1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.Section1
        {page:Section1;}
-->
</style>
<!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>

<body lang=EN-AU link=blue vlink=purple>

<div class=Section1>

<p class=MsoNormal>I’m in the process of adding support for some
alternate clients to OpenSim, and one of the things I’m noticing is that there
is one one chunk of OpenSim in particular that is highly “LL-Specific”
in how it treats things – it’s also comparatively a very small
chunk of OpenSim that might actually be fixable quite easily.<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>That is to say, IClientAPI – I’m thinking of
replacing IClientAPI with a very small interface:<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>bool                       IClientAPI.HasInterface<T>();<o:p></o:p></p>

<p class=MsoNormal>type[]                   IClientAPI.GetInterfaces();<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>Then replacing the current web of .Xyz with smaller more
discrete interfaces such as:<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=Code>IClientInstantMessage {<o:p></o:p></p>

<p class=Code style='text-indent:36.0pt'>SendMessage(...);<o:p></o:p></p>

<p class=Code style='text-indent:36.0pt'>event OnNewMessage;<o:p></o:p></p>

<p class=Code>}<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>We can do checks on them in our modules, where once we did:<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal><span style='font-family:"Courier New"'>OnNewClient(IClientAPI
client) {<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-family:"Courier New"'>     client.OnNewMessage
+= messageHandler;<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-family:"Courier New"'>}<o:p></o:p></span></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>We replace with<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=Code>OnNewClient(IClientAPI client) {<o:p></o:p></p>

<p class=Code>     If(client.HasInterface<IClientInstantMessage>()) {<o:p></o:p></p>

<p class=Code>          ((IClientInstantMessage)client).OnNewMessage +=
messageHandler;<o:p></o:p></p>

<p class=Code style='text-indent:36.0pt'>}<o:p></o:p></p>

<p class=Code>}<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>The resulting code is then more friendly for third party
clients, and clients don’t need to support the full set of functionality to
register as valid Clients inside of OpenSim.<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>What’s everyone’s thoughts here?<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>Good idea / bad / anyone got any better?<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>Adam<o:p></o:p></p>

</div>

</body>

</html>