2 #include "nlite_include.h"
9 //
\83\8a\83X
\83i
\81[
\8c\9f\8dõ
\83I
\83u
\83W
\83F
\83N
\83g
14 ListenerPre(ListenerData &in_user):
18 bool operator()(CListenerList::reference listenerData){
21 return (user.user_id == listenerData.user_id) && (user.community == listenerData.community);
28 //
\83\8a\83X
\83i
\81[
\83f
\81[
\83^
29 /////////////////////////////////////////////////////////////////////////////////////////////////
32 ListenerData::ListenerData():
37 //originBkFlag(FALSE),
41 VOID ListenerData::SetBkColor(COLORREF bkColor_in){
47 CChatData::ViewData::ViewData():
48 sellLineColor(INIT_COLOR),
49 stringColor(INIT_COLOR),
50 backColor(INIT_COLOR),
55 VOID CChatData::SetChat(NicoLiveChat &chat_in,ListenerData &listener){
58 this->anonymity = _ttol(chat_in.anonymity);
59 this->premium = _ttol(chat_in.premium);
60 this->chatBuf = chat_in.chatBuf;
61 this->no = _ttol(chat_in.no);
63 if(_tcscmp(chat_in.locale,TEXT("jp")) == 0){
64 this->locale = cuntry::jp;
66 this->locale = cuntry::unknown;
68 this->mail.reserve(chat_in.mailCount);
69 for(UINT_PTR index = 0;index < chat_in.mailCount ;index++){
71 this->mail.push_back(chat_in.mail[index]);
74 this->name = chat_in.name;
78 this->listenerData = &listenerList.Register(listener,FALSE);
81 this->vpos = _ttol(chat_in.vpos);
82 this->thread = _ttol(chat_in.thread);
83 this->date = _ttol(chat_in.date);
93 //
\83R
\83\81\83\93\83g
\83\8a\83X
\83g
\83N
\83\89\83X
94 //////////////////////////////////////////////////////////////////////////
96 //
\91I
\91ð
\8ds
\8eæ
\93¾
\97p
\83t
\83@
\83\93\83N
\83V
\83\87\83i
\83\8b
97 struct GetCurSelFunc_t{
105 BOOL operator() (const CChatData &target){
107 return target.viewData.selectFlag;
112 //
\91}
\93ü
\88Ê
\92u
\8c\9f\8dõ
\83t
\83@
\83\93\83N
\83V
\83\87\83i
\83\8b
113 struct SeartchSetPos_t{
116 SeartchSetPos_t(time_t in_time):time(in_time){}
118 bool operator()(const CChatData &target){
120 return time > target.date;
124 CCommentList::CCommentList(){}
126 CCommentList::~CCommentList(){}
128 CCommentList::iterator CCommentList::GetCurSel(){
129 auto end = this->end();
130 auto ite = this->begin();
132 for(;ite != end && ite->viewData.selectFlag == FALSE;++ite);
138 INT_PTR CCommentList::GetCurSelNo(){
140 auto end = this->end();
141 auto ite = this->begin();
143 for(;ite != end && ite->viewData.selectFlag == FALSE;++ite,++no);
145 return ite != end ? no : -1;
150 CCommentList::iterator CCommentList::OnChatReceve(NicoLiveChat_P chatData_in,LPCTSTR communityID, UINT_PTR commnetCountSum,CCommentListWindow &listWindow){
153 ListenerData listenerData;
154 listenerData.user_id = chatData_in->user_id;
155 listenerData.time = time(NULL);
156 listenerData.community = communityID;
157 chatData.SetChat(*chatData_in,listenerData);
159 if(empty() == TRUE || back().date <= chatData.date){
160 chatList.push_back(chatData);
161 rslt = (--chatList.end());
164 rslt = chatList.insert(std::find_if(chatList.begin(),chatList.end(),SeartchSetPos_t(chatData.date)),chatData);
167 if(shortcut ==chatList.end())shortcut = chatList.begin();
172 CCommentList::iterator CCommentList::GetCurSelItem(){
173 auto rslt = std::find_if(chatList.begin(),chatList.end(),GetCurSelFunc_t());
179 VOID CCommentList::SetCurSel(CCommentList::iterator cursel){
181 auto end = this->end();
182 if(cursel == end)goto end;
184 auto curselItem = this->GetCurSelItem();
186 if(curselItem != end){
187 curselItem->viewData.selectFlag = FALSE;
191 cursel->viewData.selectFlag = TRUE;
199 CCommentList::reference CCommentList::GetChatAt(UINT_PTR no){
201 iterator data = chatList.begin();
202 std::advance(data,no);
207 UINT_PTR CCommentList::Size(){
209 return chatList.size();
212 BOOL CCommentList::empty(){
214 return chatList.empty();
219 CCommentList::iterator CCommentList::begin(){
221 return chatList.begin();
224 CCommentList::iterator CCommentList::end(){
226 return chatList.end();
230 CCommentList::reverse_iterator CCommentList::rbegein(){
233 return chatList.rbegin();
239 CCommentList::reverse_iterator CCommentList::rend(){
241 return chatList.rend();
244 VOID CCommentList::OnDestroy(){
250 VOID CCommentList::OnConnect(){
252 shortcut = chatList.begin();
255 CCommentList::reference CCommentList::back(){
257 return chatList.back();
261 ///
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\83C
\83e
\83\8c\81[
\83^
\82ð
\8eæ
\93¾
263 CCommentList::iterator CCommentList::GetShortCut(){
269 ///
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\82ð
\90Ý
\92è
271 BOOL CCommentList::SetShortCut(UINT_PTR no){
274 if(static_cast<INT_PTR>(chatList.size()) <= no)return FALSE;
276 shortcut = chatList.begin();
277 std::advance(shortcut,no);
285 VOID CListenerList::BkColorCollect(CListenerColorCollector &target){
287 iterator end = m_listenerList.end();
288 std::for_each(m_listenerList.begin(), end,target);
291 CListenerList::reference CListenerList::Register(ListenerData &listener,BOOL bUpdate){
293 ListenerPre listenerPre(listener);
295 iterator begin = m_listenerList.begin();
296 iterator end = m_listenerList.end();
298 iterator rslt = std::find_if(begin,end,listenerPre);
305 m_listenerList.push_back(listener);
307 return m_listenerList.back();
309 } else if(bUpdate == TRUE){
319 BOOL CListenerList::ReadProperty(LPCTSTR fileName){
321 CAtlFile userSettingFile;
322 ULONGLONG userSettingFileSize;
325 if(SUCCEEDED(userSettingFile.Create(fileName,GENERIC_READ,FILE_SHARE_READ,OPEN_ALWAYS)) == FALSE || SUCCEEDED(userSettingFile.GetSize(userSettingFileSize)) == FALSE){
327 throw Exception(TEXT("
\83\8a\83X
\83i
\81[
\90Ý
\92è
\83t
\83@
\83C
\83\8b\82ª
\8aJ
\82¯
\82Ü
\82¹
\82ñ
\82Å
\82µ
\82½
\81B
\82±
\82Ì
\83G
\83\89\81[
\82ª
\91±
\82
\82æ
\82¤
\82Å
\82 \82ê
\82Î
\81A
\88ê
\93x
\90Ý
\92è
\83t
\83@
\83C
\83\8b\82ð
\8dí
\8f\9c\82µ
\82Ä
\8dÄ
\93x
\8e\8e\82µ
\82Ä
\82Ý
\82Ä
\82
\82¾
\82³
\82¢"),__LINE__,TEXT(__FILE__),TEXT(__FUNCTION__));
329 std::vector<char> userSettingBuf(static_cast<UINT_PTR>(userSettingFileSize / sizeof(char) + (1 * sizeof(char))));
330 userSettingFile.Read(&userSettingBuf[0],userSettingBuf.size());
331 LPSTR userSettingStart = strstr(&userSettingBuf[0],"<");
332 if(userSettingStart != NULL){
333 ReadUserSettingXML rusx(nlite::listenerList);
334 rusx.Parse(userSettingStart);
342 ReadUserSettingXML::ReadUserSettingXML(CListenerList &in_listenerList):m_listenerList(in_listenerList),userNodeFlag(FALSE){}
344 #define NLITE_READ_USER_STRING(at,l,t) if(_tcscmp(at[0],TEXT(#t)) == 0)l.t = at[1]
345 #define NLITE_READ_USER_INT(at,l,t) if(_tcscmp(at[0],TEXT(#t))==0)l.t = _tcstol((const wchar_t*)at[1],NULL,10)
347 void ReadUserSettingXML::OnStartElement (const XML_Char *pszName, const XML_Char **papszAttrs){
349 if(_tcscmp(pszName,TEXT("user")) == 0){
351 this->userNodeFlag = TRUE;
354 for(;papszAttrs[0] != NULL;papszAttrs += 2){
356 NLITE_READ_USER_STRING(papszAttrs,listenerBuff,name);
357 NLITE_READ_USER_STRING(papszAttrs,listenerBuff,community);
358 NLITE_READ_USER_INT(papszAttrs,listenerBuff,bgcolor);
359 NLITE_READ_USER_INT(papszAttrs,listenerBuff,time);
368 void ReadUserSettingXML::OnEndElement (const XML_Char *pszName){
370 if(_tcscmp(pszName,TEXT("user")) == 0){
372 listenerList.Register(listenerBuff,TRUE);
373 this->userNodeFlag = FALSE;
374 this->listenerBuff.~ListenerData();
375 new(&listenerBuff) ListenerData();
382 void ReadUserSettingXML::OnCharacterData (const XML_Char *pszData, int nLength){
384 if(this->userNodeFlag == TRUE){
387 listenerBuff.user_id.Append(pszData,nLength);