All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jinterop.dcom.core.PingObject Maven / Gradle / Ivy

/**
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3.0 of the License, or (at your option) any later version.
 *
 * Though a sincere effort has been made to deliver a professional,
 * quality product,the library itself is distributed WITHOUT ANY WARRANTY;
 * See the GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
 */
package org.jinterop.dcom.core;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import jcifs.util.Hexdump;
import ndr.NdrObject;
import ndr.NetworkDataRepresentation;

class PingObject extends NdrObject {

    private static final Logger LOGGER = Logger.getLogger("org.jinterop");
    int opnum = -1;
    List listOfAdds = new ArrayList<>();
    List listOfDels = new ArrayList<>();
    byte[] setId = null;
    int seqNum = 0;

    @Override
    public int getOpnum() {
        return opnum;
    }

    //read follows write...please remember
    @Override
    public void write(NetworkDataRepresentation ndr) {
        switch (opnum) {
            case 2: //complex ping
                int newlength = 8 + 6 + 8 + listOfAdds.size() * 8 + 8 + listOfDels.size() * 8 + 16;
                if (newlength > ndr.getBuffer().buf.length) {
                    ndr.getBuffer().buf = new byte[newlength + 16];
                }

                if (setId == null) {
                    if (LOGGER.isLoggable(Level.INFO)) {
                        LOGGER.info("Complex Ping going for the first time, will get the setId as response of this call ");
                    }
                    setId = new byte[]{0, 0, 0, 0, 0, 0, 0, 0};
                } else {
                    if (LOGGER.isLoggable(Level.INFO)) {
                        LOGGER.log(Level.INFO, "Complex Ping going for setId: {0}", Hexdump.toHexString(setId));
                    }
                }

                if (LOGGER.isLoggable(Level.INFO)) {
                    LOGGER.log(Level.INFO, "Complex ping going : listOfAdds -> Size : {0} , {1}", new Object[]{listOfAdds.size(), listOfAdds});
                    LOGGER.log(Level.INFO, "listOfDels -> Size : {0} , {1}", new Object[]{listOfDels.size(), listOfDels});
                }

                JIMarshalUnMarshalHelper.writeOctetArrayLE(ndr, setId);

                JIMarshalUnMarshalHelper.serialize(ndr, Short.class, (short) seqNum, null, JIFlags.FLAG_NULL);//seq
                JIMarshalUnMarshalHelper.serialize(ndr, Short.class, (short) listOfAdds.size(), null, JIFlags.FLAG_NULL);//add
                JIMarshalUnMarshalHelper.serialize(ndr, Short.class, (short) listOfDels.size(), null, JIFlags.FLAG_NULL);//del

                if (!listOfAdds.isEmpty()) {
                    JIMarshalUnMarshalHelper.serialize(ndr, Integer.class, new Object().hashCode(), null, JIFlags.FLAG_NULL);//pointer
                    JIMarshalUnMarshalHelper.serialize(ndr, Integer.class, listOfAdds.size(), null, JIFlags.FLAG_NULL);

                    for (int i = 0; i < listOfAdds.size(); i++) {
                        JIObjectId oid = listOfAdds.get(i);
                        JIMarshalUnMarshalHelper.writeOctetArrayLE(ndr, oid.getOID());
                        //LOGGER.info("[" + oid.toString() + "]");
                    }
                } else {
                    JIMarshalUnMarshalHelper.serialize(ndr, Integer.class, 0, null, JIFlags.FLAG_NULL);//null pointer
                }

                if (!listOfDels.isEmpty()) {
                    JIMarshalUnMarshalHelper.serialize(ndr, Integer.class, new Object().hashCode(), null, JIFlags.FLAG_NULL);//pointer
                    JIMarshalUnMarshalHelper.serialize(ndr, Integer.class, listOfDels.size(), null, JIFlags.FLAG_NULL);

                    //now align for array
                    double index = new Integer(ndr.getBuffer().getIndex()).doubleValue();
                    long k = (k = Math.round(index % 8.0)) == 0 ? 0 : 8 - k;
                    ndr.writeOctetArray(new byte[(int) k], 0, (int) k);

                    for (int i = 0; i < listOfDels.size(); i++) {
                        JIObjectId oid = listOfDels.get(i);
                        JIMarshalUnMarshalHelper.writeOctetArrayLE(ndr, oid.getOID());
                        //LOGGER.info("[" + oid + "]");
                    }
                } else {
                    JIMarshalUnMarshalHelper.serialize(ndr, Integer.class, 0, null, JIFlags.FLAG_NULL); //null pointer
                }
                JIMarshalUnMarshalHelper.serialize(ndr, Integer.class, 0, null, JIFlags.FLAG_NULL);
                JIMarshalUnMarshalHelper.serialize(ndr, Integer.class, 0, null, JIFlags.FLAG_NULL);
                JIMarshalUnMarshalHelper.serialize(ndr, Integer.class, 0, null, JIFlags.FLAG_NULL);
                JIMarshalUnMarshalHelper.serialize(ndr, Integer.class, 0, null, JIFlags.FLAG_NULL);
                break;

            case 1:// simple ping
                if (setId != null) {
                    JIMarshalUnMarshalHelper.writeOctetArrayLE(ndr, setId);//setid
                    if (LOGGER.isLoggable(Level.INFO)) {
                        LOGGER.log(Level.INFO, "Simple Ping going for setId: {0}", Hexdump.toHexString(setId));
                    }
                } else {
                    if (LOGGER.isLoggable(Level.INFO)) {
                        LOGGER.info("Some error ! Simple ping requested , but has no setID ");
                    }
                }
                break;

            default:
            //nothing.
        }
    }

    @Override
    public void read(NetworkDataRepresentation ndr) {
        //read response and fill DSs accordingly
        switch (opnum) {
            case 2: //complex ping
                setId = JIMarshalUnMarshalHelper.readOctetArrayLE(ndr, 8);
                //ping factor
                JIMarshalUnMarshalHelper.deSerialize(ndr, Short.class, null, JIFlags.FLAG_NULL, null);

                //hresult
                int hresult = ((Number) (JIMarshalUnMarshalHelper.deSerialize(ndr, Integer.class, null, JIFlags.FLAG_NULL, null))).intValue();

                if (hresult != 0) {
                    if (LOGGER.isLoggable(Level.SEVERE)) {
                        LOGGER.log(Level.SEVERE, "Some error ! Complex ping failed , hresult: {0}", hresult);
                    }
                } else {
                    if (LOGGER.isLoggable(Level.INFO)) {
                        LOGGER.log(Level.INFO, "Complex Ping Succeeded,  setId is : {0}", Hexdump.toHexString(setId));
                    }
                }

                break;
            case 1:// simple ping
                //hresult
                hresult = ((Number) (JIMarshalUnMarshalHelper.deSerialize(ndr, Integer.class, null, JIFlags.FLAG_NULL, null))).intValue();

                if (hresult != 0) {
                    if (LOGGER.isLoggable(Level.SEVERE)) {
                        LOGGER.log(Level.SEVERE, "Some error ! Simple ping failed , hresult: {0}", hresult);
                    }
                } else {
                    if (LOGGER.isLoggable(Level.INFO)) {
                        LOGGER.info("Simple Ping Succeeded");
                    }
                }
                break;

            default:
            //nothing.
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy