clPtr<FS> ParzeSmbURI( const unicode_t* uri, FSPath& path, clPtr<FS>* checkFS, int count )
{
	path.Set( rootPathStr );

	if ( !uri[0] ) { return new FSSmb(); }

	FSSmbParam param;

	const unicode_t* userDelimiter = FindFirstChar( uri, '@' );

	if ( *userDelimiter )
	{
		FSString s( CS_UNICODE, uri, userDelimiter - uri );
		SetString( const_cast<char*>( param.user ), sizeof( param.user ), s.GetUtf8() );
		uri = userDelimiter + 1;
	}

	const unicode_t* hostEnd = FindFirstChar( uri, '/' );
	FSString host( CS_UNICODE, uri, hostEnd - uri );
	SetString( const_cast<char*>( param.server ), sizeof( param.server ), host.GetUtf8() );

	uri = hostEnd;

	FSString link = uri;

	if ( !ParzeLink( path, link ) ) { return clPtr<FS>(); }

	return new FSSmb( &param );
}
clPtr<FS> ParzeFtpURI( const unicode_t* uri, FSPath& path, clPtr<FS>* checkFS, int count )
{
	path.Set( rootPathStr );

	if ( !uri[0] ) { return clPtr<FS>(); }

	FSFtpParam param;

	const unicode_t* userDelimiter = FindFirstChar( uri, '@' );

	if ( *userDelimiter )
	{
		param.user = FSString( CS_UNICODE, uri, userDelimiter - uri ).GetUnicode();
		uri = userDelimiter + 1;
		param.anonymous = false;
	}
	else
	{
		param.anonymous = true;
	}


	const unicode_t* host_port_End = FindFirstChar( uri, '/' );
	const unicode_t* host_End = FindFirstChar( uri, ':' );

	FSString host( CS_UNICODE, uri, ( ( host_End < host_port_End ) ? host_End :  host_port_End )  - uri );

	int port  = 0;

	for ( const unicode_t* s = host_End + 1; s < host_port_End; s++ )
		if ( *s >= '0' && *s <= '9' ) { port = port * 10 + ( *s - '0' ); }
		else { break; }

	if ( port > 0 && port < 65536 ) { param.port = port; }

	param.server = host.GetUnicode();

	uri = host_port_End;

	FSString link = uri;

	if ( !ParzeLink( path, link ) ) { return clPtr<FS>(); }

	for ( int i = 0; i < count; i++ )
		if ( checkFS[i].Ptr() && checkFS[i]->Type() == FS::FTP )
		{
			FSFtp* p = ( FSFtp* )checkFS[i].Ptr();
			FSFtpParam checkParam;
			p->GetParam( &checkParam );

			if (  !CmpStr<const unicode_t>( param.server.Data(), checkParam.server.Data() ) &&
			      ( param.anonymous == checkParam.anonymous && ( param.anonymous || !CmpStr<const unicode_t>( param.user.Data(), checkParam.user.Data() ) ) ) &&
			      param.port == checkParam.port )
			{
				return checkFS[i];
			}
		}

	return new FSFtp( &param );
}
Example #3
0
LPCTSTR __stdcall _StrStrI(__in LPCTSTR lpszText, __in LPCTSTR lpszPattern)
{
	if (lpszText == NULL || lpszText[0] == _T('\0'))	return NULL;
	if (lpszPattern == NULL || lpszPattern[0] == _T('\0'))	return NULL;

	size_t nTextLen = _tcslen(lpszText);
	size_t nPatternLen = _tcslen(lpszPattern);
	if (nPatternLen > nTextLen)		return NULL;

	// 查找首个字符在搜索池中的偏移位置,在数据量比较大的情况下,能有效降低时间复杂度
	LPCTSTR lpszStartPoint = FindFirstChar(lpszText, lpszPattern[0]);
	if (lpszStartPoint == NULL)
		return NULL;
	LPCTSTR lpszEndPoint = lpszText + nTextLen;
	size_t i = 0;
	for (LPCTSTR p = lpszStartPoint; p != lpszEndPoint; p++)
	{
		i = 0;
		TCHAR cchText = _T('\0'), cchPattern = _T('\0');
		BOOL bFound = TRUE;
		size_t j = 0;
		while (j < nPatternLen)
		{
			if (lpszPattern[j] >= 65 && lpszPattern[j] <= 90)	// 如果是大写,转换成小写
				cchPattern = lpszPattern[j] + 32;
			else
				cchPattern = lpszPattern[j];
			if (p[i] >= 65 && p[i] <= 90)	// 如果是大写,转换成小写
				cchText = p[i] + 32;
			else
				cchText = p[i];

			if (cchPattern != cchText)		// 匹配失败,本轮查找结束
			{
				bFound = FALSE;
				p = p + j;
				break;
			}
			i++;
			j++;
		}

		if (!bFound)
			return NULL;
		else
			return p + i - nPatternLen;
	}
	return NULL;
}