??xml version="1.0" encoding="utf-8" standalone="yes"?>中文字幕精品三区,亚洲第一区中文99精品,成人三级毛片http://www.aygfsteel.com/gdws/category/48324.htmlj2se,j2ee开发组zh-cnThu, 14 Apr 2011 19:50:11 GMTThu, 14 Apr 2011 19:50:11 GMT60MapGuide服务器源码分?/title><link>http://www.aygfsteel.com/gdws/articles/348330.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Thu, 14 Apr 2011 16:25:00 GMT</pubDate><guid>http://www.aygfsteel.com/gdws/articles/348330.html</guid><wfw:comment>http://www.aygfsteel.com/gdws/comments/348330.html</wfw:comment><comments>http://www.aygfsteel.com/gdws/articles/348330.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/gdws/comments/commentRss/348330.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/gdws/services/trackbacks/348330.html</trackback:ping><description><![CDATA[ <span id="wmqeeuq" class="Apple-style-span" style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"> <span id="wmqeeuq" class="Apple-style-span" style="FONT-SIZE: 14px; LINE-HEIGHT: 21px; FONT-FAMILY: verdana, sans-serif; TEXT-ALIGN: left"> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">同样Q在介绍MapGuide 服务器如何处理枚举资源操作之前,让我们首先来看看MapGuide 服务器用于处理服务请求和操作的类Q图19?昄服务h处理器类的类图,?9?0昄了操作处理器cȝcd?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> <a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" > <img title="clip_image002" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="311" alt="clip_image002" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image002_thumb_633969065442477500.gif" width="525" border="0" /> </a> </p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> <a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="_Ref247889725">?span class="Apple-converted-space"> </span></a>19?0 服务h处理器类的类?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> <a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" > <img title="clip_image004" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="739" alt="clip_image004" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image004_thumb_633969065483415000.gif" width="509" border="0" /> </a> </p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> <a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="_Ref247889912">?span class="Apple-converted-space"> </span></a>19?1 操作处理器类的类?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MapGuide提供了资源服务、要素服务等多种服务Q每U服务包含了大量操作。MapGuide为每U服务提供了一个服务请求处理器c,用于处理q些服务所提供的操作,例如MgResourceServiceHandler、MgFeatureServiceHanlder{。这些类都承自IMgServiceHandlerQƈ且实CҎ(gu)IMgServiceHandler::ProcessOperation(...)。MapGuide使用工厂cMgServiceHanlderFactory来创Z个服务请求处理器cȝ实例Q给定一个服务IDQ调用方法MgServiceHandlerFactory::GetHandler(...)可以创徏对应的服务请求处理器cȝ实例?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">对于服务中的每种操作QMapGuide也提供了相应的操作处理器cR从?9?0可以看到Q操作处理器cd为四个层ơ,最高一层是cIMgOperationHandlerQ它是所有操作处理类的基c,W二层是cMgServiceOperationQ第三层是类Mg<strong><em style="FONT-STYLE: italic">XXX</em></strong>OperationQ“XXX”代表服务名Uͼ在这一层每U类型的服务都有一个对应的c,例如MgFeatureOperation、MgResourceOperation{,W四层ؓ(f)真正负责工作的操作处理器c,每种服务中的每个操作都有一个对应的操作处理器类Q某U服务中操作处理器类都承自同一个父c,例如MgEnumerateResource、MgSetResource都承自MgResourceOperation?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">接下来让我们看看MapGuide服务器如何处理枚举资源操作,q个操作程的时序图如图 19?1所C?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> <a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" > <img title="clip_image006" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="441" alt="clip_image006" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image006_thumb_633969065494196250.gif" width="566" border="0" /> </a> </p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> <a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="_Ref247977543">?span class="Apple-converted-space"> </span></a>19?2 MapGuide服务器处理枚举资源操作的时序?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">1Q?在线E池中找一个空闲的U程执行操作</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MapGuide服务器用了多线E和U程池的技术来提高操作处理和响应请求的性能。在MapGuide服务器启动时Q会(x)创徏一个操作请求队列和一个用于处理操作请求的U程池。当一个操作请求进入操作队列,MapGuide服务器会(x)在线E池中找一个空闲的U程执行操作。如果没有空闲的U程Q那么这个操作请求会(x)处于{待状态,直到U程池中有了I闲的线E?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">首先Q让我们查看一下服务器的入口函数的源代码,看看服务器是如何启动的。MapGuide服务器可以像普通的应用E序一栯行,q可以在Windows操作pȝ可以q行为Windows服务Q在Linux操作pȝq行为守护进E,下面的代码中只保留了q行为普通应用程序部分的代码?/p> <table cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td valign="top" width="576"> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">typedef ACE_Singleton SERVER;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">int ACE_TMAIN(int argc, ACE_TCHAR *argv[])</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">int nResult = 0;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 初始化ACE服务</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">ACE::init();</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// Ҏ(gu)命o(h)行参数执行响应的操作</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">if((ACE_OS::strcasecmp(parameter, ACE_TEXT("?")) == 0) ||</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">(ACE_OS::strcasecmp(parameter,</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MG_WCHAR_TO_TCHAR(MgResources::ServerCmdHelp)) == 0))</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 昄服务器命令行参数</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">ShowCommandlineHelp();</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">else if((ACE_OS::strcasecmp(parameter,</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MG_WCHAR_TO_TCHAR(MgResources::ServerCmdRun)) == 0) ||</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">(ACE_OS::strcasecmp(parameter,</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MG_WCHAR_TO_TCHAR(MgResources::ServerCmdInteractive)) == 0))</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">ACE_OS::printf(MG_WCHAR_TO_CHAR(MgResources::ServerCmdRunInfo));</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 以普通应用程序的方式q行服务?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">nResult = SERVER::instance()->init(argc, argv);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">if(0 == nResult)</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 启动服务</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">nResult = SERVER::instance()->open();</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// l止服务</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">SERVER::instance()->fini();</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// l止ACE服务</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">ACE::fini();</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">return nResult;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p> </td> </tr> </tbody> </table> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> </p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">在上面的代码中,我们可以看到大量以“ACE”ؓ(f)前缀的类Q这些类是ACE自适配通信环境QAdaptive Communication EnvironmentQ工具包中的cRACE是一个开源的工具包,它实C许多用于q发通信软g的核心模式。ACE的目标用h在UNIX和W(xu)in32q_上开发高性能通信服务和应用的开发者。ACE化了使用q程间通信、事件多路分R显式动态链接和q发的OO|络应用和服务的开发。ACE提供了一l丰富的可复用C++ Wrapper FacadeQ包装外观)(j)和框架组Ӟ可跨多U^台完成通用的通信软gdQ其中包括:(x)事g多\分离和事件处理器分派、信号处理、服务初始化、进E间通信、共享内存管理、消息\由、分布式服务动态(重)(j)配置、ƈ发执行和同步{?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">cMgServerl承自AEC工具包中的类ACE_NT_Service或ACE_Service_ObjectQ对应于服务器的ȝE,?9?2昄了服务器ȝE类的类图。MgServer::svc()是主U程的入口,调用Ҏ(gu)MgServer::open()?x)启动主U程q且执行Ҏ(gu)MgServer::svc()Q调用MgServer::fini()?x)终止主U程。MapGuide使用了Singleton模板ACE_SingletonMgServer装Z个单实例c,Z方便使用MapGuide使用typedef为ACE_Singleton定义了一个别名SERVERQ调用方法SERVER::instance()可以创徏cMgServer的一个实例?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> <a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" > <img title="clip_image008" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="194" alt="clip_image008" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image008_thumb_633969065502321250.gif" width="255" border="0" /> </a> </p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> <a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="_Ref248070447">?span class="Apple-converted-space"> </span></a>19?3 服务器主U程cȝcd</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgServer::svc()是主U程的入口,该方法会(x)创徏一个操作请求队列和一个用于处理操作请求的U程池,它的代码如下所C。事实上Q该Ҏ(gu)q定义了其它cd的队列和U程池,Z便于理解我们省略掉了q些代码?/p> <table cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td valign="top" width="576"> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">int MgServer::svc()</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgServerManager* pServerManager = MgServerManager::GetInstance();</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 创徏U程理器和操作U程</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">ACE_Thread_Manager threadManager;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgOperationThread clientThreads(threadManager,</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">pServerManager->GetClientThreads());</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">pServerManager->SetClientMessageQueue(clientThreads.msg_queue_);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgClientAcceptor clientAcceptor(clientAddr, ACE_Reactor::instance(),</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">clientThreads.msg_queue_);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">nResult = clientAcceptor.Initialize();</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">if(nResult == 0)</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 启动U程?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">nResult = clientThreads.Activate();</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">if(nResult == 0)</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 通知操作U程停止执行</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">ACE_Message_Block* mb = new ACE_Message_Block(4);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">if(mb)</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">mb->msg_type(ACE_Message_Block::MB_STOP);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">clientThreads.putq(mb);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 停止操作U程</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">clientThreads.close();</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// {待所有操作线E执行完?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">threadManager.wait();</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">threadManager.close();</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">return nResult;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p> </td> </tr> </tbody> </table> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> </p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">上面的代码中创徏一个类MgOperationThread的实例,该对象创Z一个线E池Q维护了一个操作请求队列。类MgOperationThread l承自ACE工具包中的模板类AEC_TaskQ对应于操作U程Q图19?3昄了操作线E类的类图。ACE_Task装了Q务,每个d都含有一或多个线E,以及(qing)一个底层消息队列。方法ACE_Task::svc()是线E的启动入口Q调用方法ACE_Task::open()用于初始化Q务,调用Ҏ(gu)ACE_Task::close()用于l止dQ调用方法ACE_Task::activate()用于启动U程Q调用方法ACE_Task::putq()攄消息CQ务的消息队列中,调用Ҏ(gu)ACE_Task::getq()从Q务的消息队列中取出消息?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> <a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" > <img title="clip_image010" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="321" alt="clip_image010" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image010_thumb_633969065600446250.gif" width="499" border="0" /> </a> </p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> <a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="_Ref248076833">?span class="Apple-converted-space"> </span></a>19?4 操作U程cȝcd</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Ҏ(gu)MgOperationThread::svc()是操作线E的入口Q它的代码如下所C?/p> <table cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td valign="top" width="576"> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">int MgOperationThread::svc()</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">INT32 nResult = 0;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">while (m_bActive)</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">ACE_Message_Block* messageBlock = NULL;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 从消息队列中取出消息</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">while (getq(messageBlock) == -1)</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">if(messageBlock->msg_type() == ACE_Message_Block::MB_STOP)</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">m_bActive = false;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">ACE_Message_Block* mb = new ACE_Message_Block(4);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">if(mb)</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">mb->msg_type(ACE_Message_Block::MB_STOP);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">putq(mb);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">else if(messageBlock->msg_type() ==<span id="wmqeeuq" class="Apple-converted-space"> </span><a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="OLE_LINK53"></a><a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="OLE_LINK52">ACE_Message_Block::MB_DATA</a>)</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgServerStreamData* pData =</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">dynamic_cast(messageBlock->data_block());</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">IMgServiceHandler::MgProcessStatus stat =<span id="wmqeeuq" class="Apple-converted-space"> </span><strong><em style="FONT-STYLE: italic">ProcessMessage(messageBlock);</em></strong></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">return nResult;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">IMgServiceHandler::MgProcessStatus MgOperationThread::ProcessMessage(ACE_Message_Block* pMB)</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">IMgServiceHandler::MgProcessStatus stat = IMgServiceHandler::mpsError;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgServerStreamData* pData = NULL;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">pData = (MgServerStreamData*) pMB->data_block();</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgStreamParser::ParseStreamHeader(pData);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgStreamParser::ParseDataHeader(pData);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgPacketParser::MgPacketHeader pt = MgPacketParser::GetPacketHeader(pData);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">switch ( pt )</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">case (MgPacketParser::mphOperation):</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> <strong> <em style="FONT-STYLE: italic">stat = ProcessOperation( pData );</em> </strong> </p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">break;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">return stat;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p> </td> </tr> </tbody> </table> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> </p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">从上面的代码可以看到Q方法MgOperationThread::svc()?x)调用方法getq(?循环讉K消息队列Q取出等待处理的消息。如果是数据cd的消息,那么调用Ҏ(gu)MgOperationThread:: ProcessMessage(...)处理q个消息。方法MgOperationThread::ProcessMessage(...)?x)解析这个消息的头和数据Q如果消息数据中包含了一个操作请求,那么调用Ҏ(gu)MgOperationThread:: ProcessOperation(?处理q个操作h?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">2Q?处理服务h</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Ҏ(gu)MgOperationThread::ProcessOperation(? 首先?x)解析消息数据中的服务ID、操作ID、操作的版本L(fng)信息Q然后根据服务ID使用工厂cMgServiceHanlderFactory来创Z个服务请求处理器cȝ实例Q最后调用这个服务请求处理器cȝҎ(gu)IMgServiceHandler:: ProcessOperation(...)处理q个服务h?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">本节的示例中客户端发送的是一个枚举资源的操作hQ所以工厂类?x)创Z个MgResourceServiceHandler的实例,调用Ҏ(gu)MgResourceServiceHandler::ProcessOperation(...)处理q个服务h?/p> <table cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td valign="top" width="576"> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">IMgServiceHandler::MgProcessStatus</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgOperationThread::ProcessOperation(MgServerStreamData* pData)</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">IMgServiceHandler::MgProcessStatus stat = IMgServiceHandler::mpsError;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgOperationPacket op;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgStreamHelper* pHelper = NULL;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">pHelper = pData->GetStreamHelper();</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">pHelper->GetUINT32(op.m_PacketHeader);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">pHelper->GetUINT32(op.m_PacketVersion);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">pHelper->GetUINT32(op.m_ServiceID);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">pHelper->GetUINT32(op.m_OperationID);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">pHelper->GetUINT32(op.m_OperationVersion);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">IMgServiceHandler* pServiceHandler =</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgServiceHandlerFactory::Instance()->GetHandler(op.m_ServiceID, pData, op);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">delete pServiceHandler;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">pServiceHandler = NULL;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> <strong> <em style="FONT-STYLE: italic">stat = pServiceHandler->ProcessOperation();</em> </strong> </p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">return stat;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p> </td> </tr> </tbody> </table> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> </p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">3Q?处理操作h</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">首先Q方法MgResourceServiceHandler::ProcessOperation(...)?x)根据操作请求的IDQ调用资源操作工厂类的方法MgResourceOperationFactory::GetOperation(?创徏相应的资源服务操作类MgOpEnumerateResources的实例。然后,调用MgOpEnumerateResources:: Initialize(...)初始化枚举资源操作处理器Q调用方法MgServiceManager::RequestService(?创徏服务器资源服务MgServerResourceService的实例。最后,调用Ҏ(gu)MgOpEnumerateResources::Execute()处理操作hQ该Ҏ(gu)?x)调用MgServerResourceService::EnumerateResources(?实际执行枚D资源的功能?/p> <table cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td valign="top" width="576"> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">IMgServiceHandler::MgProcessStatus MgResourceServiceHandler::ProcessOperation()</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">IMgServiceHandler::MgProcessStatus status = IMgServiceHandler::mpsError;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">auto_ptr handler;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MG_TRY()</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">handler.reset(MgResourceOperationFactory::GetOperation(</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">m_packet.m_OperationID, m_packet.m_OperationVersion));</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">assert(NULL != handler.get());</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">handler->Initialize(m_data, m_packet);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">handler->Execute();</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">status = IMgServiceHandler::mpsDone;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MG_CATCH(L"MgResourceServiceHandler.ProcessOperation")</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">if (mgException != NULL && NULL != handler.get())</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">status = (handler.get()->HandleException(mgException) ?</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">IMgServiceHandler::mpsDone : IMgServiceHandler::mpsError);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">if (IMgServiceHandler::mpsDone != status)</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MG_THROW();</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">return status;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">void MgOpEnumerateResources::Execute()</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">BeginExecution();</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Validate();</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Ptr byteReader = m_service->EnumerateResources(resource, depth,</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">type, properties, fromDate, toDate, computeChildren);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">EndExecution(byteReader);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p> </td> </tr> </tbody> </table> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> </p> </span> </span> <br class="Apple-interchange-newline" /> <img src ="http://www.aygfsteel.com/gdws/aggbug/348330.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/gdws/" target="_blank">帅子</a> 2011-04-15 00:25 <a href="http://www.aygfsteel.com/gdws/articles/348330.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MapGuide源码分析?/title><link>http://www.aygfsteel.com/gdws/articles/348329.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Thu, 14 Apr 2011 16:24:00 GMT</pubDate><guid>http://www.aygfsteel.com/gdws/articles/348329.html</guid><wfw:comment>http://www.aygfsteel.com/gdws/comments/348329.html</wfw:comment><comments>http://www.aygfsteel.com/gdws/articles/348329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/gdws/comments/commentRss/348329.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/gdws/services/trackbacks/348329.html</trackback:ping><description><![CDATA[ <span id="wmqeeuq" class="Apple-style-span" style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"> <span id="wmqeeuq" class="Apple-style-span" style="FONT-SIZE: 14px; LINE-HEIGHT: 21px; FONT-FAMILY: verdana, sans-serif; TEXT-ALIGN: left"> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">本节中,我们通过介绍如何完成枚D资源功能来介lMapGuide Web扩展的部分源代码?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">在浏览器端的地址栏输入类似如下字W串Q就?x)发送一个枚举资源的HTTPh?/p> <table cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td valign="top" width="576"> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">http://hostname/mapGuide/mapagent.fcig?OPERATION=EnumerateResources&VERSION=1.0.0& RESOURCEID=Library:// &TYPE=FeatureSource&DEPTH=3</p> </td> </tr> </tbody> </table> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> </p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">下面我们来看看MapGuide Web扩展如何处理q个h?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">在介lMapGuide Web扩展如何处理枚D资源HTTPh之前Q让我们首先来看看MapGuide Web扩展用于处理HTTPh和响应的c,q些cȝcd如图19?所C?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> <a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" > <img title="clip_image002" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="165" alt="clip_image002" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image002_thumb_633962217367264558.gif" width="506" border="0" /> </a> </p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">?19? HTTPh和响应类的类?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">cMgHttpRequest和类MgHttpResponse分别是对HTTPh和响应结果的抽象Q这两个cd以用于Q何类型的Web应用服务器,也就是说它们的代码不依赖于Q何Web应用服务器API。在文g夹“\MgDev\Web\src\HttpHandler”下可以扑ֈ所有前~为“MgHttp”类的源代码?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">cMgHttpRequest用于处理HTTPhQ它包含了一个HTTPh头MgHttpHeader的实例、一个HTTPh参数HttpRequestParam的实例和一个HTTPh元数据HttpRequestMetadata的实例。调用方法MgHttpRequest::Execute()?x)将HTTPh转发lMapGuide服务器,当MapGuide服务器处理完q个hQ将hl果q回lWeb扩展之后Q这个方法会(x)q回一个MgHttpResponse对象Q它表示HTTPh的响应结果?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">接下来让我们看看MapGuide Web扩展如何处理<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="OLE_LINK51"></a><a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="OLE_LINK42">枚D资源</a>的HTTPh。大多数MapGuide用户都是使用IIS作ؓ(f)Web应用服务器,q且使用Web扩展模块isapi_MapAgent.dll来处理HTTPhQ所以本节侧重于isapi_MapAgent.dll模块处理HTTPh的流E,q个处理程的时序图如图19?所C?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> <a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" > <img title="clip_image004" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="496" alt="clip_image004" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image004_thumb.gif" width="567" border="0" /> </a> </p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> <a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="_Ref247802663">?span class="Apple-converted-space"> </span></a>19? Web扩展处理枚D资源h的时序图</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">1Q?加蝲Web应用服务器扩展模?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">如果使用的是IIS Web应用服务Q那么在接收到后~为“fcgi”的HTTPh后,IIS?x)加载Web应用服务器扩展模块isapi_MapAgent.dll或MapAgent.exe。其中,isapi_MapAgent.dllZIIS APIQ具有更好的性能QMapAgent.exeZCGI技术,性能要稍微差一些。如果用的是Apache Web应用服务器,那么在Windowsq_上Apache?x)加载Web应用服务器扩展模块MapAgent.exeQ在Linuxq_上会(x)加蝲模块mod_mgmapagent.so?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">q三个Web服务器扩展模块实CcM的功能,它们的源代码位置如表19?所C?/p> <table cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td valign="top" width="168"> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> <strong>服务器扩展模?/strong> <strong> </strong> </p> </td> <td valign="top" width="274"> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> <strong>源代码位|?/strong> <strong> </strong> </p> </td> </tr> <tr> <td valign="top" width="168"> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">isapi_MapAgent.dll</p> </td> <td valign="top" width="274"> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">\Web\src\IsapiAgent</p> </td> </tr> <tr> <td valign="top" width="168"> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MapAgent.exe</p> </td> <td valign="top" width="274"> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">\Web\src\CgiAgent</p> </td> </tr> <tr> <td valign="top" width="168"> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">mod_mgmapagent.so</p> </td> <td valign="top" width="274"> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">\Web\src\ApacheAgent</p> </td> </tr> </tbody> </table> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> </p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> <a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="_Ref247813607">?span class="Apple-converted-space"> </span></a>19? Web服务器扩展模块的源代码位|?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">从图19?中可以看到这三个Web服务器扩展模块提供了cM的类Q这些类提供了相同的接口Q类<strong><em style="FONT-STYLE: italic">XXX</em></strong>PostParser用于解析HTTPh中传入的参数?qing)参数|c?strong><em style="FONT-STYLE: italic">XXX</em></strong>ResponseHandler用于HTTPh的响应结果发送给客户端。其中,?strong><em style="FONT-STYLE: italic">XXX</em></strong>”表C“Cgi”、“Isapi”或“Apache”?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> <a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" > <img title="clip_image006" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="219" alt="clip_image006" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image006_thumb.gif" width="539" border="0" /> </a> </p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> <a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="_Ref247812702">?span class="Apple-converted-space"> </span></a>19? Web扩展的请求处理模?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">对于模块isapi_MapAgent.dllQ每个“fcgi”类型的HTTPh?x)调用此模块中的?gu)HttpExtensionProcQ这个方法的代码如下所C,Z便于理解我们只保留了一些核心代码?/p> <table cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td valign="top" width="576"> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">DWORD WINAPI HttpExtensionProc(EXTENSION_CONTROL_BLOCK *pECB)</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Initialize(pECB);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 调用GetServerVariabled诸如服务器名U、端口号{服务器变量信息</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 创徏MgHttpRequest的实例,用于处理HTTPh</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Ptr request = new MgHttpRequest(wUrl);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 解析HTTPh中的参数Qƈ且将q些参数|入MgHttpRequest对象?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Ptr params = request->GetRequestParam();</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">IsapiPostParser postParser(pECB);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">postParser.Parse(params);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 创徏IsapiResponseHandler的实例,用于响应请求返回给客户?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">IsapiResponseHandler responseHandler(pECB);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// HTTPh转发lMapGuide服务器,当MapGuide服务器处理完q个hQ?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 请求结果返回给Web扩展之后Q这个方法会(x)q回一个MgHttpResponse对象Q?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 它表CHTTPh的响应结果?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Ptr response = request->Execute();</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 响应结果返回给客户?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">responseHandler.SendResponse(response);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p> </td> </tr> </tbody> </table> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> </p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">2Q?创徏MgHttpRequest的实例,用于处理HTTPh</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">在加载Web应用服务器扩展模块后Q需要创Z个MgHttpRequest的实例用于处理HTTPh。类MgHttpRequestq不兌与Q何类型的Web应用服务器,所以Web应用服务器扩展模块会(x)使用c?strong><em style="FONT-STYLE: italic">XXX</em></strong>PostParser解析HTTPh中传入的参数?qing)参数|这些参数设|到MgHttpRequest对象中?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">3Q?调用Ҏ(gu)MgHttpRequest::Execute()处理HTTPh</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Ҏ(gu)MgHttpRequest::Execute()的源代码如下所C。ؓ(f)了便于理解,我们同样只保留了一些核心代码?/p> <table cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td valign="top" width="576"> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgHttpResponse* MgHttpRequest::Execute()</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Ptr hResponse;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Ptr result;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 创徏MgHttpResponse对象Q用于返回HTTPh响应l果</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">hResponse = new MgHttpResponse();</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">result = hResponse->GetResult();</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 获得HTTPh中参数“OPERATION”的?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">STRING sParamValue = m_requestParam->GetParameterValue(MgHttpResourceStrings::reqOperation);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// Ҏ(gu)参数“OPERATION”的值取得对应操作的h响应处理?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Ptr rrHandler =</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">CreateRequestResponseHandler(sParamValue, result);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">.......</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 处理HTTPh</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">if(rrHandler != NULL) rrHandler->Execute(*hResponse);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// q回响应l果</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">return SAFE_ADDREF((MgHttpResponse*)hResponse);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p> </td> </tr> </tbody> </table> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> </p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">每个HTTPh中包含一个参数“OPERATION”,它用于代表操作的cd。对于不同的操作QMapGuide定义了不同的h响应处理器类Q这个类?x)调用MapGuide服务中对应的Ҏ(gu)处理q个操作Q这些请求响应处理器cȝcd如图19?所C。从?9?可以看到Q所有请求响应处理器c都l承自类MgHttpRequestResponseHandlerQ每一U操作都有一个对应的子类Q例如枚举资源操作用了cMgHttpEnumerateResourcesQ描q模式操作用了cMgHttpDescribeSchema?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> <a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" > <img title="clip_image008" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="301" alt="clip_image008" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image008_thumb.gif" width="521" border="0" /> </a> </p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> <a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="_Ref247863319">?span class="Apple-converted-space"> </span></a>19? HTTPh响应处理器的cd</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MapGuide定义了一个全局map对象用于存放每种操作对应的请求响应处理器cd象,它的键是操作的名Uͼ值是h响应处理器类对象?/p> <table cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td valign="top" width="576"> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 定义一个全局map对象Q用于存放每U操作对应的h响应处理器类对象</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">static map</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">httpClassCreators;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">bool InitializeStaticData()</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">httpClassCreators[MgHttpResourceStrings::opGetMap] =</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgHttpGetMap::CreateObject;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">httpClassCreators[MgHttpResourceStrings::opGetMapUpdate] =</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgHttpGetMapUpdate::CreateObject;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">httpClassCreators[MgHttpResourceStrings::opGetDrawing] =</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgHttpGetDrawing::CreateObject;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">httpClassCreators[MgHttpResourceStrings::opDescribeDrawing] = MgHttpDescribeDrawing::CreateObject;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">httpClassCreators[MgHttpResourceStrings::opEnumerateResources] = MgHttpEnumerateResources::CreateObject;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p> </td> </tr> </tbody> </table> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> </p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">调用Ҏ(gu)MgHttpRequest::CreateRequestResponseHandler(...)可以Ҏ(gu)操作的名U获得对应的h响应处理器类对象。对于枚举资源操作,它会(x)q回一个类MgHttpEnumerateResources的对象?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">调用q些h响应处理器类的Execute(?Ҏ(gu)Q会(x)创徏一个代理服务类对象Q然后调用代理服务中对应的方法。ؓ(f)什么说创徏的是一个代理服务类对象呢?我想看完?9?之后大家?x)有所明白。从?9?中可以看刎ͼ所有的MapGuide服务有两个子c,一个是名称为MgProxy<strong><em style="FONT-STYLE: italic">XXX</em></strong>Service的代理服务类Q它是MapGuide Web扩展端的一个类Q另一个是名称为MgServerXXXService的服务器服务c,它是MapGuide服务器端的一个类。MgProxy<strong><em style="FONT-STYLE: italic">XXX</em></strong>Service最l会(x)服务请求{发给服务器端cMgServerXXXServiceQ所以说真正处理服务h的类是MgServerXXXServiceQMgProxy<strong><em style="FONT-STYLE: italic">XXX</em></strong>Service仅仅起到一个{发的作用Q这也就是ؓ(f)什么称cMgProxy<strong><em style="FONT-STYLE: italic">XXX</em></strong>ServiceZ理服务类的原因?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> <a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" > <img title="clip_image010" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="131" alt="clip_image010" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image010_thumb.gif" width="528" border="0" /> </a> </p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> <a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="_Ref247868155">?span class="Apple-converted-space"> </span></a>19? 代理服务和服务器服务cȝcd</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">对于枚D资源操作QMgHttpEnumerateResources::Execute(...)的源代码如下所C。调用这个方法会(x)创徏一个代理资源服务类MgProxyResourceService的对象,然后调用MgProxyResourceService::EnumerateResources(...)枚D资源Q最后将操作的执行结果放入MgHttpResponse对象中?/p> <table cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td valign="top" width="576"> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">void MgHttpEnumerateResources::Execute(MgHttpResponse& hResponse)</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Ptr hResult;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">hResult = hResponse.GetResult();</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// (g)查HTTPh中的参数</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">ValidateCommonParameters();</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 创徏MgProxyResourceService实例</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Ptr mgprService =</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">(MgResourceService*)(CreateService(MgServiceType::ResourceService));</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 执行枚D资源操作</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Ptr byteReader = mgprService-></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">EnumerateResources(&mgrIdentifier, m_depth, m_type, m_computeChildren);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 如果需要,转换响应h的格?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">ProcessFormatConversion(byteReader);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 操作结果放入响应请求中的MgHttpResult对象</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">hResult->SetResultObject(byteReader, byteReader->GetMimeType());</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgByteReader* MgProxyResourceService::EnumerateResources(</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgResourceIdentifier* resource, INT32 depth, CREFSTRING type,</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">INT32 properties, CREFSTRING fromDate, CREFSTRING toDate,</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">bool computeChildren)</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgCommand cmd;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">cmd.ExecuteCommand(m_connProp,</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgCommand::knObject,</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgResourceService::opIdEnumerateResources,</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">7,</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Resource_Service,</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">BUILD_VERSION(1,0,0),</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgCommand::knObject, resource,</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgCommand::knInt32, depth,</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgCommand::knString, &type,</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgCommand::knInt32, properties,</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgCommand::knString, &fromDate,</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgCommand::knString, &toDate,</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgCommand::knInt8, (int)computeChildren,</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgCommand::knNone);</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">SetWarning(cmd.GetWarningObject());</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">return (MgByteReader*)cmd.GetReturnValue().val.m_obj;</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p> </td> </tr> </tbody> </table> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> </p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">4Q?HTTPh的响应结果返回给客户?/p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">调用MgHttpRequest::Execute()?x)返回一个MgHttpResponse对象Q这个对象包含了HTTPh的响应结果。不q,q需要调用方?strong><em style="FONT-STYLE: italic">XXX</em></strong>ResponseHandler::SendResponse(...)Q这样Web应用服务器才?x)将q个响应l果q回l客L(fng)?/p> </span> </span> <img src ="http://www.aygfsteel.com/gdws/aggbug/348329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/gdws/" target="_blank">帅子</a> 2011-04-15 00:24 <a href="http://www.aygfsteel.com/gdws/articles/348329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MapGuide开源版的修Ҏ(gu)E?/title><link>http://www.aygfsteel.com/gdws/articles/348328.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Thu, 14 Apr 2011 16:23:00 GMT</pubDate><guid>http://www.aygfsteel.com/gdws/articles/348328.html</guid><wfw:comment>http://www.aygfsteel.com/gdws/comments/348328.html</wfw:comment><comments>http://www.aygfsteel.com/gdws/articles/348328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/gdws/comments/commentRss/348328.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/gdws/services/trackbacks/348328.html</trackback:ping><description><![CDATA[ <span id="wmqeeuq" class="Apple-style-span" style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"> <span id="wmqeeuq" class="Apple-style-span" style="FONT-SIZE: 14px; LINE-HEIGHT: 21px; FONT-FAMILY: verdana, sans-serif; TEXT-ALIGN: left"> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">代码的修改可以分Z大类Q功能增?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">(Ehancement)</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">和缺陷修?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">(Defect)</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">Q?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">使用</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Tickets</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">来管理和跟踪q些修改Q访?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" > <span style="COLOR: rgb(128,0,128); LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">http://trac.osgeo.org/mapguide/report</span> </a> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">可以览和查询活动的和已l关闭的</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Tickets</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">Q对于功能增?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">q用了</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">q行理。需要注意的是无论创?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Tickets</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">q是</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">Q都需要有一?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">OSGeo</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的帐P使用</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">OSGeo</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">帐户d后才可以创徏</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Tickets</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">Q访?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" > <span style="COLOR: rgb(128,0,128); LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">https://www.osgeo.org/cgi-bin/ldap_create_user.py</span> </a> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'"> <span id="wmqeeuq" class="Apple-converted-space"> </span> </span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">可以注册一?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">OSGeo</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的用戗?/span> </span> </p> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px"> <span lang="EN-US" style="LINE-HEIGHT: 21px"> <span style="LINE-HEIGHT: 21px"> <span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px">1Q?/span> <span style="FONT: 7pt 'Times New Roman'"> <span id="wmqeeuq" class="Apple-converted-space"> </span></span> </span> </span> </span> <span style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px">~陷修正</span> </span> </p> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">如果你在使用</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的过E中发现了一?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Bug</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">Q那么可以考虑创徏一?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Ticket</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">。在创徏</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Ticket</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">之前Q最好访?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" > <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">http://trac.osgeo.org/mapguide/search</span> </a> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">查找是否已经有其他h提交q类似的</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Ticket</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">Q或者给</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">mapguide-users</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">邮g列表?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">email</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">问询是否见到q类似问题。在Z?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Bug</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">创徏</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Ticket</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">之时Q需要提供一个完整的、可以重?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Bug</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的步骤,如果可能的话最好提供一D代码用于重?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Bug</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">Q最后填?/span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">?/span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'"> <span lang="EN-US" style="LINE-HEIGHT: 19px">18</span> <span lang="EN-US" style="LINE-HEIGHT: 19px">?span style="LINE-HEIGHT: 19px">3</span></span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">所C的</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Ticket</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">属性。其中,</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Priority</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">代表</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Bug</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的优先Q?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Component</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">代表</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Bug</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">所属的功能lgQ?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Severity</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">代表</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Bug</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的严重性,</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Milestone</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">代表修正?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Bug</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的版本,</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Version</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">代表可以重现</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Bug</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的版本。最重要的是要填写正的</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Version</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">|如果不清楚需要ؓ(f)其他属性填写什么样的|那么可以其他g留ؓ(f)I,在其他h(g)阅和分配q个</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Bug</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">时会(x)些属性填写合适的倹{?/span> </span> </p> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span lang="EN-US" style="LINE-HEIGHT: 21px"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'"> <img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="174" alt="Ticket" src="http://p.blog.csdn.net/images/p_blog_csdn_net/MapGuide_Inside/EntryImages/20091104/Ticket.JPG" width="723" /></span> </span> </p> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> </p> <p class="MsoCaption" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px"> <a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="_Ref244862339"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">?span class="Apple-converted-space"> </span></span> </a> <span style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px"> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px">18</span> </span> </span> <span style="LINE-HEIGHT: 19px"> <span lang="EN-US" style="LINE-HEIGHT: 19px">?/span> </span> <span style="LINE-HEIGHT: 19px"> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px">3</span> </span> </span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span id="wmqeeuq" class="Apple-converted-space"> </span>Ticket</span>的属?/span> </span> </p> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px"> <span lang="EN-US" style="LINE-HEIGHT: 21px"> <span style="LINE-HEIGHT: 21px"> <span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px">2Q?/span> <span style="FONT: 7pt 'Times New Roman'"> <span id="wmqeeuq" class="Apple-converted-space"> </span></span> </span> </span> </span> <span style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px">功能增强</span> </span> </p> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">如果要改q?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">现有的功能,或者添加一些新的功能,那么需要创Z?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">。访?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" > <span style="COLOR: rgb(128,0,128); LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">http://trac.osgeo.org/mapguide/wiki/MapGuideRfcs</span> </a> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">可以览现有?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">Q通过q些</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">我们可以了解</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的每个版本添加了哪些功能Q甚至下一个版本会(x)d哪些新的功能?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">面使用</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Wiki</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的方式进行维护,使用如下的步骤可以创Z个新?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">?/span> </span> </p> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span lang="EN-US" style="LINE-HEIGHT: 21px"> <span style="LINE-HEIGHT: 21px"> <span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px">1Q?/span> <span style="FONT: 7pt 'Times New Roman'"> <span id="wmqeeuq" class="Apple-converted-space"> </span></span> </span> </span> </span> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">点击?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">login</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">”登录?/span> </span> </p> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span lang="EN-US" style="LINE-HEIGHT: 21px"> <span style="LINE-HEIGHT: 21px"> <span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px">2Q?/span> <span style="FONT: 7pt 'Times New Roman'"> <span id="wmqeeuq" class="Apple-converted-space"> </span></span> </span> </span> </span> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">点击?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Edit this page</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">”编?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">列表面?/span> </span> </p> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span lang="EN-US" style="LINE-HEIGHT: 21px"> <span style="LINE-HEIGHT: 21px"> <span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px">3Q?/span> <span style="FONT: 7pt 'Times New Roman'"> <span id="wmqeeuq" class="Apple-converted-space"> </span></span> </span> </span> </span> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">加入如下</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Wiki</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">格式的字W串。其中,?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">XX</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">”代?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的序P?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">V.V</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">”代表实?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">版本受?/span> </span> </p> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span lang="EN-US" style="LINE-HEIGHT: 21px"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">||[wiki:MapGuideRfcXX MapGuide RFC XX - xxxxxxxxxxxx]||draft||V.V||</span> </span> </p> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span lang="EN-US" style="LINE-HEIGHT: 21px"> <span style="LINE-HEIGHT: 21px"> <span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px">4Q?/span> <span style="FONT: 7pt 'Times New Roman'"> <span id="wmqeeuq" class="Apple-converted-space"> </span></span> </span> </span> </span> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">点击?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Submit changes</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">”按钮提交修攏V?/span> </span> </p> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span lang="EN-US" style="LINE-HEIGHT: 21px"> <span style="LINE-HEIGHT: 21px"> <span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px">5Q?/span> <span style="FONT: 7pt 'Times New Roman'"> <span id="wmqeeuq" class="Apple-converted-space"> </span></span> </span> </span> </span> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">点击链接?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide RFC XX</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">”会(x)出现一个新的页面用于创建新?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">?/span> </span> </p> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span lang="EN-US" style="LINE-HEIGHT: 21px"> <span style="LINE-HEIGHT: 21px"> <span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px">6Q?/span> <span style="FONT: 7pt 'Times New Roman'"> <span id="wmqeeuq" class="Apple-converted-space"> </span></span> </span> </span> </span> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">在按?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">模板的格式创建完成新?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">之后Q发</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">email</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">l?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">邮g列表</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="mailto:mapguide-internals@lists.osgeo.org"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">mapguide-internals@lists.osgeo.org</span> </a> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">要求</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">开源社区的Z评阅?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">?/span> </span> </p> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span lang="EN-US" style="LINE-HEIGHT: 21px"> <span style="LINE-HEIGHT: 21px"> <span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px">7Q?/span> <span style="FONT: 7pt 'Times New Roman'"> <span id="wmqeeuq" class="Apple-converted-space"> </span></span> </span> </span> </span> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">发布一周后Qƈ且解{了</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">开源社Zh们的所有问题之后,可以要求</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">PSC</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的成员对?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">投票。如果由多于两个</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">PSC</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">成员同意?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">Q没有Q?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">PSC</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">成员反对?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">Q那么此</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">投通过可以实现了?/span> </span> </p> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span lang="EN-US" style="LINE-HEIGHT: 21px"> <span style="LINE-HEIGHT: 21px"> <span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px">8Q?/span> <span style="FONT: 7pt 'Times New Roman'"> <span id="wmqeeuq" class="Apple-converted-space"> </span></span> </span> </span> </span> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">创徏一个类型ؓ(f)?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">enhancement</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">”的</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Ticket</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">用于跟踪q个修改?/span> </span> </p> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">在修正了一个缺h实现了一?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">之后Q需要将相应的代码修改创Zؓ(f)一?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">SVN Patch</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">文gQ将其上传到相应?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Ticket</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">上便于开源社区的Z评阅此修改,在评阅完成之后就可以提交代码了。如果你不是目开?/span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">人员Q没有提交权限,</span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">目开?/span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">人员?x)帮助你提交代码的?/span> </span> </p> </span> </span> <img src ="http://www.aygfsteel.com/gdws/aggbug/348328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/gdws/" target="_blank">帅子</a> 2011-04-15 00:23 <a href="http://www.aygfsteel.com/gdws/articles/348328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MapGuide开源版的管理组l?/title><link>http://www.aygfsteel.com/gdws/articles/348327.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Thu, 14 Apr 2011 16:22:00 GMT</pubDate><guid>http://www.aygfsteel.com/gdws/articles/348327.html</guid><wfw:comment>http://www.aygfsteel.com/gdws/comments/348327.html</wfw:comment><comments>http://www.aygfsteel.com/gdws/articles/348327.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/gdws/comments/commentRss/348327.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/gdws/services/trackbacks/348327.html</trackback:ping><description><![CDATA[ <span id="wmqeeuq" class="Apple-style-span" style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"> <span id="wmqeeuq" class="Apple-style-span" style="FONT-SIZE: 14px; LINE-HEIGHT: 21px; FONT-FAMILY: verdana, sans-serif; TEXT-ALIGN: left"> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">作ؓ(f)</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">OSGeo</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的一个子目Q?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">遵守与其?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">OSGeo</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">目的类似的理方式Q由如下四类l织和角色进行项目的开发和理?/span> </span> </p> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px"> <span lang="EN-US" style="LINE-HEIGHT: 21px"> <span style="LINE-HEIGHT: 21px"> <span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px">1Q?/span> <span style="FONT: 7pt 'Times New Roman'"> <span id="wmqeeuq" class="Apple-converted-space"> </span></span> </span> </span> </span> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">目{划指导委员</span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">?span lang="EN-US" style="LINE-HEIGHT: 19px">(Project Steering Committee)</span></span> </span> </p> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">目{划指导委员?x)简UCؓ(f)</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">PSC</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">Q负?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">开源项目的理工作Q决?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">开源版的发布日期、哪些功能和~陷修正整合到那个发布版本、那些h可以成ؓ(f)目开发h员等Q而且</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">PSC</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">q负责定期ؓ(f)</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">OSGeo</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">委员?x)提供项目状冉|告?/span> </span> </p> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px"> <span lang="EN-US" style="LINE-HEIGHT: 21px"> <span style="LINE-HEIGHT: 21px"> <span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px">2Q?/span> <span style="FONT: 7pt 'Times New Roman'"> <span id="wmqeeuq" class="Apple-converted-space"> </span></span> </span> </span> </span> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">目开?/span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">人员<span lang="EN-US" style="LINE-HEIGHT: 19px">(Project Developer)</span></span> </span> </p> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">目开发h员具?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">源代码的d权限Q能够直接修?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的源代码Qƈ且负责检阅项目捐助h员的代码Q帮助他们提交代码?/span> </span> </p> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px"> <span lang="EN-US" style="LINE-HEIGHT: 21px"> <span style="LINE-HEIGHT: 21px"> <span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px">3Q?/span> <span style="FONT: 7pt 'Times New Roman'"> <span id="wmqeeuq" class="Apple-converted-space"> </span></span> </span> </span> </span> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">目捐助</span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">人员<span lang="EN-US" style="LINE-HEIGHT: 19px">(Project Contributor)</span></span> </span> </p> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">目捐助人员也是</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的开发h员,但是没有</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">源代码的修改权限Q他们通过目跟踪</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">(Tracker)</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">工具?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">贡献补丁</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">(Patch)</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">、代码、文档等Q项目开发h员会(x)(g)阅他们的修改Q和他们q行交流Q最后帮助他们提交代码。通常情况下,目开发h员是从项目捐助h员着手做P在项目捐助h员A(ch)献了大量有h(hun)值的补丁</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">(Patch)</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">之后Q他?x)被提名为项目开发h员,?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">PSC</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">投票同意之后Q他׃(x)正式成ؓ(f)目开发h员,h?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">代码的修Ҏ(gu)限?/span> </span> </p> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px"> <span lang="EN-US" style="LINE-HEIGHT: 21px"> <span style="LINE-HEIGHT: 21px"> <span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px">4Q?/span> <span style="FONT: 7pt 'Times New Roman'"> <span id="wmqeeuq" class="Apple-converted-space"> </span></span> </span> </span> </span> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">?/span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">?span lang="EN-US" style="LINE-HEIGHT: 19px">(Users)</span></span> </span> </p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> <span style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">    用户?/span> <span lang="EN-US" style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman', serif">MapGuide</span> <span style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">的用者,他们Z</span> <span lang="EN-US" style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman', serif">MapGuide</span> <span style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">q行二次开发?/span> </p> </span> </span> <img src ="http://www.aygfsteel.com/gdws/aggbug/348327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/gdws/" target="_blank">帅子</a> 2011-04-15 00:22 <a href="http://www.aygfsteel.com/gdws/articles/348327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> ~译MapGuidehttp://www.aygfsteel.com/gdws/articles/348326.html帅子帅子Thu, 14 Apr 2011 16:21:00 GMThttp://www.aygfsteel.com/gdws/articles/348326.htmlhttp://www.aygfsteel.com/gdws/comments/348326.htmlhttp://www.aygfsteel.com/gdws/articles/348326.html#Feedback0http://www.aygfsteel.com/gdws/comments/commentRss/348326.htmlhttp://www.aygfsteel.com/gdws/services/trackbacks/348326.html

