/src/os/wince/ftk_wince.c

http://ftk.googlecode.com/ · C · 200 lines · 158 code · 32 blank · 10 comment · 26 complexity · 5b09e5cd9aa1a9802192d9c2491e5797 MD5 · raw file

  1. #include <string.h>
  2. #include <assert.h>
  3. #include "ftk_wince.h"
  4. #include "ftk_log.h"
  5. #include <initguid.h>
  6. static char g_work_dir[MAX_PATH+1] = {0};
  7. static char g_data_dir[MAX_PATH+1] = {0};
  8. static char g_testdata_dir[MAX_PATH+1] = {0};
  9. char* ftk_get_root_dir(void)
  10. {
  11. return g_work_dir;
  12. }
  13. char* ftk_get_data_dir(void)
  14. {
  15. return g_data_dir;
  16. }
  17. char* ftk_get_testdata_dir(void)
  18. {
  19. return g_testdata_dir;
  20. }
  21. int ftk_platform_init(int argc, char** argv)
  22. {
  23. int Ret = 0;
  24. char* p = NULL;
  25. HRESULT hr;
  26. WSADATA wsaData = {0};
  27. hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
  28. if(FAILED(hr))
  29. {
  30. ftk_loge("CoInitializeEx() failed\n");
  31. return 1;
  32. }
  33. if ((Ret = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0)
  34. {
  35. assert(!"WSAStartup failed with error %d\n");
  36. CoUninitialize();
  37. return 0;
  38. }
  39. if(_getcwd(g_work_dir, MAX_PATH) != NULL)
  40. {
  41. p = strstr(g_work_dir, "\\src");
  42. if(p != NULL)
  43. {
  44. *p = '\0';
  45. ftk_snprintf(g_data_dir, MAX_PATH, "%s\\data", g_work_dir);
  46. ftk_snprintf(g_testdata_dir, MAX_PATH, "%s\\testdata", g_work_dir);
  47. }
  48. }
  49. return 0;
  50. }
  51. void ftk_platform_deinit(void)
  52. {
  53. if (WSACleanup() == SOCKET_ERROR)
  54. {
  55. ftk_logd("WSACleanup failed with error %d\n", WSAGetLastError());
  56. }
  57. CoUninitialize();
  58. }
  59. char* ftk_strncpy(char *dest, const char *src, size_t n)
  60. {
  61. return strncpy(dest, src, n);
  62. }
  63. int ftk_snprintf(char *str, size_t size, const char *format, ...)
  64. {
  65. int ret = 0;
  66. va_list args;
  67. va_start(args, format);
  68. ret = _vsnprintf(str, size-1, format, args);
  69. str[size-1] = '\0';
  70. return ret;
  71. }
  72. int ftk_vsnprintf(char *str, size_t size, const char *format, va_list ap)
  73. {
  74. return _vsnprintf(str, size-1, format, ap);
  75. }
  76. size_t ftk_get_relative_time(void)
  77. {
  78. FILETIME ft;
  79. SYSTEMTIME st;
  80. LARGE_INTEGER li;
  81. __int64 t;
  82. GetSystemTime(&st);
  83. SystemTimeToFileTime(&st, &ft);
  84. li.LowPart = ft.dwLowDateTime;
  85. li.HighPart = ft.dwHighDateTime;
  86. t = li.QuadPart; /* In 100-nanosecond intervals */
  87. t /= 10; /* In microseconds */
  88. return (size_t) t/1000;
  89. }
  90. char *_getcwd(char *buf, size_t size)
  91. {
  92. size_t len;
  93. len = sizeof("\\Program Files\\ftk") - 1;
  94. ftk_strncpy(buf, "\\Program Files\\ftk", len);
  95. buf[len] = '\0';
  96. return buf;
  97. }
  98. /*http://cantrip.org/socketpair.c*/
  99. /* socketpair.c
  100. * Copyright 2007 by Nathan C. Myers <ncm@cantrip.org>; all rights reserved.
  101. * This code is Free Software. It may be copied freely, in original or
  102. * modified form, subject only to the restrictions that (1) the author is
  103. * relieved from all responsibilities for any use for any purpose, and (2)
  104. * this copyright notice must be retained, unchanged, in its entirety. If
  105. * for any reason the author might be held responsible for any consequences
  106. * of copying or use, license is withheld.
  107. */
  108. int wince_socketpair(SOCKET socks[2])
  109. {
  110. int e;
  111. DWORD flags = 0;
  112. SOCKET listener;
  113. struct sockaddr_in addr;
  114. int addrlen = sizeof(addr);
  115. if (socks == 0) {
  116. WSASetLastError(WSAEINVAL);
  117. return SOCKET_ERROR;
  118. }
  119. socks[0] = socks[1] = INVALID_SOCKET;
  120. if ((listener = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
  121. return SOCKET_ERROR;
  122. memset(&addr, 0, sizeof(addr));
  123. addr.sin_family = AF_INET;
  124. addr.sin_addr.s_addr = htonl(0x7f000001);
  125. addr.sin_port = 0;
  126. e = bind(listener, (const struct sockaddr*) &addr, sizeof(addr));
  127. if (e == SOCKET_ERROR) {
  128. e = WSAGetLastError();
  129. closesocket(listener);
  130. WSASetLastError(e);
  131. return SOCKET_ERROR;
  132. }
  133. e = getsockname(listener, (struct sockaddr*) &addr, &addrlen);
  134. if (e == SOCKET_ERROR) {
  135. e = WSAGetLastError();
  136. closesocket(listener);
  137. WSASetLastError(e);
  138. return SOCKET_ERROR;
  139. }
  140. do {
  141. if (listen(listener, 1) == SOCKET_ERROR) break;
  142. if ((socks[0] = socket(AF_INET, SOCK_STREAM, 0))
  143. == INVALID_SOCKET) break;
  144. if (connect(socks[0], (const struct sockaddr*) &addr,
  145. sizeof(addr)) == SOCKET_ERROR) break;
  146. if ((socks[1] = accept(listener, NULL, NULL))
  147. == INVALID_SOCKET) break;
  148. closesocket(listener);
  149. return 0;
  150. } while (0);
  151. e = WSAGetLastError();
  152. closesocket(listener);
  153. closesocket(socks[0]);
  154. closesocket(socks[1]);
  155. WSASetLastError(e);
  156. return SOCKET_ERROR;
  157. }
  158. int FTK_MAIN(int argc, char* argv[]);
  159. int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev_inst, LPWSTR cmd_link, int cmd_show)
  160. {
  161. int argc, rv;
  162. char *argv[2];
  163. argv[0] = "ftk";
  164. argv[1] = NULL;
  165. argc = 1;
  166. rv = FTK_MAIN(argc, argv);
  167. return rv;
  168. }