Remove protocol names, instead use an enum with common protocols

The whole protocol name thing is pretty weird. The getprotobyname functions
seem to only specify one mapping for name <-> ids, so all families/types
must use the same values. Plus the values used for the protocols are
standardized by IANA, so are always the same.

So, we drop using names for protocols, intead introducing an enum with
a few commonly availible and used protocols.
This commit is contained in:
Alexander Larsson 2009-05-20 12:01:29 +02:00
parent 6d01593b06
commit 5cd86fbda6
16 changed files with 417 additions and 172 deletions

View File

@ -0,0 +1,100 @@
GFenDirectoryMonitor
GFenDirectoryMonitorClass
GFenFileMonitor
GFenFileMonitorClass
GLocalFileIOStream
GLocalFileIOStreamClass
GLocalFileIOStreamPrivate
GSocketInputStream
GSocketInputStreamClass
GSocketInputStreamPrivate
GSocketOutputStream
GSocketOutputStreamClass
GSocketOutputStreamPrivate
GWin32DirectoryMonitor
GWin32DirectoryMonitorClass
GWin32DirectoryMonitorPrivate
GWin32Mount
GWin32MountClass
GWin32Volume
GWin32VolumeMonitor
GWin32VolumeMonitorClass
GWinHttpDllFuncs
GWinHttpFile
GWinHttpFileClass
GWinHttpFileInputStream
GWinHttpFileInputStreamClass
GWinHttpFileOutputStream
GWinHttpFileOutputStreamClass
GWinHttpVfs
GWinHttpVfsClass
G_FEN_DIRECTORY_MONITOR
G_FEN_DIRECTORY_MONITOR_CLASS
G_FEN_FILE_MONITOR
G_FEN_FILE_MONITOR_CLASS
G_FILE_ATTRIBUTE_STANDARD_ALLOCATED_SIZE
G_IS_FEN_DIRECTORY_MONITOR
G_IS_FEN_DIRECTORY_MONITOR_CLASS
G_IS_FEN_FILE_MONITOR
G_IS_FEN_FILE_MONITOR_CLASS
G_IS_LOCAL_FILE_IO_STREAM
G_IS_LOCAL_FILE_IO_STREAM_CLASS
G_IS_SOCKET_INPUT_STREAM
G_IS_SOCKET_INPUT_STREAM_CLASS
G_IS_SOCKET_OUTPUT_STREAM
G_IS_SOCKET_OUTPUT_STREAM_CLASS
G_IS_WIN32_DIRECTORY_MONITOR
G_IS_WIN32_DIRECTORY_MONITOR_CLASS
G_IS_WIN32_MOUNT
G_IS_WIN32_MOUNT_CLASS
G_IS_WIN32_VOLUME_MONITOR
G_IS_WIN32_VOLUME_MONITOR_CLASS
G_IS_WINHTTP_FILE
G_IS_WINHTTP_FILE_CLASS
G_IS_WINHTTP_FILE_INPUT_STREAM
G_IS_WINHTTP_FILE_INPUT_STREAM_CLASS
G_IS_WINHTTP_FILE_OUTPUT_STREAM
G_IS_WINHTTP_FILE_OUTPUT_STREAM_CLASS
G_IS_WINHTTP_VFS
G_IS_WINHTTP_VFS_CLASS
G_LOCAL_FILE_IO_STREAM
G_LOCAL_FILE_IO_STREAM_CLASS
G_LOCAL_FILE_IO_STREAM_GET_CLASS
G_SOCKET_INPUT_STREAM
G_SOCKET_INPUT_STREAM_CLASS
G_SOCKET_INPUT_STREAM_GET_CLASS
G_SOCKET_OUTPUT_STREAM
G_SOCKET_OUTPUT_STREAM_CLASS
G_SOCKET_OUTPUT_STREAM_GET_CLASS
G_TYPE_FEN_DIRECTORY_MONITOR
G_TYPE_FEN_FILE_MONITOR
G_TYPE_LOCAL_FILE_IO_STREAM
G_TYPE_SOCKET_OUTPUT_STREAM
G_TYPE_WIN32_DIRECTORY_MONITOR
G_TYPE_WIN32_MOUNT
G_TYPE_WIN32_VOLUME_MONITOR
G_TYPE_WINHTTP_FILE
G_TYPE_WINHTTP_FILE_INPUT_STREAM
G_TYPE_WINHTTP_FILE_OUTPUT_STREAM
G_TYPE_WINHTTP_VFS
G_WIN32_DIRECTORY_MONITOR
G_WIN32_DIRECTORY_MONITOR_CLASS
G_WIN32_DIRECTORY_MONITOR_GET_CLASS
G_WIN32_MOUNT
G_WIN32_MOUNT_CLASS
G_WIN32_VOLUME_MONITOR
G_WIN32_VOLUME_MONITOR_CLASS
G_WINHTTP_FILE
G_WINHTTP_FILE_CLASS
G_WINHTTP_FILE_GET_CLASS
G_WINHTTP_FILE_INPUT_STREAM
G_WINHTTP_FILE_INPUT_STREAM_CLASS
G_WINHTTP_FILE_INPUT_STREAM_GET_CLASS
G_WINHTTP_FILE_OUTPUT_STREAM
G_WINHTTP_FILE_OUTPUT_STREAM_CLASS
G_WINHTTP_FILE_OUTPUT_STREAM_GET_CLASS
G_WINHTTP_VFS
G_WINHTTP_VFS_CLASS
G_WINHTTP_VFS_GET_CLASS
g_win32_directory_monitor_get_type
g_win32_directory_monitor_register

74
docs/reference/gio/aa Normal file
View File

@ -0,0 +1,74 @@
<book lang=
<!ENTITY version SYSTEM
xml/extensionpoints.xml
xml/gappinfo.xml
xml/gasyncinitable.xml
xml/gasyncresult.xml
xml/gbufferedinputstream.xml
xml/gbufferedoutputstream.xml
xml/gcancellable.xml
xml/gcontenttype.xml
xml/gdatainputstream.xml
xml/gdataoutputstream.xml
xml/gdesktopappinfo.xml
xml/gdrive.xml
xml/gemblemedicon.xml
xml/gemblem.xml
xml/gfileattribute.xml
xml/gfileenumerator.xml
xml/gfileicon.xml
xml/gfileinfo.xml
xml/gfileinputstream.xml
xml/gfileiostream.xml
xml/gfilemonitor.xml
xml/gfilenamecompleter.xml
xml/gfileoutputstream.xml
xml/gfile.xml
xml/gfilterinputstream.xml
xml/gfilteroutputstream.xml
xml/gicon.xml
xml/ginetaddress.xml
xml/ginetsocketaddress.xml
xml/ginitable.xml
xml/ginputstream.xml
xml/gioerror.xml
xml/giomodule.xml
xml/gioscheduler.xml
xml/giostream.xml
xml/gloadableicon.xml
xml/gmemoryinputstream.xml
xml/gmemoryoutputstream.xml
xml/gmountoperation.xml
xml/gmount.xml
xml/gnetworkaddress.xml
xml/gnetworkservice.xml
xml/goutputstream.xml
xml/gresolver.xml
xml/gseekable.xml
xml/gsimpleasyncresult.xml
xml/gsocketaddress.xml
xml/gsocketclient.xml
xml/gsocketconnectable.xml
xml/gsocketconnection.xml
xml/gsocketcontrolmessage.xml
xml/gsocketlistener.xml
xml/gsocketservice.xml
xml/gsocket.xml
xml/gsrvtarget.xml
xml/gtcpconnection.xml
xml/gthemedicon.xml
xml/gthreadedsocketservice.xml
xml/gunixconnection.xml
xml/gunixfdmessage.xml
xml/gunixinputstream.xml
xml/gunixmounts.xml
xml/gunixoutputstream.xml
xml/gunixsocketaddress.xml
xml/gvfs.xml
xml/gvolumemonitor.xml
xml/gvolume.xml
xml/migrating.xml
xml/overview.xml
xml/tree_index.sgml
<?xml version=

77
docs/reference/gio/b Normal file
View File

@ -0,0 +1,77 @@
xml/api-index-2.18.xml
xml/api-index-2.18..xml
xml/api-index-2,20.xml
xml/api-index-2.20.xml
xml/api-index-2.22.xml
xml/api-index-2.22..xml
xml/api-index-deprecated.xml
xml/api-index-full.xml
xml/extensionpoints.xml
xml/gappinfo.xml
xml/gasyncinitable.xml
xml/gasyncresult.xml
xml/gbufferedinputstream.xml
xml/gbufferedoutputstream.xml
xml/gcancellable.xml
xml/gcontenttype.xml
xml/gdatainputstream.xml
xml/gdataoutputstream.xml
xml/gdesktopappinfo.xml
xml/gdrive.xml
xml/gemblemedicon.xml
xml/gemblem.xml
xml/gfileattribute.xml
xml/gfileenumerator.xml
xml/gfileicon.xml
xml/gfileinfo.xml
xml/gfileinputstream.xml
xml/gfileiostream.xml
xml/gfilemonitor.xml
xml/gfilenamecompleter.xml
xml/gfileoutputstream.xml
xml/gfile.xml
xml/gfilterinputstream.xml
xml/gfilteroutputstream.xml
xml/gicon.xml
xml/ginetaddress.xml
xml/ginetsocketaddress.xml
xml/ginitable.xml
xml/ginputstream.xml
xml/gioerror.xml
xml/giomodule.xml
xml/gioscheduler.xml
xml/giostream.xml
xml/gloadableicon.xml
xml/gmemoryinputstream.xml
xml/gmemoryoutputstream.xml
xml/gmountoperation.xml
xml/gmount.xml
xml/gnetworkaddress.xml
xml/gnetworkservice.xml
xml/goutputstream.xml
xml/gresolver.xml
xml/gseekable.xml
xml/gsimpleasyncresult.xml
xml/gsocketaddress.xml
xml/gsocketclient.xml
xml/gsocketconnectable.xml
xml/gsocketconnection.xml
xml/gsocketcontrolmessage.xml
xml/gsocketlistener.xml
xml/gsocketservice.xml
xml/gsocket.xml
xml/gsrvtarget.xml
xml/gtcpconnection.xml
xml/gthemedicon.xml
xml/gthreadedsocketservice.xml
xml/gunixconnection.xml
xml/gunixfdmessage.xml
xml/gunixinputstream.xml
xml/gunixmounts.xml
xml/gunixoutputstream.xml
xml/gunixsocketaddress.xml
xml/gvfs.xml
xml/gvolumemonitor.xml
xml/gvolume.xml
xml/migrating.xml
xml/overview.xml

77
docs/reference/gio/bb Normal file
View File

@ -0,0 +1,77 @@
xml/api-index-2.18.xml
xml/api-index-2.18..xml
xml/api-index-2,20.xml
xml/api-index-2.20.xml
xml/api-index-2.22.xml
xml/api-index-2.22..xml
xml/api-index-deprecated.xml
xml/api-index-full.xml
xml/extensionpoints.xml
xml/gappinfo.xml
xml/gasyncinitable.xml
xml/gasyncresult.xml
xml/gbufferedinputstream.xml
xml/gbufferedoutputstream.xml
xml/gcancellable.xml
xml/gcontenttype.xml
xml/gdatainputstream.xml
xml/gdataoutputstream.xml
xml/gdesktopappinfo.xml
xml/gdrive.xml
xml/gemblemedicon.xml
xml/gemblem.xml
xml/gfileattribute.xml
xml/gfileenumerator.xml
xml/gfileicon.xml
xml/gfileinfo.xml
xml/gfileinputstream.xml
xml/gfileiostream.xml
xml/gfilemonitor.xml
xml/gfilenamecompleter.xml
xml/gfileoutputstream.xml
xml/gfile.xml
xml/gfilterinputstream.xml
xml/gfilteroutputstream.xml
xml/gicon.xml
xml/ginetaddress.xml
xml/ginetsocketaddress.xml
xml/ginitable.xml
xml/ginputstream.xml
xml/gioerror.xml
xml/giomodule.xml
xml/gioscheduler.xml
xml/giostream.xml
xml/gloadableicon.xml
xml/gmemoryinputstream.xml
xml/gmemoryoutputstream.xml
xml/gmountoperation.xml
xml/gmount.xml
xml/gnetworkaddress.xml
xml/gnetworkservice.xml
xml/goutputstream.xml
xml/gresolver.xml
xml/gseekable.xml
xml/gsimpleasyncresult.xml
xml/gsocketaddress.xml
xml/gsocketclient.xml
xml/gsocketconnectable.xml
xml/gsocketconnection.xml
xml/gsocketcontrolmessage.xml
xml/gsocketlistener.xml
xml/gsocketservice.xml
xml/gsocket.xml
xml/gsrvtarget.xml
xml/gtcpconnection.xml
xml/gthemedicon.xml
xml/gthreadedsocketservice.xml
xml/gunixconnection.xml
xml/gunixfdmessage.xml
xml/gunixinputstream.xml
xml/gunixmounts.xml
xml/gunixoutputstream.xml
xml/gunixsocketaddress.xml
xml/gvfs.xml
xml/gvolumemonitor.xml
xml/gvolume.xml
xml/migrating.xml
xml/overview.xml

View File

@ -1631,6 +1631,7 @@ g_network_service_get_type
GSocket GSocket
GSocketSourceFunc GSocketSourceFunc
GSocketType GSocketType
GSocketProtocol
GSocketMsgFlags GSocketMsgFlags
GInputVector GInputVector
GOutputVector GOutputVector
@ -1663,11 +1664,9 @@ g_socket_set_keepalive
g_socket_get_family g_socket_get_family
g_socket_get_fd g_socket_get_fd
g_socket_get_local_address g_socket_get_local_address
g_socket_get_protocol_id g_socket_get_protocol
g_socket_get_protocol_name
g_socket_get_remote_address g_socket_get_remote_address
g_socket_get_socket_type g_socket_get_socket_type
g_socket_protocol_id_lookup_by_name
<SUBSECTION Standard> <SUBSECTION Standard>
GSocketClass GSocketClass
G_IS_SOCKET G_IS_SOCKET

View File

@ -1078,9 +1078,7 @@ g_socket_get_fd
g_socket_get_keepalive g_socket_get_keepalive
g_socket_get_listen_backlog g_socket_get_listen_backlog
g_socket_get_local_address g_socket_get_local_address
g_socket_get_protocol_id g_socket_get_protocol
g_socket_get_protocol_name
g_socket_protocol_id_lookup_by_name
g_socket_get_remote_address g_socket_get_remote_address
g_socket_get_socket_type g_socket_get_socket_type
g_socket_is_closed g_socket_is_closed

View File

@ -556,6 +556,30 @@ typedef enum
G_SOCKET_MSG_DONTROUTE = GLIB_SYSDEF_MSG_DONTROUTE G_SOCKET_MSG_DONTROUTE = GLIB_SYSDEF_MSG_DONTROUTE
} GSocketMsgFlags; } GSocketMsgFlags;
/**
* GSocketProtocol:
* @G_SOCKET_PROTOCOL_UNKNOWN: The protocol type is unknown
* @G_SOCKET_PROTOCOL_DEFAULT: The default protocol for the family/type
* @G_SOCKET_PROTOCOL_TCP: Tcp over IP
* @G_SOCKET_PROTOCOL_UDP: UDP over IP
* @G_SOCKET_PROTOCOL_SCTP: SCTP over IP
*
* A protocol identifier is specified when creating a #GSocket, which is a family/type
* specific identifier, where 0 means the default protocol for the particular family/type.
* This enum contains a set of commonly availible and used protocols. You can also
* pass any other identifiers handled by the platform in order to use protocols not
* listed here.
*
* Since: 2.22
*/
typedef enum {
G_SOCKET_PROTOCOL_UNKNOWN = -1,
G_SOCKET_PROTOCOL_DEFAULT = 0,
G_SOCKET_PROTOCOL_TCP = 6,
G_SOCKET_PROTOCOL_UDP = 17,
G_SOCKET_PROTOCOL_SCTP = 132
} GSocketProtocol;
G_END_DECLS G_END_DECLS
#endif /* __GIO_ENUMS_H__ */ #endif /* __GIO_ENUMS_H__ */

View File

