Exemple #1
0
tERROR cTmProfile::UnlockTask()
{
	if( !m_lockRef )
		return errUNEXPECTED;

	if( --m_lockRef && !m_bFailOver )
		return (m_lockRef > 1) ? errOBJECT_ALREADY_EXISTS : errOK;

	m_taskRef.lock(false);
	m_taskObj = NULL;
	m_remoteTask = NULL;
	m_taskRef.unlock(false);

	if( m_task )
	{
		if( m_cfg.m_bRemote )
			m_tm->DestroyRemoteTask(m_task);
		else
			m_task->sysCloseObject();

		m_task = NULL;
		m_processId = PR_PROCESS_LOCAL;
	}

	close_object(m_token);

	PR_TRACE((m_tm, prtIMPORTANT, "tm\t%S - task closed (ref=%d)", m_sName.data(), m_ref));

	LockTaskReports(false);

	if( isService() && m_bClone )
		Delete();

	Release();
	return errOK;
}
Exemple #2
0
tERROR cTmProfile::CreateTask()
{
	if( !m_iid || m_bTaskGroup && !isService() && m_cfg.m_bRemote )
		return errOK;

	tERROR err = errOK;
	cAutoObj<cObj> task;

	PR_TRACE((m_tm, prtIMPORTANT, "tm\t%S - creating task...", m_sName.data()));

	if( m_cfg.m_bRemote )
		err = m_tm->CreateRemoteTask(this, task);
	else
		err = m_host->sysCreateObject((cObj**)&task, m_iid, m_pid);

	if( PR_SUCC(err) )
	{
		tDWORD nActivityId = m_dad && m_dad->m_dad ? m_dad->id() : id();

		task->propSetDWord( pgTASK_ID, id() );
		task->propSetDWord( pgTASK_PARENT_ID, nActivityId );
		task->propSetDWord( m_tm->m_prop_taskid, nActivityId );
		m_sType.copy( task, m_tm->m_prop_task_type );
		m_sName.copy( task, m_tm->m_prop_profile );
		InitDataStorage(task);

		err = AttachTask(task);
	}

	if( PR_SUCC(err) )
		task.relinquish();
	else
		PR_TRACE((m_tm, prtERROR, "tm\t%S - cannot create task object - %terr", m_sName.data(), err));

	return err;
}
Exemple #3
0
void MyFmsNotifyEvent::notify() const
{	
	switch(m_pAev->getType())
	{
		case IFmsAuthEvent::E_PLAY:
		{
			char* pAppName = getStringField(m_pAev, IFmsAuthEvent::F_APP_NAME);
			char* pAppInst = getStringField(m_pAev, IFmsAuthEvent::F_APP_INST);
			char* pAppUri = getStringField(m_pAev, IFmsAuthEvent::F_APP_URI);
			
			///new prtmp fields
			I8 sValue;
			if (getI8Field(m_pAev, IFmsAuthEvent::F_APP_PRTMP, sValue))
			{
				bool isProtected = sValue != 0;
			}
			char* pCommonKeyPath = getStringField(m_pAev, IFmsAuthEvent::F_APP_PRTMP_COMMON_KEY_FILE);
			U32 u32Value;
			if (getU32Field(m_pAev, IFmsAuthEvent::F_APP_PRTMP_VIDEO_ENC_LEVEL, u32Value))
			{
				U32 videoEncyption = u32Value;
			}
			I32 iValue;
			if (getI32Field(m_pAev, IFmsAuthEvent::F_APP_PRTMP_UPDATE_INTERVAL, iValue))
			{
				I32 updateInterval = iValue;
			}
			if (getI8Field(m_pAev, IFmsAuthEvent::F_APP_PRTMP_SWF_VERIFICATION, sValue))
			{
				bool isPrtmpSwf = sValue != 0;
			}
            char* pWhiteListPath = getStringField(m_pAev, IFmsAuthEvent::F_APP_PRTMP_SWF_WHITELIST_FOLDER);
			////////

			char* pClIp = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_IP);
			char* pClUri = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_URI);
			char* pClNewUri = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_REDIRECT_URI);
			char* pClVhost = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_VHOST);
			char* pClRef = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_REFERRER);
			char* pClPurl = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_PAGE_URL);
			char* pClAgent = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_USER_AGENT);
			char* pClRAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_READ_ACCESS);
			char* pClWAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_WRITE_ACCESS);
			char* pClAudioAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_AUDIO_SAMPLE_ACCESS);
			char* pClVideoAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_VIDEO_SAMPLE_ACCESS);
			char* pClProto = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_PROTO);
			char* pClUstem = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_URI_STEM);
			
			char* pStreamName = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME);
			char* pStreamType = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE);
			char* pStreamQuery = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_QUERY);
			char* pStreamPath = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_PATH);
			
			if (getI32Field(m_pAev, IFmsAuthEvent::F_CLIENT_AUDIO_CODECS, iValue))
			{
				bool bADPCM = isADPCMSupported(iValue);
			}
			if (getI32Field(m_pAev, IFmsAuthEvent::F_CLIENT_VIDEO_CODECS, iValue))
			{
				bool bVP6 = isVP6Supported(iValue);
			}			
			if (getI32Field(m_pAev, IFmsAuthEvent::F_CLIENT_TYPE, iValue))
			{	
				bool bService = isService(iValue);
			}
			if (getI32Field(m_pAev, IFmsAuthEvent::F_STREAM_ID, iValue))
			{	
				I32 iStreamId = iValue;
			}
						
			float fValue;
			if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_LENGTH, fValue))
			{
				float fLength = fValue; // in seconds
			}
			if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_POSITION, fValue))
			{
				float iPosition = fValue; // in seconds
			}

			I64 lValue;
			if (getI64Field(m_pAev, IFmsAuthEvent::F_CLIENT_ID, lValue))
			{
				I64 iClientId = lValue;		
			}
						
			
			if (getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_SECURE, sValue))
			{
				bool bSecure = sValue != 0;
			}
			if (getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_AMF_ENCODING, sValue))
			{
				bool bAMF3 = isAMF3(sValue);
			}
			if (getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_READ_ACCESS_LOCK, sValue))
			{			
				bool bRead = sValue != 0;
			}
			if (getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_WRITE_ACCESS_LOCK, sValue))
			{
				bool bWrite = sValue != 0;
			}
			if (getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_AUDIO_SAMPLE_ACCESS_LOCK, sValue))
			{
				bool bAudioRead = sValue != 0;
			}
			if (getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_VIDEO_SAMPLE_ACCESS_LOCK, sValue))
			{
				bool bVideoRead = sValue != 0;
			}
			if (getI8Field(m_pAev, IFmsAuthEvent::F_STREAM_RESET, sValue))
			{
				bool bReset = sValue != 0;
			}
			if (getI8Field(m_pAev, IFmsAuthEvent::F_STREAM_IGNORE, sValue))
			{
				bool bIgnore = sValue != 0;
			}
		}			
		break;
		
		case IFmsAuthEvent::E_SEEK:
		{
			float fValue;
			if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_SEEK_POSITION, fValue))
			{
				float fSeekTime = fValue;
			}

			// Disconnect Action example: disconnect the client that was 
			// specified by the E_SEEK notify event 
			FmsVariant field;
			if (m_pAev->getField(IFmsAuthEvent::F_CLIENT_ID, field) == IFmsAuthEvent::S_SUCCESS)
			{
				IFmsDisconnectAction* pAction = 
					const_cast<IFmsAuthEvent*>(m_pAev)->
						addDisconnectAction("Seek is not allowed. Blocked by adaptor");
				pAction->setClientId(field);
			}
		}
		break;

		case IFmsAuthEvent::E_CODEC_CHANGE:
		{
			char* pAppName = getStringField(m_pAev, IFmsAuthEvent::F_APP_NAME);
			char* pAppInst = getStringField(m_pAev, IFmsAuthEvent::F_APP_INST);
			char* pAppUri = getStringField(m_pAev, IFmsAuthEvent::F_APP_URI);
			
			char* pClIp = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_IP);
			char* pClUri = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_URI);
			char* pClNewUri = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_REDIRECT_URI);
			char* pClVhost = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_VHOST);
			char* pClRef = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_REFERRER);
			char* pClPurl = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_PAGE_URL);
			char* pClAgent = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_USER_AGENT);
			char* pClRAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_READ_ACCESS);
			char* pClWAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_WRITE_ACCESS);
			char* pClAudioAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_AUDIO_SAMPLE_ACCESS);
			char* pClVideoAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_VIDEO_SAMPLE_ACCESS);
			char* pClProto = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_PROTO);
			char* pClUstem = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_URI_STEM);
			
			char* pStreamName = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME);
			char* pStreamType = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE);
			char* pStreamQuery = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_QUERY);
			char* pStreamPath = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_PATH);

			U16 fType;
			if (getU16Field(m_pAev, IFmsAuthEvent::F_STREAM_CODEC_TYPE, fType))
			{
				U16 streamCodecType = fType;
				if (streamCodecType == kVIDEO_CODEC)
				{
					U16 fValue;
					if (getU16Field(m_pAev, IFmsAuthEvent::F_STREAM_CODEC, fValue))
					{				
						U16 streamCodecValue = fValue;
						if (streamCodecValue == VIDEO_CODEC_SORENSON)
						{
							// Disconnect Action example: Disallow clients trying 
							// to publish content with the sorenson video codec.
							FmsVariant field;
							if (m_pAev->getField(IFmsAuthEvent::F_CLIENT_ID, field) == IFmsAuthEvent::S_SUCCESS)
							{
								IFmsDisconnectAction* pAction = 
									const_cast<IFmsAuthEvent*>(m_pAev)->
									addDisconnectAction("Sorenson is not allowed. Blocked by adaptor");
								pAction->setClientId(field);
							}
						}
					}		
				}
			}				
		}
		break;
		case IFmsAuthEvent::E_RECORD_STOP:
		{
			char* pAppName = getStringField(m_pAev, IFmsAuthEvent::F_APP_NAME);
			char* pAppInst = getStringField(m_pAev, IFmsAuthEvent::F_APP_INST);
			char* pAppUri = getStringField(m_pAev, IFmsAuthEvent::F_APP_URI);
			
			char* pClIp = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_IP);
			char* pClUri = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_URI);
			char* pClNewUri = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_REDIRECT_URI);
			char* pClVhost = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_VHOST);
			char* pClRef = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_REFERRER);
			char* pClPurl = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_PAGE_URL);
			char* pClAgent = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_USER_AGENT);
			char* pClRAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_READ_ACCESS);
			char* pClWAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_WRITE_ACCESS);
			char* pClAudioAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_AUDIO_SAMPLE_ACCESS);
			char* pClVideoAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_VIDEO_SAMPLE_ACCESS);
			char* pClProto = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_PROTO);
			char* pClUstem = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_URI_STEM);
			
			char* pStreamName = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME);
			char* pStreamType = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE);
			char* pStreamQuery = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_QUERY);
			char* pStreamPath = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_PATH);
			
			float fValue;	
			if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_RECORD_MAXSIZE, fValue))
			{
				float recMaxSize = fValue; // in kilobytes
			}			
			if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_RECORD_MAXDURATION, fValue))
			{
				float recMaxDuration = fValue;	// in seconds
			}	
		}
		break;
		case IFmsAuthEvent::E_SWF_VERIFY_COMPLETE:
		{
			char* pClIp = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_IP);

			I8 version;	// version of SWF verification 
			getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_VERSION, version);

			I64 depth; // depth in the SWF file hashed
			getI64Field(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_DEPTH, depth);

			I32 ttl; // time to live of the SWF hash provided
			getI32Field(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_TTL, ttl);

			// digest provided to match against
			U8* buffer = getBufferField(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_DIGEST);

			// result of the attempted match-- see FmsAuthEvents.h enum
			// eSWFMatch for the meaning of this field
			I32 match;	
			getI32Field(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_RESULT, match);

			std::stringstream stream;
			stream << "swf verification for client: " 
					<< std::string(pClIp) 
					<< " is complete, the result is: " << match;
			m_pFmsAuthServerContext->log(stream.str().c_str(), IFmsServerContext::kInformation, false);
		}
		break;

		case IFmsAuthEvent::E_APPSTART:
		case IFmsAuthEvent::E_APPSTOP:
		case IFmsAuthEvent::E_CONNECT:
		case IFmsAuthEvent::E_DISCONNECT:
		case IFmsAuthEvent::E_FILENAME_TRANSFORM:
		case IFmsAuthEvent::E_STOP:
		case IFmsAuthEvent::E_PAUSE:
		case IFmsAuthEvent::E_PUBLISH:
		case IFmsAuthEvent::E_UNPUBLISH:
		case IFmsAuthEvent::E_LOADSEGMENT:
		case IFmsAuthEvent::E_ACTION:
		case IFmsAuthEvent::E_RECORD:
		case IFmsAuthEvent::E_CLIENT_PAUSE:
		case IFmsAuthEvent::E_SWF_VERIFY:
		case IFmsAuthEvent::E_CLIENT_SEEK:
		case IFmsAuthEvent::E_START_TRANSMIT:
		case IFmsAuthEvent::E_STOP_TRANSMIT:
		case IFmsAuthEvent::E_MAXEVENT:
		break;

	}	
	char buf[1024];
	sprintf(buf, "Received notification type=%d id=%p\n", m_pAev->getType(), m_pAev);

	// log to the configured FMS log directory. If the third parameter is true,
	// also send the log to the system event log.
	m_pFmsAuthServerContext->log(buf, IFmsServerContext::kInformation, false); 
	m_pFmsAuthServerContext->onNotify(m_pAev);
}
Exemple #4
0
/* Parse and check command line parameters. Return config file name or NULL
 * On error prints usage information and exit (see usage() function)
 */
char *parseargs (int argc, char *argv[])
{
  char *cfgfile=NULL;
  int i, curind;

  curind = 1;
  while ((i = getopt(argc, argv, optstring)) != -1)
  {
	switch (i)
	  {
	    case '-':
	      /* GNU-style options */
	      if (!strcmp (argv[curind], "--help"))
		usage ();
	      else
#if defined (BINKD9X)
	      if (!strcmp (argv[curind], Win9xStartService))
	        service_flag = w32_run_as_service;
	      else
#endif
		Log (0, "%s: %s: unknown command line switch", extract_filename(argv[0]), argv[curind]);
	      break;
	    case 'C':
	      checkcfg_flag = 1;
	      break;
	    case 'c':
	      client_flag = 1;
	      break;
	    case 'i':
	      inetd_flag = 1;
	      break;
	    case 'a': /* remote IP address */
	      remote_addr = strdup(optarg);
	      break;
	    case 'f': /* remote FTN address */
	      remote_node = strdup(optarg);
	      break;
#if defined(WIN32)
#if !defined (BINKD9X)
	    case 'T':
	      tray_flag = 1;
	      break;
#endif

	    case 't': /* service control/query */
	      if (isService()) break;
	      if ((service_flag != w32_noservice)) {
	        Log (0, "%s: multiple '-t' switch", extract_filename(argv[0]));
	      }
	      if (!strcmp (optarg, "status"))
	        service_flag = w32_queryservice;
	      else if (!strcmp (optarg, "start"))
	        service_flag = w32_startservice;
	      else if (!strcmp (optarg, "stop"))
	        service_flag = w32_stopservice;
	      else if (!strcmp (optarg, "restart"))
	        service_flag = w32_restartservice;
	      else if (!strcmp (optarg, "install"))
	        service_flag = w32_installservice;
	      else if (!strcmp (optarg, "uninstall"))
	        service_flag = w32_uninstallservice;
	      else
	        Log (0, "%s: '-t': invalid argument '%s'", extract_filename(argv[0]), optarg);
	      break;
	    case 'S':
	      if (service_name)
	        Log(0, "%s: '-S %s': service name specified before, can't overwrite!", extract_filename(argv[0]), optarg);
	      service_name = strdup (optarg);
	      break;
#endif

	    case 'P': /* create poll to node */
	      {
	        struct maskchain new_entry;

	        new_entry.mask = xstrdup(optarg);
	        simplelist_add(&psPolls.linkpoint, &new_entry, sizeof(new_entry));
	      }
	      break;

	    case 'p': /* run clients and exit */
	      poll_flag = client_flag = 1;
	      break;

	    case 'q': /* quiet */
	      quiet_flag = 1;
	      break;

	    case 's': /* run server only */
	      server_flag = 1;
	      break;

	    case 'm': /* MD5 off */
	      no_MD5 = 1;
	      /* fallthrough */

	    case 'r': /* CRYPT off */
	      no_crypt = 1;
	      break;

	    case 'v': /* verbose */
	      ++verbose_flag;
	      break;

	    case 'd': /* dump cfg */
	      ++dumpcfg_flag;
	      break;

#ifdef BINKD_DAEMONIZE
	    case 'D': /* run as unix daemon */
	      daemon_flag = 1;
	      break;
#endif

	    default:  /* unknown parameter/option */
	      if (optopt != '?')
	      /* getopt() already print error message
	      Log (0, "%s: %s: unknown command line switch", extract_filename(argv[0]), argv[curind]);
	      */ exit(1);

	    case 'n':
	      no_flag = 1;
	      break;

	    case 'h': /* display command line help */
	      usage();

	  }
	curind = optind;
  }
  if (optind<argc)
    cfgfile = argv[optind++];
#ifdef OS2
  if (optind<argc)
  { if ((inetd_socket_in = atoi(argv[argc-1])) == 0 && !isdigit(argv[argc-1][0]))
      Log (0, "%s: bad socket number", argv[optind]);
#ifdef EMX
    if ((inetd_socket_in = _impsockhandle (inetd_socket_in, 0)) == -1)
      Log (0, "_impsockhandle: %s", strerror (errno));
#endif
    inetd_socket_out = inetd_socket_in;
    argc++;
  }
#endif
  if (optind<argc)
    Log (1, "Extra parameters ignored");

  return cfgfile;
}