<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;}
@font-face
{font-family:Tahoma;
panose-1:2 11 6 4 3 5 4 4 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.CodeChar
{mso-style-name:"Code Char";
mso-style-link:Code;
font-family:"Courier New";}
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.EmailStyle19
{mso-style-type:personal;
font-family:"Calibri","sans-serif";
color:windowtext;}
span.EmailStyle20
{mso-style-type:personal-reply;
font-family:"Calibri","sans-serif";
color:#1F497D;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;}
@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><span style='color:#1F497D'>Slight correction suggestion,
IClientAPI actually is redundant in that situation – there’s no reason why we
need to keep HasInterface as long as we can do “Client is <type/interface>”.
GetInterfaces() could be replaced with a quick search via reflection (GetTypes)<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>Adam<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p>
<div style='border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt'>
<div>
<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'>
<p class=MsoNormal><b><span lang=EN-US style='font-size:10.0pt;font-family:
"Tahoma","sans-serif"'>From:</span></b><span lang=EN-US style='font-size:10.0pt;
font-family:"Tahoma","sans-serif"'> opensim-dev-bounces@lists.berlios.de
[mailto:opensim-dev-bounces@lists.berlios.de] <b>On Behalf Of </b>Frisby, Adam<br>
<b>Sent:</b> Saturday, 13 September 2008 7:41 PM<br>
<b>To:</b> opensim-dev@lists.berlios.de<br>
<b>Subject:</b> [Opensim-dev] Restructuring IClientAPI - thoughts wanted<o:p></o:p></span></p>
</div>
</div>
<p class=MsoNormal><o:p> </o:p></p>
<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>
</div>
</body>
</html>