📄 pmp300.cpp
字号:
PLMEvent event;
event.type = kPLMEvent_Done;
function(&event, cookie);
}
}
}
}
return result;
}
Error PMP300::ReadPlaylist(DeviceInfo* device,
vector<PlaylistItem*>* list,
PLMCallBackFunction function,
void* cookie)
{
Error result = kError_InvalidParam;
assert(device);
assert(list);
if(device && list)
{
result = kError_DeviceNotFound;
if(!strcasecmp(device->GetDevice(), devices[0].device))
{
CRio rio;
bool rioPresent = false;
rioPresent = FindRio(rio, device, function, cookie);
if(rioPresent)
{
uint32 totalMem, usedMem;
if(function)
{
PLMEvent event;
event.type = kPLMEvent_Status;
event.eventString += "A ";
event.eventString = device->GetDevice();
event.eventString += " has been found. Scanning internal memory...";
function(&event, cookie);
}
result = privateReadPlaylist(rio,
false,
&totalMem,
&usedMem,
list,
function,
cookie);
if(IsntError(result))
{
uint32 externalTotal, externalUsed;
if(function)
{
PLMEvent event;
event.type = kPLMEvent_Status;
event.eventString = " Scanning external memory...";
function(&event, cookie);
}
rio.UseExternalFlash(true);
privateReadPlaylist(rio,
true,
&externalTotal,
&externalUsed,
list,
function,
cookie);
totalMem += externalTotal;
usedMem += externalUsed;
rio.UseExternalFlash(false);
}
device->SetNumEntries(list->size());
device->SetCapacity(totalMem, usedMem);
if(function)
{
PLMEvent event;
event.type = kPLMEvent_Done;
function(&event, cookie);
}
}
}
}
return result;
}
Error PMP300::WritePlaylist(DeviceInfo* device,
vector<PlaylistItem*>* list,
PLMCallBackFunction function,
void* cookie)
{
Error result = kError_InvalidParam;
assert(device);
assert(list);
if(device && list)
{
result = kError_DeviceNotFound;
if(!strcasecmp(device->GetDevice(), devices[0].device))
{
CRio rioInternal, rioExternal;
bool rioPresent = false;
rioPresent = FindRio(rioInternal, device, function, cookie);
if(rioPresent)
{
FindRio(rioExternal, device, function, cookie);
rioExternal.UseExternalFlash(true);
if(function)
{
PLMEvent event;
event.type = kPLMEvent_Status;
event.eventString += "A ";
event.eventString = device->GetDevice();
event.eventString += " has been found. Scanning internal memory...";
function(&event, cookie);
}
vector<PlaylistItem*> origInternal;
vector<PlaylistItem*> origExternal;
vector<PlaylistItem*> newInternal;
vector<PlaylistItem*> newExternal;
uint32 externalTotal = 0, internalTotal = 0, usedMem;
uint32 count, index;
char* path = new char[_MAX_PATH];
char* tempPath = new char[_MAX_PATH];
uint32 length = _MAX_PATH;
// get a temp path
m_context->prefs->GetInstallDirectory(tempPath, &length);
strcat(tempPath, tmpnam(NULL));
#ifdef WIN32
mkdir(tempPath);
#else
mkdir(tempPath, S_IRWXU);
#endif
// first get current state of device
// we break our lists into internal and
// external lists for ease of organizing
result = privateReadPlaylist(rioInternal,
false,
&internalTotal,
&usedMem,
&origInternal,
function,
cookie);
if(IsntError(result))
{
if(function)
{
PLMEvent event;
event.type = kPLMEvent_Status;
event.eventString = "Scanning external memory...";
function(&event, cookie);
}
privateReadPlaylist(rioExternal,
true,
&externalTotal,
&usedMem,
&origExternal,
function,
cookie);
}
count = list->size();
bool useExternal = false;
for(index = 0; index < count; index++)
{
PlaylistItem* item = (*list)[index];
if(item)
{
MetaData metadata = item->GetMetaData();
int32 size = metadata.Size();
if(!size)
{
struct stat st;
length = _MAX_PATH;
URLToFilePath(item->URL().c_str(), path, &length);
if(!stat(path, &st))
size = st.st_size;
else
{
result = kError_FileNoAccess;
break;
}
}
// figure out where to put it...
uint32* memorySize;
vector<PlaylistItem*>* addList;
if(!useExternal)
{
memorySize = &internalTotal;
addList = &newInternal;
if(*memorySize < (uint32)size)
useExternal = true;
else
*memorySize -= size;
}
if(useExternal)
{
memorySize = &externalTotal;
addList = &newExternal;
if(*memorySize < (uint32)size)
break;
else
*memorySize -= size;
}
addList->push_back(item);
}
}
// if all is well we delete old files
// and temporarily download files
// that are being moved from internal
// to external and vice versa...
if(IsntError(result))
{
if(function)
{
PLMEvent event;
event.type = kPLMEvent_Status;
event.eventString = "Deleting files...";
function(&event, cookie);
}
count = origInternal.size();
for(index = 0; index < count; index++)
{
PlaylistItem* item = origInternal[index];
if(find_if(newInternal.begin(),
newInternal.end(),
PlaylistItemCompare(item)) == newInternal.end())
{
// need to delete it
vector<PlaylistItem*>::iterator position;
if((position = find_if(newExternal.begin(),
newExternal.end(),
PlaylistItemCompare(item))) != newExternal.end())
{
// need to download it to temp file first
// and then upload it to other card
// in the next stage...
string itemPath = item->URL();
string downloadPath = tempPath;
downloadPath += DIR_MARKER_STR;
downloadPath.insert(downloadPath.size(),
itemPath,
itemPath.rfind('/') + 1,
itemPath.size());
RioProgressStruct ps;
memset(&ps, 0x00, sizeof(ps));
ps.function = function;
ps.cookie = cookie;
ps.item = item;
if(!rioInternal.RxFile(downloadPath.c_str(), rioProgress, &ps))
{
if(function)
{
PLMEvent event;
event.type = kPLMEvent_Error;
event.data.errorData.errorCode = rioInternal.GetErrorID();
event.eventString = "Download failed, ";
event.eventString += rioInternal.GetErrorStr();
function(&event, cookie);
}
if(rioInternal.GetErrorID() == CRIO_ERROR_INTERRUPTED)
result = kError_UserCancel;
else
result = kError_UnknownErr;
break;
}
length = _MAX_PATH;
FilePathToURL(downloadPath.c_str(), path, &length);
(*position)->SetURL(path);
}
string::size_type pos = item->URL().rfind("/") + 1;
const char* cp = item->URL().c_str();
if(!rioInternal.RemoveFile(cp + pos))
{
if(function)
{
PLMEvent event;
event.type = kPLMEvent_Error;
event.data.errorData.errorCode = rioInternal.GetErrorID();
event.eventString = "Delete failed, ";
event.eventString += rioInternal.GetErrorStr();
function(&event, cookie);
}
result = kError_UnknownErr;
break;
}
delete item;
origInternal[index] = NULL;
}
}
if(IsntError(result))
{
count = origExternal.size();
for(index = 0; index < count; index++)
{
PlaylistItem* item = origExternal[index];
if(find_if(newExternal.begin(),
newExternal.end(),
PlaylistItemCompare(item)) == newExternal.end())
{
// need to delete it
vector<PlaylistItem*>::iterator position;
if((position = find_if(newInternal.begin(),
newInternal.end(),
PlaylistItemCompare(item))) != newInternal.end())
{
// need to download it to temp file first
// and then upload it to other card
// in the next stage...
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -