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

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * main.cxx
  3.  *
  4.  * PWLib application source file for pwtest
  5.  *
  6.  * Main program entry point.
  7.  *
  8.  * Copyright 98 Equivalence
  9.  *
  10.  * $Log: main.cxx,v $
  11.  * Revision 1.20  2000/07/25 13:14:07  robertj
  12.  * Got the video capture stuff going!
  13.  *
  14.  * Revision 1.19  2000/07/15 09:47:35  robertj
  15.  * Added video I/O device classes.
  16.  *
  17.  * Revision 1.18  2000/04/29 08:11:06  robertj
  18.  * Fixed problem with stream output width in PTimeInterval
  19.  *
  20.  * Revision 1.17  2000/04/29 04:51:07  robertj
  21.  * Added microseconds to string output.
  22.  * Fixed uninitialised microseconds on some constructors.
  23.  *
  24.  * Revision 1.16  1999/09/10 04:35:43  robertj
  25.  * Added Windows version of PIPSocket::GetInterfaceTable() function.
  26.  *
  27.  * Revision 1.15  1999/08/07 07:11:14  robertj
  28.  * Added test for menu text change
  29.  *
  30.  * Revision 1.14  1999/08/07 01:47:18  robertj
  31.  * Fixed some trivial errors.
  32.  *
  33.  * Revision 1.13  1999/07/06 04:46:01  robertj
  34.  * Fixed being able to case an unsigned to a PTimeInterval.
  35.  * Improved resolution of PTimer::Tick() to be millisecond accurate.
  36.  *
  37.  * Revision 1.12  1999/07/03 03:12:59  robertj
  38.  * #ifdef'ed test code for stuff not in general distrubution.
  39.  *
  40.  * Revision 1.11  1999/06/30 08:57:20  robertj
  41.  * Fixed bug in encodeing sequence of constrained primitive type. Constraint not set.
  42.  * Fixed bug in not emitting namespace use clause.
  43.  * Added "normalisation" of separate sequence of <base type> to be single class.
  44.  *
  45.  * Revision 1.10  1999/06/24 14:00:09  robertj
  46.  * Added URL parse test
  47.  *
  48.  * Revision 1.9  1999/06/14 07:59:39  robertj
  49.  * Enhanced tracing again to add options to trace output (timestamps etc).
  50.  *
  51.  * Revision 1.8  1999/06/07 01:55:04  robertj
  52.  * Added test for default driver function in sound classes.
  53.  *
  54.  * Revision 1.7  1999/05/28 14:07:18  robertj
  55.  * Added function to get default audio device.
  56.  *
  57.  * Revision 1.6  1999/03/29 03:39:56  robertj
  58.  * Changed semantics of PTitledWindow::OnClose() function.
  59.  *
  60.  * Revision 1.5  1999/02/23 07:11:29  robertj
  61.  * Improved trace facility adding trace levels and #define to remove all trace code.
  62.  *
  63.  * Revision 1.4  1999/02/22 10:15:16  robertj
  64.  * Sound driver interface implementation to Linux OSS specification.
  65.  *
  66.  * Revision 1.3  1999/01/31 00:59:27  robertj
  67.  * Added IP Access Control List class to PTLib Components
  68.  *
  69.  * Revision 1.2  1998/12/23 01:17:29  robertj
  70.  * PWCLib test
  71.  *
  72.  */
  73. #include <pwlib.h>
  74. #include <ptlib/videoio.h>
  75. #include <ptclib/ipacl.h>
  76. #include <ptclib/url.h>
  77. #include <ptclib/asner.h>
  78. #include "resources.h"
  79. class OpenSoundFileDialog : public POpenFileDialog
  80. {
  81.   PCLASSINFO(OpenSoundFileDialog, POpenFileDialog)
  82.   public:
  83.     OpenSoundFileDialog(MainWindow * parent);
  84.     virtual void OnInit();
  85.     const PString & GetDriver() const { return driver; }
  86.     BOOL GetWait() const { return waitFlag; }
  87.   private:
  88.     PString driver;
  89.     BOOL    waitFlag;
  90. };
  91. class SaveSoundFileDialog : public PSaveFileDialog
  92. {
  93.   PCLASSINFO(SaveSoundFileDialog, PSaveFileDialog)
  94.   public:
  95.     SaveSoundFileDialog(MainWindow * parent);
  96.     virtual void OnInit();
  97.     const PString & GetDriver() const { return driver; }
  98.   private:
  99.     PString driver;
  100. };
  101. PCREATE_PROCESS(Pwtest);
  102. #define new PNEW
  103. Pwtest::Pwtest()
  104.   : PApplication("Equivalence", "pwtest", 1, 0, AlphaCode, 1)
  105. {
  106.   PTrace::SetLevel(1);
  107.   PTrace::SetOptions(PTrace::Blocks);
  108. }
  109. #define TEST_TIME(t) PTRACE(1, t << " => " << PTime(t))
  110. void Pwtest::Main()
  111. {
  112.   PTRACE_BLOCK("Pwtest::Pwtest()");
  113.   PTRACE(2, GetName() << " v" << GetVersion(TRUE));
  114.   PTime now;
  115.   PTRACE(1, "Time is now " << now.AsString("h:m:s.u d/M/y"));
  116.   PTRACE(1, "Time is now " << now.AsString("yyyy/MM/dd h:m:s.uuuu"));
  117.   PTRACE(1, "Time is now " << now.AsString("MMM/d/yyyyy w h:m:sa"));
  118.   PTRACE(1, "Time is now " << now.AsString("wwww d/M/yyy h:m:s.uu"));
  119.   PTRACE(1, "Time is now " << now.AsString("www d/MMMM/yy h:m:s.uuu"));
  120.   TEST_TIME("5/03/1999 12:34:56");
  121.   TEST_TIME("15/06/1999 12:34:56");
  122.   TEST_TIME("15/06/01 12:34:56 PST");
  123.   TEST_TIME("5/06/02 12:34:56");
  124.   TEST_TIME("5/23/1999 12:34am");
  125.   TEST_TIME("5/23/00 12:34am");
  126.   TEST_TIME("1999/23/04 12:34:56");
  127.   TEST_TIME("Mar 3, 1999 12:34pm");
  128.   TEST_TIME("3 Jul 2004 12:34pm");
  129.   TEST_TIME("12:34:56 5 December 1999");
  130.   TEST_TIME("10 minutes ago");
  131.   TEST_TIME("2 weeks");
  132.   PTRACE(1, "Testing timer resolution, reported as " << PTimer::Resolution() << "ms");
  133.   time_t oldSec = time(NULL);   // Wait for second boundary
  134.   while (oldSec == time(NULL))
  135.     ;
  136.   oldSec++;
  137.   PTimeInterval newTick = PTimer::Tick();
  138.   PTimeInterval oldTick = newTick;
  139.   unsigned count = 0;
  140.   while (oldSec == time(NULL)) {  // For one full second
  141.     while (newTick == oldTick)
  142.       newTick = PTimer::Tick();
  143.     oldTick = newTick;
  144.     count++;                      // Count the changes in tick
  145.   } ;
  146.   PTRACE(1, "Actual resolution is " << 1000000/count << "us");
  147.   oldTick = 1234;
  148.   PTRACE(1, "TimeInterval output: "" << setw(15) << newTick << '"');
  149.   PTRACE(1, "TimeInterval output: "" << setw(15) << oldTick << '"');
  150.   for (int p = 3; p < 20; p++)
  151.     PTRACE(1, "TimeInterval output: " << p << " ""
  152.            << setw(p) << setprecision(2) << oldTick << '"');
  153.   PPER_Stream strm;
  154.   PASN_ObjectId id;
  155.   id = "0.0.8.2250.0.2";
  156.   id.Encode(strm);
  157.   strm.CompleteEncoding();
  158.   PTRACE(1, "OID " << id << " -> " << strm);
  159.   SetAboutDialogID(IDD_ABOUT);
  160.   new MainWindow(GetArguments());
  161.   PApplication::Main();
  162. }
  163. MainWindow::MainWindow(PArgList &)
  164. {
  165.   PTRACE_BLOCK("Pwtest::Pwtest()");
  166.   SetTitle(PResourceString(IDS_TITLE));
  167.   SetIcon(PIcon(IDI_MAIN_WINDOW));
  168.   myMenu = new MainMenu(this);
  169.   SetMenu(myMenu);
  170.   static const PButtonBar::ButtonID cmds[] = {
  171.     { 1, "IP_ACL", IDM_TEST_ENABLED, IDM_TEST_DISABLED, IDS_TEST_BUTTON }
  172.   };
  173.   buttonBar = new PButtonBar(this, cmds, PARRAYSIZE(cmds));
  174.   statusBar = new PStatusBar(this, 2);
  175.   statusBar->SetSectionWidth(1, 20);
  176.   new PMDIDocWindow(this, "Test");
  177.   UpdateCommandSources();
  178.   ShowAll();
  179. }
  180. void MainWindow::NewCmd(PMenuItem &, INT)
  181. {
  182.   PMDIDocWindow * child = new PMDIDocWindow(this, "fred");
  183.   child->Show();
  184. }
  185. void MainWindow::OpenCmd(PMenuItem &, INT)
  186. {
  187.   POpenFileDialog dlg(this);
  188.   if (dlg.RunModal()) {
  189.     PTextFile file;
  190.     if (file.Open(dlg.GetFile())) {
  191.       PString str = file.ReadString(file.GetLength());
  192.     }
  193.   }
  194. }
  195. void MainWindow::CloseCmd(PMenuItem &, INT)
  196. {
  197.   // Close document
  198. }
  199. void MainWindow::SaveCmd(PMenuItem & item, INT)
  200. {
  201.   // Save current document
  202.   PINDEX pos;
  203.   pos = item.GetPosition();
  204.   pos = item.GetMenu()->GetPosition();
  205. }
  206. void MainWindow::SaveAsCmd(PMenuItem &, INT)
  207. {
  208.   PSaveFileDialog dlg(this);
  209.   if (dlg.RunModal()) {
  210.     // Save document to new name
  211.   }
  212. }
  213. void MainWindow::PrintCmd(PMenuItem &, INT)
  214. {
  215.   PPrintJobDialog dlg(this, printInfo);
  216.   if (dlg.RunModal()) {
  217.     printInfo = dlg.GetPrintInfo();
  218.     PPrintCanvas canvas("pwtest", printInfo);
  219.     // Add printing code here
  220.   }
  221. }
  222. void MainWindow::PrinterSetupCmd(PMenuItem &, INT)
  223. {
  224.   PPrinterSetupDialog dlg(this, printInfo);
  225.   if (dlg.RunModal())
  226.     printInfo = dlg.GetPrintInfo();
  227. }
  228. void MainWindow::ExitCmd(PMenuItem &, INT)
  229.   // The Exit menu ... well ... exits.
  230. {
  231.   owner->Terminate();
  232. }
  233. void MainWindow::CopyCmd()
  234. {
  235.   PClipboard clip(this);
  236.   // Do something with the clipboard
  237. }
  238. BOOL MainWindow::CanCopy()
  239. {
  240.   // If want copy menu enabled
  241.   return TRUE;
  242. }
  243. void MainWindow::PasteCmd()
  244. {
  245.   PClipboard clip(this);
  246.   // Do something with the clipboard
  247. }
  248. BOOL MainWindow::CanPaste()
  249. {
  250.   // If want paste menu enabled, ie clipboard has right format
  251.   return TRUE;
  252. }
  253. void MainWindow::OnRedraw(PCanvas & canvas)
  254. {
  255.   PPattern::Bits pat = { 0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81 };
  256.   canvas.SetFillPattern(PPattern(pat));
  257.   canvas.FillRect(100, 100, 100, 100);
  258.   canvas.FillRect(150, 150, 100, 100);
  259. }
  260. void MainWindow::OnResize(const PDim & newSize, ResizeType type)
  261. {
  262.   if (type != Iconic) {
  263.     PRect bounds(newSize);
  264.     buttonBar->AutoAdjustBounds(bounds, AdjustTop);
  265.     statusBar->AutoAdjustBounds(bounds, AdjustBottom);
  266.     SetDocumentArea(bounds, PixelCoords);
  267.   }
  268. }
  269. void MainWindow::OnClose()
  270. {
  271.   PTopLevelWindow::OnClose();
  272. }
  273. void MainWindow::TestCmd()
  274. {
  275.   myMenu->menuTestItem->SetString("Test Menu");
  276. }
  277. void MainWindow::IP_ACL_Cmd()
  278. {
  279.   PIpAccessControlList list;
  280.   list.LoadHostsAccess("ipop3d");
  281.   list.Add("10.0.2.0/24");
  282.   list.Add("192.168.");
  283.   list.Add(".nr.equival.net");
  284.   list.Add("-hadron.nr.equival.net");
  285.   list.Add("-10.0.2.1");
  286.   list.Add("203.41.8.86/255.255.255.248");
  287.   list.Add("-ALL");
  288.   PINDEX i;
  289.   PStringStream str;
  290.   for (i = 0; i < list.GetSize(); i++)
  291.     str << list[i] << 'n';
  292.   static const char * const addresses[] = {
  293.     "10.0.1.1", "10.0.1.4", "10.0.2.4", "10.0.2.1",
  294.     "129.168.1.1", "192.168.1.1",
  295.     "203.41.8.86", "203.41.8.80", "203.41.8.88"
  296.   };
  297.   for (i = 0; i < PARRAYSIZE(addresses); i++) {
  298.     PIPSocket::Address addr = addresses[i];
  299.     str << 'n' << addr << ' ' << (list.IsAllowed(addr) ? "Allowed" : "Disallowed");
  300.   }
  301.   PSimpleDialog::Info(this, str);
  302. }
  303. void MainWindow::ListInterfacesCmd(PMenuItem &, INT)
  304. {
  305.   PStringStream str;
  306.   PIPSocket::InterfaceTable interfaces;
  307.   if (PIPSocket::GetInterfaceTable(interfaces)) {
  308.     str << "Interfaces:n";
  309.     for (PINDEX i = 0; i < interfaces.GetSize(); i++)
  310.       str << "    "
  311.           << interfaces[i].GetName() << ' '
  312.           << interfaces[i].GetAddress() << ' '
  313.           << interfaces[i].GetMACAddress() << 'n';
  314.   }
  315.   else
  316.     str << "Error getting interfaces.";
  317.   PSimpleDialog::Info(this, str);
  318. }
  319. #ifdef PARSE_URL_TEST
  320. void MainWindow::ParseURLCmd()
  321. {
  322.   ParseURLDialog dlg(this);
  323.   if (dlg.RunModal()) {
  324.     PURL url = dlg.url;
  325.     PStringStream str;
  326.     str << "URL: " << url << "n"
  327.            "Scheme: " << url.GetScheme() << "n"
  328.            "Host: " << url.GetHostName() << "n"
  329.            "Port: " << url.GetPort() << "n"
  330.            "Username: " << url.GetUserName() << "n"
  331.            "Password: " << url.GetPassword() << "n"
  332.            "Fragment: " << url.GetFragment() << "n"
  333.            "Params: " << url.GetParameters() << 'n';
  334.     PINDEX i;
  335.     for (i = 0; i < url.GetPath().GetSize(); i++)
  336.       str << "Path[" << i << "]: " << url.GetPath()[i] << 'n';
  337.     for (i = 0; i < url.GetQueryVars().GetSize(); i++)
  338.       str << "Query[" << i << "]: "
  339.           << url.GetQueryVars().GetKeyAt(i) << " = "
  340.           << url.GetQueryVars().GetDataAt(i) << 'n';
  341.     PSimpleDialog::Info(this, str);
  342.   }
  343. }
  344. #endif
  345. void MainWindow::PlaySoundCmd()
  346. {
  347.   OpenSoundFileDialog dlg(this);
  348.   if (!dlg.RunModal())
  349.     return;
  350.   PSoundChannel player;
  351.   if (!player.Open(dlg.GetDriver(), PSoundChannel::Player)) {
  352.     PSimpleDialog::Error(this, "Could not open driver: "+dlg.GetDriver());
  353.     return;
  354.   }
  355.   player.SetBuffers(65536, 8);
  356.   if (!player.PlayFile(dlg.GetFile(), dlg.GetWait()))
  357.     PSimpleDialog::Error(this, "Could not play file: "+dlg.GetFile());
  358. }
  359. OpenSoundFileDialog::OpenSoundFileDialog(MainWindow * parent)
  360.   : POpenFileDialog(parent)
  361. {
  362.   waitFlag = TRUE;
  363.   AddFileType(".wav");
  364. }
  365. void OpenSoundFileDialog::OnInit()
  366. {
  367.   POpenFileDialog::OnInit();
  368.   PDim dim = GetDimensions(LocalCoords);
  369.   driver = PSoundChannel::GetDefaultDevice(PSoundChannel::Player);
  370.   PStringArray driverNames = PSoundChannel::GetDeviceNames(PSoundChannel::Player);
  371.   PComboBox * drivers = new PComboBox(this);
  372.   drivers->SetValuePointer(&driver);
  373.   for (PINDEX i = 0; i < driverNames.GetSize(); i++) {
  374.     drivers->AddString(driverNames[i]);
  375.     if (driverNames[i] == driver)
  376.       drivers->SetCurrent(i);
  377.   }
  378.   drivers->SetPosition(20, dim.Height());
  379.   drivers->SetDimensions(120, 60, LocalCoords);
  380.   drivers->Show();
  381.   dim.AddHeight(20);
  382.   if (dim.Width() <= 160)
  383.     dim.SetWidth(160);
  384.   PCheckBox * wait = new PCheckBox(this, "Wait", waitFlag);
  385.   wait->SetValuePointer(&waitFlag);
  386.   wait->SetPosition(20, dim.Height());
  387.   wait->Show();
  388.   PDim ctlDim = wait->GetDimensions(LocalCoords);
  389.   dim.AddHeight(ctlDim.Height() + 10);
  390.   if (dim.Width() <= ctlDim.Width()+40)
  391.     dim.SetWidth(ctlDim.Width()+41);
  392.   SetDimensions(dim, LocalCoords);
  393. }
  394. void MainWindow::RecordSoundCmd()
  395. {
  396.   SaveSoundFileDialog dlg(this);
  397.   if (!dlg.RunModal())
  398.     return;
  399.   PSoundChannel recorder;
  400.   if (!recorder.Open(dlg.GetDriver(), PSoundChannel::Recorder)) {
  401.     PSimpleDialog::Error(this, "Could not open driver: "+dlg.GetDriver());
  402.     return;
  403.   }
  404.   recorder.SetBuffers(8*8000, 2); // 8 x 8 second buffers
  405.   if (!recorder.RecordFile(dlg.GetFile()))
  406.     PSimpleDialog::Error(this, "Could not record file: "+dlg.GetFile());
  407. }
  408. SaveSoundFileDialog::SaveSoundFileDialog(MainWindow * parent)
  409.   : PSaveFileDialog(parent)
  410. {
  411.   SetDefaultFileType(".wav");
  412. }
  413. void SaveSoundFileDialog::OnInit()
  414. {
  415.   PSaveFileDialog::OnInit();
  416.   PDim dim = GetDimensions(LocalCoords);
  417.   driver = PSoundChannel::GetDefaultDevice(PSoundChannel::Recorder);
  418.   PStringArray driverNames = PSoundChannel::GetDeviceNames(PSoundChannel::Recorder);
  419.   PComboBox * drivers = new PComboBox(this);
  420.   drivers->SetValuePointer(&driver);
  421.   for (PINDEX i = 0; i < driverNames.GetSize(); i++) {
  422.     drivers->AddString(driverNames[i]);
  423.     if (driverNames[i] == driver)
  424.       drivers->SetCurrent(i);
  425.   }
  426.   drivers->SetPosition(20, dim.Height());
  427.   drivers->SetDimensions(120, 60, LocalCoords);
  428.   drivers->Show();
  429.   dim.AddHeight(20);
  430.   if (dim.Width() <= 160)
  431.     dim.SetWidth(160);
  432.   SetDimensions(dim, LocalCoords);
  433. }
  434. void MainWindow::VideoCaptureCmd()
  435. {
  436.   PVideoInputDevice grabber;
  437.   if (grabber.Open(grabber.GetDeviceNames()[0])) {
  438.     PBYTEArray buffer(grabber.GetMaxFrameBytes());
  439.     PINDEX i;
  440.     for (i = 0; i < 100; i++) {
  441.       if (!grabber.GetFrameData(buffer.GetPointer()))
  442.         break;
  443.     }
  444.     grabber.Stop();
  445.     if (i < 100)
  446.       PSimpleDialog::Error(this, "Error in grab.");
  447.     else {
  448.       PSimpleDialog::Info(this, "Grabbed 100 frames.");
  449.       unsigned width, height;
  450.       grabber.GetFrameSize(width, height);
  451.       PPixelImage image(width, height, 24);
  452.       memcpy(image->GetPixelDataPtr(), buffer, buffer.GetSize());
  453.       PFile file("c:\capture.bmp", PFile::WriteOnly);
  454.       image->Write(file);
  455.     }
  456.   }
  457. }
  458. // End of File ///////////////////////////////////////////////////////////////