blob: 14b93c73b6be8bd2a728e397613507f99f1dc592 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#include <precomp.h>
#include <cosv/ploc.hxx>
// NOT FULLY DECLARED SERVICES
#include <ctype.h>
#include <cosv/bstream.hxx>
#include <cosv/csv_ostream.hxx>
namespace csv
{
namespace ploc
{
class UnixRootDir : public Root
{
public:
UnixRootDir();
virtual void Get(
ostream & o_rPath ) const;
virtual void Get(
bostream & o_rPath ) const;
virtual DYN Root * CreateCopy() const;
virtual const char *
OwnDelimiter() const;
};
class WorkingDir : public Root
{
public:
WorkingDir(
const char * i_sDelimiter = Delimiter() );
virtual void Get(
ostream & o_rPath ) const;
virtual void Get(
bostream & o_rPath ) const;
virtual DYN Root * CreateCopy() const;
virtual const char *
OwnDelimiter() const;
private:
String sOwnDelimiter;
};
class WinRootDir : public Root
{
public:
WinRootDir();
virtual void Get(
ostream & o_rPath ) const;
virtual void Get(
bostream & o_rPath ) const;
virtual DYN Root * CreateCopy() const;
virtual const char *
OwnDelimiter() const;
};
class WinDrive : public Root
{
public:
WinDrive(
char i_cDrive );
virtual void Get(
ostream & o_rPath ) const;
virtual void Get(
bostream & o_rPath ) const;
virtual DYN Root * CreateCopy() const;
virtual const char *
OwnDelimiter() const;
private:
char cDrive;
};
class WinDriveRootDir : public Root
{
public:
WinDriveRootDir(
const char * i_sPath );
WinDriveRootDir(
char i_cDrive );
virtual void Get(
ostream & o_rPath ) const;
virtual void Get(
bostream & o_rPath ) const;
virtual DYN Root * CreateCopy() const;
virtual const char *
OwnDelimiter() const;
private:
char cDrive;
};
class UNCRoot : public Root
{
public:
UNCRoot(
const char * i_sPath );
UNCRoot(
const String & i_sComputer,
const String & i_sEntryPt );
virtual void Get(
ostream & o_rPath ) const;
virtual void Get(
bostream & o_rPath ) const;
virtual DYN Root * CreateCopy() const;
virtual const char *
OwnDelimiter() const;
private:
String sComputer;
String sEntryPt;
};
class InvalidRoot : public Root
{
public:
virtual void Get(
ostream & o_rPath ) const;
virtual void Get(
bostream & o_rPath ) const;
virtual DYN Root * CreateCopy() const;
virtual const char *
OwnDelimiter() const;
};
DYN Root *
Create_WindowsRoot( const char * & o_sPathAfterRoot,
const char * i_sPath )
{
if (i_sPath[0] == '\\')
{
if (i_sPath[1] == '\\')
{ // UNC path name
o_sPathAfterRoot = strchr(i_sPath+2,'\\');
if (o_sPathAfterRoot != 0)
{
o_sPathAfterRoot = strchr(o_sPathAfterRoot+1,'\\');
if (o_sPathAfterRoot != 0)
++o_sPathAfterRoot;
return new UNCRoot(i_sPath);
}
return new InvalidRoot; // Incomplete UNC root.
}
else
{
o_sPathAfterRoot = i_sPath+1;
return new WinRootDir;
}
}
else if (i_sPath[1] == ':')
{
if ( i_sPath[2] == '\\')
{
o_sPathAfterRoot = i_sPath + 3;
return new WinDriveRootDir(i_sPath);
}
else
{
o_sPathAfterRoot = i_sPath + 2;
return new WinDrive(*i_sPath);
}
}
else
{
o_sPathAfterRoot = i_sPath;
return new WorkingDir("\\");
}
}
DYN Root *
Create_UnixRoot( const char * & o_sPathAfterRoot,
const char * i_sPath )
{
if (*i_sPath == '/')
{
o_sPathAfterRoot = i_sPath + 1;
return new UnixRootDir;
}
else //
{
o_sPathAfterRoot = i_sPath;
return new WorkingDir("/");
} // endif
}
//********************** Root ****************************//
Root::~Root()
{
}
DYN Root *
Root::Create_( const char * & o_sPathAfterRoot,
const char * i_sPath,
const char * i_sDelimiter )
{
if (i_sPath[0] == '.')
{
switch ( i_sPath[1] )
{
case '\0': o_sPathAfterRoot = i_sPath + 1;
break;
case '\\': o_sPathAfterRoot = i_sPath + 2;
break;
case '/': o_sPathAfterRoot = i_sPath + 2;
break;
case '.': o_sPathAfterRoot = i_sPath;
break;
default:
o_sPathAfterRoot = 0;
return new InvalidRoot;
} // end switch (i_sPath[1])
return new WorkingDir;
} // end if (i_sPath[0] == '.')
switch (*i_sDelimiter)
{
case '\\': return Create_WindowsRoot(o_sPathAfterRoot, i_sPath);
case '/': return Create_UnixRoot(o_sPathAfterRoot, i_sPath);
}
o_sPathAfterRoot = 0;
return new InvalidRoot;
}
//********************** UnixRootDir ****************************//
UnixRootDir::UnixRootDir()
{
}
void
UnixRootDir::Get( ostream & o_rPath ) const
{
o_rPath << '/';
}
void
UnixRootDir::Get( bostream & o_rPath ) const
{
o_rPath.write( "/", 1 );
}
DYN Root *
UnixRootDir::CreateCopy() const
{
return new UnixRootDir;
}
const char *
UnixRootDir::OwnDelimiter() const
{
return "/";
}
//********************** WorkingDir ****************************//
WorkingDir::WorkingDir( const char * i_sDelimiter )
: sOwnDelimiter(i_sDelimiter)
{
}
void
WorkingDir::Get( ostream & o_rPath ) const
{
o_rPath << '.' << sOwnDelimiter;
}
void
WorkingDir::Get( bostream & o_rPath ) const
{
o_rPath.write( ".", 1 );
o_rPath.write( sOwnDelimiter );
}
DYN Root *
WorkingDir::CreateCopy() const
{
return new WorkingDir(sOwnDelimiter);
}
const char *
WorkingDir::OwnDelimiter() const
{
return sOwnDelimiter;
}
//********************** WinRootDir ****************************//
WinRootDir::WinRootDir()
{
}
void
WinRootDir::Get( ostream & o_rPath ) const
{
o_rPath << '\\';
}
void
WinRootDir::Get( bostream & o_rPath ) const
{
o_rPath.write( "\\", 1 );
}
DYN Root *
WinRootDir::CreateCopy() const
{
return new WinRootDir;
}
const char *
WinRootDir::OwnDelimiter() const
{
return "\\";
}
//********************** WinDrive ****************************//
WinDrive::WinDrive( char i_cDrive )
: cDrive(static_cast< char >(toupper(i_cDrive)))
{
}
void
WinDrive::Get( ostream & o_rPath ) const
{
o_rPath << cDrive << ':';
}
void
WinDrive::Get( bostream & o_rPath ) const
{
static char buf_[3] = " :";
buf_[0] = cDrive;
o_rPath.write( &buf_[0], 2 );
}
DYN Root *
WinDrive::CreateCopy() const
{
return new WinDrive(cDrive);
}
const char *
WinDrive::OwnDelimiter() const
{
return "\\";
}
//********************** WinDriveRootDir ****************************//
WinDriveRootDir::WinDriveRootDir( const char * i_sPath )
: cDrive(static_cast< char >(toupper(*i_sPath)))
{
if ( 'A' > cDrive OR 'Z' < cDrive )
cDrive = 0;
}
WinDriveRootDir::WinDriveRootDir( char i_cDrive )
: cDrive(i_cDrive)
{
}
void
WinDriveRootDir::Get( ostream & o_rPath ) const
{
o_rPath << cDrive << ":\\";
}
void
WinDriveRootDir::Get( bostream & o_rPath ) const
{
static char buf_[4] = " :\\";
buf_[0] = cDrive;
o_rPath.write( &buf_[0], 3 );
}
DYN Root *
WinDriveRootDir::CreateCopy() const
{
return new WinDriveRootDir(cDrive);
}
const char *
WinDriveRootDir::OwnDelimiter() const
{
return "\\";
}
//********************** UNCRoot ****************************//
UNCRoot::UNCRoot( const char * i_sPath )
// : // sComputer,
// sEntryPt
{
const char * pRestPath = i_sPath + 2;
const char * pDirEnd = strchr(pRestPath, '\\');
csv_assert(pDirEnd != 0);
sComputer = String(pRestPath, pDirEnd - pRestPath);
pRestPath = pDirEnd+1;
pDirEnd = strchr(pRestPath, '\\');
if ( pDirEnd != 0 )
{
sEntryPt = String(pRestPath, pDirEnd - pRestPath);
}
else
{
sEntryPt = pRestPath;
}
}
UNCRoot::UNCRoot( const String & i_sComputer,
const String & i_sEntryPt )
: sComputer(i_sComputer),
sEntryPt(i_sEntryPt)
{
}
void
UNCRoot::Get( ostream & o_rPath ) const
{
o_rPath << "\\\\" << sComputer << '\\' << sEntryPt << "\\";
}
void
UNCRoot::Get( bostream & o_rPath ) const
{
o_rPath.write( "\\\\", 2 );
o_rPath.write( sComputer );
o_rPath.write( "\\", 1 );
o_rPath.write( sEntryPt );
o_rPath.write( "\\", 1 );
}
DYN Root *
UNCRoot::CreateCopy() const
{
return new UNCRoot(sComputer,sEntryPt);
}
const char *
UNCRoot::OwnDelimiter() const
{
return "\\";
}
//********************** InvalidRoot ****************************//
void
InvalidRoot::Get( ostream & ) const
{
}
void
InvalidRoot::Get( bostream & ) const
{
}
DYN Root *
InvalidRoot::CreateCopy() const
{
return new InvalidRoot;
}
const char *
InvalidRoot::OwnDelimiter() const
{
return 0;
}
} // namespace ploc
} // namespace csv