#include "stdafx.h"
#include "nlite_include.h"
+using namespace std::tr1;
+namespace nlite{
+
-CListenerList nlite::listenerList;
//\83\8a\83X\83i\81[\8c\9f\8dõ\83I\83u\83W\83F\83N\83g
struct ListenerPre{
- LPCTSTR user_id;
+ ListenerData &user;
- ListenerPre(LPCTSTR user_id_in):
- user_id(user_id_in)
+ ListenerPre(ListenerData &in_user):
+ user(in_user)
{}
bool operator()(CListenerList::reference listenerData){
- return _tcscmp(user_id,listenerData.user_id) == 0;
+
+ return (user.user_id == listenerData.user_id)/* && (user.community == listenerData.community)*/;
}
};
+//
+//\83\8a\83X\83i\81[\83f\81[\83^
+/////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+ListenerData::ListenerData():
+user_id(TEXT("")),
+name(TEXT("")),
+community(TEXT("")),
+bgcolor(INIT_COLOR),
+time(0),
+onlyCommunityFlag(FALSE),
+nameColor(INIT_COLOR)
+{}
+
+VOID ListenerData::SetNameColor(COLORREF nameColor_in){
+ nameColor = nameColor_in;
+
+ return;
+}
+
VOID ListenerData::SetBkColor(COLORREF bkColor_in){
- bkColor = bkColor_in;
+ bgcolor = bkColor_in;
+
return;
}
+VOID ListenerData::SetUserName(LPCTSTR name){
-VOID CCommentList::OnChatReceve(NicoLiveChat_P chatData_in, UINT_PTR commnetCountSum){
+ this->name = name;
-
- CChatData chatData;
- chatData.SetChat(*chatData_in);
-
-
- chatList.push_back(chatData);
- return;
}
-VOID CChatData::SetChat(NicoLiveChat &chat_in){
+CChatData::ViewData::ViewData():
+ sellLineColor(INIT_COLOR),
+ stringColor(INIT_COLOR),
+ backColor(INIT_COLOR),
+ selectFlag(FALSE),
+ height(0)
+ {}
+
+VOID CChatData::SetChat(NicoLiveChat &chat_in,ListenerData &listener){
this->anonymity = _ttol(chat_in.anonymity);
this->name = chat_in.name;
- this->listenerData = &listenerList.Register(chat_in.user_id);
+ this->listenerData = &listenerList.Register(listener,FALSE);
+ tstring target(chat_in.chatBuf);
+
+ match_results<tstring::iterator> results;
+ if(regex_match(target.begin(),target.end(),results,nliteregex::NAMESERTCHREGEX) == TRUE){
+
+ const tstring &name = results.str(results.size() - 1).c_str();
+
+ if(nliteProperty.gp.numberNameFlag == TRUE || _tcstol(name.c_str(),NULL,10) == 0){
+ this->listenerData->SetUserName(name.c_str());
+ }
+
+ }
+
this->vpos = _ttol(chat_in.vpos);
this->thread = _ttol(chat_in.thread);
this->date = _ttol(chat_in.date);
//\83R\83\81\83\93\83g\83\8a\83X\83g\83N\83\89\83X
//////////////////////////////////////////////////////////////////////////
+//\91I\91ð\8ds\8eæ\93¾\97p\83t\83@\83\93\83N\83V\83\87\83i\83\8b
struct GetCurSelFunc_t{
INT_PTR count;
BOOL findFlag;
GetCurSelFunc_t():
- count(0),
- findFlag(FALSE)
+ count(0)
{}
- BOOL operator() (CChatData &target){
+ BOOL operator() (const CChatData &target){
count++;
- findFlag = target.selectFlag;
- return target.selectFlag;
+ return target.viewData.selectFlag;
}
};
+//\91}\93ü\88Ê\92u\8c\9f\8dõ\83t\83@\83\93\83N\83V\83\87\83i\83\8b
+struct SeartchSetPos_t{
+ time_t time;
+
+ SeartchSetPos_t(time_t in_time):time(in_time){}
+
+ bool operator()(const CChatData &target){
+
+ return time > target.date;
+ }
+};
+
CCommentList::CCommentList(){}
CCommentList::~CCommentList(){}
-INT_PTR CCommentList::GetCurSel(){
- GetCurSelFunc_t functa;
- std::find_if(chatList.begin(),chatList.end(),functa);
+CCommentList::iterator CCommentList::GetCurSel(){
+ auto end = this->end();
+ auto ite = this->begin();
- return functa.findFlag == TRUE ? functa.count - 1 : -1;
+ for(;ite != end && ite->viewData.selectFlag == FALSE;++ite);
+
+ return ite ;
+}
+
+
+INT_PTR CCommentList::GetCurSelNo(){
+
+ auto end = this->end();
+ auto ite = this->begin();
+ INT_PTR no = 0;
+ for(;ite != end && ite->viewData.selectFlag == FALSE;++ite,++no);
+
+ return ite != end ? no : -1;
+
+}
+
+
+CCommentList::iterator CCommentList::OnChatReceve(NicoLiveChat_P chatData_in,LPCTSTR communityID, UINT_PTR commnetCountSum,CCommentListWindow &listWindow){
+
+ CChatData chatData;
+ ListenerData listenerData;
+ listenerData.user_id = chatData_in->user_id;
+ listenerData.time = time(NULL);
+ listenerData.community = communityID;
+ chatData.SetChat(*chatData_in,listenerData);
+ iterator rslt;
+ if(empty() == TRUE || back().date <= chatData.date){
+ chatList.push_back(chatData);
+ rslt = (--chatList.end());
+ }else {
+
+ rslt = chatList.insert(std::find_if(chatList.begin(),chatList.end(),SeartchSetPos_t(chatData.date)),chatData);
+ }
+
+ if(shortcut ==chatList.end())shortcut = chatList.begin();
+
+ return rslt;
}
CCommentList::iterator CCommentList::GetCurSelItem(){
}
-VOID CCommentList::SetCurSel(INT_PTR cursel){
- if(cursel < 0)return;
- iterator data = chatList.begin();
- std::advance(data,cursel);
- data->selectFlag = TRUE;
+VOID CCommentList::SetCurSel(CCommentList::iterator cursel){
+
+ auto end = this->end();
+ if(cursel == end)goto end;
+ {
+ auto curselItem = this->GetCurSelItem();
+
+ if(curselItem != end){
+ curselItem->viewData.selectFlag = FALSE;
+ }
+
+
+ cursel->viewData.selectFlag = TRUE;
+ }
+end:
return;
}
CCommentList::reverse_iterator CCommentList::rbegein(){
+
return chatList.rbegin();
}
VOID CCommentList::OnConnect(){
OnDestroy();
+ shortcut = chatList.begin();
}
CCommentList::reference CCommentList::back(){
return chatList.back();
}
+///
+///\83V\83\87\81[\83g\83J\83b\83g\83C\83e\83\8c\81[\83^\82ð\8eæ\93¾
+///
+CCommentList::iterator CCommentList::GetShortCut(){
+
+ return shortcut;
+}
+
+///
+///\83V\83\87\81[\83g\83J\83b\83g\82ð\90Ý\92è
+///
+BOOL CCommentList::SetShortCut(UINT_PTR no){
+
+
+ if(static_cast<INT_PTR>(chatList.size()) <= no)return FALSE;
+
+ shortcut = chatList.begin();
+ std::advance(shortcut,no);
+
+ return TRUE;
+
+}
+
+
+
VOID CListenerList::BkColorCollect(CListenerColorCollector &target){
iterator end = m_listenerList.end();
std::for_each(m_listenerList.begin(), end,target);
}
-CListenerList::reference CListenerList::Register(LPCTSTR user_id){
+CListenerList::reference CListenerList::Register(ListenerData &listener,BOOL bUpdate){
- ListenerPre listenerPre(user_id);
+ ListenerPre listenerPre(listener);
iterator begin = m_listenerList.begin();
iterator end = m_listenerList.end();
iterator rslt = std::find_if(begin,end,listenerPre);
-
+
if(rslt == end){
- ListenerData insertData(user_id);
+
+ m_listenerList.push_back(listener);
+ return m_listenerList.back();
- m_listenerList.push_back(insertData);
+ } else if(bUpdate == TRUE){
- return m_listenerList.back();
+ *rslt = listener;
+
}
return *rslt;
+}
+
+BOOL CListenerList::ReadProperty(LPCTSTR fileName){
+ BOOL rslt = FALSE;
+ CAtlFile userSettingFile;
+ ULONGLONG userSettingFileSize;
+
+
+ if(SUCCEEDED(userSettingFile.Create(fileName,GENERIC_READ,FILE_SHARE_READ,OPEN_ALWAYS)) == FALSE || SUCCEEDED(userSettingFile.GetSize(userSettingFileSize)) == FALSE){
+
+ 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__));
+ }
+ std::vector<char> userSettingBuf(static_cast<UINT_PTR>(userSettingFileSize / sizeof(char) + (1 * sizeof(char))));
+ userSettingFile.Read(&userSettingBuf[0],userSettingBuf.size());
+ LPSTR userSettingStart = strstr(&userSettingBuf[0],"<");
+ if(userSettingStart != NULL){
+ ReadUserSettingXML rusx(nlite::listenerList);
+ rusx.Parse(userSettingStart);
+ }
+
+
+ return rslt;
+}
+#define NLITE_ATTRIBUTE_WRITE_STR(s,n) s->WriteAttributeString(NULL, _tcsstr(TEXT(#n),TEXT(".")) != NULL ? _tcsstr(TEXT(#n),TEXT(".")) + 1 : TEXT(#n), NULL, n)
+
+#define NLITE_ATTRIBUTE_WRITE_INT(s,n) \
+ {\
+ TCHAR buffer[sizeof(n) * 8];\
+ _stprintf(buffer,TEXT("%d"),static_cast<INT>(n));\
+ s->WriteAttributeString(NULL, _tcsstr(TEXT(#n),TEXT(".")) + 1, NULL,buffer );\
+}
+BOOL CListenerList::WriteProperty(LPCTSTR fileName){
+ BOOL rslt = FALSE;
+
+
+ CComPtr<IXmlWriter> pWriter;
+ CreateXmlWriter(__uuidof(IXmlWriter), reinterpret_cast<void**>(&pWriter), 0);
+ // \83t\83@\83C\83\8b\83X\83g\83\8a\81[\83\80\8dì\90¬
+ CComPtr<IStream> pStream;
+ SHCreateStreamOnFile(fileName, STGM_CREATE | STGM_WRITE, &pStream);
+
+ pWriter->SetOutput(pStream);
+
+ // \83C\83\93\83f\83\93\83g\97L\8cø\89»
+ pWriter->SetProperty(XmlWriterProperty_Indent, TRUE);
+
+ // <?xml version="1.0" encoding="UTF-8"?>
+ pWriter->WriteStartDocument(XmlStandalone_Omit);
+
+ pWriter->WriteStartElement(NULL,TEXT("listenerData"),NULL);
+
+
+ auto begin = m_listenerList.begin();
+ auto end = m_listenerList.end();
+
+ for(;begin != end;++begin){
+ if(begin->name.Length() > 0 || begin->nameColor != ListenerData::INIT_COLOR || begin->bgcolor != ListenerData::INIT_COLOR){
+ pWriter->WriteStartElement(NULL,TEXT("user"),NULL);
+ if(begin->name.Length() > 0) NLITE_ATTRIBUTE_WRITE_STR(pWriter,(*begin).name);
+ if(begin->community.Length()> 0) NLITE_ATTRIBUTE_WRITE_STR(pWriter,(*begin).community);
+ NLITE_ATTRIBUTE_WRITE_INT(pWriter,(*begin).time);
+ if(begin->bgcolor != ListenerData::INIT_COLOR)NLITE_ATTRIBUTE_WRITE_INT(pWriter,(*begin).bgcolor);
+ if(begin->nameColor != ListenerData::INIT_COLOR)NLITE_ATTRIBUTE_WRITE_INT(pWriter,(*begin).nameColor);
+ pWriter->WriteString(begin->user_id);
+ pWriter->WriteEndElement();
+ }
+ }
+ pWriter->WriteEndDocument();
+ rslt = TRUE;
+ return rslt;
+}
+
+
+ReadUserSettingXML::ReadUserSettingXML(CListenerList &in_listenerList):m_listenerList(in_listenerList),userNodeFlag(FALSE){}
+
+#define NLITE_READ_USER_STRING(at,l,t) if(_tcscmp(at[0],TEXT(#t)) == 0)l.t = at[1]
+#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)
+
+ void ReadUserSettingXML::OnStartElement (const XML_Char *pszName, const XML_Char **papszAttrs){
+
+ if(_tcscmp(pszName,TEXT("user")) == 0){
+
+ this->userNodeFlag = TRUE;
+
+
+ for(;papszAttrs[0] != NULL;papszAttrs += 2){
+
+ NLITE_READ_USER_STRING(papszAttrs,listenerBuff,name);
+ NLITE_READ_USER_STRING(papszAttrs,listenerBuff,community);
+ NLITE_READ_USER_INT(papszAttrs,listenerBuff,bgcolor);
+ NLITE_READ_USER_INT(papszAttrs,listenerBuff,nameColor);
+ NLITE_READ_USER_INT(papszAttrs,listenerBuff,time);
+
+ }
+
+ }
+
+ return;
+ }
+
+ void ReadUserSettingXML::OnEndElement (const XML_Char *pszName){
+
+ if(_tcscmp(pszName,TEXT("user")) == 0){
+
+ listenerList.Register(listenerBuff,TRUE);
+ this->userNodeFlag = FALSE;
+ this->listenerBuff.~ListenerData();
+ new(&listenerBuff) ListenerData();
+
+ }
+
+ return;
+ }
+
+ void ReadUserSettingXML::OnCharacterData (const XML_Char *pszData, int nLength){
+
+ if(this->userNodeFlag == TRUE){
+
+
+ if(_tcstol(listenerBuff.user_id,NULL,10) != 0 || ((difftime(time(NULL),604800)) <listenerBuff.time)){
+ listenerBuff.user_id.Append(pszData,nLength);
+ }
+
+
+
+ }
+
+
+
+ return;
+ }
+
}
\ No newline at end of file