如果惌q?span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide的源代码和运?span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuideQ那么请参?span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide开源版的文?span lang="EN-US" style="LINE-HEIGHT: 19px"> (http://mapguide.osgeo.org/documentation.html)Q各个版?span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide的编译步骤基本相同,但是l节却不相同,所以要扑ֈ使用的源代码所对应的文档,严格按照文档中描q的步骤~译MapGuide?/span>

因ؓ(f)MapGuide服务器和Web扩展是两个独立的lgQ所以它们也是独立编译的。编?span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide服务器组件的基本步骤如下Q?/span>

1Q?/span>   ~译FDO

MapGuide 使用?span lang="EN-US" style="LINE-HEIGHT: 19px">FDO来访?span lang="EN-US" style="LINE-HEIGHT: 19px">GIS数据Q但?span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide的源代码中ƈ没有包含FDO的源代码Q所以需要开发h员自׃?span lang="EN-US" style="LINE-HEIGHT: 19px">FDO的源代码和编?span lang="EN-US" style="LINE-HEIGHT: 19px">FDO?/span>

2Q?/span>   讄环境变量

需要注意的是不同版本的MapGuide源代码需要设|不同的环境变量Q所以要注意参考对应版本的文档?/span>

3Q?/span>   ~译CS-MAP

?span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide开源版2.1之后Q?span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide使用CS-MAP替代?span lang="EN-US" style="LINE-HEIGHT: 19px">PROJ4来处理坐标系。现?span lang="EN-US" style="LINE-HEIGHT: 19px">CS-MAP也是OSGeo的一个开源项目,在?span lang="EN-US" style="LINE-HEIGHT: 19px">SVN下蝲MapGuide源码的时候会(x)自动下蝲CS-MAP的代码,不过需要用L(fng)立编?span lang="EN-US" style="LINE-HEIGHT: 19px">CS-MAP?/span>

4Q?/span>   ~译OEM

OEM MapGuide所依赖的第三方lgQ例?span lang="EN-US" style="LINE-HEIGHT: 19px">ACE?span lang="EN-US" style="LINE-HEIGHT: 19px">SWIG?span lang="EN-US" style="LINE-HEIGHT: 19px">DWF Toolkit?span lang="EN-US" style="LINE-HEIGHT: 19px">FDO?span lang="EN-US" style="LINE-HEIGHT: 19px">Oracle Berkeley DB XML{,MapGuide服务器和Web扩展都依赖于OEMQ所以在~译MapGuide服务器和Web扩展旉需要编?span lang="EN-US" style="LINE-HEIGHT: 19px">OEMQ但是只需要编译一ơ?/span>

?span lang="EN-US" style="LINE-HEIGHT: 19px">Windowsq_上,打开文g?span lang="EN-US" style="LINE-HEIGHT: 19px">\MgDev\Oem\下的Visual Studio Solution文goem.sln可以编?span lang="EN-US" style="LINE-HEIGHT: 19px">OEMlg?/span>

5Q?/span>   ~译MapGuide服务?/span>

q部分代码是MapGuide服务器真正的代码Q在Windowq_上打开文g?span lang="EN-US" style="LINE-HEIGHT: 19px">\MgDev\Server\下的Visual Studio Solution文gServer.sln可以编?span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide服务器?/span>

~译MapGuide Web扩展的步骤如下:(x)

1Q?/span>   安装JDK

MapGuide Web 扩展需要安?span lang="EN-US" style="LINE-HEIGHT: 19px">Java JDK 1.3或更高的版本Q如果没有安?span lang="EN-US" style="LINE-HEIGHT: 19px">JDKQ请讉Khttp://java.sun.com下蝲安装它?/span>

2Q?/span>   讄环境变量

需要注意的是不同版本的MapGuide源代码需要设|不同的环境变量Q所以要注意参考对应版本的文档?/span>

3Q?/span>   ~译OEM

OEM lg只需要编译一ơ,如果在编?span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide服务器时已经~译?span lang="EN-US" style="LINE-HEIGHT: 19px">OEMQ那么无需重新~译?/span>

4Q?/span>   ~译MapGuide Web扩展

q部分代码是MapGuide Web扩展真正的代码,?span lang="EN-US" style="LINE-HEIGHT: 19px">Windowq_上打开文g?span lang="EN-US" style="LINE-HEIGHT: 19px">\MgDev\Web\src下的Visual Studio Solution文gWebTier.sln可以编?span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide Web扩展?/span>



帅子 2011-04-15 00:21 发表评论
]]>
MapGuide源代码结?/title><link>http://www.aygfsteel.com/gdws/articles/348325.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Thu, 14 Apr 2011 16:20:00 GMT</pubDate><guid>http://www.aygfsteel.com/gdws/articles/348325.html</guid><wfw:comment>http://www.aygfsteel.com/gdws/comments/348325.html</wfw:comment><comments>http://www.aygfsteel.com/gdws/articles/348325.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/gdws/comments/commentRss/348325.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/gdws/services/trackbacks/348325.html</trackback:ping><description><![CDATA[ <span id="wmqeeuq" class="Apple-style-span" style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"> <span id="wmqeeuq" class="Apple-style-span" style="FONT-SIZE: 14px; LINE-HEIGHT: 21px; FONT-FAMILY: verdana, sans-serif; TEXT-ALIGN: left"> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">源代码的目录l构?/span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">?/span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'"> <span lang="EN-US" style="LINE-HEIGHT: 19px">18</span> <span lang="EN-US" style="LINE-HEIGHT: 19px">?span style="LINE-HEIGHT: 19px">1</span></span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">?/span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">?/span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'"> <span lang="EN-US" style="LINE-HEIGHT: 19px">18</span> <span lang="EN-US" style="LINE-HEIGHT: 19px">?span style="LINE-HEIGHT: 19px">2</span></span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">所C,在后l的章节中我们将重点介绍</span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Common</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">OEM</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">、服务器?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Web</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">扩展部分的源代码?/span> </span> </p> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span lang="EN-US" style="LINE-HEIGHT: 21px"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'"> </span> </span> </p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> </p> <table class="MsoNormalTable" style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 140.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="187"> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: center" align="center"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <strong> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">文g?/span> </strong> <strong> </strong> </span> </p> </td> <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; WIDTH: 295.85pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="394"> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: center" align="center"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <strong> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">描述</span> </strong> <strong> </strong> </span> </p> </td> </tr> <tr> <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 140.1pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="187"> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span lang="EN-US" style="LINE-HEIGHT: 21px"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Installer</span> </span> </p> </td> <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; WIDTH: 295.85pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="394"> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">安装E序的源代码?/span> </span> </p> </td> </tr> <tr> <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 140.1pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="187"> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Calibri, sans-serif"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px">MgDev</span> </span> </p> </td> <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: rgb(236,233,216); BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; WIDTH: 295.85pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="394"> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span lang="EN-US" style="LINE-HEIGHT: 19px; FONT-FAMILY: Calibri, sans-serif">MapGuide</span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">服务器和</span> <span lang="EN-US" style="LINE-HEIGHT: 19px; FONT-FAMILY: Calibri, sans-serif">Web</span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">扩展的源代码?/span> </span> </p> </td> </tr> <tr> <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 140.1pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="187"> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Calibri, sans-serif"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px"> <span id="wmqeeuq" class="Apple-converted-space"> </span></span>BuildTools</span> </span> </p> </td> <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: rgb(236,233,216); BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; WIDTH: 295.85pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="394"> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Wingdings"> <span style="LINE-HEIGHT: 21px"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px">l</span> <span style="FONT: 7pt 'Times New Roman'"> <span id="wmqeeuq" class="Apple-converted-space"> </span></span> </span> </span> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">~译</span> <span lang="EN-US" style="LINE-HEIGHT: 19px; FONT-FAMILY: Calibri, sans-serif">MapGuide</span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">需要用的一些工兗?/span> </span> </p> </td> </tr> <tr> <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 140.1pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="187"> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Calibri, sans-serif"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px"> <span id="wmqeeuq" class="Apple-converted-space"> </span></span>Common</span> </span> </p> </td> <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: rgb(236,233,216); BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; WIDTH: 295.85pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="394"> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Wingdings"> <span style="LINE-HEIGHT: 21px"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px">l</span> <span style="FONT: 7pt 'Times New Roman'"> <span id="wmqeeuq" class="Apple-converted-space"> </span></span> </span> </span> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span lang="EN-US" style="LINE-HEIGHT: 19px; FONT-FAMILY: Calibri, sans-serif">MapGuide</span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">服务器和</span> <span lang="EN-US" style="LINE-HEIGHT: 19px; FONT-FAMILY: Calibri, sans-serif">Web</span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">扩展共同依赖的一些模块?/span> </span> </p> </td> </tr> <tr> <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 140.1pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="187"> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Calibri, sans-serif"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px"> <span id="wmqeeuq" class="Apple-converted-space"> </span></span>Doc</span> </span> </p> </td> <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: rgb(236,233,216); BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; WIDTH: 295.85pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="394"> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Wingdings"> <span style="LINE-HEIGHT: 21px"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px">l</span> <span style="FONT: 7pt 'Times New Roman'"> <span id="wmqeeuq" class="Apple-converted-space"> </span></span> </span> </span> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span lang="EN-US" style="LINE-HEIGHT: 19px; FONT-FAMILY: Calibri, sans-serif">MapGudie</span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">文档、应用程序示例和生成</span> <span lang="EN-US" style="LINE-HEIGHT: 19px; FONT-FAMILY: Calibri, sans-serif">MapGuide</span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">文档需要用到的工具?/span> </span> </p> </td> </tr> <tr> <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 140.1pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="187"> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Calibri, sans-serif"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px"> <span id="wmqeeuq" class="Apple-converted-space"> </span></span>OEM</span> </span> </p> </td> <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: rgb(236,233,216); BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; WIDTH: 295.85pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="394"> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Wingdings"> <span style="LINE-HEIGHT: 21px"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px">l</span> <span style="FONT: 7pt 'Times New Roman'"> <span id="wmqeeuq" class="Apple-converted-space"> </span></span> </span> </span> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span lang="EN-US" style="LINE-HEIGHT: 19px; FONT-FAMILY: Calibri, sans-serif">MapGuide</span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">所依赖的第三方lg?/span> </span> </p> </td> </tr> <tr> <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 140.1pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="187"> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Calibri, sans-serif"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px"> <span id="wmqeeuq" class="Apple-converted-space"> </span></span>Server</span> </span> </p> </td> <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: rgb(236,233,216); BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; WIDTH: 295.85pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="394"> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Wingdings"> <span style="LINE-HEIGHT: 21px"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px">l</span> <span style="FONT: 7pt 'Times New Roman'"> <span id="wmqeeuq" class="Apple-converted-space"> </span></span> </span> </span> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span lang="EN-US" style="LINE-HEIGHT: 19px; FONT-FAMILY: Calibri, sans-serif">MapGuide</span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">服务器的源代码?/span> </span> </p> </td> </tr> <tr> <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 140.1pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="187"> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Calibri, sans-serif"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px"> <span id="wmqeeuq" class="Apple-converted-space"> </span></span>UnitTest</span> </span> </p> </td> <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: rgb(236,233,216); BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; WIDTH: 295.85pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="394"> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Wingdings"> <span style="LINE-HEIGHT: 21px"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px">l</span> <span style="FONT: 7pt 'Times New Roman'"> <span id="wmqeeuq" class="Apple-converted-space"> </span></span> </span> </span> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span lang="EN-US" style="LINE-HEIGHT: 19px; FONT-FAMILY: Calibri, sans-serif">MapGuide Web</span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">扩展单元试代码?/span> </span> </p> </td> </tr> <tr> <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 140.1pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="187"> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Calibri, sans-serif"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px"> <span id="wmqeeuq" class="Apple-converted-space"> </span></span>Web</span> </span> </p> </td> <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: rgb(236,233,216); BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; WIDTH: 295.85pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="394"> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Wingdings"> <span style="LINE-HEIGHT: 21px"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px">l</span> <span style="FONT: 7pt 'Times New Roman'"> <span id="wmqeeuq" class="Apple-converted-space"> </span></span> </span> </span> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span lang="EN-US" style="LINE-HEIGHT: 19px; FONT-FAMILY: Calibri, sans-serif">MapGuide Web</span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">扩展的源代码?/span> </span> </p> </td> </tr> <tr> <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 140.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="187"> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span lang="EN-US" style="LINE-HEIGHT: 21px"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Tools</span> </span> </p> </td> <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; WIDTH: 295.85pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="394"> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide Maestro</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的源代码Q关?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Maestro</span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">更详l的信息请参?/span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">2.1.3.2.2</span> </span> </span> <span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">?/span> </span> </p> </td> </tr> </tbody> </table> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"> </p> <p class="MsoCaption" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px"> <a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="_Ref244355689"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">?span class="Apple-converted-space"> </span></span> </a> <span style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px"> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px">18</span> </span> </span> <span style="LINE-HEIGHT: 19px"> <span lang="EN-US" style="LINE-HEIGHT: 19px">?/span> </span> <span style="LINE-HEIGHT: 19px"> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span style="LINE-HEIGHT: 19px">1</span> </span> </span> <span lang="EN-US" style="LINE-HEIGHT: 19px"> <span id="wmqeeuq" class="Apple-converted-space"> </span>MapGuide</span>源代码目录结?/span> </span> </p> <p class="MsoCaption" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px"> </p> <p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px"> <span lang="EN-US" style="LINE-HEIGHT: 21px"> <span style="FONT-SIZE: small; LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'"> <img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="487" alt="MapGuide Source Code Structure" src="http://p.blog.csdn.net/images/p_blog_csdn_net/MapGuide_Inside/EntryImages/20091104/MapGuide_Source_Code.JPG" width="631" /></span> </span> </p> </span> </span> <img src ="http://www.aygfsteel.com/gdws/aggbug/348325.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/gdws/" target="_blank">帅子</a> 2011-04-15 00:20 <a href="http://www.aygfsteel.com/gdws/articles/348325.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MapGuide源码分析http://www.aygfsteel.com/gdws/articles/348324.html帅子帅子Thu, 14 Apr 2011 16:20:00 GMThttp://www.aygfsteel.com/gdws/articles/348324.htmlhttp://www.aygfsteel.com/gdws/comments/348324.htmlhttp://www.aygfsteel.com/gdws/articles/348324.html#Feedback0http://www.aygfsteel.com/gdws/comments/commentRss/348324.htmlhttp://www.aygfsteel.com/gdws/services/trackbacks/348324.html

