/* -*-C++-*-
 *****************************************************************************
 *
 * File:         ComMPLoc.h
 * Description:  This class parses a string representing an MP file,
 *		 subvol (a/k/a MPLOC), volume, or system, using NSK syntax,
 *		 with certain defaults allowed.
 *
 *		 An ODBC SHORTANSI string can also be parsed, resulting
 *		 in an MPLOC.
 *
 *		 See ComMPLoc::parse() in the .cpp file for details.
 *               
 * Created:      7/1/99
 * Language:     C++
 *
 *
// @@@ START COPYRIGHT @@@
//
// 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.
//
// @@@ END COPYRIGHT @@@
 *
 *****************************************************************************
 */


#ifndef _COM_MP_LOC_H_
#define _COM_MP_LOC_H_

#include "ComSmallDefs.h"
#include "Platform.h"

NA_EIDPROC inline ComBoolean  IsMPLocPrefix(const char c)
  { return c == '$' || c == '\\'; }

NA_EIDPROC inline ComBoolean  IsMPLocPrefix(const unsigned char c)
  { return c == '$' || c == '\\'; }

NA_EIDPROC inline ComBoolean  HasMPLocPrefix(const char *s)
  { return IsMPLocPrefix(*s); }

NA_EIDPROC inline const char *ChopMPLocPrefix(const char *s)
  { return HasMPLocPrefix(s) ? &s[1] : s; }

// Max length of an externally formatted name
// of "numparts" parts and "numparts-1" dots.
#define ComMPLoc_NAMELEN(numparts)	\
	(size_t(numparts * ComMPLoc::MAX_NAMEPART_LEN + numparts-1))

class ComMPLoc
{
  // ---------------------------------------------------------------------
  // Friend Functions:
  // ---------------------------------------------------------------------
   friend ostream &operator<< (ostream &s, const ComMPLoc &name);

  // ---------------------------------------------------------------------
  // Public Methods:
  // ---------------------------------------------------------------------
   public:

   enum			{ MAX_NAMEPART_LEN = 8 };

   enum Format		{ INVALID = -99,
   			  UNKNOWN = 0,
   			  SYS = 1,	// "\SYS" has 1 name part,
			  VOL = 2,	// "$VOL" is the 2nd part,
			  SUBVOL = 3,	// and so forth
			  FILE = 4,
			  FULLFILE = -FILE
			};

   ComMPLoc     ();
   ComMPLoc     (const ComString &nam);
   ComMPLoc     (const ComString &nam, Format fmt);

   void parse   (const ComString &nam, Format fmt,
   		 ComBoolean shortAnsi = FALSE);
   void reparse (Format fmt, ComBoolean shortAnsi = FALSE)
   					  {parse(getMPName(), fmt, shortAnsi);}

   const ComString &getSysDotVol () const {return sysdotvol_;}
   const ComString &getSystemName() const {return system_;}
   const ComString &getVolumeName() const {return volume_;}
   const ComString &getSubvolName() const {return subvol_;}
   const ComString &getFileName  () const {return file_;}

   ComBoolean hasSystemName() const	  {return !system_.isNull();}
   ComBoolean hasVolumeName() const	  {return !volume_.isNull();}
   ComBoolean hasSubvolName() const	  {return !subvol_.isNull();}
   ComBoolean hasFileName  () const	  {return !file_.isNull();}

   ComBoolean isValid(Format fmt);
   Format     getFormat() const		  {return format_;}
   void	      setUnknown()		  {format_ = UNKNOWN;}
   ComBoolean getAsSubvol();

   ComString getMPName() const;
   ComString getMPName(size_t *lenArray /* array[5] */ ) const;
   ComString getOSSName() const;

   Int32  applyDefaults(const ComMPLoc &defaults,
		      ComBoolean emptySystemNameMatchCountsAsAMatch=FALSE);

   void initializeSystemName(ComBoolean ignoreNADefaults = FALSE);

  // ---------------------------------------------------------------------
  // Private Members:
  // ---------------------------------------------------------------------
   private:

   Format    format_;
   ComString sysdotvol_;	//  \<sys>.$<vol>  (e.g.  \AZTEC.$SQL)
   ComString system_;
   ComString volume_;
   ComString subvol_;
   ComString file_;
};

#endif // _COM_MP_LOC_H_
