Changeset 220

Show
Ignore:
Timestamp:
08/04/08 23:25:23 (4 months ago)
Author:
zany
Message:

upgrading btkit

Location:
trunk/obexftp
Files:
1 added
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/obexftp/bt_kit.c

    r200 r220  
    2828#include <unistd.h> 
    2929 
    30 #ifndef _WIN32 
     30#ifdef _WIN32 
     31#include <winsock2.h> 
     32#include <ws2bth.h> 
     33#define WSA_VER_MAJOR 2 
     34#define WSA_VER_MINOR 2 
     35#else 
    3136#include <netinet/in.h> 
    3237#include <sys/types.h> 
     
    3742 
    3843#include <common.h> 
     44 
     45 
     46/** 
     47        Nokia OBEX PC Suite Services. 
     48        binary representation of 00005005-0000-1000-8000-0002ee000001 
     49        \note prefer this over FTP on Series 60 devices 
     50 */ 
     51#define __SVC_UUID_PCSUITE_bytes \ 
     52{ 0x00, 0x00, 0x50, 0x05, \ 
     53  0x00, 0x00, 0x10, 0x00, 0x80, 0x00, \ 
     54  0x00, 0x02, 0xee, 0x00, 0x00, 0x01 } 
     55#define SVC_UUID_PCSUITE ((const uint8_t []) __SVC_UUID_PCSUITE_bytes) 
     56 
     57 
     58/** 
     59        Allocate and setup the network stack. 
     60 
     61        \note Needed for win32 winsock compatibility. 
     62 */ 
     63int btkit_init() 
     64{ 
     65#ifdef _WIN32 
     66        WORD wVersionRequired = MAKEWORD(WSA_VER_MAJOR,WSA_VER_MINOR); 
     67        WSADATA lpWSAData; 
     68        if (WSAStartup(wVersionRequired, &lpWSAData) != 0) { 
     69                DEBUG(2, "%s: WSAStartup failed (%d)\n", __func__, WSAGetLastError()); 
     70                return -1; 
     71        } 
     72        if (LOBYTE(lpWSAData.wVersion) != WSA_VER_MAJOR || 
     73            HIBYTE(lpWSAData.wVersion) != WSA_VER_MINOR) { 
     74                DEBUG(2, "%s: WSA version mismatch\n", __func__); 
     75                WSACleanup(); 
     76                return -1; 
     77        } 
     78#endif /* _WIN32 */ 
     79        return 0; 
     80} 
     81 
     82 
     83/** 
     84        Tear-down and free the network stack. 
     85 
     86        \note Needed for win32 winsock compatibility. 
     87 */ 
     88int btkit_exit() 
     89{ 
     90#ifdef _WIN32 
     91        if (WSACleanup() != 0) { 
     92                DEBUG(2, "%s: WSACleanup failed (%d)\n", __func__, WSAGetLastError()); 
     93                return -1; 
     94        } 
     95#endif /* _WIN32 */ 
     96        return 0; 
     97} 
     98 
    3999  
    40100#ifdef HAVE_BLUETOOTH 
    41101 
    42102#ifdef _WIN32 
     103//void baswap(bdaddr_t *dst, const bdaddr_t *src) 
     104//bdaddr_t *strtoba(const char *str) 
     105//char *batostr(const bdaddr_t *ba) 
     106 
     107/** 
     108        Implementation of ba2str for winsock2. 
     109 */ 
     110int ba2str(const bdaddr_t *btaddr, char *straddr) 
     111{ 
     112        /* WSAAddressToString() is not useful, it adds parentheses */ 
     113        unsigned char *b = btaddr; 
     114        return sprintf(straddr, "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X", 
     115                b[7], b[6], b[5], b[4], b[3], b[2]); 
     116 
     117} 
     118 
     119 
    43120/** 
    44121        Implementation of str2ba for winsock2. 
    45122 */ 
    46 int str2ba(const char *straddr, BTH_ADDR *btaddr) 
     123int str2ba(const char *straddr, bdaddr_t *btaddr) 
    47124{ 
    48125        int i; 
    49126        unsigned int aaddr[6]; 
    50         BTH_ADDR tmpaddr = 0; 
     127        bdaddr_t tmpaddr = 0; 
    51128 
    52129        if (sscanf(straddr, "%02x:%02x:%02x:%02x:%02x:%02x", 
     
    56133        *btaddr = 0; 
    57134        for (i = 0; i < 6; i++) { 
    58                 tmpaddr = (BTH_ADDR) (aaddr[i] & 0xff); 
     135                tmpaddr = (bdaddr_t) (aaddr[i] & 0xff); 
    59136                *btaddr = ((*btaddr) << 8) + tmpaddr; 
    60137        } 
    61138        return 0; 
    62139} 
    63 #endif /* _WIN32 */ 
     140 
     141 
     142char **btkit_discover(const char *src) 
     143{ 
     144        unsigned int ret; 
     145        WSAQUERYSET querySet; 
     146        char addressAsString[18]; 
     147        char **res, **p; 
     148 
     149        memset(&querySet, 0, sizeof(querySet)); 
     150        querySet.dwSize = sizeof(querySet); 
     151        querySet.dwNameSpace = NS_BTH; 
     152 
     153        HANDLE hLookup; 
     154        DWORD flags = LUP_CONTAINERS | LUP_FLUSHCACHE | LUP_RETURN_ADDR | LUP_RES_SERVICE; 
     155 
     156        ret = WSALookupServiceBegin(&querySet, flags, &hLookup); 
     157        if (ret != 0) { 
     158                DEBUG(2, "%s: WSALookupServiceBegin failed (%d)\n", __func__, WSAGetLastError()); 
     159        } 
     160 
     161        p = res = calloc(15 + 1, sizeof(char *)); 
     162        for (;;) { 
     163 
     164                BYTE buffer[1000]; 
     165                DWORD bufferLength = sizeof(buffer); 
     166                WSAQUERYSET *pResults = (WSAQUERYSET*)&buffer; 
     167 
     168                ret = WSALookupServiceNext(hLookup, flags, &bufferLength, pResults); 
     169                if (GetLastError() == WSA_E_NO_MORE) { 
     170                        break; 
     171                } 
     172                if (ret != 0) { 
     173                        DEBUG(2, "%s: WSALookupServiceNext failed (%d)\n", __func__, WSAGetLastError()); 
     174                } 
     175 
     176                ba2str(pResults->lpcsaBuffer->RemoteAddr.lpSockaddr, addressAsString); 
     177                DEBUG(3, "%s: Found\t%s\n", __func__, addressAsString); 
     178                *p++ = strdup(addressAsString); 
     179        } 
     180 
     181        ret = WSALookupServiceEnd(hLookup); 
     182        if (ret != 0) { 
     183                DEBUG(2, "%s: WSALookupServiceEnd failed (%d)\n", __func__, WSAGetLastError()); 
     184        } 
     185        return res; 
     186} 
     187 
     188 
     189char *btkit_getname(const char *src, const char *addr) 
     190{ 
     191        unsigned int ret; 
     192        WSAQUERYSET querySet; 
     193        char addressAsString[18]; 
     194        char *res = NULL; 
     195 
     196        memset(&querySet, 0, sizeof(querySet)); 
     197        querySet.dwSize = sizeof(querySet); 
     198        querySet.dwNameSpace = NS_BTH; 
     199 
     200        HANDLE hLookup; 
     201        DWORD flags = LUP_CONTAINERS | LUP_FLUSHCACHE | LUP_RETURN_ADDR | LUP_RES_SERVICE; 
     202 
     203        ret = WSALookupServiceBegin(&querySet, flags, &hLookup); 
     204        if (ret != 0) { 
     205                DEBUG(2, "%s: WSALookupServiceBegin failed (%d)\n", __func__, WSAGetLastError()); 
     206        } 
     207 
     208        for (;;) { 
     209 
     210                BYTE buffer[1000]; 
     211                DWORD bufferLength = sizeof(buffer); 
     212                WSAQUERYSET *pResults = (WSAQUERYSET*)&buffer; 
     213 
     214                ret = WSALookupServiceNext(hLookup, flags | LUP_RETURN_NAME, &bufferLength, pResults); 
     215                if (GetLastError() == WSA_E_NO_MORE) { 
     216                        break; 
     217                } 
     218                if (ret != 0) { 
     219                        DEBUG(2, "%s: WSALookupServiceNext failed (%d)\n", __func__, WSAGetLastError()); 
     220                } 
     221 
     222                ba2str(pResults->lpcsaBuffer->RemoteAddr.lpSockaddr, addressAsString); 
     223                if (!strcmp(addressAsString, addr)) { 
     224                        DEBUG(3, "%s: Found\t%s\n", __func__, pResults->lpszServiceInstanceName); 
     225                        res = pResults->lpszServiceInstanceName; 
     226                        break; 
     227                } 
     228                DEBUG(3, "%s: Skipping\t%s\n", __func__, pResults->lpszServiceInstanceName); 
     229        } 
     230 
     231        ret = WSALookupServiceEnd(hLookup); 
     232        if (ret != 0) { 
     233                DEBUG(2, "%s: WSALookupServiceEnd failed (%d)\n", __func__, WSAGetLastError()); 
     234        } 
     235        return res; 
     236} 
     237 
     238 
     239// http://msdn2.microsoft.com/en-us/library/aa362914.aspx 
     240int btkit_browse(const char *src, const char *addr, int svclass) 
     241{ 
     242        unsigned int ret; 
     243        WSAQUERYSET querySet; 
     244        char addressAsString[20]; 
     245        DWORD addressSize = sizeof(addressAsString); 
     246 
     247        memset(&querySet, 0, sizeof(querySet)); 
     248        querySet.dwSize = sizeof(querySet); 
     249        querySet.dwNameSpace = NS_BTH; 
     250//      querySet.lpServiceClassId = RFCOMM; 
     251        querySet.lpszContext = addressAsString; 
     252 
     253        if (0 == WSAAddressToString(lpSockaddr, sizeof(bdaddr_t), NULL, addressAsString, &addressSize)) { 
     254                printf("search address: %s\n", addressAsString); 
     255        } 
     256 
     257        HANDLE hLookup; 
     258        DWORD flags = LUP_NOCONTAINERS | LUP_FLUSHCACHE | LUP_RETURN_ADDR | LUP_RES_SERVICE 
     259            | LUP_RETURN_NAME | LUP_RETURN_TYPE | LUP_RETURN_BLOB; 
     260 
     261        ret = WSALookupServiceBegin(&querySet, flags, &hLookup); 
     262        if (ret != 0) { 
     263                DEBUG(2, "%s: WSALookupServiceBegin failed (%d)\n", __func__, WSAGetLastError()); 
     264        } 
     265 
     266        for (;;) { 
     267 
     268                BYTE buffer[1000]; 
     269                DWORD bufferLength = sizeof(buffer); 
     270                WSAQUERYSET *pResults = (WSAQUERYSET*)&buffer; 
     271 
     272                ret = WSALookupServiceNext(hLookup, flags, &bufferLength, pResults); 
     273                if (GetLastError() == WSA_E_NO_MORE) { 
     274                        break; 
     275                } 
     276                if (ret != 0) { 
     277                        DEBUG(2, "%s: WSALookupServiceNext failed (%d)\n", __func__, WSAGetLastError()); 
     278                } 
     279 
     280                DEBUG(3, "%s: Found\t%s\n", __func__, pResults->lpszServiceInstanceName); 
     281        } 
     282 
     283        ret = WSALookupServiceEnd(hLookup); 
     284        if (ret != 0) { 
     285                DEBUG(2, "%s: WSALookupServiceEnd failed (%d)\n", __func__, WSAGetLastError()); 
     286        } 
     287        return 0; 
     288} 
     289 
     290#else /* _WIN32 */ 
    64291 
    65292#ifdef HAVE_SDPLIB /* should switch on OS here */ 
    66  
    67 /** 
    68         Nokia OBEX PC Suite Services. 
    69         binary representation of 00005005-0000-1000-8000-0002ee000001 
    70         \note prefer this over FTP on Series 60 devices 
    71  */ 
    72 #define __SVC_UUID_PCSUITE_bytes \ 
    73 { 0x00, 0x00, 0x50, 0x05, \ 
    74   0x00, 0x00, 0x10, 0x00, 0x80, 0x00, \ 
    75   0x00, 0x02, 0xee, 0x00, 0x00, 0x01 } 
    76 #define SVC_UUID_PCSUITE ((const uint8_t []) __SVC_UUID_PCSUITE_bytes) 
    77293 
    78294 
     
    82298        \return an array of device addresses 
    83299 */ 
    84 // Win32 note: WSALookupServiceBegin for Device Inquiry 
    85 // see http://msdn2.microsoft.com/en-us/library/aa362913.aspx 
    86300char **btkit_discover(const char *src) 
    87301{ 
     
    216430 */ 
    217431// Win32 note: 
    218 // WSALookupServiceBegin for Service Discovery 
    219 // see http://msdn2.microsoft.com/en-us/library/aa362914.aspx 
    220432// WSALookupServiceBegin( WSAQUERYSET with 
     433//  dwNameSpace = NS_BTH 
    221434//  lpServiceClassId = RFCOMM 
    222 //  dwNameSpace = NS_BTH 
    223435//  lpszContext = WSAAddressToString  ) 
    224436// WSALookupServiceNext 
     
    450662 
    451663#endif /* HAVE_SDPLIB */ 
     664#endif /* _WIN32 */ 
    452665 
    453666#else 
  • trunk/obexftp/bt_kit.h

    r200 r220  
    5858#define bacpy(dst,src)  memcpy((dst),(src),sizeof(BTH_ADDR)) 
    5959#define bacmp(a,b)      memcmp((a),(b),sizeof(BTH_ADDR)) 
     60BTKITSYM int ba2str(const bdaddr_t *btaddr, char *straddr); 
    6061BTKITSYM int str2ba(const char *straddr, BTH_ADDR *btaddr); 
    6162 
     
    9293#endif /* _WIN32 */ 
    9394 
     95/* library setup/teardown functions (needed for win32) */ 
     96 
     97BTKITSYM int btkit_init(); 
     98BTKITSYM int btkit_exit(); 
     99 
    94100/* additional functions */ 
    95101