summaryrefslogtreecommitdiffabout
path: root/gammu/emb/common/device
Unidiff
Diffstat (limited to 'gammu/emb/common/device') (more/less context) (ignore whitespace changes)
-rw-r--r--gammu/emb/common/device/bluetoth/blue_w32.c4
-rw-r--r--gammu/emb/common/device/bluetoth/blue_w32.h4
-rw-r--r--gammu/emb/common/device/serial/ser_w32.h2
3 files changed, 5 insertions, 5 deletions
diff --git a/gammu/emb/common/device/bluetoth/blue_w32.c b/gammu/emb/common/device/bluetoth/blue_w32.c
index a631c9f..8a367f4 100644
--- a/gammu/emb/common/device/bluetoth/blue_w32.c
+++ b/gammu/emb/common/device/bluetoth/blue_w32.c
@@ -43,147 +43,147 @@ GSM_Error bluetooth_connect(GSM_StateMachine *s, int port, char *device)
43 sab.addressFamily = AF_BTH; 43 sab.addressFamily = AF_BTH;
44 sab.btAddr = 0; 44 sab.btAddr = 0;
45 for (i=0;i<(int)strlen(device);i++) { 45 for (i=0;i<(int)strlen(device);i++) {
46 if (device[i] >='0' && device[i] <='9') { 46 if (device[i] >='0' && device[i] <='9') {
47 sab.btAddr = sab.btAddr * 16; 47 sab.btAddr = sab.btAddr * 16;
48 sab.btAddr = sab.btAddr + (device[i]-'0'); 48 sab.btAddr = sab.btAddr + (device[i]-'0');
49 } 49 }
50 if (device[i] >='a' && device[i] <='f') { 50 if (device[i] >='a' && device[i] <='f') {
51 sab.btAddr = sab.btAddr * 16; 51 sab.btAddr = sab.btAddr * 16;
52 sab.btAddr = sab.btAddr + (device[i]-'a'+10); 52 sab.btAddr = sab.btAddr + (device[i]-'a'+10);
53 } 53 }
54 if (device[i] >='A' && device[i] <='F') { 54 if (device[i] >='A' && device[i] <='F') {
55 sab.btAddr = sab.btAddr * 16; 55 sab.btAddr = sab.btAddr * 16;
56 sab.btAddr = sab.btAddr + (device[i]-'A'+10); 56 sab.btAddr = sab.btAddr + (device[i]-'A'+10);
57 } 57 }
58 } 58 }
59 dbgprintf("Remote Bluetooth device is %04x%08x\n", 59 dbgprintf("Remote Bluetooth device is %04x%08x\n",
60 GET_NAP(sab.btAddr), GET_SAP(sab.btAddr)); 60 GET_NAP(sab.btAddr), GET_SAP(sab.btAddr));
61 61
62 if (connect (d->hPhone, (struct sockaddr *)&sab, sizeof(sab)) != 0) { 62 if (connect (d->hPhone, (struct sockaddr *)&sab, sizeof(sab)) != 0) {
63 i = GetLastError(); 63 i = GetLastError();
64 GSM_OSErrorInfo(s, "Connect in bluetooth_open"); 64 GSM_OSErrorInfo(s, "Connect in bluetooth_open");
65 if (i == 10060) return ERR_TIMEOUT; //remote device failed to respond 65 if (i == 10060) return ERR_TIMEOUT; //remote device failed to respond
66 if (i == 10050) return ERR_DEVICENOTWORK; //socket operation connected with dead network 66 if (i == 10050) return ERR_DEVICENOTWORK; //socket operation connected with dead network
67 //noauth 67 //noauth
68 close(d->hPhone); 68 close(d->hPhone);
69 return ERR_UNKNOWN; 69 return ERR_UNKNOWN;
70 } 70 }
71 71
72 return ERR_NONE; 72 return ERR_NONE;
73} 73}
74 74
75#ifdef BLUETOOTH_RF_SEARCHING 75#ifdef BLUETOOTH_RF_SEARCHING
76 76
77#pragma comment(lib, "irprops.lib") 77#pragma comment(lib, "irprops.lib")
78#pragma comment(lib, "ws2_32.lib") 78#pragma comment(lib, "ws2_32.lib")
79 79
80static GSM_Error bluetooth_checkdevice(GSM_StateMachine *s, char *address, WSAPROTOCOL_INFO *protocolInfo) 80static GSM_Error bluetooth_checkdevice(GSM_StateMachine *s, char *address, WSAPROTOCOL_INFO *protocolInfo)
81{ 81{
82 GSM_Device_BlueToothData *d = &s->Device.Data.BlueTooth; 82 GSM_Device_BlueToothData *d = &s->Device.Data.BlueTooth;
83 WSAQUERYSET querySet; 83 WSAQUERYSET querySet;
84 DWORD flags; 84 DWORD flags;
85 GUID protocol; 85 GUID protocol;
86 int i, result; 86 int i, result;
87 BYTE buffer[2000]; 87 BYTE buffer[2000];
88 char addressAsString[1000]; 88 char addressAsString[1000];
89 DWORD bufferLength, addressSize; 89 DWORD bufferLength, addressSize;
90 WSAQUERYSET *pResults = (WSAQUERYSET*)&buffer; 90 WSAQUERYSET *pResults = (WSAQUERYSET*)&buffer;
91 HANDLE handle; 91 Qt::HANDLE handle;
92 GSM_Error error; 92 GSM_Error error;
93 93
94 memset(&querySet, 0, sizeof(querySet)); 94 memset(&querySet, 0, sizeof(querySet));
95 querySet.dwSize = sizeof(querySet); 95 querySet.dwSize = sizeof(querySet);
96 protocol = L2CAP_PROTOCOL_UUID; 96 protocol = L2CAP_PROTOCOL_UUID;
97 querySet.lpServiceClassId = &protocol; 97 querySet.lpServiceClassId = &protocol;
98 querySet.dwNameSpace = NS_BTH; 98 querySet.dwNameSpace = NS_BTH;
99 querySet.lpszContext = address; 99 querySet.lpszContext = address;
100 100
101 flags = LUP_FLUSHCACHE | LUP_RETURN_NAME | 101 flags = LUP_FLUSHCACHE | LUP_RETURN_NAME |
102 LUP_RETURN_TYPE | LUP_RETURN_ADDR | 102 LUP_RETURN_TYPE | LUP_RETURN_ADDR |
103 LUP_RETURN_BLOB | LUP_RETURN_COMMENT; 103 LUP_RETURN_BLOB | LUP_RETURN_COMMENT;
104 104
105 result = WSALookupServiceBegin(&querySet, flags, &handle); 105 result = WSALookupServiceBegin(&querySet, flags, &handle);
106 if (result != 0) return ERR_UNKNOWN; 106 if (result != 0) return ERR_UNKNOWN;
107 107
108 bufferLength = sizeof(buffer); 108 bufferLength = sizeof(buffer);
109 while (1) { 109 while (1) {
110 result = WSALookupServiceNext(handle, flags, &bufferLength, pResults); 110 result = WSALookupServiceNext(handle, flags, &bufferLength, pResults);
111 if (result != 0) break; 111 if (result != 0) break;
112 addressSize = sizeof(addressAsString); 112 addressSize = sizeof(addressAsString);
113 addressAsString[0] = 0; 113 addressAsString[0] = 0;
114 if (WSAAddressToString(pResults->lpcsaBuffer->RemoteAddr.lpSockaddr, 114 if (WSAAddressToString(pResults->lpcsaBuffer->RemoteAddr.lpSockaddr,
115 pResults->lpcsaBuffer->RemoteAddr.iSockaddrLength, protocolInfo, 115 pResults->lpcsaBuffer->RemoteAddr.iSockaddrLength, protocolInfo,
116 addressAsString,&addressSize)==0) { 116 addressAsString,&addressSize)==0) {
117 smprintf(s, "%s - ", addressAsString); 117 smprintf(s, "%s - ", addressAsString);
118 } 118 }
119 smprintf(s, "\"%s\"\n", pResults->lpszServiceInstanceName); 119 smprintf(s, "\"%s\"\n", pResults->lpszServiceInstanceName);
120 if (addressAsString[0] != 0) { 120 if (addressAsString[0] != 0) {
121 for (i=strlen(addressAsString)-1;i>0;i--) { 121 for (i=strlen(addressAsString)-1;i>0;i--) {
122 if (addressAsString[i] == ':') break; 122 if (addressAsString[i] == ':') break;
123 } 123 }
124 if (bluetooth_checkservicename(s, pResults->lpszServiceInstanceName) == ERR_NONE) { 124 if (bluetooth_checkservicename(s, pResults->lpszServiceInstanceName) == ERR_NONE) {
125 error = bluetooth_connect(s,atoi(addressAsString+i+1),address+1); 125 error = bluetooth_connect(s,atoi(addressAsString+i+1),address+1);
126 result = WSALookupServiceEnd(handle); 126 result = WSALookupServiceEnd(handle);
127 return error; 127 return error;
128 } 128 }
129 } 129 }
130 } 130 }
131 result = WSALookupServiceEnd(handle); 131 result = WSALookupServiceEnd(handle);
132 return ERR_NOTSUPPORTED; 132 return ERR_NOTSUPPORTED;
133} 133}
134 134
135GSM_Error bluetooth_findchannel(GSM_StateMachine *s) 135GSM_Error bluetooth_findchannel(GSM_StateMachine *s)
136{ 136{
137 GSM_Device_BlueToothData *d = &s->Device.Data.BlueTooth; 137 GSM_Device_BlueToothData *d = &s->Device.Data.BlueTooth;
138 WSADATA wsaData; 138 WSADATA wsaData;
139 int i, protocolInfoSize, result; 139 int i, protocolInfoSize, result;
140 WSAPROTOCOL_INFO protocolInfo; 140 WSAPROTOCOL_INFO protocolInfo;
141 HANDLE handle; 141 Qt::HANDLE handle;
142 DWORD flags; 142 DWORD flags;
143 WSAQUERYSET querySet; 143 WSAQUERYSET querySet;
144 BYTE buffer[2000]; 144 BYTE buffer[2000];
145 char addressAsString[1000]; 145 char addressAsString[1000];
146 DWORD bufferLength, addressSize; 146 DWORD bufferLength, addressSize;
147 WSAQUERYSET *pResults = (WSAQUERYSET*)&buffer; 147 WSAQUERYSET *pResults = (WSAQUERYSET*)&buffer;
148 GSM_Error error; 148 GSM_Error error;
149 149
150 if (WSAStartup(MAKEWORD(2,2), &wsaData)!=0x00) return ERR_DEVICENODRIVER; 150 if (WSAStartup(MAKEWORD(2,2), &wsaData)!=0x00) return ERR_DEVICENODRIVER;
151 151
152 d->hPhone = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM); 152 d->hPhone = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
153 if (d->hPhone == INVALID_SOCKET) { 153 if (d->hPhone == INVALID_SOCKET) {
154 i = GetLastError(); 154 i = GetLastError();
155 GSM_OSErrorInfo(s, "Socket in bluetooth_open"); 155 GSM_OSErrorInfo(s, "Socket in bluetooth_open");
156 if (i == 10041) return ERR_DEVICENODRIVER;//unknown socket type 156 if (i == 10041) return ERR_DEVICENODRIVER;//unknown socket type
157 return ERR_UNKNOWN; 157 return ERR_UNKNOWN;
158 } 158 }
159 159
160 protocolInfoSize = sizeof(protocolInfo); 160 protocolInfoSize = sizeof(protocolInfo);
161 if (getsockopt(d->hPhone, SOL_SOCKET, SO_PROTOCOL_INFO, 161 if (getsockopt(d->hPhone, SOL_SOCKET, SO_PROTOCOL_INFO,
162 (char*)&protocolInfo, &protocolInfoSize) != 0) 162 (char*)&protocolInfo, &protocolInfoSize) != 0)
163 { 163 {
164 close(d->hPhone); 164 close(d->hPhone);
165 return ERR_UNKNOWN; 165 return ERR_UNKNOWN;
166 } 166 }
167 close(d->hPhone); 167 close(d->hPhone);
168 168
169 if (!strcmp(s->CurrentConfig->Device,"com2:")) { 169 if (!strcmp(s->CurrentConfig->Device,"com2:")) {
170 bufferLength = sizeof(buffer); 170 bufferLength = sizeof(buffer);
171 171
172 flags = LUP_RETURN_NAME | LUP_CONTAINERS | 172 flags = LUP_RETURN_NAME | LUP_CONTAINERS |
173 LUP_RETURN_ADDR | LUP_FLUSHCACHE | 173 LUP_RETURN_ADDR | LUP_FLUSHCACHE |
174 LUP_RETURN_TYPE | LUP_RETURN_BLOB | LUP_RES_SERVICE; 174 LUP_RETURN_TYPE | LUP_RETURN_BLOB | LUP_RES_SERVICE;
175 175
176 memset(&querySet, 0, sizeof(querySet)); 176 memset(&querySet, 0, sizeof(querySet));
177 querySet.dwSize = sizeof(querySet); 177 querySet.dwSize = sizeof(querySet);
178 querySet.dwNameSpace = NS_BTH; 178 querySet.dwNameSpace = NS_BTH;
179 179
180 result = WSALookupServiceBegin(&querySet, flags, &handle); 180 result = WSALookupServiceBegin(&querySet, flags, &handle);
181 if (result != 0) return ERR_UNKNOWN; 181 if (result != 0) return ERR_UNKNOWN;
182 182
183 while (1) { 183 while (1) {
184 result = WSALookupServiceNext(handle, flags, &bufferLength, pResults); 184 result = WSALookupServiceNext(handle, flags, &bufferLength, pResults);
185 if (result != 0) break; 185 if (result != 0) break;
186 186
187 smprintf(s, "\"%s\"", pResults->lpszServiceInstanceName); 187 smprintf(s, "\"%s\"", pResults->lpszServiceInstanceName);
188 188
189 addressSize = sizeof(addressAsString); 189 addressSize = sizeof(addressAsString);
diff --git a/gammu/emb/common/device/bluetoth/blue_w32.h b/gammu/emb/common/device/bluetoth/blue_w32.h
index e457c92..409f4b1 100644
--- a/gammu/emb/common/device/bluetoth/blue_w32.h
+++ b/gammu/emb/common/device/bluetoth/blue_w32.h
@@ -74,105 +74,105 @@ typedef struct _WSAQuerySetA
74 DWORD dwNameSpace; 74 DWORD dwNameSpace;
75 LPGUID lpNSProviderId; 75 LPGUID lpNSProviderId;
76 LPSTR lpszContext; 76 LPSTR lpszContext;
77 DWORD dwNumberOfProtocols; 77 DWORD dwNumberOfProtocols;
78 LPAFPROTOCOLS lpafpProtocols; 78 LPAFPROTOCOLS lpafpProtocols;
79 LPSTR lpszQueryString; 79 LPSTR lpszQueryString;
80 DWORD dwNumberOfCsAddrs; 80 DWORD dwNumberOfCsAddrs;
81 LPCSADDR_INFO lpcsaBuffer; 81 LPCSADDR_INFO lpcsaBuffer;
82 DWORD dwOutputFlags; 82 DWORD dwOutputFlags;
83 LPBLOB lpBlob; 83 LPBLOB lpBlob;
84} WSAQUERYSET, WSAQUERYSETA, *PWSAQUERYSETA, *LPWSAQUERYSETA; 84} WSAQUERYSET, WSAQUERYSETA, *PWSAQUERYSETA, *LPWSAQUERYSETA;
85 85
86DEFINE_GUID(L2CAP_PROTOCOL_UUID, 0x00000100, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); 86DEFINE_GUID(L2CAP_PROTOCOL_UUID, 0x00000100, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
87 87
88#ifndef NS_BTH 88#ifndef NS_BTH
89# define NS_BTH 16 89# define NS_BTH 16
90#endif 90#endif
91 91
92#define LUP_CONTAINERS 0x0002 92#define LUP_CONTAINERS 0x0002
93#define LUP_RETURN_NAME 0x0010 93#define LUP_RETURN_NAME 0x0010
94#define LUP_RETURN_TYPE 0x0020 94#define LUP_RETURN_TYPE 0x0020
95#define LUP_RETURN_COMMENT 0x0080 95#define LUP_RETURN_COMMENT 0x0080
96#define LUP_RETURN_ADDR 0x0100 96#define LUP_RETURN_ADDR 0x0100
97#define LUP_RETURN_BLOB 0x0200 97#define LUP_RETURN_BLOB 0x0200
98 #define LUP_FLUSHCACHE 0x1000 98 #define LUP_FLUSHCACHE 0x1000
99#define LUP_RES_SERVICE 0x8000 99#define LUP_RES_SERVICE 0x8000
100 100
101#define WSAAPI FAR PASCAL 101#define WSAAPI FAR PASCAL
102 102
103#ifndef WINSOCK_API_LINKAGE 103#ifndef WINSOCK_API_LINKAGE
104#ifdef DECLSPEC_IMPORT 104#ifdef DECLSPEC_IMPORT
105#define WINSOCK_API_LINKAGE DECLSPEC_IMPORT 105#define WINSOCK_API_LINKAGE DECLSPEC_IMPORT
106#else 106#else
107#define WINSOCK_API_LINKAGE 107#define WINSOCK_API_LINKAGE
108#endif 108#endif
109#endif 109#endif
110 110
111WINSOCK_API_LINKAGE INT WSAAPI 111WINSOCK_API_LINKAGE INT WSAAPI
112WSALookupServiceBeginA( 112WSALookupServiceBeginA(
113 IN LPWSAQUERYSETA lpqsRestrictions, 113 IN LPWSAQUERYSETA lpqsRestrictions,
114 IN DWORD dwControlFlags, 114 IN DWORD dwControlFlags,
115 OUT LPHANDLE lphLookup 115 OUT LPHANDLE lphLookup
116 ); 116 );
117 117
118#define WSALookupServiceBegin WSALookupServiceBeginA 118#define WSALookupServiceBegin WSALookupServiceBeginA
119 119
120WINSOCK_API_LINKAGE INT WSAAPI 120WINSOCK_API_LINKAGE INT WSAAPI
121WSALookupServiceNextA( 121WSALookupServiceNextA(
122 IN HANDLE hLookup, 122 IN Qt::HANDLE hLookup,
123 IN DWORD dwControlFlags, 123 IN DWORD dwControlFlags,
124 IN OUT LPDWORD lpdwBufferLength, 124 IN OUT LPDWORD lpdwBufferLength,
125 OUT LPWSAQUERYSETA lpqsResults 125 OUT LPWSAQUERYSETA lpqsResults
126 ); 126 );
127 127
128#define WSALookupServiceNext WSALookupServiceNextA 128#define WSALookupServiceNext WSALookupServiceNextA
129 129
130WINSOCK_API_LINKAGE INT WSAAPI WSALookupServiceEnd(IN HANDLE hLookup); 130WINSOCK_API_LINKAGE INT WSAAPI WSALookupServiceEnd(IN Qt::HANDLE hLookup);
131 131
132#define MAX_PROTOCOL_CHAIN 7 132#define MAX_PROTOCOL_CHAIN 7
133 133
134typedef struct _WSAPROTOCOLCHAIN { 134typedef struct _WSAPROTOCOLCHAIN {
135 int ChainLen; /* the length of the chain, */ 135 int ChainLen; /* the length of the chain, */
136 /* length = 0 means layered protocol, */ 136 /* length = 0 means layered protocol, */
137 /* length = 1 means base protocol, */ 137 /* length = 1 means base protocol, */
138 /* length > 1 means protocol chain */ 138 /* length > 1 means protocol chain */
139 DWORD ChainEntries[MAX_PROTOCOL_CHAIN]; /* a list of dwCatalogEntryIds */ 139 DWORD ChainEntries[MAX_PROTOCOL_CHAIN]; /* a list of dwCatalogEntryIds */
140} WSAPROTOCOLCHAIN, FAR * LPWSAPROTOCOLCHAIN; 140} WSAPROTOCOLCHAIN, FAR * LPWSAPROTOCOLCHAIN;
141 141
142#define WSAPROTOCOL_LEN 255 142#define WSAPROTOCOL_LEN 255
143 143
144typedef struct _WSAPROTOCOL_INFOA { 144typedef struct _WSAPROTOCOL_INFOA {
145 DWORD dwServiceFlags1; 145 DWORD dwServiceFlags1;
146 DWORD dwServiceFlags2; 146 DWORD dwServiceFlags2;
147 DWORD dwServiceFlags3; 147 DWORD dwServiceFlags3;
148 DWORD dwServiceFlags4; 148 DWORD dwServiceFlags4;
149 DWORD dwProviderFlags; 149 DWORD dwProviderFlags;
150 GUID ProviderId; 150 GUID ProviderId;
151 DWORD dwCatalogEntryId; 151 DWORD dwCatalogEntryId;
152 WSAPROTOCOLCHAIN ProtocolChain; 152 WSAPROTOCOLCHAIN ProtocolChain;
153 int iVersion; 153 int iVersion;
154 int iAddressFamily; 154 int iAddressFamily;
155 int iMaxSockAddr; 155 int iMaxSockAddr;
156 int iMinSockAddr; 156 int iMinSockAddr;
157 int iSocketType; 157 int iSocketType;
158 int iProtocol; 158 int iProtocol;
159 int iProtocolMaxOffset; 159 int iProtocolMaxOffset;
160 int iNetworkByteOrder; 160 int iNetworkByteOrder;
161 int iSecurityScheme; 161 int iSecurityScheme;
162 DWORD dwMessageSize; 162 DWORD dwMessageSize;
163 DWORD dwProviderReserved; 163 DWORD dwProviderReserved;
164 CHAR szProtocol[WSAPROTOCOL_LEN+1]; 164 CHAR szProtocol[WSAPROTOCOL_LEN+1];
165} WSAPROTOCOL_INFOA, FAR * LPWSAPROTOCOL_INFOA; 165} WSAPROTOCOL_INFOA, FAR * LPWSAPROTOCOL_INFOA;
166 166
167typedef WSAPROTOCOL_INFOA WSAPROTOCOL_INFO; 167typedef WSAPROTOCOL_INFOA WSAPROTOCOL_INFO;
168 168
169#define SO_PROTOCOL_INFOA 0x2004 /* WSAPROTOCOL_INFOA structure */ 169#define SO_PROTOCOL_INFOA 0x2004 /* WSAPROTOCOL_INFOA structure */
170#define SO_PROTOCOL_INFO SO_PROTOCOL_INFOA 170#define SO_PROTOCOL_INFO SO_PROTOCOL_INFOA
171 171
172WINSOCK_API_LINKAGE INT WSAAPI 172WINSOCK_API_LINKAGE INT WSAAPI
173WSAAddressToStringA( 173WSAAddressToStringA(
174 IN LPSOCKADDR lpsaAddress, 174 IN LPSOCKADDR lpsaAddress,
175 IN DWORD dwAddressLength, 175 IN DWORD dwAddressLength,
176 IN LPWSAPROTOCOL_INFOA lpProtocolInfo, 176 IN LPWSAPROTOCOL_INFOA lpProtocolInfo,
177 IN OUT LPSTR lpszAddressString, 177 IN OUT LPSTR lpszAddressString,
178 IN OUT LPDWORD lpdwAddressStringLength 178 IN OUT LPDWORD lpdwAddressStringLength
diff --git a/gammu/emb/common/device/serial/ser_w32.h b/gammu/emb/common/device/serial/ser_w32.h
index d226f32..d1aa37a 100644
--- a/gammu/emb/common/device/serial/ser_w32.h
+++ b/gammu/emb/common/device/serial/ser_w32.h
@@ -1,19 +1,19 @@
1 1
2#ifdef WIN32 2#ifdef WIN32
3#ifndef winserial_h 3#ifndef winserial_h
4#define winserial_h 4#define winserial_h
5 5
6#include <windows.h> 6#include <windows.h>
7 7
8typedef struct { 8typedef struct {
9 HANDLE hPhone; 9 Qt::HANDLE hPhone;
10 DCB old_settings; 10 DCB old_settings;
11 OVERLAPPED osWrite,osRead; 11 OVERLAPPED osWrite,osRead;
12} GSM_Device_SerialData; 12} GSM_Device_SerialData;
13 13
14#endif 14#endif
15#endif 15#endif
16 16
17/* How should editor hadle tabs in this file? Add editor commands here. 17/* How should editor hadle tabs in this file? Add editor commands here.
18 * vim: noexpandtab sw=8 ts=8 sts=8: 18 * vim: noexpandtab sw=8 ts=8 sts=8:
19 */ 19 */