锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / Darwin服务器 / Darwin使用属性
服务方向
人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

使用属性


QTSS对象是由用于存储数据的属性组成的。每个属性都有一个名称,一个属性ID,一个数据类型,以及一个用于控制读写属性值的权限。有两种属性类型:

  • 静态属性。静态属性可用于一个对象类型的所有实例。模块只能在Register角色中将静态属性添加到对象中。所有服务器内置的属性都是静态属性。
  • 实例属性。实例属性添加到相应的对象类型的特定实例中。模块可以使用任何角色来将实例属性添加到相应的对象中,也可以删除已经添加到对象中的实例属性。

请注意:添加静态属性的效率要比添加实例属性高,因此我们强烈推荐添加静态属性,而不是实例属性。

获取属性值

模块通过存储在对象中的属性来和服务器交换信息,因此会经常读取属性的值。有三个回调例程可以用于获取属性值:

  • QTSS_GetValue,将属性值拷贝到由模块提供的缓冲区中。这个回调函数可以用来获取任何属性的值,但是其效率不如QTSS_GetValuePtr函数。
  • QTSS_GetValueAsString,将属性值作为一个字符串拷贝到由模块提供的缓冲区中。这个回调函数可以用来获取任何属性的值,是效率最低的获取属性值的方法。
  • QTSS_GetValuePtr,返回一个指向服务器内部的属性值拷贝的指针。这是获取抢占访问安全的属性的最有效方法。这个函数也可以用于获取非抢占访问安全的属性,但是需要首先将对象锁定,在QTSS_GetValuePtr函数调用之后则需要解锁。在获取一个非抢占访问安全的属性时,调用QTSS_GetValue函数可能比首先锁定对象,然后调用QTSS_GetValuePtr函数,最后解锁对象的效率要高。

列表 2-1中的实例代码调用QTSS_GetValue函数来获取qtssRTPSvrCurConn属性的值,这个属性属于QTSS_ServerObject object对象,是一个非抢占访问安全的属性。


Listing 2-1 Getting the value of an attribute by calling QTSS_GetValue

UInt32 MyGetNumCurrentConnections(QTSS_ServerObject inServerObject)

