Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> очень красивая функция с помощью профессионалов 
:(
    Опции темы
icecrashldr
Дата 8.9.2010, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 5.7.2010

Репутация: нет
Всего: нет



segadir, Готовое решение? шевели мозгами .. Могут написать код за тебя, можешь найти готовое решения, можешь реализовать как хочешь, лишь бы работало, но станиш ли от это лучше программировать? нет ... 


boostcoder, Соглашаюсь с вашими постами, вот только не все гладко, как пишет выше упомянутые люди. Конечно, когда дают новый проект, пишу мол типо как хочешь, тут конечно все(по крайней мере многое, ведь код всегда хочется сделать лучше) сработает. А вот мне например сейчас дали патчить xwin от cygwin, вот тут то и понимаешь, что паттерны применить как то не реально smile
Предлогал переписать. сказали ни ни, хотя я бы в одиночку бы справился ... 
PM MAIL WWW   Вверх
boostcoder
Дата 8.9.2010, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(djamshud @  8.9.2010,  17:21 Найти цитируемый пост)
Ну глупость же пишите.

может хватит самолюбие тешить.

Цитата(djamshud @  8.9.2010,  17:21 Найти цитируемый пост)
Все зависит от умения проектировать свои решения.

об этих стандартах я и говорю. вы же, не понимая моей мысли, ни имея представления о _стандартах_проектирования_, пытаетесь возвысить себя, на, я бы сказал, _пустом_многословии_. заканчивайте с этим. ну... не верный вы способ выбрали.

Цитата(djamshud @  8.9.2010,  17:21 Найти цитируемый пост)
Это плохие конторы, и мне очень жаль, что вам приходится работатать именно в них.

естественно!
ведь стандарты проектирования разрабатывают глупцы, не ровень вам smile 
пустое все...

Добавлено @ 17:42
Цитата(icecrashldr @  8.9.2010,  17:33 Найти цитируемый пост)
xwin от cygwin

во первых - если это Си, то да, тут мало пространства для выбора.
во вторых - если с++, но проект нужно изрядно расширить, то в этом случае, нужно углубленно проанализировать имеющийся проект. что весьма не тривиально. и от этого зависит правильность принятия решения. так же, замечу, что анализом может заниматься далеко не каждый программист. и естественно, и от этого фактора, так же, зависит правильность принятия решения. выполнив оба требования, и только после этого принимать решение, изменять проект используя паттерны, или же писать с нуля используя паттерны. я обычно предпочитаю второе.

Это сообщение отредактировал(а) boostcoder - 8.9.2010, 17:45
PM WWW   Вверх
icecrashldr
Дата 8.9.2010, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 5.7.2010

Репутация: нет
Всего: нет



В основном конечно С, но где то видел С++.
Мало того куча багов, производительность желает лучшего, так еще и баги жестокие.
Какое рефакторинг? если делать так по новому. Вот только время, не кто на это не выделит, а это 1307 файлов(пакрайней мере в моей версии) и каждый файл 1000 строк, вот его и пересмотреть то не возможно.

Так что паттерны это хорошо, вот только не всегда применимы...

Часть партянки.. для смеха ...
Код

  case WM_CREATE:

      /* */
      SetProp (hwnd,
           WIN_WINDOW_PROP,
           (HANDLE)((LPCREATESTRUCT) lParam)->lpCreateParams);
      
      /* */
      SetProp (hwnd,
           WIN_WID_PROP,
           (HANDLE)winGetWindowID (((LPCREATESTRUCT) lParam)->lpCreateParams));

      /*
       * Make X windows' Z orders sync with Windows windows because
       * there can be AlwaysOnTop windows overlapped on the window
       * currently being created.
       */
      winReorderWindowsMultiWindow ();

      /* Fix a 'round title bar corner background should be transparent not black' problem when first painted */
      {
        RECT rWindow;
        HRGN hRgnWindow;
        GetWindowRect(hwnd, &rWindow);
        hRgnWindow = CreateRectRgnIndirect(&rWindow);
        SetWindowRgn (hwnd, hRgnWindow, TRUE);
        DeleteObject(hRgnWindow);
      }

      SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)XMING_SIGNATURE);

      IzIME_SendCurrentValue(hwnd);

      return 0;

    case WM_INIT_SYS_MENU:
      /*
       * Add whatever the setup file wants to for this window
       */
      SetupSysMenu ((unsigned long)hwnd);
      return 0;

    case WM_SYSCOMMAND:
      /*
       * Any window menu items go through here
       */
      if (HandleCustomWM_COMMAND ((unsigned long)hwnd, LOWORD(wParam)))
      {
        /* Don't pass customized menus to DefWindowProc */
        return 0;
      }
      if (wParam == SC_RESTORE || wParam == SC_MAXIMIZE)
      {
        WINDOWPLACEMENT wndpl;
    wndpl.length = sizeof(wndpl);
    if (GetWindowPlacement(hwnd, &wndpl) && wndpl.showCmd == SW_SHOWMINIMIZED)
          needRestack = TRUE;
      }
      break;

    case WM_INITMENU:
      /* Checks/Unchecks any menu items before they are displayed */
      HandleCustomWM_INITMENU ((unsigned long)hwnd, wParam);
      break;

    case WM_ERASEBKGND:
      /*
       * Pretend that we did erase the background but we don't care,
       * since we repaint the entire region anyhow
       * This avoids some flickering when resizing.
       */
      return TRUE;

    case WM_QUERYENDSESSION:
        return TRUE;
    case WM_ENDSESSION:
        ExitProcess(0);
        return TRUE;
    case WM_DISPLAYCHANGE: 
        winAdjustVideoModeShadowGDI2(s_pScreen);
        break;
    case WM_PAINT:
      /* Only paint if our window handle is valid */
      if (hwndScreen == NULL)
    break;

      /* BeginPaint gives us an hdc that clips to the invalidated region */
      hdcUpdate = BeginPaint (hwnd, &ps);
      /* Avoid the BitBlt's if the PAINTSTRUCT is bogus */
      if (ps.rcPaint.right==0 && ps.rcPaint.bottom==0 && ps.rcPaint.left==0 && ps.rcPaint.top==0)
      {
    EndPaint (hwnd, &ps);
    return 0;
      }

      /* Try to copy from the shadow buffer */
      if (!BitBlt (hdcUpdate,
           ps.rcPaint.left, ps.rcPaint.top,
           ps.rcPaint.right - ps.rcPaint.left, ps.rcPaint.bottom - ps.rcPaint.top,
           s_pScreenPriv->hdcShadow,
           ps.rcPaint.left + pWin->drawable.x, ps.rcPaint.top + pWin->drawable.y,
           SRCCOPY))
    {
      LPVOID lpMsgBuf;
      
      /* Display a fancy error message */
      FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | 
             FORMAT_MESSAGE_FROM_SYSTEM | 
             FORMAT_MESSAGE_IGNORE_INSERTS,
             NULL,
             GetLastError (),
             MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
             (LPTSTR) &lpMsgBuf,
             0, NULL);

      ErrorF ("winTopLevelWindowProc - BitBlt failed: %s\n",
          (LPSTR)lpMsgBuf);
      LocalFree (lpMsgBuf);
    }

      /* EndPaint frees the DC */
      EndPaint (hwnd, &ps);
      return 0;

    case WM_MOUSEMOVE:
      /* Unpack the client area mouse coordinates */
      ptMouse.x = GET_X_LPARAM(lParam);
      ptMouse.y = GET_Y_LPARAM(lParam);

      /* Translate the client area mouse coordinates to screen coordinates */
      ClientToScreen (hwnd, &ptMouse);

      /* Screen Coords from (-X, -Y) -> Root Window (0, 0) */
      ptMouse.x -= GetSystemMetrics (SM_XVIRTUALSCREEN);
      ptMouse.y -= GetSystemMetrics (SM_YVIRTUALSCREEN);

      /* We can't do anything without privates */
      if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
    break;

      /* Has the mouse pointer crossed screens? */
      if (s_pScreen != miPointerGetScreen(g_pwinPointer))
    miPointerSetScreen (g_pwinPointer, s_pScreenInfo->dwScreen,
                   ptMouse.x - s_pScreenInfo->dwXOffset,
                   ptMouse.y - s_pScreenInfo->dwYOffset);

      /* Are we tracking yet? */
      if (!s_fTracking)
    {
      TRACKMOUSEEVENT        tme;
      
      /* Setup data structure */
      ZeroMemory (&tme, sizeof (tme));
      tme.cbSize = sizeof (tme);
      tme.dwFlags = TME_LEAVE;
      tme.hwndTrack = hwnd;

      /* Call the tracking function */
      if (!(*g_fpTrackMouseEvent) (&tme))
        ErrorF ("winTopLevelWindowProc - _TrackMouseEvent failed\n");

      /* Flag that we are tracking now */
      s_fTracking = TRUE;
    }
      
      /* Hide or show the Windows mouse cursor */
      if (g_fSoftwareCursor && g_fCursor)
    {
      /* Hide Windows cursor */
      g_fCursor = FALSE;
      ShowCursor (FALSE);
    }

      /* Kill the timer used to poll mouse events */
      if (g_uipMousePollingTimerID != 0)
    {
      KillTimer (s_pScreenPriv->hwndScreen, WIN_POLLING_MOUSE_TIMER_ID);
      g_uipMousePollingTimerID = 0;
    }

      /* Deliver absolute cursor position to X Server */
      winEnqueueMotion(ptMouse.x - s_pScreenInfo->dwXOffset,
               ptMouse.y - s_pScreenInfo->dwYOffset);

      return 0;
      
    case WM_NCMOUSEMOVE:
      /*
       * We break instead of returning 0 since we need to call
       * DefWindowProc to get the mouse cursor changes
       * and min/max/close button highlighting in Windows XP.
       * The Platform SDK says that you should return 0 if you
       * process this message, but it fails to mention that you
       * will give up any default functionality if you do return 0.
       */
      
      /* We can't do anything without privates */
      if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
    break;

      /* Non-client mouse movement, show Windows cursor */
      if (g_fSoftwareCursor && !g_fCursor)
    {
      g_fCursor = TRUE;
      ShowCursor (TRUE);
    }

      winStartMousePolling(s_pScreenPriv);

      break;

    case WM_MOUSELEAVE:
      /* Mouse has left our client area */

      /* Flag that we are no longer tracking */
      s_fTracking = FALSE;

      /* Show the mouse cursor, if necessary */
      if (g_fSoftwareCursor && !g_fCursor)
    {
      g_fCursor = TRUE;
      ShowCursor (TRUE);
    }

      winStartMousePolling(s_pScreenPriv);

      return 0;

    case WM_LBUTTONDBLCLK:
    case WM_LBUTTONDOWN:
      if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
    break;
      g_fButton[0] = TRUE;
      SetCapture(hwnd);
      return winMouseButtonsHandle (s_pScreen, ButtonPress, Button1, wParam);

    case WM_LBUTTONUP:
      if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
    break;
      g_fButton[0] = FALSE;
      ReleaseCapture();
      winStartMousePolling(s_pScreenPriv);
      return winMouseButtonsHandle (s_pScreen, ButtonRelease, Button1, wParam);

    case WM_MBUTTONDBLCLK:
    case WM_MBUTTONDOWN:
      if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
    break;
      g_fButton[1] = TRUE;
      SetCapture(hwnd);
      return winMouseButtonsHandle (s_pScreen, ButtonPress, Button2, wParam);

    case WM_MBUTTONUP:
      if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
    break;
      g_fButton[1] = FALSE;
      ReleaseCapture();
      winStartMousePolling(s_pScreenPriv);
      return winMouseButtonsHandle (s_pScreen, ButtonRelease, Button2, wParam);

    case WM_RBUTTONDBLCLK:
    case WM_RBUTTONDOWN:
      if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
    break;
      g_fButton[2] = TRUE;
      SetCapture(hwnd);
      return winMouseButtonsHandle (s_pScreen, ButtonPress, Button3, wParam);

    case WM_RBUTTONUP:
      if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
    break;
      g_fButton[2] = FALSE;
      ReleaseCapture();
      winStartMousePolling(s_pScreenPriv);
      return winMouseButtonsHandle (s_pScreen, ButtonRelease, Button3, wParam);

    case WM_XBUTTONDBLCLK:
    case WM_XBUTTONDOWN:
      if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
    break;
    SetCapture(hwnd);
      return winMouseButtonsHandle (s_pScreen, ButtonPress, HIWORD(wParam) + 5, wParam);

    case WM_XBUTTONUP:
      if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
    break;
      ReleaseCapture();
      winStartMousePolling(s_pScreenPriv);
      return winMouseButtonsHandle (s_pScreen, ButtonRelease, HIWORD(wParam) + 5, wParam);

    case WM_MOUSEWHEEL:
      if (SendMessage(hwnd, WM_NCHITTEST, 0, MAKELONG(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))) == HTCLIENT)
    {
      /* Pass the message to the root window */
      SendMessage (hwndScreen, message, wParam, lParam);
      return 0;
    }
      else break;

    case WM_SETFOCUS:
      if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
    break;

      {
    /* Get the parent window for transient handling */
    HWND hParent = GetParent(hwnd);
    if (hParent && IsIconic(hParent)) ShowWindow (hParent, SW_RESTORE);
      }

      winRestoreModeKeyStates ();

      /* Add the keyboard hook if possible */
      if (g_fKeyboardHookLL)
    g_fKeyboardHookLL = winInstallKeyboardHookLL ();
      return 0;
      
    case WM_KILLFOCUS:
      /* Pop any pressed keys since we are losing keyboard focus */
      winKeybdReleaseKeys ();

      /* Remove our keyboard hook if it is installed */
      winRemoveKeyboardHookLL ();
      if (!wParam)
    /* Revert the X focus as well, but only if the Windows focus is going to another window */
    DeleteWindowFromAnyEvents(pWin, FALSE);
      return 0;

    case WM_SYSDEADCHAR:      
    case WM_DEADCHAR:
      /*
       * NOTE: We do nothing with WM_*CHAR messages,
       * nor does the root window, so we can just toss these messages.
       */
      return 0;

    case WM_SYSKEYDOWN:
    case WM_KEYDOWN:

      /*
       * Don't pass Alt-F4 key combo to root window,
       * let Windows translate to WM_CLOSE and close this top-level window.
       *
       * NOTE: We purposely don't check the fUseWinKillKey setting because
       * it should only apply to the key handling for the root window,
       * not for top-level window-manager windows.
       *
       * ALSO NOTE: We do pass Ctrl-Alt-Backspace to the root window
       * because that is a key combo that no X app should be expecting to
       * receive, since it has historically been used to shutdown the X server.
       * Passing Ctrl-Alt-Backspace to the root window preserves that
       * behavior, assuming that -unixkill has been passed as a parameter.
       */
      if (wParam == VK_F4 && (GetKeyState (VK_MENU) & 0x8000))
      break;

#if CYGWINDOWING_DEBUG
      if (wParam == VK_ESCAPE)
    {
      /* Place for debug: put any tests and dumps here */
      WINDOWPLACEMENT windPlace;
      RECT rc;
      LPRECT pRect;
      
      windPlace.length = sizeof (WINDOWPLACEMENT);
      GetWindowPlacement (hwnd, &windPlace);
      pRect = &windPlace.rcNormalPosition;
      ErrorF ("\nCYGWINDOWING Dump:\n"
          "\tdrawable: (%hd, %hd) - %hdx%hd\n", pDraw->x,
          pDraw->y, pDraw->width, pDraw->height);
      ErrorF ("\twindPlace: (%ld, %ld) - %ldx%ld\n", pRect->left,
          pRect->top, pRect->right - pRect->left,
          pRect->bottom - pRect->top);
      if (GetClientRect (hwnd, &rc))
        {
          pRect = &rc;
          ErrorF ("\tClientRect: (%ld, %ld) - %ldx%ld\n", pRect->left,
              pRect->top, pRect->right - pRect->left,
              pRect->bottom - pRect->top);
        }
      if (GetWindowRect (hwnd, &rc))
        {
          pRect = &rc;
          ErrorF ("\tWindowRect: (%ld, %ld) - %ldx%ld\n", pRect->left,
              pRect->top, pRect->right - pRect->left,
              pRect->bottom - pRect->top);
        }
      ErrorF ("\n");
    }
#endif
      
      /* Pass the message to the root window */
      return winWindowProc(hwndScreen, message, wParam, lParam);

    case WM_SYSKEYUP:
    case WM_KEYUP:


      /* Pass the message to the root window */
      return winWindowProc(hwndScreen, message, wParam, lParam);

    case WM_HOTKEY:

      /* Pass the message to the root window */
      SendMessage (hwndScreen, message, wParam, lParam);
      return 0;

    case WM_ACTIVATE:

      /* Pass the message to the root window */
      SendMessage (hwndScreen, message, wParam, lParam);

      if (LOWORD(wParam) != WA_INACTIVE)
    {
      /* Raise the window to the top in Z order */
          /* ago: Activate does not mean putting it to front! */
          /*
      wmMsg.msg = WM_WM_RAISE;
      if (fWMMsgInitialized)
        winSendMessageToWM (s_pScreenPriv->pWMInfo, &wmMsg);
          */
      
      /* Tell our Window Manager thread to activate the window */
      wmMsg.msg = WM_WM_ACTIVATE;
      if (fWMMsgInitialized)
        if (!pWin || !pWin->overrideRedirect) /* for OOo menus */
          winSendMessageToWM (s_pScreenPriv->pWMInfo, &wmMsg);
    }
      /* Prevent the mouse wheel from stalling when another window is minimized */
      if (HIWORD(wParam) == 0 && LOWORD(wParam) == WA_ACTIVE &&
      (HWND)lParam != NULL && (HWND)lParam != (HWND)GetParent(hwnd))
    SetFocus(hwnd);
      return 0;

    case WM_ACTIVATEAPP:
      /*
       * This message is also sent to the root window
       * so we do nothing for individual multiwindow windows
       */
      break;

    case WM_CLOSE:
      if (GetWindowLongPtr (hwnd, GWL_STYLE) & WS_CAPTION) 
        {
      winMouseButtonsHandle (s_pScreen, ButtonPress, Button1, MK_LBUTTON);
      winMouseButtonsHandle (s_pScreen, ButtonRelease, Button1, MK_LBUTTON);            
        }

      /* Branch on if the window was killed in X already */
      if (pWinPriv->fXKilled)
        {
      /* Window was killed, go ahead and destroy the window */
      DestroyWindow (hwnd);
    }
      else
    {
      /* Tell our Window Manager thread to kill the window */
      wmMsg.msg = WM_WM_KILL;
      if (fWMMsgInitialized)
        winSendMessageToWM (s_pScreenPriv->pWMInfo, &wmMsg);
    }
      return 0;

    case WM_DESTROY:

      /* Branch on if the window was killed in X already */
      if (pWinPriv && !pWinPriv->fXKilled)
    {
      ErrorF ("winTopLevelWindowProc - WM_DESTROY - WM_WM_KILL\n");
      
      /* Tell our Window Manager thread to kill the window */
      wmMsg.msg = WM_WM_KILL;
      if (fWMMsgInitialized)
        winSendMessageToWM (s_pScreenPriv->pWMInfo, &wmMsg);
    }

      RemoveProp (hwnd, WIN_WINDOW_PROP);
      RemoveProp (hwnd, WIN_WID_PROP);
      RemoveProp (hwnd, WIN_NEEDMANAGE_PROP);

      break;

    case WM_MOVE:
      /* Adjust the X Window to the moved Windows window */
#ifdef XBCONSOLE
      if (winAdjustXWindow (pWin, hwnd))
        {
      winMouseButtonsHandle (s_pScreen, ButtonPress, Button1, 0);
      winMouseButtonsHandle (s_pScreen, ButtonRelease, Button1, 0);
        }
#else
    winAdjustXWindow (pWin, hwnd);
#endif
      if (GetWindowLongPtr (hwnd, GWL_STYLE) & WS_CAPTION) 
        {
      winMouseButtonsHandle (s_pScreen, ButtonRelease, Button1, MK_LBUTTON);            
        }
      return 0;

PM MAIL WWW   Вверх
boostcoder
Дата 8.9.2010, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



это кусок какого-нибудь wndproc? smile

Добавлено через 2 минуты и 3 секунды
уточню: если проект написан на Си, то это не означает что нельзя использовать паттерны с++. другое дело, что нет компилятора с++, или по каким-то соображениям это недопустимо.
PM WWW   Вверх
icecrashldr
Дата 8.9.2010, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 5.7.2010

Репутация: нет
Всего: нет



Ага smile 

Цитата

уточню: если проект написан на Си, то это не означает что нельзя использовать паттерны с++. другое дело, что нет компилятора с++, или по каким-то соображениям это недопустимо. 

Это без проблем ... 

Вот только "врукить" осталось, как сделать отрисовку при движении окон  smile  smile  smile . Единственное что пока что не как не могу побороть ((((
PM MAIL WWW   Вверх
djamshud
Дата 8.9.2010, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



boostcoder, одному анонимусу возвышаться над другим? Увольте:). И не принимайте все так близко к сердцу;).

Вы меня немного не так поняли или я не совсем так выразился. Я знаком с паттернами по книге design patterns (хз кто автор) и некоторым публикациям в интернетах. И я прекрасно вижу, когда использую те или иные из них, или когда использую антипаттерны. Я же говорю, что слепое следование правилам "во! паттерн! ###ись!" и "антипаттерн? нет пути!" - зло. И еще большее зло, когда их навязывай тебе твой работодатель. Во-первых,.. Ой, сейчас я рожу много буков, погуглите лучше criticism of patterns.

Добавлено через 16 секунд
The book's authors are Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides with a foreword by Grady Booch.

Во кого я читал.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
icecrashldr
Дата 8.9.2010, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 5.7.2010

Репутация: нет
Всего: нет



А вот так у нас пишет TEAM LEADER, после такого хочется вообще забить на это *** (Я не знаю как выразится)

Код

                            while(iter != mContents.end()) 
                            {
                                CStringW strType = L"";
                                DWORD dwSize = 0;
                                
                                strType = iter->first;
                                dwSize = iter->second;

                                if ((strType == L"text") && (dwSize > 0) && (dwDataSize > 0))
                                {
                                    Log::write(L"Clipboard Thread: Got TEXT...", nDeviceID);
                                    CStringW strData = Utils::UTF8To16(pData, dwSize);

                                    // Copy UNICODE text to WindowsClipboard
                                    if (pPipeSet->CopyTextToWinClipboard(strData, nDeviceID))
                                    {
                                        // device clipboard text was set to win clipboard
                                        // so ignore WM_DRAWCLIPBOARD invoked by sending this content from device to win
                                        IZPipeSet::bIgnoreWinClipboard = TRUE;
                                    }
                                    
                                    if ((dwDataSize - dwSize) > 0) // exists more content data in common data block
                                    {
                                        BYTE *pNewData = (BYTE *)realloc(NULL, dwDataSize - dwSize);
                                        memcpy(pNewData, pData + dwSize, dwDataSize - dwSize);
                                        free (pData);
                                        // remove copied part of data
                                        pData = pNewData; // point to newsized and rest data memory block
                                    }
                                    dwDataSize -= dwSize; // new size of data block
                                }
                                else if ((strType == "image") && (dwSize > 0) && (dwDataSize > 0))
                                {
                                    Log::write(L"Clipboard Thread: Got IMAGE...", nDeviceID);

                                    BYTE *pImageData = (BYTE *)realloc(NULL, dwSize);
                                    memcpy(pImageData, pData, dwSize);

                                    pPipeSet->CopyImageToWinClipboard(hwndOwner, pImageData, dwSize, nDeviceID);

                                    if (pImageData)
                                        free(pImageData);
                                    pImageData = NULL;

                                    // modify data from pipe if needed
                                    if ((dwDataSize - dwSize) > 0) // exists more content data in common data block
                                    {
                                        BYTE *pNewData = (BYTE *)realloc(NULL, dwDataSize - dwSize);
                                        memcpy(pNewData, pData + dwSize, dwDataSize - dwSize);
                                        free (pData);
                                        // remove copied part of data
                                        pData = pNewData; // point to newsized and rest data memory block
                                    }
                                    dwDataSize -= dwSize; // new size of data block
                                }
                                else if ((strType == "html")&& (dwSize > 0) && (dwDataSize > 0))
                                {
                                    Log::write(L"Clipboard Thread: Got HTML...", nDeviceID);

                                    BYTE *pHTMLData = NULL;
                                    
                                    if (((pData[0] == 0xFF) && (pData[1] == 0xFE))||  // little-endian order
                                        ((pData[0] == 0xFE) && (pData[1] == 0xFF))    ) // big-endian order
                                    {
                                        Log::write(L"Clipboard Thread: Copying HTML to Win...UTF16 with BOM detected...", nDeviceID);

                                        // UTF-16 html
                                        // Only work with english symbols in html
                                        BYTE *bufUTF16 = NULL;
                                        
                                        // allocate memory without BOM                                    
                                        bufUTF16 = (BYTE *)realloc(NULL, dwSize);
                                        
                                        // copy html content UTF-16 without BOM
                                        memcpy(bufUTF16, pData + 2, dwSize - 2);
                                        bufUTF16[dwSize-2] = 0x00;
                                        bufUTF16[dwSize-1] = 0x00;
                                                
                                        if ((pData[0] == 0xFE) && (pData[1] == 0xFF)) // Big Endian needs to reverse bytes to Little Endian
                                        {
                                            try
                                            {
                                                int nBytes = dwSize - 2;
                                                for(int i = 0; i < nBytes; i += 2)
                                                {
                                                    BYTE TempByte = bufUTF16[i];
                                                    bufUTF16[i] = bufUTF16[i+1];
                                                    bufUTF16[i+1] = TempByte;
                                                }
                                            }
                                            catch (...)
                                            {
                                                // memory operation exception
                                                Log::write(L"Clipboard Thread: Copying HTML to Win... *** !!! ERROR MEMORY EXCEPTION !!!***", nDeviceID);
                                                MessageBox(AfxGetMainWnd()->GetSafeHwnd(), L"Error while preparing HTML clipboard content.", L"Gateway", MB_TOPMOST | MB_ICONERROR);
                                            }
                                        }
                                
                                        CStringW strUTF16 = (LPCWSTR)bufUTF16;

                                        //// save to file
                                        //Utils::WriteDataToFile(L"c:\\utf16_html_orig.bin", pData, dwSize);
                                        //Utils::WriteDataToFile(L"c:\\utf16_html_reversed.bin", bufUTF16, dwSize);
                                        
                                        
                                        // logging
                                        CStringW strLog = L"Clipboard Thread: Copying HTML to Win...UTF16...|";
                                        strLog += strUTF16;
                                        strLog += L"|";
                                        Log::write(strLog, nDeviceID);
                                        // logging

                                        // Convert UTF16 to UTF8
                                        DWORD nCountBytes = 0;
                                        int nUTF8Count = 0;
                                        
                                        nUTF8Count = CMarkup::UTF16To8(NULL, (LPWSTR)bufUTF16, NULL);
                                        if (nUTF8Count > 0)
                                        {
                                            pHTMLData = (BYTE *)realloc(NULL, nUTF8Count + 1);
                                            nCountBytes = CMarkup::UTF16To8((char *)pHTMLData, (LPWSTR)bufUTF16, nUTF8Count);
                                            if (nCountBytes > 0)
                                            {
                                                pHTMLData[nUTF8Count] = '\0';
                                                if (pPipeSet->CopyHTMLToWinClipboard((char *)pHTMLData, nCountBytes + 1, nDeviceID))
                                                {
                                                    // Ignore WM_DRAWCLIPBOARD invoked by sending this content from device to win
                                                    IZPipeSet::bIgnoreWinClipboard = TRUE;
                                                }
                                                else
                                                {
                                                    Log::write(L"Clipboard Thread: Copying HTML to Win...ERROR while preparing or setting clipboard", nDeviceID);
                                                    MessageBox(AfxGetMainWnd()->GetSafeHwnd(), L"Error while preparing HTML clipboard content.", L" Gateway", MB_TOPMOST | MB_ICONERROR);
                                                }
                                            }
                                            else
                                            {
                                                Log::write(L"Clipboard Thread: Copying HTML to Win...ERROR! cannot convert to UTF8", nDeviceID);
                                                MessageBox(AfxGetMainWnd()->GetSafeHwnd(), L"Error while preparing HTML clipboard content.", L" Gateway", MB_TOPMOST | MB_ICONERROR);
                                            }
                                        }
                                        else
                                        {
                                            Log::write(L"Clipboard Thread: Copying HTML to Win...ERROR! cannot convert to UTF8", nDeviceID);
                                            MessageBox(AfxGetMainWnd()->GetSafeHwnd(), L"Error while preparing HTML clipboard content.", L" Gateway", MB_TOPMOST | MB_ICONERROR);
                                        }
                                        
                                        // free memory
                                        if (bufUTF16)
                                        {
                                            free(bufUTF16);
                                            bufUTF16 = NULL;
                                        }
                                    }
                                    else
                                    {
                                        Log::write(L"Clipboard Thread: Copying HTML to Win...UTF8 without BOM detected...", nDeviceID);
                                        
                                        // UTF-8 html Open office set clipboard without BOM
                                        pHTMLData = (BYTE *)realloc(NULL, dwSize + 1);
                                        memcpy(pHTMLData, pData, dwSize);
                                        pHTMLData[dwSize] = '\0';
                                        
                                        pPipeSet->CopyHTMLToWinClipboard((char *)pHTMLData, dwSize + 1, nDeviceID);
                                    }

                                    if (pHTMLData)
                                    {
                                        free(pHTMLData);
                                        pHTMLData = NULL;
                                    }
                                    
                                    if ((dwDataSize - dwSize) > 0) // exists more content data in common data block
                                    {
                                        BYTE *pNewData = (BYTE *)realloc(NULL, dwDataSize - dwSize);
                                        memcpy(pNewData, pData + dwSize, dwDataSize - dwSize);
                                        free (pData);
                                        // remove copied part of data
                                        pData = pNewData; // point to newsized and rest data memory block
                                    }
                                    dwDataSize -= dwSize; // new size of data block
                                
                                }
                                else
                                    Log::write(L"Clipboard Thread: Error: Unsupported clipboard content type!", nDeviceID);

                                iter--;
                            }


PM MAIL WWW   Вверх
boostcoder
Дата 8.9.2010, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



в данной ситуации, switch() очень легко заменить на, к примеру:
Код

typedef native_id_type id_type;
typedef boost::function<int()> callback_type;
typedef std::map<id_type, callback_type> function_map;

// т.к. заранее известно кол-во case`ов, их нужно как-то регать.
// как-то так:

int wm_create_function(...) {
   ...
}

function_map[WM_CREATE] = boost::bind(wm_create_function, args...);

// вызываем так:
if ( function_map.find(id) == function_map.end() ) {
   throw std::invalid_argument("message");
}
function_map[id](args...);


вот так разбили этот огромный кусок на кучу мелких. и за одно избавились от switch()(который я не приемлю, так же как и goto)(но это имхо).

Добавлено через 1 минуту и 13 секунд
зы
код не проверял smile 

Это сообщение отредактировал(а) boostcoder - 8.9.2010, 19:14
PM WWW   Вверх
icecrashldr
Дата 8.9.2010, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 5.7.2010

Репутация: нет
Всего: нет



Вариантов масса, меню на все вкусы .. smile

Вот только ТИМУ  это не объяснить, он утверждает, 
Цитата

но оно же работает

PM MAIL WWW   Вверх
boostcoder
Дата 8.9.2010, 19:19 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(icecrashldr @  8.9.2010,  19:16 Найти цитируемый пост)
но оно же работает

уау! был у меня в команде такой товарысч. точно так же говорил. погнал к х... его.
PM WWW   Вверх
bsa
Дата 8.9.2010, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(icecrashldr @ 8.9.2010,  20:16)
Вот только ТИМУ  это не объяснить, он утверждает, 
Цитата

но оно же работает

Поддерживаю boostcoder. Гнать его надо. Правильная работа программы не является достаточным условием ее качественности.

Дай своему тиму ссылку на форум (а лучше две - одна на часто задаваемые вопросы этого раздела), пусть попробует нас переубедить.
PM   Вверх
xvr
Дата 9.9.2010, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(icecrashldr @  8.9.2010,  19:06 Найти цитируемый пост)
А вот так у нас пишет TEAM LEADER, после такого хочется вообще забить на это ***

Хорошо так пишет - этакая хорошо структурированная спагетина из помеси С++ и realloc'ов  smile 
Цитата(icecrashldr @  8.9.2010,  19:06 Найти цитируемый пост)
(Я не знаю как выразится)

Как в анекдоте:
- Что сказал папа, когда узнал, что ты разбил его машину?
- Матерные слова опустить?
- Конечно
- Тогда ничего

Цитата(bsa @  8.9.2010,  21:44 Найти цитируемый пост)
Поддерживаю boostcoder. Гнать его надо. Правильная работа программы не является достаточным условием ее качественности.
Угу, всенепременно!


Цитата(bsa @  8.9.2010,  21:44 Найти цитируемый пост)
Дай своему тиму ссылку на форум (а лучше две - одна на часто задаваемые вопросы этого раздела), пусть попробует нас переубедить. 

Ему некогда - он КОД пишет  smile 

PM MAIL   Вверх
icecrashldr
Дата 9.9.2010, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 5.7.2010

Репутация: нет
Всего: нет



Цитата

Ему некогда - он КОД пишет  smile 

Ага, вот только есть одна проблема...
Я написал и отладил(уже несколько месяцов все работает стабильно) NT сервис + драйвер.
Сервис предоставляет способ общения с драйвером обходя повышения привилегий.
Работа построена через пайпы.
Handle пайпа закрывается только по факту закрытия со стороны клиента(Либо при выгрузки драйвера, отключения устройства)
И уже были случаи когда пайп не закрывался со стороны клиента, соответсвено  утечка ресурсов в двух местах.(А как я это вычислял ... )
А как было весело, отлаживать его stack overflow(он на стеке создавали переменные больше метра, грубо говоря "распыляя память"), и при этом он утверждал "ты же системный программист".
А вот гнать его не получится, скорее всего меня уволят ((

П.С.
 Про архитектуру не спрашивайте, это не я придумывал ...
PM MAIL WWW   Вверх
bsa
Дата 9.9.2010, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



icecrashldr, "гнать его надо" - это не указание к действию, а отношение к специалисту.
PM   Вверх
icecrashldr
Дата 9.9.2010, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 5.7.2010

Репутация: нет
Всего: нет



 smile 
PM MAIL WWW   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0998 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.