@ -132,7 +132,7 @@ struct _GSocketPrivate
{ {
GSocketFamily family; GSocketFamily family;
GSocketType type; GSocketType type;
gint protocol; GSocketProtocol protocol;
gint fd; gint fd;
gint listen_backlog; gint listen_backlog;
GError *construct_error; GError *construct_error;
@ -400,88 +400,10 @@ g_socket_details_from_fd (GSocket *socket)
socket_strerror (errsv)); socket_strerror (errsv));
} }
static char *
get_protocol_name (int protocol_id)
{
struct protoent *protoent;
#ifdef HAVE_GETPROTOBYNUMBER_R
char buffer[1024];
struct protoent my_protoent;
#endif
if (protocol_id == 0)
return NULL;
if (protocol_id == -1)
return g_strdup ("unknown");
#ifdef HAVE_GETPROTOBYNUMBER_R
protoent = NULL;
getprotobynumber_r (protocol_id,
&my_protoent, buffer, sizeof (buffer),
&protoent);
#else
protoent = getprotobynumber (protocol_id);
#endif
if (protoent == NULL)
return g_strdup_printf ("proto-%d", protocol_id);
return g_strdup (protoent->p_name);
}
/**
* g_socket_protocol_id_lookup_by_name:
* @protocol_name: The name of a protocol, or %NULL
*
* Tries to look up the protocol id for a given
* protocol name. If the protocol name is not known
* on this system it returns -1.
*
* If @protocol_name is %NULL (default protocol) then
* 0 is returned.
*
* Returns: a protocol id, or -1 if unknown
*
* Since: 2.22
**/
gint
g_socket_protocol_id_lookup_by_name (const char *protocol_name)
{
struct protoent *protoent;
int protocol = 0;
#ifdef HAVE_GETPROTOBYNAME_R
char buffer[1024];
struct protoent my_protoent;
#endif
if (!protocol_name)
return 0;
#ifdef HAVE_GETPROTOBYNAME_R
protoent = NULL;
getprotobyname_r (protocol_name,
&my_protoent, buffer, sizeof (buffer),
&protoent);
#else
protoent = getprotobyname (protocol_name);
#endif
if (protoent == NULL)
{
if (g_str_has_prefix (protocol_name, "proto-"))
return atoi (protocol_name + strlen ("proto-"));
return -1;
}
protocol = protoent->p_proto;
return protocol;
}
static gint static gint
g_socket_create_socket (GSocketFamily family, g_socket_create_socket (GSocketFamily family,
GSocketType type, GSocketType type,
int protocol_id, int protocol,
GError **error) GError **error)
{ {
gint native_type; gint native_type;
@ -505,7 +427,7 @@ g_socket_create_socket (GSocketFamily family,
g_assert_not_reached (); g_assert_not_reached ();
} }
if (protocol_id == -1) if (protocol == -1)
{ {
g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT,
_("Unable to create socket: %s"), _("Unknown protocol was specified")); _("Unable to create socket: %s"), _("Unknown protocol was specified"));
@ -515,7 +437,7 @@ g_socket_create_socket (GSocketFamily family,
#ifdef SOCK_CLOEXEC #ifdef SOCK_CLOEXEC
native_type |= SOCK_CLOEXEC; native_type |= SOCK_CLOEXEC;
#endif #endif
fd = socket (family, native_type, protocol_id); fd = socket (family, native_type, protocol);
if (fd < 0) if (fd < 0)
{ {
@ -589,7 +511,7 @@ g_socket_get_property (GObject *object,
break; break;
case PROP_PROTOCOL: case PROP_PROTOCOL:
g_value_set_int (value, socket->priv->protocol); g_value_set_enum (value, socket->priv->protocol);
break; break;
case PROP_FD: case PROP_FD:
@ -642,7 +564,7 @@ g_socket_set_property (GObject *object,
break; break;
case PROP_PROTOCOL: case PROP_PROTOCOL:
socket->priv->protocol = g_value_get_int (value); socket->priv->protocol = g_value_get_enum (value);
break; break;
case PROP_FD: case PROP_FD:
@ -718,12 +640,11 @@ g_socket_class_init (GSocketClass *klass)
G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (gobject_class, PROP_PROTOCOL, g_object_class_install_property (gobject_class, PROP_PROTOCOL,
g_param_spec_int ("protocol", g_param_spec_enum ("protocol",
P_("Socket protocol"), P_("Socket protocol"),
P_("The id of the protocol to use, or -1 for unknown"), P_("The id of the protocol to use, or -1 for unknown"),
G_MININT, G_TYPE_SOCKET_PROTOCOL,
G_MAXINT, G_SOCKET_PROTOCOL_UNKNOWN,
-1,
G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (gobject_class, PROP_FD, g_object_class_install_property (gobject_class, PROP_FD,
@ -828,20 +749,22 @@ g_socket_initable_init (GInitable *initable,
* g_socket_new: * g_socket_new:
* @family: the socket family to use, e.g. %G_SOCKET_FAMILY_IPV4. * @family: the socket family to use, e.g. %G_SOCKET_FAMILY_IPV4.
* @type: the socket type to use. * @type: the socket type to use.
* @protocol_id: the id of the protocol to use, or 0 for default. * @protocol: the id of the protocol to use, or 0 for default.
* @error: #GError for error reporting, or %NULL to ignore. * @error: #GError for error reporting, or %NULL to ignore.
* *
* Creates a new #GSocket with the defined family, type and protocol. * Creates a new #GSocket with the defined family, type and protocol.
* If @protocol_id is 0 the default protocol type for the family and * If @protocol is 0 (%G_SOCKET_PROTOCOL_DEFAULT) the default protocol type
* type is used. * for the family and type is used.
* *
* The @protocol_id is a family and type specific int that specifies what * The @protocol is a family and type specific int that specifies what
* kind of protocol to use. Many families only support one protocol, * kind of protocol to use. #GSocketProtocol lists several common ones.
* and use 0 for this, others support several and using 0 means * Many families only support one protocol, and use 0 for this, others
* to use the default protocol for the family and type. To use * support several and using 0 means to use the default protocol for
* other protocol, you can use g_socket_protocol_id_lookup_by_name() * the family and type.
* to look up the protocol by name, or if you known the system specific *
* protocol id you can use that. * The protocol id is passed directly to the operating
* system, so you can use protocols not listed in #GSocketProtocol if you
* know the protocol number used for it.
* *
* Returns: a #GSocket or %NULL on error. * Returns: a #GSocket or %NULL on error.
* Free the returned object with g_object_unref(). * Free the returned object with g_object_unref().
@ -851,14 +774,14 @@ g_socket_initable_init (GInitable *initable,
GSocket * GSocket *
g_socket_new (GSocketFamily family, g_socket_new (GSocketFamily family,
GSocketType type, GSocketType type,
int protocol_id, GSocketProtocol protocol,
GError **error) GError **error)
{ {
return G_SOCKET (g_initable_new (G_TYPE_SOCKET, return G_SOCKET (g_initable_new (G_TYPE_SOCKET,
NULL, error, NULL, error,
"family", family, "family", family,
"type", type, "type", type,
"protocol", protocol_id, "protocol", protocol,
NULL)); NULL));
} }
@ -1089,7 +1012,7 @@ g_socket_get_socket_type (GSocket *socket)
} }
/** /**
* g_socket_get_protocol_id: * g_socket_get_protocol:
* @socket: a #GSocket. * @socket: a #GSocket.
* *
* Gets the socket protocol id the socket was created with. * Gets the socket protocol id the socket was created with.
@ -1099,33 +1022,14 @@ g_socket_get_socket_type (GSocket *socket)
* *
* Since: 2.22 * Since: 2.22
**/ **/
gint GSocketProtocol
g_socket_get_protocol_id (GSocket *socket) g_socket_get_protocol (GSocket *socket)
{ {
g_return_val_if_fail (G_IS_SOCKET (socket), -1); g_return_val_if_fail (G_IS_SOCKET (socket), -1);
return socket->priv->protocol; return socket->priv->protocol;
} }
/**
* g_socket_get_protocol_name:
* @socket: a #GSocket.
*
* Gets the socket protocol type name the socket was created with.
* This can be %NULL if the socket was created with a NULL protocol.
*
* Returns: a string or %NULL, free with g_free
*
* Since: 2.22
**/
char *
g_socket_get_protocol_name (GSocket *socket)
{
g_return_val_if_fail (G_IS_SOCKET (socket), NULL);
return get_protocol_name (socket->priv->protocol);
}
/** /**
* g_socket_get_fd: * g_socket_get_fd:
* @socket: a #GSocket. * @socket: a #GSocket.

View File

@ -76,15 +76,14 @@ struct _GSocket
GType g_socket_get_type (void) G_GNUC_CONST; GType g_socket_get_type (void) G_GNUC_CONST;
GSocket * g_socket_new (GSocketFamily family, GSocket * g_socket_new (GSocketFamily family,
GSocketType type, GSocketType type,
gint protocol_id, GSocketProtocol protocol,
GError **error); GError **error);
GSocket * g_socket_new_from_fd (gint fd, GSocket * g_socket_new_from_fd (gint fd,
GError **error); GError **error);
int g_socket_get_fd (GSocket *socket); int g_socket_get_fd (GSocket *socket);
GSocketFamily g_socket_get_family (GSocket *socket); GSocketFamily g_socket_get_family (GSocket *socket);
GSocketType g_socket_get_socket_type (GSocket *socket); GSocketType g_socket_get_socket_type (GSocket *socket);
gint g_socket_get_protocol_id (GSocket *socket); GSocketProtocol g_socket_get_protocol (GSocket *socket);
char * g_socket_get_protocol_name (GSocket *socket);
GSocketAddress * g_socket_get_local_address (GSocket *socket, GSocketAddress * g_socket_get_local_address (GSocket *socket,
GError **error); GError **error);
GSocketAddress * g_socket_get_remote_address (GSocket *socket, GSocketAddress * g_socket_get_remote_address (GSocket *socket,
@ -163,8 +162,6 @@ GSource * g_socket_create_source (GSocket
GIOCondition condition, GIOCondition condition,
GCancellable *cancellable); GCancellable *cancellable);
gint g_socket_protocol_id_lookup_by_name (const char *protocol_name);
G_END_DECLS G_END_DECLS
#endif /* __G_SOCKET_H__ */ #endif /* __G_SOCKET_H__ */

View File

@ -77,7 +77,7 @@ struct _GSocketClientPrivate
{ {
GSocketFamily family; GSocketFamily family;
GSocketType type; GSocketType type;
char *protocol; GSocketProtocol protocol;
GSocketAddress *local_address; GSocketAddress *local_address;
}; };
@ -88,7 +88,6 @@ create_socket (GSocketClient *client,
{ {
GSocketFamily family; GSocketFamily family;
GSocket *socket; GSocket *socket;
int proto;
family = client->priv->family; family = client->priv->family;
if (family == G_SOCKET_FAMILY_INVALID && if (family == G_SOCKET_FAMILY_INVALID &&
@ -97,10 +96,9 @@ create_socket (GSocketClient *client,
if (family == G_SOCKET_FAMILY_INVALID) if (family == G_SOCKET_FAMILY_INVALID)
family = g_socket_address_get_family (dest_address); family = g_socket_address_get_family (dest_address);
proto = g_socket_protocol_id_lookup_by_name (client->priv->protocol);
socket = g_socket_new (family, socket = g_socket_new (family,
client->priv->type, client->priv->type,
proto, client->priv->protocol,
error); error);
if (socket == NULL) if (socket == NULL)
return NULL; return NULL;
@ -153,8 +151,6 @@ g_socket_client_finalize (GObject *object)
if (client->priv->local_address) if (client->priv->local_address)
g_object_unref (client->priv->local_address); g_object_unref (client->priv->local_address);
g_free (client->priv->protocol);
if (G_OBJECT_CLASS (g_socket_client_parent_class)->finalize) if (G_OBJECT_CLASS (g_socket_client_parent_class)->finalize)
(*G_OBJECT_CLASS (g_socket_client_parent_class)->finalize) (object); (*G_OBJECT_CLASS (g_socket_client_parent_class)->finalize) (object);
} }
@ -178,7 +174,7 @@ g_socket_client_get_property (GObject *object,
break; break;
case PROP_PROTOCOL: case PROP_PROTOCOL:
g_value_set_string (value, client->priv->protocol); g_value_set_enum (value, client->priv->protocol);
break; break;
case PROP_LOCAL_ADDRESS: case PROP_LOCAL_ADDRESS:
@ -209,7 +205,7 @@ g_socket_client_set_property (GObject *object,
break; break;
case PROP_PROTOCOL: case PROP_PROTOCOL:
g_socket_client_set_protocol (client, g_value_get_string (value)); g_socket_client_set_protocol (client, g_value_get_enum (value));
break; break;
case PROP_LOCAL_ADDRESS: case PROP_LOCAL_ADDRESS:
@ -317,11 +313,11 @@ g_socket_client_set_socket_type (GSocketClient *client,
* *
* See g_socket_client_set_protocol() for details. * See g_socket_client_set_protocol() for details.
* *
* Returns: a string or %NULL. don't free * Returns: a #GSocketProtocol
* *
* Since: 2.22 * Since: 2.22
**/ **/
const char * GSocketProtocol
g_socket_client_get_protocol (GSocketClient *client) g_socket_client_get_protocol (GSocketClient *client)
{ {
return client->priv->protocol; return client->priv->protocol;
@ -330,26 +326,25 @@ g_socket_client_get_protocol (GSocketClient *client)
/** /**
* g_socket_client_set_protocol: * g_socket_client_set_protocol:
* @client: a #GSocketClient. * @client: a #GSocketClient.
* @protocol: a string, or %NULL * @protocol: a #GSocketProtocol
* *
* Sets the protocol of the socket client. * Sets the protocol of the socket client.
* The sockets created by this object will use of the specified * The sockets created by this object will use of the specified
* protocol. * protocol.
* *
* If @protocol is %NULL that means to use the default * If @protocol is %0 that means to use the default
* protocol for the socket family and type. * protocol for the socket family and type.
* *
* Since: 2.22 * Since: 2.22
**/ **/
void void
g_socket_client_set_protocol (GSocketClient *client, g_socket_client_set_protocol (GSocketClient *client,
const char *protocol) GSocketProtocol protocol)
{ {
if (g_strcmp0 (client->priv->protocol, protocol) == 0) if (client->priv->protocol == protocol)
return; return;
g_free (client->priv->protocol); client->priv->protocol = protocol;
client->priv->protocol = g_strdup (protocol);
g_object_notify (G_OBJECT (client), "protocol"); g_object_notify (G_OBJECT (client), "protocol");
} }
@ -429,11 +424,12 @@ g_socket_client_class_init (GSocketClientClass *class)
G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (gobject_class, PROP_PROTOCOL, g_object_class_install_property (gobject_class, PROP_PROTOCOL,
g_param_spec_string ("protocol", g_param_spec_enum ("protocol",
P_("Socket protocol"), P_("Socket protocol"),
P_("The protocol to use for socket construction, or %NULL for default"), P_("The protocol to use for socket construction, or 0 for default"),
NULL, G_TYPE_SOCKET_PROTOCOL,
G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); G_SOCKET_PROTOCOL_DEFAULT,
G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (gobject_class, PROP_LOCAL_ADDRESS, g_object_class_install_property (gobject_class, PROP_LOCAL_ADDRESS,
g_param_spec_object ("local-address", g_param_spec_object ("local-address",

View File

@ -76,9 +76,9 @@ void g_socket_client_set_family (GSocket
GSocketType g_socket_client_get_socket_type (GSocketClient *client); GSocketType g_socket_client_get_socket_type (GSocketClient *client);
void g_socket_client_set_socket_type (GSocketClient *client, void g_socket_client_set_socket_type (GSocketClient *client,
GSocketType type); GSocketType type);
const char *g_socket_client_get_protocol (GSocketClient *client); GSocketProtocol g_socket_client_get_protocol (GSocketClient *client);
void g_socket_client_set_protocol (GSocketClient *client, void g_socket_client_set_protocol (GSocketClient *client,
const char *protocol); GSocketProtocol protocol);
GSocketAddress *g_socket_client_get_local_address (GSocketClient *client); GSocketAddress *g_socket_client_get_local_address (GSocketClient *client);
void g_socket_client_set_local_address (GSocketClient *client, void g_socket_client_set_local_address (GSocketClient *client,
GSocketAddress *address); GSocketAddress *address);

View File

@ -483,7 +483,7 @@ g_socket_connection_factory_create_connection (GSocket *socket)
type = g_socket_connection_factory_lookup_type (g_socket_get_family (socket), type = g_socket_connection_factory_lookup_type (g_socket_get_family (socket),
g_socket_get_socket_type (socket), g_socket_get_socket_type (socket),
g_socket_get_protocol_id (socket)); g_socket_get_protocol (socket));
return g_object_new (type, "socket", socket, NULL); return g_object_new (type, "socket", socket, NULL);
} }

View File

@ -246,9 +246,9 @@ g_socket_listener_add_socket (GSocketListener *listener,
/** /**
* g_socket_listener_add_address: * g_socket_listener_add_address:
* @listener: a #GSocketListener * @listener: a #GSocketListener
* @address: a #GSocketAddres * @address: a #GSocketAddress
* @type: a #GSocketType * @type: a #GSocketType
* @protocol: a protocol name, or %NULL * @protocol: a #GSocketProtocol
* @source_object: Optional #GObject identifying this source * @source_object: Optional #GObject identifying this source
* @error: #GError for error reporting, or %NULL to ignore. * @error: #GError for error reporting, or %NULL to ignore.
* *
@ -269,7 +269,7 @@ gboolean
g_socket_listener_add_address (GSocketListener *listener, g_socket_listener_add_address (GSocketListener *listener,
GSocketAddress *address, GSocketAddress *address,
GSocketType type, GSocketType type,
const char *protocol, GSocketProtocol protocol,
GObject *source_object, GObject *source_object,
GError **error) GError **error)
{ {
@ -280,8 +280,7 @@ g_socket_listener_add_address (GSocketListener *listener,
return FALSE; return FALSE;
family = g_socket_address_get_family (address); family = g_socket_address_get_family (address);
socket = g_socket_new (family, type, socket = g_socket_new (family, type, protocol, error);
g_socket_protocol_id_lookup_by_name (protocol), error);
if (socket == NULL) if (socket == NULL)
return FALSE; return FALSE;
@ -347,7 +346,7 @@ g_socket_listener_add_inet_port (GSocketListener *listener,
if (!g_socket_listener_add_address (listener, if (!g_socket_listener_add_address (listener,
address6, address6,
G_SOCKET_TYPE_STREAM, G_SOCKET_TYPE_STREAM,
NULL, G_SOCKET_PROTOCOL_DEFAULT,
source_object, source_object,
NULL)) NULL))
{ {
@ -356,7 +355,7 @@ g_socket_listener_add_inet_port (GSocketListener *listener,
res = g_socket_listener_add_address (listener, res = g_socket_listener_add_address (listener,
address4, address4,
G_SOCKET_TYPE_STREAM, G_SOCKET_TYPE_STREAM,
NULL, G_SOCKET_PROTOCOL_DEFAULT,
source_object, source_object,
error); error);
} }
@ -368,7 +367,7 @@ g_socket_listener_add_inet_port (GSocketListener *listener,
g_socket_listener_add_address (listener, g_socket_listener_add_address (listener,
address4, address4,
G_SOCKET_TYPE_STREAM, G_SOCKET_TYPE_STREAM,
NULL, G_SOCKET_PROTOCOL_DEFAULT,
source_object, source_object,
NULL); NULL);
} }

View File

@ -90,7 +90,7 @@ gboolean g_socket_listener_add_socket (GSocket
gboolean g_socket_listener_add_address (GSocketListener *listener, gboolean g_socket_listener_add_address (GSocketListener *listener,
GSocketAddress *address, GSocketAddress *address,
GSocketType type, GSocketType type,
const char *protocol, GSocketProtocol protocol,
GObject *source_object, GObject *source_object,
GError **error); GError **error);
gboolean g_socket_listener_add_inet_port (GSocketListener *listener, gboolean g_socket_listener_add_inet_port (GSocketListener *listener,

View File

@ -41,19 +41,19 @@ G_DEFINE_TYPE_WITH_CODE (GTcpConnection, g_tcp_connection,
g_socket_connection_factory_register_type (g_define_type_id, g_socket_connection_factory_register_type (g_define_type_id,
G_SOCKET_FAMILY_IPV4, G_SOCKET_FAMILY_IPV4,
G_SOCKET_TYPE_STREAM, G_SOCKET_TYPE_STREAM,
0); G_SOCKET_PROTOCOL_DEFAULT);
g_socket_connection_factory_register_type (g_define_type_id, g_socket_connection_factory_register_type (g_define_type_id,
G_SOCKET_FAMILY_IPV6, G_SOCKET_FAMILY_IPV6,
G_SOCKET_TYPE_STREAM, G_SOCKET_TYPE_STREAM,
0); G_SOCKET_PROTOCOL_DEFAULT);
g_socket_connection_factory_register_type (g_define_type_id, g_socket_connection_factory_register_type (g_define_type_id,
G_SOCKET_FAMILY_IPV4, G_SOCKET_FAMILY_IPV4,
G_SOCKET_TYPE_STREAM, G_SOCKET_TYPE_STREAM,
g_socket_protocol_id_lookup_by_name ("tcp")); G_SOCKET_PROTOCOL_TCP);
g_socket_connection_factory_register_type (g_define_type_id, g_socket_connection_factory_register_type (g_define_type_id,
G_SOCKET_FAMILY_IPV6, G_SOCKET_FAMILY_IPV6,
G_SOCKET_TYPE_STREAM, G_SOCKET_TYPE_STREAM,
g_socket_protocol_id_lookup_by_name ("tcp")); G_SOCKET_PROTOCOL_TCP);
); );
static gboolean g_tcp_connection_close (GIOStream *stream, static gboolean g_tcp_connection_close (GIOStream *stream,

View File

@ -43,7 +43,7 @@ G_DEFINE_TYPE_WITH_CODE (GUnixConnection, g_unix_connection,
g_socket_connection_factory_register_type (g_define_type_id, g_socket_connection_factory_register_type (g_define_type_id,
G_SOCKET_FAMILY_UNIX, G_SOCKET_FAMILY_UNIX,
G_SOCKET_TYPE_STREAM, G_SOCKET_TYPE_STREAM,
0); G_SOCKET_PROTOCOL_DEFAULT);
); );
/** /**