﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-tommy-随笔分类-development idea</title><link>http://www.cppblog.com/tommy/category/16966.html</link><description>It's hard to tell the world we live in is either a reality or a dream</description><language>zh-cn</language><lastBuildDate>Sun, 25 Jan 2015 01:00:14 GMT</lastBuildDate><pubDate>Sun, 25 Jan 2015 01:00:14 GMT</pubDate><ttl>60</ttl><item><title>使用 Poco 对 Mixpanel 发出的数据报告程序</title><link>http://www.cppblog.com/tommy/archive/2015/01/24/209631.html</link><dc:creator>Tommy Liang</dc:creator><author>Tommy Liang</author><pubDate>Sat, 24 Jan 2015 14:48:00 GMT</pubDate><guid>http://www.cppblog.com/tommy/archive/2015/01/24/209631.html</guid><wfw:comment>http://www.cppblog.com/tommy/comments/209631.html</wfw:comment><comments>http://www.cppblog.com/tommy/archive/2015/01/24/209631.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tommy/comments/commentRss/209631.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tommy/services/trackbacks/209631.html</trackback:ping><description><![CDATA[StatService.h<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->#pragma&nbsp;once<br />
<br />
<span style="color: #0000FF; ">class</span>&nbsp;StatService&nbsp;{<br />
<span style="color: #0000FF; ">public</span>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;StatService();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;trackPageView(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;&amp;page);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;trackEvent(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;&amp;eventName,&nbsp;map&lt;<span style="color: #0000FF; ">string</span>,&nbsp;<span style="color: #0000FF; ">string</span>&gt;&nbsp;&amp;props);&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
<span style="color: #0000FF; ">private</span>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;getUrl(<span style="color: #0000FF; ">string</span>&nbsp;url);<br />
};</div>
<br />StatService.cpp<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;"StatService.h"<br />#include&nbsp;"GlobalConfig.h"<br />#include&nbsp;&lt;Poco/Net/HTTPClientSession.h&gt;<br />#include&nbsp;&lt;Poco/Net/NetworkInterface.h&gt;<br />#include&nbsp;&lt;Poco/Net/HTTPRequest.h&gt;<br />#include&nbsp;&lt;Poco/Net/HTTPResponse.h&gt;<br />#include&nbsp;&lt;Poco/StreamCopier.h&gt;<br />#include&nbsp;&lt;Poco/Path.h&gt;<br />#include&nbsp;&lt;Poco/URI.h&gt;<br />#include&nbsp;&lt;Poco/Exception.h&gt;&nbsp;<br />#include&nbsp;&lt;Poco/Base64Encoder.h&gt;<br /><br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;Poco::Net;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;Poco;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><br />StatService::StatService()&nbsp;{<br />}<br /><br /><span style="color: #0000FF; ">string</span>&nbsp;GetIP()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;NetworkInterface::NetworkInterfaceList&nbsp;list&nbsp;=&nbsp;NetworkInterface::list();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(NetworkInterface::NetworkInterfaceList::iterator&nbsp;i&nbsp;=&nbsp;list.begin();&nbsp;i&nbsp;!=&nbsp;list.end();&nbsp;++i)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NetworkInterface&nbsp;nt&nbsp;=&nbsp;*i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IPAddress&nbsp;addr&nbsp;=&nbsp;nt.address();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!addr.isLoopback())&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;addr.toString();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;"";<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;StatService::trackPageView(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;&amp;page)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;GlobalConfig&nbsp;*gConfig&nbsp;=&nbsp;GlobalConfig::GetInstance();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;eventName&nbsp;=&nbsp;"VisitPage";<br />&nbsp;&nbsp;&nbsp;&nbsp;stringstream&nbsp;ss;<br />&nbsp;&nbsp;&nbsp;&nbsp;ss&nbsp;&lt;&lt;&nbsp;"{"&nbsp;&lt;&lt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\"<span style="color: #0000FF; ">event</span>\":\""&nbsp;&lt;&lt;&nbsp;eventName&nbsp;&lt;&lt;&nbsp;"\","&nbsp;&lt;&lt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\"properties\":&nbsp;{"&nbsp;&lt;&lt;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\"page\":\""&nbsp;&lt;&lt;&nbsp;page&nbsp;&lt;&lt;&nbsp;"\","&nbsp;&lt;&lt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;"distinct_id"&nbsp;and&nbsp;"token"&nbsp;are<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;special&nbsp;properties,&nbsp;described&nbsp;below.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\"distinct_id\":"&nbsp;&lt;&lt;&nbsp;"\""&nbsp;&lt;&lt;&nbsp;GetIP()&nbsp;&lt;&lt;&nbsp;"\","&nbsp;&lt;&lt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\"token\":\""&nbsp;&lt;&lt;&nbsp;gConfig-&gt;stat_token()&nbsp;&lt;&lt;&nbsp;"\"";<br />&nbsp;&nbsp;&nbsp;&nbsp;ss&nbsp;&lt;&lt;&nbsp;"}}";<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">encode</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;std::ostringstream&nbsp;base64Str;<br />&nbsp;&nbsp;&nbsp;&nbsp;Base64Encoder&nbsp;encoder(base64Str);<br />&nbsp;&nbsp;&nbsp;&nbsp;encoder&nbsp;&lt;&lt;&nbsp;ss.str();<br />&nbsp;&nbsp;&nbsp;&nbsp;encoder.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">cout&nbsp;&lt;&lt;&nbsp;base64Str.str()&nbsp;&lt;&lt;&nbsp;endl;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;ss.str()&nbsp;&lt;&lt;&nbsp;endl;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ostringstream&nbsp;url;<br />&nbsp;&nbsp;&nbsp;&nbsp;url&nbsp;&lt;&lt;&nbsp;gConfig-&gt;stat_endpoint()&nbsp;&lt;&lt;&nbsp;"?data="&nbsp;&lt;&lt;&nbsp;base64Str.str();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;sUrl&nbsp;=&nbsp;url.str();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">cout&nbsp;&lt;&lt;&nbsp;sUrl&nbsp;&lt;&lt;&nbsp;endl;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;sUrl.erase(remove_if(sUrl.begin(),&nbsp;sUrl.end(),&nbsp;isspace),&nbsp;sUrl.end());<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">replaceAll(sUrl,&nbsp;"\n",&nbsp;"$");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">kick&nbsp;off</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;getUrl(sUrl);&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /><br /><br /><span style="color: #0000FF; ">void</span>&nbsp;replaceAll(std::<span style="color: #0000FF; ">string</span>&amp;&nbsp;str,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;std::<span style="color: #0000FF; ">string</span>&amp;&nbsp;from,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;std::<span style="color: #0000FF; ">string</span>&amp;&nbsp;to)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(from.empty())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;start_pos&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>((start_pos&nbsp;=&nbsp;str.find(from,&nbsp;start_pos))&nbsp;!=&nbsp;std::<span style="color: #0000FF; ">string</span>::npos)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str.replace(start_pos,&nbsp;from.length(),&nbsp;to);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start_pos&nbsp;+=&nbsp;to.length();&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;In&nbsp;case&nbsp;'to'&nbsp;contains&nbsp;'from',&nbsp;like&nbsp;replacing&nbsp;'x'&nbsp;with&nbsp;'yx'</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><span style="color: #0000FF; ">void</span>&nbsp;StatService::trackEvent(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;&amp;eventName,&nbsp;map&lt;<span style="color: #0000FF; ">string</span>,<span style="color: #0000FF; ">string</span>&gt;&nbsp;&amp;props)&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;GlobalConfig&nbsp;*gConfig&nbsp;=&nbsp;GlobalConfig::GetInstance();<br />&nbsp;&nbsp;&nbsp;&nbsp;stringstream&nbsp;ss;<br />&nbsp;&nbsp;&nbsp;&nbsp;ss&nbsp;&lt;&lt;&nbsp;"{"&nbsp;&lt;&lt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\"<span style="color: #0000FF; ">event</span>\":\""&nbsp;&lt;&lt;&nbsp;eventName&nbsp;&lt;&lt;&nbsp;"\","&nbsp;&lt;&lt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\"properties\":&nbsp;{"&nbsp;&lt;&lt;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;"distinct_id"&nbsp;and&nbsp;"token"&nbsp;are<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;special&nbsp;properties,&nbsp;described&nbsp;below.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\"distinct_id\":"&nbsp;&lt;&lt;&nbsp;"\""&nbsp;&lt;&lt;&nbsp;GetIP()&nbsp;&lt;&lt;&nbsp;"\","&nbsp;&lt;&lt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\"token\":\""&nbsp;&lt;&lt;&nbsp;gConfig-&gt;stat_token()&nbsp;&lt;&lt;&nbsp;"\"";<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">plugin&nbsp;in&nbsp;properties&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(map&lt;<span style="color: #0000FF; ">string</span>,<span style="color: #0000FF; ">string</span>&gt;::const_iterator&nbsp;i&nbsp;=&nbsp;props.cbegin();&nbsp;i&nbsp;!=&nbsp;props.cend();&nbsp;++i)&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ss&nbsp;&lt;&lt;&nbsp;",\""&nbsp;&lt;&lt;&nbsp;i-&gt;first&nbsp;&lt;&lt;&nbsp;"\":\""&nbsp;&lt;&lt;&nbsp;i-&gt;second&nbsp;&lt;&lt;&nbsp;"\"";<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ss&nbsp;&lt;&lt;&nbsp;"}}";<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">encode</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;std::ostringstream&nbsp;base64Str;<br />&nbsp;&nbsp;&nbsp;&nbsp;Base64Encoder&nbsp;encoder(base64Str);<br />&nbsp;&nbsp;&nbsp;&nbsp;encoder&nbsp;&lt;&lt;&nbsp;ss.str();<br />&nbsp;&nbsp;&nbsp;&nbsp;encoder.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">cout&nbsp;&lt;&lt;&nbsp;base64Str.str()&nbsp;&lt;&lt;&nbsp;endl;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;ss.str()&nbsp;&lt;&lt;&nbsp;endl;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ostringstream&nbsp;url;<br />&nbsp;&nbsp;&nbsp;&nbsp;url&nbsp;&lt;&lt;&nbsp;gConfig-&gt;stat_endpoint()&nbsp;&lt;&lt;&nbsp;"?data="&nbsp;&lt;&lt;&nbsp;base64Str.str();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;sUrl&nbsp;=&nbsp;url.str();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">cout&nbsp;&lt;&lt;&nbsp;sUrl&nbsp;&lt;&lt;&nbsp;endl;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;sUrl.erase(remove_if(sUrl.begin(),&nbsp;sUrl.end(),&nbsp;isspace),&nbsp;sUrl.end());<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">replaceAll(sUrl,&nbsp;"\n",&nbsp;"$");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">kick&nbsp;off</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;getUrl(sUrl);<br />}<br /><span style="color: #0000FF; ">void</span>&nbsp;StatService::getUrl(<span style="color: #0000FF; ">string</span>&nbsp;url)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;URI&nbsp;uri(url);<br />&nbsp;&nbsp;&nbsp;&nbsp;HTTPClientSession&nbsp;session(uri.getHost(),&nbsp;uri.getPort());<br />&nbsp;&nbsp;&nbsp;&nbsp;GlobalConfig&nbsp;*&nbsp;gConfig&nbsp;=&nbsp;GlobalConfig::GetInstance();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(gConfig-&gt;proxy().size()&nbsp;&gt;&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.setProxy(gConfig-&gt;proxy(),&nbsp;gConfig-&gt;proxy_port());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;std::<span style="color: #0000FF; ">string</span>&nbsp;path(uri.getPathAndQuery());<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(path.empty())&nbsp;path&nbsp;=&nbsp;"/";<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;"getUrl:path:"&nbsp;&lt;&lt;&nbsp;path&nbsp;&lt;&lt;&nbsp;endl;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;send&nbsp;request</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;HTTPRequest&nbsp;req(HTTPRequest::HTTP_GET,&nbsp;path,&nbsp;HTTPMessage::HTTP_1_1);<br />&nbsp;&nbsp;&nbsp;&nbsp;session.sendRequest(req);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;HTTPResponse&nbsp;res;<br />&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;res.getStatus()&nbsp;&lt;&lt;&nbsp;"&nbsp;"&nbsp;&lt;&lt;&nbsp;res.getReason()&nbsp;&lt;&lt;&nbsp;endl;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;print&nbsp;response</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;istream&nbsp;&amp;<span style="color: #0000FF; ">is</span>&nbsp;=&nbsp;session.receiveResponse(res);<br />&nbsp;&nbsp;&nbsp;&nbsp;StreamCopier::copyStream(<span style="color: #0000FF; ">is</span>,&nbsp;cout);<br />}</div><img src ="http://www.cppblog.com/tommy/aggbug/209631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tommy/" target="_blank">Tommy Liang</a> 2015-01-24 22:48 <a href="http://www.cppblog.com/tommy/archive/2015/01/24/209631.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>about listeners idea</title><link>http://www.cppblog.com/tommy/archive/2011/05/24/147026.html</link><dc:creator>Tommy Liang</dc:creator><author>Tommy Liang</author><pubDate>Tue, 24 May 2011 05:10:00 GMT</pubDate><guid>http://www.cppblog.com/tommy/archive/2011/05/24/147026.html</guid><wfw:comment>http://www.cppblog.com/tommy/comments/147026.html</wfw:comment><comments>http://www.cppblog.com/tommy/archive/2011/05/24/147026.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tommy/comments/commentRss/147026.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tommy/services/trackbacks/147026.html</trackback:ping><description><![CDATA[think about the grid listeners of grid, it's so complicate that it's hard to maintain relationship&nbsp; and status,I think it's necessary to arose an intermediate level to cope with this;<br />perhaps like this:<br /><br />//somewhere in A.hpp ...<br />Grid A("guid_a");<br />//somewhere else in B.hpp<br />Grid B("guid_b");<br />//somewhere else in C.hpp<br />Form c("guid_c");<br /><br />A.AddListener("guid_b");&nbsp;&nbsp; &nbsp;&nbsp; //why use string but not directly object pointer? because perhaps listeners is not yet valid at this runtime, this is just a registeration work<br />A.AddListener("guid_c");<br /><br />//cope with the code when A select a row:<br />GridListenerHandler handler(A);<br />handler.HandleListeners();<br /><br />//how to handle? like follow:<br />Context context = ...;<br />BOOST_FOREACH(shared_ptr&lt;IListener&gt; listener, InnerGetListeners())<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; listener-&gt;Execute(context);<br />}<img src ="http://www.cppblog.com/tommy/aggbug/147026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tommy/" target="_blank">Tommy Liang</a> 2011-05-24 13:10 <a href="http://www.cppblog.com/tommy/archive/2011/05/24/147026.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>