如果要访?/span> MapGuide 的源代码Q需要先安装一?/span> Subversion 的客L(fng)Q通过 Subversion 的网?/span> ( http://subversion.tigris.org/ ) 可以了解到关?/span> Subversion 最的信息。一般情况下Q推荐大家?/span> TortoiseSVN 讉K MapGuide 的源代码Q它?yu)?/span> SVN 客户端和 Windows Shell 很好地整合在一P?/span> TortoiseSVN 的网?/span> ( http://tortoisesvn.tigris.org/ ) 上可以下载到最新版本的 TortoiseSVN ?/span>

Subversion 仓储的位|ؓ(f) http://svn.osgeo.org/mapguide/ Q在 Windows Shell 中点击鼠标右键,选择菜单?/span> SVN Checkout ”将昄?/span> ?/span> 18 ?span style="LINE-HEIGHT: 19px">1 所C的用户界面Q在?/span> Checkout Directory ”中输入代码下蝲位置Q然后点几Z?/span> OK ”按钮就可以下蝲 MapGuide 的源代码。在?/span> Trunk ”目录下包含的是 MapGuide 最新的源代码,在?/span> branches ”目录下包含?/span> MapGuide 从版?/span> 1.0.0 ?/span> 2.1 的所有源代码?/span>

 SVN for MapGuide

 

?span class="Apple-converted-space">  18 ?/span> 1  TortoiseSVN用于Checkout代码的用L(fng)?/span>

 

如果仅仅是希望浏?/span> MapGuide 的源代码Q可以访?/span> http://trac.osgeo.org/mapguide/browser 在浏览器中浏?/span> MapGuide 的源代码?/span>



帅子 2011-04-15 00:20 发表评论
]]>
MapGuide Web APIhttp://www.aygfsteel.com/gdws/articles/348323.html帅子帅子Thu, 14 Apr 2011 16:18:00 GMThttp://www.aygfsteel.com/gdws/articles/348323.htmlhttp://www.aygfsteel.com/gdws/comments/348323.htmlhttp://www.aygfsteel.com/gdws/articles/348323.html#Feedback0http://www.aygfsteel.com/gdws/comments/commentRss/348323.htmlhttp://www.aygfsteel.com/gdws/services/trackbacks/348323.html

