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

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * msdos.cxx
  3.  *
  4.  * General class implementation for MS-DOS
  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: msdos.cxx,v $
  30.  * Revision 1.13  1998/09/24 03:30:50  robertj
  31.  * Added open software license.
  32.  *
  33.  * Revision 1.12  1996/01/28 02:55:32  robertj
  34.  * WIN16 support.
  35.  *
  36.  * Revision 1.11  1995/08/24 12:41:00  robertj
  37.  * Changed PChannel so not a PContainer.
  38.  *
  39.  * Revision 1.10  1995/06/17 00:59:21  robertj
  40.  * Moved PPipeChannel::Execute from common dos/windows to individual files.
  41.  *
  42.  * Revision 1.9  1995/04/01 08:06:03  robertj
  43.  * Fixed yield for straight DOS and QUICKWIN systems.
  44.  *
  45.  * Revision 1.8  1995/03/12 05:00:05  robertj
  46.  * Re-organisation of DOS/WIN16 and WIN32 platforms to maximise common code.
  47.  * Used built-in equate for WIN32 API (_WIN32).
  48.  *
  49.  * Revision 1.7  1994/12/13  11:53:44  robertj
  50.  * Added missing PConfig Construct() function for pure DOS.
  51.  *
  52.  * Revision 1.6  1994/10/30  11:25:36  robertj
  53.  * Fixed DOS version of configuration files.
  54.  *
  55.  * Revision 1.5  1994/08/22  00:18:02  robertj
  56.  * Added dummy socket function.
  57.  *
  58.  * Revision 1.4  1994/07/27  06:00:10  robertj
  59.  * Backup
  60.  *
  61.  * Revision 1.3  1994/07/17  11:01:04  robertj
  62.  * Ehancements, implementation, bug fixes etc.
  63.  *
  64.  * Revision 1.2  1994/07/02  03:18:09  robertj
  65.  * Multi-threading implementation.
  66.  *
  67.  * Revision 1.1  1994/06/25  12:13:01  robertj
  68.  * Initial revision
  69.  */
  70. #include "ptlib.h"
  71. #include <bios.h>
  72. #include <fcntl.h>
  73. ///////////////////////////////////////////////////////////////////////////////
  74. // PTime
  75. PString PTime::GetTimeSeparator()
  76. {
  77.   return "";
  78. }
  79. BOOL PTime::GetTimeAMPM()
  80. {
  81.   return FALSE;
  82. }
  83. PString PTime::GetTimeAM()
  84. {
  85.   return "am";
  86. }
  87. PString PTime::GetTimePM()
  88. {
  89.   return "pm";
  90. }
  91. PString PTime::GetDayName(Weekdays dayOfWeek, NameType type)
  92. {
  93.   static const char * const weekdays[] = {
  94.     "Sunday", "Monday", "Tuesday", "Wednesday",
  95.     "Thursday", "Friday", "Saturday"
  96.   };
  97.   static const char * const abbrev_weekdays[] = {
  98.     "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
  99.   };
  100.   return (type != FullName ? abbrev_weekdays : weekdays)[dayOfWeek];
  101. }
  102. PString PTime::GetDateSeparator()
  103. {
  104.   return "-";
  105. }
  106. PString PTime::GetMonthName(Months month, NameType type)
  107. {
  108.   static const char * const months[] = { "",
  109.     "January", "February", "March", "April", "May", "June",
  110.     "July", "August", "September", "October", "November", "December"
  111.   };
  112.   static const char * const abbrev_months[] = {
  113.     "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  114.     "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
  115.   };
  116.   return (type != FullName ? abbrev_months : months)[month];
  117. }
  118. PTime::DateOrder PTime::GetDateOrder()
  119. {
  120.   return DayMonthYear;
  121. }
  122. long PTime::GetTimeZone() const
  123. {
  124.   return 0;
  125. }
  126. PString PTime::GetTimeZoneString(TimeZoneType type) const
  127. {
  128.   return "";
  129. }
  130. ///////////////////////////////////////////////////////////////////////////////
  131. // PSerialChannel
  132. void PSerialChannel::Construct()
  133. {
  134.   biosParm = 0xe3; // 9600 baud, no parity, 1 stop bit, 8 data bits
  135. }
  136. PString PSerialChannel::GetName() const
  137. {
  138.   if (IsOpen())
  139.     return psprintf("COM%i", os_handle+1);
  140.   return PString();
  141. }
  142. BOOL PSerialChannel::Read(void * buf, PINDEX len)
  143. {
  144.   char * b = (char *)buf;
  145.   while (len > 0) {
  146.     int c = ReadChar();
  147.     if (c >= 0) {
  148.       *b++ = (char)c;
  149.       len--;
  150.     }
  151.   }
  152.   return len == 0;
  153. }
  154. BOOL PSerialChannel::Write(const void * buf, PINDEX len)
  155. {
  156.   const char * b = (const char *)buf;
  157.   while (len-- > 0) {
  158.     if (!WriteChar(*b++))
  159.       return FALSE;
  160.   }
  161.   return TRUE;
  162. }
  163. BOOL PSerialChannel::Close()
  164. {
  165.   if (!IsOpen())
  166.     return FALSE;
  167.   os_handle = -1;
  168.   return TRUE;
  169. }
  170. BOOL PSerialChannel::SetCommsParam(DWORD speed, BYTE data, Parity parity,
  171.                      BYTE stop, FlowControl inputFlow, FlowControl outputFlow)
  172. {
  173.   switch (speed) {
  174.     case 0 :
  175.       break;
  176.     case 110 :
  177.       biosParm &= 0x1f;
  178.       break;
  179.     case 150 :
  180.       biosParm &= 0x1f;
  181.       biosParm |= 0x20;
  182.       break;
  183.     case 300 :
  184.       biosParm &= 0x1f;
  185.       biosParm |= 0x40;
  186.       break;
  187.     case 600 :
  188.       biosParm &= 0x1f;
  189.       biosParm |= 0x60;
  190.       break;
  191.     case 1200 :
  192.       biosParm &= 0x1f;
  193.       biosParm |= 0x80;
  194.       break;
  195.     case 2400 :
  196.       biosParm &= 0x1f;
  197.       biosParm |= 0xa0;
  198.       break;
  199.     case 4800 :
  200.       biosParm &= 0x1f;
  201.       biosParm |= 0xc0;
  202.       break;
  203.     case 9600 :
  204.       biosParm &= 0x1f;
  205.       biosParm |= 0xe0;
  206.       break;
  207.     default :
  208.       return FALSE;
  209.   }
  210.   switch (data) {
  211.     case 0 :
  212.       break;
  213.     case 5 :
  214.       biosParm &= 0xfc;
  215.       break;
  216.     case 6 :
  217.       biosParm &= 0xfc;
  218.       biosParm |= 1;
  219.       break;
  220.     case 7 :
  221.       biosParm &= 0xfc;
  222.       biosParm |= 2;
  223.       break;
  224.     case 8 :
  225.       biosParm &= 0xfc;
  226.       biosParm |= 3;
  227.       break;
  228.     default :
  229.       return FALSE;
  230.   }
  231.   switch (parity) {
  232.     case DefaultParity :
  233.       break;
  234.     case NoParity :
  235.       biosParm &= 0xe7;
  236.       break;
  237.     case OddParity :
  238.       biosParm &= 0xe7;
  239.       biosParm |= 8;
  240.       break;
  241.     case EvenParity :
  242.       biosParm &= 0xe7;
  243.       biosParm |= 0x10;
  244.       break;
  245.     default :
  246.       return FALSE;
  247.   }
  248.   switch (stop) {
  249.     case 0 :
  250.       break;
  251.     case 1 :
  252.       biosParm &= ~4;
  253.       break;
  254.     case 2 :
  255.       biosParm |= 4;
  256.       break;
  257.     default :
  258.       return FALSE;
  259.   }
  260.   if (outputFlow != DefaultFlowControl || inputFlow != DefaultFlowControl)
  261.     return FALSE;
  262.   _bios_serialcom(_COM_INIT, os_handle, biosParm);
  263.   return TRUE;
  264. }
  265. BOOL PSerialChannel::Open(const PString & port, DWORD speed, BYTE data,
  266.        Parity parity, BYTE stop, FlowControl inputFlow, FlowControl outputFlow)
  267. {
  268.   Close();
  269.   os_handle = -1;
  270.   if (PCaselessString("COM") != port.Left(3) &&
  271.                                               port[3] >= '1' && port[3] <= '4')
  272.     return FALSE;
  273.   os_handle = port[3] - '1';
  274.   return SetCommsParam(speed, data, parity, stop, inputFlow, outputFlow);
  275. }
  276. BOOL PSerialChannel::SetSpeed(DWORD speed)
  277. {
  278.   return SetCommsParam(speed,
  279.                  0, DefaultParity, 0, DefaultFlowControl, DefaultFlowControl);
  280. }
  281. DWORD PSerialChannel::GetSpeed() const
  282. {
  283.   static int speed[8] = { 110, 150, 300, 600, 1200, 2400, 4800, 9600 };
  284.   return speed[biosParm>>5];
  285. }
  286. BOOL PSerialChannel::SetDataBits(BYTE data)
  287. {
  288.   return SetCommsParam(0,
  289.               data, DefaultParity, 0, DefaultFlowControl, DefaultFlowControl);
  290. }
  291. BYTE PSerialChannel::GetDataBits() const
  292. {
  293.   return (BYTE)((biosParm&3)+5);
  294. }
  295. BOOL PSerialChannel::SetParity(Parity parity)
  296. {
  297.   return SetCommsParam(0,0, parity, 0, DefaultFlowControl, DefaultFlowControl);
  298. }
  299. PSerialChannel::Parity PSerialChannel::GetParity() const
  300. {
  301.   return (biosParm&8) == 0 ? NoParity :
  302.                                 (biosParm&0x10) == 0 ? OddParity : EvenParity;
  303. }
  304. BOOL PSerialChannel::SetStopBits(BYTE stop)
  305. {
  306.   return SetCommsParam(0,
  307.                0, DefaultParity, stop, DefaultFlowControl, DefaultFlowControl);
  308. }
  309. BYTE PSerialChannel::GetStopBits() const
  310. {
  311.   return (BYTE)(((biosParm&4)>>3)+1);
  312. }
  313. BOOL PSerialChannel::SetInputFlowControl(FlowControl flowControl)
  314. {
  315.   return SetCommsParam(0,0, DefaultParity, 0, flowControl, DefaultFlowControl);
  316. }
  317. PSerialChannel::FlowControl PSerialChannel::GetInputFlowControl() const
  318. {
  319.   return RtsCts;
  320. }
  321. BOOL PSerialChannel::SetOutputFlowControl(FlowControl flowControl)
  322. {
  323.   return SetCommsParam(0,0, DefaultParity, 0, DefaultFlowControl, flowControl);
  324. }
  325. PSerialChannel::FlowControl PSerialChannel::GetOutputFlowControl() const
  326. {
  327.   return RtsCts;
  328. }
  329. void PSerialChannel::SetDTR(BOOL state)
  330. {
  331.   if (!IsOpen())
  332.     return;
  333. }
  334. void PSerialChannel::SetRTS(BOOL state)
  335. {
  336.   if (!IsOpen())
  337.     return;
  338. }
  339. void PSerialChannel::SetBreak(BOOL state)
  340. {
  341.   if (!IsOpen())
  342.     return;
  343.   int s = state;
  344. }
  345. BOOL PSerialChannel::GetCTS()
  346. {
  347.   if (!IsOpen())
  348.     return FALSE;
  349.   return (_bios_serialcom(_COM_STATUS, os_handle, 0)&0x8010) == 0x10;
  350. }
  351. BOOL PSerialChannel::GetDSR()
  352. {
  353.   if (!IsOpen())
  354.     return FALSE;
  355.   return (_bios_serialcom(_COM_STATUS, os_handle, 0)&0x8020) == 0x20;
  356. }
  357. BOOL PSerialChannel::GetDCD()
  358. {
  359.   if (!IsOpen())
  360.     return FALSE;
  361.   return (_bios_serialcom(_COM_STATUS, os_handle, 0)&0x8080) == 0x80;
  362. }
  363. BOOL PSerialChannel::GetRing()
  364. {
  365.   if (!IsOpen())
  366.     return FALSE;
  367.   return (_bios_serialcom(_COM_STATUS, os_handle, 0)&0x8040) == 0x40;
  368. }
  369. PStringList PSerialChannel::GetPortNames()
  370. {
  371.   static char buf[] = "COM ";
  372.   PStringList ports;
  373.   for (char p = '1'; p <= '4'; p++) {
  374.     if (*(WORD *)(0x00400000+p-'1') != 0) {
  375.       buf[3] = p;
  376.       ports.Append(new PString(buf));
  377.     }
  378.   }
  379.   return ports;
  380. }
  381. ///////////////////////////////////////////////////////////////////////////////
  382. // PPipeChannel
  383. BOOL PPipeChannel::Execute()
  384. {
  385.   if (hasRun)
  386.     return FALSE;
  387.   flush();
  388.   if (os_handle >= 0) {
  389.     _close(os_handle);
  390.     os_handle = -1;
  391.   }
  392.   if (!ConvertOSError(system(subProgName)))
  393.     return FALSE;
  394.   if (!fromChild.IsEmpty()) {
  395.     os_handle = _open(fromChild, _O_RDONLY);
  396.     if (!ConvertOSError(os_handle))
  397.       return FALSE;
  398.   }
  399.   return TRUE;
  400. }
  401. ///////////////////////////////////////////////////////////////////////////////
  402. // Configuration files
  403. void PConfig::Construct(Source src)
  404. {
  405.   switch (src) {
  406.     case Application :
  407.       PFilePath appFile = PProcess::Current()->GetFile();
  408.       location = appFile.GetVolume() +
  409.                               appFile.GetPath() + appFile.GetTitle() + ".INI";
  410.   }
  411. }
  412. void PConfig::Construct(const PFilePath & file)
  413. {
  414.   location = file;
  415. }
  416. PStringList PConfig::GetSections()
  417. {
  418.   PStringList sections;
  419.   if (!location.IsEmpty()) {
  420.     PAssertAlways(PUnimplementedFunction);
  421.   }
  422.   return sections;
  423. }
  424. PStringList PConfig::GetKeys(const PString &) const
  425. {
  426.   PStringList keys;
  427.   if (location.IsEmpty()) {
  428.     char ** ptr = _environ;
  429.     while (*ptr != NULL) {
  430.       PString buf = *ptr++;
  431.       keys.AppendString(buf.Left(buf.Find('=')));
  432.     }
  433.   }
  434.   else {
  435.     PAssertAlways(PUnimplementedFunction);
  436.   }
  437.   return keys;
  438. }
  439. void PConfig::DeleteSection(const PString &)
  440. {
  441.   if (location.IsEmpty())
  442.     return;
  443.   PAssertAlways(PUnimplementedFunction);
  444. }
  445. void PConfig::DeleteKey(const PString &, const PString & key)
  446. {
  447.   if (location.IsEmpty()) {
  448.     PAssert(key.Find('=') == P_MAX_INDEX, PInvalidParameter);
  449.     _putenv(key + "=");
  450.   }
  451.   else
  452.     PAssertAlways(PUnimplementedFunction);
  453. }
  454. PString PConfig::GetString(const PString &,
  455.                                           const PString & key, const PString & dflt)
  456. {
  457.   PString str;
  458.   if (location.IsEmpty()) {
  459.     PAssert(key.Find('=') == P_MAX_INDEX, PInvalidParameter);
  460.     char * env = getenv(key);
  461.     if (env != NULL)
  462.       str = env;
  463.     else
  464.       str = dflt;
  465.   }
  466.   else {
  467.     PAssertAlways(PUnimplementedFunction);
  468.   }
  469.   return str;
  470. }
  471. void PConfig::SetString(const PString &, const PString & key, const PString & value)
  472. {
  473.   if (location.IsEmpty()) {
  474.     PAssert(key.Find('=') == P_MAX_INDEX, PInvalidParameter);
  475.     _putenv(key + "=" + value);
  476.   }
  477.   else
  478.     PAssertAlways(PUnimplementedFunction);
  479. }
  480. ///////////////////////////////////////////////////////////////////////////////
  481. // Threads
  482. void PThread::SwitchContext(PThread * from)
  483. {
  484.   if (setjmp(from->context) != 0) // Are being reactivated from previous yield
  485.     return;
  486.   if (status == Starting) {
  487.     if (setjmp(context) != 0) {
  488.       status = Running;
  489.       Main();
  490.       Terminate(); // Never returns from here
  491.     }
  492.     context[7] = (int)stackTop-16;  // Change the stack pointer in jmp_buf
  493.   }
  494.   longjmp(context, TRUE);
  495.   PAssertAlways("longjmp failed"); // Should never get here
  496. }
  497. ///////////////////////////////////////////////////////////////////////////////
  498. // PDynaLink
  499. PDynaLink::PDynaLink()
  500. {
  501.   PAssertAlways(PUnimplementedFunction);
  502. }
  503. PDynaLink::PDynaLink(const PString &)
  504. {
  505.   PAssertAlways(PUnimplementedFunction);
  506. }
  507. PDynaLink::~PDynaLink()
  508. {
  509. }
  510. BOOL PDynaLink::Open(const PString & name)
  511. {
  512.   PAssertAlways(PUnimplementedFunction);
  513.   return FALSE;
  514. }
  515. void PDynaLink::Close()
  516. {
  517. }
  518. BOOL PDynaLink::IsLoaded() const
  519. {
  520.   return FALSE;
  521. }
  522. BOOL PDynaLink::GetFunction(PINDEX index, Function & func)
  523. {
  524.   return FALSE;
  525. }
  526. BOOL PDynaLink::GetFunction(const PString & name, Function & func)
  527. {
  528.   return FALSE;
  529. }
  530. // End Of File ///////////////////////////////////////////////////////////////