⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cxx

📁 开源的openh323的v1.18.0版,有1.19.0版无法编译过的朋友可以用这版
💻 CXX
字号:
/*
 * main.cxx
 *
 * PWLib application source file for OSPSample
 *
 * Main program entry point.
 *
 * Copyright (C) 2004 Post Increment
 *
 * The contents of this file are subject to the Mozilla Public License
 * Version 1.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.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
 * the License for the specific language governing rights and limitations
 * under the License.
 *
 * The Original Code is Portable Windows Library.
 *
 * The Initial Developer of the Original Code is Post Increment
 *
 * This code was written with assistance from TransNexus, Inc.
 * http://www.transnexus.com
 *
 * Contributor(s): ______________________________________.
 *
 * $Log: main.cxx,v $
 * Revision 1.5  2005/01/03 06:25:53  csoutheren
 * Added extensive support for disabling code modules at compile time
 *
 * Revision 1.4  2004/12/20 05:56:33  csoutheren
 * Last check for spelling problems
 *
 * Revision 1.3  2004/12/20 02:33:50  csoutheren
 * Updated for changes to function names
 *
 * Revision 1.2  2004/12/09 23:43:03  csoutheren
 * Added hangup command
 *
 * Revision 1.1  2004/12/08 02:00:59  csoutheren
 * Initial version of OSP sample program
 *
 */

#include "precompile.h"
#include "main.h"
#include "version.h"

#include <opalosp.h>
#include <h323pdu.h>

#define   DEFAULT_OSP_SERVER    "http://osptestserver.transnexus.com:1080/osp"

typedef BOOL (OSPSample::* CmdFunction)(const PStringArray & tokens);

struct CommandInfoType {
  const char * cmd;
  int          minArgCount;
  CmdFunction  function;
  const char * argHelp;
  const char * help;
} Commands[] = {
  { "help",        0,  &OSPSample::CmdHelp      },
  { "status",      0,  &OSPSample::CmdStatus    },

  { "localaddr",   1,  &OSPSample::CmdIPAddress, "ipaddress",                  "set local IP address" },

  { "ospserver",   1,  &OSPSample::CmdServer,    "url [privkey pubkey cakey]", "set OSP server (i.e. http://osptestserver.transnexus.com:1080/osp)" },

  { "call",        2,  &OSPSample::CmdCall,      "srcnum dstnum [callid]",     "make a new outgoing call" },
  { "connect",     0,  &OSPSample::CmdConnect,   NULL,                         "set connect time for a call" },
//  { "validate",  3,  &OSPSample::CmdValidate,  "[srcnum dstnum callid]",     "validate new call (or last call if no parms)" },
  { "hangup",      0,  &OSPSample::CmdHangup,    NULL,                         "hangup the current call" },

  { "quit",        0,  &OSPSample::CmdQuit,      NULL,                         "exit program" },
  { "exit",        0,  &OSPSample::CmdQuit,      NULL,                         "exit program" },

  { NULL }
};

static inline PString StringOrEmpty(const PString & str)
{
  return str.IsEmpty() ? "(empty)" : str;
}

static inline PString DataOrNone(const PBYTEArray & data)
{
  PStringStream str;
  if (data.GetSize() == 0)
    str << "(none)";
  else 
    str << endl << hex << data;

  return str;
}

PCREATE_PROCESS(OSPSample);

OSPSample::OSPSample()
  : PProcess("Post Increment", "ospsample", MAJOR_VERSION, MINOR_VERSION, BUILD_TYPE, BUILD_NUMBER)
{
}

void OSPSample::Main()
{
  PArgList & args = GetArguments();

  args.Parse(
#if PTRACING
             "o-output:"             "-no-output."
             "t-trace."              "-no-trace."
#endif
  );

#if PTRACING
  PTrace::Initialise(args.GetOptionCount('t'),
                     args.HasOption('o') ? (const char *)args.GetOptionString('o') : NULL,
         PTrace::Blocks | PTrace::Timestamp | PTrace::Thread | PTrace::FileAndLine);
#endif

  cout << "OSP Test Program " << GetVersion() << endl;

  // get a plausible local interface address
  PIPSocket::InterfaceTable interfaceTable;
  BOOL foundPublic = FALSE;
  if (PIPSocket::GetInterfaceTable(interfaceTable)) {
    PINDEX i;
    for (i = 0; i < interfaceTable.GetSize(); ++i) {
      PIPSocket::Address addr = interfaceTable[i].GetAddress();
      if (!addr.IsLoopback()) {
        if (!foundPublic || !addr.IsRFC1918())
          localAddr = addr;
      }
    }
  }
  if (!localAddr.IsValid())
    cout << "WARNING: using local host as local address" << endl;
  else
    cout << "Local address is " << localAddr << endl;

  running = TRUE;
  while (running) {
    cout << "Command ? " << flush;
    PString line;
    cin >> line;
    line.Trim();
    PStringArray args = line.Tokenise(' ');
    if (args.GetSize() == 0)
      continue;

    PCaselessString cmd = args[0];
    args.RemoveAt(0);

    CommandInfoType * command = Commands;
    while (command->cmd != NULL) {
      if (cmd == command->cmd)
        break;
      ++command;
    }

    if (command->cmd == NULL) {
      PError << "error: unknown command \"" << cmd << "\"" << endl;
      continue;
    }

    if (args.GetSize() < command->minArgCount) {
      PError << "error: not enough args - " << command->minArgCount << " required" << endl;
      cout << "usage: " << cmd;
      if (command->argHelp != NULL)
        cout << command->argHelp;
      cout << endl;
      continue;
    }

    (this->*command->function)(args);
  }
}

