一步一步学习OCS2007(一)--如何定制在线状态?(转自:http://www.cnblogs.com/invinboy )
 OCS 2007(即Microsoft Office Communicators Server 2007) 是微软2007年推出的一款非常重要的即时通讯软件,她汇集了多方即时通讯、多方语音聊天、多方视频会议等众多功能,同时还提供了强大的二次开发接口,以便用户进一步去扩展、去开拓。
  下面,我将逐惭就OCS2007二次开发过程中的一些体会,感受表达出来,与读者共享。
  今天的主题是,用户如何自定义在线状态
  在OCS2007中,主要有三种基础状态:Online、Busy、Do Not Disturb ,这些状态是根据Availability 属性决定自定义的状态显示哪一个图标。定制自定义状态的核心是:(1)配置自定义状态的XML文件;(2)配置文件在注册表中进行注册。下面将一步一步地介绍如何进行这一扩展。

  一、定义XML配置文件,如下例:

<?xml version="1.0" encoding="utf-8" ?>
<customStates>
<customState ID="1" availability="online">
<activity LCID="2052"> 下雪啦!</activity>
</customState>
<customState ID="2" availability="do-not-disturb">
<activity LCID="2052">会议中......</activity>
</customState>
<customState ID="3" availability="busy">
<activity LCID="2052">OCS2007 研究中......</activity>
</customState>
</customStates>

</customStates>

  二、在IIS中发布该XML文件,在IIS中创建一个网站或者一个虚拟目录,然后将该XML文件放入此虚拟目录中应该就可以了(确认:在IIS中选中这个XML文件,右键,在浏览器中浏览,看是否能在IE中正确打开,如果这个地址需要发布出去共多人使用,别人不能使用时,请将此地址加入IE的信任站点中即可)。如图:



  IIS发布方式可以有HTTP、HTTPS这两种方式(如果为HTTPS,则必须将该站点加入IE的信任站点列表中)。
说明:发布方式还可以通过文件共享的方式,但不推荐这种方式。

  三、在注册表注册配置文件:打开注册表,找到HKLM\software\Policies\Microsoft\Communicator 创建一字符串项CustomStateURL其值就是在IIS中发布的XML文件的URL,比如:http://localhost/OcsConfig/CustomStateURL.XML,如图:


  

  四、退出OCS2007客户端,重新登录,令人心动的功能是不是就出来了呢。



  最后说明两点:
  1、OCS2007中,最多可以定义四种自定义状态。
  2、每种自定义状态的最大长度不能超过64个字符。
  3、在XML文件中的LCID,它是用来标识不同语言版本的OC,英语美国:1033;中国大陆:2052;中国香港:3076。
4、XML文件配置项是大小写敏感的,其中availability这个属性,我试验过了,如果写成Availability 将不能生效。其它属性没有检验过。

一步一步学习OCS2007(二)--如何定制web 标签页?

 前面我们体验了如何定制OCS2007的在线状态,不知道大家有没有去实践过,今天我与大家一道来分享另一个课题:如何在OC 2007中定制web 标签页?
  在OC2007中,在联系人窗口的下方,我们可以添加一系列web 页,将业务系统中重要的、常用的功能集成到OC平台上,致使在OC中可以解决很复杂的业务问题,在业务系统中,也可以方便地进行即时通讯,以达到优势互补之目的。如下图所示:



下面我们将一步一步地学习,怎么来实现这一功能:
  
  一、定义XML配置文件,web 标签页的所有属性,比如说标签图标的URL、名称、tooltip 提示、web 页面的地址、传递的参数等,都必须通过一个XML文件来加以定,如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<tabdata>
<tab>
<p_w_picpath>http://localhost/BNSolution/WebTest/RESOURCE/IMAGE/away.png</p_w_picpath>
<name>System</name>
<tooltip>常用系统</tooltip>
<contenturl>http://localhost/BNSolution/WebTest/OCS/WebForm1.aspx</contenturl>
<userid>true</userid>
<contactid>true</contactid>
<accessibility>inside</accessibility>
</tab>
<tab>
<p_w_picpath>http://localhost/BNSolution/WebTest/RESOURCE/IMAGE/2.png</p_w_picpath>
<name>System</name>
<tooltip>信息中心</tooltip>
<contenturl>http://localhost/BNSolution/WebTest/OCS/HTMLPage1.htm</contenturl>
<userid>true</userid>
<contactid>true</contactid>
<accessibility>inside</accessibility>
</tab>
</tabdata>
   XML文件中,各元素的详细说明如下: XML 元素
描述
是否必须
tabdata
Contains 0 or more tab elements. The aximum number of tab elements is 32.
 

No

tab
Contains p_w_picpath, name, tooltip, contenturl, userid, contactid, and accessibility elements.
 

No

p_w_picpath
标签图片的URL.

 

No

name
标签的友好名称,用于标识XML结点,将不显示。

 

Yes

tooltip
鼠标悬停在标签上时的提示信息。.

 

No

contenturl
web 标签页面的URL。

 

Yes

userid (“true” | “false”)
展现标签页面时,是否带上usrid 参数(当前用户SIP:URI)。缺省:false

 

No

contactid
(“true” | “false”)

展现标签页面时,是否带上联系人的 contactid 参数(联系人的SIP:URI)。
缺省:false



 

No

accessibility (
“inside” |
“outside” |
“both”)

用户在企业内部或者外部登录时,该标签是否显示:
inside :仅在内部登录时显示;
outside:仅在外部登录时显示;
both:都显示

 

No


  二、发布XML文件,发布方式有:
  HTTP:
  HTTPS: 确认要在IE浏览器中可正确访问,如果不能访问,请将该站点加入IE的信任站点列表中。
  文件共享:其书写规则为: [url=file:///c:/intput/wwwroot/OcsConfig/Tab/tabURL.xml]file:///c:/intput/wwwroot/OcsConfig/Tab/tabURL.xml[/url]  

 三、注册XML文件,打开注册表编辑器,找到HKEY_LOCAL_MACHINE\software\Policies\Microsoft\Communicator ,创建一字符串项TabURL 其值就是上面发布的XML文件的URL,比如:http://localhost/OcsConfig/TabURL.XML
  也可编辑一个reg 文件,直接导入即可:[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Communicator]
"TabURL"=[url=file://server//comshare//Presence.xml]"[/url]http://localhost/OcsConfig/TabURL.XML[url=file://server//comshare//Presence.xml]"[/url]

  四、重新登录OC,看一看漂亮的女神,终于揭开她神秘的面纱,是不是能和我们一见忠情啊!

   在OC2007中,通过定制web 标签页,才算打开它二次开发的大门,开始踏上二次开发的慢慢征途。这些标签页,基本上没有什么限制,无论asp、ASP.net 、Microsoft SharePoint Services Web parts、Microsoft ActiveX
controls 还是  scripted applications,都可以正确的运行。所以说,尽可能地发挥你丰富的想象力,把OC与应用系统很好地集成起来,不怕做不到,只怕想不到。

  最后补充说明几个问题:
  1、在OC2007中,最多可以创建 32个tab 标签页,否则将不能生成。其实也用不了那么多,小小的一块天地,捡重点,捡实用的东东放上就可以了,现在楼市火爆,地盘值钱,方寸大小的屏幕,也价值不菲啊,所以就更要合理运用了。

  2、标签图片(即:XML文件中的p_w_picpath 图片),必须为*.png 格式的图片。图片的大小为 16 X 16 或者 32 X 32 ,如果图片格式或者图片大小不符合规范,则显示缺省图标。

  3、如果需要将当前用户或者被选中的联系人,传递给标签中的web 页面,我们可以有下面两种办法:、
  (1)、在XML文件中,设置 userid =true  contactid =true,这样当前用户或者联系人的SIP:URI 就会作为页面参数传递给web 页面,比如:
contenturl=http://moc.corp.contoso.com/corpnews.html 当前用户为sip:mallen@contoso.com ,加载web 页面时的URL则为:http://moc.corp.contoso.com/corpnews.html ?usrid=sip:mallen@contoso.com

(2)如果需要将当前选中的联系人、联系人分组信息传到web 页面,有一个脚本函数可以使用    
    OnSelectionChange(contacts, groups, distribution_groups)
  今天就写到这里了,其实,这里面还有很多很炫的功能,希望能和大家一起讨论,下一堂课,将讲述如何扩展OC2007的菜单功能,敬请关注。
一步一步学习OC2007(三)--定制菜单命令
 在前面的两篇文章中,我们讲了如何定制联系人的在线状态,如何定制web 标签页,是不是对OC2007 的魔力有所感触了呢?其实,这只是一个引言,一道开胃菜而已,后面还有更多的大餐等着你呢?今天,我们就一起来谈谈,如何定制OC2007的菜单命令?
  OC2007中,有三种类型的菜单:
  工具栏菜单(The Tools menu)
  会话窗口的动作菜单(The Actions menu off the Conversation window)
  联系人窗口右键菜单(The right-click menu off the Contact List)

在这些菜单列表中,都可以扩充我们的自定义菜单项。
  在OC2007 中,扩展菜单项,比扩展web 标签页,要容易一些,只要在注册表中定义清楚菜单项的各项属性就可以正常运行。如下代码所示:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Communicator\SessionManager\Apps\{27877e66-615c-4582-ab88-0cb2ca05d951}]
"Name"="发送短信"
"ExtensibleMenu"="ConversationWindowRightClick;MainWindowActions;MainWindowRightClick;ConversationWindowActions;ConversationWindowContextual"
"Path"="E:\\群发邮件\\SendNote\\SendNote.exe %user-id% %contact-id%"
"ApplicationInstallPath"="E:\\群发邮件\\SendNote\\SendNote.exe"
"SessionType"=dword:00000000
"ApplicationType"=dword:00000000

各注册键说明如下:
Name
Type
Data
Name
REG_SZ
菜单命令名称
ApplicationType
DWORD
应用程序类型:0:可执行文件;1:协议
ApplicationInstallPath
REG_SZ
ApplicationType = 0 时,应用程序的完整路径
Path
REG_SZ
应用程序的完整路径及其参数,缺省参数 %user-id% 和%contact-id%.
SessionType
DWORD
会话类型。
0:本地会话,应用程序只在本地启动。
1:双方会话(缺省)
2:多方会话

ExtensibleMenu
REG_SZ
应用程序将会在哪些菜单上显示:
MainWindowActions
MainWindowRightClick
ConversationWindowActions
ConversationWindowContextual
ConversationWindowRightClick


缺省MainWindowRightClickConversationWindowContextual 
多个菜单项目之间用分号(“;”)分隔。

菜单说明

键名称(Key) 说明MainWindowActions主窗口菜单的[工具]工菜单下MainWindowRightClickOC主窗口联系人[右键]菜单ConversationWindowActions对话窗口菜单的[操作]菜单下ConversationWindowContextual对话窗口的[发送文件]菜单ConversationWindowRightClick对话窗口,联系人列表[右键]菜单定义完成后,重启OC,就可以达到如图所示的效果了。




一步一步学习OC2007(四)--扩展帮助菜单

在OC2007中扩展帮助菜单,也是OC护展中最简单的一项,只要在注册表中注册以下两项就可以了:

  HelpMenuText :帮助菜单名称。
  HelpMenuURL
:帮助内容页面的URL。

注册代码如下:   

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Communicator]
"HelpMenuText"="发送短信帮助"
"HelpMenuURL"=http://localhost/SendNoteHelp/index.htm

 
  重启OC,就可以看到我们的帮助菜单条了,



一步一步学习OC2007(五)--OC与 Web 应用系统的集成
 

  通过前面几课的学习,大家可能对OC的强大功能有所了解了吧,她的即时通信、她的语音聊天、她的视频会议、她的分组、她的联系人查找等等等,都是其它IM工具所无法比拟的,再加之她的二次开发接口,更是锦上添花。
  前面几课,无论是web 标签页的扩展、OC状态的自定义,还是菜单功能的扩展,都是针对于OC进行扩充与完善。试想,如果一个论坛与OC进行集成,在线人员一栏,就不是一些干涩文字,直接用OC的在线状态显示出来,如果想与之交流,就直接可以用OC进行交流了,如下图所示:



与电话联系表的集成,此时可以直接与对方通过OC 交流,即方便又适用。

 


与文章管理系统的集成,如果读者看了这篇文章后,有什么感想、有什么心得、或者有什么不同的见解,都可以立即与作者、与审核人员进行OC沟通,再不用另外查找他的通信方式。而且,也不必把对方加入联系人中,就可以直接通信。

怎么实现呢,其实很简单,请参照下面的代码就,依样画葫芦就可以了。

 

 
  
  1. <%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="WebTest.WebForm1" %> 
  2.  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > 
  3.  <HTML> 
  4.      <HEAD> 
  5.          <title>WebForm1</title> 
  6.          <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> 
  7.          <meta name="CODE_LANGUAGE" Content="C#"> 
  8.          <meta name="vs_defaultClientScript" content="JavaScript"> 
  9.          <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> 
  10.          <SCRIPT language='javascript' src='owsbrows.js'></SCRIPT> 
  11.          <SCRIPT language='javascript' src='ows.js'></SCRIPT> 
  12.      </HEAD> 
  13.      <body MS_POSITIONING="GridLayout"> 
  14.          <form id="Form1" method="post" runat="server"> 
  15.              <FONT face="宋体"> 
  16.                  <TABLE id="Table1" style="Z-INDEX: 101; LEFT: 88px; WIDTH: 424px; POSITION: absolute; TOP: 136px; HEIGHT: 24px" 
  17.                      cellSpacing="1" cellPadding="1" width="424" border="1"> 
  18.                      <TR> 
  19.                          <TD> 
  20.                              <table cellpadding="0" cellspacing="0"> 
  21.                                  <tr> 
  22.                                      <td style="PADDING-RIGHT: 3px"><img border="0" valign="middle" height="12" width="12" src="../Resource/../Resource/p_w_picpath/blank.gif" 
  23.                                              onload="IMNRC('goumh@domain.com.cn');" id="{95100999-a43f-4db3-bc74-a74fad6473a7}" Sortable="1"> 
  24.                                      <td style="PADDING-TOP: 1px" class="ms-vb">苟茂华(Goumh)  
  25.                                      </td> 
  26.                                  </tr> 
  27.                              </table> 
  28.                          </TD> 
  29.                      </TR> 
  30.                  </TABLE> 
  31.              </FONT> 
  32.          </form> 
  33.      </body> 
  34.  </HTML> 
  35.   

如果想与DataGrid 绑定,也非常简单
C#代码

 

 
  
  1. using System;  
  2.  using System.Collections;  
  3.  using System.ComponentModel;  
  4.  using System.Data;  
  5.  using System.Drawing;  
  6.  using System.Web;  
  7.  using System.Web.SessionState;  
  8.  using System.Web.UI;  
  9.  using System.Web.UI.WebControls;  
  10.  using System.Web.UI.HtmlControls;  
  11.    
  12. namespace WebTest  
  13.  {  
  14.      /// <summary>  
  15.      /// msn1 的摘要说明。  
  16.      /// </summary>  
  17.      public class msn1 : BN.Web .UI .BNPage  
  18.      {  
  19.          protected BN.Web.UI.WebControls.BNDataGrid BNDataGrid1;  
  20.          protected BN.Web.UI.WebControls.BNDropDownList BNDropDownList1;  
  21.          protected System.Web.UI.WebControls.Label Label1;  
  22.          protected BN.Web.UI.WebControls.BNDataGrid BNDataGrid2;  
  23.          protected System.Web.UI.WebControls.DataGrid DataGrid1;  
  24.    
  25.         BN.Data.DBTrans  Sqlca =  BN.Data.DBTrans.GetDBCInstance ("server=d1-hgh;database=HumanResource;uid=sa;pwd=29jDF?XvTt");  
  26.        
  27.          private void Page_Load(object sender, System.EventArgs e)  
  28.          {  
  29.              // 在此处放置用户代码以初始化页面  
  30.              if (this.IsPostBack )  
  31.                  return ;  
  32.    
  33.             DataTable dt ;  
  34.    
  35.             string strSql = "select distinct lngShopID,strShopName from dbo.View_Employee_Right ";  
  36.              dt = this.Sqlca .GetDataTable (strSql);  
  37.              this.BNDropDownList1 .DataBind (dt,"strShopName","lngShopID");  
  38.    
  39.             this.DataGridBind();  
  40.    
  41.         }  
  42.    
  43.         Web 窗体设计器生成的代码  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.    
  66.         private void BNDataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)  
  67.          {  
  68.              System.Web .UI .WebControls .Image  img ;  
  69.              img = (System.Web .UI .WebControls .Image)e.Item .FindControl ("Image1");  
  70.              string s = e.Item .Cells [1].Text + "@domain.com.cn";  
  71.    
  72.             if (img != null)  
  73.                  img.Attributes .Add ("onload","IMNRC('"+s+"');");  
  74.          }  
  75.    
  76.         private void DataGridBind()  
  77.          {  
  78.              string strSql = "select lngShopID,strShopName,strEmployeeName,strOperatorName from dbo.View_Employee_Right where lngShopID = " + this.BNDropDownList1 .Value ;  
  79.              DataTable dt = this.Sqlca .GetDataTable (strSql);  
  80.  //            this.BNDataGrid1 .DataBind (dt);  
  81.              this.DataGrid1.DataSource = dt.DefaultView ;  
  82.              this.DataGrid1 .DataBind ();  
  83.          }  
  84.    
  85.         private void BNDropDownList1_SelectedIndexChanged(object sender, System.EventArgs e)  
  86.          {  
  87.              this.DataGridBind ();  
  88.          }  
  89.    
  90.         private void Handle()  
  91.          {  
  92.    
  93.         }  
  94.      }  
  95.  }  
  96.   

