mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-12-18 22:15:51 +01:00
133 lines
3.8 KiB
C++
133 lines
3.8 KiB
C++
#include <precomp.h>
|
|
#include "fileread.h"
|
|
#include <api/service/svc_enum.h>
|
|
|
|
void *FileReaders::open(const wchar_t *filename, const wchar_t *mode) {
|
|
int m=0;
|
|
|
|
const wchar_t *p=mode;
|
|
wchar_t c;
|
|
while(c=*(p++))
|
|
{
|
|
switch(c)
|
|
{
|
|
case 'r': m=SvcFileReader::READ; break;
|
|
case 'w': m=SvcFileReader::WRITE; break;
|
|
case 'a': m=SvcFileReader::APPEND; break;
|
|
case '+': m|=SvcFileReader::PLUS; break;
|
|
case 'b': m|=SvcFileReader::BINARY; break;
|
|
case 't': m|=SvcFileReader::TEXT; break;
|
|
}
|
|
}
|
|
|
|
return FileReaderEnum(filename, m).getFirst();
|
|
}
|
|
|
|
void FileReaders::close(void *handle)
|
|
{
|
|
svc_fileReader *fr=(svc_fileReader *)handle;
|
|
fr->close();
|
|
SvcEnum::release(fr);
|
|
}
|
|
|
|
size_t FileReaders::read(void *buffer, size_t size, void *handle)
|
|
{
|
|
svc_fileReader *fr=(svc_fileReader *)handle;
|
|
return fr->read((int8_t *)buffer,size);
|
|
}
|
|
|
|
size_t FileReaders::write(const void *buffer, size_t size, void *handle)
|
|
{
|
|
svc_fileReader *fr=(svc_fileReader *)handle;
|
|
return fr->write((int8_t *)buffer,size);
|
|
}
|
|
|
|
int FileReaders::seek(int64_t offset, int origin, void *handle)
|
|
{
|
|
svc_fileReader *fr=(svc_fileReader *)handle;
|
|
if(!fr->canSeek()) return -1;
|
|
if(origin==SEEK_SET) return fr->seek(offset);
|
|
if(origin==SEEK_CUR) return fr->seek(fr->getPos()+offset);
|
|
return fr->seek(fr->getLength()-offset);
|
|
}
|
|
|
|
uint64_t FileReaders::tell(void *handle)
|
|
{
|
|
svc_fileReader *fr=(svc_fileReader *)handle;
|
|
return fr->getPos();
|
|
}
|
|
|
|
uint64_t FileReaders::getFileSize(void *handle)
|
|
{
|
|
svc_fileReader *fr=(svc_fileReader *)handle;
|
|
return fr->getLength();
|
|
}
|
|
|
|
int FileReaders::exists(const wchar_t *filename) {
|
|
// Note that we do not do a system lock on the service since we can just
|
|
// release it directly via the factory
|
|
waService *s;
|
|
for(int i=0;s=WASABI_API_SVC->service_enumService(WaSvc::FILEREADER,i);i++) {
|
|
svc_fileReader *fr=(svc_fileReader *)s->getInterface(FALSE);
|
|
if(fr->isMine(filename) == 1 || fr->open(filename)) {
|
|
int ret=fr->exists(filename);
|
|
fr->close();
|
|
s->releaseInterface(fr); fr = NULL;
|
|
return ret;
|
|
}
|
|
s->releaseInterface(fr); fr = NULL;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int FileReaders::remove(const wchar_t *filename) {
|
|
// Note that we do not do a system lock on the service since we can just
|
|
// release it directly via the factory
|
|
waService *s;
|
|
for(int i=0;s=WASABI_API_SVC->service_enumService(WaSvc::FILEREADER,i);i++) {
|
|
svc_fileReader *fr=(svc_fileReader *)s->getInterface(FALSE);
|
|
if (fr->isMine(filename) == 1 || fr->open(filename)) {
|
|
fr->close();
|
|
int ret = fr->remove(filename);
|
|
s->releaseInterface(fr); fr = NULL;
|
|
return ret;
|
|
}
|
|
s->releaseInterface(fr); fr = NULL;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int FileReaders::removeUndoable(const wchar_t *filename) {
|
|
// Note that we do not do a system lock on the service since we can just
|
|
// release it directly via the factory
|
|
waService *s;
|
|
for(int i=0;s=WASABI_API_SVC->service_enumService(WaSvc::FILEREADER,i);i++) {
|
|
svc_fileReader *fr=(svc_fileReader *)s->getInterface(FALSE);
|
|
if(fr->isMine(filename) == 1 || fr->open(filename)) {
|
|
fr->close();
|
|
int ret = fr->removeUndoable(filename);
|
|
s->releaseInterface(fr); fr = NULL;
|
|
return ret;
|
|
}
|
|
s->releaseInterface(fr); fr = NULL;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int FileReaders::move(const wchar_t *filename, const wchar_t *destfilename) {
|
|
// Note that we do not do a system lock on the service since we can just
|
|
// release it directly via the factory
|
|
waService *s;
|
|
for(int i=0;s=WASABI_API_SVC->service_enumService(WaSvc::FILEREADER,i);i++) {
|
|
svc_fileReader *fr=(svc_fileReader *)s->getInterface(FALSE);
|
|
if(fr->isMine(filename) == 1 || fr->open(filename)) {
|
|
fr->close();
|
|
int ret = fr->move(filename,destfilename);
|
|
s->releaseInterface(fr); fr = NULL;
|
|
return ret;
|
|
}
|
|
s->releaseInterface(fr); fr = NULL;
|
|
}
|
|
return 0;
|
|
}
|