许多人都知道MapGuide提供?NET、PHP和Java三种cd的Web APIQ但是不知道MapGuide是如何创三种cd的API的。试想一下,如果分别d三种APIQ这是一个很隄护的工作。每ơ增加或修改一些功能,需要对三种cd的API都进行修攏V所以,MapGuide使用了SWIG来自动生成这三种cd的API。我惌个时候许多h?x)问Q什么是SWIG呢?我怎么从来没有听说q这个东东呢Q其实,我也是在做MapGuide开发的时候才开始了解SWIG的。所以,首先让我们来认识一下SWIGQ然后再来看MapGuide是如何用SWIG来生成API的?/p>

1. SWIG?/strong>

    SWIG是Simple Wrapper and Interface Generator的羃写,是一个帮助用C或者C++~写的Y件创建其他编语言的API的工兗例如,我想要ؓ(f)一个C++~写的程序创?NET APIQ一般情况下我必M用托C++(Managed C++)ȝ写大量的代码才能生成它的.NET API。有了SWIGQ这个机械的工作变得非常简单。你只须要用一个接口文件告诉SWIG要ؓ(f)那些cd?NET APIQSWIG׃(x)自动帮你生成它的.NET API。是不是非常的酷啊?

    当然QSWIG不仅仅支持创?NET API。最新版本的SWIG支持常用脚本语言Perl、PHP、Python、Tcl、Ruby和非脚本语言C#, Common Lisp (CLISP, Allegro CL, CFFI, UFFI), Java, Modula-3, OCAML以及(qing)RQ甚x~译器或者汇~的计划应用QGuile, MzScheme, ChickenQ?/p>

    下面我们通过一个例子来看看SWIG是如何帮我们创徏API的。假设我打算为如下的C++cd建C#和Java的API?/p>

    /* SwigTest.h */

    class CSwigTest {
    public:
        CSwigTest();
        virtual ~CSwigTest();
        int Add(int a, int b) { return a + b; }
        int Substract(int a, int b) { return a - b; }

        int Multiple(int a, int b) { return a * b; }
        float Divide(int a, int b) { return (float)a / (float)b; }
    };

