Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactored code and added some exceptions avogadro-remote.py #406

Merged
merged 6 commits into from
Oct 25, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
122 changes: 43 additions & 79 deletions scripts/avogadro-remote.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,11 @@
#!/usr/bin/python

from __future__ import print_function

import sys
import json
import socket
import struct
import tempfile


class Connection:
'''Process a JSON-RPC request'''

def __init__(self, name="avogadro"):
"""
Connect to the local named pipe
Expand All @@ -20,85 +14,55 @@
"""
# create socket
self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)

# connect
self.sock.connect(tempfile.gettempdir() + "/" + name)

def send_json(self, obj):
try:
self.sock.connect(tempfile.gettempdir() + "/" + name)
# print the connection statement
print("CONNECTION ESTABLISHED SUCCESSFULLY")
except Exception as exception:
Fixed Show fixed Hide fixed

Check notice

Code scanning / Pylintpython3 (reported by Codacy)

Catching too general exception Exception Note

Catching too general exception Exception
print("error while connecting: " + str(exception))
sys.exit(1)
def __json(self, method, file):
"""
Send a JSON-RPC request to the named pipe.

:param obj: The JSON-RPC request object.
"""
self.send_message(json.dumps(obj))

def send_message(self, msg):
"""
:param method: The JSON-RPC request method.
Send a message to the named pipe
:param file: file corresponding to method.

:param msg: The message to send.
"""
size = len(msg)
header = struct.pack(">I", size)
packet = header + msg.encode("ascii")
self.sock.send(packet)

def receive_message(self, size=1024):
"""
Receive a message from the named pipe.

:param size: The maximum size of the message to receive.
"""
packet = self.sock.recv(size)

return packet[4:]

def recv_json(self):
'''Receive a JSON-RPC response'''
msg = self.recv_message()

try:
return json.loads(msg)
except Exception as exception:
print("error: " + str(exception))
return {}

if method == "recv_msg":
size = 1024
packet = self.sock.recv(size)
print("reply:" + str(packet[4: ]))
else:
msg = {
"jsonrpc": "2.0",
"id": 0,
"method": method,
"params": {"fileName": file},
}
json_msg = json.dumps(msg)
size = len(json_msg)
header = struct.pack(">I", size)
packet = header + json_msg.encode("ascii")
self.sock.send(packet)
def open_file(self, file):
"""Opens file"""
# param: file is filename input by the user in string
method = "openFile"
self.__json(method, file)
self.__json("recv_msg", None)
def save_graphic(self, file):
"""Save Graphic"""
method = "saveGraphic"
self.__json(method, file)
self.__json("recv_msg", None)
def kill(self):
Fixed Show fixed Hide fixed
Fixed Show fixed Hide fixed
"""To kill the current operation"""
method = "kill"
self.__json(method, None)
self.__json("recv_msg", None)
def close(self):
'''Close the socket to the named pipe'''
self.sock.close()


if __name__ == "__main__":
conn = Connection()

method = sys.argv[1]

if method == "openFile":
conn.send_json(
{
"jsonrpc": "2.0",
"id": 0,
"method": "openFile",
"params": {"fileName": str(sys.argv[2])},
}
)
elif method == "saveGraphic":
conn.send_json(
{
"jsonrpc": "2.0",
"id": 0,
"method": "saveGraphic",
"params": {"fileName": str(sys.argv[2])},
}
)

elif method == "kill":
conn.send_json({"jsonrpc": "2.0", "id": 0, "method": "kill"})

else:
print("unknown method: " + method)
conn.close()
sys.exit(-1)

print("reply: " + str(conn.receive_message()))
conn.close()
print("CONNECTION CLOSED SUCCESSFULLY")
Loading