public int SupplyHintsWithImageDataFiles(TCanceller Canceller) throws Exception { ArrayList<TSpaceHint> _Hints = new ArrayList<TSpaceHint>(); synchronized (this) { TSpaceHint Item = Items; while (Item != null) { if ((Item.InfoImageDATAFileID != 0) && (ItemsImageDataFiles.ItemsTable.get(Item.InfoImageDATAFileID) == null)) { boolean flDataFileIsFound = false; int Sz = _Hints.size(); for (int I = 0; I < Sz; I++) if (_Hints.get(I).InfoImageDATAFileID == Item.InfoImageDATAFileID) { flDataFileIsFound = true; break; // . > } if (!flDataFileIsFound) { _Hints.add(Item); if (_Hints.size() >= SHWIDF_MAX_ITEMS_TO_PROCESS) break; // . > } } // . if (Canceller != null) Canceller.Check(); // . Item = Item.Next; } } if (_Hints.size() == 0) return SHWIDF_RESULT_NOITEMTOSUPPLY; // . -> int Sz = _Hints.size(); int[] _HintIDs = new int[Sz]; for (int I = 0; I < Sz; I++) _HintIDs[I] = _Hints.get(I).ID; // . byte[] Data = null; String url = PrepareHintImagesURL(_HintIDs); HttpURLConnection Connection = Reflector.Server.OpenConnection(url); try { InputStream in = Connection.getInputStream(); try { if (Canceller != null) Canceller.Check(); // . int RetSize = Connection.getContentLength(); if (RetSize == 0) throw new Exception(Reflector.context.getString(R.string.SUnknownServerResponse)); // . => Data = new byte[RetSize]; int Size; int SummarySize = 0; int ReadSize; while (SummarySize < Data.length) { ReadSize = Data.length - SummarySize; Size = in.read(Data, SummarySize, ReadSize); if (Size <= 0) throw new Exception( Reflector.context.getString(R.string.SConnectionIsClosedUnexpectedly)); // . => SummarySize += Size; } } finally { in.close(); } } finally { Connection.disconnect(); } ItemsImageDataFiles_FromZippedByteArray(Data, Canceller); // . final check for supply synchronized (this) { TSpaceHint Item = Items; while (Item != null) { if ((Item.InfoImageDATAFileID != 0) && (ItemsImageDataFiles.ItemsTable.get(Item.InfoImageDATAFileID) == null)) return SHWIDF_RESULT_SUPPLIEDPARTIALLY; // . -> // . if (Canceller != null) Canceller.Check(); // . Item = Item.Next; } } return SHWIDF_RESULT_SUPPLIED; }
@SuppressWarnings({"null", "unused"}) public void GetHintsFromServer(TReflectionWindow ReflectionWindow, TCanceller Canceller) throws Exception { if (Reflector.flOffline) return; // . -> TReflectionWindowStruc RW = ReflectionWindow.GetWindow(); TReflectorSpaceLays Lays = ReflectionWindow.getLays(); TReflectionWindowActualityInterval ActualityInterval = ReflectionWindow.GetActualityInterval(); // . String URL1 = Reflector.Server.Address; // . add command path URL1 = "http://" + URL1 + "/" + "Space" + "/" + "2" /*URLProtocolVersion*/ + "/" + Long.toString(Reflector.User.UserID); String URL2 = "SpaceWindow.png"; // . add command parameters URL2 = URL2 + "?" + "5" /*command version*/ + "," + Double.toString(RW.X0) + "," + Double.toString(RW.Y0) + "," + Double.toString(RW.X1) + "," + Double.toString(RW.Y1) + "," + Double.toString(RW.X2) + "," + Double.toString(RW.Y2) + "," + Double.toString(RW.X3) + "," + Double.toString(RW.Y3) + ","; short[] InvisibleLays = Lays.GetDisabledLaysIndexes(); short InvisibleLaysCount; if (InvisibleLays != null) InvisibleLaysCount = (short) InvisibleLays.length; else InvisibleLaysCount = 0; URL2 = URL2 + Integer.toString(InvisibleLaysCount) + ","; for (int I = 0; I < InvisibleLaysCount; I++) URL2 = URL2 + Integer.toString(InvisibleLays[I]) + ','; URL2 = URL2 + Integer.toString(Reflector.VisibleFactor) + ","; URL2 = URL2 + "1" /*Dynamic hint data version*/ + ","; // . Visualization UserData int TSVUserDataSize = 0; byte[] TSVUserData = null; if (TSVUserData != null) TSVUserDataSize = TSVUserData.length; int Idx = 0; byte[] UserData = new byte[4 /*SizeOf(TSVUserDataSize)*/ + TSVUserDataSize]; byte[] BA = TDataConverter.ConvertInt32ToLEByteArray(TSVUserDataSize); System.arraycopy(BA, 0, UserData, Idx, BA.length); Idx += BA.length; if (TSVUserDataSize > 0) { System.arraycopy(TSVUserData, 0, UserData, Idx, TSVUserData.length); Idx += TSVUserData.length; } String UserDataString; ByteArrayOutputStream BOS = new ByteArrayOutputStream(); try { Base64OutputStream B64S = new Base64OutputStream(BOS, Base64.URL_SAFE); try { B64S.write(UserData); } finally { B64S.close(); } UserDataString = new String(BOS.toByteArray()); } finally { BOS.close(); } URL2 = URL2 + UserDataString + ","; // . URL2 = URL2 + Double.toString(ActualityInterval.GetBeginTimestamp()) + "," + Double.toString(ActualityInterval.EndTimestamp) + ","; // . URL2 = URL2 + Integer.toString(RW.Xmn) + "," + Integer.toString(RW.Ymn) + "," + Integer.toString(RW.Xmx) + "," + Integer.toString(RW.Ymx); boolean flUpdateProxySpace = false; if (flUpdateProxySpace) URL2 = URL2 + "," + "1" /*flUpdateProxySpace = true*/; // . byte[] URL2_Buffer; try { URL2_Buffer = URL2.getBytes("windows-1251"); } catch (Exception E) { URL2_Buffer = null; } byte[] URL2_EncryptedBuffer = Reflector.User.EncryptBufferV2(URL2_Buffer); // . encode string StringBuffer sb = new StringBuffer(); for (int I = 0; I < URL2_EncryptedBuffer.length; I++) { String h = Integer.toHexString(0xFF & URL2_EncryptedBuffer[I]); while (h.length() < 2) h = "0" + h; sb.append(h); } URL2 = sb.toString(); // . String URL = URL1 + "/" + URL2 + ".png"; // . HttpURLConnection Connection = Reflector.Server.OpenConnection(URL); try { InputStream in = Connection.getInputStream(); try { if (Canceller != null) Canceller.Check(); // . byte[] HintDataSizeBA = new byte[4]; TNetworkConnection.InputStream_ReadData( in, HintDataSizeBA, HintDataSizeBA.length, Canceller, Reflector.context); int HintDataSize = TDataConverter.ConvertLEByteArrayToInt32(HintDataSizeBA, 0); byte[] HintData = new byte[HintDataSize]; TNetworkConnection.InputStream_ReadData( in, HintData, HintDataSize, Canceller, Reflector.context); HintData = UnPackByteArray(HintData); ReviseItemsInReflectionWindow(RW, HintData, Canceller); FromByteArray(HintData, Canceller); } finally { in.close(); } } finally { Connection.disconnect(); } }