1.1 接口文g

    首先Q你需要写一个接口文?Interface File)Q告诉SWIG要ؓ(f)那些cȝ那些Ҏ(gu)创徏API。如下的接口文g只ؓ(f)cCSwigTest的方法Add(...)和Subtract(...)生成APIQ因为在接口文g的接口声明部分只声明了两个方法?/p>

    /* SwigTest.i */
    %module SwigTest
    %{
    #include "SwigTest.h"
    %}

    /* --- 接口声明部分 ---*/
    class CSwigTest {
    public:
        int Add(int a, int b);

        int Substract(int a, int b);

    };

    注解Q?module标记用于定义SWIG生成的模块的名称Q?{%}标记中的内容?x)被一字不差地插入SWIG自动生成的文件xxx_wrapper.c中,其中xxx代表?module指定的模块名U。这个文件会(x)在下面介l,不必着急去理解它究竟有什么作用?/p>

    如果打算为类中所有方法创建APIQ那么有一个非常简单的办法Q在接口文g的类声明部分使用%include标记。SWIG对%include所指定的文件进行语法分析,cM所有公有方?Public Method)都将在API中暴霌Ӏ?/p>

    /* SwigTest.i */
    %module SwigTest
    %{
    #include "SwigTest.h"
    %}
    #include “SwigTest.h”?/p>

