コード例 #1
0
ファイル: ChannelManager.cpp プロジェクト: footaro42/TVTest
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;
}
コード例 #2
0
ファイル: ChannelList.cpp プロジェクト: ChenglongWang/TVTest
// 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);
}