Aspx 代码

 

 
  
  1. <%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="WebTest.WebForm1" %>  
  2.  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >  
  3.  <HTML>  
  4.      <HEAD>  
  5.          <title>WebForm1</title>  
  6.          <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">  
  7.          <meta name="CODE_LANGUAGE" Content="C#">  
  8.          <meta name="vs_defaultClientScript" content="JavaScript">  
  9.          <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">  
  10.          <SCRIPT language='javascript' src='owsbrows.js'></SCRIPT>  
  11.          <SCRIPT language='javascript' src='ows.js'></SCRIPT>  
  12.      </HEAD>  
  13.      <body MS_POSITIONING="GridLayout">  
  14.          <form id="Form1" method="post" runat="server">  
  15.              <FONT face="宋体">  
  16.                  <asp:DataGrid id="DataGrid1" style="Z-INDEX: 101; LEFT: 160px; POSITION: absolute; TOP: 56px" 
  17.                      runat="server" AutoGenerateColumns="False">  
  18.                      <Columns>  
  19.                      <asp:BoundColumn DataField="strOperatorName" HeaderText="strOperatorName">  
  20.                          <HeaderStyle Wrap="False"></HeaderStyle>  
  21.                          <ItemStyle Wrap="False"></ItemStyle>  
  22.                      </asp:BoundColumn>  
  23.                          <asp:TemplateColumn>  
  24.                              <HeaderStyle Wrap="False"></HeaderStyle>  
  25.                              <ItemStyle Wrap="False"></ItemStyle>  
  26.                              <ItemTemplate>  
  27.                                  <TABLE id="Table1" cellSpacing="0" cellPadding="0" width="300" border="0">  
  28.                                      <TR>  
  29.                                          <TD>  
  30.                                              <asp:Label id=strName runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.strEmployeeName") %>'>  
  31.                                              </asp:Label>  
  32.                                              <asp:Image id="Image1" runat="server" ImageUrl="../Resource/p_w_picpath/blank.gif" Sortable="1"></asp:Image></TD>  
  33.                                          <TD><FONT face="宋体"></FONT></TD>  
  34.                                      </TR>  
  35.                                  </TABLE>  
  36.                              </ItemTemplate>  
  37.                          </asp:TemplateColumn>  
  38.                      </Columns>  
  39.                  </asp:DataGrid>  
  40.              </FONT>  
  41.          </form>  
  42.      </body>  
  43.  </HTML>  
  44.   

就这样,短短的几行代码,就会让你的系统,大放异彩。试一试吧,你会有意想不到的收获。