1.2 ~译模块

    有了接口文g之后Q剩下的事就是执行几条命令。下面我们以Windowsq_上生?NET APIZ介绍q些命o(h)?/p>

    (a) 调用SWIG自动生成代码

    swig -csharp  SwigTest.i

    执行上面的命令会(x)产生一个C语言文gSwigTest_wrapper.c和多个C#文g。在文gSwigTest_wrapper.c中,SWIG为接口文件中接口声明部分指定的每个方法生一个全局Ҏ(gu)Q以便C#使用Pinvoke调用q些函数。而那些C#文g是用来生成.NET API的?/p>

    (b) 为C++代码生成DLL(动态链接库)

    cl SwigTest_wrapper.c *.cpp

    link *.obj /out:SwigTest.dll

    执行上面的命令,?x)?f)我们~写C(j)++代码生成DLL。在~译C++文gӞ一定要包括SWIG为我们生成的C++文gSwigTest_wrapper.cpp?/p>

    注意Qؓ(f)了让大家便于理解上述命o(h)Q这些命令ƈ没有列出完整的编译和链接选项?/p>

    (C) 生成.NET模块

    csc /out:SwigTestNotNetAPI.dll /target:library *.cs

    执行上面的命令就生成?NET API模块SwigTestNotNetAPI.dll。如果用h使用q些APIQ只需要添加对SwigTestNotNetAPI.dll的引?Reference)可以了?/p>

    生成其它语言cdAPI的命令基本类|下面我们再以Java在Unixq_下的命o(h)Zl束对SWIG的介l。事实上QSWIG也是一个开源项目。如果想了解更多关于SWIG的信息,大家可以登陆SWIG的官方网?a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" >www.swig.orgQ那里有SWIG最详细的资料?br />    $ swig -java SwigTest_wrapper.i
    $ gcc -c *.cpp SwigTest_wrapper.c -I/c/jdk1.3.1/include -I/c/jdk1.3.1/include/win32
    $ gcc -shared *.o -mno-cygwin -Wl,--add-stdcall-alias  -o SwigTest.dll