{

// qtssRTPSvrCurConn is a UInt32, so provide a UInt32 for the result.

UInt32 theNumConnections = 0;

// Pass in the size of the attribute value.

UInt32 theLength = sizeof(theNumConnections);

// Retrieve the value.

QTSS_Error theErr = QTSS_GetValue(inServerObject, qtssRTPSvrCurConn, 0,

        &theNumConnections, &theLength);

// Check for errors. If the length is not what was expected, return 0.

if ((theErr != QTSS_NoErr) || (theLength != sizeof(theNumConnections))

        return 0;

return theNumConnections;

}

 

列表 2-2调用了QTSS_GetValuePtr函数,这是获取抢占访问安全的属性的推荐方法。在这个实例中,qtssRTSPReqMethod属性的值从QTSS_RTSPRequestObject对象中得到。


Listing 2-2 Getting the value of an attribute by calling QTSS_GetValuePtr

QTSS_RTSPMethod MyGetRTSPRequestMethod(QTSS_RTSPRequestObject inRTSPRequestObject)

{

QTSS_RTSPMethod* theMethod = NULL;

UInt32 theLen = 0;

QTSS_Error theErr = QTSS_GetValuePtr(inRTSPRequestObject, qtssRTSPReqMethod, 0,

(void**)&theMethod, &theLen);

if ((theErr != QTSS_NoErr) || (theLen != sizeof(QTSS_RTSPMethod))

return -1;  // Return a -1 if there is an error, which is not a valid

                // QTSS_RTSPMethod index

else

return *theMethod;

}

 

您可以通过调用QTSS_GetValueAsString函数来获取任何属性的值,该函数将属性值处理为一个C字符串。当您不知道属性包含的数据的类型时,调用QTSS_GetValueAsString 函数是非常便利的。

在列表 2-3中,qtssRTPSvrCurConn属性值从QTSS_ServerObject对象得到,并处理为字符串。


Listing 2-3 Getting the value of an attribute by calling QTSS_GetValueAsString

void MyPrintNumCurrentConnections(QTSS_ServerObject inServerObject)

{

// Provide a string pointer for the result

char* theCurConnString = NULL;

// Retrieve the value as a string.

QTSS_Error theErr = QTSS_GetValueAsString(inServerObject, qtssRTPSvrCurConn, 0, &theCurConnString);

if (theErr != QTSS_NoErr) return;

// Print out the result. Because the value was returned as a string, use

// %s in the printf format.

::printf("Number of currently connected clients: %s\n", theCurConnString);

// QTSS_GetValueAsString allocates memory, so reclaim the memory by calling QTSS_Delete.

QTSS_Delete(theCurConnString);

}

 

设定属性值

有两个QTSS回调函数可用于设定属性的值:QTSS_SetValue和QTSS_SetValuePtr。

列表2-4中的实例代码在处理Route角色的地方可以找到。代码中调用QTSS_GetValuePtr函数来获取qtssRTSPReqFilePath属性的值。如果获得的路径和特定的字符串相匹配,则调用QTSS_SetValue函数来将qtssRTSPReqRootDir属性设置为新的路径,从而为请求设定一个新的根路径。


Listing 2-4 Setting the value of an attribute by calling QTSS_SetValue

// First get the file path for this request using QTSS_GetValuePtr

char* theFilePath = NULL;

UInt32 theFilePathLen = 0;

QTSS_Error theErr = QTSS_GetValuePtr(inParams->inRTSPRequest, qtssRTSPReqFilePath, 0, &theFilePath,

                &theFilePathLen);

// Check for any errors

if (theErr != QTSS_NoErr) return;

// See if this path is a match. If it is, use QTSS_SetValue to set the root directory for this request.

if ((theFilePathLen == sStaticFilePathLen) &&

                    (::strncmp(theFilePath, sStaticFilePath, theFilePathLen) == 0))

{

theErr = QTS_SetValue(inParams->inRTSPRequest, qtssRTSPReqRootDir, 0, sNewRootDirString,

            sNewRootDirStringLen);

if (theErr != QTSS_NoErr) return;

}

 

列表 2-5演示了如何使用QTSS_SetValuePtr回调函数。QTSS_SetValuePtr函数将一个属性和一个模块变量的值进行关联。这个例子代码的目的是以非原子的形式对QTSS_ServerObject对象进行修改,因此调用QTSS_LockObject函数来避免其它线程在QTSS_ServerObject对象的属性值设定完成之前访问该属性。

接着调用QTSS_CreateObjectValue函数来创建一个QTSS_ConnectedUserObject对象,以便给QTSS_ServerObject对象的qtssSvrConnectedUsers属性赋值。然后,再调用QTSS_SetValuePtr函数,将QTSS_ConnectedUserObject对象的qtssConnectionBytesSent属性设定为模块的fBytesSent变量。在此之后,任何模块获取qtssConnectionBytesSent属性值的时候,得到的是模块的fBytesSent v变量的当前值。

在QTSS_SetValuePtr函数之后,代码就调用QTSS_UnlockObject函数,来解锁QTSS_ServerObject对象。


Listing 2-5 Setting the value of an attribute by calling QTSS_SetValuePtr

UInt32 index;

QTSS_LockObject(sServer);

QTSS_CreateObjectValue(sServer, qtssSvrConnectedUsers, qtssConnectedUserTypeObject, &index, &fQTSSObject);

QTSS_CreateObjectValue(sServer, qtssSvrConnectedUsers, qtssConnectedUserObjectType, &index, &fQTSSObject);

QTSS_SetValuePtr(fQTSSObject, qtssConnectionBytesSent, &fBytesSent, sizeof(fBytesSent));

QTSS_UnlockObject(sServer);

 

增加属性

模块可以在Register角色中调用QTSS_AddStaticAttribute回调函数,来将一个属性添加到QTSS对象中去;还可以在任何角色中调用QTSS_AddInstanceAttribute函数,想对象的实例添加属性。

请注意:向对象类型或者对象实例中添加一个或者多个属性,是模块存储专用与某个特定会话的最有效和推荐的方法。

一旦添加完成,新属性就会被包含在由服务器创建的每一个相应类型的对象中,而且它的值也可以调用如下与操作服务器内置属性相同的方法来进行设置和获取:QTSS_SetValue,QTSS_SetValuePtr,QTSS_GetValue,和QTSS_GetValuePtr.

请注意:如果要往您自己创建的模块中添加属性,则必须首先调用QTSS_LockObject函数来锁定对象,在所有属性添加完成之后,调用QTSS_UnlockObject 函数来解锁对象。

列表 2-6中的实例代码调用QTSS_AddStaticAttribute函数来往QTSS_ClientSessionObject对象中添加属性:


Listing 2-6 Adding a static attribute

QTSS_Error MyRegisterRoleFunction()

{

// Add the static attribute. The third parameter is always NULL.

QTSS_Error theErr = QTSS_AddStaticAttribute(qtssClientSessionObjectType,
“MySampleAttribute”, NULL, qtssAttrDataTypeUInt32);
  // Retrieve the ID for this attribute. This ID can be passed into QTSS_GetValue,
  // QTSS_SetValue, and QTSS_GetValuePtr.
  QTSS_AttributeID theID;
theErr = QTSS_IDForAttr(qtssClientSessionObjectType, MySampleAttribute", &theID);
  // Store the attribute ID in a global for later use. Attribute IDs do not
  // change while the server is running.
 gMyExampleAttrID = theID;
}

请注意:添加了的属性(静态属性或者实例属性)的属性权限会被自动设置为可读,可写,和抢占访问安全。

友情链接
版权所有 Copyright(c)2004-2021 锐英源软件
公司注册号:410105000449586 豫ICP备08007559号 最佳分辨率 1024*768
地址:郑州大学北校区院(文化路97号院)内