Cygwin: path_conv: add serialization/deserialization facility
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
parent
26d9536893
commit
91b264c76c
@ -1258,6 +1258,70 @@ path_conv::check (const char *src, unsigned opt,
|
|||||||
__endtry
|
__endtry
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct pc_flat
|
||||||
|
{
|
||||||
|
path_conv pc;
|
||||||
|
HANDLE hdl;
|
||||||
|
size_t name_len;
|
||||||
|
size_t posix_len;
|
||||||
|
char data[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
void *
|
||||||
|
path_conv::serialize (HANDLE h, unsigned int &n) const
|
||||||
|
{
|
||||||
|
pc_flat *pcf;
|
||||||
|
size_t nlen = 0, plen = 0;
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
if (path)
|
||||||
|
nlen = strlen (path) + 1;
|
||||||
|
if (posix_path)
|
||||||
|
plen = strlen (posix_path) + 1;
|
||||||
|
n = sizeof (pc_flat) + nlen + plen;
|
||||||
|
pcf = (pc_flat *) cmalloc (HEAP_COMMUNE, n);
|
||||||
|
if (!pcf)
|
||||||
|
{
|
||||||
|
n = 0;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
memcpy (&pcf->pc, this, sizeof *this);
|
||||||
|
pcf->hdl = h;
|
||||||
|
pcf->name_len = nlen;
|
||||||
|
pcf->posix_len = plen;
|
||||||
|
p = pcf->data;
|
||||||
|
if (nlen)
|
||||||
|
p = stpcpy (p, path) + 1;
|
||||||
|
if (plen)
|
||||||
|
stpcpy (p, posix_path);
|
||||||
|
return pcf;
|
||||||
|
}
|
||||||
|
|
||||||
|
HANDLE
|
||||||
|
path_conv::deserialize (void *bufp)
|
||||||
|
{
|
||||||
|
pc_flat *pcf = (pc_flat *) bufp;
|
||||||
|
char *p;
|
||||||
|
HANDLE ret;
|
||||||
|
|
||||||
|
memcpy (this, &pcf->pc, sizeof *this);
|
||||||
|
wide_path = uni_path.Buffer = NULL;
|
||||||
|
uni_path.MaximumLength = uni_path.Length = 0;
|
||||||
|
path = posix_path = NULL;
|
||||||
|
p = pcf->data;
|
||||||
|
if (pcf->name_len)
|
||||||
|
{
|
||||||
|
set_path (p);
|
||||||
|
p += pcf->name_len;
|
||||||
|
}
|
||||||
|
if (pcf->posix_len)
|
||||||
|
set_posix (p);
|
||||||
|
dev.parse (pcf->pc.dev);
|
||||||
|
ret = pcf->hdl;
|
||||||
|
cfree (bufp);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
path_conv::~path_conv ()
|
path_conv::~path_conv ()
|
||||||
{
|
{
|
||||||
if (posix_path)
|
if (posix_path)
|
||||||
|
@ -160,6 +160,9 @@ class path_conv
|
|||||||
int error;
|
int error;
|
||||||
device dev;
|
device dev;
|
||||||
|
|
||||||
|
void *serialize (HANDLE, unsigned int &) const;
|
||||||
|
HANDLE deserialize (void *);
|
||||||
|
|
||||||
const char *known_suffix () { return suffix; }
|
const char *known_suffix () { return suffix; }
|
||||||
bool isremote () const {return fs.is_remote_drive ();}
|
bool isremote () const {return fs.is_remote_drive ();}
|
||||||
ULONG objcaseinsensitive () const {return caseinsensitive;}
|
ULONG objcaseinsensitive () const {return caseinsensitive;}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user