void OSPSample::DisplayResult(const PString & title, int result)
{
  cout << title << " returned error code = " << result << endl;
}


BOOL OSPSample::CmdHelp(const PStringArray & /*args*/)
{
  CommandInfoType * command = Commands;
  while (command->cmd != NULL) {
    cout << command->cmd;
    if (command->argHelp != NULL)
      cout << " " << command->argHelp;
    cout << endl;
    if (command->help != NULL)
      cout << "   " << command->help << endl;
    ++command;
  }
  return TRUE;
}

BOOL OSPSample::CmdStatus(const PStringArray & /*args*/)
{
  if (!provider.IsOpen()) {
    cout << "No provider open" << endl
         << endl;
    return FALSE;
  }

  cout << "Provider open" << endl;

  if (!transaction.IsOpen()) {
    cout << "No transaction open" << endl;
    return FALSE;
  } else {
    cout << "No. of destinations : " << numberOfDestinations << endl
         << "Call ID:              " << DataOrNone(callID) << endl
         << "Call token:           " << DataOrNone(callToken) << endl
         << endl;
  }

  return TRUE;
}

BOOL OSPSample::CmdIPAddress(const PStringArray & args)
{
  localAddr = PIPSocket::Address(args[0]);
  cout << "Local address set to " << localAddr  << endl;
  return TRUE;
}

BOOL OSPSample::CmdQuit(const PStringArray & /*tokens*/)
{
  cout << "Exiting" << endl;
  running = FALSE;
  return TRUE;
}


BOOL OSPSample::CmdServer(const PStringArray & args)
{
  int result;
  if (args.GetSize() < 4)
    result = provider.Open(args[0]);
  else
    result = provider.Open(args[0], args[1], args[2], args[3]);

  DisplayResult("Transaction::Open", result);

  return result == 0;
}

BOOL OSPSample::CmdCall(const PStringArray & args)
{
  int result = 0;
  if (!provider.IsOpen()) {
    cout << "Opening default OSP server " << DEFAULT_OSP_SERVER << endl;
    if (!CmdServer(PStringArray(DEFAULT_OSP_SERVER)))
      return FALSE;
  }

  if (transaction.IsOpen()) {
    cout << "Closing old transaction..." << flush;
    result = CmdHangup(PStringArray());
    DisplayResult("hangup", result);
  }

  cout << "Opening new transaction..." << flush;
  result = transaction.Open(provider);
  if (result != 0) {
    cout << "failed" << endl;
    DisplayResult("Transaction::Open", result);  
    return FALSE;
  }

  PString source(OpalOSP::IpAddressPortToOSPString(localAddr, 1720));
  H225_AliasAddress src, dst;
  H323SetAliasAddress(args[0], src, H225_AliasAddress::e_dialedDigits);
  H323SetAliasAddress(args[1], dst, H225_AliasAddress::e_dialedDigits);

  if (args.GetSize() > 2)
    callID = OpalGloballyUniqueID(args[2]);
  else
    callID = OpalGloballyUniqueID();

  unsigned numberOfDestinations = 10;

  result = transaction.Authorise(
    source, 
    "", 
    src,
    dst,
    callID,
    numberOfDestinations);

  if (result != 0) {
    cout << "failed" << endl;
    DisplayResult("Transaction::Authorise", result);  
    return FALSE;
  }
  
  cout << "returned " << numberOfDestinations << " routeDestinations" << endl;
  if (numberOfDestinations == 0)
    return TRUE;

  result = transaction.GetFirstDestination(timeLimit, callID, calledNumber, routeDestination, device, callToken);
  if (result != 0) {
    DisplayResult("Transaction::GetFirstDestination", result);
    return FALSE;
  }

  cout << "First destination:\n"
    << "  Dest number: " << calledNumber << endl
    << "  Device:      " << StringOrEmpty(device) << endl
    << "  Destination: " << StringOrEmpty(routeDestination) << endl
    << "  Time limit:  " << timeLimit << endl
    << "  Call ID:     " << DataOrNone(callID) << endl
    << "  Token:       " << DataOrNone(callToken) << endl;

  return TRUE;
}

BOOL OSPSample::CmdConnect(const PStringArray & /*tokens*/)
{
  if (!transaction.IsOpen()) {
    PError << "error: no call active" << endl;
    return FALSE;
  }

  transaction.CallConnect(PTime());
  cout << "Connect time set\n";

  return TRUE;
}


BOOL OSPSample::CmdHangup(const PStringArray & /*args*/)
{
  if (!transaction.IsOpen()) {
    PError << "error: no call active" << endl;
    return FALSE;
  }

  transaction.CallEnd();
  transaction.Close();

  cout << "Call hungup\n";
  return TRUE;
}
// End of File ///////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -