Bonjours, je vous expose mon pb :

j'ai commencé un developpement en WxWidgets, etant totalement newbee en C, C++, et Wxwidgets, j'avait des bgs de partout...
maintenant il est "presque" fonctionnel, mais je ne sait plus du tout par ou commencer pour le refactoriser en OO...

donc, je vait me lancer dnas ce travail, mais, si une ^bonne âme voulait bien me diriger, ne setrait-ce q'un peu...

donc, voici une liste (surement incomplete) des traitements de mon programme :
  • creation d'une socket d'ecoute
  • creation d'une oscket client
  • creation d'une socket serveur
  • traitements coté serveur :
    • "capture" de l'image affichée a l'ecran
    • envoie de cette image par le reseau
    • attente d'une trame confirmant la reception
    • re-envoi d'une nouvelle image
  • traitement client
    • reception de l'image
    • affichage a l'ecran
    • envoie d'une trame demandant une nouvelle image
  • traitement que je voudrait implementer
    • utilisation de criptage simple par clé publique clef privée
    • utilisation du protocole reseau simplounet pour d'autre traitement (TQ un tetris?)
bien entendu, tout ceci est codé comme l'aurait fait, ma grand mere (comme qqun qui s'y connait pas...)

ce que voudrait savoir, c'est surtout quelles classes créer...
je suis en seconde année de BTS info, et j'ai pas eu un seul cours sur la POO... et je doit, pour mon examen rendre un programme OO...

voici mon code, c'est pas vraiment la peine de le regarder...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
//---------------------------------------------------------------------------
//
// Name:        vncPeuThreadeFrm.cpp
// Author:      bruno DA SILVA
// Created:     09/01/2006 09:55:45
//
//---------------------------------------------------------------------------
 
#include "vncPeuThreadeFrm.h"
#include "thread2base.h"
#include <windows.h>
#include <wx/image.h>
#include <wx/dcscreen.h>
#include <wx/dc.h>
#include <wx/dcbuffer.h>
#include <wx/scrolwin.h>
//Do not add custom headers.
//wx-dvcpp designer will remove them
////Header Include Start
////Header Include End
 
//----------------------------------------------------------------------------
// vncPeuThreadeFrm
//----------------------------------------------------------------------------
   //Add Custom Events only in the appropriate Block.
   // Code added in  other places will be removed by wx-dvcpp 
  ////Event Table Start
BEGIN_EVENT_TABLE(vncPeuThreadeFrm,wxFrame)
 ////Manual Code Start
 EVT_SOCKET(SERVER_IMG_ID,  vncPeuThreadeFrm::OnServerEventImg)
 EVT_SOCKET(SOCKET_IMG_ID,  vncPeuThreadeFrm::OnSocketEventImg)
 EVT_SOCKET(CLIENT_IMG_ID,  vncPeuThreadeFrm::OnClientEventImg)
 EVT_SOCKET(SERVER_KBD_ID,  vncPeuThreadeFrm::OnServerEventKbd)
 EVT_SOCKET(SOCKET_KBD_ID,  vncPeuThreadeFrm::OnSocketEventKbd)
 EVT_SOCKET(CLIENT_KBD_ID,  vncPeuThreadeFrm::OnClientEventKbd)
 
 //pour la zone affichant la bmp
 EVT_PAINT(                 vncPeuThreadeFrm::OnAfficheBmp) //kan la bmp d'affiche
 EVT_SCROLLBAR(SCROLL_ID,   vncPeuThreadeFrm::OnScroll) 
 
 ////Manual Code End
 
 EVT_CLOSE(                 vncPeuThreadeFrm::vncPeuThreadeFrmClose)
 EVT_BUTTON(ID_WXBUTTON2,   vncPeuThreadeFrm::WxButton2Click)
 EVT_BUTTON(ID_WXBUTTON1,   vncPeuThreadeFrm::WxButton1Click)
 
END_EVENT_TABLE()
  ////Event Table End
 
 
//constructeur du gui
vncPeuThreadeFrm::vncPeuThreadeFrm( wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const wxSize& size, long style )
    : wxFrame( parent, id, title, position, size, style)
{
    CreateGUIControls();
}
vncPeuThreadeFrm::~vncPeuThreadeFrm() {} 
void vncPeuThreadeFrm::CreateGUIControls(void)
{
    //Do not add custom Code here
    //wx-devcpp designer will remove them.
    //Add the custom code before or after the Blocks
    ////GUI Items Creation Start
 this->SetSize(8,8,617,384);
 this->SetTitle(wxT("vncPeuThreade"));
 this->Center();
 this->SetIcon(wxNullIcon);
 
 memoLog = new wxTextCtrl(this, ID_MEMOLOG, wxT(""), wxPoint(4,289), wxSize(560,64), wxVSCROLL | wxTE_READONLY | wxTE_MULTILINE, wxDefaultValidator, wxT("memoLog"));
 memoLog->SetMaxLength(0);
 memoLog->AppendText(wxT("Log :\n"));
 WxButton2 = new wxButton(this, ID_WXBUTTON2, wxT("Client"), wxPoint(256,13), wxSize(75,25), 0, wxDefaultValidator, wxT("WxButton2"));
 WxButton1 = new wxButton(this, ID_WXBUTTON1, wxT("serveur"), wxPoint(83,11), wxSize(75,25), 0, wxDefaultValidator, wxT("WxButton1"));
    ////GUI Items Creation End
 
    WxScrolledWindow1 = new wxScrolledWindow(this, ID_WXSCROLLEDWINDOW1, wxPoint(4,39), wxSize(560,220), wxVSCROLL | wxHSCROLL | wxWS_EX_PROCESS_UI_UPDATES );
 
  //suivant les choix de l'user, les event handler seront géres en tant que serveur ou client...
  //ces choix se fferont au niveau des boutons, 
  //il seront gérés par les fonctions "vncPeuThreadeFrm::setServeur()" et consoeures...
  //pour l'instant, on informe le prog que il n'est ni en mode serveur, ni en mode client :
   estServeur = false;
   estClient = false;
   ConnectionImgValidee = false;
   ConnectionKbdValidee = false;
   BmpRecue = false;
}
void vncPeuThreadeFrm::vncPeuThreadeFrmClose(wxCloseEvent& event)
{
    // --> Don't use Close with a Frame,
    // use Destroy instead.
    Destroy();
}
 
// initialise les sockets en tant que serveur...
void vncPeuThreadeFrm::setServeur()
{
   if (! estServeur) {
 
        //on va instancier les sockets, meme si elles ne seront pas utilisées forcement...
        // on crée l'@ par defaut sur le port local
       addrKbd.Service(8002);
       addrImg.Service(8001);
 
       // On crée deux sockets
       socketKbdSrv = new wxSocketServer(addrKbd);
       socketImgSrv = new wxSocketServer(addrImg);
       // On utilise la fontion Ok(), afin de verifier si l'initialisation s'est bien passée...
       if (! socketKbdSrv->Ok() && socketImgSrv->Ok() )
       {
           //alors les sockets sont pas pretes, on quite le prog...
        memoLog->AppendText(_("les sockets ont pas put s'initialiser...\n"));
        return;
           }      
     // On choisit l'event handler, et on choisit les notification a recevoir...
        socketKbdSrv->SetEventHandler(*this, SERVER_KBD_ID);
        socketImgSrv->SetEventHandler(*this, SERVER_IMG_ID);
        socketKbdSrv->SetNotify(wxSOCKET_CONNECTION_FLAG | wxSOCKET_INPUT | wxSOCKET_OUTPUT);
        socketImgSrv->SetNotify(wxSOCKET_CONNECTION_FLAG | wxSOCKET_OUTPUT | wxSOCKET_INPUT);    
        socketKbdSrv->Notify(true);
        socketImgSrv->Notify(true);
      estServeur = true;
      estClient = false;
 
      creeThread(SERVER_KBD_ID);
      creeThread(SERVER_IMG_ID);
      memoLog->AppendText(_("\nMode serveur initialisé!\n"));
 
      //a suppreimer, present a des fin de test :
     //creeThread(TEST_THREAD_ID);
     }
 
}
// initialise les sockets en tant que client...
void vncPeuThreadeFrm::setClient()
{
   if (! estClient ) {
        //on va instancier les sockets, meme si elles ne seront pas utilisées forcement...
        // on crée l'@ par defaut sur le port local
     addrKbd.Hostname(_("127.0.0.1"));
       addrKbd.Service(8002);
       addrImg.Hostname(_("127.0.0.1"));
       addrImg.Service(8001);
 
       // On crée deux sockets
       socketKbdCli = new wxSocketClient();
       socketImgCli = new wxSocketClient();
 
 
     // On choisit l'event handler, et on choisit les notification a recevoir...
      socketKbdCli->SetEventHandler(*this, CLIENT_KBD_ID);
      socketImgCli->SetEventHandler(*this, CLIENT_IMG_ID);
 
      socketKbdCli->SetNotify(wxSOCKET_CONNECTION_FLAG | wxSOCKET_OUTPUT | wxSOCKET_INPUT);
      socketImgCli->SetNotify(wxSOCKET_CONNECTION_FLAG | wxSOCKET_INPUT | wxSOCKET_OUTPUT );    
 
      socketKbdCli->Notify(true);
      socketImgCli->Notify(true);
 
      estServeur = false;
    estClient = true;
 
    SetImgCliEnCours(false);//on a pas encore recu les en tete de headr : initialisation de la var ici
 
      socketImgCli->Connect(addrImg, false);
     socketImgCli->WaitOnConnect(10);
 
   //on connecte les sockets
     if (socketImgCli->IsConnected()) {
         memoLog->AppendText(_("connection etablie! pour le client Image\n"));
      }
      else
     {
        socketImgCli->Close();
       memoLog->AppendText(_("Echec de connexion du client image\n"));
       wxMessageBox(_("Echec de connexion"), _("Attention !"));
      }
 
       socketKbdCli->Connect(addrKbd, false);
     socketKbdCli->WaitOnConnect(10);
 
     if (socketKbdCli->IsConnected()) {
          memoLog->AppendText(_("connection etablie! pour le client KBD\n"));
          }
     else
     {
        socketKbdCli->Close();
       memoLog->AppendText(_("Echec de connexion du client KBD\n"));
       wxMessageBox(_("Echec de connexion"), _("Attention !"));
     }
      //socket connectées
    creeThread(CLIENT_KBD_ID);
    creeThread(CLIENT_IMG_ID);
 
      memoLog->AppendText(_("\nMode client initialisé!\n"));
  }
}
// OnServerEventImg
void vncPeuThreadeFrm::OnServerEventImg(wxSocketEvent& event)
{
 /* TODO (#1#): Implement vncPeuThreadeFrm::OnServerEventImg() */
 //le socket base créé enverra les images
 wxString s = _("Evenement serveur: ");
  sockBaseImg = event.GetSocket();
 
 switch(event.GetSocketEvent())
 {
      case wxSOCKET_CONNECTION : s.Append(_("wxSOCKET_CONNECTION : ")); break;
  default                  : s.Append(_("evenement inatendu!\n")); break;
 }
 
 memoLog->AppendText(s);
 
 // Accepte une nouvelle connection si il y en a une dans la file d'attente
 // sinon, on sort. on utilise accept(false) pour effectuer une acceptation 
 //non blocante pour le GUI (au cas ou finalement il n'y ait rien dasn la 
 //file d'attente)
 
 
 sockBaseImg = socketImgSrv->Accept(false);
 
 if (sockBaseImg)
 {
     memoLog->AppendText(_("connection acceptée\n"));
 }
 else
 {
     memoLog->AppendText(_("erreure, connection refusée!\n"));
  return;
 }
 
 sockBaseImg->SetEventHandler(*this, SOCKET_IMG_ID);
 sockBaseImg->SetFlags(wxSOCKET_WAITALL);//on ne recevra d'evenements de output que quand tout aura ete transmis (entre temps, ca ne sert a rien de créer une nouvelle image)
 sockBaseImg->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG ); //on gere pas encore les output
 sockBaseImg->Notify(true); //pour recevoir les evenements :)
 
 
}
/*
 * OnSocketEventImg
 */
void vncPeuThreadeFrm::OnSocketEventImg(wxSocketEvent& event)
{
 /* TODO (#1#): Implement vncPeuThreadeFrm::OnSocketEventImg() */
 //c'est la socket crée par la connection avec le client
 //wxSocketBase *sock = event.GetSocket(); => inutil car il retourne le socket concerné, et on sait deja lequell c'est...
 
 switch(event.GetSocketEvent())
 {
 case wxSOCKET_INPUT:
 {
   memoLog->AppendText(_("wxSOCKET_INPUT (socketImg) : "));  
   // On desactive les wxINPUT, afin de ne pas etre rappelé pendant le traitement
   // wxSocketEvent again.
   sockBaseImg->SetNotify(wxSOCKET_LOST_FLAG );
 
   //la connection a t elle deja ete validée?
   if (ConnectionImgValidee) 
   {       
             //je ne sait pas a quoi ca peut encore servir, peut etre a couper la transmission...
 
      } else {
        //il faut faire montrer patte blanche
   unsigned char c;
   sockBaseImg->Read(&c, 1);      
   if (c == 0xBE) 
   {         
       ConnectionImgValidee = true;
       memoLog->AppendText(_("Connection du client validée par le verificateur de securitée, envoie d'une trame de validation\n"));
   } else {
         memoLog->AppendText(_("Connection du client refuséeée par le verificateur de securitée\n"));
            }
   sockBaseImg->Write(&c, 1);//on lui renvoie pour lui notifier que c'est ok ou non
   }
 
 
   // on active les input events de nouveau
   sockBaseImg->SetNotify(wxSOCKET_LOST_FLAG | wxSOCKET_OUTPUT_FLAG | wxSOCKET_INPUT_FLAG);
 
   //et on envoie la premiere image :
      sendImg();
   break;
 }
 case wxSOCKET_LOST:
 {
   memoLog->AppendText(_("socket perdue!\n\n"));
   ConnectionImgValidee = false;
   sockBaseImg->Destroy();
   break;
 }
 case wxSOCKET_OUTPUT:
    {
    //on entre ici quant toutes les data ont ete envoyées...
    //on en envoie donc de nouvelles
    sendImg();   
    }
 default: ;
 }
}
/*
 * OnClientEventImg
 */
void vncPeuThreadeFrm::OnClientEventImg(wxSocketEvent& event)
{
 /* TODO (#1#): Implement vncPeuThreadeFrm::OnClientEventImg() */
 //on recoit les images
 unsigned char c;
   switch(event.GetSocketEvent())
  {
    case wxSOCKET_INPUT      : 
    memoLog->AppendText(_("wxSOCKET_INPUT (ClientImg): ")); 
    if (! ConnectionImgValidee) {
     //si la connection est pas encore validée, on lit la reponse du serveur
    socketImgCli->Read(&c, 1);      
    if (c == 0xBE) 
    {
          ConnectionImgValidee = true;
          memoLog->AppendText(_("Connection validée par le serveur\n"));
       } else {
          memoLog->AppendText(_("Connection refusée par le serveur\n"));                 
       }
          } else {
    //la connection est validée, on recoit les images ou le header
    if (GetImgCliEnCours() == false) 
    {
       //on recoit le header
       memoLog->AppendText(_("Recuperation de la taille du ficier\n"));
       socketImgCli->Read(&tailleImg, 4);//on recupere la taille du fic
      tailleImgRestante = tailleImg;//tous deux sont des wxUint32       
       SetImgCliEnCours(true);
           wxString temp;            
         temp<<tailleImg; 
         memoLog->AppendText( temp);
       //on instancie bufimage, buffer de char destiné a contenir 
        //l'image en entier...
          buffImage = new unsigned char[tailleImg];
       } else {
        //on recoit l'image dans temp readed : bufffer contenant
        // la partie recu par le reseau, a integrer dans buffimage
        wxUint32 tempReaded;
        unsigned char newBuffer[886432];
        socketImgCli->Read(newBuffer, tempReaded);        
        tempReaded = socketImgCli->LastCount();        
        wxString temp; 
         temp<<tempReaded; 
         /*
      memoLog->AppendText(_("taille du dernier troncon recu :"));
         memoLog->AppendText( temp);
         memoLog->AppendText(_("\n"));
         */
        for (wxUint32 i = 0; i < tempReaded ; i++) 
         {//on transvase newbuffer dans buffimage
            buffImage[i + ( tailleImg - tailleImgRestante ) ] = 
                                                        newBuffer[i];
         }
         tailleImgRestante -= tempReaded;
         /*
         memoLog->AppendText(_("Lecture \n"));
      */
        if ( tailleImgRestante == 0)