bool CChannelManager::MakeDriverTuningSpaceList(const CBonSrcDecoder *pSrcDecoder) { const int NumSpaces=pSrcDecoder->NumSpaces(); m_DriverTuningSpaceList.Clear(); if (!m_DriverTuningSpaceList.Reserve(NumSpaces)) return false; for (int i=0;i<NumSpaces;i++) { CChannelList *pList=m_DriverTuningSpaceList.GetChannelList(i); LPCTSTR pszName; for (int j=0;(pszName=pSrcDecoder->GetChannelName(i,j))!=NULL;j++) { CChannelInfo ChInfo(i,j,j+1,pszName); LPCTSTR p=pszName; int Channel=0; while (*p!=_T('\0')) { if (*p>=_T('0') && *p<=_T('9')) { do { Channel=Channel*10+(*p-_T('0')); p++; } while (*p>=_T('0') && *p<=_T('9')); if (::StrCmpNI(p,TEXT("ch"),2)!=0) Channel=0; } else { p++; } } ChInfo.SetPhysicalChannel(Channel); pList->AddChannel(ChInfo); } m_DriverTuningSpaceList.GetTuningSpaceInfo(i)->SetName(pSrcDecoder->GetSpaceName(i)); } m_DriverTuningSpaceList.MakeAllChannelList(); return true; }
// TODO: UTF-16対応 bool CTuningSpaceList::LoadFromFile(LPCTSTR pszFileName) { static const LONGLONG MAX_FILE_SIZE=8LL*1024*1024; HANDLE hFile; LARGE_INTEGER FileSize; DWORD Read; char *pszFile,*p; hFile=::CreateFile(pszFileName,GENERIC_READ,FILE_SHARE_READ,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if (hFile==INVALID_HANDLE_VALUE) return false; if (!::GetFileSizeEx(hFile,&FileSize) || FileSize.QuadPart<1 || FileSize.QuadPart>MAX_FILE_SIZE) { ::CloseHandle(hFile); return false; } pszFile=new char[FileSize.LowPart+1]; if (!::ReadFile(hFile,pszFile,FileSize.LowPart,&Read,NULL) || Read!=FileSize.LowPart) { delete [] pszFile; ::CloseHandle(hFile); return false; } pszFile[FileSize.LowPart]='\0'; ::CloseHandle(hFile); m_AllChannelList.Clear(); p=pszFile; do { TCHAR szName[MAX_CHANNEL_NAME]; int Space,Channel,ControlKey,ServiceType,ServiceID,NetworkID,TransportStreamID; bool fEnabled; while (*p=='\r' || *p=='\n' || *p==' ' || *p=='\t') p++; if (*p=='#' || *p==';') { // コメント p++; if (*p=='#') { p++; if (::strnicmp(p,"space(",6)==0) { // チューニング空間名 #space(インデックス,名前) p+=6; SkipSpaces(&p); if (IsDigit(*p)) { Space=ParseDigits(&p); SkipSpaces(&p); if (Space>=0 && Space<10 && *p==',') { int i; p++; SkipSpaces(&p); for (i=0;p[i]!=')' && p[i]!='\0' && p[i]!='\r' && p[i]!='\n';i++); if (p[i]==')' && p[i+1]==')') i++; if (i>0) { #ifdef UNICODE szName[::MultiByteToWideChar(CP_ACP,0,p,i,szName,lengthof(szName)-1)]='\0'; #else ::lstrcpyn(szName,p,min(i+1,lengthof(szName))); #endif if ((int)m_TuningSpaceList.size()<=Space) { Reserve(Space+1); m_TuningSpaceList[Space]->SetName(szName); } p+=i; if (*p=='\0') break; p++; } } } } } goto Next; } if (*p=='\0') break; // チャンネル名 char cName[MAX_CHANNEL_NAME*2]; int NameLength=0; bool fTruncate=false; bool fQuote=false; if (*p=='"') { fQuote=true; p++; } while (*p!='\0') { if (fQuote) { if (*p=='"') { p++; if (*p!='"') { SkipSpaces(&p); break; } } } else { if (*p==',') break; } if (::IsDBCSLeadByteEx(CP_ACP,*p)) { if (*(p+1)=='\0') { p++; break; } if (NameLength<lengthof(cName)-2) { cName[NameLength++]=*p; cName[NameLength++]=*(p+1); } else { fTruncate=true; } p+=2; } else { if (!fTruncate && NameLength<lengthof(cName)-1) { cName[NameLength++]=*p; } p++; } } if (*p!=',') goto Next; p++; SkipSpaces(&p); cName[NameLength]='\0'; #ifdef UNICODE ::MultiByteToWideChar(CP_ACP,0,cName,-1,szName,MAX_CHANNEL_NAME); #else ::lstrcpynA(szName,cName,MAX_CHANNEL_NAME); #endif // チューニング空間 if (!IsDigit(*p)) goto Next; Space=ParseDigits(&p); SkipSpaces(&p); if (*p!=',') goto Next; p++; SkipSpaces(&p); // チャンネル if (!IsDigit(*p)) goto Next; Channel=ParseDigits(&p); SkipSpaces(&p); ControlKey=0; ServiceType=0; ServiceID=0; NetworkID=0; TransportStreamID=0; fEnabled=true; if (*p==',') { p++; // リモコン番号(オプション) ControlKey=ParseDigits(&p); SkipSpaces(&p); if (*p==',') { // サービスタイプ(オプション) p++; ServiceType=ParseDigits(&p); SkipSpaces(&p); if (*p==',') { // サービスID(オプション) p++; ServiceID=ParseDigits(&p); SkipSpaces(&p); if (*p==',') { // ネットワークID(オプション) p++; NetworkID=ParseDigits(&p); SkipSpaces(&p); if (*p==',') { // トランスポートストリームID(オプション) p++; TransportStreamID=ParseDigits(&p); SkipSpaces(&p); if (*p==',') { // 有効状態(オプション) p++; SkipSpaces(&p); if (IsDigit(*p)) { int Value=ParseDigits(&p); fEnabled=(Value&1)!=0; } } } } } } } { CChannelInfo ChInfo(Space,Channel,ControlKey,szName); if (ServiceID!=0) ChInfo.SetServiceID(ServiceID); if (NetworkID!=0) ChInfo.SetNetworkID(NetworkID); if (TransportStreamID!=0) ChInfo.SetTransportStreamID(TransportStreamID); if (ServiceType!=0) ChInfo.SetServiceType(ServiceType); if (!fEnabled) ChInfo.Enable(false); m_AllChannelList.AddChannel(ChInfo); } Next: while (*p!='\r' && *p!='\n' && *p!='\0') p++; } while (*p!='\0'); delete [] pszFile; return MakeTuningSpaceList(&m_AllChannelList); }