int local_main(int argc, char* argv[]) { bool bError = false ; int iDuration, iSipPort, iRtpPort, iRepeatCount ; char* szPlayTones; char* szSipUrl; char* szFile; char* szFileBuffer; char* szUsername; char* szPassword; char* szRealm; char* szFromIdentity; char* szStunServer; char* szProxy; char* szBindAddr; char* szOutDevice; char* szInDevice; char* szCodec; bool bUseRport; bool bCList; bool bAEC; bool bAGC; bool bDenoise; if ( signal( SIGINT, ctrlCHandler ) == SIG_ERR ) { printf("Couldn't install signal handler for SIGINT\n"); exit(1); } if ( signal( SIGTERM, ctrlCHandler ) == SIG_ERR ) { printf("Couldn't install signal handler for SIGTERM\n"); exit(1); } // Parse Arguments if (parseArgs(argc, argv, &iDuration, &iSipPort, &iRtpPort, &szPlayTones, &szFile, &szFileBuffer, &szSipUrl, &bUseRport, &szUsername, &szPassword, &szRealm, &szFromIdentity, &szStunServer, &szProxy, &szBindAddr, &iRepeatCount, &szInDevice, &szOutDevice, &szCodec, &bCList, &bAEC, &bAGC, &bDenoise, &bUseCustomTransportReliable, &bUseCustomTransportUnreliable) && (iDuration > 0) && (portIsValid(iSipPort)) && (portIsValid(iRtpPort))) { // initialize sipx TAPI-like API sipxConfigSetLogLevel(LOG_LEVEL_DEBUG) ; sipxConfigSetLogFile("PlaceCall.log"); int mediaEngineSampleRate = 16000; sipxInitialize(&g_hInst, iSipPort, iSipPort, -1, iRtpPort, DEFAULT_CONNECTIONS, DEFAULT_IDENTITY, szBindAddr, false, // use sequential RTP/RTCP ports NULL, // cert. nickname NULL, // cert. password NULL, // DB location true, // Enable local audio mediaEngineSampleRate, 48000); // Audio device sample rate sipxConfigEnableRport(g_hInst, bUseRport) ; dumpInputOutputDevices() ; sipxEventListenerAdd(g_hInst, EventCallBack, NULL) ; // Enable/disable AEC. if (bAEC) sipxAudioSetAECMode(g_hInst, SIPX_AEC_CANCEL_AUTO) ; else sipxAudioSetAECMode(g_hInst, SIPX_AEC_DISABLED) ; // Enable/disable AGC sipxAudioSetAGCMode(g_hInst, bAGC); if (bDenoise) sipxAudioSetNoiseReductionMode(g_hInst, SIPX_NOISE_REDUCTION_HIGH); else sipxAudioSetNoiseReductionMode(g_hInst, SIPX_NOISE_REDUCTION_DISABLED); if (bCList) { int numAudioCodecs; int numVideoCodecs; int index; SIPX_AUDIO_CODEC audioCodec; SIPX_VIDEO_CODEC videoCodec; printf("Audio codecs:\n"); if (sipxConfigGetNumAudioCodecs(g_hInst, &numAudioCodecs) == SIPX_RESULT_SUCCESS) { for (index=0; index<numAudioCodecs; ++index) { if (sipxConfigGetAudioCodec(g_hInst, index, &audioCodec) == SIPX_RESULT_SUCCESS) { printf(" audio %02d : %s\n", index, audioCodec.cName); } else { printf("Error in retrieving audio codec #%d\n", index); } } } else { printf("Error in retrieving number of audio codecs\n"); } #ifdef VIDEO printf("Video codecs:\n"); if (sipxConfigGetNumVideoCodecs(g_hInst, &numVideoCodecs) == SIPX_RESULT_SUCCESS) { for (index=0; index<numVideoCodecs; ++index) { if (sipxConfigGetVideoCodec(g_hInst, index, &videoCodec) == SIPX_RESULT_SUCCESS) { printf(" video %02d : %s\n", index, videoCodec.cName); } else { printf("Error in retrieving video codec #%d\n"); } } } else { printf("Error in retrieving number of video codecs\n"); } #endif // VIDEO sipxUnInitialize(g_hInst, true); exit(0); } if (szProxy) { sipxConfigSetOutboundProxy(g_hInst, szProxy); } if (szStunServer) { sipxConfigEnableStun(g_hInst, szStunServer, DEFAULT_STUN_PORT, 28) ; } if (szOutDevice) { if (sipxAudioSetCallOutputDevice(g_hInst, szOutDevice) != SIPX_RESULT_SUCCESS) { printf("!! Setting output device %s failed !!\n", szOutDevice); } } if (szInDevice) { if (sipxAudioSetCallInputDevice(g_hInst, szInDevice) != SIPX_RESULT_SUCCESS) { printf("!! Setting input device %s failed !!\n", szOutDevice); } } if (szCodec) { if (sipxConfigSetAudioCodecByName(g_hInst, szCodec) == SIPX_RESULT_FAILURE) { printf("!! Setting audio codec to %s failed !!\n", szCodec); }; } // Wait for a STUN response (should actually look for the STUN event status // (config event) ; SLEEP(1500) ; for (int i=0; i<iRepeatCount; i++) { ClearSipXEvents() ; printf("<-> Attempt %d of %d\n", i+1, iRepeatCount) ; // Place a call to designed URL if (placeCall(szSipUrl, szFromIdentity, szUsername, szPassword, szRealm)) { bError = false ; // Play tones if provided if (szPlayTones) { if (!playTones(szPlayTones)) { printf("%s: Failed to play tones: %s\n", argv[0], szPlayTones) ; } else { bError = true ; } } // Play file if provided if (szFile) { if (!playFile(szFile)) { printf("%s: Failed to play file: %s\n", argv[0], szFile) ; } else { bError = true ; } } // Play file from buffer if provided if (szFileBuffer) { if (!playFileBuffer(szFileBuffer)) { printf("%s: Failed to play file from buffer: %s\n", argv[0], szFileBuffer) ; } else { bError = true ; } } // Leave the call up for specified time period (or wait for hangup) WaitForSipXEvent(CALLSTATE_DISCONNECTED, iDuration) ; // Shutdown / cleanup if (!shutdownCall()) { printf("%s: Failed to shutdown call\n", argv[0]) ; bError = true ; } } else { printf("%s: Unable to complete call\n", argv[0]) ; shutdownCall() ; bError = true ; } if (bError) { break ; } } sipxEventListenerRemove(g_hInst, EventCallBack, NULL) ; sipxUnInitialize(g_hInst, true); } else { usage(argv[0]) ; } #if defined(_WIN32) && defined(VIDEO) PostMessage(hMain, WM_CLOSE, 0, 0L); #endif return (int) bError ; }
int main(int argc, char **argv) { QCoreApplication app(argc, argv); if (argc >= 1 && qstrcmp(argv[1], "--system") == 0) { connection = &QDBus::systemBus(); --argc; ++argv; } else connection = &QDBus::sessionBus(); if (!connection->isConnected()) { fprintf(stderr, "Could not connect to D-Bus server: %s: %s\n", qPrintable(connection->lastError().name()), qPrintable(connection->lastError().message())); return 1; } QDBusBusService *bus = connection->busService(); if (argc == 1) { QStringList names = bus->ListNames(); foreach (QString name, names) printf("%s\n", qPrintable(name)); exit(0); } QString service = QLatin1String(argv[1]); if (!QDBusUtil::isValidBusName(service)) { fprintf(stderr, "Service '%s' is not a valid name.\n", qPrintable(service)); exit(1); } if (!bus->NameHasOwner(service)) { fprintf(stderr, "Service '%s' does not exist.\n", qPrintable(service)); exit(1); } if (argc == 2) { printf("/\n"); listObjects(service, QString()); exit(0); } QString path = QLatin1String(argv[2]); if (!QDBusUtil::isValidObjectPath(path)) { fprintf(stderr, "Path '%s' is not a valid path name.\n", qPrintable(path)); exit(1); } if (argc == 3) { listAllInterfaces(service, path); exit(0); } QString interface = QLatin1String(argv[3]); QString member; int pos = interface.lastIndexOf(QLatin1Char('.')); if (pos == -1) { member = interface; interface.clear(); } else { member = interface.mid(pos + 1); interface.truncate(pos); } if (!interface.isEmpty() && !QDBusUtil::isValidInterfaceName(interface)) { fprintf(stderr, "Interface '%s' is not a valid interface name.\n", qPrintable(interface)); exit(1); } if (!QDBusUtil::isValidMemberName(member)) { fprintf(stderr, "Method name '%s' is not a valid member name.\n", qPrintable(member)); exit(1); } if (interface.isEmpty()) { if (member.toLower() == QLatin1String("get") && argc == 5) { getProperty(service, path, QLatin1String(argv[4])); return 0; } else if (member.toLower() == QLatin1String("set") && argc == 6) { setProperty(service, path, QLatin1String(argv[4]), QLatin1String(argv[5])); return 0; } } placeCall(service, path, interface, member, argc - 4, argv + 4); }