本文整理汇总了C++中CStdString::size方法的典型用法代码示例。如果您正苦于以下问题:C++ CStdString::size方法的具体用法?C++ CStdString::size怎么用?C++ CStdString::size使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CStdString
的用法示例。
在下文中一共展示了CStdString::size方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: Cache
bool CFile::Cache(const CStdString& strFileName, const CStdString& strDest, XFILE::IFileCallback* pCallback, void* pContext)
{
CFile file;
CAsyncFileCallback* helper = NULL;
if (file.Open(strFileName, true, READ_TRUNCATED))
{
if (file.GetLength() <= 0)
{
CLog::Log(LOGWARNING, "FILE::cache: the file %s has a length of 0 bytes", strFileName.c_str());
file.Close();
// Never save 0 byte files from the Plex Media Server.
if (strFileName.Find(":32400") != -1)
return false;
}
CFile newFile;
if (CUtil::IsHD(strDest)) // create possible missing dirs
{
std::vector<CStdString> tokens;
CStdString strDirectory;
CUtil::GetDirectory(strDest,strDirectory);
CUtil::RemoveSlashAtEnd(strDirectory); // for the test below
if (!(strDirectory.size() == 2 && strDirectory[1] == ':'))
{
CUtil::Tokenize(strDirectory,tokens,"\\");
CStdString strCurrPath = tokens[0]+"\\";
for (std::vector<CStdString>::iterator iter=tokens.begin()+1;iter!=tokens.end();++iter)
{
strCurrPath += *iter+"\\";
CDirectory::Create(strCurrPath);
}
}
}
if (CFile::Exists(strDest))
CFile::Delete(strDest);
if (!newFile.OpenForWrite(strDest, true, true)) // overwrite always
{
file.Close();
return false;
}
/* larger then 1 meg, let's do rendering async */
// Async render cannot be done in Linux because of the resulting ThreadMessage deadlock
#ifndef _LINUX
if( file.GetLength() > 1024*1024 )
helper = new CAsyncFileCallback(pCallback, pContext);
#endif
// 128k is optimal for xbox
int iBufferSize = 128 * 1024;
CAutoBuffer buffer(iBufferSize);
int iRead, iWrite;
UINT64 llFileSize = file.GetLength();
UINT64 llFileSizeOrg = llFileSize;
UINT64 llPos = 0;
int ipercent = 0;
CStopWatch timer;
timer.StartZero();
float start = 0.0f;
while (llFileSize > 0)
{
g_application.ResetScreenSaver();
unsigned int iBytesToRead = iBufferSize;
/* make sure we don't try to read more than filesize*/
if (iBytesToRead > llFileSize) iBytesToRead = llFileSize;
iRead = file.Read(buffer.get(), iBytesToRead);
if (iRead == 0) break;
else if (iRead < 0)
{
CLog::Log(LOGERROR, "%s - Failed read from file %s", __FUNCTION__, strFileName.c_str());
break;
}
/* write data and make sure we managed to write it all */
iWrite = 0;
while(iWrite < iRead)
{
int iWrite2 = newFile.Write(buffer.get()+iWrite, iRead-iWrite);
if(iWrite2 <=0)
break;
iWrite+=iWrite2;
}
if (iWrite != iRead)
{
CLog::Log(LOGERROR, "%s - Failed write to file %s", __FUNCTION__, strDest.c_str());
break;
}
llFileSize -= iRead;
llPos += iRead;
// calculate the current and average speeds
//.........这里部分代码省略.........
示例2: Parse
void CGUIInfoLabel::Parse(const CStdString &label, int context)
{
m_info.clear();
// Step 1: Replace all $LOCALIZE[number] with the real string
CStdString work = ReplaceLocalize(label);
// Step 2: Replace all $ADDON[id number] with the real string
work = ReplaceAddonStrings(work);
// Step 3: Find all $INFO[info,prefix,postfix] blocks
EINFOFORMAT format;
do
{
format = NONE;
size_t pos1 = work.size();
size_t pos2;
size_t len = 0;
for (size_t i = 0; i < sizeof(infoformatmap) / sizeof(infoformat); i++)
{
pos2 = work.find(infoformatmap[i].str);
if (pos2 != string::npos && pos2 < pos1)
{
pos1 = pos2;
len = strlen(infoformatmap[i].str);
format = infoformatmap[i].val;
}
}
if (format != NONE)
{
if (pos1 > 0)
m_info.push_back(CInfoPortion(0, work.substr(0, pos1), ""));
pos2 = StringUtils::FindEndBracket(work, '[', ']', pos1 + len);
if (pos2 != std::string::npos)
{
// decipher the block
CStdString block = work.substr(pos1 + len, pos2 - pos1 - len);
CStdStringArray params;
StringUtils::SplitString(block, ",", params);
int info;
if (format == FORMATVAR)
{
info = g_infoManager.TranslateSkinVariableString(params[0], context);
if (info == 0)
info = g_infoManager.RegisterSkinVariableString(g_SkinInfo->CreateSkinVariable(params[0], context));
if (info == 0) // skinner didn't define this conditional label!
CLog::Log(LOGWARNING, "Label Formating: $VAR[%s] is not defined", params[0].c_str());
}
else
info = g_infoManager.TranslateString(params[0]);
CStdString prefix, postfix;
if (params.size() > 1)
prefix = params[1];
if (params.size() > 2)
postfix = params[2];
m_info.push_back(CInfoPortion(info, prefix, postfix, format == FORMATESCINFO));
// and delete it from our work string
work = work.substr(pos2 + 1);
}
else
{
CLog::Log(LOGERROR, "Error parsing label - missing ']' in \"%s\"", label.c_str());
return;
}
}
}
while (format != NONE);
if (!work.empty())
m_info.push_back(CInfoPortion(0, work, ""));
}
示例3: Cache
// This *looks* like a copy function, therefor the name "Cache" is misleading
bool CFile::Cache(const CStdString& strFileName, const CStdString& strDest, XFILE::IFileCallback* pCallback, void* pContext)
{
CFile file;
if (strFileName.empty() || strDest.empty())
return false;
// special case for zips - ignore caching
CURL url(strFileName);
if (URIUtils::IsInZIP(strFileName) || URIUtils::IsInAPK(strFileName))
url.SetOptions("?cache=no");
if (file.Open(url.Get(), READ_TRUNCATED))
{
CFile newFile;
if (URIUtils::IsHD(strDest)) // create possible missing dirs
{
vector<CStdString> tokens;
CStdString strDirectory = URIUtils::GetDirectory(strDest);
URIUtils::RemoveSlashAtEnd(strDirectory); // for the test below
if (!(strDirectory.size() == 2 && strDirectory[1] == ':'))
{
CURL url(strDirectory);
CStdString pathsep;
#ifndef TARGET_POSIX
pathsep = "\\";
#else
pathsep = "/";
#endif
CUtil::Tokenize(url.GetFileName(),tokens,pathsep.c_str());
CStdString strCurrPath;
// Handle special
if (!url.GetProtocol().IsEmpty()) {
pathsep = "/";
strCurrPath += url.GetProtocol() + "://";
} // If the directory has a / at the beginning, don't forget it
else if (strDirectory[0] == pathsep[0])
strCurrPath += pathsep;
for (vector<CStdString>::iterator iter=tokens.begin();iter!=tokens.end();++iter)
{
strCurrPath += *iter+pathsep;
CDirectory::Create(strCurrPath);
}
}
}
if (CFile::Exists(strDest))
CFile::Delete(strDest);
if (!newFile.OpenForWrite(strDest, true)) // overwrite always
{
file.Close();
return false;
}
int iBufferSize = 128 * 1024;
CAutoBuffer buffer(iBufferSize);
int iRead, iWrite;
UINT64 llFileSize = file.GetLength();
UINT64 llPos = 0;
CStopWatch timer;
timer.StartZero();
float start = 0.0f;
while (true)
{
g_application.ResetScreenSaver();
iRead = file.Read(buffer.get(), iBufferSize);
if (iRead == 0) break;
else if (iRead < 0)
{
CLog::Log(LOGERROR, "%s - Failed read from file %s", __FUNCTION__, strFileName.c_str());
llFileSize = (uint64_t)-1;
break;
}
/* write data and make sure we managed to write it all */
iWrite = 0;
while(iWrite < iRead)
{
int iWrite2 = newFile.Write(buffer.get()+iWrite, iRead-iWrite);
if(iWrite2 <=0)
break;
iWrite+=iWrite2;
}
if (iWrite != iRead)
{
CLog::Log(LOGERROR, "%s - Failed write to file %s", __FUNCTION__, strDest.c_str());
llFileSize = (uint64_t)-1;
break;
}
llPos += iRead;
// calculate the current and average speeds
float end = timer.GetElapsedSeconds();
//.........这里部分代码省略.........
示例4: GetFilesInRar
// NB: The rar manager expects paths in rars to be terminated with a "\".
bool CRarManager::GetFilesInRar(CFileItemList& vecpItems, const CStdString& strRarPath,
bool bMask, const CStdString& strPathInRar)
{
#ifdef HAS_FILESYSTEM_RAR
CSingleLock lock(m_CritSection);
ArchiveList_struct* pFileList = NULL;
map<CStdString,pair<ArchiveList_struct*,vector<CFileInfo> > >::iterator it = m_ExFiles.find(strRarPath);
if (it == m_ExFiles.end())
{
if( urarlib_list((char*) strRarPath.c_str(), &pFileList, NULL) )
m_ExFiles.insert(make_pair(strRarPath,make_pair(pFileList,vector<CFileInfo>())));
else
{
if( pFileList ) urarlib_freelist(pFileList);
return false;
}
}
else
pFileList = it->second.first;
CFileItemPtr pFileItem;
vector<CStdString> vec;
set<CStdString> dirSet;
CUtil::Tokenize(strPathInRar,vec,"/");
unsigned int iDepth = vec.size();
ArchiveList_struct* pIterator;
CStdString strCompare = strPathInRar;
if (!URIUtils::HasSlashAtEnd(strCompare) && !strCompare.IsEmpty())
strCompare += '/';
for( pIterator = pFileList; pIterator ; pIterator ? pIterator = pIterator->next : NULL)
{
CStdString strDirDelimiter = (pIterator->item.HostOS==3 ? "/":"\\"); // win32 or unix paths?
CStdString strName;
/* convert to utf8 */
if( pIterator->item.NameW && wcslen(pIterator->item.NameW) > 0)
g_charsetConverter.wToUTF8(pIterator->item.NameW, strName);
else
g_charsetConverter.unknownToUTF8(pIterator->item.Name, strName);
/* replace back slashes into forward slashes */
/* this could get us into troubles, file could two different files, one with / and one with \ */
strName.Replace('\\', '/');
if (bMask)
{
if (!strstr(strName.c_str(),strCompare.c_str()))
continue;
vec.clear();
CUtil::Tokenize(strName,vec,"/");
if (vec.size() < iDepth)
continue;
}
unsigned int iMask = (pIterator->item.HostOS==3 ? 0x0040000:16); // win32 or unix attribs?
if (((pIterator->item.FileAttr & iMask) == iMask) || (vec.size() > iDepth+1 && bMask)) // we have a directory
{
if (!bMask) continue;
if (vec.size() == iDepth)
continue; // remove root of listing
if (dirSet.find(vec[iDepth]) == dirSet.end())
{
dirSet.insert(vec[iDepth]);
pFileItem.reset(new CFileItem(vec[iDepth]));
pFileItem->m_strPath = vec[iDepth];
pFileItem->m_strPath += '/';
pFileItem->m_bIsFolder = true;
pFileItem->m_idepth = pIterator->item.Method;
pFileItem->m_iDriveType = pIterator->item.HostOS;
//pFileItem->m_lEndOffset = long(pIterator->item.iOffset);
}
}
else
{
if (vec.size() == iDepth+1 || !bMask)
{
if (vec.size() == 0)
pFileItem.reset(new CFileItem(strName));
else
pFileItem.reset(new CFileItem(vec[iDepth]));
pFileItem->m_strPath = strName.c_str()+strPathInRar.size();
pFileItem->m_dwSize = pIterator->item.UnpSize;
pFileItem->m_idepth = pIterator->item.Method;
pFileItem->m_iDriveType = pIterator->item.HostOS;
//pFileItem->m_lEndOffset = long(pIterator->item.iOffset);
}
}
if (pFileItem)
vecpItems.Add(pFileItem);
pFileItem.reset();
}
return vecpItems.Size() > 0;
#else
return false;
//.........这里部分代码省略.........
示例5: ConvertLine
void SamiTagConvertor::ConvertLine(CDVDOverlayText* pOverlay, const char* line, int len, const char* lang)
{
CStdStringA strUTF8;
strUTF8.assign(line, len);
int pos = 0;
int del_start = 0;
while ((pos=m_tags->RegFind(strUTF8.c_str(), pos)) >= 0)
{
// Parse Tags
CStdString fullTag = m_tags->GetMatch(0);
fullTag.ToLower();
strUTF8.erase(pos, fullTag.length());
if (fullTag == "<b>")
{
tag_flag[FLAG_BOLD] = true;
strUTF8.insert(pos, "[B]");
pos += 3;
}
else if (fullTag == "</b>" && tag_flag[FLAG_BOLD])
{
tag_flag[FLAG_BOLD] = false;
strUTF8.insert(pos, "[/B]");
pos += 4;
}
else if (fullTag == "<i>")
{
tag_flag[FLAG_ITALIC] = true;
strUTF8.insert(pos, "[I]");
pos += 3;
}
else if (fullTag == "</i>" && tag_flag[FLAG_ITALIC])
{
tag_flag[FLAG_ITALIC] = false;
strUTF8.insert(pos, "[/I]");
pos += 4;
}
else if (fullTag == "</font>" && tag_flag[FLAG_COLOR])
{
tag_flag[FLAG_COLOR] = false;
strUTF8.insert(pos, "[/COLOR]");
pos += 8;
}
else if (fullTag.Left(5) == "<font")
{
int pos2 = 5;
while ((pos2 = m_tagOptions->RegFind(fullTag.c_str(), pos2)) >= 0)
{
CStdString tagOptionName = m_tagOptions->GetMatch(1);
CStdString tagOptionValue = m_tagOptions->GetMatch(2);
pos2 += tagOptionName.length() + tagOptionValue.length();
if (tagOptionName == "color")
{
tag_flag[FLAG_COLOR] = true;
CStdString tempColorTag = "[COLOR ";
if (tagOptionValue[0] == '#')
{
tagOptionValue.erase(0, 1);
tempColorTag += "FF";
}
else if( tagOptionValue.size() == 6 )
{
bool bHex = true;
for( int i=0 ; i<6 ; i++ )
{
char temp = tagOptionValue[i];
if( !(('0' <= temp && temp <= '9') ||
('a' <= temp && temp <= 'f') ||
('A' <= temp && temp <= 'F') ))
{
bHex = false;
break;
}
}
if( bHex ) tempColorTag += "FF";
}
tempColorTag += tagOptionValue;
tempColorTag += "]";
strUTF8.insert(pos, tempColorTag);
pos += tempColorTag.length();
}
}
}
else if (lang && (fullTag.Left(3) == "<p "))
{
int pos2 = 3;
while ((pos2 = m_tagOptions->RegFind(fullTag.c_str(), pos2)) >= 0)
{
CStdString tagOptionName = m_tagOptions->GetMatch(1);
CStdString tagOptionValue = m_tagOptions->GetMatch(2);
pos2 += tagOptionName.length() + tagOptionValue.length();
if (tagOptionName == "class")
{
if (tag_flag[FLAG_LANGUAGE])
{
strUTF8.erase(del_start, pos - del_start);
pos = del_start;
}
if (!tagOptionValue.Compare(lang))
{
//.........这里部分代码省略.........
示例6: GetDirectory
// Android apk directory i/o. Depends on libzip
// Basically the same format as zip.
// We might want to refactor CZipDirectory someday...
//////////////////////////////////////////////////////////////////////
bool CAPKDirectory::GetDirectory(const CStdString& strPath, CFileItemList &items)
{
// uses a <fully qualified path>/filename.apk/...
CURL url(strPath);
CStdString path = url.GetFileName();
CStdString host = url.GetHostName();
URIUtils::AddSlashAtEnd(path);
// host name might be encoded rfc1738.txt, decode it.
CURL::Decode(host);
int zip_flags = 0, zip_error = 0, dir_marker = 0;
struct zip *zip_archive;
zip_archive = zip_open(host.c_str(), zip_flags, &zip_error);
if (!zip_archive || zip_error)
{
CLog::Log(LOGERROR, "CAPKDirectory::GetDirectory: Unable to open archive : '%s'",
host.c_str());
return false;
}
CStdString test_name;
int numFiles = zip_get_num_files(zip_archive);
for (int zip_index = 0; zip_index < numFiles; zip_index++)
{
test_name = zip_get_name(zip_archive, zip_index, zip_flags);
// check for non matching path.
if (!test_name.Left(path.size()).Equals(path))
continue;
// libzip does not index folders, only filenames. We search for a /,
// add it if it's not in our list already, and hope that no one has
// any "file/name.exe" files in a zip.
dir_marker = test_name.Find('/', path.size() + 1);
if (dir_marker > 0)
{
// return items relative to path
test_name=test_name.Left(dir_marker);
if (items.Contains(host + "/" + test_name))
continue;
}
struct zip_stat sb;
zip_stat_init(&sb);
if (zip_stat_index(zip_archive, zip_index, zip_flags, &sb) != -1)
{
g_charsetConverter.unknownToUTF8(test_name);
CFileItemPtr pItem(new CFileItem(test_name));
pItem->m_dwSize = sb.size;
pItem->m_dateTime = sb.mtime;
pItem->m_bIsFolder = dir_marker > 0 ;
pItem->SetPath(host + "/" + test_name);
pItem->SetLabel(test_name.Right(test_name.size() - path.size()));
items.Add(pItem);
}
}
zip_close(zip_archive);
return true;
}
示例7: GetZipList
//.........这里部分代码省略.........
// Loop through blocks starting at the end of the file (minus ECDREC_SIZE-1)
for (int nb=1; !found && (nb <= nbBlock); nb++)
{
mFile.Seek(fileSize-ECDREC_SIZE+1-(blockSize*nb),SEEK_SET);
mFile.Read(buffer,blockSize+3);
for (int i=blockSize-1; !found && (i >= 0); i--)
{
if ( Endian_SwapLE32(*((unsigned int*)(buffer+i))) == ZIP_END_CENTRAL_HEADER )
{
// Set current position to start of end of central directory
mFile.Seek(fileSize-ECDREC_SIZE+1-(blockSize*nb)+i,SEEK_SET);
found = true;
}
}
}
// If not found, look in the last block left...
if ( !found && (extraBlockSize > 0) )
{
mFile.Seek(fileSize-ECDREC_SIZE+1-searchSize,SEEK_SET);
mFile.Read(buffer,extraBlockSize+3);
for (int i=extraBlockSize-1; !found && (i >= 0); i--)
{
if ( Endian_SwapLE32(*((unsigned int*)(buffer+i))) == ZIP_END_CENTRAL_HEADER )
{
// Set current position to start of end of central directory
mFile.Seek(fileSize-ECDREC_SIZE+1-searchSize+i,SEEK_SET);
found = true;
}
}
}
delete [] buffer;
if ( !found )
{
CLog::Log(LOGDEBUG,"ZipManager: broken file %s!",strFile.c_str());
mFile.Close();
return false;
}
unsigned int cdirOffset, cdirSize;
// Get size of the central directory
mFile.Seek(12,SEEK_CUR);
mFile.Read(&cdirSize,4);
cdirSize = Endian_SwapLE32(cdirSize);
// Get Offset of start of central directory with respect to the starting disk number
mFile.Read(&cdirOffset,4);
cdirOffset = Endian_SwapLE32(cdirOffset);
// Go to the start of central directory
mFile.Seek(cdirOffset,SEEK_SET);
char temp[CHDR_SIZE];
while (mFile.GetPosition() < cdirOffset + cdirSize)
{
SZipEntry ze;
mFile.Read(temp,CHDR_SIZE);
readCHeader(temp, ze);
if (ze.header != ZIP_CENTRAL_HEADER)
{
CLog::Log(LOGDEBUG,"ZipManager: broken file %s!",strFile.c_str());
mFile.Close();
return false;
}
// Get the filename just after the central file header
CStdString strName;
mFile.Read(strName.GetBuffer(ze.flength), ze.flength);
strName.ReleaseBuffer();
g_charsetConverter.unknownToUTF8(strName);
ZeroMemory(ze.name, 255);
strncpy(ze.name, strName.c_str(), strName.size()>254 ? 254 : strName.size());
// Jump after central file header extra field and file comment
mFile.Seek(ze.eclength + ze.clength,SEEK_CUR);
items.push_back(ze);
}
/* go through list and figure out file header lengths */
for(vector<SZipEntry>::iterator it = items.begin(); it != items.end(); ++it)
{
SZipEntry& ze = *it;
// Go to the local file header to get the extra field length
// !! local header extra field length != central file header extra field length !!
mFile.Seek(ze.lhdrOffset+28,SEEK_SET);
mFile.Read(&(ze.elength),2);
ze.elength = Endian_SwapLE16(ze.elength);
// Compressed data offset = local header offset + size of local header + filename length + local file header extra field length
ze.offset = ze.lhdrOffset + LHDR_SIZE + ze.flength + ze.elength;
}
mZipMap.insert(make_pair(strFile,items));
mFile.Close();
return true;
}
示例8: Parse
void CURL::Parse(const CStdString& strURL1)
{
Reset();
// start by validating the path
CStdString strURL = CUtil::ValidatePath(strURL1);
// strURL can be one of the following:
// format 1: protocol://[username:password]@hostname[:port]/directoryandfile
// format 2: protocol://file
// format 3: drive:directoryandfile
//
// first need 2 check if this is a protocol or just a normal drive & path
if (!strURL.size()) return ;
if (strURL.Equals("?", true)) return;
// form is format 1 or 2
// format 1: protocol://[domain;][username:password]@hostname[:port]/directoryandfile
// format 2: protocol://file
// decode protocol
int iPos = strURL.Find("://");
if (iPos < 0)
{
// This is an ugly hack that needs some work.
// example: filename /foo/bar.zip/alice.rar/bob.avi
// This should turn into zip://rar:///foo/bar.zip/alice.rar/bob.avi
iPos = 0;
bool is_apk = (strURL.Find(".apk/", iPos) > 0);
while (1)
{
if (is_apk)
iPos = strURL.Find(".apk/", iPos);
else
iPos = strURL.Find(".zip/", iPos);
int extLen = 3;
if (iPos < 0)
{
/* set filename and update extension*/
SetFileName(strURL);
return ;
}
iPos += extLen + 1;
CStdString archiveName = strURL.Left(iPos);
struct __stat64 s;
if (XFILE::CFile::Stat(archiveName, &s) == 0)
{
#ifdef TARGET_POSIX
if (!S_ISDIR(s.st_mode))
#else
if (!(s.st_mode & S_IFDIR))
#endif
{
Encode(archiveName);
if (is_apk)
{
CURL c((CStdString)"apk" + "://" + archiveName + '/' + strURL.Right(strURL.size() - iPos - 1));
*this = c;
}
else
{
CURL c((CStdString)"zip" + "://" + archiveName + '/' + strURL.Right(strURL.size() - iPos - 1));
*this = c;
}
return;
}
}
}
}
else
{
SetProtocol(strURL.Left(iPos));
iPos += 3;
}
// virtual protocols
// why not handle all format 2 (protocol://file) style urls here?
// ones that come to mind are iso9660, cdda, musicdb, etc.
// they are all local protocols and have no server part, port number, special options, etc.
// this removes the need for special handling below.
if (
m_strProtocol.Equals("stack") ||
m_strProtocol.Equals("virtualpath") ||
m_strProtocol.Equals("multipath") ||
m_strProtocol.Equals("filereader") ||
m_strProtocol.Equals("special")
)
{
SetFileName(strURL.Mid(iPos));
return;
}
// check for username/password - should occur before first /
if (iPos == -1) iPos = 0;
// for protocols supporting options, chop that part off here
// maybe we should invert this list instead?
int iEnd = strURL.length();
const char* sep = NULL;
//.........这里部分代码省略.........
示例9: Create
//.........这里部分代码省略.........
return new CAPKDirectory;
}
return NULL;
}
#endif
if (strExtension.Equals(".zip"))
{
CStdString strUrl;
URIUtils::CreateArchivePath(strUrl, "zip", strPath, "");
CFileItemList items;
CDirectory::GetDirectory(strUrl, items, strMask);
if (items.Size() == 0) // no files
pItem->m_bIsFolder = true;
else if (items.Size() == 1 && items[0]->m_idepth == 0)
{
// one STORED file - collapse it down
*pItem = *items[0];
}
else
{ // compressed or more than one file -> create a zip dir
pItem->SetPath(strUrl);
return new CZipDirectory;
}
return NULL;
}
if (strExtension.Equals(".rar") || strExtension.Equals(".001"))
{
CStdString strUrl;
URIUtils::CreateArchivePath(strUrl, "rar", strPath, "");
vector<CStdString> tokens;
CUtil::Tokenize(strPath,tokens,".");
if (tokens.size() > 2)
{
if (strExtension.Equals(".001"))
{
if (tokens[tokens.size()-2].Equals("ts")) // .ts.001 - treat as a movie file to scratch some users itch
return NULL;
}
CStdString token = tokens[tokens.size()-2];
if (token.Left(4).CompareNoCase("part") == 0) // only list '.part01.rar'
{
// need this crap to avoid making mistakes - yeyh for the new rar naming scheme :/
struct __stat64 stat;
int digits = token.size()-4;
CStdString strNumber, strFormat;
strFormat.Format("part%%0%ii",digits);
strNumber.Format(strFormat.c_str(),1);
CStdString strPath2=strPath;
strPath2.Replace(token,strNumber);
if (atoi(token.substr(4).c_str()) > 1 && CFile::Stat(strPath2,&stat) == 0)
{
pItem->m_bIsFolder = true;
return NULL;
}
}
}
CFileItemList items;
CDirectory::GetDirectory(strUrl, items, strMask);
if (items.Size() == 0) // no files - hide this
pItem->m_bIsFolder = true;
else if (items.Size() == 1 && items[0]->m_idepth == 0x30)
{
// one STORED file - collapse it down
示例10: Parse
////////////////////////////////////////////////////////////////////////////////////
// Function: Parse()
// Opens the .cue file for reading, and constructs the track database information
////////////////////////////////////////////////////////////////////////////////////
bool CCueDocument::Parse(const CStdString &strFile)
{
if (!m_file.Open(strFile))
return false;
CStdString strLine;
m_iTotalTracks = -1;
CStdString strCurrentFile = "";
bool bCurrentFileChanged = false;
int time;
// Run through the .CUE file and extract the tracks...
while (true)
{
if (!ReadNextLine(strLine))
break;
if (strLine.Left(7) == "INDEX 0")
{
// find the end of the number section
time = ExtractTimeFromIndex(strLine);
if (time == -1)
{ // Error!
OutputDebugString("Mangled Time in INDEX 0x tag in CUE file!\n");
return false;
}
if (m_iTotalTracks > 0) // Set the end time of the last track
m_Track[m_iTotalTracks - 1].iEndTime = time;
m_Track[m_iTotalTracks].iStartTime = time; // start time of the next track
}
else if (strLine.Left(5) == "TITLE")
{
if (m_iTotalTracks == -1) // No tracks yet
ExtractQuoteInfo(strLine, m_strAlbum);
else if (!ExtractQuoteInfo(strLine, m_Track[m_iTotalTracks].strTitle))
{
// lets manage tracks titles without quotes
CStdString titleNoQuote = strLine.Mid(5);
titleNoQuote.TrimLeft();
if (!titleNoQuote.IsEmpty())
{
g_charsetConverter.stringCharsetToUtf8(titleNoQuote);
m_Track[m_iTotalTracks].strTitle = titleNoQuote;
}
}
}
else if (strLine.Left(9) == "PERFORMER")
{
if (m_iTotalTracks == -1) // No tracks yet
ExtractQuoteInfo(strLine, m_strArtist);
else // New Artist for this track
ExtractQuoteInfo(strLine, m_Track[m_iTotalTracks].strArtist);
}
else if (strLine.Left(5) == "TRACK")
{
int iTrackNumber = ExtractNumericInfo(strLine.c_str() + 5);
m_iTotalTracks++;
CCueTrack track;
m_Track.push_back(track);
m_Track[m_iTotalTracks].strFile = strCurrentFile;
if (iTrackNumber > 0)
m_Track[m_iTotalTracks].iTrackNumber = iTrackNumber;
else
m_Track[m_iTotalTracks].iTrackNumber = m_iTotalTracks + 1;
bCurrentFileChanged = false;
}
else if (strLine.Left(4) == "FILE")
{
// already a file name? then the time computation will be changed
if(strCurrentFile.size() > 0)
bCurrentFileChanged = true;
ExtractQuoteInfo(strLine, strCurrentFile);
// Resolve absolute paths (if needed).
if (strCurrentFile.length() > 0)
ResolvePath(strCurrentFile, strFile);
}
else if (strLine.Left(25) == "REM REPLAYGAIN_ALBUM_GAIN")
m_replayGainAlbumGain = (float)atof(strLine.Mid(26));
else if (strLine.Left(25) == "REM REPLAYGAIN_ALBUM_PEAK")
m_replayGainAlbumPeak = (float)atof(strLine.Mid(26));
else if (strLine.Left(25) == "REM REPLAYGAIN_TRACK_GAIN" && m_iTotalTracks >= 0)
m_Track[m_iTotalTracks].replayGainTrackGain = (float)atof(strLine.Mid(26));
else if (strLine.Left(25) == "REM REPLAYGAIN_TRACK_PEAK" && m_iTotalTracks >= 0)
m_Track[m_iTotalTracks].replayGainTrackPeak = (float)atof(strLine.Mid(26));
}
// reset track counter to 0, and fill in the last tracks end time
m_iTrack = 0;
if (m_iTotalTracks > 0)
m_Track[m_iTotalTracks].iEndTime = 0;
//.........这里部分代码省略.........
示例11:
bool CCharsetConverter::isValidUtf8(const CStdString& str)
{
return isValidUtf8(str.c_str(), str.size());
}
示例12: GetDirectory
bool CRSSDirectory::GetDirectory(const CStdString& strPath, CFileItemList &items)
{
CLog::Log(LOGDEBUG,"CRSSDirectory::GetDirectory - path [%s]", strPath.c_str());
m_cacheDirectory = DIR_CACHE_ALWAYS;
CStdString strURL = strPath;
CStdString newURL;
CStdString strRoot = strPath;
if (CUtil::HasSlashAtEnd(strRoot))
strRoot.Delete(strRoot.size() - 1);
// If we have the items in the cache, return them
if (g_directoryCache.GetDirectory(strRoot, items))
{
return true;
}
// Remove the rss:// prefix and replace it with http://
if (strURL.Left(7) == "http://")
{
newURL = strURL;
}
else
{
strURL.Delete(0,6);
// if first symbol is '/', we have local file
if (strURL.Left(1) == "/")
{
newURL = "file://";
}
else
{
newURL = "http://";
}
newURL = newURL + strURL;
}
// Remove the last slash
if (CUtil::HasSlashAtEnd(newURL))
{
CUtil::RemoveSlashAtEnd(newURL);
}
// Create new thread and run the feed retreival from it
// In order to allow progress dialog and cancel operation
m_strUrl = newURL;
Crc32 crc;
crc.ComputeFromLowerCase(newURL);
CStdString strLocalFile;
strLocalFile.Format("special://temp/rss-%08x-%lu.xml", (unsigned __int32)crc, CTimeUtils::GetTimeMS());
CLog::Log(LOGDEBUG,"CRSSDirectory::GetDirectory - going to load url [%s] to file [%s]", newURL.c_str(), strLocalFile.c_str());
if (!BOXEE::Boxee::GetInstance().AsyncLoadUrl(newURL, _P(strLocalFile), "rss-load", NULL))
{
CGUIDialogOK::ShowAndGetInput(51014,0,0,0);
return false;
}
SDL_LockMutex(m_pOpFinishedMutex);
int result = SDL_CondWaitTimeout(m_pOpFinishedCond,m_pOpFinishedMutex,REQUEST_WAIT_PERIOD);
SDL_UnlockMutex(m_pOpFinishedMutex);
m_feed.GetItemList(items);
if (result != 0)
{
m_cacheDirectory = DIR_CACHE_NEVER;
// set this property so that the UI will handle the timeout
CLog::Log(LOGDEBUG,"CRSSDirectory::GetDirectory, loading timed out, path [%s] loaded:%d out of %d", strPath.c_str(), items.Size(),items.GetPageContext().m_itemsPerPage);
items.SetProperty("isRequestTimedOut",true);
}
CLog::Log(LOGDEBUG,"CRSSDirectory::GetDirectory - done loading url, got [%d] items (result=[%d])",items.Size(),result);
if (items.Size() == 0)
{
m_cacheDirectory = DIR_CACHE_NEVER;
return true;
}
else
{
CLog::Log(LOGDEBUG,"CRSSDirectory::GetDirectory - Going to add [DefaultSortLabel] property to each item. [path=%s][NumOfItems=%d] (vns)",strPath.c_str(),items.Size());
for(int i=0; i<items.Size(); i++)
{
CFileItemPtr item = items[i];
char pos[5];
sprintf(pos,"%d",i+1);
item->SetProperty("DefaultSortLabel",pos);
//CLog::Log(LOGDEBUG,"CRSSDirectory::GetDirectory - For item [path=%s] set property [DefaultSortLabel=%s] (vns)", (item->m_strPath).c_str(),(item->GetProperty("DefaultSortLabel")).c_str());
//.........这里部分代码省略.........
示例13: FillMusicTag
bool CLabelFormatter::FillMusicTag(const CStdString &fileName, CMusicInfoTag *tag) const
{
// run through and find static content to split the string up
int pos1 = fileName.Find(m_staticContent[0][0], 0);
if (pos1 == (int)CStdString::npos)
return false;
for (unsigned int i = 1; i < m_staticContent[0].size(); i++)
{
int pos2 = m_staticContent[0][i].size() ? fileName.Find(m_staticContent[0][i], pos1) : fileName.size();
if (pos2 == (int)CStdString::npos)
return false;
// found static content - thus we have the dynamic content surrounded
FillMusicMaskContent(m_dynamicContent[0][i - 1].m_content, fileName.Mid(pos1, pos2 - pos1), tag);
pos1 = pos2 + m_staticContent[0][i].size();
}
return true;
}
示例14: AddAudioStreams
void CGUIDialogAudioSubtitleSettings::AddAudioStreams(unsigned int id)
{
SettingInfo setting;
setting.id = id;
setting.name = g_localizeStrings.Get(460);
setting.type = SettingInfo::SPIN;
setting.min = 0;
setting.data = &m_audioStream;
// get the number of audio strams for the current movie
setting.max = (float)g_application.m_pPlayer->GetAudioStreamCount() - 1;
m_audioStream = g_application.m_pPlayer->GetAudioStream();
if( m_audioStream < 0 ) m_audioStream = 0;
// check if we have a single, stereo stream, and if so, allow us to split into
// left, right or both
if (!setting.max)
{
CStdString strAudioInfo;
g_application.m_pPlayer->GetAudioInfo(strAudioInfo);
int iNumChannels = atoi(strAudioInfo.Right(strAudioInfo.size() - strAudioInfo.Find("chns:") - 5).c_str());
CStdString strAudioCodec = strAudioInfo.Mid(7, strAudioInfo.Find(") VBR") - 5);
bool bDTS = strstr(strAudioCodec.c_str(), "DTS") != 0;
bool bAC3 = strstr(strAudioCodec.c_str(), "AC3") != 0;
if (iNumChannels == 2 && !(bDTS || bAC3))
{ // ok, enable these options
/* if (g_settings.m_currentVideoSettings.m_AudioStream == -1)
{ // default to stereo stream
g_settings.m_currentVideoSettings.m_AudioStream = 0;
}*/
setting.max = 2;
for (int i = 0; i <= setting.max; i++)
setting.entry.push_back(make_pair(setting.entry.size(), g_localizeStrings.Get(13320 + i)));
m_audioStream = -g_settings.m_currentVideoSettings.m_AudioStream - 1;
m_settings.push_back(setting);
return;
}
}
// cycle through each audio stream and add it to our list control
for (int i = 0; i <= setting.max; ++i)
{
CStdString strItem;
CStdString strName;
g_application.m_pPlayer->GetAudioStreamName(i, strName);
if (strName.length() == 0)
strName = "Unnamed";
strItem.Format("%s (%i/%i)", strName.c_str(), i + 1, (int)setting.max + 1);
setting.entry.push_back(make_pair(setting.entry.size(), strItem));
}
if( setting.max < 0 )
{
setting.max = 0;
setting.entry.push_back(make_pair(setting.entry.size(), g_localizeStrings.Get(231)));
}
m_settings.push_back(setting);
}
示例15: Connect
bool XLCDproc::Connect()
{
CloseSocket();
struct hostent *server;
server = gethostbyname(g_advancedSettings.m_lcdHostName);
if (server == NULL)
{
CLog::Log(LOGERROR, "XLCDproc::%s - Unable to resolve LCDd host.", __FUNCTION__);
return false;
}
m_sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (m_sockfd == -1)
{
CLog::Log(LOGERROR, "XLCDproc::%s - Unable to create socket.", __FUNCTION__);
return false;
}
struct sockaddr_in serv_addr = {};
serv_addr.sin_family = AF_INET;
memmove(&serv_addr.sin_addr, server->h_addr_list[0], server->h_length);
//Connect to default LCDd port, hard coded for now.
serv_addr.sin_port = htons(13666);
if (connect(m_sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) == -1)
{
CLog::Log(LOGERROR, "XLCDproc::%s - Unable to connect to host, LCDd not running?", __FUNCTION__);
return false;
}
// Start a new session
CStdString hello;
hello = "hello\n";
if (write(m_sockfd,hello.c_str(),hello.size()) == -1)
{
CLog::Log(LOGERROR, "XLCDproc::%s - Unable to write to socket", __FUNCTION__);
return false;
}
// Receive LCDproc data to determine row and column information
char reply[1024];
if (read(m_sockfd,reply,1024) == -1)
{
CLog::Log(LOGERROR, "XLCDproc::%s - Unable to read from socket", __FUNCTION__);
return false;
}
unsigned int i=0;
while ((strncmp("lcd",reply + i,3) != 0 ) && (i < (strlen(reply) - 5))) i++;
if(sscanf(reply+i,"lcd wid %u hgt %u", &m_iColumns, &m_iRows))
CLog::Log(LOGDEBUG, "XLCDproc::%s - LCDproc data: Columns %i - Rows %i.", __FUNCTION__, m_iColumns, m_iRows);
//Build command to setup screen
CStdString cmd;
cmd = "screen_add xbmc\n";
if (!g_advancedSettings.m_lcdHeartbeat)
cmd.append("screen_set xbmc -heartbeat off\n");
if (g_advancedSettings.m_lcdScrolldelay != 0)
{
cmd.append("widget_add xbmc line1 scroller\n");
cmd.append("widget_add xbmc line2 scroller\n");
cmd.append("widget_add xbmc line3 scroller\n");
cmd.append("widget_add xbmc line4 scroller\n");
}
else
{
cmd.append("widget_add xbmc line1 string\n");
cmd.append("widget_add xbmc line2 string\n");
cmd.append("widget_add xbmc line3 string\n");
cmd.append("widget_add xbmc line4 string\n");
}
//Send to server
if (write(m_sockfd,cmd.c_str(),cmd.size()) == -1)
{
CLog::Log(LOGERROR, "XLCDproc::%s - Unable to write to socket", __FUNCTION__);
return false;
}
return true;
}