2. SWIG在MapGuide中的应用

    我们在前面已l提到过QMapGuide使用了SWIG来自动生?NET、Java和PHPq三U类型的API。但是,SWIG也有不少限制和缺P所以MapGuide对SWIG源代码进行了大量的修改,以满q要求。下面,我们看看q些改进?/p>

2.1 IMake工具

    SWIG要求开发h员编写一个接口文Ӟ那么能否让接口文件自动生成呢Q借用一句中国移动的q告词,我能Q虽然SWIG没有提供q方面的工具Q但是我们可以自己开发吗QIMake(Interface Maker)是Z满q样的要求而开发一个工Pl定一个XML文gQ它能帮你自动生成SWIG接口文g。登录MapGuide开源版的代码浏览页?http://trac.osgeo.org/mapguide/browser)Q在root/trunk/MgDev/BuildTools/WebTools/IMake文g夹下可以扑ֈIMake的源代码?/p>

     下面我们以MapGuide中用的XML文g/trunk/MgDev/Web/src/MapGuideApi/MapGuideApiGen.xmlZQ介l一下IMake的用法。ؓ(f)了便于理解,在此我删掉了文g中的部分内容?/p>

    <?xml version="1.0" encoding="UTF-8"?>
    <Parameters>
      <!-- 对应?Module标记. -->
      <Module name="MapGuideApi" />

      <!-- 生成的接口文件的名称. -->
      <Target path="./MapGuideApi.i" />

      <!-- 对应?{%}标记 -->
      <CppInline>
        #include &lt;string&gt;
        #include &lt;map&gt;
        #include "MapGuideCommon.h"
        #include "WebApp.h"
        ......
      </CppInline>

      <!-- 用于替换接口中用的部分cd -->
      <TypeReplacements>
        <TypeReplacement oldtype="CREFSTRING" newtype="STRINGPARAM" />
        <TypeReplacement oldtype="INT64" newtype="long long" />
      </TypeReplacements>

      <!-- 此部分的内容d?{%}之后Q接口声明部分之?-->
      <SwigInline>
        %include "language.i"   //typemaps specific for each language
        ......
      </SwigInline>
      
      <!-- 为指定的C++文g生成接口声明 -->
      <Headers>
        <Header path="../../../Common/Foundation/Data/Property.h" />
        ......
      </Headers>
    </Parameters>

    执行命o(h)“IMake MapGuideApiGen.xml”,IMake帮我们自动生成了如下SWIG接口文gMapGuideApi.i?/p>

    /* MapGuideApi.i */
    %module MapGuideApi 
    %{
        #include <string>;
        #include <map>;
        #include "MapGuideCommon.h"
        #include "WebApp.h"
        ......
    %}
 
    %include "language.i"   //typemaps specific for each language
    ......

    class MgProperty: public MgNamedSerializable
    {
    public:
        virtual INT16 GetPropertyType();
        STRING GetName();
        void SetName(CREFSTRING name);
    };

    ......

    如果打开文gProper.hQ我们可以看到MgProperty有更多的Ҏ(gu)Q例如CanSetName(...)。ؓ(f)什么只有三个方法添加到了SWIG接口文g中?IMake在生成接口文件时Q它?x)查找C++头文件中的宏PUBLISHED_API。只有被PUBLISHED_API修饰的方法,才会(x)d到接口文件中?/p>

    注:(x)宏PUBLISHED_API和INTERNAL_API的定义如下?/p>

    #define PUBLISHED_API public

    #define INTERNAL_API public

    class MG_FOUNDATION_API MgProperty : public MgNamedSerializable 
    { 
    PUBLISHED_API:

        virtual INT16 GetPropertyType() = 0;  /// __get   
        STRING GetName();  /// __get, __set 
        void SetName(CREFSTRING name); 
  
    INTERNAL_API: 
        virtual bool CanSetName(); 
  
    protected:  
        INT32 GetClassId(); 
        MgProperty(); 
        virtual ~MgProperty(); 
        virtual void Dispose();   
        virtual void ToXml(string &str, bool includeType = true, string rootElmName = "Property") = 0; 
  
    private: 
        friend class MgPropertyCollection; 
        STRING m_propertyName; 
 
    CLASS_ID: 
        static const INT32 m_cls_id = Foundation_Property_Property; 
    };     
    l定一个C++帔R定义文gQIMakeq可以自动生成对应的其他语言的常量定义文件。MapGuide .NET Web API中的所有常量都是用IMake来生成的Q例如MgMineType、MgPropertyType{。下面我们以MapGuide中用的XML文g/trunk/MgDev/Web/src/MapGuideApi/Constants.xmlZQ介l如何自动生成各U语a的常量定义文件。同PZ便于理解Q在此我删掉了文件中的部分内宏V与MapGuideApiGen.xml不同QConstants.xml包含一个新的元素Classes用来指出需要在目标语言中生对应的帔RcȝC++cR?br />    <?xml version="1.0" encoding="UTF-8"?>

    <Parameters>

    <!-- 用于替换cd -->

    <PHPTypeReplacements> 
        <TypeReplacement oldtype="STRING" newtype="" />
        <TypeReplacement oldtype="INT16" newtype="" />
        ......
    </PHPTypeReplacements>
    <CSharpTypeReplacements>
        <TypeReplacement oldtype="STRING" newtype="string" />
        <TypeReplacement oldtype="INT16" newtype="short" />
        ......
    </CSharpTypeReplacements>
    <JavaTypeReplacements>
        <TypeReplacement oldtype="STRING" newtype="String" />
        <TypeReplacement oldtype="INT16" newtype="short" />
        ......
    </JavaTypeReplacements>

    <Namespace>OSGeo.MapGuide</Namespace>
    <Package>org.osgeo.mapguide</Package>

    <!-- 用于指出需要在目标语言中生对应的帔RcȝC++c?-->

    <Classes>
        <Class name="MgMineType" />
        <Class name="MgPropertyType" />
        ......
    </Classes>

    <Headers>
        <Header path="../../../Common/Foundation/Data/MimeType.h" />
        <Header path="../../../Common/Foundation/Data/PropertyType.h" />
        ......
    </Headers>

    </Parameters>

    执行命o(h)“IMake.exe Constants.xml C# Constants.cs”,IMake帮我们自动生成了一个C#帔R文gConstants.cs。对于文?trunk/MgDev/Common/Foundation/Data/PropertyType.h中定义了如下帔RQ?/p>

    class MgPropertyType 
    { 
    PUBLISHED_API:  
       static const int Null     =  0;
       static const int Boolean  =  1; 
       static const int Byte     =  2; 
       static const int DateTime =  3;
       static const int Single   =  4; 
       ......
    };

    在生成的Constants.cs文g中,有如下的cd义?br />    class MgPropertyType 
    { 
       static const int Null     =  0;
       static const int Boolean  =  1; 
       static const int Byte     =  2; 
       static const int DateTime =  3;
       static const int Single   =  4; 
       ......
    };

    q个文g可以被C#的编译器直接~译Q所以MapGuide没有使用SWIG生成帔R的APIQ而是直接使用IMake。 如果想生成PHP或Java的常量定义文Ӟ只需要将IMake命o(h)的参?C#"替换?PHP"?Jave"可以了?/p>

2.2 MapGuide对SWIG的修?/strong>
    在MapGuide开始用SWIG的时候,可用的SWIG的最高版本是1.3.21Q从那以后MapGuide在没有升U过SWIG。所以,到现在ؓ(f)止,MapGuide的SWIG版本仍然?.3.21。这个版本的SWIG有不限制和~陷Q?/p>

  • 无法创徏Z自定义根异常cMgException的异常处理机制?/li>
  • 无法创徏属?Property)?/li>
  • Ҏ(gu)些方法无法生正的API。例如,如果Ҏ(gu)GetA(...)q回的是cA的子cB的实例,SWIG创徏的APIq回的仍然是Acȝ实例。此时如果你把返回D{换ؓ(f)cBQ那么{换会(x)p|?br />    A* GetA();
  • ......

    事实上最新的SWIG版本也没有全部解册些问题,所以MapGuide对SWIG源代码进行了大量的修改,以满q要求。看看MapGuide在用SWIG命o(h)是传入的参数Q我们可以发现有许多参数不是SWIG标准的参敎ͼ例如proxydir、clsidcode、clsiddata、catchallcode{?/p>


swig -c++ -csharp -dllname MapGuideUnmanagedApid -namespace OSGeo.MapGuide -proxydir .\custom -baseexception MgException -clsidcode getclassid.code -clsiddata m_cls_id -catchallcode catchall.code -dispose &quot;((MgDisposable*)arg1)-&gt;Release()&quot; -rethrow &quot;e-&gt;Raise();&quot; -nodefault -noconstants -module MapGuideApi -o MgApi_wrap.cpp -lib ..\..\..\Oem\SWIGEx\Lib MapGuideApi.i


    在此Q我们不打算一一介绍q些参数Q因为在多数情况下你没有必要对了解参数的含义。我们只介绍MapGuide是如何来解决上述SWIG的第二和W三个问题的Q因为在扩展MapGuide Web API的时候你可能?x)用得着?/p>


2.2.1 创徏属?/strong>
    如果你看qMapGuide源代码的话,你会(x)发现有许多方法声明之后有“__get”、“__set”或“__get, __set”这L(fng)注释Q如cMgProperty中的Ҏ(gu)?br />    class MgProperty : public MgNamedSerializable 
    { 
    PUBLISHED_API: 
        virtual INT16 GetPropertyType() = 0;  /// __get   
        STRING GetName();  /// __get, __set 
        void SetName(CREFSTRING name); 
        ......
};
    q些注释是有Ҏ(gu)含义的,它们是用来解决上述SWIG的第二个问题的。当IMake工具扫描C++头文件时发现q注释后Q会(x)在目录?\custom”下为每个类产生一个帮助创建属性的代码文g。例如,如果要类MgProperty生成.NET APIQIMake?x)在?\custom”生成一个文件名为MgProperty的C#代码文gQ它的内容如下:(x)
    public int PropertyType {
        get {return GetPropertyType(); }
    }
    public int Name {
        get { return GetPropertyType(); }
        set { setName(value);}
    }
    如果在SWIG的命令行中用了参数proxydirQ那么SWIG在ؓ(f)每个cȝ成代码的时候,?x)在proxydir所指定的目录下查找和类名相同的文gQƈ且将q个文g中的代码插入cȝ目标代码中。通过q种办法Q就解决了上qSWIG的第二个问题?/p>

