Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Aug 3rd, 2012  |  syntax: C  |  size: 4.63 KB  |  hits: 18  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. //
  2. //  ElectroCraftCommunicationClient.cpp
  3. //  
  4. //
  5. //  Created by Andrew Querol on 8/2/12.
  6. //
  7. //
  8.  
  9. #include "ElectroCraftCommunicationClient.h"
  10.  
  11. // Unix Includes
  12. #include <stdio.h>
  13. #include <sys/types.h>
  14. #include <sys/socket.h>
  15. #include <netinet/in.h>
  16. #include <netdb.h>
  17. #include <pthread.h>
  18.  
  19. // QEMU Includes
  20. #include "qemu-common.h"
  21. #include "console.h"
  22. #include "sysemu.h"
  23.  
  24. // ElectroCraft Server Stuff
  25. char* commsChannel; // The "channel" (Username) of the client we are talking to
  26. int serverPort;
  27. char *serverAddress;
  28. pthread_t clientThread;
  29. bool running = false;
  30. bool started = false;
  31. int sockfd;
  32. pthread_mutex_t socketMutex;
  33.  
  34. // Declare our run method
  35. void* run(void* args);
  36.  
  37. // Server Protocol
  38. enum Protocol {
  39.     DISPLAY = 0,
  40.     INPUT = 1
  41.     };
  42.  
  43. // QEMU
  44. static DisplayChangeListener *dcl;
  45.  
  46. static void electrocraft_cleanup(void) {
  47.     printf("ElectroCraft QEMU Server: Cleanup Called");
  48.     g_free(dcl);
  49.     pthread_exit(NULL);
  50. }
  51.  
  52. static void electrocraft_update(DisplayState *ds, int x, int y, int w, int h) {
  53. }
  54.  
  55. static void electrocraft_resize(DisplayState *ds) {
  56. }
  57.  
  58. static void electrocraft_refresh(DisplayState *ds) {
  59.     if (started) {
  60.         //pthread_mutex_lock(&socketMutex);
  61.         int numberOfPixels = ds->surface->width * ds->surface->height;
  62.         unsigned char* data = (unsigned char*)malloc(((numberOfPixels * 3) * sizeof(unsigned char)) + sizeof(unsigned char) + sizeof(int));
  63.         data[0] = DISPLAY;
  64.         data[1] = numberOfPixels & 0xFF;
  65.         data[2] = (numberOfPixels >> 8) & 0xFF;
  66.         data[3] = (numberOfPixels >> 16) & 0xFF;
  67.         data[4] = (numberOfPixels >> 24) & 0xFF;
  68.         printf("Number of pixles %d\n", numberOfPixels);
  69.         int byteNumber = 5, i = 0;
  70.         for (; i < numberOfPixels; i++) {
  71.             data[byteNumber++] = (unsigned char)ds->surface->data[i] >> 16;
  72.             data[byteNumber++] = (unsigned char)ds->surface->data[i] >> 8;
  73.             data[byteNumber++] = (unsigned char)ds->surface->data[i];
  74.         }
  75.         write(sockfd, data, ((numberOfPixels * 3) * sizeof(unsigned char)) + sizeof(unsigned char) + sizeof(int));
  76.         //pthread_mutex_unlock(&socketMutex);
  77.     }
  78.     vga_hw_update();
  79. }
  80.  
  81. void electrocraft_init(DisplayState *ds) {
  82.     // Initialize our socket mutex
  83.     pthread_mutex_init(&socketMutex, NULL);
  84.    
  85.     dcl = g_malloc0(sizeof(DisplayChangeListener));
  86.    
  87.     // register vga output callbacks
  88.     dcl->dpy_update = electrocraft_update;
  89.     dcl->dpy_resize = electrocraft_resize;
  90.     dcl->dpy_refresh = electrocraft_refresh;
  91.    
  92.         register_displaychangelistener(ds, dcl);
  93.    
  94.     // register cleanup function
  95.     atexit(electrocraft_cleanup);
  96. }
  97.  
  98. void electroCraftConnect(int port, char* address, char* channel) {
  99.     commsChannel = channel;
  100.     serverPort = port;
  101.     serverAddress = address;
  102.     running = true;
  103.     int rc = pthread_create(&clientThread, NULL, run, NULL);
  104.     if (rc){
  105.         printf("ElectroCraft Qemu: Error, return code from pthread_create() is %d\n", rc);
  106.         exit(EXIT_FAILURE);
  107.     }
  108. }
  109.  
  110. void* run(void* args) {
  111.     int bytesRead;
  112.     struct sockaddr_in serv_addr;
  113.     struct hostent *server;
  114.     unsigned char buffer[256];
  115.    
  116.     server = gethostbyname(serverAddress);
  117.    
  118.     memset(&serv_addr, 0, sizeof(struct sockaddr_in));
  119.     memcpy((char *)&serv_addr.sin_addr, server->h_addr, server->h_length);
  120.     serv_addr.sin_family = server->h_addrtype;
  121.     serv_addr.sin_port = htons(serverPort);
  122.    
  123.     sockfd = socket(server->h_addrtype, SOCK_STREAM, 0);
  124.     if (sockfd < 0) {
  125.         printf("ElectroCraft Qemu: Error opening socket!\n");
  126.         exit(EXIT_FAILURE);
  127.     }
  128.    
  129.     if (connect(sockfd, &serv_addr, sizeof(serv_addr)) < 0) {
  130.         printf("ElectroCraft Qemu: Error connecting!\n");
  131.         exit(EXIT_FAILURE);
  132.     }
  133.    
  134.     printf("ElectroCraft Qemu: Connected to the JAVA server!\n");
  135.  
  136.     while (running) {
  137.         started = true;
  138.         pthread_mutex_lock(&socketMutex);
  139.         //bytesRead = read(sockfd, buffer, 1);
  140.         if (bytesRead < 0) {
  141.             //running = false;
  142.         } else if (bytesRead > 0) {
  143.             unsigned char code = buffer[0];
  144.             bzero(buffer, 256);
  145.            
  146.             switch (code) {
  147.                 case 0:
  148.                     break;
  149.                 default:
  150.                     printf("ElectroCraft Qemu: Got unknown packet!\n");
  151.                     break;
  152.             }
  153.            
  154.             bzero(buffer, 256);
  155.         }
  156.         pthread_mutex_unlock(&socketMutex);
  157.     }
  158.    
  159.     printf("ElectroCraft Qemu: Disconnected from the JAVA server!\n");
  160.     return EXIT_SUCCESS;
  161. }