pipechan.cxx
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:6k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * pipechan.cxx
  3.  *
  4.  * Sub-process communicating with pipe I/O channel class
  5.  *
  6.  * Portable Windows Library
  7.  *
  8.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Portable Windows Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  25.  * All Rights Reserved.
  26.  *
  27.  * Contributor(s): ______________________________________.
  28.  *
  29.  * $Log: pipechan.cxx,v $
  30.  * Revision 1.7  1998/11/30 04:59:04  robertj
  31.  * New directory structure
  32.  *
  33.  * Revision 1.6  1998/10/30 10:42:32  robertj
  34.  * Better function arrangement for multi platforming.
  35.  *
  36.  * Revision 1.5  1998/10/29 11:29:18  robertj
  37.  * Added ability to set environment in sub-process.
  38.  *
  39.  * Revision 1.4  1998/10/26 09:11:06  robertj
  40.  * Added ability to separate out stdout from stderr on pipe channels.
  41.  *
  42.  * Revision 1.3  1998/09/23 06:22:31  robertj
  43.  * Added open source copyright license.
  44.  *
  45.  * Revision 1.2  1996/05/09 12:18:41  robertj
  46.  * Fixed syntax error found by Mac platform.
  47.  *
  48.  * Revision 1.1  1996/04/14 02:54:14  robertj
  49.  * Initial revision
  50.  *
  51.  */
  52. #include <ptlib.h>
  53. #include <ptlib/pipechan.h>
  54. #include <ctype.h>
  55. ///////////////////////////////////////////////////////////////////////////////
  56. // PPipeChannel
  57. static BOOL SplitArgs(const PString & cmdline,
  58.                       PString & progName,
  59.                       PStringArray & arguments)
  60. {
  61.   PArgList list = cmdline;
  62.   if (list.GetCount() == 0)
  63.     return FALSE;
  64.   progName = list[0];
  65.   arguments.SetSize(list.GetCount()-1);
  66.   for (PINDEX i = 1; i < list.GetCount(); i++)
  67.     arguments[i-1] = list[i];
  68.   return TRUE;
  69. }
  70. PPipeChannel::PPipeChannel(const PString & subProgram,
  71.                            OpenMode mode,
  72.                            BOOL searchPath,
  73.                            BOOL stderrSeparate)
  74. {
  75.   PString progName;
  76.   PStringArray arguments;
  77.   if (SplitArgs(subProgram, progName, arguments))
  78.     PlatformOpen(progName, arguments, mode, searchPath, stderrSeparate, NULL);
  79. }
  80. PPipeChannel::PPipeChannel(const PString & subProgram,
  81.                            const PStringArray & arguments,
  82.                            OpenMode mode,
  83.                            BOOL searchPath,
  84.                            BOOL stderrSeparate)
  85. {
  86.   PlatformOpen(subProgram, arguments, mode, searchPath, stderrSeparate, NULL);
  87. }
  88. PPipeChannel::PPipeChannel(const PString & subProgram,
  89.                            const PStringToString & environment,
  90.                            OpenMode mode,
  91.                            BOOL searchPath,
  92.                            BOOL stderrSeparate)
  93. {
  94.   PString progName;
  95.   PStringArray arguments;
  96.   if (SplitArgs(subProgram, progName, arguments))
  97.     PlatformOpen(progName, arguments, mode, searchPath, stderrSeparate, &environment);
  98. }
  99. PPipeChannel::PPipeChannel(const PString & subProgram,
  100.                            const PStringArray & arguments,
  101.                            const PStringToString & environment,
  102.                            OpenMode mode,
  103.                            BOOL searchPath,
  104.                            BOOL stderrSeparate)
  105. {
  106.   PlatformOpen(subProgram, arguments, mode, searchPath, stderrSeparate, &environment);
  107. }
  108. PObject::Comparison PPipeChannel::Compare(const PObject & obj) const
  109. {
  110.   PAssert(obj.IsDescendant(PPipeChannel::Class()), PInvalidCast);
  111.   return subProgName.Compare(((const PPipeChannel &)obj).subProgName);
  112. }
  113. PString PPipeChannel::GetName() const
  114. {
  115.   return subProgName;
  116. }
  117. BOOL PPipeChannel::Open(const PString & subProgram,
  118.                         OpenMode mode,
  119.                         BOOL searchPath,
  120.                         BOOL stderrSeparate)
  121. {
  122.   PString progName;
  123.   PStringArray arguments;
  124.   if (!SplitArgs(subProgram, progName, arguments))
  125.     return FALSE;
  126.   return PlatformOpen(progName, arguments, mode, searchPath, stderrSeparate, NULL);
  127. }
  128. BOOL PPipeChannel::Open(const PString & subProgram,
  129.                         const PStringArray & arguments,
  130.                         OpenMode mode,
  131.                         BOOL searchPath,
  132.                         BOOL stderrSeparate)
  133. {
  134.   return PlatformOpen(subProgram, arguments, mode, searchPath, stderrSeparate, NULL);
  135. }
  136. BOOL PPipeChannel::Open(const PString & subProgram,
  137.                         const PStringToString & environment,
  138.                         OpenMode mode,
  139.                         BOOL searchPath,
  140.                         BOOL stderrSeparate)
  141. {
  142.   PString progName;
  143.   PStringArray arguments;
  144.   if (!SplitArgs(subProgram, progName, arguments))
  145.     return FALSE;
  146.   return PlatformOpen(progName, arguments, mode, searchPath, stderrSeparate, &environment);
  147. }
  148. BOOL PPipeChannel::Open(const PString & subProgram,
  149.                         const PStringArray & arguments,
  150.                         const PStringToString & environment,
  151.                         OpenMode mode,
  152.                         BOOL searchPath,
  153.                         BOOL stderrSeparate)
  154. {
  155.   return PlatformOpen(subProgram, arguments, mode, searchPath, stderrSeparate, &environment);
  156. }
  157. // End Of File ///////////////////////////////////////////////////////////////