2.2.2 ClassId
    MapGuide Web API中的所有类都是从MgObjectl承而来的,在类MgObject中有一个方法GetClassId()用来q回每个cd一的ID倹{MapGuide是用这个方法来解决上述SWIG的第三个问题的,所以如果要在MapGuide Web API中增加一个新c,一定要覆盖(override)q个Ҏ(gu)Qƈ且提供一个唯一的ID倹{?br />    class MgObject
    {
    EXTERNAL_API:
        virtual INT32 GetClassId();
        virtual STRING GetClassName();
    INTERNAL_API:
        virtual ~MgObject();
        bool IsOfClass(INT32 classId);
    };

3. 扩展MapGudie Web API

    如果你发现现有的MapGuide Web API无法满你的要求Q没有关p,你可以去试扩展它,因ؓ(f)MapGuide是开源的?/p>

    如果要新ȝQ基本步骤如下:(x)
    (a) 修改C++代码Q添加新的类。对于需要暴露于API的方法,使用宏PUBLISHED_API修饰?br />    (b) 修改XML文g/trunk/MgDev/Web/src/MapGuideApi/MapGuideApiGen.xml的Headers部分Qؓ(f)每个新添加类所在的C++头文件增加一个Header元素。下面的CZ中,"path"代表C++头文件的路径Q?filename.h"代表文g的名U?br />    <Headers>
        <Header path="path/filename.h" />
        ......
    </Headers>
    (c) 重新~译MapGuide的Web模块(/trunk/MgDev/Web/src/)?br /> 
    如果要增加一些新的方法到现有的类中,基本步骤如下Q?br />    (a) 修改C++代码Q添加新的方法,q且使用宏PUBLISHED_API修饰q些Ҏ(gu)?br />    (b) 重新~译MapGuide的Web模块(/trunk/MgDev/Web/src/)?/p>

    如果要新增常量类Q基本步骤如下:(x)
    (a) 修改C++代码Q添加新的常量类?br />    (b) 修改XML文g/trunk/MgDev/Web/src/MapGuideApi/Constants.xmlQ在Classes部分为每个新d帔Rcd加一个Class元素Q在Headers部分为每个新d帔RcL在的C++头文件增加一个Header元素。下面的CZ中,"ClassName"代表新添加的C++帔Rcȝ名称?/p>

    <Classes>
        <Class name="ClassName" />
        ......
    </Classes>
    <Headers>
        <Header path="path/filename.h" />
        ......
    </Headers>    
    (c) 重新~译MapGuide的Web模块(/trunk/MgDev/Web/src/)?/p>

帅子 2011-04-15 00:18 发表评论
]]>
վ֩ģ壺 | | | Ұ| | | ˷| Ǹ| | | | | ¡| ν| | ͨ| | | | | | ƽ| ɽ| | | | ƽ| ƽ| ̴| ƶ| | п| Ͽ| ˮ| | Ϫ| | | ױ| ʡ| |